# 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();