Commit 243ae67a authored by Stephan Kreutzer's avatar Stephan Kreutzer

Initial commit. Based on...

Initial commit. Based on https://gitlab.com/publishing-systems/experimental/tree/master/one-time-downloader/.
parents
Stephan Kreutzer, Bahnhofstraße 71, 74321 Bietigheim-Bissingen, GERMANY (https://skreutzer.de, <skreutzer@fsfe.org>): Developer.
Christian Huke, Steinhalderstraße 12, 66999 Hinterweidenthal, GERMANY (<huke.97@ok.de>): Contributed installation page mechanism.
William Durand, GERMANY (https://williamdurand.fr, <will@drnd.me>): $/web/libraries/Negotiation/.
Terrill Dent (https://terrill.ca, <terrilldent@gmail.com>): $/web/tsorter.js
Free Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1335, USA (https://www.fsf.org, <licensing@fsf.org>): Text of the GNU Affero General Public License 3.
This diff is collapsed.
<?php
/* Copyright (C) 2014-2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file $/web/file.php
* @brief Endpoint for downloading.
* @author Stephan Kreutzer
* @since 2019-06-22
*/
require_once("./libraries/https.inc.php");
if (isset($_GET['id']) !== true)
{
header("HTTP/1.0 400 Bad Request");
exit(0);
}
require_once("./libraries/file_management.inc.php");
$file = GetFileByHandle($_GET['id']);
if (is_array($file) !== true)
{
header("HTTP/1.0 404 Not Found");
exit(0);
}
$type = (int)$file['type'];
if ($type === FILESETTING_DOWNLOADTYPE_ONCE &&
$file['datetime_downloaded'] != null)
{
header("HTTP/1.0 404 Not Found");
exit(0);
}
if ($type === FILESETTING_DOWNLOADTYPE_ONCE)
{
// Do this first regardless if the download succeeds, so under no
// condition can a file be requested more than once.
if (SetFileDownloaded((int)$file['id']) !== 0)
{
header("HTTP/1.0 500 Internal Server Error");
exit(0);
}
}
$path = "./files/".$file['file'];
if (file_exists($path) !== true)
{
// Don't tell the client that the handle is valid,
// but just the actual file couldn't be found.
header("HTTP/1.0 404 Not Found");
exit(0);
}
//header("Content-type:application/zip");
/** @todo What about special characters in file names that need to be escaped here? */
header("Content-Disposition:attachment;filename=".$file['name']);
readfile($path);
if ($type === FILESETTING_DOWNLOADTYPE_ONCE)
{
require_once("./libraries/user_management.inc.php");
$user = GetUserById((int)$file['id_user']);
if (is_array($user) === true)
{
@mail($user['e_mail'],
"[Resource Manager] Download",
"Name: ".@htmlspecialchars($file['name'], ENT_COMPAT | ENT_XHTML, "UTF-8")."\n".
"Handle: ".@htmlspecialchars($_GET['id'], ENT_COMPAT | ENT_XHTML, "UTF-8")."\n".
"Creation: ".$file['datetime_created']."Z\n".
"Retrieval: ".gmdate("Y-m-d\TH:i:s")."Z\n",
"From: ".$user['e_mail']."\n".
"MIME-Version: 1.0\n".
"Content-type: text/plain; charset=UTF-8\n");
}
}
exit(0);
?>
<?php
/* Copyright (C) 2012-2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file $/web/files.php
* @brief List of managed files.
* @author Stephan Kreutzer
* @since 2019-06-22
*/
require_once("./libraries/https.inc.php");
require_once("./libraries/session.inc.php");
require_once("./libraries/languagelib.inc.php");
require_once(getLanguageFile("files"));
require_once("./libraries/file_management.inc.php");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".
"<!DOCTYPE html\n".
" PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\n".
" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n".
"<html version=\"-//W3C//DTD XHTML 1.1//EN\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:tsorter=\"http://www.terrill.ca/sorting\" xsi:schemaLocation=\"http://w3.org/MarkUp/SCHEMA/xhtml11.xsd\" xml:lang=\"".getCurrentLanguage()."\" lang=\"".getCurrentLanguage()."\">\n".
" <head>\n".
" <meta http-equiv=\"content-type\" content=\"application/xhtml+xml; charset=UTF-8\"/>\n".
" <title>".LANG_PAGETITLE."</title>\n".
" <link rel=\"stylesheet\" type=\"text/css\" href=\"mainstyle.css\"/>\n".
" <script type=\"text/javascript\" src=\"tsorter.js\"></script>\n".
" <script type=\"text/javascript\">\n".
" window.onload = function() {\n".
" tsorter.create('resources_table', 3);\n".
" };\n".
" </script>\n".
" </head>\n".
" <body>\n".
" <div class=\"mainbox\">\n".
" <div class=\"mainbox_header\">\n".
" <h1 class=\"mainbox_header_h1\">".LANG_HEADER."</h1>\n".
" </div>\n".
" <div class=\"mainbox_body\">\n".
" <table id=\"resources_table\">\n".
" <thead>\n".
" <tr>\n".
" <th tsorter:data-tsorter=\"default\">".LANG_TABLECOLUMNCAPTION_FILENAME."</th>\n".
" <th tsorter:data-tsorter=\"link\">".LANG_TABLECOLUMNCAPTION_URL."</th>\n".
" <th tsorter:data-tsorter=\"default\">".LANG_TABLECOLUMNCAPTION_DOWNLOADTYPE."</th>\n".
" <th tsorter:data-tsorter=\"date\">".LANG_TABLECOLUMNCAPTION_CREATED."</th>\n".
" <th tsorter:data-tsorter=\"date\">".LANG_TABLECOLUMNCAPTION_DOWNLOADED."</th>\n".
" </tr>\n".
" </thead>\n".
" <tbody>\n";
$files = GetFilesByUserId($_SESSION['user_id']);
if (is_array($files) === true)
{
foreach ($files as $file)
{
echo " <tr>\n".
" <td>".htmlspecialchars($file['name'], ENT_COMPAT | ENT_XHTML, "UTF-8")."</td>\n".
" <td>".(HTTPS_ENABLED === true ? "https" : "http")."://".dirname($_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']).DIRECTORY_SEPARATOR."file.php?id=".$file['handle']."</td>\n";
switch ((int)$file['type'])
{
case FILESETTING_DOWNLOADTYPE_ONCE:
echo " <td>".LANG_TEXT_DOWNLOADTYPEONCE."</td>\n";
break;
case FILESETTING_DOWNLOADTYPE_ALWAYS:
echo " <td>".LANG_TEXT_DOWNLOADTYPEALWAYS."</td>\n";
break;
default:
echo " <td>?</td>\n";
break;
}
echo " <td>".$file['datetime_created']."</td>\n".
" <td>".$file['datetime_downloaded']."</td>\n".
" </tr>\n";
}
}
echo " </tbody>\n".
" </table>\n".
" <a href=\"upload.php\">".LANG_LINKCAPTION_UPLOAD."</a>\n".
" </div>\n".
" </div>\n".
" </body>\n".
"</html>\n";
?>
<FilesMatch "(.*)" >
Deny from all
</FilesMatch>
\ No newline at end of file
<?php
/* Copyright (C) 2012-2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file $/web/index.php
* @brief Start page.
* @author Stephan Kreutzer
* @since 2012-06-01
*/
require_once("./libraries/https.inc.php");
if (empty($_SESSION) === true)
{
@session_start();
}
if (isset($_POST['logout']) === true &&
isset($_SESSION['user_id']) === true)
{
$language = null;
if (isset($_SESSION['language']) === true)
{
$language = $_SESSION['language'];
}
$_SESSION = array();
if ($language != null)
{
$_SESSION['language'] = $language;
}
else
{
if (isset($_COOKIE[session_name()]) == true)
{
setcookie(session_name(), '', time()-42000, '/');
}
}
}
require_once("./libraries/languagelib.inc.php");
require_once(getLanguageFile("index"));
require_once("./language_selector.inc.php");
echo "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n".
"<!DOCTYPE html\n".
" PUBLIC \"-//W3C//DTD XHTML 1.1//EN\"\n".
" \"http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd\">\n".
"<html version=\"-//W3C//DTD XHTML 1.1//EN\" xmlns=\"http://www.w3.org/1999/xhtml\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xsi:schemaLocation=\"http://w3.org/MarkUp/SCHEMA/xhtml11.xsd\" xml:lang=\"".getCurrentLanguage()."\" lang=\"".getCurrentLanguage()."\">\n".
" <head>\n".
" <meta http-equiv=\"content-type\" content=\"application/xhtml+xml; charset=UTF-8\"/>\n".
" <title>".LANG_PAGETITLE."</title>\n".
" <link rel=\"stylesheet\" type=\"text/css\" href=\"mainstyle.css\"/>\n".
" </head>\n".
" <body>\n";
if (isset($_POST['name']) !== true ||
isset($_POST['password']) !== true)
{
require_once("./language_selector.inc.php");
echo getHTMLLanguageSelector("index.php");
echo " <div class=\"mainbox\">\n".
" <div class=\"mainbox_header\">\n".
" <h1 class=\"mainbox_header_h1\">".LANG_HEADER."</h1>\n".
" </div>\n".
" <div class=\"mainbox_body\">\n";
if (isset($_POST['install_done']) == true)
{
if (@unlink(dirname(__FILE__)."/install/install.php") === true)
{
clearstatcache();
}
else
{
echo " <p class=\"error\">\n".
" ".LANG_INSTALLDELETEFAILED."\n".
" </p>\n";
}
}
if (file_exists("./install/install.php") === true &&
isset($_GET['skipinstall']) != true)
{
echo " <form action=\"install/install.php\" method=\"post\" class=\"installbutton_form\">\n".
" <fieldset>\n".
" <input type=\"submit\" value=\"".LANG_INSTALLBUTTON."\"/><br/>\n".
" </fieldset>\n".
" </form>\n";
require_once("./license.inc.php");
echo getHTMLLicenseNotification("license");
}
else
{
require_once("./libraries/user_management.inc.php");
if (isset($_SESSION['user_id']) === true &&
isset($_SESSION['instance_path']) === true)
{
$lhs = str_replace("\\", "/", dirname(__FILE__));
if ($lhs === $_SESSION['instance_path'])
{
echo " <a href=\"files.php\">".LANG_LINKCAPTION_FILES."</a><br/>\n";
}
echo " <form action=\"index.php\" method=\"post\">\n".
" <fieldset>\n".
" <input type=\"submit\" name=\"logout\" value=\"".LANG_BUTTON_LOGOUT."\"/><br/>\n".
" </fieldset>\n".
" </form>\n";
}
else
{
echo " <p>\n".
" ".LANG_WELCOMETEXT."\n".
" </p>\n".
" <p>\n".
" ".LANG_LOGINDESCRIPTION."\n".
" </p>\n".
" <form action=\"index.php\" method=\"post\">\n".
" <fieldset>\n".
" <input name=\"name\" type=\"text\" size=\"20\" maxlength=\"60\"/> ".LANG_NAMEFIELD_CAPTION."<br />\n".
" <input name=\"password\" type=\"password\" size=\"20\" maxlength=\"60\"/> ".LANG_PASSWORDFIELD_CAPTION."<br />\n".
" <input type=\"submit\" value=\"".LANG_SUBMITBUTTON."\"/><br/>\n".
" </fieldset>\n".
" </form>\n";
require_once("./license.inc.php");
echo getHTMLLicenseNotification("license");
}
}
echo " </div>\n".
" </div>\n".
" <div class=\"footerbox\">\n".
" <a href=\"license.php\" class=\"footerbox_link\">".LANG_LICENSE."</a>\n".
" </div>\n".
" </body>\n".
"</html>\n".
"\n";
}
else
{
require_once("./libraries/user_management.inc.php");
$user = NULL;
$result = getUserByName($_POST['name']);
if (is_array($result) !== true)
{
echo " <div class=\"mainbox\">\n".
" <div class=\"mainbox_body\">\n".
" <p class=\"error\">\n".
" ".LANG_DBCONNECTFAILED."\n".
" </p>\n".
" </div>\n".
" </div>\n".
" <div class=\"footerbox\">\n".
" <a href=\"license.php\" class=\"footerbox_link\">".LANG_LICENSE."</a>\n".
" </div>\n".
" </body>\n".
"</html>\n";
exit(-1);
}
if (count($result) === 0)
{
echo " <div class=\"mainbox\">\n".
" <div class=\"mainbox_body\">\n".
" <p class=\"error\">\n".
" ".LANG_LOGINFAILED."\n".
" </p>\n".
" <a href=\"index.php\">".LANG_LINKCAPTION_RETRYLOGIN."</a>\n".
" </div>\n".
" </div>\n".
" <div class=\"footerbox\">\n".
" <a href=\"license.php\" class=\"footerbox_link\">".LANG_LICENSE."</a>\n".
" </div>\n".
" </body>\n".
"</html>\n";
exit(0);
}
else
{
// The user does exist, he wants to login.
if ($result[0]['password'] === hash('sha512', $result[0]['salt'].$_POST['password']))
{
$user = array("id" => (int)$result[0]['id']);
}
else
{
echo " <div class=\"mainbox\">\n".
" <div class=\"mainbox_body\">\n".
" <p class=\"error\">\n".
" ".LANG_LOGINFAILED."\n".
" </p>\n".
" <a href=\"index.php\">".LANG_LINKCAPTION_RETRYLOGIN."</a>\n".
" </div>\n".
" </div>\n".
" <div class=\"footerbox\">\n".
" <a href=\"license.php\" class=\"footerbox_link\">".LANG_LICENSE."</a>\n".
" </div>\n".
" </body>\n".
"</html>\n";
exit(0);
}
}
if (is_array($user) === true)
{
$language = null;
if (isset($_SESSION['language']) === true)
{
$language = $_SESSION['language'];
}
$_SESSION = array();
if ($language != null)
{
$_SESSION['language'] = $language;
}
$_SESSION['instance_path'] = str_replace("\\", "/", dirname(__FILE__));
$_SESSION['user_id'] = $user['id'];
$_SESSION['user_name'] = $_POST['name'];
echo " <div class=\"mainbox\">\n".
" <div class=\"mainbox_body\">\n".
" <p class=\"success\">\n".
" ".LANG_LOGINSUCCESS."\n".
" </p>\n".
" <a href=\"index.php\">".LANG_LINKCAPTION_CONTINUE."</a>\n".
" </div>\n".
" </div>\n".
" <div class=\"footerbox\">\n".
" <a href=\"license.php\" class=\"footerbox_link\">".LANG_LICENSE."</a>\n".
" </div>\n";
}
echo " </body>\n".
"</html>\n";
}
?>
/* Copyright (C) 2013-2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
.mainbox_proceed
{
margin: 20px;
}
.languageselector
{
/* Centering. */
width: 70%;
margin: 0 auto;
}
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
<?php
/* Copyright (C) 2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file $/web/lang/de/files.lang.php
* @author Stephan Kreutzer
* @since 2019-06-22
*/
define("LANG_PAGETITLE", "Dateien");
define("LANG_HEADER", "Dateien");
define("LANG_LINKCAPTION_UPLOAD", "Hochladen");
define("LANG_TABLECOLUMNCAPTION_FILENAME", "Name");
define("LANG_TABLECOLUMNCAPTION_URL", "URL");
define("LANG_TABLECOLUMNCAPTION_DOWNLOADTYPE", "Typ");
define("LANG_TABLECOLUMNCAPTION_CREATED", "Angelegt");
define("LANG_TABLECOLUMNCAPTION_DOWNLOADED", "Heruntergeladen");
define("LANG_TEXT_DOWNLOADTYPEONCE", "einmalig");
define("LANG_TEXT_DOWNLOADTYPEALWAYS", "immer");
?>
<?php
/* Copyright (C) 2014-2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file $/web/lang/de/index.lang.php
* @author Stephan Kreutzer
* @since 2014-05-31
*/
define("LANG_PAGETITLE", "Ressourcenverwaltung");
define("LANG_HEADER", "Ressourcenverwaltung");
define("LANG_INSTALLBUTTON", "Installieren");
define("LANG_INSTALLDELETEFAILED", "Die Installation wurde bereits erfolgreich durchgeführt, jedoch ist es der Installation nicht gelungen, sich selbst zu löschen. Bitte löschen Sie mindestens die Datei <tt>\$/install/install.php</tt> oder gleich das ganze Verzeichnis <tt>\$/install/</tt> manuell.");
define("LANG_WELCOMETEXT", "Willkommen bei unserer Ressourcenverwaltung!");
define("LANG_LOGINDESCRIPTION", "Anmeldung:");
define("LANG_NAMEFIELD_CAPTION", "Name");
define("LANG_PASSWORDFIELD_CAPTION", "Passwort");
define("LANG_SUBMITBUTTON", "Bestätigen");
define("LANG_DBCONNECTFAILED", "Problem beim Zugriff auf die Datenbank.");
define("LANG_LOGINSUCCESS", "Die Anmeldung war erfolgreich!");
define("LANG_LOGINFAILED", "Die Anmeldung war nicht erfolgreich!");
define("LANG_LINKCAPTION_FILES", "Dateien");
define("LANG_LINKCAPTION_CONTINUE", "Weiter");
define("LANG_BUTTON_LOGOUT", "Abmelden");
define("LANG_LINKCAPTION_RETRYLOGIN", "Erneut versuchen");
define("LANG_LINKCAPTION_ADMINUSERCREATE", "Neuen Benutzer anlegen");
define("LANG_LICENSE", "Lizenzierung");
?>
<?php
/* Copyright (C) 2014-2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file $/web/lang/de/language_selector.lang.php
* @author Stephan Kreutzer
* @since 2014-05-31
*/
define("LANG_LANGUAGESELECTOR_DESCRIPTION", "Sprache wählen: ");
define("LANG_LANGUAGESELECTOR_SUBMITBUTTON", "Anwenden");
?>
<?php
/* Copyright (C) 2014-2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file $/web/lang/de/license.lang.php
* @author Stephan Kreutzer
* @since 2014-06-06
*/
define("LANG_PAGETITLE", "Lizenzierung");
define("LANG_HEADER", "Lizenzierung");
?>
<?php
/* Copyright (C) 2019 Stephan Kreutzer
*
* This file is part of resource-manager-1.
*
* resource-manager-1 is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License version 3 or any later version,
* as published by the Free Software Foundation.
*
* resource-manager-1 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 3 for more details.
*
* You should have received a copy of the GNU Affero General Public License 3
* along with resource-manager-1. If not, see <http://www.gnu.org/licenses/>.
*/
/**
* @file $/web/lang/de/upload.lang.php
* @author Stephan Kreutzer
* @since 2019-06-22
*/
define("LANG_PAGETITLE", "Hochladen");