Author: tdraier
Date: Thu Nov 15 18:51:40 2007
New Revision: 19165

URL: https://svndev.jahia.net/websvn/listing.php?sc=3D1&rev=3D19165&repname=
=3Djahia
Log:
jackrabbit extensions for jahia

Added:
    tags/JAHIA_5_0_3/jackrabbit-ext/
    tags/JAHIA_5_0_3/jackrabbit-ext/project.xml   (with props)
    tags/JAHIA_5_0_3/jackrabbit-ext/src/
    tags/JAHIA_5_0_3/jackrabbit-ext/src/java/
    tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/
    tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/
    tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/
    tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/content/
    tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/content/Jah=
iaAccessManager.java
    tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/content/Jah=
iaIOManager.java
      - copied, changed from r19108, branches/JAHIA-5-0-3-DMS-JACKRABBIT-BR=
ANCH/core/src/java/org/jahia/services/content/JahiaIOManager.java

Added: tags/JAHIA_5_0_3/jackrabbit-ext/project.xml
URL: https://svndev.jahia.net/websvn/filedetails.php?path=3D/tags/JAHIA_5_0=
_3/jackrabbit-ext/project.xml&rev=3D19165&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- tags/JAHIA_5_0_3/jackrabbit-ext/project.xml (added)
+++ tags/JAHIA_5_0_3/jackrabbit-ext/project.xml Thu Nov 15 18:51:40 2007
@@ -0,0 +1,88 @@
+<?xml version=3D"1.0" encoding=3D"UTF-8"?>
+<!DOCTYPE project [
+        <!ENTITY % locator-entities SYSTEM "file:locator.ent"> %locator-en=
tities;
+        ]>
+<project>
+    <extend>${basedir}/../project.xml</extend>
+    <pomVersion>3</pomVersion>
+    <artifactId>jackrabbit-ext</artifactId>
+    <groupId>jahia</groupId>
+    <package>org.jahia</package>
+
+    <url>http://projects.jahia.org/${pom.artifactId}/core</url>
+    <siteDirectory>html/${pom.artifactId}/core</siteDirectory>
+
+    <repository>
+        <connection>scm:cvs:pserver:[EMAIL PROTECTED]:/home/cvs/r=
epository_anonymous:${pom.artifactId}/jackrabbit-ext</connection>
+        <url>http://cvspub.jahia.org/cgi-bin/cvsweb.cgi/${pom.artifactId}/=
core/</url>
+    </repository>
+
+    <dependencies>
+        <dependency>
+            <groupId>jsr170</groupId>
+            <artifactId>jcr</artifactId>
+            <version>1.0</version>
+            <url>http://www.day.com/maven/jsr170/jars/jcr-1.0.jar</url>
+        </dependency>
+
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-api</artifactId>
+            <version>1.4-562144</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-core</artifactId>
+            <version>1.4-562144</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-jcr-commons</artifactId>
+            <version>1.4-562144</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-text-extractors</artifactId>
+            <version>1.4-562144</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-webapp</artifactId>
+            <version>1.4-562144</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-jcr-rmi</artifactId>
+            <version>1.4-562144</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-webdav</artifactId>
+            <version>1.4-562144</version>
+        </dependency>
+        <dependency>
+            <groupId>org.apache.jackrabbit</groupId>
+            <artifactId>jackrabbit-jcr-server</artifactId>
+            <version>1.4-562144</version>
+        </dependency>
+
+        <dependency>
+            <groupId>jahia</groupId>
+            <artifactId>public-api</artifactId>
+            <version>5.0-SNAPSHOT</version>
+        </dependency>
+
+        <dependency>
+          <groupId>log4j</groupId>
+          <artifactId>log4j</artifactId>
+          <version>1.2.14</version>
+        </dependency>        =

+    </dependencies>
+
+    <build>
+        <nagEmailAddress>[EMAIL PROTECTED]</nagEmailAddress>
+        <sourceDirectory>src/java</sourceDirectory>
+        <unitTestSourceDirectory>src/test/src/java</unitTestSourceDirector=
y>
+    </build>
+
+</project>

Added: tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/content/=
JahiaAccessManager.java
URL: https://svndev.jahia.net/websvn/filedetails.php?path=3D/tags/JAHIA_5_0=
_3/jackrabbit-ext/src/java/org/jahia/services/content/JahiaAccessManager.ja=
va&rev=3D19165&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/content/Jah=
iaAccessManager.java (added)
+++ tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/content/Jah=
iaAccessManager.java Thu Nov 15 18:51:40 2007
@@ -0,0 +1,304 @@
+package org.jahia.services.content;
+
+import org.apache.jackrabbit.core.HierarchyManager;
+import org.apache.jackrabbit.core.ItemId;
+import org.apache.jackrabbit.core.PropertyId;
+import org.apache.jackrabbit.core.security.AMContext;
+import org.apache.jackrabbit.core.security.AccessManager;
+import org.apache.jackrabbit.name.*;
+import org.jahia.jaas.JahiaLoginModule;
+import org.jahia.jaas.JahiaPrincipal;
+import org.jahia.api.user.JahiaUserService;
+import org.jahia.api.Constants;
+
+import javax.jcr.*;
+import javax.naming.Context;
+import javax.naming.InitialContext;
+import javax.naming.NamingException;
+import javax.security.auth.Subject;
+import java.util.*;
+
+/**
+ * Created by IntelliJ IDEA.
+ * User: toto
+ * Date: 28 f=C3=83=C2=A9vr. 2006
+ * Time: 17:58:41
+ * To change this template use File | Settings | File Templates.
+ */
+public class JahiaAccessManager implements AccessManager {
+    /**
+     * Subject whose access rights this AccessManager should reflect
+     */
+    protected Subject subject;
+
+    /**
+     * hierarchy manager used for ACL-based access control model
+     */
+    protected HierarchyManager hierMgr;
+
+    private boolean initialized;
+    protected String workspaceName;
+
+    protected JahiaPrincipal p;
+
+    /**
+     * Empty constructor
+     */
+    public JahiaAccessManager() {
+        initialized =3D false;
+        p =3D null;
+    }
+
+    //--------------------------------------------------------< AccessMana=
ger >
+    /**
+     * [EMAIL PROTECTED]
+     */
+    public void init(AMContext context)
+            throws AccessDeniedException, Exception {
+        if (initialized) {
+            throw new IllegalStateException("already initialized");
+        }
+
+        subject =3D context.getSubject();
+        hierMgr =3D context.getHierarchyManager();
+        workspaceName =3D context.getWorkspaceName();
+
+        Set principals =3D subject.getPrincipals(JahiaPrincipal.class);
+        if (!principals.isEmpty()) {
+            p =3D (JahiaPrincipal) principals.iterator().next();
+        }
+
+        // @todo check permission to access given workspace based on princ=
ipals
+        initialized =3D true;
+    }
+
+    public void close() throws Exception {
+    }
+
+    public void checkPermission(ItemId id, int permissions) throws AccessD=
eniedException, ItemNotFoundException, RepositoryException {
+        if (!isGranted(id,permissions)) {
+            throw new AccessDeniedException();
+        }
+    }
+
+    public boolean isGranted(ItemId id, int permissions) throws ItemNotFou=
ndException, RepositoryException {
+        if (p.isSystem()) {
+            return true;
+        }
+
+        try {
+            Session s =3D getRepository().login(org.jahia.jaas.JahiaLoginM=
odule.getSystemCredentials());
+            NamespaceResolver nr =3D new SessionNamespaceResolver(s);
+            Path path =3D getPath(id);
+            String jcrPath =3D PathFormat.format(path,nr);
+
+            // Always deny write access on system folders
+            if (s.itemExists(jcrPath)) {
+                Item i =3D s.getItem(jcrPath);
+                if (i.isNode() && permissions !=3D AccessManager.READ) {
+                    String ntName =3D ((Node) i).getPrimaryNodeType().getN=
ame();
+                    if (ntName.equals(Constants.JAHIANT_SYSTEMFOLDER) || n=
tName.equals(org.jahia.api.Constants.JAHIANT_VIRTUALSITE)
+                            || ntName.equals("rep:root")) {
+                        return false;
+                    }
+                }
+            }
+
+            JahiaUserService service =3D getJahiaUserService();
+
+            // Administrators are always granted
+            if (service.isServerAdmin(p.getName())) {
+                return true;
+            }
+
+            Path.PathElement[] elements =3D path.getElements();
+            if (elements.length > 1) {
+                QName name =3D elements[1].getName();
+                if (name.getNamespaceURI().equals("")) {
+                    // Site administrators are always granted
+                    if (service.isAdmin(p.getName(),name.getLocalName())) {
+                        return true;
+                    }
+                    CheckCommand v =3D new CheckCommand(permissions, name.=
getLocalName(), service);
+                    recurseonACPs(jcrPath, s, v);
+                    return v.isResult();
+                }
+            } else {
+                return true;
+            }
+
+            return false;
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return true;
+    }
+
+    public Map getPermissions(ItemId id) {
+        try {
+            Session s =3D getRepository().login(JahiaLoginModule.getSystem=
Credentials());
+            NamespaceResolver nr =3D new SessionNamespaceResolver(s);
+
+            Path path =3D getPath(id);
+            String jcrPath =3D PathFormat.format(path,nr);
+
+            ViewCommand vv =3D new ViewCommand();
+            recurseonACPs(jcrPath, s, vv);
+            return vv.getResults();
+        } catch (Exception e) {
+            e.printStackTrace();  //To change body of catch statement use =
File | Settings | File Templates.
+        }
+        return new HashMap();
+    }
+
+    private Path getPath(ItemId id) throws RepositoryException {
+        Path path =3D null;
+        try {
+            // Get the path of the node
+            path =3D hierMgr.getPath(id);
+        } catch (ItemNotFoundException e) {
+            // This might be a property, get the path of the parent node
+            if (!id.denotesNode()) {
+                id =3D ((PropertyId)id).getParentId();
+                try {
+                    path =3D hierMgr.getPath(id);
+                } catch (ItemNotFoundException e1) {
+                }
+            }
+        }
+        return path;
+    }
+
+    private void recurseonACPs(String jcrPath, Session s, Command v) throw=
s RepositoryException  {
+        while (jcrPath.length() > 0) {
+            if (s.itemExists(jcrPath)) {
+                Item i =3D s.getItem(jcrPath);
+                if (i.isNode()) {
+                    Node node =3D (Node) i;
+                    if (node.isNodeType("mix:accessControlled")) {
+                        Node acp =3D node.getProperty("jcr:accessControlPo=
licy").getNode();
+                        NodeIterator aces =3D acp.getNode("jcr:acl").getNo=
des("jcr:ace");
+                        while (aces.hasNext()) {
+                            Node ace =3D aces.nextNode();
+                            String principal =3D ace.getProperty("jcr:prin=
cipal").getString();
+                            String type =3D ace.getProperty("jcr:aceType")=
.getString();
+                            Value[] privileges =3D ace.getProperty("jcr:pr=
ivileges").getValues();
+
+                            if (v.execute(jcrPath, principal, type, privil=
eges)) return;
+                        }
+                    }
+                }
+                if ("/".equals(jcrPath)) {
+                    return;
+                } else if (jcrPath.lastIndexOf('/') > 0) {
+                    jcrPath =3D jcrPath.substring(0,jcrPath.lastIndexOf('/=
'));
+                } else {
+                    jcrPath =3D "/";
+                }
+            }
+        }
+    }
+
+    public boolean match(int permission, String privilege) {
+        switch (permission) {
+            case AccessManager.READ:
+                return "jcr:read".equals(privilege) || "jcr:getAccessContr=
olPolicy".equals(privilege) ||
+                        "jcr:all".equals(privilege) ;
+            case AccessManager.WRITE:
+                return "jcr:addChildNodes".equals(privilege) || "jcr:setPr=
operties".equals(privilege) ||
+                        "jcr:setAccessControlPolicy".equals(privilege) || =
"jcr:write".equals(privilege) || "jcr:all".equals(privilege) ;
+            case AccessManager.REMOVE:
+                return "jcr:removeChildNodes".equals(privilege) || "jcr:wr=
ite".equals(privilege) || "jcr:all".equals(privilege) ;
+        }
+        return false;
+    }
+
+    interface Command {
+        public boolean execute(String jcrPath, String principal, String ty=
pe, Value[] privileges) throws RepositoryException;
+    }
+
+    class CheckCommand implements Command {
+        private int permissions;
+        private String site;
+        private JahiaUserService service;
+        private boolean result;
+
+        public CheckCommand(int permissions, String site, JahiaUserService=
 service) {
+            this.permissions =3D permissions;
+            this.site =3D site;
+            this.service =3D service;
+        }
+
+        public boolean isResult() {
+            return result;
+        }
+
+        public boolean execute(String jcrPath, String principal, String ty=
pe, Value[] privileges) throws RepositoryException {
+            for (int j =3D 0; j < privileges.length; j++) {
+                Value privilege =3D privileges[j];
+                if (match(permissions, privilege.getString())) {
+                    String principalName =3D principal.substring(2);
+                    if (principal.charAt(0) =3D=3D 'u') {
+                        if (principalName.equals(p.getName())) {
+                            result =3D type.equals("GRANT");
+                            return true;
+                        }
+                    } else {
+                        if (principalName.equals("guest") || service.isUse=
rMemberOf(p.getName(), principalName, site)) {
+                            result =3D type.equals("GRANT");
+                            return true;
+                        }
+                    }
+
+                }
+            }
+            return false;
+        }
+
+    }
+
+    class ViewCommand implements Command {
+        private Map results =3D new HashMap();
+
+        public Map getResults() {
+            return results;
+        }
+
+        public boolean execute(String jcrPath, String principal, String ty=
pe, Value[] privileges) throws RepositoryException {
+            List p =3D (List) results.get(principal);
+
+            if (p =3D=3D null)  {
+                p =3D new ArrayList();
+                results.put(principal, p);
+                for (int i =3D 0; i < privileges.length; i++) {
+                    Value privilege =3D privileges[i];
+                    p.add(new String[]{jcrPath, type, privilege.getString(=
)});
+                }
+            }
+
+            return false;
+        }
+    }
+
+
+    public boolean canAccess(String workspaceName) throws NoSuchWorkspaceE=
xception, RepositoryException {
+        return true;
+    }
+
+
+    public Repository getRepository() throws NamingException {
+        String repName =3D "jcr/repository";
+        Hashtable env =3D new Hashtable();
+        InitialContext initctx =3D new InitialContext(env);
+        Context ctx =3D (Context) initctx.lookup("java:comp/env");
+        return (Repository) ctx.lookup(repName);
+    }
+
+    public JahiaUserService getJahiaUserService() throws NamingException {
+        String serviceName =3D "jahia/users";
+        Hashtable env =3D new Hashtable();
+        InitialContext initctx =3D new InitialContext(env);
+        Context ctx =3D (Context) initctx.lookup("java:comp/env");
+        return (JahiaUserService) ctx.lookup(serviceName);
+    }
+}

Copied: tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/content=
/JahiaIOManager.java (from r19108, branches/JAHIA-5-0-3-DMS-JACKRABBIT-BRAN=
CH/core/src/java/org/jahia/services/content/JahiaIOManager.java)
URL: https://svndev.jahia.net/websvn/diff.php?path=3D/tags/JAHIA_5_0_3/jack=
rabbit-ext/src/java/org/jahia/services/content/JahiaIOManager.java&rev=3D19=
165&repname=3Djahia
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=3D=
=3D=3D=3D
--- branches/JAHIA-5-0-3-DMS-JACKRABBIT-BRANCH/core/src/java/org/jahia/serv=
ices/content/JahiaIOManager.java (original)
+++ tags/JAHIA_5_0_3/jackrabbit-ext/src/java/org/jahia/services/content/Jah=
iaIOManager.java Thu Nov 15 18:51:40 2007
@@ -18,6 +18,7 @@
 import org.apache.log4j.Logger;
 import org.apache.jackrabbit.server.io.*;
 import org.apache.jackrabbit.JcrConstants;
+import org.jahia.api.Constants;
 =

 /**
  * <code>JahiaIOManager</code>...

_______________________________________________
cvs_list mailing list
[email protected]
http://lists.jahia.org/cgi-bin/mailman/listinfo/cvs_list

Reply via email to