true, 'h' => true, 'm4' => true, 'md' => true, 'org' => true, 'txt' => true, 'diff' => true, 'gpg' => true, 'pdf' => true, 'avif' => true, 'jpeg' => true, 'jpg' => true, 'png' => true, 'jxl' => true, 'gif' => true, 'mkv' => true, 'mp4' => true, 'webm' => true ); const LIMIT_EXT = true; // to enable the usage of the above const FORCE_HTTPS = true; //force generated links to be https:// const ADMIN_EMAIL = 'admin@chud.cyou'; //address for inquiries public static function SITE_URL() : string { $proto = ($_SERVER['HTTPS'] ?? 'off') == 'on' || CONFIG::FORCE_HTTPS ? 'https' : 'http'; return "$proto://up.{$_SERVER['HTTP_HOST']}"; } public static function SCRIPT_URL() : string { return CONFIG::SITE_URL().$_SERVER['REQUEST_URI']; } }; // generate a random string of characters with given length function rnd_str(int $len) : string { $chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-_'; $max_idx = strlen($chars) - 1; $out = ''; while ($len--) { $out .= $chars[mt_rand(0,$max_idx)]; } return $out; } // check php.ini settings and print warnings if anything's not configured properly function check_config() : void { return; $warn_config_value = function($ini_name, $var_name, $var_val) { $ini_val = intval(ini_get($ini_name)); if ($ini_val < $var_val) print("
Warning: php.ini: $ini_name ($ini_val) set lower than $var_name ($var_val)\n"); }; $warn_config_value('upload_max_filesize', 'MAX_FILESIZE', CONFIG::MAX_FILESIZE); $warn_config_value('post_max_size', 'MAX_FILESIZE', CONFIG::MAX_FILESIZE); $warn_config_value('max_input_time', 'UPLOAD_TIMEOUT', CONFIG::UPLOAD_TIMEOUT); $warn_config_value('max_execution_time', 'UPLOAD_TIMEOUT', CONFIG::UPLOAD_TIMEOUT); } //extract extension from a path (does not include the dot) function ext_by_path(string $path) : string { $ext = pathinfo($path, PATHINFO_EXTENSION); //special handling of .tar.* archives $ext2 = pathinfo(substr($path,0,-(strlen($ext)+1)), PATHINFO_EXTENSION); if ($ext2 === 'tar') { $ext = $ext2.'.'.$ext; } return $ext; } function ext_by_finfo(string $path) : string { $finfo = finfo_open(FILEINFO_EXTENSION); $finfo_ext = finfo_file($finfo, $path); finfo_close($finfo); if ($finfo_ext != '???') { return explode('/', $finfo_ext, 2)[0]; } else { $finfo = finfo_open(); $finfo_info = finfo_file($finfo, $path); finfo_close($finfo); if (strstr($finfo_info, 'text') !== false) { return 'txt'; } } return ''; } // store an uploaded file, given its name and temporary path (e.g. values straight out of $_FILES) // files are stored wit a randomised name, but with their original extension // // $name: original filename // $tmpfile: temporary path of uploaded file // $formatted: set to true to display formatted message instead of bare link function store_file(string $name, string $tmpfile, bool $formatted = false) : void { //create folder, if it doesn't exist if (!file_exists(CONFIG::STORE_PATH)) { mkdir(CONFIG::STORE_PATH, 0750, true); //TODO: error handling } //check file size $size = filesize($tmpfile); if ($size > CONFIG::MAX_FILESIZE * 1024 * 1024) { header('HTTP/1.0 413 Payload Too Large'); print("Error 413: Max File Size ({CONFIG::MAX_FILESIZE} MiB) Exceeded\n"); return; } if ($size == 0) { header('HTTP/1.0 400 Bad Request'); print('Error 400: Uploaded file is empty\n'); return; } $ext = ext_by_path($name); if (empty($ext) && CONFIG::AUTO_FILE_EXT) { $ext = ext_by_finfo($tmpfile); } $ext = substr($ext, 0, CONFIG::MAX_EXT_LEN); if (CONFIG::LIMIT_EXT) { $permitted_ext = CONFIG::PERMITTED_EXT; if ($permitted_ext[$ext] != true) { header('HTTP/1.0 400 Bad Request'); return; } } $tries_per_len=3; //try random names a few times before upping the length $id_length=CONFIG::MIN_ID_LENGTH; if(isset($_POST['id_length']) && ctype_digit($_POST['id_length'])) { $id_length = max(CONFIG::MIN_ID_LENGTH, min(CONFIG::MAX_ID_LENGTH, $_POST['id_length'])); } for ($len = $id_length; ; ++$len) { for ($n=0; $n<=$tries_per_len; ++$n) { $id = rnd_str($len); $basename = $id . (empty($ext) ? '' : '.' . $ext); $target_file = CONFIG::STORE_PATH . $basename; if (!file_exists($target_file)) break 2; } } $res = move_uploaded_file($tmpfile, $target_file); if (!$res) { //TODO: proper error handling? header('HTTP/1.0 520 Unknown Error'); return; } if (CONFIG::EXTERNAL_HOOK !== null) { putenv('REMOTE_ADDR='.$_SERVER['REMOTE_ADDR']); putenv('ORIGINAL_NAME='.$name); putenv('STORED_FILE='.$target_file); $ret = -1; $out = null; $last_line = exec(CONFIG::EXTERNAL_HOOK, $out, $ret); if ($last_line !== false && $ret !== 0) { unlink($target_file); header('HTTP/1.0 400 Bad Request'); print("Error: $last_line\n"); return; } } //print the download link of the file $url = sprintf(CONFIG::SITE_URL().'/'.CONFIG::DOWNLOAD_PATH, $basename); if ($formatted) { print("
You can upload files to this site via a simple HTTP POST, e.g. using curl:
curl -F "file=@./file" https://chud.cyou/up
Or simply choose a file and click "Upload" below:
$permitted_ext
How long a file is kept depends on its size. Larger files are deleted earlier
than small ones.
This relation is non-linear and skewed in favour of small
files.
MIN_AGE + (MAX_AGE - MIN_AGE) * (1-(FILE_SIZE/MAX_SIZE))^$decay
$alias_file
The UpChud page's source can be seen on the git.
The unmodified PHP script used to provide this service is open source and available on GitHub.
- No Porn Or Illegal Activity As Per U.S. Law.
- For programming, screenshots, small file transfer, & mildly amusing images.
If you want to report abuse of this service, or have any other inquiries, please write an email to $mail