/*
* Uguu
*
- * @copyright Copyright (c) 2022 Go Johansson (nekunekus) <neku@pomf.se> <github.com/nokonoko>
+ * @copyright Copyright (c) 2022 Go Johansson (nokonoko) <neku@pomf.se>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
require_once 'Core.namespace.php';
use Core\Database as Database;
-use Core\Response as Response;
use Core\Settings as Settings;
class Upload
{
+
public static string $FILE_NAME;
public static string $FILE_EXTENSION;
public static string $FILE_MIME;
public static string $SHA1;
- public static int $FILE_SIZE;
public static string $NEW_NAME;
public static string $NEW_NAME_FULL;
public static string $IP;
- public mixed $file;
- /**
- * @param $file
- *
- * @return array
- */
- public function uploadFile($file): array
- {
- if (Settings::$ANTI_DUPE) {
- (new Database())->antiDupe();
- }
+ public static string $FILE_SIZE;
+ public static string $TEMP_FILE;
- self::generateName($file);
- if (!move_uploaded_file($file->tempfile, Settings::$FILES_ROOT . self::$NEW_NAME_FULL)) {
- (new Response())->returnError('500', 'Failed to move file to destination', self::$FILE_NAME);
- }
+ public function reFiles($files): array
+ {
+ $result = [];
+ $files = self::diverseArray($files);
- if (!chmod(Settings::$FILES_ROOT . self::$NEW_NAME_FULL, 0644)) {
- (new Response())->returnError('500', 'Failed to change file permissions', self::$FILE_NAME);
+ foreach ($files as $file) {
+ self::$FILE_NAME = $file['name'];
+ self::$FILE_SIZE = $file['size'];
+ self::$TEMP_FILE = $file['tmp_name'];
+ self::$SHA1 = sha1_file(self::$TEMP_FILE);
+ $result[] = [self::$FILE_NAME, self::$FILE_SIZE, self::$TEMP_FILE, self::$SHA1];
}
+ return $result;
+ }
- (new Database())->newIntoDB();
+ public function diverseArray($files): array
+ {
+ $result = [];
- return array(
- 'hash' => self::$SHA1,
- 'name' => self::$FILE_NAME,
- 'url' => Settings::$URL . rawurlencode(self::$NEW_NAME_FULL),
- 'size' => self::$FILE_SIZE
- );
+ foreach ($files as $key1 => $value1) {
+ foreach ($value1 as $key2 => $value2) {
+ $result[$key2][$key1] = $value2;
+ }
+ }
+ return $result;
}
/**
- * @param $file
- *
- * @return string
+ * @throws Exception
*/
- public function generateName($file): string
+ public function uploadFile(): array
{
- self::fileInfo($file);
+ (new Settings())->loadConfig();
+ (new Upload())->fileInfo();
- do {
- // Iterate until we reach the maximum number of retries
- if (Settings::$FILES_RETRIES === 0) {
- (new Response())->returnError('500', 'Gave up trying to find an unused name', self::$FILE_NAME);
- }
+ if (Settings::$BLACKLIST_DB) {
+ (new Database())->checkFileBlacklist();
+ }
- for ($i = 0; $i < Settings::$NAME_LENGTH; ++$i) {
- self::$NEW_NAME .= Settings::$ID_CHARSET[mt_rand(0, strlen(Settings::$ID_CHARSET))];
- }
+ if (Settings::$FILTER_MODE) {
+ self::checkMimeBlacklist();
+ self::checkExtensionBlacklist();
+ }
- // Add the extension to the file name
- if (isset(self::$FILE_EXTENSION) && self::$FILE_EXTENSION !== '') {
- self::$NEW_NAME_FULL = self::$NEW_NAME . '.' . self::$FILE_EXTENSION;
+ if (Settings::$ANTI_DUPE) {
+ $result = (new Database())->antiDupe();
+ if (isset($result)) {
+ self::$NEW_NAME_FULL = $result;
+ } else {
+ (new Upload())->generateName();
}
+ }
- // Check if the file hash is blacklisted
- if (Settings::$BLACKLIST_DB) {
- (new Database())->checkFileBlacklist();
- }
+ if (!Settings::$ANTI_DUPE) {
+ (new Upload())->generateName();
+ }
- // Check if extension or mime is blacklisted
- if (Settings::$FILTER_MODE) {
- self::checkMimeBlacklist();
- self::checkExtensionBlacklist();
- }
- } while ((new Database())->dbCheckNameExists() > 0);
+ if (!is_dir(Settings::$FILES_ROOT)) {
+ throw new Exception('File storage path not accessible.', 500);
+ }
- return self::$NEW_NAME_FULL;
+ if (!move_uploaded_file(self::$TEMP_FILE, Settings::$FILES_ROOT . self::$NEW_NAME_FULL)) {
+ throw new Exception('Failed to move file to destination', 500);
+ }
+
+ if (!chmod(Settings::$FILES_ROOT . self::$NEW_NAME_FULL, 0644)) {
+ throw new Exception('Failed to change file permissions', 500);
+ }
+
+ (new Database())->newIntoDB();
+
+ if (Settings::$SSL) {
+ $preURL = 'https://';
+ } else {
+ $preURL = 'http://';
+ }
+
+ return [
+ 'hash' => self::$SHA1,
+ 'name' => self::$FILE_NAME,
+ 'url' => $preURL . Settings::$URL . '/' . rawurlencode(self::$NEW_NAME_FULL),
+ 'size' => self::$FILE_SIZE
+ ];
}
- /**
- * @param $file
- *
- * @return void
- */
- public function fileInfo($file)
+ public function fileInfo()
{
if (isset($_FILES['files'])) {
- self::$FILE_NAME = $file->name;
- self::$SHA1 = sha1_file($file->tempfile);
- self::$FILE_SIZE = $file->size;
$finfo = finfo_open(FILEINFO_MIME_TYPE);
- self::$FILE_MIME = finfo_file($finfo, $file->tempfile);
+ self::$FILE_MIME = finfo_file($finfo, self::$TEMP_FILE);
+ $extension = explode('.', self::$FILE_NAME, 2);
+ self::$FILE_EXTENSION = $extension['1'];
finfo_close($finfo);
if (Settings::$LOG_IP) {
self::$IP = $_SERVER['REMOTE_ADDR'];
} else {
- self::$IP = null;
- }
- // Check if extension is a double-dot extension and, if true, override $ext
- foreach (Settings::$DOUBLE_DOTS as $ddot) {
- if (stripos(strrev(self::$FILE_NAME), $ddot) === 0) {
- self::$FILE_EXTENSION = strrev($ddot);
- } else {
- self::$FILE_EXTENSION = pathinfo($file->name, PATHINFO_EXTENSION);
- }
+ self::$IP = '0';
}
}
}
/**
- * @return void
+ * @throws Exception
*/
public function checkMimeBlacklist()
{
if (in_array(self::$FILE_MIME, Settings::$BLOCKED_MIME)) {
- (new Response())->returnError('415', 'Filetype not allowed!', self::$FILE_NAME);
+ throw new Exception('Filetype not allowed.', 415);
}
}
/**
- * @return void
+ * @throws Exception
*/
- protected function checkExtensionBlacklist()
+ public function checkExtensionBlacklist()
{
if (in_array(self::$FILE_EXTENSION, Settings::$BLOCKED_EXTENSIONS)) {
- (new Response())->returnError('415', 'Filetype not allowed!', self::$FILE_NAME);
+ throw new Exception('Filetype not allowed.', 415);
}
}
/**
- * @param $files
- *
- * @return array
+ * @throws Exception
*/
- public function reFiles($files): array
+ public function generateName(): string
{
- $result = [];
- $files = self::diverseArray($files);
-
- foreach ($files as $file) {
- $f = $this->file;
- $f->name = $file['name'];
- $f->mime = $file['type'];
- $f->size = $file['size'];
- $f->tempfile = $file['tmp_name'];
- $f->error = $file['error'];
- $result[] = $f;
- }
- return $result;
- }
+ do {
+ if (Settings::$FILES_RETRIES === 0) {
+ throw new Exception('Gave up trying to find an unused name!', 500);
+ }
- /**
- * @param $files
- *
- * @return array
- */
- public function diverseArray($files): array
- {
- $result = [];
+ self::$NEW_NAME = '';
+ for ($i = 0; $i < Settings::$NAME_LENGTH; ++$i) {
+ self::$NEW_NAME .= Settings::$ID_CHARSET[mt_rand(0, strlen(Settings::$ID_CHARSET))];
+ }
- foreach ($files as $key1 => $value1) {
- foreach ($value1 as $key2 => $value2) {
- $result[$key2][$key1] = $value2;
+ if (isset(self::$FILE_EXTENSION)) {
+ self::$NEW_NAME_FULL = self::$NEW_NAME;
+ self::$NEW_NAME_FULL .= '.' . self::$FILE_EXTENSION;
}
- }
+ } while ((new Database())->dbCheckNameExists() > 0);
- return $result;
+ return self::$NEW_NAME_FULL;
}
}
\ No newline at end of file