Implements FS#236: Save receipient jid
This commit is contained in:
parent
7ce02c25b1
commit
509128be58
4 changed files with 114 additions and 92 deletions
|
@ -11,6 +11,7 @@
|
||||||
* size
|
* size
|
||||||
* content_type
|
* content_type
|
||||||
* user_jid
|
* user_jid
|
||||||
|
* receipient_jid
|
||||||
* 403: In case the XMPP Server Key is not valid
|
* 403: In case the XMPP Server Key is not valid
|
||||||
* 406:
|
* 406:
|
||||||
* File is empty (error code: 1)
|
* File is empty (error code: 1)
|
||||||
|
@ -46,7 +47,9 @@
|
||||||
* The slot's delete token does not match the header field "X-FILETRANSFER-HTTP-DELETE-TOKEN"
|
* The slot's delete token does not match the header field "X-FILETRANSFER-HTTP-DELETE-TOKEN"
|
||||||
* The slot's delete token is not valid any more
|
* The slot's delete token is not valid any more
|
||||||
*/
|
*/
|
||||||
|
include_once(__DIR__.'/lib/functions.common.inc.php');
|
||||||
|
include_once(__DIR__.'/lib/functions.http.inc.php');
|
||||||
|
include_once(__DIR__.'/lib/functions.filetransfer.inc.php');
|
||||||
$method = $_SERVER['REQUEST_METHOD'];
|
$method = $_SERVER['REQUEST_METHOD'];
|
||||||
|
|
||||||
// Load configuration
|
// Load configuration
|
||||||
|
@ -101,6 +104,7 @@ switch ($method) {
|
||||||
$filename = rawurlencode(getMandatoryPostParameter('filename'));
|
$filename = rawurlencode(getMandatoryPostParameter('filename'));
|
||||||
$filesize = getMandatoryPostParameter('size');
|
$filesize = getMandatoryPostParameter('size');
|
||||||
$mimeType = getOptionalPostParameter('content_type');
|
$mimeType = getOptionalPostParameter('content_type');
|
||||||
|
$receipientJid = getMandatoryPostParameter('receipient_jid');
|
||||||
|
|
||||||
// check file name - return 406 (not acceptable) if file contains invalid characters
|
// check file name - return 406 (not acceptable) if file contains invalid characters
|
||||||
foreach ($config['invalid_characters_in_filename'] as $invalidCharacter) {
|
foreach ($config['invalid_characters_in_filename'] as $invalidCharacter) {
|
||||||
|
@ -118,7 +122,7 @@ switch ($method) {
|
||||||
}
|
}
|
||||||
// generate slot uuid, register slot uuid and expected file size and expected mime type
|
// generate slot uuid, register slot uuid and expected file size and expected mime type
|
||||||
$slotUUID = generate_uuid();
|
$slotUUID = generate_uuid();
|
||||||
registerSlot($slotUUID, $filename, $filesize, $mimeType, $userJid, $config);
|
registerSlot($slotUUID, $filename, $filesize, $mimeType, $userJid, $receipientJid, $config);
|
||||||
if (!mkdir(getUploadFilePath($slotUUID, $config))) {
|
if (!mkdir(getUploadFilePath($slotUUID, $config))) {
|
||||||
sendHttpReturnCodeAndJson(500, "Could not create directory for upload.");
|
sendHttpReturnCodeAndJson(500, "Could not create directory for upload.");
|
||||||
}
|
}
|
||||||
|
@ -217,13 +221,6 @@ function checkFilenameParameter($filename, $slotParameters) {
|
||||||
return $slotParameters['filename'] == $filename;
|
return $slotParameters['filename'] == $filename;
|
||||||
}
|
}
|
||||||
|
|
||||||
function loadSlotParameters($slotUUID, $config) {
|
|
||||||
$slotParameters = require(getSlotFilePath($slotUUID, $config));
|
|
||||||
$slotParameters['filename'] = $slotParameters['filename'];
|
|
||||||
|
|
||||||
return $slotParameters;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getMandatoryPostParameter($parameterName) {
|
function getMandatoryPostParameter($parameterName) {
|
||||||
$parameter = $_POST[$parameterName];
|
$parameter = $_POST[$parameterName];
|
||||||
if (!isset($parameter) || is_null($parameter) || empty($parameter)) {
|
if (!isset($parameter) || is_null($parameter) || empty($parameter)) {
|
||||||
|
@ -232,27 +229,6 @@ function getMandatoryPostParameter($parameterName) {
|
||||||
return $parameter;
|
return $parameter;
|
||||||
}
|
}
|
||||||
|
|
||||||
function getOptionalPostParameter($parameterName, $default = NULL) {
|
|
||||||
$parameter = $_POST[$parameterName];
|
|
||||||
if (!isset($parameter) || is_null($parameter) || empty($parameter)) {
|
|
||||||
$parameter = $default;
|
|
||||||
}
|
|
||||||
return $parameter;
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendHttpReturnCodeAndJson($code, $data) {
|
|
||||||
if (!is_array($data)) {
|
|
||||||
$data = ['msg' => $data];
|
|
||||||
}
|
|
||||||
header('Content-Type: application/json');
|
|
||||||
sendHttpReturnCodeAndMessage($code, json_encode($data));
|
|
||||||
}
|
|
||||||
|
|
||||||
function sendHttpReturnCodeAndMessage($code, $text = '') {
|
|
||||||
http_response_code($code);
|
|
||||||
exit($text);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getUUIDFromUri($uri) {
|
function getUUIDFromUri($uri) {
|
||||||
$pattern = "/[a-f0-9]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/";
|
$pattern = "/[a-f0-9]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/";
|
||||||
preg_match($pattern, $uri, $matches);
|
preg_match($pattern, $uri, $matches);
|
||||||
|
@ -264,10 +240,11 @@ function getFilenameFromUri($uri) {
|
||||||
return substr($uri, $lastSlash);
|
return substr($uri, $lastSlash);
|
||||||
}
|
}
|
||||||
|
|
||||||
function registerSlot($slotUUID, $filename, $filesize, $contentType, $userJid, $config) {
|
function registerSlot($slotUUID, $filename, $filesize, $contentType, $userJid, $receipientJid, $config) {
|
||||||
$contents = "<?php\n/*\n * This is an autogenerated file - do not edit\n */\n\n";
|
$contents = "<?php\n/*\n * This is an autogenerated file - do not edit\n */\n\n";
|
||||||
$contents .= 'return [\'filename\' => \''.$filename.'\', \'filesize\' => \''.$filesize.'\', ';
|
$contents .= 'return [\'filename\' => \''.$filename.'\', \'filesize\' => \''.$filesize.'\', ';
|
||||||
$contents .= '\'content_type\' => \''.$contentType.'\', \'user_jid\' => \''.$userJid.'\'];\n?>';
|
$contents .= '\'content_type\' => \''.$contentType.'\', \'user_jid\' => \''.$userJid.'\', \'receipient_jid\' => \''.$receipientJid.'\'];';
|
||||||
|
$contents .= "\n?>";
|
||||||
if (!file_put_contents(getSlotFilePath($slotUUID, $config), $contents)) {
|
if (!file_put_contents(getSlotFilePath($slotUUID, $config), $contents)) {
|
||||||
sendHttpReturnCodeAndMessage(500, "Could not create slot registry entry.");
|
sendHttpReturnCodeAndMessage(500, "Could not create slot registry entry.");
|
||||||
}
|
}
|
||||||
|
@ -286,64 +263,4 @@ function registerDeleteToken($slotUUID, $filename, $deleteToken, $config) {
|
||||||
function slotExists($slotUUID, $config) {
|
function slotExists($slotUUID, $config) {
|
||||||
return file_exists(getSlotFilePath($slotUUID, $config));
|
return file_exists(getSlotFilePath($slotUUID, $config));
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSlotFilePath($slotUUID, $config) {
|
|
||||||
return $config['slot_registry_dir'].$slotUUID;
|
|
||||||
}
|
|
||||||
|
|
||||||
function getUploadFilePath($slotUUID, $config, $filename = NULL) {
|
|
||||||
$path = $config['storage_base_path'].$slotUUID;
|
|
||||||
if (!is_null($filename)) {
|
|
||||||
$path .= '/'.$filename;
|
|
||||||
}
|
|
||||||
return $path;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Inspired by https://github.com/owncloud/core/blob/master/lib/private/appframework/http/request.php#L523
|
|
||||||
*/
|
|
||||||
function getServerProtocol() {
|
|
||||||
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
|
|
||||||
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], ',') !== false) {
|
|
||||||
$parts = explode(',', $_SERVER['HTTP_X_FORWARDED_PROTO']);
|
|
||||||
$proto = strtolower(trim($parts[0]));
|
|
||||||
} else {
|
|
||||||
$proto = strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']);
|
|
||||||
}
|
|
||||||
// Verify that the protocol is always HTTP or HTTPS
|
|
||||||
// default to http if an invalid value is provided
|
|
||||||
return $proto === 'https' ? 'https' : 'http';
|
|
||||||
}
|
|
||||||
if (isset($_SERVER['HTTPS'])
|
|
||||||
&& $_SERVER['HTTPS'] !== null
|
|
||||||
&& $_SERVER['HTTPS'] !== 'off'
|
|
||||||
&& $_SERVER['HTTPS'] !== '') {
|
|
||||||
return 'https';
|
|
||||||
}
|
|
||||||
return 'http';
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRequestHostname() {
|
|
||||||
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
|
|
||||||
return strtolower($_SERVER['HTTP_X_FORWARDED_HOST']);
|
|
||||||
}
|
|
||||||
return strtolower($_SERVER['HTTP_HOST']);
|
|
||||||
}
|
|
||||||
|
|
||||||
function getRequestUriWithoutFilename() {
|
|
||||||
return strtolower(substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/') + 1));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Copied from http://rogerstringer.com/2013/11/15/generate-uuids-php/
|
|
||||||
*/
|
|
||||||
function generate_uuid() {
|
|
||||||
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
|
|
||||||
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
|
|
||||||
mt_rand( 0, 0xffff ),
|
|
||||||
mt_rand( 0, 0x0fff ) | 0x4000,
|
|
||||||
mt_rand( 0, 0x3fff ) | 0x8000,
|
|
||||||
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
|
|
||||||
);
|
|
||||||
}
|
|
||||||
?>
|
?>
|
||||||
|
|
18
storage-backend/lib/functions.common.inc.php
Normal file
18
storage-backend/lib/functions.common.inc.php
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file contains functions commonly used.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Copied from http://rogerstringer.com/2013/11/15/generate-uuids-php/
|
||||||
|
*/
|
||||||
|
function generate_uuid() {
|
||||||
|
return sprintf( '%04x%04x-%04x-%04x-%04x-%04x%04x%04x',
|
||||||
|
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ),
|
||||||
|
mt_rand( 0, 0xffff ),
|
||||||
|
mt_rand( 0, 0x0fff ) | 0x4000,
|
||||||
|
mt_rand( 0, 0x3fff ) | 0x8000,
|
||||||
|
mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff ), mt_rand( 0, 0xffff )
|
||||||
|
);
|
||||||
|
}
|
||||||
|
?>
|
23
storage-backend/lib/functions.filetransfer.inc.php
Normal file
23
storage-backend/lib/functions.filetransfer.inc.php
Normal file
|
@ -0,0 +1,23 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
* This file contains the functions for the storage-backend.
|
||||||
|
*/
|
||||||
|
|
||||||
|
function getSlotFilePath($slotUUID, $config) {
|
||||||
|
return $config['slot_registry_dir'].$slotUUID;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getUploadFilePath($slotUUID, $config, $filename = NULL) {
|
||||||
|
$path = $config['storage_base_path'].$slotUUID;
|
||||||
|
if (!is_null($filename)) {
|
||||||
|
$path .= '/'.$filename;
|
||||||
|
}
|
||||||
|
return $path;
|
||||||
|
}
|
||||||
|
|
||||||
|
function loadSlotParameters($slotUUID, $config) {
|
||||||
|
$slotParameters = require(getSlotFilePath($slotUUID, $config));
|
||||||
|
$slotParameters['filename'] = $slotParameters['filename'];
|
||||||
|
|
||||||
|
return $slotParameters;
|
||||||
|
}
|
64
storage-backend/lib/functions.http.inc.php
Normal file
64
storage-backend/lib/functions.http.inc.php
Normal file
|
@ -0,0 +1,64 @@
|
||||||
|
<?php
|
||||||
|
/*
|
||||||
|
*
|
||||||
|
* This file contains functions to be used to
|
||||||
|
* extract information based on http request information.
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Inspired by https://github.com/owncloud/core/blob/master/lib/private/appframework/http/request.php#L523
|
||||||
|
*/
|
||||||
|
function getServerProtocol() {
|
||||||
|
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO'])) {
|
||||||
|
if (strpos($_SERVER['HTTP_X_FORWARDED_PROTO'], ',') !== false) {
|
||||||
|
$parts = explode(',', $_SERVER['HTTP_X_FORWARDED_PROTO']);
|
||||||
|
$proto = strtolower(trim($parts[0]));
|
||||||
|
} else {
|
||||||
|
$proto = strtolower($_SERVER['HTTP_X_FORWARDED_PROTO']);
|
||||||
|
}
|
||||||
|
// Verify that the protocol is always HTTP or HTTPS
|
||||||
|
// default to http if an invalid value is provided
|
||||||
|
return $proto === 'https' ? 'https' : 'http';
|
||||||
|
}
|
||||||
|
if (isset($_SERVER['HTTPS'])
|
||||||
|
&& $_SERVER['HTTPS'] !== null
|
||||||
|
&& $_SERVER['HTTPS'] !== 'off'
|
||||||
|
&& $_SERVER['HTTPS'] !== '') {
|
||||||
|
return 'https';
|
||||||
|
}
|
||||||
|
return 'http';
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRequestHostname() {
|
||||||
|
if (isset($_SERVER['HTTP_X_FORWARDED_HOST'])) {
|
||||||
|
return strtolower($_SERVER['HTTP_X_FORWARDED_HOST']);
|
||||||
|
}
|
||||||
|
return strtolower($_SERVER['HTTP_HOST']);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getRequestUriWithoutFilename() {
|
||||||
|
return strtolower(substr($_SERVER['REQUEST_URI'], 0, strrpos($_SERVER['REQUEST_URI'], '/') + 1));
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendHttpReturnCodeAndJson($code, $data) {
|
||||||
|
if (!is_array($data)) {
|
||||||
|
$data = ['msg' => $data];
|
||||||
|
}
|
||||||
|
header('Content-Type: application/json');
|
||||||
|
sendHttpReturnCodeAndMessage($code, json_encode($data));
|
||||||
|
}
|
||||||
|
|
||||||
|
function sendHttpReturnCodeAndMessage($code, $text = '') {
|
||||||
|
http_response_code($code);
|
||||||
|
exit($text);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getOptionalPostParameter($parameterName, $default = NULL) {
|
||||||
|
$parameter = $_POST[$parameterName];
|
||||||
|
if (!isset($parameter) || is_null($parameter) || empty($parameter)) {
|
||||||
|
$parameter = $default;
|
||||||
|
}
|
||||||
|
return $parameter;
|
||||||
|
}
|
||||||
|
?>
|
Loading…
Add table
Reference in a new issue