# HG changeset patch # User casties # Date 1422986487 -3600 # Node ID b406507a953d1341d3bceb5cc53439a6fdc8703c # Parent 2beafb8e19e4ff3ca701facf28145f6502cd8411 upped version to 0.5. can use display name and groups from auth token. diff -r 2beafb8e19e4 -r b406507a953d pom.xml --- 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 @@ 4.0.0 de.mpiwg.itgroup.annotations AnnotationManagerN4J - 0.4-SNAPSHOT + 0.5-SNAPSHOT UTF-8 2.1.6 diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/Actor.java --- 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; diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/Person.java --- 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 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() diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotations.java --- 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 - * - */ 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); diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByResources.java --- 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; diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorAnnotationsByTags.java --- 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"); diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorGroups.java --- 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; } } diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java --- 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
requestHeaders = (Series
) 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 verifiers = new ArrayList(); // 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 groups = new HashSet(); + 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) { diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorRestlet.java --- 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) diff -r 2beafb8e19e4 -r b406507a953d src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorSearch.java --- 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();