(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(); | |
} | |
}); | |
} | |
}; | |
})(); |