1
0
Fork 0
mirror of synced 2024-05-19 04:02:34 +12:00

Merge remote-tracking branch 'upstream/0.7.x' into feat-dart-env

This commit is contained in:
Torsten Dittmann 2021-01-24 15:52:29 +01:00
commit 596c72bb85
37 changed files with 130 additions and 1481 deletions

5
.env
View file

@ -35,4 +35,7 @@ _APP_FUNCTIONS_CPUS=1
_APP_FUNCTIONS_MEMORY=128
_APP_FUNCTIONS_MEMORY_SWAP=128
_APP_MAINTENANCE_INTERVAL=86400
_APP_USAGE_STATS=enabled
_APP_MAINTENANCE_RETENTION_EXECUTION=1209600
_APP_MAINTENANCE_RETENTION_ABUSE=86400
_APP_MAINTENANCE_RETENTION_AUDIT=1209600
_APP_USAGE_STATS=enabled

View file

@ -100,7 +100,11 @@ ENV _APP_SERVER=swoole \
_APP_SETUP=self-hosted \
_APP_VERSION=$VERSION \
_APP_USAGE_STATS=enabled \
# 14 Days = 1209600 s
_APP_MAINTENANCE_RETENTION_EXECUTION=1209600 \
_APP_MAINTENANCE_RETENTION_AUDIT=1209600 \
# 1 Day = 86400 s
_APP_MAINTENANCE_RETENTION_ABUSE=86400 \
_APP_MAINTENANCE_INTERVAL=86400
#ENV _APP_SMTP_SECURE ''
#ENV _APP_SMTP_USERNAME ''

View file

@ -374,6 +374,30 @@ return [
'required' => false,
'question' => '',
],
[
'name' => '_APP_MAINTENANCE_RETENTION_EXECUTION',
'description' => 'The maximum duration (in seconds) upto which to retain execution logs. The default value is 1209600 seconds (14 days).',
'introduction' => '0.7.0',
'default' => '1209600',
'required' => false,
'question' => '',
],
[
'name' => '_APP_MAINTENANCE_RETENTION_AUDIT',
'description' => 'IThe maximum duration (in seconds) upto which to retain audit logs. The default value is 1209600 seconds (14 days).',
'introduction' => '0.7.0',
'default' => '1209600',
'required' => false,
'question' => '',
],
[
'name' => '_APP_MAINTENANCE_RETENTION_ABUSE',
'description' => 'The maximum duration (in seconds) upto which to retain abuse logs. The default value is 86400 seconds (1 day).',
'introduction' => '0.7.0',
'default' => '86400',
'required' => false,
'question' => '',
]
],
],
],

View file

@ -4,11 +4,11 @@ use Appwrite\Database\Database;
use Appwrite\Database\Document;
use Appwrite\Database\Validator\Authorization;
use Appwrite\Database\Validator\UID;
use Appwrite\Storage\Storage;
use Appwrite\Storage\Validator\File;
use Appwrite\Storage\Validator\FileSize;
use Appwrite\Storage\Validator\FileType;
use Appwrite\Storage\Validator\Upload;
use Utopia\Storage\Storage;
use Utopia\Storage\Validator\File;
use Utopia\Storage\Validator\FileSize;
use Utopia\Storage\Validator\FileType;
use Utopia\Storage\Validator\Upload;
use Appwrite\Utopia\Response;
use Appwrite\Task\Validator\Cron;
use Utopia\App;

View file

@ -2,8 +2,8 @@
use Utopia\App;
use Utopia\Exception;
use Appwrite\Storage\Device\Local;
use Appwrite\Storage\Storage;
use Utopia\Storage\Device\Local;
use Utopia\Storage\Storage;
use Appwrite\ClamAV\Network;
use Appwrite\Event\Event;

View file

@ -13,11 +13,11 @@ use Appwrite\ClamAV\Network;
use Appwrite\Database\Database;
use Appwrite\Database\Document;
use Appwrite\Database\Validator\UID;
use Appwrite\Storage\Storage;
use Appwrite\Storage\Validator\File;
use Appwrite\Storage\Validator\FileSize;
use Appwrite\Storage\Validator\Upload;
use Appwrite\Storage\Compression\Algorithms\GZIP;
use Utopia\Storage\Storage;
use Utopia\Storage\Validator\File;
use Utopia\Storage\Validator\FileSize;
use Utopia\Storage\Validator\Upload;
use Utopia\Storage\Compression\Algorithms\GZIP;
use Appwrite\Resize\Resize;
use Appwrite\OpenSSL\OpenSSL;
use Appwrite\Utopia\Response;

View file

@ -14,8 +14,8 @@ use Appwrite\Database\Database;
use Appwrite\Database\Document;
use Appwrite\Database\Validator\Authorization;
use Appwrite\Network\Validator\Origin;
use Appwrite\Storage\Device\Local;
use Appwrite\Storage\Storage;
use Utopia\Storage\Device\Local;
use Utopia\Storage\Storage;
use Appwrite\Utopia\Response\Filters\V06;
use Utopia\CLI\Console;
@ -83,9 +83,6 @@ App::init(function ($utopia, $request, $response, $console, $project, $user, $lo
: '.'.$request->getHostname()
);
Storage::setDevice('files', new Local(APP_STORAGE_UPLOADS.'/app-'.$project->getId()));
Storage::setDevice('functions', new Local(APP_STORAGE_FUNCTIONS.'/app-'.$project->getId()));
/*
* Response format
*/

View file

@ -8,7 +8,7 @@ use Utopia\Validator\Numeric;
use Utopia\Validator\Text;
use Utopia\Validator\ArrayList;
use Utopia\Validator\Host;
use Appwrite\Storage\Validator\File;
use Utopia\Storage\Validator\File;
App::get('/v1/mock/tests/foo')
->desc('Mock a get request for SDK tests')

View file

@ -6,8 +6,8 @@ use Utopia\App;
use Utopia\Exception;
use Utopia\Abuse\Abuse;
use Utopia\Abuse\Adapters\TimeLimit;
use Appwrite\Storage\Device\Local;
use Appwrite\Storage\Storage;
use Utopia\Storage\Device\Local;
use Utopia\Storage\Storage;
App::init(function ($utopia, $request, $response, $project, $user, $register, $events, $audits, $usage, $deletes) {
/** @var Utopia\App $utopia */

View file

@ -7,7 +7,7 @@ use Utopia\Domains\Domain;
use Appwrite\Database\Database;
use Appwrite\Database\Validator\Authorization;
use Appwrite\Database\Validator\UID;
use Appwrite\Storage\Storage;
use Utopia\Storage\Storage;
App::init(function ($layout) {
/** @var Utopia\View $layout */

View file

@ -3,8 +3,8 @@
global $cli;
use Appwrite\ClamAV\Network;
use Appwrite\Storage\Device\Local;
use Appwrite\Storage\Storage;
use Utopia\Storage\Device\Local;
use Utopia\Storage\Storage;
use Utopia\App;
use Utopia\CLI\Console;
use Utopia\Domains\Domain;

View file

@ -12,10 +12,11 @@ Console::title('Maintenance V1');
Console::success(APP_NAME.' maintenance process v1 has started');
function notifyDeleteExecutionLogs()
function notifyDeleteExecutionLogs(int $interval)
{
Resque::enqueue(Event::DELETE_QUEUE_NAME, Event::DELETE_CLASS_NAME, [
'type' => DELETE_TYPE_EXECUTIONS
'type' => DELETE_TYPE_EXECUTIONS,
'timestamp' => time() - $interval
]);
}
@ -41,14 +42,15 @@ $cli
->action(function () {
// # of days in seconds (1 day = 86400s)
$interval = (int) App::getEnv('_APP_MAINTENANCE_INTERVAL', '86400');
$executionLogsRetention = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_EXECUTION', '1209600');
$auditLogRetention = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_AUDIT', '1209600');
$abuseLogsRetention = (int) App::getEnv('_APP_MAINTENANCE_RETENTION_ABUSE', '86400');
Console::loop(function() use ($interval){
Console::loop(function() use ($interval, $executionLogsRetention, $abuseLogsRetention, $auditLogRetention){
$time = date('d-m-Y H:i:s', time());
Console::info("[{$time}] Notifying deletes workers every {$interval} seconds");
notifyDeleteExecutionLogs();
notifyDeleteAbuseLogs($interval);
notifyDeleteAuditLogs($interval);
notifyDeleteExecutionLogs($executionLogsRetention);
notifyDeleteAbuseLogs($abuseLogsRetention);
notifyDeleteAuditLogs($auditLogRetention);
}, $interval);
});

View file

@ -279,11 +279,10 @@ services:
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_MAINTENANCE_INTERVAL
- _APP_DB_HOST
- _APP_DB_PORT
- _APP_DB_SCHEMA
- _APP_DB_USER
- _APP_DB_PASS
- _APP_MAINTENANCE_RETENTION_EXECUTION
- _APP_MAINTENANCE_RETENTION_ABUSE
- _APP_MAINTENANCE_RETENTION_AUDIT
appwrite-schedule:
image: appwrite/appwrite:<?php echo $version."\n"; ?>

View file

@ -5,7 +5,7 @@ use Appwrite\Database\Adapter\MySQL as MySQLAdapter;
use Appwrite\Database\Adapter\Redis as RedisAdapter;
use Appwrite\Database\Document;
use Appwrite\Database\Validator\Authorization;
use Appwrite\Storage\Device\Local;
use Utopia\Storage\Device\Local;
use Utopia\Abuse\Abuse;
use Utopia\Abuse\Adapters\TimeLimit;
use Utopia\CLI\Console;
@ -59,7 +59,7 @@ class DeletesV1
break;
case DELETE_TYPE_EXECUTIONS:
$this->deleteExecutionLogs();
$this->deleteExecutionLogs($this->args['timestamp']);
break;
case DELETE_TYPE_AUDIT:
@ -121,16 +121,17 @@ class DeletesV1
], $this->getProjectDB($projectId));
}
protected function deleteExecutionLogs()
protected function deleteExecutionLogs($timestamp)
{
$this->deleteForProjectIds(function($projectId) {
$this->deleteForProjectIds(function($projectId) use ($timestamp) {
if (!($projectDB = $this->getProjectDB($projectId))) {
throw new Exception('Failed to get projectDB for project '.$projectId);
}
// Delete Executions
$this->deleteByGroup([
'$collection='.Database::SYSTEM_COLLECTION_EXECUTIONS
'$collection='.Database::SYSTEM_COLLECTION_EXECUTIONS,
'dateCreated<'.$timestamp
], $projectDB);
});
}

View file

@ -46,6 +46,7 @@
"utopia-php/domains": "0.2.*",
"utopia-php/swoole": "0.2.*",
"utopia-php/system": "0.3.*",
"utopia-php/storage": "0.1.*",
"resque/php-resque": "1.3.6",
"matomo/device-detector": "3.13.0",

52
composer.lock generated
View file

@ -1695,6 +1695,58 @@
},
"time": "2020-10-24T08:51:37+00:00"
},
{
"name": "utopia-php/storage",
"version": "0.1.0",
"source": {
"type": "git",
"url": "https://github.com/utopia-php/storage.git",
"reference": "00e9045cee6bd1ec1d1f27329c329494ef420c19"
},
"dist": {
"type": "zip",
"url": "https://api.github.com/repos/utopia-php/storage/zipball/00e9045cee6bd1ec1d1f27329c329494ef420c19",
"reference": "00e9045cee6bd1ec1d1f27329c329494ef420c19",
"shasum": ""
},
"require": {
"php": ">=7.4",
"utopia-php/framework": "0.10.0"
},
"require-dev": {
"phpunit/phpunit": "^9.3",
"vimeo/psalm": "4.0.1"
},
"type": "library",
"autoload": {
"psr-4": {
"Utopia\\Storage\\": "src/Storage"
}
},
"notification-url": "https://packagist.org/downloads/",
"license": [
"MIT"
],
"authors": [
{
"name": "Eldad Fux",
"email": "eldad@appwrite.io"
}
],
"description": "A simple Storage library to manage application storage",
"keywords": [
"framework",
"php",
"storage",
"upf",
"utopia"
],
"support": {
"issues": "https://github.com/utopia-php/storage/issues",
"source": "https://github.com/utopia-php/storage/tree/0.1.0"
},
"time": "2021-01-22T07:27:20+00:00"
},
{
"name": "utopia-php/swoole",
"version": "0.2.0",

View file

@ -330,6 +330,9 @@ services:
- _APP_REDIS_HOST
- _APP_REDIS_PORT
- _APP_MAINTENANCE_INTERVAL
- _APP_MAINTENANCE_RETENTION_EXECUTION
- _APP_MAINTENANCE_RETENTION_ABUSE
- _APP_MAINTENANCE_RETENTION_AUDIT
appwrite-schedule:
entrypoint: schedule

View file

@ -218,7 +218,7 @@ class OpenAPI3 extends Format
$node['schema']['x-example'] = '{}';
//$node['schema']['format'] = 'json';
break;
case 'Appwrite\Storage\Validator\File':
case 'Utopia\Storage\Validator\File':
$consumes = ['multipart/form-data'];
$node['schema']['type'] = 'string';
$node['schema']['format'] = 'binary';

View file

@ -210,7 +210,7 @@ class Swagger2 extends Format
$node['x-example'] = '{}';
//$node['format'] = 'json';
break;
case 'Appwrite\Storage\Validator\File':
case 'Utopia\Storage\Validator\File':
$consumes = ['multipart/form-data'];
$node['type'] = 'file';
break;

View file

@ -1,45 +0,0 @@
<?php
namespace Appwrite\Storage\Compression\Algorithms;
use Appwrite\Storage\Compression\Compression;
class GZIP extends Compression
{
/**
* @return string
*/
public function getName(): string
{
return 'gzip';
}
/**
* Compress.
*
* We use gzencode over gzcompress for better support of the first format among other tools.
* (http://stackoverflow.com/a/621987/2299554)
*
* @see http://php.net/manual/en/function.gzencode.php
*
* @param string $data
*
* @return string
*/
public function compress(string $data):string
{
return \gzencode($data);
}
/**
* Decompress.
*
* @param string $data
*
* @return string
*/
public function decompress(string $data):string
{
return \gzdecode($data);
}
}

View file

@ -1,27 +0,0 @@
<?php
namespace Appwrite\Storage\Compression;
abstract class Compression
{
/**
* Return the name of compression algorithm.
*
* @return string
*/
abstract public function getName(): string;
/**
* @param $data
*
* @return string
*/
abstract public function compress(string $data);
/**
* @param $data
*
* @return string
*/
abstract public function decompress(string $data);
}

View file

@ -1,167 +0,0 @@
<?php
namespace Appwrite\Storage;
use Exception;
abstract class Device
{
/**
* Get Name.
*
* Get storage device name
*
* @return string
*/
abstract public function getName(): string;
/**
* Get Description.
*
* Get storage device description and purpose.
*
* @return string
*/
abstract public function getDescription(): string;
/**
* Get Root.
*
* Get storage device root path
*
* @return string
*/
abstract public function getRoot(): string;
/**
* Get Path.
*
* Each device hold a complex directory structure that is being build in this method.
*
* @param $filename
*
* @return string
*/
abstract public function getPath($filename): string;
/**
* Upload.
*
* Upload a file to desired destination in the selected disk, return true on success and false on failure.
*
* @param string $source
* @param string $path
*
* @throws \Exception
*
* @return bool
*/
abstract public function upload($source, $path): bool;
/**
* Read file by given path.
*
* @param string $path
*
* @return string
*/
abstract public function read(string $path): string;
/**
* Write file by given path.
*
* @param string $path
* @param string $data
*
* @return bool
*/
abstract public function write(string $path, string $data): bool;
/**
* Move file from given source to given path, return true on success and false on failure.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param string $source
* @param string $target
*
* @return bool
*/
abstract public function move(string $source, string $target): bool;
/**
* Delete file in given path return true on success and false on failure.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param string $path
* @param bool $recursive
*
* @return bool
*/
abstract public function delete(string $path, bool $recursive = false): bool;
/**
* Returns given file path its size.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param $path
*
* @return int
*/
abstract public function getFileSize(string $path): int;
/**
* Returns given file path its mime type.
*
* @see http://php.net/manual/en/function.mime-content-type.php
*
* @param $path
*
* @return string
*/
abstract public function getFileMimeType(string $path): string;
/**
* Returns given file path its MD5 hash value.
*
* @see http://php.net/manual/en/function.md5-file.php
*
* @param $path
*
* @return string
*/
abstract public function getFileHash(string $path): string;
/**
* Get directory size in bytes.
*
* Return -1 on error
*
* Based on http://www.jonasjohn.de/snippets/php/dir-size.htm
*
* @param $path
*
* @return int
*/
abstract public function getDirectorySize(string $path): int;
/**
* Get Partition Free Space.
*
* disk_free_space Returns available space on filesystem or disk partition
*
* @return float
*/
abstract public function getPartitionFreeSpace(): float;
/**
* Get Partition Total Space.
*
* disk_total_space Returns the total size of a filesystem or disk partition
*
* @return float
*/
abstract public function getPartitionTotalSpace(): float;
}

View file

@ -1,280 +0,0 @@
<?php
namespace Appwrite\Storage\Device;
use Exception;
use Appwrite\Storage\Device;
class Local extends Device
{
/**
* @var string
*/
protected $root = 'temp';
/**
* Local constructor.
*
* @param string $root
*/
public function __construct($root = '')
{
$this->root = $root;
}
/**
* @return string
*/
public function getName():string
{
return 'Local Storage';
}
/**
* @return string
*/
public function getDescription():string
{
return 'Adapter for Local storage that is in the physical or virtual machine or mounted to it.';
}
/**
* @return string
*/
public function getRoot():string
{
return $this->root;
}
/**
* @param string $filename
*
* @return string
*/
public function getPath($filename):string
{
$path = '';
for ($i = 0; $i < 4; ++$i) {
$path = ($i < \strlen($filename)) ? $path.DIRECTORY_SEPARATOR.$filename[$i] : $path.DIRECTORY_SEPARATOR.'x';
}
return $this->getRoot().$path.DIRECTORY_SEPARATOR.$filename;
}
/**
* Upload.
*
* Upload a file to desired destination in the selected disk.
*
* @param string $target
* @param string $filename
*
* @throws \Exception
*
* @return bool
*/
public function upload($source, $path):bool
{
if (!\file_exists(\dirname($path))) { // Checks if directory path to file exists
if (!@\mkdir(\dirname($path), 0755, true)) {
throw new Exception('Can\'t create directory: '.\dirname($path));
}
}
if (\move_uploaded_file($source, $path)) {
return true;
}
return false;
}
/**
* Read file by given path.
*
* @param string $path
*
* @return string
*/
public function read(string $path):string
{
return \file_get_contents($path);
}
/**
* Write file by given path.
*
* @param string $path
* @param string $data
*
* @return bool
*/
public function write(string $path, string $data): bool
{
if (!\file_exists(\dirname($path))) { // Checks if directory path to file exists
if (!@\mkdir(\dirname($path), 0755, true)) {
throw new Exception('Can\'t create directory '.\dirname($path));
}
}
return (bool)\file_put_contents($path, $data);
}
/**
* Move file from given source to given path, Return true on success and false on failure.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param string $source
* @param string $target
*
* @return bool
*/
public function move(string $source, string $target):bool
{
if (!\file_exists(\dirname($target))) { // Checks if directory path to file exists
if (!@\mkdir(\dirname($target), 0755, true)) {
throw new Exception('Can\'t create directory '.\dirname($target));
}
}
if (\rename($source, $target)) {
return true;
}
return false;
}
/**
* Delete file in given path, Return true on success and false on failure.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param string $path
* @param bool $recursive
*
* @return bool
*/
public function delete(string $path, bool $recursive = false):bool
{
if (\is_dir($path) && $recursive) {
$files = \glob($path.'*', GLOB_MARK); // GLOB_MARK adds a slash to directories returned
foreach ($files as $file) {
$this->delete($file, true);
}
\rmdir($path);
} elseif (\is_file($path)) {
return \unlink($path);
}
return false;
}
/**
* Returns given file path its size.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param $path
*
* @return int
*/
public function getFileSize(string $path):int
{
return \filesize($path);
}
/**
* Returns given file path its mime type.
*
* @see http://php.net/manual/en/function.mime-content-type.php
*
* @param $path
*
* @return string
*/
public function getFileMimeType(string $path):string
{
return \mime_content_type($path);
}
/**
* Returns given file path its MD5 hash value.
*
* @see http://php.net/manual/en/function.md5-file.php
*
* @param $path
*
* @return string
*/
public function getFileHash(string $path):string
{
return \md5_file($path);
}
/**
* Get directory size in bytes.
*
* Return -1 on error
*
* Based on http://www.jonasjohn.de/snippets/php/dir-size.htm
*
* @param $path
*
* @return int
*/
public function getDirectorySize(string $path):int
{
$size = 0;
$directory = \opendir($path);
if (!$directory) {
return -1;
}
while (($file = \readdir($directory)) !== false) {
// Skip file pointers
if ($file[0] == '.') {
continue;
}
// Go recursive down, or add the file size
if (\is_dir($path.$file)) {
$size += $this->getDirectorySize($path.$file.DIRECTORY_SEPARATOR);
} else {
$size += \filesize($path.$file);
}
}
\closedir($directory);
return $size;
}
/**
* Get Partition Free Space.
*
* disk_free_space Returns available space on filesystem or disk partition
*
* @return float
*/
public function getPartitionFreeSpace():float
{
return \disk_free_space($this->getRoot());
}
/**
* Get Partition Total Space.
*
* disk_total_space Returns the total size of a filesystem or disk partition
*
* @return float
*/
public function getPartitionTotalSpace():float
{
return \disk_total_space($this->getRoot());
}
}

View file

@ -1,196 +0,0 @@
<?php
namespace Appwrite\Storage\Device;
use Appwrite\Storage\Device;
class S3 extends Device
{
/**
* @return string
*/
public function getName():string
{
return 'S3 Storage';
}
/**
* @return string
*/
public function getDescription():string
{
return 'S3 Bucket Storage drive for AWS or on premise solution';
}
/**
* @return string
*/
public function getRoot():string
{
return '';
}
/**
* @param string $filename
*
* @return string
*/
public function getPath($filename):string
{
return '';
}
/**
* Upload.
*
* Upload a file to desired destination in the selected disk.
*
* @param string $target
* @param string $filename
*
* @throws \Exception
*
* @return bool
*/
public function upload($source, $path):bool
{
return false;
}
/**
* Read file by given path.
*
* @param string $path
*
* @return string
*/
public function read(string $path):string
{
return '';
}
/**
* Write file by given path.
*
* @param string $path
* @param string $data
*
* @return bool
*/
public function write(string $path, string $data):bool
{
return false;
}
/**
* Move file from given source to given path, Return true on success and false on failure.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param string $source
* @param string $target
*
* @return bool
*/
public function move(string $source, string $target):bool
{
return false;
}
/**
* Delete file in given path, Return true on success and false on failure.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param string $path
*
* @return bool
*/
public function delete(string $path, bool $recursive = false):bool
{
return false;
}
/**
* Returns given file path its size.
*
* @see http://php.net/manual/en/function.filesize.php
*
* @param $path
*
* @return int
*/
public function getFileSize(string $path):int
{
return 0;
}
/**
* Returns given file path its mime type.
*
* @see http://php.net/manual/en/function.mime-content-type.php
*
* @param $path
*
* @return string
*/
public function getFileMimeType(string $path):string
{
return '';
}
/**
* Returns given file path its MD5 hash value.
*
* @see http://php.net/manual/en/function.md5-file.php
*
* @param $path
*
* @return string
*/
public function getFileHash(string $path):string
{
return '';
}
/**
* Get directory size in bytes.
*
* Return -1 on error
*
* Based on http://www.jonasjohn.de/snippets/php/dir-size.htm
*
* @param $path
*
* @return int
*/
public function getDirectorySize(string $path):int
{
return 0;
}
/**
* Get Partition Free Space.
*
* disk_free_space Returns available space on filesystem or disk partition
*
* @return float
*/
public function getPartitionFreeSpace():float
{
return 0.0;
}
/**
* Get Partition Total Space.
*
* disk_total_space Returns the total size of a filesystem or disk partition
*
* @return float
*/
public function getPartitionTotalSpace():float
{
return 0.0;
}
}

View file

@ -1,113 +0,0 @@
<?php
namespace Appwrite\Storage;
use Exception;
class Storage
{
/**
* Devices.
*
* List of all available storage devices
*
* @var array
*/
public static $devices = [];
/**
* Set Device.
*
* Add device by name
*
* @param string $name
* @param Device $device
*
* @throws Exception
*
* @return void
*/
public static function setDevice($name, Device $device): void
{
self::$devices[$name] = $device;
}
/**
* Get Device.
*
* Get device by name
*
* @param string $name
*
* @return Device
*
* @throws Exception
*/
public static function getDevice($name)
{
if (!\array_key_exists($name, self::$devices)) {
throw new Exception('The device "'.$name.'" is not listed');
}
return self::$devices[$name];
}
/**
* Exists.
*
* Checks if given storage name is registered or not
*
* @param string $name
*
* @return bool
*/
public static function exists($name)
{
return (bool) \array_key_exists($name, self::$devices);
}
/**
* Human readable data size format from bytes input.
*
* Based on: https://stackoverflow.com/a/38659168/2299554
*
* @param int $bytes
* @param int $decimals
* @param string $system
*
* @return string
*/
public static function human(int $bytes, $decimals = 2, $system = 'metric')
{
$mod = ($system === 'binary') ? 1024 : 1000;
$units = array(
'binary' => array(
'B',
'KiB',
'MiB',
'GiB',
'TiB',
'PiB',
'EiB',
'ZiB',
'YiB',
),
'metric' => array(
'B',
'kB',
'MB',
'GB',
'TB',
'PB',
'EB',
'ZB',
'YB',
),
);
$factor = (int)floor((strlen((string)$bytes) - 1) / 3);
return sprintf("%.{$decimals}f%s", $bytes / pow($mod, $factor), $units[$system][$factor]);
}
}

View file

@ -1,27 +0,0 @@
<?php
namespace Appwrite\Storage\Validator;
use Utopia\Validator;
class File extends Validator
{
public function getDescription()
{
return 'File is not valid';
}
/**
* NOT MUCH RIGHT NOW.
*
* TODO think what to do here, currently only used for parameter to be present in SDKs
*
* @param mixed $name
*
* @return bool
*/
public function isValid($name)
{
return true;
}
}

View file

@ -1,37 +0,0 @@
<?php
namespace Appwrite\Storage\Validator;
use Utopia\Validator;
class FileName extends Validator
{
public function getDescription()
{
return 'Filename is not valid';
}
/**
* The file name can only contain "a-z", "A-Z", "0-9" and "-" and not empty.
*
* @param mixed $name
*
* @return bool
*/
public function isValid($name)
{
if (empty($name)) {
return false;
}
if (!is_string($name)) {
return false;
}
if (!\preg_match('/^[a-zA-Z0-9.]+$/', $name)) {
return false;
}
return true;
}
}

View file

@ -1,48 +0,0 @@
<?php
namespace Appwrite\Storage\Validator;
use Utopia\Validator;
class FileSize extends Validator
{
/**
* @var int
*/
protected $max;
/**
* Max size in bytes
*
* @param int $max
*/
public function __construct($max)
{
$this->max = $max;
}
public function getDescription()
{
return 'File size can\'t be bigger than '.$this->max;
}
/**
* Finds whether a file size is smaller than required limit.
*
* @param mixed $fileSize
*
* @return bool
*/
public function isValid($fileSize)
{
if (!is_int($fileSize)) {
return false;
}
if ($fileSize > $this->max) {
return false;
}
return true;
}
}

View file

@ -1,93 +0,0 @@
<?php
namespace Appwrite\Storage\Validator;
use Exception;
use Utopia\Validator;
class FileType extends Validator
{
/**
* File Types Constants.
*/
const FILE_TYPE_JPEG = 'jpeg';
const FILE_TYPE_GIF = 'gif';
const FILE_TYPE_PNG = 'png';
const FILE_TYPE_GZIP = 'gz';
/**
* File Type Binaries.
*
* @var array
*/
protected $types = array(
self::FILE_TYPE_JPEG => "\xFF\xD8\xFF",
self::FILE_TYPE_GIF => 'GIF',
self::FILE_TYPE_PNG => "\x89\x50\x4e\x47\x0d\x0a",
self::FILE_TYPE_GZIP => "application/x-gzip",
);
/**
* @var array
*/
protected $whiteList;
/**
* @param array $whiteList
*
* @throws Exception
*/
public function __construct(array $whiteList)
{
foreach ($whiteList as $key) {
if (!isset($this->types[$key])) {
throw new Exception('Unknown file mime type');
}
}
$this->whiteList = $whiteList;
}
public function getDescription()
{
return 'File mime-type is not allowed ';
}
/**
* Is Valid.
*
* Binary check to finds whether a file is of valid type
*
* @see http://stackoverflow.com/a/3313196
*
* @param string $path
*
* @return bool
*/
public function isValid($path)
{
if (!\is_readable($path)) {
return false;
}
$handle = \fopen($path, 'r');
if (!$handle) {
return false;
}
$bytes = \fgets($handle, 8);
foreach ($this->whiteList as $key) {
if (\strpos($bytes, $this->types[$key]) === 0) {
\fclose($handle);
return true;
}
}
\fclose($handle);
return false;
}
}

View file

@ -1,33 +0,0 @@
<?php
namespace Appwrite\Storage\Validator;
use Utopia\Validator;
class Upload extends Validator
{
public function getDescription()
{
return 'Not a valid upload file';
}
/**
* Check if a file is a valid upload file
*
* @param mixed $path
*
* @return bool
*/
public function isValid($path)
{
if (!is_string($path)) {
return false;
}
if (\is_uploaded_file($path)) {
return true;
}
return false;
}
}

View file

@ -1,80 +0,0 @@
<?php
namespace Appwrite\Tests;
use Appwrite\Storage\Compression\Algorithms\GZIP;
use PHPUnit\Framework\TestCase;
class GZIPTest extends TestCase
{
/**
* @var GZIP
*/
protected $object = null;
public function setUp(): void
{
$this->object = new GZIP();
}
public function tearDown(): void
{
}
public function testName()
{
$this->assertEquals($this->object->getName(), 'gzip');
}
public function testCompressDecompressWithText()
{
$demo = 'This is a demo string';
$demoSize = mb_strlen($demo, '8bit');
$data = $this->object->compress($demo);
$dataSize = mb_strlen($data, '8bit');
$this->assertEquals($demoSize, 21);
$this->assertEquals($dataSize, 39);
$this->assertEquals($this->object->decompress($data), $demo);
}
public function testCompressDecompressWithJPGImage()
{
$demo = \file_get_contents(__DIR__ . '/../../../../resources/disk-a/kitten-1.jpg');
$demoSize = mb_strlen($demo, '8bit');
$data = $this->object->compress($demo);
$dataSize = mb_strlen($data, '8bit');
$this->assertEquals($demoSize, 599639);
$this->assertEquals($dataSize, 599107);
$this->assertGreaterThan($dataSize, $demoSize);
$data = $this->object->decompress($data);
$dataSize = mb_strlen($data, '8bit');
$this->assertEquals($dataSize, 599639);
}
public function testCompressDecompressWithPNGImage()
{
$demo = \file_get_contents(__DIR__ . '/../../../../resources/disk-b/kitten-1.png');
$demoSize = mb_strlen($demo, '8bit');
$data = $this->object->compress($demo);
$dataSize = mb_strlen($data, '8bit');
$this->assertEquals($demoSize, 3038056);
$this->assertEquals($dataSize, 3029202);
$this->assertGreaterThan($dataSize, $demoSize);
$data = $this->object->decompress($data);
$dataSize = mb_strlen($data, '8bit');
$this->assertEquals($dataSize, 3038056);
}
}

View file

@ -1,123 +0,0 @@
<?php
namespace Appwrite\Tests;
use Appwrite\Storage\Device\Local;
use PHPUnit\Framework\TestCase;
class LocalTest extends TestCase
{
/**
* @var Local
*/
protected $object = null;
public function setUp(): void
{
$this->object = new Local(realpath(__DIR__ . '/../../../resources/disk-a'));
}
public function tearDown(): void
{
}
public function testName()
{
$this->assertEquals($this->object->getName(), 'Local Storage');
}
public function testDescription()
{
$this->assertEquals($this->object->getDescription(), 'Adapter for Local storage that is in the physical or virtual machine or mounted to it.');
}
public function testRoot()
{
$this->assertEquals($this->object->getRoot(), '/usr/src/code/tests/resources/disk-a');
}
public function testPath()
{
$this->assertEquals($this->object->getPath('image.png'), '/usr/src/code/tests/resources/disk-a/i/m/a/g/image.png');
$this->assertEquals($this->object->getPath('x.png'), '/usr/src/code/tests/resources/disk-a/x/./p/n/x.png');
$this->assertEquals($this->object->getPath('y'), '/usr/src/code/tests/resources/disk-a/y/x/x/x/y');
}
public function testWrite()
{
$this->assertEquals($this->object->write($this->object->getPath('text.txt'), 'Hello World'), true);
$this->assertEquals(file_exists($this->object->getPath('text.txt')), true);
$this->assertEquals(is_readable($this->object->getPath('text.txt')), true);
$this->object->delete($this->object->getPath('text.txt'));
}
public function testRead()
{
$this->assertEquals($this->object->write($this->object->getPath('text-for-read.txt'), 'Hello World'), true);
$this->assertEquals($this->object->read($this->object->getPath('text-for-read.txt')), 'Hello World');
$this->object->delete($this->object->getPath('text-for-read.txt'));
}
public function testMove()
{
$this->assertEquals($this->object->write($this->object->getPath('text-for-move.txt'), 'Hello World'), true);
$this->assertEquals($this->object->read($this->object->getPath('text-for-move.txt')), 'Hello World');
$this->assertEquals($this->object->move($this->object->getPath('text-for-move.txt'), $this->object->getPath('text-for-move-new.txt')), true);
$this->assertEquals($this->object->read($this->object->getPath('text-for-move-new.txt')), 'Hello World');
$this->assertEquals(file_exists($this->object->getPath('text-for-move.txt')), false);
$this->assertEquals(is_readable($this->object->getPath('text-for-move.txt')), false);
$this->assertEquals(file_exists($this->object->getPath('text-for-move-new.txt')), true);
$this->assertEquals(is_readable($this->object->getPath('text-for-move-new.txt')), true);
$this->object->delete($this->object->getPath('text-for-move-new.txt'));
}
public function testDelete()
{
$this->assertEquals($this->object->write($this->object->getPath('text-for-delete.txt'), 'Hello World'), true);
$this->assertEquals($this->object->read($this->object->getPath('text-for-delete.txt')), 'Hello World');
$this->assertEquals($this->object->delete($this->object->getPath('text-for-delete.txt')), true);
$this->assertEquals(file_exists($this->object->getPath('text-for-delete.txt')), false);
$this->assertEquals(is_readable($this->object->getPath('text-for-delete.txt')), false);
}
public function testFileSize()
{
$this->assertEquals($this->object->getFileSize(__DIR__ . '/../../../resources/disk-a/kitten-1.jpg'), 599639);
$this->assertEquals($this->object->getFileSize(__DIR__ . '/../../../resources/disk-a/kitten-2.jpg'), 131958);
}
public function testFileMimeType()
{
$this->assertEquals($this->object->getFileMimeType(__DIR__ . '/../../../resources/disk-a/kitten-1.jpg'), 'image/jpeg');
$this->assertEquals($this->object->getFileMimeType(__DIR__ . '/../../../resources/disk-a/kitten-2.jpg'), 'image/jpeg');
$this->assertEquals($this->object->getFileMimeType(__DIR__ . '/../../../resources/disk-b/kitten-1.png'), 'image/png');
$this->assertEquals($this->object->getFileMimeType(__DIR__ . '/../../../resources/disk-b/kitten-2.png'), 'image/png');
}
public function testFileHash()
{
$this->assertEquals($this->object->getFileHash(__DIR__ . '/../../../resources/disk-a/kitten-1.jpg'), '7551f343143d2e24ab4aaf4624996b6a');
$this->assertEquals($this->object->getFileHash(__DIR__ . '/../../../resources/disk-a/kitten-2.jpg'), '81702fdeef2e55b1a22617bce4951cb5');
$this->assertEquals($this->object->getFileHash(__DIR__ . '/../../../resources/disk-b/kitten-1.png'), '03010f4f02980521a8fd6213b52ec313');
$this->assertEquals($this->object->getFileHash(__DIR__ . '/../../../resources/disk-b/kitten-2.png'), '8a9ed992b77e4b62b10e3a5c8ed72062');
}
public function testDirectorySize()
{
$this->assertGreaterThan(0, $this->object->getDirectorySize(__DIR__ . '/../../../resources/disk-a/'));
$this->assertGreaterThan(0, $this->object->getDirectorySize(__DIR__ . '/../../../resources/disk-b/'));
}
public function testPartitionFreeSpace()
{
$this->assertGreaterThan(0, $this->object->getPartitionFreeSpace());
}
public function testPartitionTotalSpace()
{
$this->assertGreaterThan(0, $this->object->getPartitionTotalSpace());
}
}

View file

@ -1,42 +0,0 @@
<?php
namespace Appwrite\Tests;
use Exception;
use Appwrite\Storage\Storage;
use Appwrite\Storage\Device\Local;
use PHPUnit\Framework\TestCase;
Storage::setDevice('disk-a', new Local(__DIR__ . '/../../resources/disk-a'));
Storage::setDevice('disk-b', new Local(__DIR__ . '/../../resources/disk-b'));
class StorageTest extends TestCase
{
public function setUp(): void
{
}
public function tearDown(): void
{
}
public function testGetters()
{
$this->assertEquals(get_class(Storage::getDevice('disk-a')), 'Appwrite\Storage\Device\Local');
$this->assertEquals(get_class(Storage::getDevice('disk-b')), 'Appwrite\Storage\Device\Local');
try {
get_class(Storage::getDevice('disk-c'));
$this->fail("Expected exception not thrown");
} catch (Exception $e) {
$this->assertEquals('The device "disk-c" is not listed', $e->getMessage());
}
}
public function testExists()
{
$this->assertEquals(Storage::exists('disk-a'), true);
$this->assertEquals(Storage::exists('disk-b'), true);
$this->assertEquals(Storage::exists('disk-c'), false);
}
}

View file

@ -1,33 +0,0 @@
<?php
namespace Appwrite\Tests;
use Appwrite\Storage\Validator\FileName;
use PHPUnit\Framework\TestCase;
class FileNameTest extends TestCase
{
/**
* @var FileName
*/
protected $object = null;
public function setUp(): void
{
$this->object = new FileName();
}
public function tearDown(): void
{
}
public function testValues()
{
$this->assertEquals($this->object->isValid(''), false);
$this->assertEquals($this->object->isValid(null), false);
$this->assertEquals($this->object->isValid(false), false);
$this->assertEquals($this->object->isValid('../test'), false);
$this->assertEquals($this->object->isValid('test.png'), true);
$this->assertEquals($this->object->isValid('test'), true);
}
}

View file

@ -1,30 +0,0 @@
<?php
namespace Appwrite\Tests;
use Appwrite\Storage\Validator\FileSize;
use PHPUnit\Framework\TestCase;
class FileSizeTest extends TestCase
{
/**
* @var FileSize
*/
protected $object = null;
public function setUp(): void
{
$this->object = new FileSize(1000);
}
public function tearDown(): void
{
}
public function testValues()
{
$this->assertEquals($this->object->isValid(1001), false);
$this->assertEquals($this->object->isValid(1000), true);
$this->assertEquals($this->object->isValid(999), true);
}
}

View file

@ -1,31 +0,0 @@
<?php
namespace Appwrite\Tests;
use Appwrite\Storage\Validator\FileType;
use PHPUnit\Framework\TestCase;
class FileTypeTest extends TestCase
{
/**
* @var FileType
*/
protected $object = null;
public function setUp(): void
{
$this->object = new FileType([FileType::FILE_TYPE_JPEG]);
}
public function tearDown(): void
{
}
public function testValues()
{
$this->assertEquals($this->object->isValid(__DIR__ . '/../../../resources/disk-a/kitten-1.jpg'), true);
$this->assertEquals($this->object->isValid(__DIR__ . '/../../../resources/disk-a/kitten-2.jpg'), true);
$this->assertEquals($this->object->isValid(__DIR__ . '/../../../resources/disk-b/kitten-1.png'), false);
$this->assertEquals($this->object->isValid(__DIR__ . '/../../../resources/disk-b/kitten-2.png'), false);
}
}

View file

@ -1,32 +0,0 @@
<?php
namespace Appwrite\Tests;
use Appwrite\Storage\Validator\Upload;
use PHPUnit\Framework\TestCase;
class UploadTest extends TestCase
{
/**
* @var Upload
*/
protected $object = null;
public function setUp(): void
{
$this->object = new Upload();
}
public function tearDown(): void
{
}
public function testValues()
{
$this->assertEquals($this->object->isValid(__DIR__ . '/../../../resources/disk-a/kitten-1.jpg'), false);
$this->assertEquals($this->object->isValid(__DIR__ . '/../../../resources/disk-a/kitten-2.jpg'), false);
$this->assertEquals($this->object->isValid(__DIR__ . '/../../../resources/disk-b/kitten-1.png'), false);
$this->assertEquals($this->object->isValid(__DIR__ . '/../../../resources/disk-b/kitten-2.png'), false);
$this->assertEquals($this->object->isValid(__FILE__), false);
}
}