<?php
/**
* thread-is-dead killer 0.3
* @author jonatfuckdotorg
* @since august 02 2007
*/
define('TIDK_G_MAGIC_SZ'6);
define('TIDK_G_MAX_WIDTH'1024);
define('TIDK_G_MAX_PRODUCT'1280*1024);
define('TIDK_I_UNK'0);
define('TIDK_I_JPG'1);
define('TIDK_I_GIF'2);
define('TIDK_I_PCX'3);
define('TIDK_I_DCX'4);
define('TIDK_I_PNG'5);
define('TIDK_I_TIF'6);
define('TIDK_I_TGA'7);
define('TIDK_I_BMP'8);


function 
tidk_read_min_bytes($fh$min)
{
$buf null;
while (!
feof($fh) and (strlen($buf) < $min))
{
$tmp = @fread($fh$min strlen($buf));
if (
$tmp === false) break;
$buf .= $tmp;
}
return 
$buf;
}


function 
tidk_reader($url)
{
$magic = array(
chr(0xff).chr(0xd8).chr(0xff).chr(0xfe).chr(0x00) => TIDK_I_JPG,
chr(0xff).chr(0xd8).chr(0xff).chr(0xe0).chr(0x00) => TIDK_I_JPG,
chr(0x47).chr(0x49).chr(0x46).chr(0x38).chr(0x39).chr(0x61) => TIDK_I_GIF,
chr(0x47).chr(0x49).chr(0x46).chr(0x38).chr(0x37).chr(0x61) => TIDK_I_GIF,
chr(0x89).chr(0x50).chr(0x4e).chr(0x47).chr(0x0d).chr(0x0a) => TIDK_I_PNG,
chr(0x0a).chr(0x05).chr(0x01).chr(0x08) => TIDK_I_PCX/* v5 */
chr(0x3a).chr(0xde).chr(0x68).chr(0xb1) => TIDK_I_DCX,
chr(0x49).chr(0x49).chr(0x2a) => TIDK_I_TIF,
chr(0x4d).chr(0x4d).chr(0x2a) => TIDK_I_TIF,
);


$fh = @fopen($url'rb');
if (
$fh === false) return array(null,TIDK_I_UNK);

$buf tidk_read_min_bytes($fhTIDK_G_MAGIC_SZ);

foreach(
$magic as $mstr => $ftyp)
if ((
strlen($buf) >= strlen($mstr)) and
(
=== strcmp(substr($buf,0,strlen($mstr)), $mstr)))
{
switch(
$ftyp)
{
case 
TIDK_I_JPG: return tidk_jpg_scanner($fh$buf);
case 
TIDK_I_GIF: return tidk_gif_scanner($fh$buf);
case 
TIDK_I_PNG: return tidk_png_scanner($fh$buf);
case 
TIDK_I_PCX: return tidk_pcx_scanner($fh$buf);
case 
TIDK_I_DCX: return tidk_dcx_scanner($fh$buf);
case 
TIDK_I_TIF: return tidk_tif_scanner($fh$buf);
case 
TIDK_I_TGA: return tidk_tga_scanner($fh$buf);
case 
TIDK_I_BMP: return tidk_bmp_scanner($fh$buf);
}
break;
}

switch(
strtolower(substr($url,strrpos($url,'.')+1)))
{
case 
'jpeg':
case 
'jpe':
case 
'jpg': return tidk_jpg_scanner($fh$buf);
case 
'gif': return tidk_gif_scanner($fh$buf);
case 
'png': return tidk_png_scanner($fh$buf);
case 
'pcx': return tidk_pcx_scanner($fh$buf);
case 
'dcx': return tidk_dcx_scanner($fh$buf);
case 
'tif':
case 
'tiff': return tidk_tif_scanner($fh$buf);
case 
'tga': return tidk_tga_scanner($fh$buf);
case 
'bmp': return tidk_bmp_scanner($fh$buf);
}

fclose($fh);
return array(
00);
}


function 
tidk_jpg_scanner($fh$pre)
{
$w $h $d $e 0;
$a 1;
$i 0;

if (
$i strlen($pre)) $c $pre[$i++];
else if (
false === ($c fgetc($fh))) $a 0;
if (
ord($c) !== 0xff$a 0;

if (
$i strlen($pre)) $c $pre[$i++];
else if (
false === ($c fgetc($fh))) $a 0;
if (
ord($c) !== 0xd8$a 0;

while (
$a)
{
if (
$i strlen($pre)) $c $pre[$i++];
else if (
false === ($c fgetc($fh))) {$a=0; break;}
$c ord($c);
//echo dechex($c).' ';

while ($c != 0xff)
{
if (
$i strlen($pre)) $c $pre[$i++];
else if (
false === ($c fgetc($fh))) {$a=0; break;}
$c ord($c);
//echo dechex($c).' ';
}

if (
$i strlen($pre)) $c $pre[$i++];
else if (
false === ($c fgetc($fh))) {$a=0; break;}
$c ord($c);
//echo dechex($c).' ';

while ($c == 0xff)
{
if (
$i strlen($pre)) $c $pre[$i++];
else if (
false === ($c fgetc($fh))) {$a=0; break;}
$c ord($c);
//echo dechex($c).' ';
}
//echo ",\n";

if ($a == 0) break;

switch(
$c)
{
case 
0xC0: case 0xC1: case 0xC2:
case 
0xC3: case 0xC5: case 0xC6:
case 
0xC7: case 0xC9: case 0xCA:
case 
0xCB: case 0xCD: case 0xCE:
case 
0xCF:
//echo "!\n";
if ($i strlen($pre)) $d $pre[$i++];
else if (
false === ($d fgetc($fh))) {$a=0; break;}
if (
$i strlen($pre)) $d $pre[$i++];
else if (
false === ($d fgetc($fh))) {$a=0; break;}
if (
$i strlen($pre)) $d $pre[$i++];
else if (
false === ($d fgetc($fh))) {$a=0; break;}

if (
$i strlen($pre)) $d $pre[$i++];
else if (
false === ($d fgetc($fh))) {$a=0; break;}
if (
$i strlen($pre)) $e $pre[$i++];
else if (
false === ($e fgetc($fh))) {$a=0; break;}
$h = (ord($d) << 8) + ord($e);

if (
$i strlen($pre)) $d $pre[$i++];
else if (
false === ($d fgetc($fh))) {$a=0; break;}
if (
$i strlen($pre)) $e $pre[$i++];
else if (
false === ($e fgetc($fh))) {$a=0; break;}
$w = (ord($d) << 8) + ord($e);

return array(
$w$h);

case 
0xDA: case 0xD9:
return array(
00);

default:
if (
$i strlen($pre)) $d $pre[$i++];
else if (
false === ($d fgetc($fh))) {$a=0; break;}
if (
$i strlen($pre)) $e $pre[$i++];
else if (
false === ($e fgetc($fh))) {$a=0; break;}
$d ord($d);
$e ord($e);
$l = ($d << 8) + $e;
//echo dechex($d) . ' ' . dechex($e) . " ($l).\n";
if ($l 2) return array(00);
$l -= 2;
while(
$l 0)
{
if (
$i strlen($pre)) $d $pre[$i++];
else if (
false === ($d fgetc($fh))) {$a=0; break;}
$l--;
}
}
}

fclose($fh);
return array(
00);
}


function 
tidk_gif_scanner($fh$pre)
{
$hdr $pre tidk_read_min_bytes($fh10 strlen($pre));
fclose($fh);

return array(
ord($hdr[6]) + (ord($hdr[7]) << 8),
ord($hdr[8]) + (ord($hdr[9]) << 8));
}


function 
tidk_png_scanner($fh,$pre)
{
$hdr $pre tidk_read_min_bytes($fh24-strlen($pre));
fclose($fh);
$w = (ord($hdr[16]) << 24) + (ord($hdr[17]) << 16)
+ (
ord($hdr[18]) << 8) + ord($hdr[19]);
$h = (ord($hdr[20]) << 24) + (ord($hdr[21]) << 16)
+ (
ord($hdr[22]) << 8) + ord($hdr[23]);
return array(
$w$h);
}


function 
tidk_pcx_scanner($fh$pre)
{
$hdr $pre tidk_read_min_bytes($fh12 strlen($pre));
fclose($fh);

$w = (ord($hdr[8]) + (ord($hdr[9]) << 8))
- (
ord($hdr[4]) + (ord($hdr[5]) << 8))
1;
$h = (ord($hdr[10]) + (ord($hdr[11]) << 8))
- (
ord($hdr[6]) + (ord($hdr[7]) << 8))
1;
return array(
$w$h);
}


function 
tidk_dcx_scanner($fh)
{
fclose($fh);
return array(
0,0);
}


function 
tidk_tif_scanner($fh$pre)
{
$hdr $pre tidk_read_min_bytes($fh10 strlen($pre));
$pre = (strlen($pre) > 10) ? substr($pre10) : null;
$tags ord($hdr[8]) + (ord($hdr[9]) << 8);
$w $h $i 0;

for(
$i 0$i $tags$i++)
{
$tag $pre tidk_read_min_bytes($fh12 strlen($pre));
$pre = (strlen($pre) > 12) ? substr($pre12) : null;

$code ord($tag[0]) + (ord($tag[1]) << 8);
switch(
$code)
{
case 
0x100:
$w ord($tag[8]) + (ord($tag[9]) << 8)
+ (
ord($tag[10]) << 16) + (ord($tag[11]) << 24);
break;
case 
0x101:
$h ord($tag[8]) + (ord($tag[9]) << 8)
+ (
ord($tag[10]) << 16) + (ord($tag[11]) << 24);
break;
}
if ((
$w 0) and ($h 0)) break;
}
fclose($fh);
return array(
$w,$h);
}


function 
tidk_tga_scanner($fh$pre)
{
$hdr $pre tidk_read_min_bytes($fh16 strlen($pre));
fclose($fh);
return array(
ord($hdr[12]) + (ord($hdr[13]) << 8),
ord($hdr[14]) + (ord($hdr[15]) << 8));
}


function 
tidk_bmp_scanner($fh)
{
fclose($fh);
return array(
0,0);
}


function 
tidk_run($msg)
{
if (
preg_match_all('#\[img\]http://(.*?)\[/img\]#i',$msg,$m))
foreach(
$m[1] as $uri)
{
list(
$w$h) = tidk_reader('http://'.$uri);
//echo $uri . ' = ' . $w . 'x' . $h . "\n";
if (($w TIDK_G_MAX_WIDTH) or
((
$w $h) > TIDK_G_MAX_PRODUCT)) return false;
}
return 
true;
}


if (!
tidk_run($post['message']))
{
header('location: /');
exit;
}
?>