initial commit
This commit is contained in:
commit
43f4d75164
50
src/add_share.php
Normal file
50
src/add_share.php
Normal file
@ -0,0 +1,50 @@
|
||||
<?php
|
||||
function current_date_offset($offset)
|
||||
{
|
||||
if ($offset == 'U')
|
||||
{
|
||||
return "";
|
||||
}
|
||||
$date = date_create();
|
||||
$date->add(new DateInterval("P" . $offset));
|
||||
return $date->format(DateTimeInterface::ISO8601);
|
||||
}
|
||||
|
||||
function write_line($dirname, $name, $description, $creation, $expiration, $expires)
|
||||
{
|
||||
file_put_contents(
|
||||
tsv_path($dirname),
|
||||
implode("\t", [
|
||||
$name,
|
||||
$description,
|
||||
$creation,
|
||||
$expiration,
|
||||
$expires . "\n"
|
||||
]),
|
||||
FILE_APPEND
|
||||
);
|
||||
}
|
||||
|
||||
if (isset($_POST) && isset($_GET['action']) && $_GET['action'] == 'add')
|
||||
{
|
||||
$creation = (new DateTime())->format(DateTimeInterface::ISO8601);
|
||||
$expires = current_date_offset($_POST['expiration']);
|
||||
write_line(
|
||||
$_POST['dirname'],
|
||||
$_POST['name'],
|
||||
$_POST['description'],
|
||||
$creation,
|
||||
$_POST['expiration'],
|
||||
$expires
|
||||
);
|
||||
$new_share = [
|
||||
"dir" => $_POST['dirname'],
|
||||
"name" => $_POST['name'],
|
||||
"description" => $_POST['description'],
|
||||
"creation" => $creation,
|
||||
"expiration" => $_POST['expiration'],
|
||||
"expires" => current_date_offset($_POST['expiration'])
|
||||
];
|
||||
$new_share["link"] = "./read.php?id=" . gen_identifier($new_share);
|
||||
}
|
||||
?>
|
181
src/common.php
Normal file
181
src/common.php
Normal file
@ -0,0 +1,181 @@
|
||||
<?php
|
||||
|
||||
function gen_identifier($share)
|
||||
{
|
||||
return md5(
|
||||
implode(
|
||||
"$",
|
||||
[
|
||||
$GLOBALS['SANDDIR_SALT'],
|
||||
$share['dir'],
|
||||
$share['creation']
|
||||
]
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
function dir_list($dir)
|
||||
{
|
||||
$children = array();
|
||||
foreach (scandir($dir) as $child)
|
||||
{
|
||||
if ($child[0] != '.')
|
||||
{
|
||||
$chidren[] = $child;
|
||||
}
|
||||
}
|
||||
return $chidren;
|
||||
}
|
||||
|
||||
function tsv_path($dir)
|
||||
{
|
||||
return implode('/', [
|
||||
$GLOBALS['SANDDIR_ROOT_DIR'],
|
||||
$dir,
|
||||
'.sanddir.tsv'
|
||||
]);
|
||||
}
|
||||
|
||||
function read_tsv($dir, $path)
|
||||
{
|
||||
|
||||
$lines = explode("\n", file_get_contents($path));
|
||||
|
||||
$shares = [];
|
||||
foreach ($lines as $line)
|
||||
{
|
||||
if (!$line)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
$split = explode("\t", $line);
|
||||
if (count($split) < 5)
|
||||
{
|
||||
throw new Exception("Error with line " . $line);
|
||||
}
|
||||
$shares[] = [
|
||||
"dir" => $dir,
|
||||
"name" => $split[0],
|
||||
"description" => $split[1],
|
||||
"creation" => $split[2],
|
||||
"expiration" => $split[3],
|
||||
"expires" => $split[4]
|
||||
];
|
||||
}
|
||||
return $shares;
|
||||
}
|
||||
|
||||
function share_list($dir)
|
||||
{
|
||||
return array_reduce(
|
||||
dir_list($dir),
|
||||
function($carry, $child)
|
||||
{
|
||||
$tsv = tsv_path($child);
|
||||
if (is_file($tsv))
|
||||
{
|
||||
return array_merge($carry, read_tsv($child, $tsv));
|
||||
}
|
||||
return $carry;
|
||||
},
|
||||
[]
|
||||
);
|
||||
}
|
||||
|
||||
function zip_dir($dir)
|
||||
{
|
||||
$filename = tempnam('./tmp', '');
|
||||
$zip = new ZipArchive();
|
||||
$zip->open($filename, ZipArchive::CREATE);
|
||||
|
||||
function inner($stack, $result)
|
||||
{
|
||||
|
||||
$path = implode('/', $stack);
|
||||
if (is_file($path))
|
||||
{
|
||||
array_push($result, $path);
|
||||
}
|
||||
else
|
||||
{
|
||||
foreach (scandir($path) as $elt)
|
||||
{
|
||||
if ($elt[0] == '.')
|
||||
{
|
||||
continue;
|
||||
}
|
||||
else if (is_dir($path))
|
||||
{
|
||||
array_push($stack, $elt);
|
||||
$result = inner($stack, $result);
|
||||
array_pop($stack);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
$result = inner([$GLOBALS['SANDDIR_ROOT_DIR'] . '/' . $dir], []);
|
||||
sort($result);
|
||||
|
||||
$dirs = [];
|
||||
$files = [];
|
||||
foreach ($result as $path)
|
||||
{
|
||||
$path_without_root_dir = array_slice(
|
||||
explode('/', $path), 2
|
||||
);
|
||||
$files[] = [
|
||||
$path,
|
||||
implode('/', $path_without_root_dir)
|
||||
];
|
||||
$dirs[] = array_slice($path_without_root_dir, 0, count($path_without_root_dir) -1);
|
||||
}
|
||||
|
||||
sort($dirs);
|
||||
|
||||
$dirs = array_unique(
|
||||
array_map(
|
||||
function($item)
|
||||
{
|
||||
return implode('/', $item);
|
||||
},
|
||||
$dirs
|
||||
)
|
||||
);
|
||||
|
||||
foreach ($dirs as $dir)
|
||||
{
|
||||
$zip->addEmptyDir($dir);
|
||||
}
|
||||
foreach ($files as $file)
|
||||
{
|
||||
$zip->addFile($file[0], $file[1]);
|
||||
}
|
||||
|
||||
$zip->close();
|
||||
|
||||
return $filename;
|
||||
}
|
||||
|
||||
function zip_response($share)
|
||||
{
|
||||
$filename = zip_dir($share);
|
||||
$size = filesize($filename);
|
||||
header('Content-Type: application/zip');
|
||||
header('Content-Disposition: attachment; filename=' . $share . '.zip');
|
||||
header('Content-Length: ' . $size);
|
||||
ob_end_clean();
|
||||
flush();
|
||||
readfile($filename);
|
||||
exit;
|
||||
}
|
||||
|
||||
function _($var)
|
||||
{
|
||||
print($var);
|
||||
}
|
||||
|
||||
?>
|
4
src/config_sanddir.php
Normal file
4
src/config_sanddir.php
Normal file
@ -0,0 +1,4 @@
|
||||
<?php
|
||||
$SANDDIR_ROOT_DIR = './share';
|
||||
$SANDDIR_SALT = 'abcde12345abcde12345';
|
||||
?>
|
12
src/dir_list_template.php
Normal file
12
src/dir_list_template.php
Normal file
@ -0,0 +1,12 @@
|
||||
<ul>
|
||||
<?php
|
||||
foreach (dir_list($GLOBALS['SANDDIR_ROOT_DIR']) as $share_dir)
|
||||
{
|
||||
?>
|
||||
<li>
|
||||
<a href="?dir=<?php _($share_dir) ?>"><?php _($share_dir) ?></a>
|
||||
</li>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</ul>
|
24
src/index.php
Normal file
24
src/index.php
Normal file
@ -0,0 +1,24 @@
|
||||
<html>
|
||||
<?php
|
||||
$new_share = NULL;
|
||||
|
||||
require_once('./common.php');
|
||||
|
||||
require_once('./config_sanddir.php');
|
||||
|
||||
include('./add_share.php');
|
||||
|
||||
include('./dir_list_template.php');
|
||||
|
||||
if ($new_share)
|
||||
{
|
||||
include('new_share_template.php');
|
||||
}
|
||||
else if (isset($_GET['dir']))
|
||||
{
|
||||
$selected_dir = $_GET['dir'];
|
||||
include('./sanddir.php');
|
||||
}
|
||||
|
||||
?>
|
||||
</html>
|
5
src/new_share_template.php
Normal file
5
src/new_share_template.php
Normal file
@ -0,0 +1,5 @@
|
||||
Share "<?php _($new_share["dir"]) ?> with following link : <a href="<?php _($new_share["link"]) ?>"><?php _($new_share["link"]) ?></a>
|
||||
|
||||
<?php
|
||||
print_r($new_share);
|
||||
?>
|
16
src/read.php
Normal file
16
src/read.php
Normal file
@ -0,0 +1,16 @@
|
||||
<?php
|
||||
require_once('./common.php');
|
||||
|
||||
require_once('./config_sanddir.php');
|
||||
|
||||
if (isset($_GET['id']))
|
||||
{
|
||||
foreach (share_list($GLOBALS['SANDDIR_ROOT_DIR']) as $share)
|
||||
{
|
||||
if (gen_identifier($share) == $_GET['id'])
|
||||
{
|
||||
zip_response($share['dir']);
|
||||
}
|
||||
}
|
||||
}
|
||||
?>
|
8
src/sanddir.php
Normal file
8
src/sanddir.php
Normal file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
function share_links($dir)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
include('./sanddir_template.php');
|
||||
?>
|
48
src/sanddir_template.php
Normal file
48
src/sanddir_template.php
Normal file
@ -0,0 +1,48 @@
|
||||
<h1>Sanddir <?php _($selected_dir); ?></h1>
|
||||
|
||||
<a href="?dir=<?php _($selected_dir); ?>&action=share">Add a share</a>
|
||||
|
||||
<?php
|
||||
if (isset($_GET['action']) && $_GET['action'] == 'share')
|
||||
{
|
||||
?>
|
||||
<form method="POST" action="index.php?dir=<?php _($selected_dir) ?>&action=add">
|
||||
<input name="dirname" id="dirname" type="hidden" value="<?php _($selected_dir) ?>" />
|
||||
<label for="name">Name</label>
|
||||
<input name="name" id="name" type="text" />
|
||||
</br>
|
||||
|
||||
<label for="description">Description</label>
|
||||
<input name="description" id="description" type="text" />
|
||||
</br>
|
||||
|
||||
<label for="expiration">Expiration</label>
|
||||
<select name="expiration" id="expiration">
|
||||
<option value="1D">1 day</option>
|
||||
<option value="1W">1 week</option>
|
||||
<option value="1M">1 month</option>
|
||||
<option value="1Y">1 year</option>
|
||||
<option value="U">undefined</option>
|
||||
</select>
|
||||
</br>
|
||||
|
||||
<input type="submit" />
|
||||
</form>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
|
||||
<h2>Existing links</h2>
|
||||
<ul>
|
||||
<?php
|
||||
foreach (share_links($selected_dir) as $link)
|
||||
{
|
||||
?>
|
||||
<li>
|
||||
<a href="<?php _($link) ?>"><?php _($link) ?></a>
|
||||
</li>
|
||||
<?php
|
||||
}
|
||||
?>
|
||||
</ul>
|
||||
|
Loading…
Reference in New Issue
Block a user