From 5c030ca36020097e8c80767c940a40d3083ac246 Mon Sep 17 00:00:00 2001 From: Seth Hitchings Date: Fri, 27 Apr 2012 11:36:36 -0700 Subject: [PATCH 1/3] Full Evernote API support --- .../org/scribe/builder/api/EvernoteApi.java | 110 +++++++++++++++--- 1 file changed, 96 insertions(+), 14 deletions(-) diff --git a/src/main/java/org/scribe/builder/api/EvernoteApi.java b/src/main/java/org/scribe/builder/api/EvernoteApi.java index 48d45e9..a35c547 100644 --- a/src/main/java/org/scribe/builder/api/EvernoteApi.java +++ b/src/main/java/org/scribe/builder/api/EvernoteApi.java @@ -1,11 +1,18 @@ package org.scribe.builder.api; +import java.util.regex.Matcher; +import java.util.regex.Pattern; + +import org.scribe.exceptions.OAuthException; +import org.scribe.extractors.AccessTokenExtractor; import org.scribe.model.Token; import org.scribe.model.Verb; +import org.scribe.utils.OAuthEncoder; +import org.scribe.utils.Preconditions; public class EvernoteApi extends DefaultApi10a { - private static final String AUTHORIZATION_URL = "https://www.evernote.com/OAuth.action?oauth_token=%s"; + private static final String EVERNOTE_URL = "https://www.evernote.com"; @Override public Verb getRequestTokenVerb() @@ -16,47 +23,122 @@ public class EvernoteApi extends DefaultApi10a @Override public String getRequestTokenEndpoint() { - return "https://www.evernote.com/oauth"; - } - - @Override - public Verb getAccessTokenVerb() - { - return Verb.GET; + return EVERNOTE_URL + "/oauth"; } @Override public String getAccessTokenEndpoint() { - return "https://www.evernote.com/oauth"; + return EVERNOTE_URL + "/oauth"; } @Override public String getAuthorizationUrl(Token requestToken) { - return String.format(AUTHORIZATION_URL, requestToken.getToken()); + return String.format(EVERNOTE_URL + "/OAuth.action?oauth_token=%s", requestToken.getToken()); + } + + @Override + public AccessTokenExtractor getAccessTokenExtractor() { + return new EvernoteAccessTokenExtractor(); } public static class Sandbox extends EvernoteApi { - private static final String SANDBOX_URL = "https://sandbox.evernote.com/oauth"; + private static final String SANDBOX_URL = "https://sandbox.evernote.com"; @Override public String getRequestTokenEndpoint() { - return SANDBOX_URL; + return SANDBOX_URL + "/oauth"; } @Override public String getAccessTokenEndpoint() { - return SANDBOX_URL; + return SANDBOX_URL + "/oauth"; } @Override public String getAuthorizationUrl(Token requestToken) { - return String.format(SANDBOX_URL + "?oauth_token=%s", requestToken.getToken()); + return String.format(SANDBOX_URL + "/OAuth.action?oauth_token=%s", requestToken.getToken()); } } + + public static class EvernoteAuthToken extends Token { + private static final long serialVersionUID = 5913745981744917828L; + + private String noteStoreUrl; + private String webApiUrlPrefix; + private int userId; + + public EvernoteAuthToken(String token, String secret, + String noteStoreUrl, String webApiUrlPrefix, int userId, String rawResponse) { + super(token, secret, rawResponse); + this.noteStoreUrl = noteStoreUrl; + this.webApiUrlPrefix = webApiUrlPrefix; + this.userId = userId; + } + + /** + * Get the Evernote web service NoteStore URL from the OAuth access token response. + */ + public String getNoteStoreUrl() { + return noteStoreUrl; + } + + /** + * Get the Evernote web API URL prefix from the OAuth access token response. + */ + public String getWebApiUrlPrefix() { + return webApiUrlPrefix; + } + + /** + * Get the numeric Evernote user ID from the OAuth access token response. + */ + public int getUserId() { + return userId; + } + } + + public static class EvernoteAccessTokenExtractor implements org.scribe.extractors.AccessTokenExtractor { + + private static final Pattern TOKEN_REGEX = Pattern.compile("oauth_token=([^&]+)"); + private static final Pattern SECRET_REGEX = Pattern.compile("oauth_token_secret=([^&]*)"); + private static final Pattern NOTESTORE_REGEX = Pattern.compile("edam_noteStoreUrl=([^&]+)"); + private static final Pattern WEBAPI_REGEX = Pattern.compile("edam_webApiUrlPrefix=([^&]+)"); + private static final Pattern USERID_REGEX = Pattern.compile("edam_userId=([^&]+)"); + + /** + * {@inheritDoc} + */ + public Token extract(String response) + { + Preconditions.checkEmptyString(response, "Response body is incorrect. " + + "Can't extract a token from an empty string"); + return new EvernoteAuthToken(extract(response, TOKEN_REGEX), + extract(response, SECRET_REGEX), + extract(response, NOTESTORE_REGEX), + extract(response, WEBAPI_REGEX), + Integer.parseInt(extract(response, USERID_REGEX)), + response); + } + + private String extract(String response, Pattern p) + { + Matcher matcher = p.matcher(response); + if (matcher.find() && matcher.groupCount() >= 1) + { + return OAuthEncoder.decode(matcher.group(1)); + } + else + { + throw new OAuthException("Response body is incorrect. " + + "Can't extract token and secret from this: '" + response + "'", null); + } + } + } + } From 0a45342004252c91264bd400cf108187088cbd60 Mon Sep 17 00:00:00 2001 From: Seth Hitchings Date: Fri, 27 Apr 2012 13:27:13 -0700 Subject: [PATCH 2/3] Remove EvernoteAuthToken --- .../org/scribe/builder/api/EvernoteApi.java | 57 +------------------ 1 file changed, 3 insertions(+), 54 deletions(-) diff --git a/src/main/java/org/scribe/builder/api/EvernoteApi.java b/src/main/java/org/scribe/builder/api/EvernoteApi.java index a35c547..eaee96e 100644 --- a/src/main/java/org/scribe/builder/api/EvernoteApi.java +++ b/src/main/java/org/scribe/builder/api/EvernoteApi.java @@ -6,7 +6,6 @@ import java.util.regex.Pattern; import org.scribe.exceptions.OAuthException; import org.scribe.extractors.AccessTokenExtractor; import org.scribe.model.Token; -import org.scribe.model.Verb; import org.scribe.utils.OAuthEncoder; import org.scribe.utils.Preconditions; @@ -14,12 +13,6 @@ public class EvernoteApi extends DefaultApi10a { private static final String EVERNOTE_URL = "https://www.evernote.com"; - @Override - public Verb getRequestTokenVerb() - { - return Verb.GET; - } - @Override public String getRequestTokenEndpoint() { @@ -65,51 +58,12 @@ public class EvernoteApi extends DefaultApi10a return String.format(SANDBOX_URL + "/OAuth.action?oauth_token=%s", requestToken.getToken()); } } - - public static class EvernoteAuthToken extends Token { - private static final long serialVersionUID = 5913745981744917828L; - private String noteStoreUrl; - private String webApiUrlPrefix; - private int userId; - - public EvernoteAuthToken(String token, String secret, - String noteStoreUrl, String webApiUrlPrefix, int userId, String rawResponse) { - super(token, secret, rawResponse); - this.noteStoreUrl = noteStoreUrl; - this.webApiUrlPrefix = webApiUrlPrefix; - this.userId = userId; - } - - /** - * Get the Evernote web service NoteStore URL from the OAuth access token response. - */ - public String getNoteStoreUrl() { - return noteStoreUrl; - } - - /** - * Get the Evernote web API URL prefix from the OAuth access token response. - */ - public String getWebApiUrlPrefix() { - return webApiUrlPrefix; - } - - /** - * Get the numeric Evernote user ID from the OAuth access token response. - */ - public int getUserId() { - return userId; - } - } - - public static class EvernoteAccessTokenExtractor implements org.scribe.extractors.AccessTokenExtractor { + public static class EvernoteAccessTokenExtractor implements AccessTokenExtractor { private static final Pattern TOKEN_REGEX = Pattern.compile("oauth_token=([^&]+)"); + // Evernote access tokens include an empty token secret (the empty string). private static final Pattern SECRET_REGEX = Pattern.compile("oauth_token_secret=([^&]*)"); - private static final Pattern NOTESTORE_REGEX = Pattern.compile("edam_noteStoreUrl=([^&]+)"); - private static final Pattern WEBAPI_REGEX = Pattern.compile("edam_webApiUrlPrefix=([^&]+)"); - private static final Pattern USERID_REGEX = Pattern.compile("edam_userId=([^&]+)"); /** * {@inheritDoc} @@ -118,12 +72,7 @@ public class EvernoteApi extends DefaultApi10a { Preconditions.checkEmptyString(response, "Response body is incorrect. " + "Can't extract a token from an empty string"); - return new EvernoteAuthToken(extract(response, TOKEN_REGEX), - extract(response, SECRET_REGEX), - extract(response, NOTESTORE_REGEX), - extract(response, WEBAPI_REGEX), - Integer.parseInt(extract(response, USERID_REGEX)), - response); + return new Token(extract(response, TOKEN_REGEX), extract(response, SECRET_REGEX), response); } private String extract(String response, Pattern p) From d721204939523368794b62bd760e72ed15b40960 Mon Sep 17 00:00:00 2001 From: Seth Hitchings Date: Mon, 30 Apr 2012 09:45:49 -0700 Subject: [PATCH 3/3] Allow empty oauth_token_secret values --- .../org/scribe/builder/api/EvernoteApi.java | 60 +++---------------- .../scribe/extractors/TokenExtractorImpl.java | 2 +- .../scribe/extractors/TokenExtractorTest.java | 9 +++ 3 files changed, 18 insertions(+), 53 deletions(-) diff --git a/src/main/java/org/scribe/builder/api/EvernoteApi.java b/src/main/java/org/scribe/builder/api/EvernoteApi.java index eaee96e..007f48b 100644 --- a/src/main/java/org/scribe/builder/api/EvernoteApi.java +++ b/src/main/java/org/scribe/builder/api/EvernoteApi.java @@ -1,39 +1,27 @@ package org.scribe.builder.api; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import org.scribe.exceptions.OAuthException; -import org.scribe.extractors.AccessTokenExtractor; import org.scribe.model.Token; -import org.scribe.utils.OAuthEncoder; -import org.scribe.utils.Preconditions; public class EvernoteApi extends DefaultApi10a { - private static final String EVERNOTE_URL = "https://www.evernote.com"; - - @Override + private static final String AUTHORIZATION_URL = "https://www.evernote.com/OAuth.action?oauth_token=%s"; + + @Override public String getRequestTokenEndpoint() { - return EVERNOTE_URL + "/oauth"; - } + return "https://www.evernote.com/oauth"; + } @Override public String getAccessTokenEndpoint() { - return EVERNOTE_URL + "/oauth"; + return "https://www.evernote.com/oauth"; } @Override public String getAuthorizationUrl(Token requestToken) { - return String.format(EVERNOTE_URL + "/OAuth.action?oauth_token=%s", requestToken.getToken()); - } - - @Override - public AccessTokenExtractor getAccessTokenExtractor() { - return new EvernoteAccessTokenExtractor(); + return String.format(AUTHORIZATION_URL, requestToken.getToken()); } public static class Sandbox extends EvernoteApi @@ -57,37 +45,5 @@ public class EvernoteApi extends DefaultApi10a { return String.format(SANDBOX_URL + "/OAuth.action?oauth_token=%s", requestToken.getToken()); } - } - - public static class EvernoteAccessTokenExtractor implements AccessTokenExtractor { - - private static final Pattern TOKEN_REGEX = Pattern.compile("oauth_token=([^&]+)"); - // Evernote access tokens include an empty token secret (the empty string). - private static final Pattern SECRET_REGEX = Pattern.compile("oauth_token_secret=([^&]*)"); - - /** - * {@inheritDoc} - */ - public Token extract(String response) - { - Preconditions.checkEmptyString(response, "Response body is incorrect. " + - "Can't extract a token from an empty string"); - return new Token(extract(response, TOKEN_REGEX), extract(response, SECRET_REGEX), response); - } - - private String extract(String response, Pattern p) - { - Matcher matcher = p.matcher(response); - if (matcher.find() && matcher.groupCount() >= 1) - { - return OAuthEncoder.decode(matcher.group(1)); - } - else - { - throw new OAuthException("Response body is incorrect. " + - "Can't extract token and secret from this: '" + response + "'", null); - } - } - } - + } } diff --git a/src/main/java/org/scribe/extractors/TokenExtractorImpl.java b/src/main/java/org/scribe/extractors/TokenExtractorImpl.java index c48fe35..ba1784b 100644 --- a/src/main/java/org/scribe/extractors/TokenExtractorImpl.java +++ b/src/main/java/org/scribe/extractors/TokenExtractorImpl.java @@ -16,7 +16,7 @@ import org.scribe.utils.*; public class TokenExtractorImpl implements RequestTokenExtractor, AccessTokenExtractor { private static final Pattern TOKEN_REGEX = Pattern.compile("oauth_token=([^&]+)"); - private static final Pattern SECRET_REGEX = Pattern.compile("oauth_token_secret=([^&]+)"); + private static final Pattern SECRET_REGEX = Pattern.compile("oauth_token_secret=([^&]*)"); /** * {@inheritDoc} diff --git a/src/test/java/org/scribe/extractors/TokenExtractorTest.java b/src/test/java/org/scribe/extractors/TokenExtractorTest.java index 2c9928f..aca5ad1 100644 --- a/src/test/java/org/scribe/extractors/TokenExtractorTest.java +++ b/src/test/java/org/scribe/extractors/TokenExtractorTest.java @@ -43,6 +43,15 @@ public class TokenExtractorTest assertEquals("hh5s93j4hdidpola", extracted.getToken()); assertEquals("hdhd0244k9j7ao03", extracted.getSecret()); } + + @Test + public void shouldExtractTokenWithEmptySecret() + { + String response = "oauth_token=hh5s93j4hdidpola&oauth_token_secret="; + Token extracted = extractor.extract(response); + assertEquals("hh5s93j4hdidpola", extracted.getToken()); + assertEquals("", extracted.getSecret()); + } @Test(expected = OAuthException.class) public void shouldThrowExceptionIfTokenIsAbsent()