PageRenderTime 42ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 1ms

/inc/clean.inc.php

https://github.com/torrage/Torrage
PHP | 340 lines | 256 code | 36 blank | 48 comment | 76 complexity | 195f85ff1df4cd8d221c61ef32e0507b MD5 | raw file
  1. <?php
  2. $basicsanity = true;
  3. $basicsanity_strict = true;
  4. $removeiponly = true;
  5. $add_udp_url = true;
  6. $rem_comment = true;
  7. // Trackers to remove
  8. include_once dirname( __FILE__ ) . '/blacklist.inc.php';
  9. // Trackers known to support UDP
  10. include_once dirname( __FILE__ ) . '/udptrackers.inc.php';
  11. /* Decoding loop - Start */
  12. reset( $trackers );
  13. if( is_array( $trackers ) && count( $trackers ) > 0 )
  14. {
  15. foreach( $trackers as $id => $tracker )
  16. {
  17. // Updated tracker url's - tracker{1-5}.istole.it:60500 to tracker.istole.it:80
  18. if( stristr( $tracker, '.istole.it:60500/' ) )
  19. {
  20. $trackers[$id] = 'udp://tracker.istole.it:80/announce';
  21. continue;
  22. }
  23. // Updated tracker url's - tracker.sladinki007.net to tracker.istole.it:80
  24. if( stristr( $tracker, 'sladinki007.net' ) )
  25. {
  26. $trackers[$id] = 'udp://tracker.istole.it:80/announce';
  27. continue;
  28. }
  29. // Updated tracker url's - eztv trackers to tracker.istole.it:80
  30. if( stristr( $tracker, 'eztv' ) )
  31. {
  32. $trackers[$id] = 'udp://tracker.istole.it:80/announce';
  33. continue;
  34. }
  35. // Updated tracker url's - denis trackers to tracker.ccc.de:80
  36. if( stristr( $tracker, 'denis.stalker.h3q.com' ) )
  37. {
  38. $trackers[$id] = 'udp://tracker.ccc.de:80/announce';
  39. continue;
  40. }
  41. // Miss spelled annonce => announce
  42. if( stristr( $tracker, 'annonce' ) )
  43. {
  44. $trackers[$id] = str_replace( 'annonce', 'announce', trim( urldecode( $tracker ) ) );
  45. continue;
  46. }
  47. // Detect typo /announce
  48. $l = $p = '';
  49. if( ( !stristr( $tracker, 'dht://' ) ) && ( stristr( $tracker, '/an' ) ) )
  50. {
  51. unset( $l, $p );
  52. $have_php = 0;
  53. $l = strlen( $tracker );
  54. $p = stripos( $tracker, '/an', 15 );
  55. if( stristr( substr( $tracker, $p ), '.php' ) )
  56. $have_php = 1;
  57. // Make sure we are at the end.
  58. if( ( $l - $p < 16 ) && ( $have_php ) )
  59. {
  60. $trackers[$id] = substr( $tracker, 0, $p ) . '/announce.php';
  61. continue;
  62. }
  63. elseif( $l - $p < 12 )
  64. {
  65. $trackers[$id] = substr( $tracker, 0, $p ) . '/announce';
  66. continue;
  67. }
  68. }
  69. $trackers[$id] = trim( urldecode( $tracker ) );
  70. }
  71. }
  72. /* Decoding loop - End */
  73. /* Sanity loop - Start */
  74. $tr_add = array();
  75. reset( $trackers );
  76. foreach( $trackers as $id => $tracker )
  77. {
  78. // Remove :80 from http URL's
  79. if( ( stristr( $tracker, 'http://' ) ) && ( strstr( $tracker, ':80/' ) ) )
  80. {
  81. unset( $trackers[$id] );
  82. $tr_add[] = str_replace( ':80/', '/', $tracker );
  83. }
  84. // Add :80 to udp:// url's with no port
  85. if( ( stristr( $tracker, 'udp://' ) ) && ( !strstr( substr( $tracker, 6 ), ':' ) ) )
  86. {
  87. unset( $trackers[$id] );
  88. $tr_add[] = substr( $tracker, 0, strpos( $tracker, '/', 6 ) ) . ':80' . substr( $tracker, strpos( $tracker, '/', 6 ) ) . '\n';
  89. }
  90. }
  91. $trackers = merge_trackers( $trackers, $tr_add );
  92. unset( $tr_add );
  93. /* Sanity loop - End */
  94. /* Removal loop - Start */
  95. reset( $trackers );
  96. foreach( $trackers as $id => $tracker )
  97. {
  98. reset( $rem_patterns );
  99. // Remove trackers specified in $rem_patterns.
  100. foreach( $rem_patterns as $rem_pattern )
  101. {
  102. if( stristr( $tracker, $rem_pattern ) )
  103. {
  104. unset( $trackers[$id] );
  105. continue;
  106. }
  107. }
  108. // Get host part
  109. unset( $s, $e );
  110. if( !stristr( $tracker, 'dht://' ) )
  111. {
  112. $s = stripos( $tracker, 'p://' ) + 4;
  113. $e = stripos( $tracker, ':', $s );
  114. if( $e === false )
  115. $e = strpos( $tracker, '/', $s );
  116. $trhost = substr( $tracker, $s, $e - $s );
  117. }
  118. // Basic sanity - remove failing tracker URL's
  119. if( $basicsanity )
  120. {
  121. // Remove too short urls, 'udp://aa.aa/announce' beeing the minimum for non dht
  122. if( ( !stristr( $tracker, 'dht://' ) ) && ( strlen( $tracker ) < 20 ) )
  123. {
  124. unset( $trackers[$id] );
  125. continue;
  126. }
  127. // A dht:// url is always 59 bytes
  128. if( ( stristr( $tracker, 'dht://' ) ) && ( strlen( $tracker ) != 59 ) )
  129. {
  130. unset( $trackers[$id] );
  131. continue;
  132. }
  133. // Require a /announce or /tracker in the url
  134. if( $basicsanity_strict )
  135. {
  136. if( ( !stristr( $tracker, 'dht://' ) ) && ( !( stristr( $tracker, '/announce' ) ) || ( stristr( substr( $tracker, 8 ), '/tracker' ) ) ) )
  137. {
  138. /*
  139. * TODO: Add check in whitelist to find matching tracker
  140. */
  141. unset( $trackers[$id] );
  142. continue;
  143. }
  144. }
  145. // Check that we have atleast 3 slashes, not including a / as last character
  146. if( ( !stristr( $tracker, 'dht://' ) ) && ( substr_count( substr( $tracker, 0, strlen( $tracker ) - 1 ), '/' ) < 3 ) )
  147. {
  148. unset( $trackers[$id] );
  149. continue;
  150. }
  151. // url having www. but no /announce
  152. if( ( !stristr( $tracker, 'dht://' ) ) && ( ( stristr( $tracker, 'www.' ) ) && ( !stristr( $tracker, '/announce' ) ) ) )
  153. {
  154. /*
  155. * TODO: Add check in whitelist to find matching tracker
  156. */
  157. unset( $trackers[$id] );
  158. continue;
  159. }
  160. // Remove trackers not starting with udp:// http:// dht://
  161. if( !( ( stripos( ' ' . $tracker, 'udp://' ) == 1 ) || ( stripos( ' ' . $tracker, 'dht://' ) == 1 ) || ( stripos( ' ' . $tracker, 'http://' ) == 1 ) ) )
  162. {
  163. unset( $trackers[$id] );
  164. continue;
  165. }
  166. // Check for double protocol prefixes.
  167. if( stripos( $tracker, '://', 5 ) !== FALSE )
  168. {
  169. unset( $trackers[$id] );
  170. continue;
  171. }
  172. // Check for illegal characters.
  173. if( !is_valid_url( $tracker ) )
  174. {
  175. unset( $trackers[$id] );
  176. continue;
  177. }
  178. // Remove url's with two .. (dots) in a row..
  179. if( strstr( $trhost, '..' ) )
  180. {
  181. unset( $trackers[$id] );
  182. continue;
  183. }
  184. // Remove url's where any of the last 3 charrs is a number
  185. if( ( is_numeric( substr( $trhost, strlen( $trhost ) - 1, 1 ) ) ) || ( is_numeric( substr( $trhost, strlen( $trhost ) - 2, 1 ) ) ) || ( is_numeric( substr( $trhost, strlen( $trhost ) - 3, 1 ) ) ) )
  186. {
  187. unset( $trackers[$id] );
  188. continue;
  189. }
  190. // Remove url's that have no . (dot) in the host part
  191. if( !strstr( $trhost, '.' ) )
  192. {
  193. unset( $trackers[$id] );
  194. continue;
  195. }
  196. }
  197. // Removal of IP-only trackers
  198. if( $removeiponly )
  199. {
  200. if( ip2long( $trhost ) !== FALSE )
  201. {
  202. unset( $trackers[$id] );
  203. }
  204. }
  205. }
  206. /* Removal loop - End */
  207. /* UDP tracker Loop - Start */
  208. $tr_add = array();
  209. reset( $trackers );
  210. foreach( $trackers as $id => $tracker )
  211. {
  212. // Detection of several large trackers known to support UDP, and add the udp:// tracker url.
  213. if( $add_udp_url )
  214. {
  215. reset( $udp_patterns );
  216. foreach( $udp_patterns as $udp_pattern )
  217. {
  218. unset( $s, $e );
  219. if( stristr( $tracker, $udp_pattern ) )
  220. {
  221. unset( $trackers[$id] );
  222. $s = stripos( $tracker, 'p://' );
  223. $e = stripos( $tracker, ':', $s + 4 );
  224. if( $e === false )
  225. {
  226. $e = strpos( $tracker, '/', $s + 4 );
  227. $port = 80;
  228. $p = $e;
  229. }
  230. else
  231. {
  232. $p = strpos( $tracker, '/', $e );
  233. $port = substr( $tracker, $e + 1, $p - $e - 1 );
  234. }
  235. // Add - http://
  236. if( $port == 80 )
  237. $tr_add[] = 'htt' . substr( $tracker, $s, $e - $s ) . substr( $tracker, $p );
  238. else
  239. $tr_add[] = 'htt' . substr( $tracker, $s, $e - $s ) . ":$port" . substr( $tracker, $p );
  240. // Add - udp://
  241. $tr_add[] = 'ud' . substr( $tracker, $s, $e - $s ) . ":$port" . substr( $tracker, $p );
  242. /* I HAVE A BUG HERE */
  243. }
  244. }
  245. }
  246. }
  247. $trackers = merge_trackers( $trackers, $tr_add );
  248. /* UDP tracker Loop - END */
  249. // set our default trackers
  250. if( count( $SETTINGS['trackers'] ) > 0 )
  251. {
  252. foreach( $SETTINGS['trackers'] as $tracker )
  253. {
  254. array_push( $trackers, $tracker );
  255. }
  256. }
  257. $trackers = array_reverse( $trackers );
  258. /* Functions - Start */
  259. function merge_trackers( $tr, $tr_add )
  260. {
  261. if( is_array( $tr_add ) )
  262. {
  263. foreach( $tr_add as $a )
  264. {
  265. $tr[] = $a;
  266. }
  267. }
  268. unset( $a, $tr_add );
  269. return array_unique( $tr );
  270. }
  271. function is_valid_char( $c )
  272. {
  273. // Valid chars 37-38, 43, 45-58, 61, 63, 65-90, 95, 97-122
  274. $char = ord( $c );
  275. if( $char == 37 )
  276. return true;
  277. if( $char == 38 )
  278. return true;
  279. if( $char == 43 )
  280. return true;
  281. if( ( $char >= 45 ) && ( $char <= 58 ) )
  282. return true;
  283. if( $char == 61 )
  284. return true;
  285. if( $char == 63 )
  286. return true;
  287. if( ( $char >= 65 ) && ( $char <= 90 ) )
  288. return true;
  289. if( $char == 95 )
  290. return true;
  291. if( ( $char >= 97 ) && ( $char <= 122 ) )
  292. return true;
  293. return false;
  294. }
  295. function is_valid_url( $url )
  296. {
  297. for( $i = 0; $i < strlen( $url ); $i++ )
  298. {
  299. if( !is_valid_char( $url[$i] ) )
  300. return false;
  301. }
  302. return true;
  303. }
  304. /* Functions - End */