Skip to content

Instantly share code, notes, and snippets.

@fushang318
Created December 2, 2010 02:43
Show Gist options
  • Save fushang318/724652 to your computer and use it in GitHub Desktop.
Save fushang318/724652 to your computer and use it in GitHub Desktop.
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);
},
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);
},
@fushang318
Copy link
Author

123

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment