diff --git a/cron.php b/cron.php index 79bb2f0..07c5501 100644 --- a/cron.php +++ b/cron.php @@ -14,7 +14,7 @@ $semaphore = sem_get($ftok, 1); if(!sem_acquire($semaphore)) die('Failed to acquire semaphore.' . PHP_EOL); -require_once __DIR__ . '/startup.php'; +require_once __DIR__ . '/eeprom.php'; // Mark expired as deleted $expired = Upload::expired(); diff --git a/eeprom.js b/eeprom.js deleted file mode 100644 index aa6bd41..0000000 --- a/eeprom.js +++ /dev/null @@ -1,185 +0,0 @@ -var EEPROM = function(srcId, endpoint, authorization) { - this.srcId = parseInt(srcId); - this.setEndpoint(endpoint); - this.setAuthorization(authorization); -}; -EEPROM.prototype.setEndpoint = function(endpoint) { - this.endpoint = endpoint.toString(); -}; -EEPROM.prototype.setAuthorization = function(authorization) { - this.authorization = authorization.toString(); -}; -EEPROM.prototype.deleteUpload = function(fileInfo) { - return new EEPROM.EEPROMDeleteTask( - this.authorization, - fileInfo - ); -}; -EEPROM.prototype.createUpload = function(file) { - return new EEPROM.EEPROMUploadTask( - this.srcId, - this.endpoint, - this.authorization, - file - ); -}; -EEPROM.ERR_GENERIC = 'generic'; // Generic error, no further details -EEPROM.ERR_INVALID = 'invalid'; // Request is invalid -EEPROM.ERR_AUTH = 'auth'; // Auth token expired -EEPROM.ERR_ACCESS = 'access'; // Barred from uploading -EEPROM.ERR_DMCA = 'dmca'; // DMCA takedown -EEPROM.ERR_GONE = 'gone'; // Invalid endpoint -EEPROM.ERR_SERVER = 'server'; // Server error -EEPROM.ERR_SIZE = 'size'; // Too large - -EEPROM.EEPROMFile = function(fileInfo) { - // A merge operation woulda been neat. - this.id = (fileInfo.id || '').toString(); - this.url = (fileInfo.url || '').toString(); - this.urlf = (fileInfo.urlf || '').toString(); - this.thumb = (fileInfo.thumb || '').toString(); - this.name = (fileInfo.name || '').toString(); - this.type = (fileInfo.type || '').toString(); - this.size = parseInt(fileInfo.size || 0); - this.user = parseInt(fileInfo.user || 0); - this.hash = (fileInfo.hash || '').toString(); - this.created = (fileInfo.created || null); - this.accessed = (fileInfo.accessed || null); - this.expires = (fileInfo.expires || null); - this.deleted = (fileInfo.deleted || null); - this.dmca = (fileInfo.dmca || null); -}; -EEPROM.EEPROMFile.prototype.isImage = function() { return this.type.indexOf('image/') === 0; }; -EEPROM.EEPROMFile.prototype.isAudio = function() { return this.type.indexOf('audio/') === 0; }; -EEPROM.EEPROMFile.prototype.isVideo = function() { return this.type.indexOf('video/') === 0; }; - -EEPROM.EEPROMDeleteTask = function(authorization, fileInfo) { - var _self = this; - this.authorization = authorization; - this.fileInfo = fileInfo; - this.xhr = new XMLHttpRequest; - this.xhr.addEventListener('readystatechange', function() { - if(this.readyState !== 4) - return; - - if(this.status !== 204) { - _self.errorCode = EEPROM.ERR_GENERIC; - - switch(this.status) { - case 401: - _self.errorCode = EEPROM.ERR_AUTH; - break; - case 403: - _self.errorCode = EEPROM.ERR_ACCESS; - break; - case 404: - case 410: - _self.errorCode = EEPROM.ERR_GONE; - break; - case 500: - case 503: - _self.errorCode = EEPROM.ERR_SERVER; - break; - } - - if(_self.onFailure) - _self.onFailure(_self.errorCode); - return; - } - - if(_self.onSuccess) - _self.onSuccess(); - }); -}; -EEPROM.EEPROMDeleteTask.prototype.onSuccess = undefined; -EEPROM.EEPROMDeleteTask.prototype.onFailure = undefined; -EEPROM.EEPROMDeleteTask.prototype.start = function() { - this.xhr.open('DELETE', this.fileInfo.urlf); - this.xhr.setRequestHeader('Authorization', this.authorization); - this.xhr.send(); -}; - -EEPROM.EEPROMUploadTask = function(srcId, endpoint, authorization, file) { - var _self = this; - - this.aborted = false; - this.endpoint = endpoint; - this.authorization = authorization; - this.xhr = new XMLHttpRequest; - this.formData = new FormData; - this.formData.append('src', srcId); - this.formData.append('file', file); - - var reportUploadProgress = function(ev) { - if(_self.onProgress) - _self.onProgress(new EEPROM.EEPROMUploadTask.EEPROMUploadTaskProgress(ev.loaded, ev.total)); - }; - - this.xhr.upload.addEventListener('loadstart', reportUploadProgress); - this.xhr.upload.addEventListener('progress', reportUploadProgress); - this.xhr.upload.addEventListener('load', reportUploadProgress); - - this.xhr.addEventListener('readystatechange', function() { - if(this.readyState !== 4) - return; - - if(this.status !== 201) { - _self.failureResponse = { - userAborted: _self.aborted, - error: EEPROM.ERR_GENERIC, - }; - - switch(this.status) { - case 400: - case 405: - _self.failureResponse.error = EEPROM.ERR_INVALID; - break; - case 401: - _self.failureResponse.error = EEPROM.ERR_AUTH; - break; - case 403: - _self.failureResponse.error = EEPROM.ERR_ACCESS; - break; - case 404: - case 410: - _self.failureResponse.error = EEPROM.ERR_GONE; - break; - case 451: - _self.failureResponse.error = EEPROM.ERR_DMCA; - break; - case 413: - _self.failureResponse.error = EEPROM.ERR_SIZE; - _self.failureResponse.maxSize = parseInt(this.getResponseHeader('X-EEPROM-Max-Size')); - break; - case 500: - case 503: - _self.failureResponse.error = EEPROM.ERR_SERVER; - break; - } - - if(_self.onFailure) - _self.onFailure(_self.failureResponse); - return; - } - - _self.fileInfo = new EEPROM.EEPROMFile(JSON.parse(this.responseText)); - - if(_self.onComplete) - _self.onComplete(_self.fileInfo); - }); -}; -EEPROM.EEPROMUploadTask.EEPROMUploadTaskProgress = function(loaded, total) { - this.progress = Math.ceil(((this.loaded = loaded) / (this.total = total)) * 100); -}; -EEPROM.EEPROMUploadTask.prototype.onComplete = undefined; -EEPROM.EEPROMUploadTask.prototype.onFailure = undefined; -EEPROM.EEPROMUploadTask.prototype.onProgress = undefined; -EEPROM.EEPROMUploadTask.prototype.abort = function() { - this.aborted = true; - this.xhr.abort(); -}; -EEPROM.EEPROMUploadTask.prototype.start = function() { - this.xhr.open('POST', this.endpoint); - this.xhr.setRequestHeader('Authorization', this.authorization); - this.xhr.send(this.formData); -}; diff --git a/startup.php b/eeprom.php similarity index 91% rename from startup.php rename to eeprom.php index 5111b5c..4a2e6a1 100644 --- a/startup.php +++ b/eeprom.php @@ -5,15 +5,11 @@ define('PRM_STARTUP', microtime(true)); define('PRM_ROOT', __DIR__); define('PRM_CLI', PHP_SAPI === 'cli'); define('PRM_DEBUG', is_file(PRM_ROOT . '/.debug')); -define('PRM_PHP_MIN_VER', '7.4.0'); define('PRM_PUBLIC', PRM_ROOT . '/public'); define('PRM_SOURCE', PRM_ROOT . '/src'); define('PRM_UPLOADS', PRM_PUBLIC . '/data'); define('PRM_THUMBS', PRM_PUBLIC . '/thumb'); -if(version_compare(PHP_VERSION, PRM_PHP_MIN_VER, '<')) - die('EEPROM required at least PHP ' . PRM_PHP_MIN_VER . '.'); - error_reporting(PRM_DEBUG ? -1 : 0); ini_set('display_errors', PRM_DEBUG ? 'On' : 'Off'); diff --git a/js/eeprom-v1.0.js b/js/eeprom-v1.0.js new file mode 100644 index 0000000..4ad9e67 --- /dev/null +++ b/js/eeprom-v1.0.js @@ -0,0 +1,212 @@ +var EEPROM = function(srcId, endpoint, authorization) { + var obj = { + srcId: parseInt(srcId), + endpoint: endpoint, + authorization: authorization, + }; + + console.log(obj); + + obj.setEndpoint = function(endpoint) { + obj.endpoint = (endpoint || '').toString(); + }; + + obj.setAuthorization = function(authorization) { + obj.authorization = (authorization || '').toString(); + }; + + obj.deleteUpload = function(fileInfo) { + return new EEPROM.EEPROMDeleteTask( + obj.authorization, + fileInfo + ); + }; + + obj.createUpload = function(file) { + return new EEPROM.EEPROMUploadTask( + obj.srcId, + obj.endpoint, + obj.authorization, + file + ); + }; + + return obj; +}; +EEPROM.ERR_GENERIC = 'generic'; +EEPROM.ERR_INVALID = 'invalid'; +EEPROM.ERR_AUTH = 'auth'; +EEPROM.ERR_ACCESS = 'access'; +EEPROM.ERR_DMCA = 'dmca'; +EEPROM.ERR_GONE = 'gone'; +EEPROM.ERR_SERVER = 'server'; +EEPROM.ERR_SIZE = 'size'; + +EEPROM.EEPROMFile = function(fileInfo) { + var obj = { + id: (fileInfo.id || '').toString(), + url: (fileInfo.url || '').toString(), + urlf: (fileInfo.urlf || '').toString(), + thumb: (fileInfo.thumb || '').toString(), + name: (fileInfo.name || '').toString(), + type: (fileInfo.type || '').toString(), + size: parseInt(fileInfo.size || 0), + user: parseInt(fileInfo.user || 0), + hash: (fileInfo.hash || '').toString(), + created: (fileInfo.created || null), + accessed: (fileInfo.accessed || null), + expires: (fileInfo.expires || null), + deleted: (fileInfo.deleted || null), + dmca: (fileInfo.dmca || null), + }; + + obj.isImage = function() { return obj.type.indexOf('image/') === 0; }; + obj.isAudio = function() { return obj.type.indexOf('audio/') === 0; }; + obj.isVideo = function() { return obj.type.indexOf('video/') === 0; }; + + return obj; +}; + +EEPROM.EEPROMDeleteTask = function(authorization, fileInfo) { + var obj = { + authorization: authorization, + fileInfo: fileInfo, + onSuccess: undefined, + onFailure: undefined, + }; + + var xhr = obj.xhr = new XMLHttpRequest; + obj.xhr.addEventListener('readystatechange', function() { + if(xhr.readyState !== 4) + return; + + if(xhr.status !== 204) { + obj.errorCode = EEPROM.ERR_GENERIC; + + switch(xhr.status) { + case 401: + obj.errorCode = EEPROM.ERR_AUTH; + break; + case 403: + obj.errorCode = EEPROM.ERR_ACCESS; + break; + case 404: + case 410: + obj.errorCode = EEPROM.ERR_GONE; + break; + case 500: + case 503: + obj.errorCode = EEPROM.ERR_SERVER; + break; + } + + if(obj.onFailure) + obj.onFailure(obj.errorCode); + return; + } + + if(obj.onSuccess) + obj.onSuccess(); + }); + + obj.start = function() { + xhr.open('DELETE', obj.fileInfo.urlf); + xhr.setRequestHeader('Authorization', obj.authorization); + xhr.send(); + }; + + return obj; +}; + +EEPROM.EEPROMUploadTask = function(srcId, endpoint, authorization, file) { + var obj = { + aborted: false, + endpoint: endpoint, + authorization: authorization, + onComplete: undefined, + onFailure: undefined, + onProgress: undefined, + failureResponse: undefined, + }; + + var xhr = obj.xhr = new XMLHttpRequest, + fd = obj.formData = new FormData; + + fd.append('src', srcId); + fd.append('file', file); + + var reportUploadProgress = function(ev) { + if(obj.onProgress) + obj.onProgress({ + loaded: ev.loaded, + total: ev.total, + progress: Math.ceil((ev.loaded / ev.total) * 100), + }); + }; + + xhr.upload.addEventListener('loadstart', reportUploadProgress); + xhr.upload.addEventListener('progress', reportUploadProgress); + xhr.upload.addEventListener('load', reportUploadProgress); + + xhr.addEventListener('readystatechange', function() { + if(this.readyState !== 4) + return; + + if(this.status !== 201) { + obj.failureResponse = { + userAborted: obj.aborted, + error: EEPROM.ERR_GENERIC, + }; + + switch(this.status) { + case 400: + case 405: + obj.failureResponse.error = EEPROM.ERR_INVALID; + break; + case 401: + obj.failureResponse.error = EEPROM.ERR_AUTH; + break; + case 403: + obj.failureResponse.error = EEPROM.ERR_ACCESS; + break; + case 404: + case 410: + obj.failureResponse.error = EEPROM.ERR_GONE; + break; + case 451: + obj.failureResponse.error = EEPROM.ERR_DMCA; + break; + case 413: + obj.failureResponse.error = EEPROM.ERR_SIZE; + obj.failureResponse.maxSize = parseInt(this.getResponseHeader('X-EEPROM-Max-Size')); + break; + case 500: + case 503: + obj.failureResponse.error = EEPROM.ERR_SERVER; + break; + } + + if(obj.onFailure) + obj.onFailure(obj.failureResponse); + return; + } + + obj.fileInfo = new EEPROM.EEPROMFile(JSON.parse(this.responseText)); + + if(obj.onComplete) + obj.onComplete(obj.fileInfo); + }); + + obj.abort = function() { + obj.aborted = true; + xhr.abort(); + }; + + obj.start = function() { + xhr.open('POST', obj.endpoint); + xhr.setRequestHeader('Authorization', obj.authorization); + xhr.send(fd); + }; + + return obj; +}; diff --git a/public/index.php b/public/index.php index 17dbf11..fa50737 100644 --- a/public/index.php +++ b/public/index.php @@ -1,7 +1,7 @@ +
+
+ + +TEST; return; }