changeset 88:b406507a953d

upped version to 0.5. can use display name and groups from auth token.
author casties
date Tue, 03 Feb 2015 19:01:27 +0100
parents 2beafb8e19e4
children 247cbbb385de
files pom.xml src/main/java/de/mpiwg/itgroup/annotations/Actor.java src/main/java/de/mpiwg/itgroup/annotations/Person.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByResources.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByTags.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorGroups.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorRestlet.java src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorSearch.java
diffstat 10 files changed, 122 insertions(+), 74 deletions(-) [+]
line wrap: on
line diff
--- a/pom.xml	Tue Feb 03 11:33:45 2015 +0100
+++ b/pom.xml	Tue Feb 03 19:01:27 2015 +0100
@@ -3,7 +3,7 @@
   <modelVersion>4.0.0</modelVersion>
   <groupId>de.mpiwg.itgroup.annotations</groupId>
   <artifactId>AnnotationManagerN4J</artifactId>
-  <version>0.4-SNAPSHOT</version>
+  <version>0.5-SNAPSHOT</version>
   <properties>
     <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
     <neo4j-version>2.1.6</neo4j-version>
--- a/src/main/java/de/mpiwg/itgroup/annotations/Actor.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/Actor.java	Tue Feb 03 19:01:27 2015 +0100
@@ -57,6 +57,13 @@
         if (person.getIdString().equals(this.getIdString())) return true;
         if (isGroup() && store != null) {
             // check if person in group
+            if (person.groups != null) {
+                // check person's groups
+                if (person.groups.contains(this.id)) {
+                    return true;
+                }
+            }
+            // check in store
             return store.isPersonInGroup(person, (Group) this);            
         }
         return false;
--- a/src/main/java/de/mpiwg/itgroup/annotations/Person.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/Person.java	Tue Feb 03 19:01:27 2015 +0100
@@ -1,6 +1,3 @@
-/**
- * 
- */
 package de.mpiwg.itgroup.annotations;
 
 /*
@@ -25,6 +22,8 @@
  * #L%
  */
 
+import java.util.Set;
+
 import de.mpiwg.itgroup.annotations.restlet.BaseRestlet;
 
 /**
@@ -33,6 +32,8 @@
  */
 public class Person extends Actor {
 
+    public Set<String> groups;
+    
     public Person() {
     }
 
@@ -91,6 +92,15 @@
         }
         return name;
     }
+    
+    /**
+     * Returns the anonymous Person.
+     * 
+     * @return
+     */
+    public static Person getAnonymous() {
+        return new Person("anonymous");
+    }
 
     /* (non-Javadoc)
      * @see java.lang.Object#toString()
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java	Tue Feb 03 19:01:27 2015 +0100
@@ -1,7 +1,3 @@
-/**
- * Implements the "annotations" uri of the Annotator API. see
- * <https://github.com/okfn/annotator/wiki/Storage>
- */
 package de.mpiwg.itgroup.annotations.restlet;
 
 /*
@@ -87,7 +83,7 @@
         }
 
         // do authentication
-        Person authUser = Person.createPersonWithId(this.checkAuthToken(entity));
+        Person authUser = getUserFromAuthToken(entity);
         logger.fine("request authenticated=" + authUser);
 
         if (id == null) {
@@ -172,7 +168,7 @@
         setCorsHeaders();
 
         // do authentication TODO: who's allowed to create?
-        Person authUser = Person.createPersonWithId(this.checkAuthToken(entity));
+        Person authUser = getUserFromAuthToken(entity);
         logger.fine("request authenticated=" + authUser);
         if (authUser == null) {
             setStatus(Status.CLIENT_ERROR_FORBIDDEN, "Not Authorized!");
@@ -189,7 +185,7 @@
             }
             // make sure id is not set for POST
             jo.remove("id");
-            // get Annotation object from posted JSON
+            // create Annotation object from posted JSON
             annot = createAnnotation(jo, entity);
         } catch (IOException e1) {
             setStatus(Status.SERVER_ERROR_INTERNAL);
@@ -230,7 +226,7 @@
         logger.fine("annotation-id=" + id);
 
         // do authentication
-        Person authUser = Person.createPersonWithId(this.checkAuthToken(entity));
+        Person authUser = getUserFromAuthToken(entity);
         logger.fine("request authenticated=" + authUser);
 
         Annotation annot = null;
@@ -293,7 +289,7 @@
         logger.fine("annotation-id=" + id);
 
         // do authentication
-        Person authUser = Person.createPersonWithId(this.checkAuthToken(entity));
+        Person authUser = getUserFromAuthToken(entity);
         logger.fine("request authenticated=" + authUser);
         AnnotationStore store = getAnnotationStore();
         Annotation annot = store.getAnnotationById(id);
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByResources.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByResources.java	Tue Feb 03 19:01:27 2015 +0100
@@ -59,7 +59,7 @@
         setCorsHeaders();
 
         // do authentication
-        Person authUser = Person.createPersonWithId(this.checkAuthToken(entity));
+        Person authUser = getUserFromAuthToken(entity);
         logger.fine("request authenticated=" + authUser);
 
         String id = null;
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByTags.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByTags.java	Tue Feb 03 19:01:27 2015 +0100
@@ -58,7 +58,7 @@
         setCorsHeaders();
 
         // do authentication
-        Person authUser = Person.createPersonWithId(this.checkAuthToken(entity));
+        Person authUser = getUserFromAuthToken(entity);
         logger.fine("request authenticated=" + authUser);
 
         String id = (String) getRequest().getAttributes().get("id");
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorGroups.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorGroups.java	Tue Feb 03 19:01:27 2015 +0100
@@ -1,6 +1,3 @@
-/**
- * ReST API for accessing groups in the Annotation store.
- */
 package de.mpiwg.itgroup.annotations.restlet;
 
 /*
@@ -39,6 +36,7 @@
 
 import de.mpiwg.itgroup.annotations.Actor;
 import de.mpiwg.itgroup.annotations.Group;
+import de.mpiwg.itgroup.annotations.Person;
 import de.mpiwg.itgroup.annotations.neo4j.AnnotationStore;
 
 
@@ -66,14 +64,52 @@
     public Representation doGetJSON(Representation entity) {
         logger.fine("AnnotatorGroups doGetJSON!");
         setCorsHeaders();
-        Form form = getRequest().getResourceRef().getQueryAsForm();
-        String user = form.getFirstValue("user");
-        String uri = form.getFirstValue("uri");
+        // get user from auth token (preferred)
+        Person authUser = getUserFromAuthToken(entity);
+        JSONArray results = null;
+        if (authUser != null && authUser.groups != null) {
+            results  = getGroupsFromPerson(authUser);
+        } else {
+            // get user or uri from request
+            Form form = getRequest().getResourceRef().getQueryAsForm();
+            String user = form.getFirstValue("user");
+            String uri = form.getFirstValue("uri");
+            results = getGroupsFromStore(uri, user);
+        }
+        // assemble result object
+        JSONObject result = new JSONObject();
+        try {
+            result.put("rows", results);
+            result.put("total", results.length());
+        } catch (JSONException e) {
+            setStatus(Status.SERVER_ERROR_INTERNAL, "JSON Error");
+            return null;
+        }
+        logger.fine("sending:");
+        logger.fine(result.toString());
+        return new JsonRepresentation(result);
+    }
+
+    public JSONArray getGroupsFromPerson(Person person) {
+        JSONArray results = new JSONArray();
+        for (String group : person.groups) {
+            JSONObject jo = new JSONObject();
+            try {
+                jo.put("id", group);
+                jo.put("name", group);
+            } catch (JSONException e) {
+            }
+            results.put(jo);
+        }
+        return results;
+    }
+
+    public JSONArray getGroupsFromStore(String uri, String user) {
+        JSONArray results = new JSONArray();
         if (uri == null || uri.isEmpty()) {
             // get uri from user-id
             uri = Actor.getUriFromId(user, false);
         }
-        JSONArray results = new JSONArray();
         AnnotationStore store = getAnnotationStore();
         Node person = store.getPersonNodeByUri(uri);
         if (person != null) {
@@ -89,18 +125,6 @@
                 results.put(jo);
             }
         }
-        // assemble result object
-        JSONObject result = new JSONObject();
-        try {
-            result.put("rows", results);
-            result.put("total", results.length());
-        } catch (JSONException e) {
-            setStatus(Status.SERVER_ERROR_INTERNAL, "JSON Error");
-            return null;
-        }
-        logger.fine("sending:");
-        logger.fine(result.toString());
-        return new JsonRepresentation(result);
-
+        return results;
     }
 }
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java	Tue Feb 03 19:01:27 2015 +0100
@@ -1,6 +1,3 @@
-/**
- * Base class for Annotator resource classes.
- */
 package de.mpiwg.itgroup.annotations.restlet;
 
 /*
@@ -26,8 +23,6 @@
  */
 
 import java.io.UnsupportedEncodingException;
-import java.security.InvalidKeyException;
-import java.security.SignatureException;
 import java.text.SimpleDateFormat;
 import java.util.ArrayList;
 import java.util.Calendar;
@@ -56,6 +51,10 @@
 import org.restlet.resource.ServerResource;
 import org.restlet.util.Series;
 
+import com.google.gson.JsonArray;
+import com.google.gson.JsonElement;
+import com.google.gson.JsonObject;
+
 import de.mpiwg.itgroup.annotations.Actor;
 import de.mpiwg.itgroup.annotations.Annotation;
 import de.mpiwg.itgroup.annotations.Annotation.FragmentTypes;
@@ -154,7 +153,7 @@
      * @return
      */
     public boolean isAuthenticated(Representation entity) {
-        return (checkAuthToken(entity) != null);
+        return (getUserFromAuthToken(entity) != null);
     }
 
     /**
@@ -165,56 +164,68 @@
      * @param entity
      * @return user-id
      */
-    public String checkAuthToken(Representation entity) {
+    public Person getUserFromAuthToken(Representation entity) {
         @SuppressWarnings("unchecked")
         Series<Header> requestHeaders = (Series<Header>) getRequest().getAttributes().get("org.restlet.http.headers");
         String authToken = requestHeaders.getFirstValue("x-annotator-auth-token", true);
         if (authToken == null) {
             if (!((BaseRestlet) getApplication()).isAuthorizationMode()) {
-                return "anonymous";
+                return Person.getAnonymous();
             }
             return null;
         }
-        // decode token first to get consumer key
-        JsonToken token = new JsonTokenParser(null, null).deserialize(authToken);
-        String userId = token.getParamAsPrimitive("userId").getAsString();
-        String consumerKey = token.getParamAsPrimitive("consumerKey").getAsString();
-        // get stored consumer secret for key
-        BaseRestlet restServer = (BaseRestlet) getApplication();
-        String consumerSecret = restServer.getConsumerSecret(consumerKey);
-        logger.fine("requested consumer key=" + consumerKey + " secret=" + consumerSecret);
-        if (consumerSecret == null) {
-            return null;
-        }
-        // logger.fine(String.format("token=%s tokenString=%s signatureAlgorithm=%s",token,token.getTokenString(),token.getSignatureAlgorithm()));
-        try {
+        Person user = null;
+		try {
+			// decode token first to get consumer key
+            JsonToken token = new JsonTokenParser(null, null).deserialize(authToken);
+            String consumerKey = token.getParamAsPrimitive("consumerKey").getAsString();
+            // get stored consumer secret for key
+            BaseRestlet restServer = (BaseRestlet) getApplication();
+            String consumerSecret = restServer.getConsumerSecret(consumerKey);
+            logger.fine("requested consumer key=" + consumerKey + " secret=" + consumerSecret);
+			if (consumerSecret == null) {
+			    logger.warning("Error: unknown consumer key: "+consumerKey);
+				return null;
+			}
+			// logger.fine(String.format("token=%s tokenString=%s signatureAlgorithm=%s",token,token.getTokenString(),token.getSignatureAlgorithm()));
             List<Verifier> verifiers = new ArrayList<Verifier>();
             // we only do HS256 yet
             verifiers.add(new HmacSHA256Verifier(consumerSecret.getBytes("UTF-8")));
             // verify token signature(should really be static...)
             new JsonTokenParser(new SystemClock(), null, (Checker[]) null).verify(token, verifiers);
-        } catch (SignatureException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        } catch (InvalidKeyException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
-        } catch (UnsupportedEncodingException e) {
-            // TODO Auto-generated catch block
-            e.printStackTrace();
+            // create Person
+            JsonObject payload = token.getPayloadAsJsonObject();
+            // userId is mandatory
+            String userId = payload.get("userId").getAsString();
+            user = new Person(userId);
+            // displayName is optional
+            if (payload.has("displayName")) {
+                user.name = payload.get("displayName").getAsString();
+            }
+            // memberOf groups is optional
+            if (payload.has("memberOf")) {
+                Set<String> groups = new HashSet<String>();
+                JsonArray jgroups = payload.get("memberOf").getAsJsonArray();
+                for (JsonElement jgroup : jgroups) {
+                    groups.add(jgroup.getAsString());
+                }
+                user.groups = groups;
+            }
+        } catch (Exception e) {
+            logger.warning("Error checking auth token: "+e.toString());
+            return null;
         }
         // must be ok then
-        logger.fine("auth OK! user=" + userId);
-        return userId;
+        logger.fine("auth OK! user=" + user);
+        return user;
     }
 
     /**
      * creates Annotator-JSON from an Annotation object.
      * 
-     * @param annot
+     * @param annot annotation object
      * @param forAnonymous
-     *            TODO
-     * @return
+     * @return Annotator-JSON
      */
     public JSONObject createAnnotatorJson(Annotation annot, boolean forAnonymous) {
         // return user as a JSON object (otherwise just as string)
@@ -576,7 +587,7 @@
         /*
          * check authentication
          */
-        String authUser = checkAuthToken(entity);
+        Person authUser = getUserFromAuthToken(entity);
         if (authUser == null) {
             /*
              * // try http auth User httpUser = getHttpAuthUser(entity); if
@@ -619,7 +630,7 @@
             }
         }
         if (username == null) {
-            username = authUser;
+            username = authUser.getName();
         }
         // try to get full name
         if (creator.getName() == null && username != null) {
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorRestlet.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorRestlet.java	Tue Feb 03 19:01:27 2015 +0100
@@ -34,7 +34,7 @@
  */
 public class AnnotatorRestlet extends BaseRestlet {
 
-    public final String version = "AnnotationManagerN4J/Annotator 0.4.0";
+    public final String version = "AnnotationManagerN4J/Annotator 0.5.0";
 
     /*
      * (non-Javadoc)
--- a/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorSearch.java	Tue Feb 03 11:33:45 2015 +0100
+++ b/src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorSearch.java	Tue Feb 03 19:01:27 2015 +0100
@@ -67,7 +67,7 @@
         logger.fine("AnnotatorSearch doGetJSON!");
         setCorsHeaders();
         // do authentication
-        Person authUser = Person.createPersonWithId(this.checkAuthToken(entity));
+        Person authUser = getUserFromAuthToken(entity);
         logger.fine("request authenticated=" + authUser);
 
         Form form = getRequest().getResourceRef().getQueryAsForm();