<?php
# FMGET ver. 1.1
# © Alex Extend, 2008
#
# Данная программа является свободным программным обеспечением. Вы вправе
# распространять ее и/или модифицировать в соответствии с условиями версии 2 либо
# по вашему выбору с условиями более поздней версии Стандартной Общественной
# Лицензии GNU, опубликованной Free Software Foundation.
#
# Мы распространяем данную программу в надежде на то, что она будет вам полезной
# однако НЕ ПРЕДОСТАВЛЯЕМ НА НЕЕ НИКАКИХ ГАРАНТИЙ, в том числе ГАРАНТИИ ТОВАРНОГО
# СОСТОЯНИЯ ПРИ ПРОДАЖЕ и ПРИГОДНОСТИ ДЛЯ ИСПОЛЬЗОВАНИЯ В КОНКРЕТНЫХ ЦЕЛЯХ. Для
# получения более подробной информации ознакомьтесь со Стандартной Общественной
# Лицензией GNU.
ini_set('display_errors', 0);
header("Content-Type: text/plain; charset=utf-8");
header("Cache-Control: no-cache,must-revalidate");
header("Pragma: no-cache");
// обработчик запросов. Вызывается клиентом через GET. Возвращяет ответ в php serialize
include ('conf.php');
include ('class.phpmailer.php');
if (empty($_GET['mode'])) exit;
// вызываемое дейсвие
$mode=$_GET['mode'];
// список пользователей
$users=unserialize(file_get_contents('users.txt'));
if ($mode!='reg') {
// проверка авторизации
$email=$_GET['email'];
$pass=$_GET['pass'];
if (empty($users[$email])) perror("unregistered email $email. Запустите fmget config и введите заново email");
if ($pass!=$users[$email]['pass']) perror("incorrect pass $pass for user $email. Запустите fmget config и введите заново email");
if ((!empty($users[$email]['expire'])) and ($users[$email]['expire']<time())) perror("Срок действия аккаунта истек");
}
// начало загрузки файла
if ($mode=='get') {
$info=unserialize(file_get_contents("$basedir/users/$email/info.txt"));
$url=$_GET['url'];
if ($url=='web') {
if (empty($info['list'][0]['url'])) perror("Файл не принят. Зайдите на $baseurl");
foreach ($info['list'][0] as $n=>$v) {
$info[$n]=$v;
}
$url=$info['url'];
}
// проверка статуса пользователя
if ($users[$email]['status']!='free') perror("user $email already download file");
// проверка количества активных пользователей
$ausercount=1;
foreach ($users as $user) {
if ($user['status']!='free') {
$ausercount++;
}
}
if ($ausercount>$fusercount) perror("Лимит подключений исчерпан. Попробуйте позже.");
// проверка url и обработка переадресаций
while (1) {
if (!preg_match('|^http://([a-z0-9\.\-]+)(/.+)$|i', $url, $m)) perror("incorrect url $url");
$host=$m[1];
$uri=$m[2];
$r="GET $uri HTTP/1.1\r\n";
$r.="Host: $host\r\n";
$r.="Range: bytes=0-\r\n";
if (isset($info['HTTP_USER_AGENT'])) $r.="User-Agent: $info[HTTP_USER_AGENT]\r\n";
if (isset($info['HTTP_ACCEPT'])) $r.="Accept: $info[HTTP_ACCEPT]\r\n";
if (isset($info['HTTP_ACCEPT_LANGUAGE'])) $r.="Accept-Language: $info[HTTP_ACCEPT_LANGUAGE]\r\n";
if (isset($info['HTTP_ACCEPT_CHARSET'])) $r.="Accept-Charset: $info[HTTP_ACCEPT_CHARSET]\r\n";
if (isset($info['HTTP_COOKIE'])) $r.="Cookie: $info[HTTP_COOKIE]\r\n";
$r.="Connection: close\r\n\r\n";
$s=fsockopen($host, 80, $errno, $errstr);
if (!$s) perror("$errno $errstr url $url");
fwrite($s, $r);
$h="";
while (!strstr($h, "\r\n\r\n")) $h.=fread($s, 1);
fclose($s);
if (preg_match('|^Location:\s*(\S+)\s*$|im', $h, $ma)) {
if ($url==$ma[1]) perror("self-redirect $url");
$url=$ma[1];
} else {
break;
}
}
// проверка заголовков
if (!preg_match('|^Content-Length:\s*(\d+)\s*$|im', $h, $mb)) perror("No Content-Length $url");
if (!stristr($h, 'Partial Content')) perror("No Partial Content $url");
// размер файла
$size=$mb[1];
// ид запроса
$rid=time();
// имя файла
$filename=basename($uri);
$info['email']=$email;
$info['rid']=$rid;
$info['size']=$size;
$info['url']=$url;
$info['filename']=$filename;
// размер части
$partsize=$_GET['partsize'];
if ($partsize>$fusersize/2) perror('max partsize '.$fusersize/2/1024/1024);
if ($partsize>$maxpartsize) perror('max partsize '.$maxpartsize/1024/1024);
$info['partsize']=$partsize;
// расчет диапазонов для разбиения файла
$n=-1;
$i=-1;
while(1) {
$n++;
$i++;
$n1=$n;
$n+=$partsize-1;
$n2=$n;
if ($n2>$size-1) $n2=$size-1;
$psize=$n2-$n1+1;
$parts[]=array('num'=>$i, 'psize'=>$psize, 'n1'=>$n1, 'n2'=>$n2, 'status'=>'no');
if ($n2==$size-1) break;
}
$info['parts']=$parts;
$info['status']='ok';
// удаление файла из очереди
unset($info['list'][0]);
$info['list']=array_values(@$info['list']);
$inf=serialize($info);
file_put_contents("$basedir/users/$email/info.txt", $inf);
echo $inf;
$users[$email]['rid']=$rid;
$users[$email]['status']='load';
// ид сессии
$sid=time();
file_put_contents("$basedir/users/$email/sid.txt", $sid);
// запуск загрузчика
$r="GET $baseuri/loader.php?rid=$rid&sid=$sid&email=".urlencode($email)." HTTP/1.1\r\n";
$r.="Host: $basehost\r\n";
$r.="Connection: close\r\n\r\n";
$l=fsockopen($basehost, 80);
fwrite($l, $r);
plog("user $email starting download $rid $url");
}
// подтверждение получения части
if ($mode=='ok') {
$rid=$_GET['rid'];
if ($users[$email]['rid']!=$rid) perror("bad rid for user $email");
$num=intval($_GET['num']);
$info=unserialize(file_get_contents("$basedir/users/$email/info.txt"));
$info['parts'][$num]['status']='ok';
@unlink("$basedir/users/$email/". ($num-1) .".part");
file_put_contents("$basedir/users/$email/info.txt", serialize($info));
echo serialize(array('status'=>'ok'));
}
// приостановка загрузки
if ($mode=='stop') {
$rid=$_GET['rid'];
if ($users[$email]['rid']!=$rid) perror("bad rid for user $email");
// отчистка файла с sid, чтобы остановить загрузчик
file_put_contents("$basedir/users/$email/sid.txt", "");
plog("user $email stopping download $rid");
echo serialize(array('status'=>'ok'));
}
// возобновление загрузки
if ($mode=='rget') {
$rid=$_GET['rid'];
if ($users[$email]['rid']!=$rid) perror("bad rid for user $email");
// номер части, с которой начинать
$num=intval($_GET['num']);
$info=unserialize(file_get_contents("$basedir/users/$email/info.txt"));
// простановка всем частям более запрошеной статуса wait
foreach ($info['parts'] as &$pinfo) {
if (($pinfo['num']>=$num) and ($pinfo['status']!='no')) $pinfo['status']='wait';
}
file_put_contents("$basedir/users/$email/info.txt", serialize($info));
$sid=time();
file_put_contents("$basedir/users/$email/sid.txt", $sid);
// запуск загрузчика
$r="GET $baseuri/loader.php?rid=$rid&sid=$sid&email=".urlencode($email)." HTTP/1.1\r\n";
$r.="Host: $basehost\r\n";
$r.="Connection: close\r\n\r\n";
$l=fsockopen($basehost, 80);
fwrite($l, $r);
plog("user $email continue download $rid from $num");
echo serialize(array('status'=>'ok'));
}
// удаление файла
if ($mode=='del') {
$info=unserialize(file_get_contents("$basedir/users/$email/info.txt"));
// удаление частей
foreach (glob("$basedir/users/$email/*.*") as $filename) {
unlink($filename);
}
// отчистка sid
file_put_contents("$basedir/users/$email/sid.txt", "");
$newinfo['list']=$info['list'];
file_put_contents("$basedir/users/$email/info.txt", serialize($newinfo));
$users[$email]['status']='free';
$users[$email]['rid']=false;
plog("user $email end download");
echo serialize(array('status'=>'ok'));
}
// проверка статуса загрузчика
if ($mode=='loaderstatus') {
$info=unserialize(file_get_contents("$basedir/users/$email/info.txt"));
$res['loaderstatus']=@$info['loaderstatus'];
$res['loadnum']=@$info['loadnum'];
$res['listcount']=@count($info['list']);
$res['status']='ok';
echo serialize($res);
}
// регистрация email
if ($mode=='reg') {
$email=$_GET['email'];
if (!preg_match('|^[a-z0-9\-\_\.]+@[a-z0-9\-\_\.]+$|i', $email)) perror("bad email $email");
if (empty($_GET['apass'])) {
if (empty($users[$email])) {
// новый аккаунт
if (!$regallow) perror("Ваш email не зарегистрирован. Зайдите на http://fmget.narod.ru для регистрации.");
if ($regexpire) $users[$email]['expire']=time()+$regexpire;
}
// генерация пароля
$apass=md5(time());
if ((!empty($_GET['opass'])) and ($_GET['opass']==$users[$email]['pass'])) {
$apass=$users[$email]['pass'];
}
$users[$email]['apass']=$apass;
$users[$email]['status']='free';
$users[$email]['smtphost']=$_GET['smtphost'];
$users[$email]['smtplogin']=$_GET['smtplogin'];
$users[$email]['smtppass']=$_GET['smtppass'];
// отправка пароля на email
$mail=new PHPMailer();
$smtphost=$users[$email]['smtphost'];
$smtplogin=$users[$email]['smtplogin'];
$smtppass=$users[$email]['smtppass'];
$mail->IsSMTP();
$mail->Host=$smtphost;
if (!empty($smtplogin)) {
$mail->SMTPAuth=true;
$mail->Username=$smtplogin;
$mail->Password=$smtppass;
}
$mail->From=$fromemail;
$mail->FromName=$fromname;
$mail->Subject="fmail pass";
$mail->Body="Your pass: $apass";
$mail->AddAddress($email, "Viktor Andreev");
if(!$mail->Send()) {
perror("Mailer Error: " . $mail->ErrorInfo);
}
echo serialize(array('status'=>'ok'));
} else {
// проверка пароля
$apass=$_GET['apass'];
if ($apass==$users[$email]['apass']) {
$users[$email]['pass']=$apass;
unset($users[$email]['apass']);
$users[$email]['status']='free';
// создание каталога
@mkdir("$basedir/users/$email");
foreach (glob("$basedir/users/$email/*.*") as $filename) {
unlink($filename);
}
echo serialize(array('status'=>'ok'));
} else {
perror("bad pass");
}
}
}
file_put_contents('users.txt', serialize($users));
?>