diff options
Diffstat (limited to 'src/com/p4square/f1oauth/F1Access.java')
-rw-r--r-- | src/com/p4square/f1oauth/F1Access.java | 594 |
1 files changed, 0 insertions, 594 deletions
diff --git a/src/com/p4square/f1oauth/F1Access.java b/src/com/p4square/f1oauth/F1Access.java deleted file mode 100644 index c3307f1..0000000 --- a/src/com/p4square/f1oauth/F1Access.java +++ /dev/null @@ -1,594 +0,0 @@ -/* - * Copyright 2014 Jesse Morgan - */ - -package com.p4square.f1oauth; - -import java.io.IOException; -import java.net.URLEncoder; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -import com.codahale.metrics.Counter; -import com.codahale.metrics.MetricRegistry; -import com.codahale.metrics.Timer; - -import org.apache.log4j.Logger; - -import org.restlet.Context; -import org.restlet.Request; -import org.restlet.Response; -import org.restlet.data.ChallengeResponse; -import org.restlet.data.ChallengeScheme; -import org.restlet.data.MediaType; -import org.restlet.data.Method; -import org.restlet.data.Status; -import org.restlet.engine.util.Base64; -import org.restlet.ext.jackson.JacksonRepresentation; -import org.restlet.representation.Representation; -import org.restlet.representation.StringRepresentation; - -import com.p4square.restlet.oauth.OAuthException; -import com.p4square.restlet.oauth.OAuthHelper; -import com.p4square.restlet.oauth.OAuthUser; -import com.p4square.restlet.oauth.Token; - -/** - * F1 API Access. - * - * @author Jesse Morgan <jesse@jesterpm.net> - */ -public class F1Access { - public enum UserType { - WEBLINK, PORTAL; - } - - private static final Logger LOG = Logger.getLogger(F1Access.class); - - private static final String VERSION_STRING = "/v1/"; - private static final String REQUESTTOKEN_URL = "Tokens/RequestToken"; - private static final String AUTHORIZATION_URL = "Login"; - private static final String ACCESSTOKEN_URL= "Tokens/AccessToken"; - private static final String TRUSTED_ACCESSTOKEN_URL = "/AccessToken"; - - private static final SimpleDateFormat DATE_FORMAT = - new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss"); - - private final String mBaseUrl; - private final String mMethod; - - private final OAuthHelper mOAuthHelper; - - private final Map<String, String> mAttributeIdByName; - - private MetricRegistry mMetricRegistry; - - /** - */ - public F1Access(Context context, String consumerKey, String consumerSecret, - String baseUrl, String churchCode, UserType userType) { - - switch (userType) { - case WEBLINK: - mMethod = "WeblinkUser"; - break; - case PORTAL: - mMethod = "PortalUser"; - break; - default: - throw new IllegalArgumentException("Unknown UserType"); - } - - mBaseUrl = "https://" + churchCode + "." + baseUrl + VERSION_STRING; - - // Create the OAuthHelper. This implicitly registers the helper to - // handle outgoing requests which need OAuth authentication. - mOAuthHelper = new OAuthHelper(context, consumerKey, consumerSecret) { - @Override - protected String getRequestTokenUrl() { - return mBaseUrl + REQUESTTOKEN_URL; - } - - @Override - public String getLoginUrl(Token requestToken, String callback) { - String loginUrl = mBaseUrl + mMethod + AUTHORIZATION_URL - + "?oauth_token=" + URLEncoder.encode(requestToken.getToken()); - - if (callback != null) { - loginUrl += "&oauth_callback=" + URLEncoder.encode(callback); - } - - return loginUrl; - } - - @Override - protected String getAccessTokenUrl() { - return mBaseUrl + ACCESSTOKEN_URL; - } - }; - - mAttributeIdByName = new HashMap<>(); - } - - /** - * Set the MetricRegistry to get metrics recorded. - */ - public void setMetricRegistry(MetricRegistry metrics) { - mMetricRegistry = metrics; - } - - /** - * Request an AccessToken for a particular username and password. - * - * This is an F1 extension to OAuth: - * http://developer.fellowshipone.com/docs/v1/Util/AuthDocs.help#2creds - */ - public OAuthUser getAccessToken(String username, String password) throws OAuthException { - Timer.Context timer = getTimer("F1Access.getAccessToken.time"); - boolean success = true; - - try { - Request request = new Request(Method.POST, - mBaseUrl + mMethod + TRUSTED_ACCESSTOKEN_URL); - request.setChallengeResponse(new ChallengeResponse(ChallengeScheme.HTTP_OAUTH)); - - String base64String = Base64.encode((username + " " + password).getBytes(), false); - request.setEntity(new StringRepresentation(base64String)); - - return mOAuthHelper.processAccessTokenRequest(request); - - } catch (Exception e) { - success = false; - throw e; - - } finally { - if (timer != null) { - timer.stop(); - } - if (success) { - incrementCounter("F1Access.getAccessToken.success"); - } else { - incrementCounter("F1Access.getAccessToken.failure"); - } - } - } - - /** - * Create a new Account. - * - * @param firstname The user's first name. - * @param lastname The user's last name. - * @param email The user's email address. - * @param redirect The URL to send the user to after confirming his address. - * - * @return true if created, false if the account already exists. - */ - public boolean createAccount(String firstname, String lastname, String email, String redirect) - throws OAuthException { - Timer.Context timer = getTimer("F1Access.createAccount.time"); - boolean success = true; - - try { - String req = String.format("{\n\"account\":{\n\"firstName\":\"%s\",\n" - + "\"lastName\":\"%s\",\n\"email\":\"%s\",\n" - + "\"urlRedirect\":\"%s\"\n}\n}", - firstname, lastname, email, redirect); - - Request request = new Request(Method.POST, mBaseUrl + "Accounts"); - request.setChallengeResponse(new ChallengeResponse(ChallengeScheme.HTTP_OAUTH)); - request.setEntity(new StringRepresentation(req, MediaType.APPLICATION_JSON)); - - Response response = mOAuthHelper.getResponse(request); - - Status status = response.getStatus(); - if (Status.SUCCESS_NO_CONTENT.equals(status)) { - return true; - - } else if (Status.CLIENT_ERROR_CONFLICT.equals(status)) { - return false; - - } else { - throw new OAuthException(status); - } - - } catch (Exception e) { - success = false; - throw e; - - } finally { - if (timer != null) { - timer.stop(); - } - if (success) { - incrementCounter("F1Access.createAccount.success"); - } else { - incrementCounter("F1Access.createAccount.failure"); - } - } - } - - /** - * @return An F1API authenticated by the given user. - */ - public F1API getAuthenticatedApi(OAuthUser user) { - return new AuthenticatedApi(user); - } - - private class AuthenticatedApi implements F1API { - private final OAuthUser mUser; - - public AuthenticatedApi(OAuthUser user) { - mUser = user; - } - - /** - * Fetch information about a user. - * - * @param user The user to fetch information about. - * @return An F1User object. - */ - @Override - public F1User getF1User(OAuthUser user) throws OAuthException, IOException { - Timer.Context timer = getTimer("F1Access.getF1User.time"); - boolean success = true; - - try { - Request request = new Request(Method.GET, user.getLocation() + ".json"); - request.setChallengeResponse(mUser.getChallengeResponse()); - Response response = mOAuthHelper.getResponse(request); - - try { - Status status = response.getStatus(); - if (status.isSuccess()) { - JacksonRepresentation<Map> entity = - new JacksonRepresentation<Map>(response.getEntity(), Map.class); - Map data = entity.getObject(); - return new F1User(user, data); - - } else { - throw new OAuthException(status); - } - - } finally { - if (response.getEntity() != null) { - response.release(); - } - } - - } catch (Exception e) { - success = false; - throw e; - - } finally { - if (timer != null) { - timer.stop(); - } - if (success) { - incrementCounter("F1Access.getF1User.success"); - } else { - incrementCounter("F1Access.getF1User.failure"); - } - } - } - - @Override - public Map<String, String> getAttributeList() throws F1Exception { - // Note: this list is shared by all F1 users. - synchronized (mAttributeIdByName) { - if (mAttributeIdByName.size() == 0) { - Timer.Context timer = getTimer("F1Access.getAttributeList.time"); - boolean success = true; - - try { - // Reload attributes. Maybe it will be there now... - Request request = new Request(Method.GET, - mBaseUrl + "People/AttributeGroups.json"); - request.setChallengeResponse(mUser.getChallengeResponse()); - Response response = mOAuthHelper.getResponse(request); - - Representation representation = response.getEntity(); - try { - Status status = response.getStatus(); - if (status.isSuccess()) { - JacksonRepresentation<Map> entity = - new JacksonRepresentation<Map>(response.getEntity(), Map.class); - - Map attributeGroups = (Map) entity.getObject().get("attributeGroups"); - List<Map> groups = (List<Map>) attributeGroups.get("attributeGroup"); - - for (Map group : groups) { - List<Map> attributes = (List<Map>) group.get("attribute"); - if (attributes != null) { - for (Map attribute : attributes) { - String id = (String) attribute.get("@id"); - String name = ((String) attribute.get("name")); - mAttributeIdByName.put(name.toLowerCase(), id); - LOG.debug("Caching attribute '" + name - + "' with id '" + id + "'"); - } - } - } - } - - } catch (IOException e) { - throw new F1Exception("Could not parse AttributeGroups.", e); - - } finally { - if (representation != null) { - representation.release(); - } - } - - } catch (Exception e) { - success = false; - throw e; - - } finally { - if (timer != null) { - timer.stop(); - } - if (success) { - incrementCounter("F1Access.getAttributeList.success"); - } else { - incrementCounter("F1Access.getAttributeList.failure"); - } - } - } - - return mAttributeIdByName; - } - } - - /** - * Add an attribute to the user. - * - * @param user The user to add the attribute to. - * @param attributeName The attribute to add. - * @param attribute The attribute to add. - */ - public boolean addAttribute(String userId, Attribute attribute) - throws F1Exception { - - // Get the attribute id. - String attributeId = getAttributeId(attribute.getAttributeName()); - if (attributeId == null) { - throw new F1Exception("Could not find id for " + attribute.getAttributeName()); - } - - // Get Attribute Template - Map attributeTemplate = null; - - Timer.Context timer = getTimer("F1Access.addAttribute.GET.time"); - boolean success = true; - - try { - Request request = new Request(Method.GET, - mBaseUrl + "People/" + userId + "/Attributes/new.json"); - request.setChallengeResponse(mUser.getChallengeResponse()); - Response response = mOAuthHelper.getResponse(request); - - Representation representation = response.getEntity(); - try { - Status status = response.getStatus(); - if (status.isSuccess()) { - JacksonRepresentation<Map> entity = - new JacksonRepresentation<Map>(response.getEntity(), Map.class); - attributeTemplate = entity.getObject(); - - } else { - throw new F1Exception("Failed to retrieve attribute template: " - + status); - } - - } catch (IOException e) { - throw new F1Exception("Could not parse attribute template.", e); - - } finally { - if (representation != null) { - representation.release(); - } - } - } catch (Exception e) { - success = false; - throw e; - - } finally { - if (timer != null) { - timer.stop(); - } - if (success) { - incrementCounter("F1Access.addAttribute.GET.success"); - } else { - incrementCounter("F1Access.addAttribute.GET.failure"); - } - } - - if (attributeTemplate == null) { - throw new F1Exception("Could not retrieve attribute template."); - } - - // Populate Attribute Template - Map attributeMap = (Map) attributeTemplate.get("attribute"); - Map attributeGroup = (Map) attributeMap.get("attributeGroup"); - - Map<String, String> attributeIdMap = new HashMap<>(); - attributeIdMap.put("@id", attributeId); - attributeGroup.put("attribute", attributeIdMap); - - if (attribute.getStartDate() != null) { - attributeMap.put("startDate", DATE_FORMAT.format(attribute.getStartDate())); - } - - if (attribute.getStartDate() != null) { - attributeMap.put("endDate", DATE_FORMAT.format(attribute.getStartDate())); - } - - attributeMap.put("comment", attribute.getComment()); - - // POST new attribute - Status status; - timer = getTimer("F1Access.addAttribute.POST.time"); - success = true; - - try { - Request request = new Request(Method.POST, - mBaseUrl + "People/" + userId + "/Attributes.json"); - request.setChallengeResponse(mUser.getChallengeResponse()); - request.setEntity(new JacksonRepresentation<Map>(attributeTemplate)); - Response response = mOAuthHelper.getResponse(request); - - Representation representation = response.getEntity(); - try { - status = response.getStatus(); - - if (status.isSuccess()) { - return true; - } - - } finally { - if (representation != null) { - representation.release(); - } - } - } catch (Exception e) { - success = false; - throw e; - - } finally { - if (timer != null) { - timer.stop(); - } - if (success) { - incrementCounter("F1Access.addAttribute.POST.success"); - } else { - incrementCounter("F1Access.getAccessToken.POST.failure"); - } - } - - LOG.debug("addAttribute failed POST: " + status); - return false; - } - - @Override - public List<Attribute> getAttribute(String userId, String attributeNameFilter) - throws F1Exception { - - Map attributesResponse; - - // Get Attributes - Timer.Context timer = getTimer("F1Access.getAttribute.time"); - boolean success = true; - - try { - Request request = new Request(Method.GET, - mBaseUrl + "People/" + userId + "/Attributes.json"); - request.setChallengeResponse(mUser.getChallengeResponse()); - Response response = mOAuthHelper.getResponse(request); - - Representation representation = response.getEntity(); - try { - Status status = response.getStatus(); - if (status.isSuccess()) { - JacksonRepresentation<Map> entity = - new JacksonRepresentation<Map>(response.getEntity(), Map.class); - attributesResponse = entity.getObject(); - - } else { - throw new F1Exception("Failed to retrieve attributes: " - + status); - } - - } catch (IOException e) { - throw new F1Exception("Could not parse attributes.", e); - - } finally { - if (representation != null) { - representation.release(); - } - } - } catch (Exception e) { - success = false; - throw e; - - } finally { - if (timer != null) { - timer.stop(); - } - if (success) { - incrementCounter("F1Access.getAttribute.success"); - } else { - incrementCounter("F1Access.getAttribute.failure"); - } - } - - // Parse Response - List<Attribute> result = new ArrayList<>(); - - try { - // I feel like I'm writing lisp here... - Map attributesMap = (Map) attributesResponse.get("attributes"); - if (attributesMap == null) { - return result; - } - - List<Map> attributes = (List<Map>) (attributesMap).get("attribute"); - for (Map attributeMap : attributes) { - String id = (String) attributeMap.get("@id"); - String startDate = (String) attributeMap.get("startDate"); - String endDate = (String) attributeMap.get("endDate"); - String comment = (String) attributeMap.get("comment"); - - Map attributeIdMap = (Map) ((Map) attributeMap.get("attributeGroup")) - .get("attribute"); - String attributeName = (String) attributeIdMap.get("name"); - - if (attributeNameFilter == null - || attributeNameFilter.equalsIgnoreCase(attributeName)) { - - Attribute attribute = new Attribute(attributeName); - attribute.setId(id); - if (startDate != null) { - attribute.setStartDate(DATE_FORMAT.parse(startDate)); - } - if (endDate != null) { - attribute.setEndDate(DATE_FORMAT.parse(endDate)); - } - attribute.setComment(comment); - result.add(attribute); - } - } - } catch (Exception e) { - throw new F1Exception("Failed to parse attributes response.", e); - } - - return result; - } - - /** - * @return an attribute id for the given attribute name. - */ - private String getAttributeId(String attributeName) throws F1Exception { - Map<String, String> attributeMap = getAttributeList(); - - return attributeMap.get(attributeName.toLowerCase()); - } - - } - - private Timer.Context getTimer(String name) { - if (mMetricRegistry != null) { - return mMetricRegistry.timer(name).time(); - } else { - return null; - } - } - - private void incrementCounter(String name) { - if (mMetricRegistry != null) { - mMetricRegistry.counter(name).inc(); - } - } -} |