PageRenderTime 44ms CodeModel.GetById 15ms RepoModel.GetById 1ms app.codeStats 0ms

/include/recode_torrent.php

https://gitlab.com/protoneutron/xbtbb3cker
PHP | 309 lines | 260 code | 36 blank | 13 comment | 85 complexity | 5d07f4a2db0528339369a4e3671b7c79 MD5 | raw file
  1. <?php
  2. /**
  3. *
  4. * @package xbtBB3cker
  5. * @copyright (c) 2015 PPK
  6. * @license http://opensource.org/licenses/gpl-2.0.php GNU General Public License v2
  7. *
  8. */
  9. if (!defined('IN_PHPBB'))
  10. {
  11. exit;
  12. }
  13. function recode_torrent_data($physical_filename, $attach_id, $forum_id, $topic_id, $post_id, $torrent_status, $addit_rtracks=array(), $user_id=0)
  14. {
  15. global $config, $phpbb_root_path, $user, $db, $phpEx, $request;
  16. @set_time_limit(0);
  17. $tmpname = $phpbb_root_path.$config['upload_path'].'/'.$physical_filename;
  18. $dt=time();
  19. if(!file_exists($tmpname))
  20. {
  21. return sprintf($user->lang['TORRENT_UPLOAD_ERRORS'], 1);
  22. }
  23. if(!$tmpsize=@filesize($tmpname))
  24. {
  25. return sprintf($user->lang['TORRENT_UPLOAD_ERRORS'], 2);
  26. }
  27. $dict=bdecode_f($tmpname, $tmpsize);
  28. if(isset($dict['info']['files']) && is_array($dict['info']['files']) && count($dict['info']['files']) > 1)
  29. {
  30. $filelist=$dict['info']['files'];
  31. }
  32. else
  33. {
  34. if(isset($dict['info']['length']))
  35. {
  36. $filelist[0]['length']=$dict['info']['length'];
  37. $filelist[0]['path'][0]=$dict['info']['name'];
  38. }
  39. else
  40. {
  41. $filelist=isset($dict['info']['files']) ? $dict['info']['files'] : '';
  42. }
  43. }
  44. $config['ppkbb_xclisten_port'] ? '' : $config['ppkbb_xclisten_port']=2710;
  45. $tracker_url=generate_board_url($config['ppkbb_phpannounce_enabled'] && $config['ppkbb_phpannounce_url'] ? false : true);
  46. if(!$config['ppkbb_announce_url'])
  47. {
  48. $config['ppkbb_announce_url']=$tracker_url.($config['ppkbb_phpannounce_enabled'] && $config['ppkbb_phpannounce_url'] ? '' : ':'.$config['ppkbb_xclisten_port']);
  49. }
  50. else
  51. {
  52. $config['ppkbb_announce_url']=($config['ppkbb_phpannounce_enabled'] && $config['ppkbb_phpannounce_url'] ? $tracker_url : $config['ppkbb_announce_url'].':'.$config['ppkbb_xclisten_port']);
  53. }
  54. $rem_announces=$rem_rtracks_array=$forb_rtracks=array();
  55. if(!$config['ppkbb_tfile_annreplace'][0] || $request->variable('annwarn', 0))
  56. {
  57. // unset($dict['announce-list']);
  58. }
  59. else
  60. {
  61. $sql='SELECT rs.id, rs.rtracker_url rtrack_url, rt.rtracker_forb rtrack_forb, rt.forb_type FROM '.TRACKER_RTRACK_TABLE." rt, ".TRACKER_RTRACKERS_TABLE." rs WHERE rt.rtracker_id=rs.id AND rt.rtracker_enabled='1' AND rt.user_torrent_zone='0' AND rt.rtracker_remote!='0' AND rt.rtracker_type='s'";
  62. $result=$db->sql_query($sql);
  63. while($row=$db->sql_fetchrow($result))
  64. {
  65. if(!$row['rtrack_forb'])
  66. {
  67. $rem_rtracks_array[]=$row['rtrack_url'];
  68. }
  69. else if(in_array($row['rtrack_forb'], array(1, 3)))
  70. {
  71. $forb_rtracks[]=$row;
  72. }
  73. }
  74. $db->sql_freeresult($result);
  75. $addit_rtracks ? $forb_rtracks=array_merge($forb_rtracks, $addit_rtracks) : '';
  76. $rem_ann_count=0;
  77. if($config['ppkbb_tfile_annreplace'][0] && isset($dict['announce']) && preg_match('#^(https?|udp):\/\/(\w+|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})#', $dict['announce']) && !in_array($dict['announce'], $rem_rtracks_array) && !in_array($dict['announce'], $rem_announces) && !stristr($dict['announce'], $config['ppkbb_announce_url']) && strlen($dict['announce']) < 256)
  78. {
  79. $rtrack_forb=0;
  80. if(count($forb_rtracks))
  81. {
  82. foreach($forb_rtracks as $f)
  83. {
  84. if($f['forb_type']=='s' && strstr($dict['announce'], $f['rtrack_url']))
  85. {
  86. $rtrack_forb=1;
  87. }
  88. else if($f['forb_type']=='i' && stristr($dict['announce'], $f['rtrack_url']))
  89. {
  90. $rtrack_forb=1;
  91. }
  92. else if($f['forb_type']=='r' && preg_match("{$f['rtrack_url']}", $dict['announce']))
  93. {
  94. $rtrack_forb=1;
  95. }
  96. }
  97. }
  98. if(!$rtrack_forb)
  99. {
  100. $rem_announces[]=$dict['announce'];
  101. $rem_ann_count+=1;
  102. }
  103. }
  104. if($config['ppkbb_tfile_annreplace'][0] && isset($dict['announce-list']) && is_array($dict['announce-list']) && count($dict['announce-list']))
  105. {
  106. foreach($dict['announce-list'] as $v)
  107. {
  108. foreach($v as $v2)
  109. {
  110. if($config['ppkbb_tfile_annreplace'][1] && $rem_ann_count > $config['ppkbb_tfile_annreplace'][1])
  111. {
  112. break;
  113. }
  114. $rtrack_forb=0;
  115. if(count($forb_rtracks))
  116. {
  117. foreach($forb_rtracks as $f)
  118. {
  119. if($f['forb_type']=='s' && strstr($v2, $f['rtrack_url']))
  120. {
  121. $rtrack_forb=1;
  122. }
  123. else if($f['forb_type']=='i' && stristr($v2, $f['rtrack_url']))
  124. {
  125. $rtrack_forb=1;
  126. }
  127. else if($f['forb_type']=='r' && preg_match("{$f['rtrack_url']}", $v2))
  128. {
  129. $rtrack_forb=1;
  130. }
  131. }
  132. }
  133. if(!$rtrack_forb && preg_match('#^(https?|udp):\/\/(\w+|\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})#', $v2) && !in_array($v2, $rem_rtracks_array) && !in_array($v2, $rem_announces) && !stristr($v2, $config['ppkbb_announce_url']) && strlen($v2) < 256)
  134. {
  135. $rem_announces[]=$v2;
  136. $rem_ann_count+=1;
  137. }
  138. }
  139. }
  140. }
  141. // unset($dict['announce-list']);
  142. }
  143. // $dict['announce']=$config['ppkbb_announce_url'].'/announce';
  144. unset($dict['azureus_properties']);
  145. unset($dict['nodes']);
  146. $private=isset($dict['info']['private']) && $dict['info']['private'] ? 1 : 0;
  147. $dict['publisher']=$dict['publisher.utf-8']=$config['server_name'];
  148. //if(!$config['ppkbb_rtrack_enable'][0])
  149. //{
  150. if(($config['ppkbb_tprivate_flag']==1 && $private!=1) || ($config['ppkbb_tprivate_flag']==2 && $private==1))
  151. {
  152. unset($dict['info']['crc32']);
  153. unset($dict['info']['ed2k']);
  154. unset($dict['info']['md5sum']);
  155. unset($dict['info']['sha1']);
  156. unset($dict['info']['tiger']);
  157. }
  158. if($config['ppkbb_tprivate_flag']==1)
  159. {
  160. $dict['info']['private']=1;
  161. $private=1;
  162. }
  163. else if($config['ppkbb_tprivate_flag']==2)
  164. {
  165. isset($dict['info']['private']) ? $dict['info']['private']=0 : '';
  166. $private=0;
  167. }
  168. //}
  169. $enc_f=bencode($dict);
  170. $infohash=pack('H*', sha1(bencode($dict['info'])));
  171. $type_conv='';
  172. if(function_exists('iconv'))
  173. {
  174. $type_conv='iconv';
  175. }
  176. else if(function_exists('mb_convert_encoding'))
  177. {
  178. $type_conv='mb';
  179. }
  180. $tsize=0;
  181. foreach($filelist as $i => $v)
  182. {
  183. $v['length']=@number_format($v['length']+0, 0, '', '');
  184. $tsize+=$v['length'];
  185. if($config['ppkbb_addit_options'][2])
  186. {
  187. $path=implode('/', (isset($v['path.utf-8']) ? $v['path.utf-8'] : (isset($v['path']) ? $v['path'] : '')));
  188. if($type_conv && isset($dict['encoding']) && $dict['encoding']!='UTF-8')
  189. {
  190. $path=torrent_enconvert($path, $dict['encoding'], 'UTF-8', $type_conv);
  191. }
  192. $db->sql_query("INSERT INTO ".TRACKER_FILES_TABLE." (torrent, filename, size) VALUES ('{$attach_id}', '". $db->sql_escape(utf8_normalize_nfc($path)) ."', '{$v['length']}')");
  193. }
  194. }
  195. $bin_salt='';
  196. if($torrent_status > 0)
  197. {
  198. if(!$config['ppkbb_tstatus_salt'])
  199. {
  200. $config['ppkbb_tstatus_salt']=substr(sha1(strtolower(gen_rand_string(8))), 0, 8);
  201. $config->set('ppkbb_tstatus_salt', $config['ppkbb_tstatus_salt'], true);
  202. }
  203. $bin_salt=pack('H*', $config['ppkbb_tstatus_salt']);
  204. }
  205. $user_id ? '' : $user_id=$user->data['user_id'];
  206. $result=$db->sql_query("INSERT IGNORE INTO ".XBT_FILES." (fid, info_hash, numfiles, size, ctime, mtime, private, post_msg_id, topic_id, poster_id, forum_id) VALUES ('{$attach_id}', '". $db->sql_escape($infohash.$bin_salt) ."', '".count($filelist)."', '{$tsize}', '{$dt}', '{$dt}', '{$private}', {$post_id}, '{$topic_id}', '{$user_id}', '{$forum_id}')");
  207. if(!$db->sql_affectedrows($result))
  208. {
  209. return sprintf($user->lang['TORRENT_UPLOAD_ERRORS'], 7);
  210. }
  211. $fp=@fopen($tmpname, "w");
  212. if($fp)
  213. {
  214. fwrite($fp, $enc_f, strlen($enc_f));
  215. fclose($fp);
  216. }
  217. else
  218. {
  219. return sprintf($user->lang['TORRENT_UPLOAD_ERRORS'], 6);
  220. }
  221. $filesize=@filesize($tmpname);
  222. $db->sql_query("UPDATE " . ATTACHMENTS_TABLE . " SET filesize='{$filesize}' WHERE attach_id='{$attach_id}'");
  223. if($config['ppkbb_tfile_annreplace'][0])
  224. {
  225. if(count($rem_announces))
  226. {
  227. $exists_tracker=array();
  228. $sql="SELECT id, rtracker_md5 FROM ".TRACKER_RTRACKERS_TABLE." WHERE ".$db->sql_in_set('rtracker_md5', array_map('md5', $rem_announces));
  229. $result=$db->sql_query($sql);
  230. while($row=$db->sql_fetchrow($result))
  231. {
  232. $exists_tracker[$row['rtracker_md5']]=$row['id'];
  233. }
  234. $db->sql_freeresult($result);
  235. foreach($rem_announces as $v)
  236. {
  237. $rtracker_md5=md5($v);
  238. if(!isset($exists_tracker[$rtracker_md5]))
  239. {
  240. $sql="INSERT INTO ".TRACKER_RTRACKERS_TABLE."(rtracker_url, rtracker_md5) VALUES('".$db->sql_escape(utf8_normalize_nfc($v))."', '{$rtracker_md5}')";
  241. $result=$db->sql_query($sql);
  242. $rtracker_id=$db->sql_nextid();
  243. }
  244. else
  245. {
  246. $rtracker_id=$exists_tracker[$rtracker_md5];
  247. }
  248. $db->sql_query("INSERT INTO ".TRACKER_RTRACK_TABLE."(rtracker_remote, user_torrent_zone, rtracker_id) VALUES('".($config['ppkbb_tfile_annreplace'][0]==1 ? 1 : -1)."', '{$attach_id}', '{$rtracker_id}')");
  249. }
  250. }
  251. }
  252. return true;
  253. }
  254. function torrent_enconvert($data, $from, $to, $type_conv='')
  255. {
  256. if(!$type_conv && $data)
  257. {
  258. if(function_exists('iconv'))
  259. {
  260. $type_conv='iconv';
  261. }
  262. else if(function_exists('mb_convert_encoding'))
  263. {
  264. $type_conv='mb';
  265. }
  266. }
  267. if($data && $from && $to && $type_conv)
  268. {
  269. $data=($type_conv=='iconv' ? @iconv($from, $to, $data) : @mb_convert_encoding($data, $to, $from));
  270. }
  271. return $data;
  272. }
  273. ?>