1
0

functions.dispatcher.php 29 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971
  1. <?php
  2. /* $Id: functions.dispatcher.php 3166 2007-07-27 18:08:11Z msn_exploder $ */
  3. /*******************************************************************************
  4. LICENSE
  5. This program is free software; you can redistribute it and/or
  6. modify it under the terms of the GNU General Public License (GPL)
  7. as published by the Free Software Foundation; either version 2
  8. of the License, or (at your option) any later version.
  9. This program is distributed in the hope that it will be useful,
  10. but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. GNU General Public License for more details.
  13. To read the license please visit http://www.gnu.org/copyleft/gpl.html
  14. *******************************************************************************/
  15. /**
  16. * startTransfer
  17. *
  18. * @param $transfer
  19. */
  20. function dispatcher_startTransfer($transfer) {
  21. global $cfg;
  22. // valid
  23. if (tfb_isValidTransfer($transfer) !== true) {
  24. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  25. @error("Invalid Transfer", "", "", array($transfer));
  26. }
  27. // interactive
  28. $interactive = (tfb_getRequestVar('interactive') == 1) ? 1 : 0;
  29. // ch
  30. $ch = ($interactive == 1)
  31. ? ClientHandler::getInstance(tfb_getRequestVar('client'))
  32. : ClientHandler::getInstance(getTransferClient($transfer));
  33. // permission
  34. dispatcher_checkTypePermission($transfer, $ch->type, "start");
  35. // start
  36. if ($interactive == 1)
  37. $ch->start($transfer, true, (tfb_getRequestVar('queue') == '1') ? FluxdQmgr::isRunning() : false);
  38. else
  39. $ch->start($transfer, false, FluxdQmgr::isRunning());
  40. // check
  41. if ($ch->state == CLIENTHANDLER_STATE_ERROR) { // start failed
  42. $msgs = array();
  43. array_push($msgs, "transfer : ".$transfer);
  44. array_push($msgs, "\nmessages :");
  45. $msgs = array_merge($msgs, $ch->messages);
  46. AuditAction($cfg["constants"]["error"], "Start failed: ".$transfer."\n".implode("\n", $ch->messages));
  47. @error("Start failed", "", "", $msgs);
  48. } else {
  49. if (($interactive == 1) && (isset($_REQUEST["close"]))) {
  50. echo '<script language="JavaScript">';
  51. echo ' window.opener.location.reload(true);';
  52. echo ' window.close();';
  53. echo '</script>';
  54. // Prevent dispatcher_exit from running and redirecting client, otherwise script won't be executed.
  55. exit();
  56. }
  57. }
  58. }
  59. /**
  60. * stopTransfer
  61. *
  62. * @param $transfer
  63. */
  64. function dispatcher_stopTransfer($transfer) {
  65. global $cfg;
  66. // valid
  67. if (tfb_isValidTransfer($transfer) !== true) {
  68. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  69. @error("Invalid Transfer", "", "", array($transfer));
  70. }
  71. // ch
  72. $ch = ClientHandler::getInstance(getTransferClient($transfer));
  73. // permission
  74. dispatcher_checkTypePermission($transfer, $ch->type, "stop");
  75. // stop
  76. $ch->stop($transfer);
  77. // check
  78. if (count($ch->messages) > 0)
  79. @error("There were Problems", "", "", $ch->messages);
  80. }
  81. /**
  82. * restartTransfer
  83. *
  84. * @param $transfer
  85. */
  86. function dispatcher_restartTransfer($transfer) {
  87. global $cfg;
  88. // stop if running
  89. $tRunningFlag = isTransferRunning($transfer);
  90. if ($tRunningFlag) {
  91. dispatcher_stopTransfer($transfer);
  92. $tRunningFlag = isTransferRunning($transfer);
  93. }
  94. // start if not running
  95. if (!$tRunningFlag)
  96. dispatcher_startTransfer($transfer);
  97. }
  98. /**
  99. * forceStopTransfer
  100. *
  101. * @param $transfer
  102. */
  103. function dispatcher_forceStopTransfer($transfer, $pid) {
  104. global $cfg;
  105. // valid
  106. if (tfb_isValidTransfer($transfer) !== true) {
  107. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  108. @error("Invalid Transfer", "", "", array($transfer));
  109. }
  110. // ch
  111. $ch = ClientHandler::getInstance(getTransferClient($transfer));
  112. // permission
  113. dispatcher_checkTypePermission($transfer, $ch->type, "forceStop");
  114. // forceStop
  115. $ch->stop($transfer, true, $pid);
  116. // check
  117. if (count($ch->messages) > 0)
  118. @error("There were Problems", "", "", $ch->messages);
  119. }
  120. /**
  121. * deleteTransfer
  122. *
  123. * @param $transfer
  124. */
  125. function dispatcher_deleteTransfer($transfer) {
  126. global $cfg;
  127. // valid
  128. if (tfb_isValidTransfer($transfer) !== true) {
  129. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  130. @error("Invalid Transfer", "", "", array($transfer));
  131. }
  132. // client
  133. $client = getTransferClient($transfer);
  134. // ch
  135. $ch = ClientHandler::getInstance($client);
  136. // permission
  137. dispatcher_checkTypePermission($transfer, $ch->type, "delete");
  138. // is transfer running ?
  139. $tRunningFlag = isTransferRunning($transfer);
  140. if ($tRunningFlag) {
  141. // stop first
  142. $ch->stop($transfer);
  143. if (count($ch->messages) > 0)
  144. @error("There were Problems", "", "", $ch->messages);
  145. // is transfer running ?
  146. $tRunningFlag = isTransferRunning($transfer);
  147. }
  148. // if it was running... hope the thing is down...
  149. // only continue if it is
  150. if ($tRunningFlag) {
  151. @error("Delete failed, Transfer is running and stop failed", "", "", $ch->messages);
  152. } else {
  153. // delete
  154. $ch->delete($transfer);
  155. // check
  156. if (count($ch->messages) > 0)
  157. @error("There were Problems", "", "", $ch->messages);
  158. }
  159. }
  160. /**
  161. * deleteDataTransfer
  162. *
  163. * @param $transfer
  164. */
  165. function dispatcher_deleteDataTransfer($transfer) {
  166. global $cfg;
  167. // valid
  168. if (tfb_isValidTransfer($transfer) !== true) {
  169. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  170. @error("Invalid Transfer", "", "", array($transfer));
  171. }
  172. // client
  173. $client = getTransferClient($transfer);
  174. // ch
  175. $ch = ClientHandler::getInstance($client);
  176. // permission
  177. dispatcher_checkTypePermission($transfer, $ch->type, "deleteWithData");
  178. // is transfer running ?
  179. $tRunningFlag = isTransferRunning($transfer);
  180. if ($tRunningFlag) {
  181. // stop first
  182. $ch->stop($transfer);
  183. if (count($ch->messages) > 0)
  184. @error("There were Problems", "", "", $ch->messages);
  185. // is transfer running ?
  186. $tRunningFlag = isTransferRunning($transfer);
  187. }
  188. // if it was running... hope the thing is down...
  189. // only continue if it is
  190. if ($tRunningFlag) {
  191. @error("Delete with Data failed, Transfer is running and stop failed", "", "", $ch->messages);
  192. } else {
  193. // transferData
  194. $msgsDelete = deleteTransferData($transfer);
  195. if (count($msgsDelete) > 0)
  196. @error("There were Problems deleting Transfer-Data", "", "", $msgsDelete);
  197. // transfer
  198. $ch->delete($transfer);
  199. if (count($ch->messages) > 0)
  200. @error("There were Problems", "", "", $ch->messages);
  201. }
  202. }
  203. /**
  204. * wipeTransfer
  205. *
  206. * @param $transfer
  207. */
  208. function dispatcher_wipeTransfer($transfer) {
  209. global $cfg;
  210. // valid
  211. if (tfb_isValidTransfer($transfer) !== true) {
  212. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  213. @error("Invalid Transfer", "", "", array($transfer));
  214. }
  215. // client
  216. $client = getTransferClient($transfer);
  217. // ch
  218. $ch = ClientHandler::getInstance($client);
  219. // permission
  220. dispatcher_checkTypePermission($transfer, $ch->type, "wipe");
  221. // is transfer running ?
  222. $tRunningFlag = isTransferRunning($transfer);
  223. if ($tRunningFlag) {
  224. // stop first
  225. $ch->stop($transfer);
  226. if (count($ch->messages) > 0)
  227. @error("There were Problems", "", "", $ch->messages);
  228. // is transfer running ?
  229. $tRunningFlag = isTransferRunning($transfer);
  230. }
  231. // if it was running... hope the thing is down...
  232. // only continue if it is
  233. if ($tRunningFlag) {
  234. @error("Wipe failed, Transfer is running and stop failed", "", "", $ch->messages);
  235. } else {
  236. // transferData
  237. $msgsDelete = deleteTransferData($transfer);
  238. if (count($msgsDelete) > 0)
  239. @error("There were Problems deleting Transfer-Data", "", "", $msgsDelete);
  240. // totals + t
  241. $msgsReset = resetTransferTotals($transfer, true);
  242. if (count($msgsReset) > 0)
  243. @error("There were Problems wiping the Transfer", "", "", $msgsReset);
  244. }
  245. }
  246. /**
  247. * deQueueTransfer
  248. *
  249. * @param $transfer
  250. */
  251. function dispatcher_deQueueTransfer($transfer) {
  252. global $cfg;
  253. // valid
  254. if (tfb_isValidTransfer($transfer) !== true) {
  255. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$transfer);
  256. @error("Invalid Transfer", "", "", array($transfer));
  257. }
  258. // ch
  259. $ch = ClientHandler::getInstance(getTransferClient($transfer));
  260. // permission
  261. dispatcher_checkTypePermission($transfer, $ch->type, "dequeue");
  262. // dequeue
  263. FluxdQmgr::dequeueTransfer($transfer, $cfg['user']);
  264. }
  265. /**
  266. * injectWget
  267. *
  268. * @param $url
  269. */
  270. function dispatcher_injectWget($url) {
  271. global $cfg;
  272. // permission
  273. dispatcher_checkTypePermission($url, 'wget', "inject");
  274. // inject
  275. if (!empty($url)) {
  276. $ch = ClientHandler::getInstance('wget');
  277. $ch->inject($url);
  278. // instant action ?
  279. $actionId = tfb_getRequestVar('aid');
  280. if ($actionId > 1) {
  281. switch ($actionId) {
  282. case 3:
  283. $ch->start($ch->transfer, false, true);
  284. break;
  285. case 2:
  286. $ch->start($ch->transfer, false, false);
  287. break;
  288. }
  289. if ($ch->state == CLIENTHANDLER_STATE_ERROR) { // start failed
  290. $msgs = array();
  291. array_push($msgs, "url : ".$url);
  292. array_push($msgs, "\nmessages :");
  293. $msgs = array_merge($msgs, $ch->messages);
  294. AuditAction($cfg["constants"]["error"], "Start failed: ".$url."\n".implode("\n", $ch->messages));
  295. @error("Start failed", "", "", $msgs);
  296. }
  297. }
  298. }
  299. }
  300. /**
  301. * setFilePriority
  302. *
  303. * @param $transfer
  304. */
  305. function dispatcher_setFilePriority($transfer) {
  306. global $cfg;
  307. if ($cfg["enable_file_priority"])
  308. setFilePriority($transfer);
  309. }
  310. /**
  311. * set
  312. *
  313. * @param $key
  314. * @param $val
  315. */
  316. function dispatcher_set($key, $val) {
  317. if (!empty($key)) {
  318. if ($key == "_all_") {
  319. $keys = array_keys($_SESSION['settings']);
  320. foreach ($keys as $settingKey)
  321. $_SESSION['settings'][$settingKey] = $val;
  322. } elseif ($key == "_refresh_") {
  323. $_SESSION['settings']['index_ajax_update'] = $val;
  324. $_SESSION['settings']['index_meta_refresh'] = $val;
  325. } else {
  326. $_SESSION['settings'][$key] = $val;
  327. }
  328. }
  329. }
  330. /**
  331. * bulk
  332. *
  333. * @param $op
  334. */
  335. function dispatcher_bulk($op) {
  336. global $cfg;
  337. // is enabled ?
  338. if ($cfg["enable_bulkops"] != 1) {
  339. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use ".$op);
  340. @error("bulkops are disabled", "", "");
  341. }
  342. // messages
  343. $dispatcherMessages = array();
  344. // op-switch
  345. switch ($op) {
  346. case "stop":
  347. $transferList = getTransferArray();
  348. foreach ($transferList as $transfer) {
  349. if (isTransferRunning($transfer)) {
  350. if (($cfg['isAdmin']) || (IsOwner($cfg["user"], getOwner($transfer)))) {
  351. $ch = ClientHandler::getInstance(getTransferClient($transfer));
  352. $ch->stop($transfer);
  353. if (count($ch->messages) > 0)
  354. $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
  355. }
  356. }
  357. }
  358. break;
  359. case "resume":
  360. $transferList = getTransferArray();
  361. $sf = new StatFile("");
  362. foreach ($transferList as $transfer) {
  363. $sf->init($transfer);
  364. if (((trim($sf->running)) == 0) && (!isTransferRunning($transfer))) {
  365. if (($cfg['isAdmin']) || (IsOwner($cfg["user"], getOwner($transfer)))) {
  366. $ch = ClientHandler::getInstance(getTransferClient($transfer));
  367. $ch->start($transfer, false, false);
  368. if (count($ch->messages) > 0)
  369. $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
  370. }
  371. }
  372. }
  373. break;
  374. case "start":
  375. $transferList = getTransferArray();
  376. foreach ($transferList as $transfer) {
  377. if (!isTransferRunning($transfer)) {
  378. if (($cfg['isAdmin']) || (IsOwner($cfg["user"], getOwner($transfer)))) {
  379. $ch = ClientHandler::getInstance(getTransferClient($transfer));
  380. $ch->start($transfer, false, false);
  381. if (count($ch->messages) > 0)
  382. $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
  383. }
  384. }
  385. }
  386. break;
  387. }
  388. // error if messages
  389. if (count($dispatcherMessages) > 0)
  390. @error("There were Problems", "", "", $dispatcherMessages);
  391. }
  392. /**
  393. * multi
  394. *
  395. * @param $action
  396. */
  397. function dispatcher_multi($action) {
  398. global $cfg;
  399. // is enabled ?
  400. if ($cfg["enable_multiops"] != 1) {
  401. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use multi-op ".$action);
  402. @error("multiops are disabled", "", "");
  403. }
  404. // messages-ary
  405. $dispatcherMessages = array();
  406. // loop
  407. if (empty($_POST['transfer'])) return;
  408. foreach ($_POST['transfer'] as $key => $element) {
  409. // url-decode
  410. $transfer = urldecode($element);
  411. // is valid transfer ? + check permissions
  412. $invalid = true;
  413. if (tfb_isValidTransfer($transfer) === true) {
  414. if (substr($transfer, -8) == ".torrent") {
  415. // this is a torrent-client
  416. $invalid = false;
  417. } else if (substr($transfer, -5) == ".wget") {
  418. // this is wget.
  419. $invalid = false;
  420. // is enabled ?
  421. if ($cfg["enable_wget"] == 0) {
  422. $invalid = true;
  423. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use wget");
  424. array_push($dispatcherMessages, "wget is disabled : ".$transfer);
  425. } else if ($cfg["enable_wget"] == 1) {
  426. if (!$cfg['isAdmin']) {
  427. $invalid = true;
  428. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use wget");
  429. array_push($dispatcherMessages, "wget is disabled for users : ".$transfer);
  430. }
  431. }
  432. } else if (substr($transfer, -4) == ".nzb") {
  433. // This is nzbperl.
  434. $invalid = false;
  435. if ($cfg["enable_nzbperl"] == 0) {
  436. $invalid = true;
  437. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use nzbperl");
  438. array_push($dispatcherMessages, "nzbperl is disabled : ".$transfer);
  439. } else if ($cfg["enable_nzbperl"] == 1) {
  440. if (!$cfg['isAdmin']) {
  441. $invalid = true;
  442. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use nzbperl");
  443. array_push($dispatcherMessages, "nzbperl is disabled for users : ".$transfer);
  444. }
  445. }
  446. }
  447. }
  448. if ($invalid) {
  449. AuditAction($cfg["constants"]["error"], "INVALID TRANSFER: ".$cfg["user"]." tried to ".$action." ".$transfer);
  450. array_push($dispatcherMessages, "Invalid Transfer : ".$transfer);
  451. continue;
  452. }
  453. // client
  454. $client = getTransferClient($transfer);
  455. // is transfer running ?
  456. $tRunningFlag = isTransferRunning($transfer);
  457. // action switch
  458. switch ($action) {
  459. case "transferStart": /* transferStart */
  460. if (!$tRunningFlag) {
  461. $ch = ClientHandler::getInstance($client);
  462. $ch->start($transfer, false, FluxdQmgr::isRunning());
  463. if (count($ch->messages) > 0)
  464. $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
  465. }
  466. break;
  467. case "transferStop": /* transferStop */
  468. if ($tRunningFlag) {
  469. $ch = ClientHandler::getInstance($client);
  470. $ch->stop($transfer);
  471. if (count($ch->messages) > 0)
  472. $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
  473. }
  474. break;
  475. case "transferEnQueue": /* transferEnQueue */
  476. if (!$tRunningFlag) {
  477. // enqueue it
  478. $ch = ClientHandler::getInstance($client);
  479. $ch->start($transfer, false, true);
  480. if (count($ch->messages) > 0)
  481. $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
  482. }
  483. break;
  484. case "transferDeQueue": /* transferDeQueue */
  485. if (!$tRunningFlag) {
  486. // dequeue it
  487. FluxdQmgr::dequeueTransfer($transfer, $cfg['user']);
  488. }
  489. break;
  490. case "transferResetTotals": /* transferResetTotals */
  491. $msgs = resetTransferTotals($transfer, false);
  492. if (count($msgs) > 0)
  493. $dispatcherMessages = array_merge($dispatcherMessages, $msgs);
  494. break;
  495. default:
  496. if ($tRunningFlag) {
  497. // stop first
  498. $ch = ClientHandler::getInstance($client);
  499. $ch->stop($transfer);
  500. if (count($ch->messages) > 0)
  501. $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
  502. // is transfer running ?
  503. $tRunningFlag = isTransferRunning($transfer);
  504. }
  505. // if it was running... hope the thing is down...
  506. // only continue if it is
  507. if (!$tRunningFlag) {
  508. switch ($action) {
  509. case "transferWipe": /* transferWipe */
  510. $msgsDelete = deleteTransferData($transfer);
  511. if (count($msgsDelete) > 0)
  512. $dispatcherMessages = array_merge($dispatcherMessages, $msgsDelete);
  513. $msgsReset = resetTransferTotals($transfer, true);
  514. if (count($msgsReset) > 0)
  515. $dispatcherMessages = array_merge($dispatcherMessages, $msgsReset);
  516. break;
  517. case "transferData": /* transferData */
  518. $msgsDelete = deleteTransferData($transfer);
  519. if (count($msgsDelete) > 0)
  520. $dispatcherMessages = array_merge($dispatcherMessages, $msgsDelete);
  521. case "transfer": /* transfer */
  522. $ch = ClientHandler::getInstance($client);
  523. $ch->delete($transfer);
  524. if (count($ch->messages) > 0)
  525. $dispatcherMessages = array_merge($dispatcherMessages, $ch->messages);
  526. }
  527. }
  528. } // end switch
  529. } // end loop
  530. // error if messages
  531. if (count($dispatcherMessages) > 0)
  532. @error("There were Problems", "", "", $dispatcherMessages);
  533. }
  534. /**
  535. * processDownload
  536. *
  537. * @param $url url of metafile to download
  538. */
  539. function dispatcher_processDownload($url, $type = 'torrent') {
  540. global $cfg;
  541. switch ($type) {
  542. default:
  543. case 'torrent':
  544. // process download
  545. _dispatcher_processDownload($url, 'torrent', '.torrent');
  546. break;
  547. case 'nzb':
  548. // is enabled ?
  549. if ($cfg["enable_nzbperl"] == 0) {
  550. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use nzb-download");
  551. @error("nzbperl is disabled", "", "");
  552. } else if ($cfg["enable_nzbperl"] == 1) {
  553. if (!$cfg['isAdmin']) {
  554. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use nzb-download");
  555. @error("nzbperl is disabled for users", "", "");
  556. }
  557. }
  558. // process download
  559. _dispatcher_processDownload($url, 'nzb', '.nzb');
  560. break;
  561. }
  562. }
  563. /**
  564. * (internal) Function with which metafiles are downloaded and injected
  565. *
  566. * @param $url url to download
  567. * @param $type
  568. */
  569. function _dispatcher_processDownload($url, $type = 'torrent', $ext = '.torrent') {
  570. global $cfg;
  571. $filename = "";
  572. $downloadMessages = array();
  573. if (!empty($url)) {
  574. $arURL = explode("/", $url);
  575. $filename = urldecode($arURL[count($arURL)-1]); // get the file name
  576. $filename = str_replace(array("'",","), "", $filename);
  577. $filename = stripslashes($filename);
  578. // Check to see if url has something like ?passkey=12345
  579. // If so remove it.
  580. if (($point = strrpos($filename, "?")) !== false )
  581. $filename = substr($filename, 0, $point);
  582. $ret = strrpos($filename, ".");
  583. if ($ret === false) {
  584. $filename .= $ext;
  585. } else {
  586. if (!strcmp(strtolower(substr($filename, -(strlen($ext)))), $ext) == 0)
  587. $filename .= $ext;
  588. }
  589. $url = str_replace(" ", "%20", $url);
  590. // This is to support Sites that pass an id along with the url for downloads.
  591. $tmpId = tfb_getRequestVar("id");
  592. if(!empty($tmpId))
  593. $url .= "&id=".$tmpId;
  594. // retrieve the file
  595. require_once("inc/classes/SimpleHTTP.php");
  596. $content = "";
  597. switch ($type) {
  598. default:
  599. case 'torrent':
  600. $content = SimpleHTTP::getTorrent($url);
  601. break;
  602. case 'nzb':
  603. $content = SimpleHTTP::getNzb($url);
  604. break;
  605. }
  606. if ((SimpleHTTP::getState() == SIMPLEHTTP_STATE_OK) && (strlen($content) > 0)) {
  607. $fileNameBackup = $filename;
  608. $filename = SimpleHTTP::getFilename();
  609. if ($filename != "") {
  610. $filename = ((strpos($filename, $ext) !== false))
  611. ? tfb_cleanFileName($filename)
  612. : tfb_cleanFileName($filename.$ext);
  613. }
  614. if (($filename == "") || ($filename === false) || (transferExists($filename))) {
  615. $filename = tfb_cleanFileName($fileNameBackup);
  616. if (($filename === false) || (transferExists($filename))) {
  617. $filename = tfb_cleanFileName($url.$ext);
  618. if (($filename === false) || (transferExists($filename))) {
  619. $filename = tfb_cleanFileName(md5($url.strval(@microtime())).$ext);
  620. if (($filename === false) || (transferExists($filename))) {
  621. // Error
  622. array_push($downloadMessages , "failed to get a valid transfer-filename for ".$url);
  623. }
  624. }
  625. }
  626. }
  627. if (empty($downloadMessages)) { // no messages
  628. // check if content contains html
  629. if ($cfg['debuglevel'] > 0) {
  630. if (strpos($content, "<br />") !== false)
  631. AuditAction($cfg["constants"]["debug"], "download-content contained html : ".htmlentities(addslashes($url), ENT_QUOTES));
  632. }
  633. if (is_file($cfg["transfer_file_path"].$filename)) {
  634. // Error
  635. array_push($downloadMessages, "the file ".$filename." already exists on the server.");
  636. } else {
  637. // write to file
  638. $handle = false;
  639. $handle = @fopen($cfg["transfer_file_path"].$filename, "w");
  640. if (!$handle) {
  641. array_push($downloadMessages, "cannot open ".$filename." for writing.");
  642. } else {
  643. $result = @fwrite($handle, $content);
  644. @fclose($handle);
  645. if ($result === false)
  646. array_push($downloadMessages, "cannot write content to ".$filename.".");
  647. }
  648. }
  649. }
  650. } else {
  651. $msgs = SimpleHTTP::getMessages();
  652. if (count($msgs) > 0)
  653. $downloadMessages = array_merge($downloadMessages, $msgs);
  654. }
  655. if (empty($downloadMessages)) { // no messages
  656. AuditAction($cfg["constants"]["url_upload"], $filename);
  657. // inject
  658. injectTransfer($filename);
  659. // instant action ?
  660. $actionId = tfb_getRequestVar('aid');
  661. if ($actionId > 1) {
  662. $ch = ClientHandler::getInstance(getTransferClient($filename));
  663. switch ($actionId) {
  664. case 3:
  665. $ch->start($filename, false, true);
  666. break;
  667. case 2:
  668. $ch->start($filename, false, false);
  669. break;
  670. }
  671. if (count($ch->messages) > 0)
  672. $downloadMessages = array_merge($downloadMessages, $ch->messages);
  673. }
  674. }
  675. } else {
  676. array_push($downloadMessages, "Invalid Url : ".$url);
  677. }
  678. if (count($downloadMessages) > 0) {
  679. AuditAction($cfg["constants"]["error"], $cfg["constants"]["url_upload"]." :: ".$filename);
  680. @error("There were Problems", "", "", $downloadMessages);
  681. }
  682. }
  683. /**
  684. * processUpload
  685. */
  686. function dispatcher_processUpload() {
  687. global $cfg;
  688. // check if files exist
  689. if (empty($_FILES)) {
  690. // log
  691. AuditAction($cfg["constants"]["error"], "no file in file-upload");
  692. // return
  693. return;
  694. }
  695. // action-id
  696. $actionId = tfb_getRequestVar('aid');
  697. // file upload
  698. $uploadMessages = array();
  699. // stack
  700. $tStack = array();
  701. // process upload
  702. while (count($_FILES) > 0) {
  703. $upload = array_shift($_FILES);
  704. if (is_array($upload['size'])) {
  705. foreach ($upload['size'] as $id => $size) {
  706. if ($size > 0) {
  707. _dispatcher_processUpload(
  708. $upload['name'][$id], $upload['tmp_name'][$id], $size,
  709. $actionId, $uploadMessages, $tStack);
  710. }
  711. }
  712. } else {
  713. if ($upload['size'] > 0) {
  714. _dispatcher_processUpload(
  715. $upload['name'], $upload['tmp_name'], $upload['size'],
  716. $actionId, $uploadMessages, $tStack);
  717. }
  718. }
  719. }
  720. // instant action ?
  721. if (($actionId > 1) && (!empty($tStack))) {
  722. foreach ($tStack as $transfer) {
  723. $ch = ClientHandler::getInstance(getTransferClient($transfer));
  724. switch ($actionId) {
  725. case 3:
  726. $ch->start($transfer, false, true);
  727. break;
  728. case 2:
  729. $ch->start($transfer, false, false);
  730. break;
  731. }
  732. if (count($ch->messages) > 0)
  733. $uploadMessages = array_merge($uploadMessages, $ch->messages);
  734. }
  735. }
  736. // messages
  737. if (count($uploadMessages) > 0) {
  738. @error("There were Problems", "", "", $uploadMessages);
  739. }
  740. }
  741. /**
  742. * _dispatcher_processUpload
  743. *
  744. * @param $name
  745. * @param $tmp_name
  746. * @param $size
  747. * @param $actionId
  748. * @param &$uploadMessages
  749. * @param &$tStack
  750. * @return bool
  751. */
  752. function _dispatcher_processUpload($name, $tmp_name, $size, $actionId, &$uploadMessages, &$tStack) {
  753. global $cfg;
  754. $filename = tfb_cleanFileName(stripslashes($name));
  755. if ($filename === false) {
  756. // invalid file
  757. array_push($uploadMessages, "The type of file ".stripslashes($name)." is not allowed.");
  758. array_push($uploadMessages, "\nvalid file-extensions: ");
  759. array_push($uploadMessages, $cfg["file_types_label"]);
  760. return false;
  761. } else {
  762. // file is valid
  763. if (substr($filename, -5) == ".wget") {
  764. // is enabled ?
  765. if ($cfg["enable_wget"] == 0) {
  766. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to upload wget-file ".$filename);
  767. array_push($uploadMessages, "wget is disabled : ".$filename);
  768. return false;
  769. } else if ($cfg["enable_wget"] == 1) {
  770. if (!$cfg['isAdmin']) {
  771. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to upload wget-file ".$filename);
  772. array_push($uploadMessages, "wget is disabled for users : ".$filename);
  773. return false;
  774. }
  775. }
  776. } else if (substr($filename, -4) == ".nzb") {
  777. // is enabled ?
  778. if ($cfg["enable_nzbperl"] == 0) {
  779. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to upload nzb-file ".$filename);
  780. array_push($uploadMessages, "nzbperl is disabled : ".$filename);
  781. return false;
  782. } else if ($cfg["enable_nzbperl"] == 1) {
  783. if (!$cfg['isAdmin']) {
  784. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to upload nzb-file ".$filename);
  785. array_push($uploadMessages, "nzbperl is disabled for users : ".$filename);
  786. return false;
  787. }
  788. }
  789. }
  790. if ($size <= $cfg["upload_limit"] && $size > 0) {
  791. //FILE IS BEING UPLOADED
  792. if (@is_file($cfg["transfer_file_path"].$filename)) {
  793. // Error
  794. array_push($uploadMessages, "the file ".$filename." already exists on the server.");
  795. return false;
  796. } else {
  797. if (@move_uploaded_file($tmp_name, $cfg["transfer_file_path"].$filename)) {
  798. @chmod($cfg["transfer_file_path"].$filename, 0644);
  799. AuditAction($cfg["constants"]["file_upload"], $filename);
  800. // inject
  801. injectTransfer($filename);
  802. // instant action ?
  803. if ($actionId > 1)
  804. array_push($tStack,$filename);
  805. // return
  806. return true;
  807. } else {
  808. array_push($uploadMessages, "File not uploaded, file could not be found or could not be moved: ".$cfg["transfer_file_path"].$filename);
  809. return false;
  810. }
  811. }
  812. } else {
  813. array_push($uploadMessages, "File not uploaded, file size limit is ".$cfg["upload_limit"].". file has ".$size);
  814. return false;
  815. }
  816. }
  817. }
  818. /**
  819. * sendMetafile
  820. *
  821. * @param $mfile
  822. */
  823. function dispatcher_sendMetafile($mfile) {
  824. global $cfg;
  825. // is enabled ?
  826. if ($cfg["enable_metafile_download"] != 1) {
  827. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to download a metafile");
  828. @error("metafile download is disabled", "", "");
  829. }
  830. if (tfb_isValidTransfer($mfile) === true) {
  831. // Does the file exist?
  832. if (@file_exists($cfg["transfer_file_path"].$mfile)) {
  833. // filenames in IE containing dots will screw up the filename
  834. $headerName = (strstr($_SERVER['HTTP_USER_AGENT'], "MSIE"))
  835. ? preg_replace('/\./', '%2e', $mfile, substr_count($mfile, '.') - 1)
  836. : $mfile;
  837. // Prompt the user to download file.
  838. if (substr($mfile, -8) == ".torrent")
  839. @header("Content-type: application/x-bittorrent\n");
  840. else
  841. @header( "Content-type: application/octet-stream\n" );
  842. @header("Content-disposition: attachment; filename=\"".$headerName."\"\n");
  843. @header("Content-transfer-encoding: binary\n");
  844. @header("Content-length: ".@filesize($cfg["transfer_file_path"].$mfile)."\n");
  845. // write the session to close so you can continue to browse on the site.
  846. @session_write_close();
  847. // Send the file
  848. $fp = @fopen($cfg["transfer_file_path"].$mfile, "r");
  849. @fpassthru($fp);
  850. @fclose($fp);
  851. AuditAction($cfg["constants"]["fm_download"], $mfile);
  852. exit();
  853. } else {
  854. AuditAction($cfg["constants"]["error"], "File Not found for download: ".$mfile);
  855. @error("File Not found for download", "", "", array($mfile));
  856. }
  857. } else {
  858. AuditAction($cfg["constants"]["error"], "ILLEGAL DOWNLOAD: ".$mfile);
  859. @error("Invalid File", "", "", array($mfile));
  860. }
  861. }
  862. /**
  863. * checkTypePermission
  864. *
  865. * @param $transfer
  866. * @param $type
  867. * @param $action
  868. */
  869. function dispatcher_checkTypePermission($transfer, $type, $action) {
  870. global $cfg;
  871. switch ($type) {
  872. case "wget":
  873. // is enabled ?
  874. if ($cfg["enable_wget"] == 0) {
  875. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use ".$action.". wget-transfer: ".$transfer);
  876. @error("wget is disabled", "", "");
  877. } else if ($cfg["enable_wget"] == 1) {
  878. if (!$cfg['isAdmin']) {
  879. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use ".$action.". wget-transfer: ".$transfer);
  880. @error("wget is disabled for users", "", "");
  881. }
  882. }
  883. break;
  884. case "nzb":
  885. // is enabled ?
  886. if ($cfg["enable_nzbperl"] == 0) {
  887. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use ".$action.". nzb-transfer: ".$transfer);
  888. @error("nzbperl is disabled", "", "");
  889. } else if ($cfg["enable_nzbperl"] == 1) {
  890. if (!$cfg['isAdmin']) {
  891. AuditAction($cfg["constants"]["error"], "ILLEGAL ACCESS: ".$cfg["user"]." tried to use ".$action.". nzb-transfer: ".$transfer);
  892. @error("nzbperl is disabled for users", "", "");
  893. }
  894. }
  895. break;
  896. }
  897. }
  898. /**
  899. * exit
  900. */
  901. function dispatcher_exit() {
  902. global $cfg;
  903. $redir = (isset($_REQUEST['riid']))
  904. ? tfb_getRequestVar('riid')
  905. : "index";
  906. switch ($redir) {
  907. case "_exit_":
  908. exit("1");
  909. case "_none_":
  910. break;
  911. case "_referer_":
  912. if (isset($_SERVER["HTTP_REFERER"]))
  913. @header("location: ".$_SERVER["HTTP_REFERER"]);
  914. break;
  915. default:
  916. if (preg_match('/^[a-zA-Z]+$/D', $redir)) {
  917. @header("location: index.php?iid=".$redir);
  918. } else {
  919. AuditAction($cfg["constants"]["error"], "INVALID PAGE (riid): ".$redir);
  920. @error("Invalid Page", "", "", array($redir));
  921. }
  922. }
  923. // exit
  924. exit();
  925. }
  926. ?>