Guest User

Untitled

a guest
Feb 28th, 2018
105
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 9.52 KB | None | 0 0
  1. // FTP Upload for Tombloo
  2. //
  3.  
  4. (function(){
  5.  
  6. var ProxyService = getService("/network/protocol-proxy-service;1", Ci.nsIProtocolProxyService);
  7. var DNSService = getService("/network/dns-service;1", Ci.nsIDNSService);
  8. var SocketService = getService("/network/socket-transport-service;1", Ci.nsISocketTransportService);
  9. var ServerSocket = createConstructor("/network/server-socket;1", "nsIServerSocket", "init");
  10.  
  11. models.register({
  12. name: 'FTPUpload',
  13. ICON: 'data:image/png;base64,'+
  14. 'iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8%2F9hAAAABGdBTUEAAK%2FINwWK6QAAABl0RVh0U29mdHdhcmUAQWRvYmUg'+
  15. 'SW1hZ2VSZWFkeXHJZTwAAANCSURBVBgZBcHbT1t1AMDx72lPKS29UCiz0BUMQxwwJptMSIAZzRgu6oOJ%2BjKjkQdjTAx%2FgI9m'+
  16. 'ezAmJkb3ppKYqHsxe9oMOh0ZODd3xYVtFOLK1dG0pYWensvv4udjaK0BAACYmp8cAz4GjgEtgAmUgeta6XNfjn33CwAAgKG1BmBq'+
  17. 'ftIEpoE3X8%2BcCCZCLVSsBiwXhLQRPOHy1iUhhfxVCPn2N6d%2B2gMwtNZMzU8GgD8Gk30jJzMvUbGDOLgsVwzqdJCCpdDCJYTF'+
  18. 'lnOVm5s3F4Qnjv%2Fw1oWyDwCYPtrcPTLaNkhRung%2BAyF81EQdFnUUnSDbdoj1coD2yAsMpp497DrejwD%2B0vjqKPDZ6e7X%2'+
  19. 'FPdllS1q1JRgz45QdAJUbMhu7FKuVgkmChjxLMPJg1xevNH5%2FfXpe%2F6hySNfTLQNHTL8IbZ8AvQ%2BWmWEW0%2F81Gwfixt7'+
  20. 'qPoSwY5HOLEseVXCLEkONWd8tx4%2FbDKBY5lYmrvWJvl6H73%2BAygEuW0X264RT2kqTTMsqx1wNI0iSDbvcOLpo3iO6DeB5rDZ'+
  21. 'QM7aZNuxiIY72XGjlEqKeIvNvoRFXg6QvnMOaVfJZw5S3AkTCUXxXNHo01obhgbXqaCtVkxPcukvD6M%2BxNayydpqjDYnhPA0%2'+
  22. 'B5M9BJfv4Nk10BohhGFKoYoVt5Ju9jcSrX%2BO9byJ7QVoVR8RD0ucDY%2FdnCDd1EVPaohdu8rC%2Bu8UqxNIocqm8MTtx8XVdF'+
  23. 'c4w2%2F%2FzdMY7qLOn0Eol%2FG%2B95BaIZVEodksr9G%2Ff4Q9t8YnFz4Euh%2F4PFd89fPDWdERacG0NigX%2FiSRcLCFi9SK'+
  24. 'XCHLv4UlVvKL7NQK5IorDGTGeCb1PLuBe6O%2Bb189P%2BM63sWZxVleTA8Q9zeQiChsYSOk4KlYO6lYB63xTgL%2BEC3RNLfX5r'+
  25. 'm2csOyXGImgOd471zJ3p1zau7hiSPHebRt8o9wmL72Oa5ysYXLgWQvw50n%2BTs3x5WlWScs23uWz2ZrhtYagFe%2BfjkqPHFeeH'+
  26. 'L83ZH3TWQKrcMYPoNkvMKnF0%2FT1zrM1aW53Qbd3rtwZmkdwNBaAwAAMHJm6A0p5AdSqn4lVQIAKO%2F47yeFIlBTMrB9VgsAgP'+
  27. '8BON24AjtZfcoAAAAASUVORK5CYII%3D',
  28. check: function(ps){
  29. return ps.type == 'photo';
  30. },
  31. post: function(ps){
  32. // あらかじめ必要.
  33. var host = getPrefValue('extensions.tombloo.ftp.host');
  34. var user = getPrefValue('extensions.tombloo.ftp.user');
  35. var pass = getPrefValue('extensions.tombloo.ftp.pass');
  36. var path = getPrefValue('extensions.tombloo.ftp.path') || '/';
  37. if(host && user && pass){
  38. var uri = createURI(ps.itemUrl);
  39. //log(uri);
  40. var fileName = validateFileName(uri.fileName);
  41. var file = getTempDir(fileName);
  42. clearCollision(file);
  43. return succeed().addCallback(function(){
  44. if(ps.file){
  45. ps.file.copyTo(file.parent, file.leafName);
  46. return file;
  47. } else {
  48. return download(ps.itemUrl, file);
  49. }
  50. }).addCallback(function(file){
  51. return FTPUpload(host, user, pass, path, file);
  52. });
  53. }
  54. }
  55. });
  56. // FTP + Mochikit Deferred
  57. function FTPUpload(host, user, pass, path, file){
  58. var d = new Deferred();
  59. var data = "";
  60. var port = 21;
  61. var socket = SocketService.createTransport(null, 0, host, port, FTPUpload.getProxyInfo());
  62. var ostream = socket.openOutputStream(0, 1024*1024, 1);
  63. var istream = socket.openInputStream(0, 1024*1024, 1);
  64. var bstream = new BinaryInputStream(istream);
  65. var pump = Cc["@mozilla.org/network/input-stream-pump;1"].createInstance(Ci.nsIInputStreamPump);
  66. pump.init(istream, -1, -1, 0, 0, false);
  67. var callback = function(){ setTimeout(function(){d.callback()}, 0) };
  68. var start = false;
  69. var code = 220;
  70. pump.asyncRead({
  71. onStartRequest: function(request, context){ },
  72. onStopRequest: function(request, context, status){
  73. bstream.close();
  74. istream.close();
  75. ostream.close();
  76. pump = null;
  77. },
  78. onDataAvailable: function(request, context, input, offset, count){
  79. data = bstream.readBytes(count);
  80. var l = data.match(/(\d+)/)[1];
  81. //log(data, code, l);
  82. if(code && code == l && callback) callback(data);
  83. }
  84. }, null);
  85.  
  86. function write(command, _os, stat){
  87. var self = this;
  88. var os = (_os)? _os : ostream;
  89. function _write() {
  90. try {
  91. //get count
  92. var count = os.write(command, command.length);
  93. //Async Write
  94. if(count < command.length){
  95. command = command.substr(count);
  96. os.QueryInterface(Ci.nsIAsyncOutputStream);
  97. os.asyncWait(
  98. { onOutputStreamReady: _write }, 0, 0, null);
  99. } else{
  100. //finish
  101. if(stat){
  102. if(typeof stat == 'function'){
  103. setTimeout(stat, 0);
  104. } else {
  105. code = stat;
  106. }
  107. }
  108. os.write("\r\n", 2);
  109. }
  110. }
  111. catch(e) { }
  112. }
  113. _write();
  114. }
  115. // USER + PASS
  116. function login(user, pass){
  117. var _d = new Deferred();
  118. callback = function(){
  119. callback = null;
  120. callback = function(){
  121. callback = null;
  122. setTimeout(function(){_d.callback()}, 0);
  123. }
  124. write('PASS '+pass, null, 230);
  125. }
  126. write('USER '+user, null, 331);
  127. return _d;
  128. }
  129. // CWD
  130. function cd(path){
  131. var _d = new Deferred();
  132. callback = function(){
  133. callback = null;
  134. setTimeout(function(){_d.callback()}, 0);
  135. }
  136. write('CWD '+path, null, 250);
  137. return _d;
  138. }
  139. function type(t){
  140. var _d = new Deferred();
  141. callback = function(){
  142. callback = null;
  143. setTimeout(function(){_d.callback()}, 0);
  144. }
  145. write('TYPE '+t, null, 200);
  146. return _d;
  147. }
  148. function quit(){
  149. var _d = new Deferred();
  150. callback = function(){
  151. callback = null;
  152. setTimeout(function(){_d.callback()}, 0);
  153. }
  154. write('QUIT', null, 221);
  155. return _d;
  156. }
  157. // PASV + LIST
  158. function list(res){
  159. var _d = new Deferred();
  160. callback = function(){
  161. callback = null;
  162. var ary = data.match(/(\d+,\d+,\d+,\d+),(\d+),(\d+)/);
  163. if(!ary) throw "FTP: PASV Error";
  164. var ip = ary[1].replace(/,/g, '.');
  165. var port = (ary[2]*256-0)+(ary[3]-0);
  166. var temp = "";
  167. var data_socket = SocketService.createTransport(null, 0, ip, port, FTPUpload.getProxyInfo());
  168. var data_ostream = data_socket.openOutputStream(0, 1024*1024, 1);
  169. var data_istream = data_socket.openInputStream(0, 1024*1024, 1);
  170. var data_bstream = new BinaryInputStream(data_istream);
  171. var data_pump = Cc["@mozilla.org/network/input-stream-pump;1"].createInstance(Ci.nsIInputStreamPump);
  172. data_pump.init(data_istream, -1, -1, 0, 0, false);
  173. var listener = {
  174. onStartRequest: function(request, context){
  175. },
  176. onStopRequest: function(request, context, status){
  177. try{
  178. data_bstream.close();
  179. data_istream.close();
  180. data_ostream.close();
  181. data_pump = null;
  182. callback = function(){
  183. setTimeout(function(){_d.callback(temp)}, 0);
  184. }
  185. } catch(e) { }
  186. },
  187. onDataAvailable: function(request, context, input, offset, count){
  188. try{
  189. temp += data_bstream.readBytes(count)
  190. } catch(e) { }
  191. }
  192. };
  193. data_pump.asyncRead(listener, null);
  194. //write('LIST');
  195. write('NLST', null, 226);
  196. }
  197. write('PASV', null, 227);
  198. return _d;
  199. }
  200. // PASV + STOR
  201. function put(file){
  202. var _d = new Deferred();
  203. callback = function(){
  204. callback = null;
  205. var ary = data.match(/(\d+,\d+,\d+,\d+),(\d+),(\d+)/);
  206. if(!ary) throw "FTP: PASV Error";
  207. var ip = ary[1].replace(/,/g, '.');
  208. var port = (ary[2]*256-0)+(ary[3]-0);
  209. var flag = false;
  210. var data_socket = SocketService.createTransport(null, 0, ip, port, FTPUpload.getProxyInfo());
  211. var data_ostream = data_socket.openOutputStream(0, 1024*1024, 1);
  212. var fistream = new FileInputStream(file, -1, -1, false);
  213. var fbstream = new BinaryInputStream(fistream);
  214. var read_data = fbstream.readBytes(fbstream.available());
  215. callback = function(){
  216. callback = function(){
  217. callback = null;
  218. setTimeout(function(){ _d.callback() }, 0);
  219. }
  220. data_ostream.QueryInterface(Ci.nsIAsyncOutputStream);
  221. data_ostream.asyncWait({ onOutputStreamReady: function(){
  222. write(read_data, data_ostream, function(){
  223. code = 226;
  224. data_ostream.close();
  225. });
  226. } }, 0, 0, null);
  227. }
  228. write('STOR '+file.leafName, null, 150);
  229. }
  230. write('PASV', null, 227);
  231. return _d;
  232. }
  233.  
  234. return d.addCallback(function(){
  235. return login(user, pass);
  236. }).addCallback(function(){
  237. return cd(path);
  238. }).addCallback(function(){
  239. return type('A').addCallback(function(){
  240. return list();
  241. });
  242. }).addCallback(function(res){
  243. FTPUpload.clearCollisionOnFTP(res, file);
  244. return type('I').addCallback(function(){
  245. return put(file);
  246. });
  247. }).addCallback(function(){
  248. return quit();
  249. });
  250. }
  251.  
  252. FTPUpload.getProxyInfo = function() {
  253. if(getPrefValue("network.proxy.type") == 1){
  254. var proxyHost = getPrefValue("network.proxy.socks");
  255. var proxyPort = getPrefValue("network.proxy.socks_port");
  256. if(proxyHost && proxyPort){
  257. return ProxyService.newProxyInfo("socks", proxyHost, proxyPort, 0, 30, null);
  258. }
  259. }
  260. }
  261.  
  262. FTPUpload.getHostName = function() {
  263. return DNSService.myHostName;
  264. }
  265.  
  266. FTPUpload.getHostIP = function(){
  267. return DNSService.resolve(FTPUpload.getHostName(), 1).getNextAddrAsString();
  268. }
  269. FTPUpload.clearCollisionOnFTP = function(res, file){
  270. var lines = res.split(/\r\n|\r|\n/).map(function(line){
  271. return line.replace(/^\s*/, '').replace(/\s*$/, '');
  272. });
  273. var name = file.leafName;
  274. for(var count = 2; ~lines.indexOf(name); count++)
  275. name = name.replace(/(.*)\./, '$1('+count+').');
  276. file.leafName = name;
  277. }
  278.  
  279. })();
Add Comment
Please, Sign In to add comment