1
0
mirror of https://github.com/AlexKrunch/AnonIB-3D.git synced 2024-11-16 09:31:05 -05:00
AnonIB-3D/src_php/php/Libs/php-bittorrent.phar

58 lines
15 KiB
Plaintext
Raw Normal View History

2019-08-17 04:21:07 -04:00
<?php
/**
* PHP BitTorrent
*
* Copyright (c) 2011-2013, Christer Edvartsen <cogo@starzinger.net>
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to
* deal in the Software without restriction, including without limitation the
* rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
* sell copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* * The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
* AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
* IN THE SOFTWARE.
*
* @package PHPBitTorrent
* @author Christer Edvartsen <cogo@starzinger.net>
* @copyright Copyright (c) 2011-2013, Christer Edvartsen <cogo@starzinger.net>
* @license http://www.opensource.org/licenses/mit-license MIT License
* @link https://github.com/christeredvartsen/php-bittorrent
* @version 1.1.0
*/
Phar::mapPhar();
$basePath = 'phar://' . __FILE__;
spl_autoload_register(function($class) use ($basePath) {
if (strpos($class, 'PHP\\BitTorrent\\') !== 0) {
return false;
}
$file = $basePath . DIRECTORY_SEPARATOR . substr(str_replace('\\', DIRECTORY_SEPARATOR, $class), 4) . '.php';
if (file_exists($file)) {
require $file;
return true;
}
return false;
});
__HALT_COMPILER(); ?>
E BitTorrent/<00><01>P<00>BitTorrent/EncoderInterface.php<68><00><01>P<EFBFBD>Ke<4B>]<5D>BitTorrent/Encoder.php<68><00><01>P<EFBFBD>ڳ<><DAB3><EFBFBD>BitTorrent/Torrent.php+<00><01>P+q<>'<27><>BitTorrent/Decoder.php<68> <00><01>P<EFBFBD> <1B><><EFBFBD><EFBFBD>BitTorrent/DecoderInterface.php <00><01>P ;Q,b<><?php
namespace PHP\BitTorrent; interface EncoderInterface { function setParam($key, $value); function encode($var); function encodeInteger($integer); function encodeString($string); function encodeList($list); function encodeDictionary($dictionary); } <?php
namespace PHP\BitTorrent; use InvalidArgumentException; class Encoder implements EncoderInterface { private $params = array( 'encodeEmptyArrayAsDictionary' => false, ); public function __construct(array $params = array()) { $this->params = array_replace($this->params, $params); } public function setParam($key, $value) { $this->params[$key] = $value; return $this; } public function encode($var) { if ($this->isInt($var)) { return $this->encodeInteger($var); } else if (is_string($var)) { return $this->encodeString($var); } else if (is_array($var)) { $size = count($var); if (!$size && $this->params['encodeEmptyArrayAsDictionary']) { return $this->encodeDictionary($var); } for ($i = 0; $i < $size; $i++) { if (!isset($var[$i])) { return $this->encodeDictionary($var); } } return $this->encodeList($var); } throw new InvalidArgumentException('Variables of type ' . gettype($var) . ' can not be encoded.'); } public function encodeInteger($integer) { if ($this->isInt($integer)) { return 'i' . $integer . 'e'; } throw new InvalidArgumentException('Expected an integer.'); } public function encodeString($string) { if (!is_string($string)) { throw new InvalidArgumentException('Expected string, got: ' . gettype($string) . '.'); } return strlen($string) . ':' . $string; } public function encodeList($list) { if (!is_array($list)) { throw new InvalidArgumentException('Expected array, got: ' . gettype($list) . '.'); } $ret = 'l'; foreach ($list as $value) { $ret .= $this->encode($value); } return $ret . 'e'; } public function encodeDictionary($dictionary) { if (!is_array($dictionary)) { throw new InvalidArgumentException('Expected array, got: ' . gettype($dictionary) . '.'); } ksort($dictionary); $ret = 'd'; foreach ($dictionary as $key => $value) { $ret .= $this->encodeString((string) $key) . $this->encode($value); } return $ret . 'e'; } private function isInt($var) { return is_int($var) || (PHP_INT_SIZE === 4 && is_numeric($var) && (strpos($var, '.') === false)); } } <?php
namespace PHP\BitTorrent; use RecursiveDirectoryIterator, RecursiveIteratorIterator, RuntimeException, InvalidArgumentException; class Torrent { private $pieceLengthExp = 18; private $announce; private $announceList; private $comment; private $createdBy = 'PHP BitTorrent'; private $createdAt; private $info; private $extraMeta; public function __construct($announceUrl = null) { if ($announceUrl !== null) { $this->setAnnounce($announceUrl); } } static public function createFromTorrentFile($path, DecoderInterface $decoder = null) { if (!is_file($path)) { throw new InvalidArgumentException($path . ' does not exist.'); } if ($decoder === null) { $decoder = new Decoder(); } $decodedFile = $decoder->decodeFile($path); $torrent = new static(); if (isset($decodedFile['announce'])) { $torrent->setAnnounce($decodedFile['announce']); unset($decodedFile['announce']); } if (isset($decodedFile['announce-list'])) { $torrent->setAnnounceList($decodedFile['announce-list']); unset($decodedFile['announce-list']); } if (isset($decodedFile['comment'])) { $torrent->setComment($decodedFile['comment']); unset($decodedFile['comment']); } if (isset($decodedFile['created by'])) { $torrent->setCreatedBy($decodedFile['created by']); unset($decodedFile['created by']); } if (isset($decodedFile['creation date'])) { $torrent->setCreatedAt($decodedFile['creation date']); unset($decodedFile['creation date']); } if (isset($decodedFile['info'])) { $torrent->setInfo($decodedFile['info']); unset($decodedFile['info']); } if (count($decodedFile) > 0) { $torrent->setExtraMeta($decodedFile); } return $torrent; } static public function createFromPath($path, $announceUrl) { $torrent = new static($announceUrl); $files = array(); $absolutePath = realpath($path); $pathIsFile = false; if (is_file($absolutePath)) { $pathIsFile = true; $files[] = array( 'filename' => basename($absolutePath), 'filesize' => filesize($absolutePath), ); } else if (is_dir($absolutePath)) { $dir = new RecursiveDirectoryIterator($absolutePath); $iterator = new RecursiveIteratorIterator($dir); foreach ($iterator as $entry) { $filename = $entry->getFilename(); if ($filename === '.' || $filename === '..') { continue; } $files[] = array( 'filename' => str_replace($absolutePath . DIRECTORY_SEPARATOR, '', (string) $entry), 'filesize' => $entry->getSize(), ); } } else { throw new InvalidArgumentException('Invalid path: ' . $path); } $info = array( 'piece length' => pow(2, $torrent->getPieceLengthExp()) ); $pieces = array(); if ($pathIsFile) { $filePath = dirname($absolutePath); $info['name'] = $files[0]['filename']; $info['length'] = $files[0]['filesize']; $position = 0; $fp = fopen($filePath . DIRECTORY_SEPARATOR . $files[0]['filename'], 'rb'); while ($position < $info['length']) { $part = fread($fp, min($info['piece length'], $info['length'] - $position)); $pieces[] = sha1($part, true); $position += $info['piece length']; if ($position > $info['length']) { $position = $info['length']; } } fclose($fp); $pieces = implode('', $pieces); } else { $info['name'] = basename($absolutePath); usort($files, function($a, $b) { if ($a['filename'] < $b['filename']) { return -1; } else if ($a['filename'] > $b['filename']) { return 1; } return 0; }); $part = ''; $done = 0; foreach ($files as $file) { $filename = $file['filename']; $filesize = $file['filesize']; $info['files'][] = array( 'length' => $filesize, 'path' => explode(DIRECTORY_SEPARATOR, $filename) ); $position = 0; $fp = fopen($absolutePath . DIRECTORY_SEPARATOR . $filename, 'rb'); while ($position < $filesize) { $bytes = min(($filesize - $position), ($info['piece length'] - $done)); $part .= fread($fp, $bytes); $done += $bytes; $position += $bytes; if ($done === $info['piece length']) { $pieces[] = sha1($part, true); $part = ''; $done = 0; } } fclose($fp); } if ($done > 0) { $pieces[] = sha1($part, true); } $pieces = implode('', $pieces); } $info['pieces'] = $pieces; ksort($info); $torrent->setInfo($info); return $torrent; } public function setPieceLengthExp($pieceLengthExp) { $this->pieceLengthExp = (int) $pieceLengthExp; return $this; } public functio
namespace PHP\BitTorrent; use InvalidArgumentException; class Decoder implements DecoderInterface { private $encoder; public function __construct(EncoderInterface $encoder = null) { if ($encoder === null) { $encoder = new Encoder(); } $this->encoder = $encoder; } public function decodeFile($file, $strict = false) { if (!is_readable($file)) { throw new InvalidArgumentException('File ' . $file . ' does not exist or can not be read.'); } $dictionary = $this->decodeDictionary(file_get_contents($file, true)); if ($strict) { if (!isset($dictionary['announce']) || !is_string($dictionary['announce'])) { throw new InvalidArgumentException('Missing "announce" key.'); } else if (!isset($dictionary['info']) || !is_array($dictionary['info'])) { throw new InvalidArgumentException('Missing "info" key.'); } } return $dictionary; } public function decode($string) { if ($string[0] === 'i') { return $this->decodeInteger($string); } else if ($string[0] === 'l') { return $this->decodeList($string); } else if ($string[0] === 'd') { return $this->decodeDictionary($string); } else if (preg_match('/^\d+:/', $string)) { return $this->decodeString($string); } throw new InvalidArgumentException('Parameter is not correctly encoded.'); } public function decodeInteger($integer) { if ($integer[0] !== 'i' || (!$ePos = strpos($integer, 'e'))) { throw new InvalidArgumentException('Invalid integer. Integers must start wth "i" and end with "e".'); } $integer = substr($integer, 1, ($ePos - 1)); $len = strlen($integer); if (($integer[0] === '0' && $len > 1) || ($integer[0] === '-' && $integer[1] === '0') || !is_numeric($integer)) { throw new InvalidArgumentException('Invalid integer value.'); } if (PHP_INT_SIZE === 8) { return (int) $integer; } return $integer; } public function decodeString($string) { $stringParts = explode(':', $string, 2); if (count($stringParts) !== 2) { throw new InvalidArgumentException('Invalid string. Strings consist of two parts separated by ":".'); } $length = (int) $stringParts[0]; $lengthLen = strlen($length); if (($lengthLen + 1 + $length) > strlen($string)) { throw new InvalidArgumentException('The length of the string does not match the prefix of the encoded data.'); } return substr($string, ($lengthLen + 1), $length); } public function decodeList($list) { if ($list[0] !== 'l') { throw new InvalidArgumentException('Parameter is not an encoded list.'); } $ret = array(); $length = strlen($list); $i = 1; while ($i < $length) { if ($list[$i] === 'e') { break; } $part = substr($list, $i); $decodedPart = $this->decode($part); $ret[] = $decodedPart; $i += strlen($this->encoder->encode($decodedPart)); } return $ret; } public function decodeDictionary($dictionary) { if ($dictionary[0] !== 'd') { throw new InvalidArgumentException('Parameter is not an encoded dictionary.'); } $length = strlen($dictionary); $ret = array(); $i = 1; while ($i < $length) { if ($dictionary[$i] === 'e') { break; } $keyPart = substr($dictionary, $i); $key = $this->decodeString($keyPart); $keyPartLength = strlen($this->encoder->encodeString($key)); $valuePart = substr($dictionary, ($i + $keyPartLength)); $value = $this->decode($valuePart); $valuePartLength = strlen($this->encoder->encode($value)); $ret[$key] = $value; $i += ($keyPartLength + $valuePartLength); } return $ret; } } <?php
namespace PHP\BitTorrent; interface DecoderInterface { function decodeFile($file, $strict = false); function decode($string); function decodeInteger($integer); function decodeString($string); function decodeList($list); function decodeDictionary($dictionary); } hlH }<7D><>YVK<56>k~c<><19><>~<7E>GBMB