Created
December 2, 2010 02:43
-
-
Save fushang318/724652 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
doUpload: function(binary) { | |
if (typeof(binary) == 'undefined') binary = false; | |
// check for dynamic settings | |
this.useDynamicSettings = false; | |
this.upload.cancel = false; | |
if (this.getUserPref('dynamicSettings', 'bool')) { | |
window.openDialog('chrome://photobucket/content/uploadSettings.xul', "pbLogin", "modal, dialog, chrome, centerscreen", Photobucket_Uploader); | |
if (this.upload.cancel) { | |
return false; | |
} | |
} | |
this.pbNotify('Uploading image...', 'info', null); | |
// prep | |
this.getPrefs(); | |
this.getUserPrefs(); | |
var uploadAlbum = this.username; | |
var domain = 'http://' + this.domain + '/'; | |
var albumTypeInt = (this.useDynamicSettings) ? this.upload.albumType : this.getUserPref('albumType', 'int'); | |
switch (albumTypeInt) { | |
case 0: var albumType = 'album'; break; | |
case 1: var albumType = 'group'; break; | |
default: var albumType = 'album'; | |
} | |
if (this.useDynamicSettings) { | |
var title = this.upload.title; | |
var description = this.upload.description; | |
var filename = this.upload.filename; | |
var scramble = this.upload.scrambleFilename; | |
var imgSrcTag = this.upload.imgSrcTag; | |
if (albumTypeInt == 0 && typeof(this.upload.userAlbum) == 'string' && this.upload.userAlbum.length && this.upload.userAlbum != '<Home Album>') { | |
uploadAlbum += '/' + this.upload.userAlbum; | |
} else if (albumTypeInt == 1) { | |
var nativeJSON = Components.classes["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON); | |
var group = nativeJSON.decode(this.upload.selectedGroup); | |
uploadAlbum = group.hash; | |
domain = 'http://api' + group.silo + '.photobucket.com/'; | |
} | |
} else { | |
var title = this.getUserPref('defaultTitle'); | |
var description = this.getUserPref('defaultDescription'); | |
if (matches = Photobucket_Uploader.picUrl.match(/^.*\/(.+?)$/)) { | |
var filename = matches[1].split('.',1)[0].replace(/\s/g,'_').replace(/[^\w-]+/g,'').substr(0,35); | |
} else { | |
var filename = this.getTimestamp(); //couldn't parse filename, use timestamp | |
} | |
var scramble = this.getUserPref('scrambleFilename', 'bool'); | |
var imgSrcTag = this.getUserPref('imgSrcTag', 'bool'); | |
if (albumTypeInt == 0 && typeof(this.upload.userAlbum) == 'string' && this.upload.userAlbum.length && this.getUserPref('userAlbum') != '<Home Album>') { | |
uploadAlbum += '/' + this.getUserPref('userAlbum'); | |
} else if (albumTypeInt == 1) { | |
var nativeJSON = Components.classes["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON); | |
var group = nativeJSON.decode(this.getUserPref('selectedGroup')); | |
uploadAlbum = group.hash; | |
domain = 'http://api' + group.silo + '.photobucket.com/'; | |
} | |
} | |
if (this.DEV_MODE) { | |
domain = this.apiUrl; | |
} | |
var params = "description=" + this.urlEncode(description.substr(0,2048)) + | |
"&filename=" + this.urlEncode(filename) + | |
"&format=json"; | |
if (!binary) { | |
params +="&imageUrl=" + this.urlEncode(this.picUrl); | |
} | |
params +="&oauth_consumer_key=" + this.consumerKey + | |
"&oauth_nonce=" + this.getNonce() + | |
"&oauth_signature_method=HMAC-SHA1" + | |
"&oauth_timestamp=" + this.getTimestamp() + | |
"&oauth_token=" + this.oauthToken + | |
"&oauth_version=1.0" + | |
"&scramble=" + scramble + | |
"&title=" + this.urlEncode(title.substr(0,250)); | |
if (binary) { | |
params +="&type=base64"; | |
} else { | |
params +="&type=url"; | |
} | |
var baseUrl = 'http://api.photobucket.com/' + albumType + '/' + this.urlEncode(uploadAlbum) + '/upload'; | |
var url = domain + albumType + '/' + this.urlEncode(uploadAlbum) + '/upload'; | |
var method = 'POST'; | |
// oauth signature | |
var key = this.urlEncode(this.consumerSecret) + '&' + this.urlEncode(this.oauthSecret); | |
var base = this.urlEncode(method) + '&' + this.urlEncode(baseUrl) + '&' + this.urlEncode(params); | |
var sig = PbUploaderClass.b64_hmac_sha1(key, base); | |
if (binary) { | |
var postData = params + '&uploadfile=' + this.urlEncode(this.getImageFromUrl(this.picUrl)) + '&oauth_signature=' + this.urlEncode(sig); | |
} else { | |
var postData = params + '&oauth_signature=' + this.urlEncode(sig); | |
} | |
//var debug = "method=\n" + method + "\n\najax url=\n" + url.replace(/\&/g, "\n&") + "\n\nbaseurl=\n" + baseUrl.replace(/\&/g, "\n&") + "\n\nbase=\n" + base.replace(/\%26/g, "\n%26") + "\n\npost data=\n" + postData.replace(/\&/g, "\n&"); | |
//Photobucket_Uploader.console(debug); | |
// request | |
var ajax = new XMLHttpRequest(); | |
ajax.open(method,url); | |
ajax.setRequestHeader('Content-Type','application/x-www-form-urlencoded'); | |
ajax.onreadystatechange = function() { | |
var done = 4, ok = 200; | |
if (ajax.readyState == 4) { | |
// handle response | |
try { | |
var nativeJSON = Components.classes["@mozilla.org/dom/json;1"].createInstance(Components.interfaces.nsIJSON); | |
var response = nativeJSON.decode(ajax.responseText); | |
} catch(err) { | |
if (binary) { | |
Photobucket_Uploader.pbNotify('Upload failed.', 'critical', null); | |
return null; | |
} else { | |
Photobucket_Uploader.doUpload(true); | |
return null; | |
} | |
} | |
// display notification | |
if (response.status == 'OK') { | |
Photobucket_Uploader.browseUrl = response.content.browseurl; | |
Photobucket_Uploader.directUrl = response.content.url; | |
Photobucket_Uploader.prefs.setCharPref("extensions.photobucket.uploader.browseUrl", Photobucket_Uploader.browseUrl); | |
Photobucket_Uploader.prefs.setCharPref("extensions.photobucket.uploader.url", Photobucket_Uploader.directUrl); | |
var buttons = [{ | |
label: "Link Codes", | |
accessKey: null, | |
popup: null, | |
callback: Photobucket_Uploader.doLinkCodes | |
},{ | |
label: "View Image", | |
accessKey: null, | |
popup: null, | |
callback: Photobucket_Uploader.doViewImage | |
}]; | |
if (albumType == 'album') { | |
buttons.push({ | |
label: "Album Organizer", | |
accessKey: null, | |
popup: null, | |
callback: Photobucket_Uploader.doAlbumOrganizer, | |
album: uploadAlbum | |
}); | |
} | |
Photobucket_Uploader.pbNotify("Image successfully uploaded to Photobucket.", 'info', buttons); | |
//open full view in background tab | |
var params = "oauth_consumer_key=" + Photobucket_Uploader.consumerKey + | |
"&oauth_nonce=" + Photobucket_Uploader.getNonce() + | |
"&oauth_signature_method=HMAC-SHA1" + | |
"&oauth_timestamp=" + Photobucket_Uploader.getTimestamp() + | |
"&oauth_token=" + Photobucket_Uploader.oauthToken + | |
"&oauth_version=1.0" + | |
"&redirect=true" + | |
"&redirecturl=" + Photobucket_Uploader.urlEncode(Photobucket_Uploader.browseUrl); | |
var baseUrl = 'http://api.photobucket.com/sitelogin'; | |
var url = 'http://' + Photobucket_Uploader.domain + '/sitelogin'; | |
var method = 'GET'; | |
var key = Photobucket_Uploader.urlEncode(Photobucket_Uploader.consumerSecret) + '&' + Photobucket_Uploader.urlEncode(Photobucket_Uploader.oauthSecret); | |
var base = Photobucket_Uploader.urlEncode(method) + '&' + Photobucket_Uploader.urlEncode(baseUrl) + '&' + Photobucket_Uploader.urlEncode(params); | |
var sig = PbUploaderClass.b64_hmac_sha1(key, base); | |
var viewUrl = url + '?' + params + '&oauth_signature=' + Photobucket_Uploader.urlEncode(sig); | |
Photobucket_Uploader.pbTab(viewUrl, false); | |
//add tags | |
if (Photobucket_Uploader.sourceUrl && imgSrcTag) { | |
Photobucket_Uploader.addTag('Image Source', Photobucket_Uploader.sourceUrl, domain, albumType); | |
} | |
Photobucket_Uploader.addTag('Photobucket Uploader Firefox Extension', 'http://addons.mozilla.org/firefox/addon/10035', domain, albumType); | |
} else { | |
if (binary) { | |
if (response.code && response.code == 7) { | |
//failed auth | |
Photobucket_Uploader.setPref('username', ''); | |
Components.classes["@mozilla.org/cookiemanager;1"].getService(Components.interfaces.nsICookieManager).remove('.photobucket.com', 'pbauth', '/', false); | |
var buttons = [{ | |
label: "Login", | |
accessKey: null, | |
popup: null, | |
callback: Photobucket_Uploader.login | |
}]; | |
Photobucket_Uploader.pbNotify("Photobucket authentication has failed. Please login and try again.", 'critical', buttons); | |
} else { | |
var msg = "Image upload has failed."; | |
if (response.message) { | |
msg += ' ' + response.message + '.'; | |
}; | |
Photobucket_Uploader.pbNotify(msg, 'critical', null); | |
} | |
} else { | |
Photobucket_Uploader.doUpload(true); | |
return null; | |
} | |
} | |
} | |
}; | |
ajax.send(postData); | |
}, | |
getImageFromUrl: function(url) { | |
var ioserv = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); | |
var channel = ioserv.newChannel(url, 0, null); | |
var stream = channel.open(); | |
if (channel instanceof Components.interfaces.nsIHttpChannel && channel.responseStatus != 200) { | |
return ""; | |
} | |
var bstream = Components.classes["@mozilla.org/binaryinputstream;1"] .createInstance(Components.interfaces.nsIBinaryInputStream); | |
bstream.setInputStream(stream); | |
var size = 0; | |
var file_data = ""; | |
while(size = bstream.available()) { | |
file_data += bstream.readBytes(size); | |
} | |
//Photobucket_Uploader.console("getImageFromUrl urlencoded binary data....\n" + Photobucket_Uploader.urlEncode(window.btoa(file_data))); | |
return window.btoa(file_data); | |
}, |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
getImageFromUrl: function(url) { | |
var ioserv = Components.classes["@mozilla.org/network/io-service;1"].getService(Components.interfaces.nsIIOService); | |
var channel = ioserv.newChannel(url, 0, null); | |
var stream = channel.open(); | |
if (channel instanceof Components.interfaces.nsIHttpChannel && channel.responseStatus != 200) { | |
return ""; | |
} | |
var bstream = Components.classes["@mozilla.org/binaryinputstream;1"] .createInstance(Components.interfaces.nsIBinaryInputStream); | |
bstream.setInputStream(stream); | |
var size = 0; | |
var file_data = ""; | |
while(size = bstream.available()) { | |
file_data += bstream.readBytes(size); | |
} | |
//Photobucket_Uploader.console("getImageFromUrl urlencoded binary data....\n" + Photobucket_Uploader.urlEncode(window.btoa(file_data))); | |
return window.btoa(file_data); | |
}, |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
123