Jirafeau/f.php

271 lines
9.5 KiB
PHP
Raw Normal View History

<?php
/*
* Jirafeau, your web file repository
* Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
2015-03-10 10:18:48 +01:00
* Copyright (C) 2015 Jerome Jutteau <j.jutteau@gmail.com>
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
define('JIRAFEAU_ROOT', dirname(__FILE__) . '/');
require(JIRAFEAU_ROOT . 'lib/settings.php');
require(JIRAFEAU_ROOT . 'lib/functions.php');
require(JIRAFEAU_ROOT . 'lib/lang.php');
if (!isset($_GET['h']) || empty($_GET['h'])) {
header('Location: ' . $cfg['web_root']);
exit;
}
/* Operations may take a long time.
* Be sure PHP's safe mode is off.
*/
2013-08-01 19:29:56 +00:00
@set_time_limit(0);
/* Remove errors. */
@error_reporting(0);
$link_name = $_GET['h'];
if (!preg_match('/[0-9a-zA-Z_-]+$/', $link_name)) {
require(JIRAFEAU_ROOT.'lib/template/header.php');
echo '<div class="error"><p>' . t('Sorry, the requested file is not found') . '</p></div>';
require(JIRAFEAU_ROOT.'lib/template/footer.php');
exit;
}
2012-12-05 18:48:00 +00:00
$link = jirafeau_get_link($link_name);
if (count($link) == 0) {
add an alias system to the API. This alias system permits to create an "alias" to an uploaded file. This permits to upload some new content and update the alias to the new content. This will permits to implement a lot of services, for example: - Storing a live chat between two people - Update a list of files - Put a whole website and update it A few notes: - An alias MUST point to an existing upload at his creation or update. - Alias are not protected against reading but are protected against updates and deletion using a password. The destination of the alias can still be protected by a password. - Alias can be updated to change it's target and/or change the password. - Alias names and passwords must be between 8 and 32 characters. Some examples: - Create an alias: curl -X POST \ --http1.0 \ -F "alias=my-awsome-alias" \ -F "destination=13dA8apU" \ -F "password=my-very-secret-password" \ http://my-host/jirafeau/script.php?alias_create=1 => OK - Get an alias curl -X POST \ --http1.0 \ -F "alias=my-awsome-alias" \ http://my-host/jirafeau/script.php?alias_get=1 => 13dA8apU - Update an alias: curl -X POST \ --http1.0 \ -F "alias=my-awsome-alias" \ -F "destination=2Ab6f17o" \ -F "password=my-new-password" \ http://my-host/jirafeau/script.php?alias_update=1 => OK - Access to alias using the web interface, let's go to: http://couak.net/jirafeau-dev/f.php?h=my-awsome-alias - Delete an alias: curl -X POST \ --http1.0 \ -F "alias=my-awsome-alias" \ -F "password=my-new-password" \ http://my-host/jirafeau/script.php?alias_delete=1 => OK Signed-off-by: Jerome Jutteau <mojo@couak.net>
2015-06-29 00:58:08 +02:00
/* Try alias. */
$alias = jirafeau_get_alias(md5($link_name));
if (count($alias) > 0) {
$link = jirafeau_get_link($alias["destination"]);
}
add an alias system to the API. This alias system permits to create an "alias" to an uploaded file. This permits to upload some new content and update the alias to the new content. This will permits to implement a lot of services, for example: - Storing a live chat between two people - Update a list of files - Put a whole website and update it A few notes: - An alias MUST point to an existing upload at his creation or update. - Alias are not protected against reading but are protected against updates and deletion using a password. The destination of the alias can still be protected by a password. - Alias can be updated to change it's target and/or change the password. - Alias names and passwords must be between 8 and 32 characters. Some examples: - Create an alias: curl -X POST \ --http1.0 \ -F "alias=my-awsome-alias" \ -F "destination=13dA8apU" \ -F "password=my-very-secret-password" \ http://my-host/jirafeau/script.php?alias_create=1 => OK - Get an alias curl -X POST \ --http1.0 \ -F "alias=my-awsome-alias" \ http://my-host/jirafeau/script.php?alias_get=1 => 13dA8apU - Update an alias: curl -X POST \ --http1.0 \ -F "alias=my-awsome-alias" \ -F "destination=2Ab6f17o" \ -F "password=my-new-password" \ http://my-host/jirafeau/script.php?alias_update=1 => OK - Access to alias using the web interface, let's go to: http://couak.net/jirafeau-dev/f.php?h=my-awsome-alias - Delete an alias: curl -X POST \ --http1.0 \ -F "alias=my-awsome-alias" \ -F "password=my-new-password" \ http://my-host/jirafeau/script.php?alias_delete=1 => OK Signed-off-by: Jerome Jutteau <mojo@couak.net>
2015-06-29 00:58:08 +02:00
}
if (count($link) == 0) {
require(JIRAFEAU_ROOT.'lib/template/header.php');
echo '<div class="error"><p>' . t('Sorry, the requested file is not found') .
'</p></div>';
require(JIRAFEAU_ROOT.'lib/template/footer.php');
exit;
}
$delete_code = '';
if (isset($_GET['d']) && !empty($_GET['d']) && $_GET['d'] != '1') {
$delete_code = $_GET['d'];
}
$crypt_key = '';
if (isset($_GET['k']) && !empty($_GET['k'])) {
$crypt_key = $_GET['k'];
}
$do_download = false;
if (isset($_GET['d']) && $_GET['d'] == '1') {
$do_download = true;
}
$do_preview = false;
if (isset($_GET['p']) && !empty($_GET['p'])) {
$do_preview = true;
}
$p = s2p($link['md5']);
if (!file_exists(VAR_FILES . $p . $link['md5'])) {
jirafeau_delete_link($link_name);
require(JIRAFEAU_ROOT.'lib/template/header.php');
echo '<div class="error"><p>'.t('File not available.').
'</p></div>';
require(JIRAFEAU_ROOT.'lib/template/footer.php');
exit;
}
if (!empty($delete_code) && $delete_code == $link['link_code']) {
jirafeau_delete_link($link_name);
require(JIRAFEAU_ROOT.'lib/template/header.php');
echo '<div class="message"><p>'.t('File has been deleted.').
'</p></div>';
require(JIRAFEAU_ROOT.'lib/template/footer.php');
exit;
}
2012-12-07 20:41:43 +00:00
if ($link['time'] != JIRAFEAU_INFINITY && time() > $link['time']) {
jirafeau_delete_link($link_name);
require(JIRAFEAU_ROOT.'lib/template/header.php');
echo '<div class="error"><p>'.
t('The time limit of this file has expired.') . ' ' .
t('File has been deleted.') .
'</p></div>';
require(JIRAFEAU_ROOT . 'lib/template/footer.php');
exit;
}
if (empty($crypt_key) && $link['crypted']) {
require(JIRAFEAU_ROOT.'lib/template/header.php');
echo '<div class="error"><p>' . t('Sorry, the requested file is not found') .
'</p></div>';
require(JIRAFEAU_ROOT.'lib/template/footer.php');
exit;
}
$password_challenged = false;
if (!empty($link['key'])) {
if (!isset($_POST['key'])) {
require(JIRAFEAU_ROOT.'lib/template/header.php');
2013-01-31 23:14:14 +01:00
echo '<div>' .
'<form action = "';
echo JIRAFEAU_ABSPREFIX . 'f.php';
echo '" ' .
'method="post" id="submit_post" class="form login">'; ?>
<input type = "hidden" name = "jirafeau" value = "<?php echo JIRAFEAU_VERSION ?>"/><?php
echo '<fieldset>' .
'<legend>' . t('Password protection') .
'</legend><table><tr><td>' .
t('Give the password of this file') . ' : ' .
'<input type = "password" name = "key" />' .
'</td></tr>' .
'<tr><td>' .
t('By using our services, you accept our'). ' <a href="' . JIRAFEAU_ABSPREFIX . 'tos.php' . '">' . t('Terms of Service') . '</a>.' .
'</td></tr>';
if ($link['onetime'] == 'O') {
echo '<tr><td id="self_destruct">' .
t('Warning, this file will self-destruct after being read') .
'</td></tr>';
} ?><tr><td><input type="submit" id = "submit_download" value="<?php echo t('Download'); ?>"
onclick="document.getElementById('submit_post').action='<?php
echo JIRAFEAU_ABSPREFIX . 'f.php?h=' . $link_name . '&amp;d=1';
if (!empty($crypt_key)) {
echo '&amp;k=' . urlencode($crypt_key);
} ?>';
document.getElementById('submit_download').submit ();"/><?php
if ($cfg['preview'] && jirafeau_is_viewable($link['mime_type'])) {
?><input type="submit" id = "submit_preview" value="<?php echo t('Preview'); ?>"
onclick="document.getElementById('submit_post').action='<?php
echo JIRAFEAU_ABSPREFIX . 'f.php?h=' . $link_name . '&amp;p=1';
if (!empty($crypt_key)) {
echo '&amp;k=' . urlencode($crypt_key);
} ?>';
document.getElementById('submit_preview').submit ();"/><?php
2012-12-07 20:41:43 +00:00
}
echo '</td></tr></table></fieldset></form></div>';
require(JIRAFEAU_ROOT.'lib/template/footer.php');
exit;
} else {
if ($link['key'] == md5($_POST['key'])) {
$password_challenged = true;
} else {
sleep(2);
require(JIRAFEAU_ROOT.'lib/template/header.php');
2012-12-31 15:48:30 +01:00
echo '<div class="error"><p>' . t('Access denied') .
2012-12-31 01:22:14 +01:00
'</p></div>';
require(JIRAFEAU_ROOT.'lib/template/footer.php');
2012-12-07 20:41:43 +00:00
exit;
}
}
}
if (!$password_challenged && !$do_download && !$do_preview) {
require(JIRAFEAU_ROOT.'lib/template/header.php');
echo '<div>' .
'<form action="';
echo JIRAFEAU_ABSPREFIX . 'f.php';
echo '" ' .
'method="post" id="submit_post" class="form download">'; ?>
<input type = "hidden" name = "jirafeau" value = "<?php echo JIRAFEAU_VERSION ?>"/><?php
echo '<fieldset><legend>' . htmlspecialchars($link['file_name']) . '</legend><table>' .
'<tr><td>' .
t('You are about to download') . ' "' . htmlspecialchars($link['file_name']) . '" (' . jirafeau_human_size($link['file_size']) . ').' .
'</td></tr>' .
'<tr><td>' .
t('By using our services, you accept our'). ' <a href="' . JIRAFEAU_ABSPREFIX . 'tos.php' . '">' . t('Terms of Service') . '</a>.' .
'</td></tr>';
if ($link['onetime'] == 'O') {
echo '<tr><td id="self_destruct">' .
t('Warning, this file will self-destruct after being read') .
'</td></tr>';
} ?>
<tr><td><input type="submit" id = "submit_download" value="<?php echo t('Download'); ?>"
onclick="document.getElementById('submit_post').action='<?php
echo JIRAFEAU_ABSPREFIX . 'f.php?h=' . $link_name . '&amp;d=1';
if (!empty($crypt_key)) {
echo '&amp;k=' . urlencode($crypt_key);
} ?>';
2015-03-23 13:48:52 +01:00
document.getElementById('submit_post').submit ();"/><?php
2012-12-31 01:22:14 +01:00
if ($cfg['preview'] && jirafeau_is_viewable($link['mime_type'])) {
?><input type="submit" id = "submit_preview" value="<?php echo t('Preview'); ?>"
onclick="document.getElementById('submit_post').action='<?php
echo JIRAFEAU_ABSPREFIX . 'f.php?h=' . $link_name . '&amp;p=1';
if (!empty($crypt_key)) {
echo '&amp;k=' . urlencode($crypt_key);
} ?>';
2015-03-23 13:48:52 +01:00
document.getElementById('submit_post').submit ();"/><?php
}
echo '</td></tr>';
echo '</table></fieldset></form></div>';
require(JIRAFEAU_ROOT.'lib/template/footer.php');
exit;
2012-12-07 20:41:43 +00:00
}
header('HTTP/1.0 200 OK');
header('Content-Length: ' . $link['file_size']);
if (!jirafeau_is_viewable($link['mime_type']) || !$cfg['preview'] || $do_download) {
header('Content-Disposition: attachment; filename="' . $link['file_name'] . '"');
} else {
header('Content-Disposition: filename="' . $link['file_name'] . '"');
}
header('Content-Type: ' . $link['mime_type']);
header('Content-MD5: ' . hex_to_base64($link['md5']));
/* Read encrypted file. */
if ($link['crypted']) {
/* Init module */
$m = mcrypt_module_open('rijndael-256', '', 'ofb', '');
2013-07-26 15:45:54 +00:00
/* Extract key and iv. */
$md5_key = md5($crypt_key);
$iv = jirafeau_crypt_create_iv($md5_key, mcrypt_enc_get_iv_size($m));
2013-07-26 15:45:54 +00:00
/* Init module. */
mcrypt_generic_init($m, $md5_key, $iv);
/* Decrypt file. */
$r = fopen(VAR_FILES . $p . $link['md5'], 'r');
while (!feof($r)) {
$dec = mdecrypt_generic($m, fread($r, 1024));
print $dec;
ob_flush();
}
fclose($r);
/* Cleanup. */
mcrypt_generic_deinit($m);
mcrypt_module_close($m);
}
/* Read file. */
else {
$r = fopen(VAR_FILES . $p . $link['md5'], 'r');
while (!feof($r)) {
print fread($r, 1024);
ob_flush();
}
fclose($r);
}
if ($link['onetime'] == 'O') {
jirafeau_delete_link($link_name);
}
exit;
?>