Release 5.2
diff --git a/src/js/imgur.js b/src/js/imgur.js
new file mode 100644
index 0000000..cfc399f
--- /dev/null
+++ b/src/js/imgur.js
@@ -0,0 +1,241 @@
+(function() {
+ const IMGUR_APP_KEY = '90922ae86b91b09541d74134a5bb0f6404e0c378f';
+ const IMGUR_APP_SECRET = 'b100656ebf595b7464e428615b9bc703';
+ const IMGUR_REQUEST_TOKEN_URL = 'https://api.imgur.com/oauth/request_token';
+ const IMGUR_USER_AUTHENTICATION_URL = 'https://api.imgur.com/oauth/authorize';
+ const IMGUR_ACCESS_TOKEN_URL = 'https://api.imgur.com/oauth/access_token';
+ const IMGUR_USER_INFO_URL = 'http://api.imgur.com/2/account.json';
+ const IMGUR_PHOTO_UPLOAD_URL = 'http://api.imgur.com/2/account/images.json';
+ const IMGUR_LOGOUT_URL = 'http://imgur.com/logout';
+ const OAUTH_SIGNATURE_METHOD = 'HMAC-SHA1';
+ const OAUTH_VERSION = '1.0';
+
+ var Imgur = window.Imgur = {
+ siteId: 'imgur',
+ currentUserId: null,
+ currentUserOauthToken: '',
+ currentUserOauthTokenSecret: '',
+ accessTokenCallback: null,
+
+ isRedirectUrl: function() {},
+
+ getAuthorizationHeader: function(message, accessor) {
+ OAuth.setTimestampAndNonce(message);
+ OAuth.SignatureMethod.sign(message, accessor);
+ return OAuth.getAuthorizationHeader("", message.parameters);
+ },
+
+ getRequestToken: function(callback) {
+ Imgur.accessTokenCallback = callback;
+ var message = {
+ action: IMGUR_REQUEST_TOKEN_URL,
+ method: 'POST',
+ parameters: {
+ 'oauth_consumer_key': IMGUR_APP_KEY,
+ 'oauth_signature_method': OAUTH_SIGNATURE_METHOD,
+ 'oauth_version': OAUTH_VERSION
+ }
+ };
+ var accessor = {
+ consumerKey: IMGUR_APP_KEY,
+ consumerSecret: IMGUR_APP_SECRET
+ };
+
+ // Get oauth signature header
+ var header = Imgur.getAuthorizationHeader(message, accessor);
+
+ ajax({
+ url: IMGUR_REQUEST_TOKEN_URL,
+ method: 'POST',
+ headers: {
+ 'Authorization': header
+ },
+ success: function(response) {
+ parameters = OAuth.getParameterMap(response);
+ var oauth_token = parameters['oauth_token'];
+ var oauth_token_secret = parameters['oauth_token_secret'];
+ Imgur.currentUserOauthToken = oauth_token;
+ Imgur.currentUserOauthTokenSecret = oauth_token_secret;
+ Imgur.getUserAuthentication(oauth_token);
+ },
+ status: {
+ others: function() {
+ callback('failure', 'imgur_failed_to_get_request_token');
+ }
+ }
+ });
+ },
+
+ getUserAuthentication: function(oauth_token) {
+ var url = IMGUR_USER_AUTHENTICATION_URL + '?oauth_token=' + oauth_token +
+ '&oauth_callback=ready';
+ chrome.tabs.create({url: url}, function(tab) {
+ chrome.tabs.onUpdated.addListener(
+ function(tabId, changeInfo, _tab) {
+ if (tabId == tab.id && changeInfo.url
+ && changeInfo.url.indexOf('oauth_verifier=') > 0) {
+ chrome.tabs.remove(tabId);
+ Imgur.parseAccessToken(changeInfo.url);
+ }
+ });
+ });
+ },
+
+ parseAccessToken: function(url) {
+ var oauth_verifier = OAuth.getParameter(url, 'oauth_verifier');
+ Imgur.getAccessToken(Imgur.accessTokenCallback, oauth_verifier);
+ Imgur.accessTokenCallback = null;
+ },
+
+ getAccessToken: function(callback, oauth_verifier) {
+ if (!oauth_verifier) {
+ Imgur.getRequestToken(callback);
+ return;
+ }
+ var message = {
+ action: IMGUR_ACCESS_TOKEN_URL,
+ method: 'POST',
+ parameters: {
+ 'oauth_consumer_key': IMGUR_APP_KEY,
+ 'oauth_token': Imgur.currentUserOauthToken,
+ 'oauth_token_secret': Imgur.currentUserOauthTokenSecret,
+ 'oauth_signature_method': OAUTH_SIGNATURE_METHOD,
+ 'oauth_verifier': oauth_verifier,
+ 'oauth_version': OAUTH_VERSION
+ }
+ };
+ var accessor = {
+ consumerKey: IMGUR_APP_KEY,
+ consumerSecret: IMGUR_APP_SECRET,
+ tokenSecret: Imgur.currentUserOauthTokenSecret
+ };
+ var header = Imgur.getAuthorizationHeader(message, accessor);
+
+ ajax({
+ url: IMGUR_ACCESS_TOKEN_URL,
+ method: 'POST',
+ headers: {
+ 'Authorization': header
+ },
+ success: function(response) {
+ responseMap = OAuth.getParameterMap(response);
+ var accessToken = responseMap.oauth_token;
+ var accessTokenSecret = responseMap.oauth_token_secret;
+ var user = new User({
+ id: null,
+ accessToken: accessToken,
+ accessTokenSecret: accessTokenSecret
+ });
+
+ callback('success', user);
+ },
+ status: {
+ others: function(data) {
+ callback('failure', 'imgur_failed_to_get_access_token');
+ }
+ }
+ });
+ },
+
+ getUserInfo: function(user, callback) {
+ var url = IMGUR_USER_INFO_URL;
+ var message = {
+ action: url,
+ method: 'GET',
+ parameters: {
+ 'oauth_consumer_key': IMGUR_APP_KEY,
+ 'oauth_token': user.accessToken,
+ 'oauth_signature_method': OAUTH_SIGNATURE_METHOD,
+ 'oauth_version': OAUTH_VERSION
+ }
+ };
+
+ var accessor = {
+ consumerSecret: IMGUR_APP_SECRET,
+ tokenSecret: user.accessTokenSecret
+ };
+
+ var header = Imgur.getAuthorizationHeader(message, accessor);
+ ajax({
+ url: url,
+ method: 'GET',
+ headers: {
+ 'Authorization': header
+ },
+ success: function(data) {
+ if (callback) {
+ user.id = data.account.url;
+ user.name = data.account.url;
+ callback('success', user);
+ }
+ },
+ status: {
+ others: function(data) {
+ callback('failure', 'failed_to_get_user_info');
+ }
+ }
+ });
+ },
+
+ upload: function(user, caption, imageData, callback) {
+ caption = encodeURIComponent(caption);
+ var message = {
+ action: IMGUR_PHOTO_UPLOAD_URL,
+ method: 'POST',
+ parameters: {
+ 'oauth_consumer_key': IMGUR_APP_KEY,
+ 'oauth_token': user.accessToken,
+ 'oauth_signature_method': OAUTH_SIGNATURE_METHOD,
+ 'oauth_version': OAUTH_VERSION
+ }
+ };
+ var accessor = {
+ consumerSecret: IMGUR_APP_SECRET,
+ tokenSecret: user.accessTokenSecret
+ };
+ var header = Imgur.getAuthorizationHeader(message, accessor);
+
+ var binaryData = {
+ boundary: MULTIPART_FORMDATA_BOUNDARY,
+ name: 'image',
+ value: 'screencapture.png',
+ data: imageData,
+ type: 'image/png'
+ };
+
+ ajax({
+ url: IMGUR_PHOTO_UPLOAD_URL,
+ method: 'POST',
+ multipartData: binaryData,
+ headers: {
+ 'Authorization': header
+ },
+ success: function(response) {
+ callback('success', response.images.links.original);
+ },
+ status: {
+ others: function(err, statusCode) {
+ if (statusCode == 401) {
+ callback('failure', 'bad_access_token');
+ } else {
+ callback('failure', 'failed_to_upload_image');
+ };
+ }
+ }
+ });
+ },
+
+ getPhotoLink: function(user, photoLink, callback) {
+ callback('success', photoLink);
+ },
+
+ logout: function(callback) {
+ ajax({
+ url: IMGUR_LOGOUT_URL,
+ success: function() {
+ callback();
+ }
+ });
+ }
+ };
+})();
\ No newline at end of file