/upload/attach_mod/includes/functions_filetypes.php

http://torrentpier2.googlecode.com/ · PHP · 402 lines · 287 code · 74 blank · 41 comment · 98 complexity · 267fad396cc5629f0da5c12e4381a3cd MD5 · raw file

  1. <?php
  2. /**
  3. * All Attachment Functions needed to determine Special Files/Dimensions
  4. */
  5. /**
  6. * Read Long Int (4 Bytes) from File
  7. */
  8. function read_longint($fp)
  9. {
  10. $data = fread($fp, 4);
  11. $value = ord($data[0]) + (ord($data[1])<<8)+(ord($data[2])<<16)+(ord($data[3])<<24);
  12. if ($value >= 4294967294)
  13. {
  14. $value -= 4294967296;
  15. }
  16. return $value;
  17. }
  18. /**
  19. * Read Word (2 Bytes) from File - Note: It's an Intel Word
  20. */
  21. function read_word($fp)
  22. {
  23. $data = fread($fp, 2);
  24. $value = ord($data[1]) * 256 + ord($data[0]);
  25. return $value;
  26. }
  27. /**
  28. * Read Byte
  29. */
  30. function read_byte($fp)
  31. {
  32. $data = fread($fp, 1);
  33. $value = ord($data);
  34. return $value;
  35. }
  36. /**
  37. * Get Image Dimensions
  38. */
  39. function image_getdimension($file)
  40. {
  41. $size = @getimagesize($file);
  42. if ($size[0] != 0 || $size[1] != 0)
  43. {
  44. return $size;
  45. }
  46. // Try to get the Dimension manually, depending on the mimetype
  47. $fp = @fopen($file, 'rb');
  48. if (!$fp)
  49. {
  50. return $size;
  51. }
  52. $error = FALSE;
  53. // BMP - IMAGE
  54. $tmp_str = fread($fp, 2);
  55. if ($tmp_str == 'BM')
  56. {
  57. $length = read_longint($fp);
  58. if ($length <= 6)
  59. {
  60. $error = true;
  61. }
  62. if (!$error)
  63. {
  64. $i = read_longint($fp);
  65. if ( $i != 0)
  66. {
  67. $error = true;
  68. }
  69. }
  70. if (!$error)
  71. {
  72. $i = read_longint($fp);
  73. if ($i != 0x3E && $i != 0x76 && $i != 0x436 && $i != 0x36)
  74. {
  75. $error = true;
  76. }
  77. }
  78. if (!$error)
  79. {
  80. $tmp_str = fread($fp, 4);
  81. $width = read_longint($fp);
  82. $height = read_longint($fp);
  83. if ($width > 3000 || $height > 3000)
  84. {
  85. $error = true;
  86. }
  87. }
  88. }
  89. else
  90. {
  91. $error = true;
  92. }
  93. if (!$error)
  94. {
  95. fclose($fp);
  96. return array(
  97. $width,
  98. $height,
  99. 6
  100. );
  101. }
  102. $error = false;
  103. fclose($fp);
  104. // GIF - IMAGE
  105. $fp = @fopen($file, 'rb');
  106. $tmp_str = fread($fp, 3);
  107. if ($tmp_str == 'GIF')
  108. {
  109. $tmp_str = fread($fp, 3);
  110. $width = read_word($fp);
  111. $height = read_word($fp);
  112. $info_byte = fread($fp, 1);
  113. $info_byte = ord($info_byte);
  114. if (($info_byte & 0x80) != 0x80 && ($info_byte & 0x80) != 0)
  115. {
  116. $error = true;
  117. }
  118. if (!$error)
  119. {
  120. if (($info_byte & 8) != 0)
  121. {
  122. $error = true;
  123. }
  124. }
  125. }
  126. else
  127. {
  128. $error = true;
  129. }
  130. if (!$error)
  131. {
  132. fclose($fp);
  133. return array(
  134. $width,
  135. $height,
  136. 1
  137. );
  138. }
  139. $error = false;
  140. fclose($fp);
  141. // JPG - IMAGE
  142. $fp = @fopen($file, 'rb');
  143. $tmp_str = fread($fp, 4);
  144. $w1 = read_word($fp);
  145. if (intval($w1) < 16)
  146. {
  147. $error = true;
  148. }
  149. if (!$error)
  150. {
  151. $tmp_str = fread($fp, 4);
  152. if ($tmp_str == 'JFIF')
  153. {
  154. $o_byte = fread($fp, 1);
  155. if (intval($o_byte) != 0)
  156. {
  157. $error = true;
  158. }
  159. if (!$error)
  160. {
  161. $str = fread($fp, 2);
  162. $b = read_byte($fp);
  163. if ($b != 0 && $b != 1 && $b != 2)
  164. {
  165. $error = true;
  166. }
  167. }
  168. if (!$error)
  169. {
  170. $width = read_word($fp);
  171. $height = read_word($fp);
  172. if ($width <= 0 || $height <= 0)
  173. {
  174. $error = true;
  175. }
  176. }
  177. }
  178. }
  179. else
  180. {
  181. $error = true;
  182. }
  183. if (!$error)
  184. {
  185. fclose($fp);
  186. return array(
  187. $width,
  188. $height,
  189. 2
  190. );
  191. }
  192. $error = false;
  193. fclose($fp);
  194. // PCX - IMAGE
  195. $fp = @fopen($file, 'rb');
  196. $tmp_str = fread($fp, 3);
  197. if ((ord($tmp_str[0]) == 10) && (ord($tmp_str[1]) == 0 || ord($tmp_str[1]) == 2 || ord($tmp_str[1]) == 3 || ord($tmp_str[1]) == 4 || ord($tmp_str[1]) == 5) && (ord($tmp_str[2]) == 1))
  198. {
  199. $b = fread($fp, 1);
  200. if (ord($b) != 1 && ord($b) != 2 && ord($b) != 4 && ord($b) != 8 && ord($b) != 24)
  201. {
  202. $error = true;
  203. }
  204. if (!$error)
  205. {
  206. $xmin = read_word($fp);
  207. $ymin = read_word($fp);
  208. $xmax = read_word($fp);
  209. $ymax = read_word($fp);
  210. $tmp_str = fread($fp, 52);
  211. $b = fread($fp, 1);
  212. if ($b != 0)
  213. {
  214. $error = true;
  215. }
  216. }
  217. if (!$error)
  218. {
  219. $width = $xmax - $xmin + 1;
  220. $height = $ymax - $ymin + 1;
  221. }
  222. }
  223. else
  224. {
  225. $error = true;
  226. }
  227. if (!$error)
  228. {
  229. fclose($fp);
  230. return array(
  231. $width,
  232. $height,
  233. 7
  234. );
  235. }
  236. fclose($fp);
  237. return $size;
  238. }
  239. /**
  240. * Flash MX Support
  241. * Routines and Methods are from PhpAdsNew (www.sourceforge.net/projects/phpadsnew)
  242. */
  243. /**
  244. */
  245. define('swf_tag_compressed', chr(0x43).chr(0x57).chr(0x53));
  246. define('swf_tag_identify', chr(0x46).chr(0x57).chr(0x53));
  247. /**
  248. * Get flash bits
  249. */
  250. function swf_bits($buffer, $pos, $count)
  251. {
  252. $result = 0;
  253. for ($loop = $pos; $loop < $pos + $count; $loop++)
  254. {
  255. $result = $result + ((((ord($buffer[(int)($loop / 8)])) >> (7 - ($loop % 8))) & 0x01) << ($count - ($loop - $pos) - 1));
  256. }
  257. return $result;
  258. }
  259. /**
  260. * decompress flash contents
  261. */
  262. function swf_decompress($buffer)
  263. {
  264. if ((function_exists('gzuncompress')) && (substr($buffer, 0, 3) == swf_tag_compressed) && (ord(substr($buffer, 3, 1)) >= 6) )
  265. {
  266. // Only decompress relevant Informations
  267. $output = 'F';
  268. $output .= substr ($buffer, 1, 7);
  269. $output .= gzuncompress (substr ($buffer, 8));
  270. return $output;
  271. }
  272. else
  273. {
  274. return $buffer;
  275. }
  276. }
  277. /**
  278. * Get flash dimension
  279. */
  280. function swf_getdimension($file)
  281. {
  282. $size = @getimagesize($file);
  283. if ($size[0] != 0 || $size[1] != 0)
  284. {
  285. return $size;
  286. }
  287. // Try to get the Dimension manually
  288. $fp = @fopen($file, 'rb');
  289. if (!$fp)
  290. {
  291. return $size;
  292. }
  293. $error = false;
  294. // SWF - FLASH FILE
  295. $fp = @fopen($file, 'rb');
  296. // Decompress if file is a Flash MX compressed file
  297. $buffer = fread($fp, 1024);
  298. if (substr($buffer, 0, 3) == swf_tag_identify || substr($buffer, 0, 3) == swf_tag_compressed)
  299. {
  300. if (substr($buffer, 0, 3) == swf_tag_compressed)
  301. {
  302. fclose($fp);
  303. $fp = @fopen($file, 'rb');
  304. $buffer = fread($fp, filesize($file));
  305. $buffer = swf_decompress($buffer);
  306. }
  307. // Get size of rect structure
  308. $bits = swf_bits ($buffer, 64, 5);
  309. // Get rect
  310. $width = (int)(swf_bits ($buffer, 69 + $bits, $bits) - swf_bits ($buffer, 69, $bits)) / 20;
  311. $height = (int)(swf_bits ($buffer, 69 + (3 * $bits), $bits) - swf_bits ($buffer, 69 + (2 * $bits), $bits)) / 20;
  312. }
  313. else
  314. {
  315. $error = true;
  316. }
  317. if (!$error)
  318. {
  319. fclose($fp);
  320. return array(
  321. $width,
  322. $height,
  323. 2
  324. );
  325. }
  326. fclose($fp);
  327. return $size;
  328. }