mirror of
https://github.com/lkddi/nexusphp.git
synced 2026-04-24 03:57:22 +08:00
use TorrentFile from Rhilip\Bencode
This commit is contained in:
+1
-1
@@ -54,7 +54,7 @@
|
|||||||
"meilisearch/meilisearch-php": "^1.0",
|
"meilisearch/meilisearch-php": "^1.0",
|
||||||
"orangehill/iseed": "^3.0",
|
"orangehill/iseed": "^3.0",
|
||||||
"phpgangsta/googleauthenticator": "dev-master",
|
"phpgangsta/googleauthenticator": "dev-master",
|
||||||
"rhilip/bencode": "^2.0",
|
"rhilip/bencode": "^2.5.0",
|
||||||
"rlanvin/php-ip": "^3.0",
|
"rlanvin/php-ip": "^3.0",
|
||||||
"spatie/laravel-activitylog": "^4.10",
|
"spatie/laravel-activitylog": "^4.10",
|
||||||
"stichoza/google-translate-php": "^5.2"
|
"stichoza/google-translate-php": "^5.2"
|
||||||
|
|||||||
Generated
+235
-235
File diff suppressed because it is too large
Load Diff
@@ -6615,4 +6615,9 @@ function hide_text($text) {
|
|||||||
return '<span class="hidden-text">' . $text . '</span>';
|
return '<span class="hidden-text">' . $text . '</span>';
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function make_content_disposition(string $filename, string $disposition = 'attachment'): string {
|
||||||
|
$filenameFallback = str_replace('%', '', Str::ascii($filename));
|
||||||
|
return \Symfony\Component\HttpFoundation\HeaderUtils::makeDisposition($disposition, $filename, $filenameFallback);
|
||||||
|
}
|
||||||
|
|
||||||
?>
|
?>
|
||||||
|
|||||||
+13
-27
@@ -1,4 +1,7 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
|
use Rhilip\Bencode\TorrentFile;
|
||||||
|
|
||||||
require_once("../include/bittorrent.php");
|
require_once("../include/bittorrent.php");
|
||||||
dbconn();
|
dbconn();
|
||||||
require_once ROOT_PATH . get_langfile_path("functions.php");
|
require_once ROOT_PATH . get_langfile_path("functions.php");
|
||||||
@@ -89,7 +92,7 @@ if ($CURUSER['downloadpos']=="no") {
|
|||||||
//$ssl_torrent = $trackerSchemaAndHost['ssl_torrent'];
|
//$ssl_torrent = $trackerSchemaAndHost['ssl_torrent'];
|
||||||
//$base_announce_url = $trackerSchemaAndHost['base_announce_url'];
|
//$base_announce_url = $trackerSchemaAndHost['base_announce_url'];
|
||||||
|
|
||||||
$res = sql_query("SELECT torrents.name, torrents.filename, torrents.save_as, torrents.size, torrents.owner, torrents.banned, torrents.approval_status, torrents.price, categories.mode as search_box_id FROM torrents left join categories on torrents.category = categories.id WHERE torrents.id = ".sqlesc($id)) or sqlerr(__FILE__, __LINE__);
|
$res = sql_query("SELECT torrents.name, torrents.filename, torrents.save_as, torrents.size, torrents.owner, torrents.banned, torrents.approval_status, torrents.price, torrents.added, categories.mode as search_box_id FROM torrents left join categories on torrents.category = categories.id WHERE torrents.id = ".sqlesc($id)) or sqlerr(__FILE__, __LINE__);
|
||||||
$row = mysql_fetch_assoc($res);
|
$row = mysql_fetch_assoc($res);
|
||||||
if (!$row) {
|
if (!$row) {
|
||||||
do_log("[TORRENT_NOT_EXISTS_IN_DATABASE] $id");
|
do_log("[TORRENT_NOT_EXISTS_IN_DATABASE] $id");
|
||||||
@@ -140,10 +143,13 @@ if (strlen($CURUSER['passkey']) != 32) {
|
|||||||
$CURUSER['passkey'] = md5($CURUSER['username'].date("Y-m-d H:i:s").$CURUSER['passhash']);
|
$CURUSER['passkey'] = md5($CURUSER['username'].date("Y-m-d H:i:s").$CURUSER['passhash']);
|
||||||
sql_query("UPDATE users SET passkey=".sqlesc($CURUSER['passkey'])." WHERE id=".sqlesc($CURUSER['id']));
|
sql_query("UPDATE users SET passkey=".sqlesc($CURUSER['passkey'])." WHERE id=".sqlesc($CURUSER['id']));
|
||||||
}
|
}
|
||||||
$dict = \Rhilip\Bencode\Bencode::load($fn);
|
$dict = TorrentFile::load($fn);
|
||||||
$dict['announce'] = get_tracker_schema_and_host($CURUSER['tracker_url_id'], true) . "?passkey=" . $CURUSER['passkey'];
|
$dict->cleanRootFields();
|
||||||
$dict['comment'] = getSchemeAndHttpHost(true) . "/details.php?id=" . $id;
|
$dict->setAnnounce(get_tracker_schema_and_host($CURUSER['tracker_url_id'], true) . "?passkey=" . $CURUSER['passkey']);
|
||||||
do_log(sprintf("[ANNOUNCE_URL], user: %s, torrent: %s, url: %s", $CURUSER['id'] ?? '', $id, $dict['announce']));
|
$dict->setComment(getSchemeAndHttpHost(true) . "/details.php?id=" . $id);
|
||||||
|
$dict->setCreatedBy($SITENAME);
|
||||||
|
$dict->setCreationDate(strtotime($row['added']));
|
||||||
|
do_log(sprintf("[ANNOUNCE_URL], user: %s, torrent: %s, url: %s", $CURUSER['id'] ?? '', $id, $dict->getAnnounce()));
|
||||||
/**
|
/**
|
||||||
* does not support multi-tracker
|
* does not support multi-tracker
|
||||||
*
|
*
|
||||||
@@ -197,30 +203,10 @@ header ("Content-Transfer-Encoding: binary");
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
header("Content-Type: application/x-bittorrent");
|
header("Content-Type: application/x-bittorrent");
|
||||||
|
header("Content-Disposition: " . make_content_disposition($torrentnameprefix . $row["save_as"] . '.torrent'));
|
||||||
if ( str_replace("Gecko", "", $_SERVER['HTTP_USER_AGENT']) != $_SERVER['HTTP_USER_AGENT'])
|
|
||||||
{
|
|
||||||
header ("Content-Disposition: attachment; filename=\"$torrentnameprefix.".$row["save_as"].".torrent\" ; charset=utf-8");
|
|
||||||
}
|
|
||||||
else if ( str_replace("Firefox", "", $_SERVER['HTTP_USER_AGENT']) != $_SERVER['HTTP_USER_AGENT'] )
|
|
||||||
{
|
|
||||||
header ("Content-Disposition: attachment; filename=\"$torrentnameprefix.".$row["save_as"].".torrent\" ; charset=utf-8");
|
|
||||||
}
|
|
||||||
else if ( str_replace("Opera", "", $_SERVER['HTTP_USER_AGENT']) != $_SERVER['HTTP_USER_AGENT'] )
|
|
||||||
{
|
|
||||||
header ("Content-Disposition: attachment; filename=\"$torrentnameprefix.".$row["save_as"].".torrent\" ; charset=utf-8");
|
|
||||||
}
|
|
||||||
else if ( str_replace("IE", "", $_SERVER['HTTP_USER_AGENT']) != $_SERVER['HTTP_USER_AGENT'] )
|
|
||||||
{
|
|
||||||
header ("Content-Disposition: attachment; filename=".str_replace("+", "%20", rawurlencode("$torrentnameprefix." . $row["save_as"] .".torrent")));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
header ("Content-Disposition: attachment; filename=".str_replace("+", "%20", rawurlencode("$torrentnameprefix." . $row["save_as"] .".torrent")));
|
|
||||||
}
|
|
||||||
|
|
||||||
//header ("Content-Disposition: attachment; filename=".$row["filename"]."");
|
//header ("Content-Disposition: attachment; filename=".$row["filename"]."");
|
||||||
//ob_implicit_flush(true);
|
//ob_implicit_flush(true);
|
||||||
//print(benc($dict));
|
//print(benc($dict));
|
||||||
echo \Rhilip\Bencode\Bencode::encode($dict);
|
echo $dict->dumpToString();
|
||||||
?>
|
?>
|
||||||
|
|||||||
+32
-74
@@ -1,5 +1,8 @@
|
|||||||
<?php
|
<?php
|
||||||
//require_once("../include/benc.php");
|
//require_once("../include/benc.php");
|
||||||
|
use Rhilip\Bencode\ParseException;
|
||||||
|
use Rhilip\Bencode\TorrentFile;
|
||||||
|
|
||||||
require_once("../include/bittorrent.php");
|
require_once("../include/bittorrent.php");
|
||||||
|
|
||||||
ini_set("upload_max_filesize",$max_torrent_size);
|
ini_set("upload_max_filesize",$max_torrent_size);
|
||||||
@@ -83,13 +86,11 @@ $audiocodecid = intval($_POST["audiocodec_sel"][$catmod] ?? 0);
|
|||||||
if (!is_valid_id($catid))
|
if (!is_valid_id($catid))
|
||||||
bark($lang_takeupload['std_category_unselected']);
|
bark($lang_takeupload['std_category_unselected']);
|
||||||
|
|
||||||
if (!validfilename($fname))
|
|
||||||
bark($lang_takeupload['std_invalid_filename']);
|
|
||||||
if (!preg_match('/^(.+)\.torrent$/si', $fname, $matches))
|
if (!preg_match('/^(.+)\.torrent$/si', $fname, $matches))
|
||||||
bark($lang_takeupload['std_filename_not_torrent']);
|
bark($lang_takeupload['std_filename_not_torrent']);
|
||||||
$shortfname = $torrent = $matches[1];
|
$shortfname = $torrent = $matches[1];
|
||||||
if (!empty($_POST["name"]))
|
if (!empty($_POST["name"]))
|
||||||
$torrent = unesc($_POST["name"]);
|
$torrent = trim(unesc($_POST["name"]));
|
||||||
if ($f['size'] > $max_torrent_size)
|
if ($f['size'] > $max_torrent_size)
|
||||||
bark($lang_takeupload['std_torrent_file_too_big'].number_format($max_torrent_size).$lang_takeupload['std_remake_torrent_note']);
|
bark($lang_takeupload['std_torrent_file_too_big'].number_format($max_torrent_size).$lang_takeupload['std_remake_torrent_note']);
|
||||||
$tmpname = $f["tmp_name"];
|
$tmpname = $f["tmp_name"];
|
||||||
@@ -108,79 +109,36 @@ if ($maxPrice > 0 && isset($_POST['price']) && $_POST['price'] > $maxPrice && $p
|
|||||||
}
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
$dict = \Rhilip\Bencode\Bencode::load($tmpname);
|
$dict = TorrentFile::load($tmpname);
|
||||||
} catch (\Rhilip\Bencode\ParseErrorException $e) {
|
$dict->unhybridizedTo();
|
||||||
bark($lang_takeupload['std_not_bencoded_file']);
|
$dict->parse();
|
||||||
|
} catch (ParseException $e) {
|
||||||
|
bark($e->getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
function checkTorrentDict($dict, $key, $type = null)
|
|
||||||
{
|
|
||||||
global $lang_takeupload;
|
|
||||||
|
|
||||||
if (!is_array($dict)) bark($lang_takeupload['std_not_a_dictionary']);
|
|
||||||
$value = $dict[$key];
|
|
||||||
if (!isset($value)) bark($lang_takeupload['std_dictionary_is_missing_key']);
|
|
||||||
if (!is_null($type)) {
|
|
||||||
$isFunction = 'is_' . $type;
|
|
||||||
if (function_exists($isFunction) && !$isFunction($value)) {
|
|
||||||
bark($lang_takeupload['std_invalid_entry_in_dictionary']);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
$info = checkTorrentDict($dict, 'info');
|
|
||||||
if (isset($dict['piece layers']) || isset($info['files tree']) || (isset($info['meta version']) && $info['meta version'] == 2)) {
|
|
||||||
bark('Torrent files created with Bittorrent Protocol v2, or hybrid torrents are not supported.');
|
|
||||||
}
|
|
||||||
$plen = checkTorrentDict($info, 'piece length', 'integer'); // Only Check without use
|
|
||||||
$dname = checkTorrentDict($info, 'name', 'string');
|
|
||||||
$pieces = checkTorrentDict($info, 'pieces', 'string');
|
|
||||||
|
|
||||||
if (strlen($pieces) % 20 != 0)
|
|
||||||
bark($lang_takeupload['std_invalid_pieces']);
|
|
||||||
|
|
||||||
$filelist = array();
|
|
||||||
$totallen = $info['length'] ?? null;
|
|
||||||
if (isset($totallen)) {
|
|
||||||
$filelist[] = array($dname, $totallen);
|
|
||||||
$type = "single";
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
$flist = checkTorrentDict($info, 'files', 'array');
|
|
||||||
|
|
||||||
if (!isset($flist)) bark($lang_takeupload['std_missing_length_and_files']);
|
|
||||||
if (!count($flist)) bark("no files");
|
|
||||||
|
|
||||||
$totallen = 0;
|
|
||||||
foreach ($flist as $fn) {
|
|
||||||
$ll = checkTorrentDict($fn, 'length', 'integer');
|
|
||||||
$path_key = isset($fn['path.utf-8']) ? 'path.utf-8' : 'path';
|
|
||||||
$ff = checkTorrentDict($fn, $path_key, 'list');
|
|
||||||
|
|
||||||
$totallen += $ll;
|
|
||||||
$ffa = array();
|
|
||||||
foreach ($ff as $ffe) {
|
|
||||||
if (!is_string($ffe)) bark($lang_takeupload['std_filename_errors']);
|
|
||||||
$ffa[] = $ffe;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!count($ffa)) bark($lang_takeupload['std_filename_errors']);
|
|
||||||
$ffe = implode("/", $ffa);
|
|
||||||
$filelist[] = array($ffe, $ll);
|
|
||||||
}
|
|
||||||
$type = "multi";
|
|
||||||
}
|
|
||||||
|
|
||||||
$dict['announce'] = get_protocol_prefix() . $announce_urls[0]; // change announce url to local
|
|
||||||
$dict['info']['private'] = 1;
|
|
||||||
//The following line requires uploader to re-download torrents after uploading
|
//The following line requires uploader to re-download torrents after uploading
|
||||||
//even the torrent is set as private and with uploader's passkey in it.
|
//even the torrent is set as private and with uploader's passkey in it.
|
||||||
$dict['info']['source'] = "[$BASEURL] $SITENAME";
|
$dict->cleanRootFields()
|
||||||
unset ($dict['announce-list']); // remove multi-tracker capability
|
->setComment(getSchemeAndHttpHost())
|
||||||
unset ($dict['nodes']); // remove cached peers (Bitcomet & Azareus)
|
->setCreationDate(time())
|
||||||
|
->setCreatedBy($SITENAME)
|
||||||
|
->setAnnounce(get_protocol_prefix() . $announce_urls[0]) // change announce url to local
|
||||||
|
->setPrivate(true)
|
||||||
|
->setSource("[$BASEURL] $SITENAME");
|
||||||
|
|
||||||
$infohash = pack("H*", sha1(\Rhilip\Bencode\Bencode::encode($dict['info']))); // double up on the becoding solves the occassional misgenerated infohash
|
|
||||||
|
$filelist = $dict->getFileList();
|
||||||
|
$dname = $dict->getName();
|
||||||
|
$type = $dict->getFileMode();
|
||||||
|
$totallen = $dict->getSize();
|
||||||
|
$pieces = $dict->getInfoField('pieces');
|
||||||
|
$piecesCount = strlen($pieces) / 20;
|
||||||
|
$maxPieceCount = 24576;
|
||||||
|
$idealPiecesCount = $totallen / (8 * 1024 ** 2);
|
||||||
|
if ($piecesCount > $maxPieceCount && $idealPiecesCount < $maxPieceCount) {
|
||||||
|
bark('Too many pieces');
|
||||||
|
}
|
||||||
|
$infohash = $dict->getInfoHashV1ForAnnounce();
|
||||||
$exists = \App\Models\Torrent::query()->where('info_hash', $infohash)->first(['id']);
|
$exists = \App\Models\Torrent::query()->where('info_hash', $infohash)->first(['id']);
|
||||||
if ($exists) {
|
if ($exists) {
|
||||||
// bark($lang_takeupload['std_torrent_existed']);
|
// bark($lang_takeupload['std_torrent_existed']);
|
||||||
@@ -351,7 +309,7 @@ $insert = [
|
|||||||
// 'pt_gen' => $_POST['pt_gen'] ?? '',
|
// 'pt_gen' => $_POST['pt_gen'] ?? '',
|
||||||
// 'technical_info' => $_POST['technical_info'] ?? '',
|
// 'technical_info' => $_POST['technical_info'] ?? '',
|
||||||
'cover' => $cover,
|
'cover' => $cover,
|
||||||
'pieces_hash' => sha1($info['pieces']),
|
'pieces_hash' => sha1($pieces),
|
||||||
'cache_stamp' => time(),
|
'cache_stamp' => time(),
|
||||||
];
|
];
|
||||||
/**
|
/**
|
||||||
@@ -412,7 +370,7 @@ $id = \Nexus\Database\NexusDB::insert('torrents', $insert);
|
|||||||
//$id = mysql_insert_id();
|
//$id = mysql_insert_id();
|
||||||
|
|
||||||
$torrentFilePath = "$torrentSavePath/$id.torrent";
|
$torrentFilePath = "$torrentSavePath/$id.torrent";
|
||||||
$saveResult = \Rhilip\Bencode\Bencode::dump($torrentFilePath, $dict);
|
$saveResult = $dict->dump($torrentFilePath);
|
||||||
if ($saveResult === false) {
|
if ($saveResult === false) {
|
||||||
sql_query("delete from torrents where id = $id limit 1");
|
sql_query("delete from torrents where id = $id limit 1");
|
||||||
bark("save torrent to $torrentFilePath fail.");
|
bark("save torrent to $torrentFilePath fail.");
|
||||||
@@ -442,7 +400,7 @@ if (!empty($tagIdArr)) {
|
|||||||
|
|
||||||
@sql_query("DELETE FROM files WHERE torrent = $id");
|
@sql_query("DELETE FROM files WHERE torrent = $id");
|
||||||
foreach ($filelist as $file) {
|
foreach ($filelist as $file) {
|
||||||
@sql_query("INSERT INTO files (torrent, filename, size) VALUES ($id, ".sqlesc($file[0]).",".$file[1].")");
|
@sql_query("INSERT INTO files (torrent, filename, size) VALUES ($id, ".sqlesc($file['path']).",".$file['size'].")");
|
||||||
}
|
}
|
||||||
$extra['torrent_id'] = $id;
|
$extra['torrent_id'] = $id;
|
||||||
\App\Models\TorrentExtra::query()->create($extra);
|
\App\Models\TorrentExtra::query()->create($extra);
|
||||||
|
|||||||
Reference in New Issue
Block a user