blob: cfc399f900488c8f2593ba6683b4eda0982774d6 [file] [log] [blame]
(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();
}
});
}
};
})();