comparison src/main/java/de/mpiwg/itgroup/annotations/restlet/AnnotatorResourceImpl.java @ 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 e3f0613b2f2d
children 247cbbb385de
comparison
equal deleted inserted replaced
87:2beafb8e19e4 88:b406507a953d
1 /**
2 * Base class for Annotator resource classes.
3 */
4 package de.mpiwg.itgroup.annotations.restlet; 1 package de.mpiwg.itgroup.annotations.restlet;
5 2
6 /* 3 /*
7 * #%L 4 * #%L
8 * AnnotationManager 5 * AnnotationManager
24 * <http://www.gnu.org/licenses/lgpl-3.0.html>. 21 * <http://www.gnu.org/licenses/lgpl-3.0.html>.
25 * #L% 22 * #L%
26 */ 23 */
27 24
28 import java.io.UnsupportedEncodingException; 25 import java.io.UnsupportedEncodingException;
29 import java.security.InvalidKeyException;
30 import java.security.SignatureException;
31 import java.text.SimpleDateFormat; 26 import java.text.SimpleDateFormat;
32 import java.util.ArrayList; 27 import java.util.ArrayList;
33 import java.util.Calendar; 28 import java.util.Calendar;
34 import java.util.HashSet; 29 import java.util.HashSet;
35 import java.util.List; 30 import java.util.List;
54 import org.restlet.representation.Representation; 49 import org.restlet.representation.Representation;
55 import org.restlet.resource.Options; 50 import org.restlet.resource.Options;
56 import org.restlet.resource.ServerResource; 51 import org.restlet.resource.ServerResource;
57 import org.restlet.util.Series; 52 import org.restlet.util.Series;
58 53
54 import com.google.gson.JsonArray;
55 import com.google.gson.JsonElement;
56 import com.google.gson.JsonObject;
57
59 import de.mpiwg.itgroup.annotations.Actor; 58 import de.mpiwg.itgroup.annotations.Actor;
60 import de.mpiwg.itgroup.annotations.Annotation; 59 import de.mpiwg.itgroup.annotations.Annotation;
61 import de.mpiwg.itgroup.annotations.Annotation.FragmentTypes; 60 import de.mpiwg.itgroup.annotations.Annotation.FragmentTypes;
62 import de.mpiwg.itgroup.annotations.Group; 61 import de.mpiwg.itgroup.annotations.Group;
63 import de.mpiwg.itgroup.annotations.Person; 62 import de.mpiwg.itgroup.annotations.Person;
152 * 151 *
153 * @param entity 152 * @param entity
154 * @return 153 * @return
155 */ 154 */
156 public boolean isAuthenticated(Representation entity) { 155 public boolean isAuthenticated(Representation entity) {
157 return (checkAuthToken(entity) != null); 156 return (getUserFromAuthToken(entity) != null);
158 } 157 }
159 158
160 /** 159 /**
161 * Checks Annotator Auth plugin authentication information from headers. 160 * Checks Annotator Auth plugin authentication information from headers.
162 * Returns userId if successful. Returns "anonymous" in non-authorization 161 * Returns userId if successful. Returns "anonymous" in non-authorization
163 * mode. 162 * mode.
164 * 163 *
165 * @param entity 164 * @param entity
166 * @return user-id 165 * @return user-id
167 */ 166 */
168 public String checkAuthToken(Representation entity) { 167 public Person getUserFromAuthToken(Representation entity) {
169 @SuppressWarnings("unchecked") 168 @SuppressWarnings("unchecked")
170 Series<Header> requestHeaders = (Series<Header>) getRequest().getAttributes().get("org.restlet.http.headers"); 169 Series<Header> requestHeaders = (Series<Header>) getRequest().getAttributes().get("org.restlet.http.headers");
171 String authToken = requestHeaders.getFirstValue("x-annotator-auth-token", true); 170 String authToken = requestHeaders.getFirstValue("x-annotator-auth-token", true);
172 if (authToken == null) { 171 if (authToken == null) {
173 if (!((BaseRestlet) getApplication()).isAuthorizationMode()) { 172 if (!((BaseRestlet) getApplication()).isAuthorizationMode()) {
174 return "anonymous"; 173 return Person.getAnonymous();
175 } 174 }
176 return null; 175 return null;
177 } 176 }
178 // decode token first to get consumer key 177 Person user = null;
179 JsonToken token = new JsonTokenParser(null, null).deserialize(authToken); 178 try {
180 String userId = token.getParamAsPrimitive("userId").getAsString(); 179 // decode token first to get consumer key
181 String consumerKey = token.getParamAsPrimitive("consumerKey").getAsString(); 180 JsonToken token = new JsonTokenParser(null, null).deserialize(authToken);
182 // get stored consumer secret for key 181 String consumerKey = token.getParamAsPrimitive("consumerKey").getAsString();
183 BaseRestlet restServer = (BaseRestlet) getApplication(); 182 // get stored consumer secret for key
184 String consumerSecret = restServer.getConsumerSecret(consumerKey); 183 BaseRestlet restServer = (BaseRestlet) getApplication();
185 logger.fine("requested consumer key=" + consumerKey + " secret=" + consumerSecret); 184 String consumerSecret = restServer.getConsumerSecret(consumerKey);
186 if (consumerSecret == null) { 185 logger.fine("requested consumer key=" + consumerKey + " secret=" + consumerSecret);
187 return null; 186 if (consumerSecret == null) {
188 } 187 logger.warning("Error: unknown consumer key: "+consumerKey);
189 // logger.fine(String.format("token=%s tokenString=%s signatureAlgorithm=%s",token,token.getTokenString(),token.getSignatureAlgorithm())); 188 return null;
190 try { 189 }
190 // logger.fine(String.format("token=%s tokenString=%s signatureAlgorithm=%s",token,token.getTokenString(),token.getSignatureAlgorithm()));
191 List<Verifier> verifiers = new ArrayList<Verifier>(); 191 List<Verifier> verifiers = new ArrayList<Verifier>();
192 // we only do HS256 yet 192 // we only do HS256 yet
193 verifiers.add(new HmacSHA256Verifier(consumerSecret.getBytes("UTF-8"))); 193 verifiers.add(new HmacSHA256Verifier(consumerSecret.getBytes("UTF-8")));
194 // verify token signature(should really be static...) 194 // verify token signature(should really be static...)
195 new JsonTokenParser(new SystemClock(), null, (Checker[]) null).verify(token, verifiers); 195 new JsonTokenParser(new SystemClock(), null, (Checker[]) null).verify(token, verifiers);
196 } catch (SignatureException e) { 196 // create Person
197 // TODO Auto-generated catch block 197 JsonObject payload = token.getPayloadAsJsonObject();
198 e.printStackTrace(); 198 // userId is mandatory
199 } catch (InvalidKeyException e) { 199 String userId = payload.get("userId").getAsString();
200 // TODO Auto-generated catch block 200 user = new Person(userId);
201 e.printStackTrace(); 201 // displayName is optional
202 } catch (UnsupportedEncodingException e) { 202 if (payload.has("displayName")) {
203 // TODO Auto-generated catch block 203 user.name = payload.get("displayName").getAsString();
204 e.printStackTrace(); 204 }
205 // memberOf groups is optional
206 if (payload.has("memberOf")) {
207 Set<String> groups = new HashSet<String>();
208 JsonArray jgroups = payload.get("memberOf").getAsJsonArray();
209 for (JsonElement jgroup : jgroups) {
210 groups.add(jgroup.getAsString());
211 }
212 user.groups = groups;
213 }
214 } catch (Exception e) {
215 logger.warning("Error checking auth token: "+e.toString());
216 return null;
205 } 217 }
206 // must be ok then 218 // must be ok then
207 logger.fine("auth OK! user=" + userId); 219 logger.fine("auth OK! user=" + user);
208 return userId; 220 return user;
209 } 221 }
210 222
211 /** 223 /**
212 * creates Annotator-JSON from an Annotation object. 224 * creates Annotator-JSON from an Annotation object.
213 * 225 *
214 * @param annot 226 * @param annot annotation object
215 * @param forAnonymous 227 * @param forAnonymous
216 * TODO 228 * @return Annotator-JSON
217 * @return
218 */ 229 */
219 public JSONObject createAnnotatorJson(Annotation annot, boolean forAnonymous) { 230 public JSONObject createAnnotatorJson(Annotation annot, boolean forAnonymous) {
220 // return user as a JSON object (otherwise just as string) 231 // return user as a JSON object (otherwise just as string)
221 boolean makeUserObject = true; 232 boolean makeUserObject = true;
222 JSONObject jo = new JSONObject(); 233 JSONObject jo = new JSONObject();
574 annot.setQuote(jo.getString("quote")); 585 annot.setQuote(jo.getString("quote"));
575 } 586 }
576 /* 587 /*
577 * check authentication 588 * check authentication
578 */ 589 */
579 String authUser = checkAuthToken(entity); 590 Person authUser = getUserFromAuthToken(entity);
580 if (authUser == null) { 591 if (authUser == null) {
581 /* 592 /*
582 * // try http auth User httpUser = getHttpAuthUser(entity); if 593 * // try http auth User httpUser = getHttpAuthUser(entity); if
583 * (httpUser == null) { 594 * (httpUser == null) {
584 */ 595 */
617 userUri = user.getString("uri"); 628 userUri = user.getString("uri");
618 } 629 }
619 } 630 }
620 } 631 }
621 if (username == null) { 632 if (username == null) {
622 username = authUser; 633 username = authUser.getName();
623 } 634 }
624 // try to get full name 635 // try to get full name
625 if (creator.getName() == null && username != null) { 636 if (creator.getName() == null && username != null) {
626 BaseRestlet restServer = (BaseRestlet) getApplication(); 637 BaseRestlet restServer = (BaseRestlet) getApplication();
627 String fullName = restServer.getFullNameForId(username); 638 String fullName = restServer.getFullNameForId(username);