Просмотр файла fmget-server/req.php

Размер файла: 10.52Kb
<?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));

?>