+screenshots
+AUTHORS.md
CHANGELOG.md
CONTRIBUTING.md
Dockerfile
README.md
composer.json
install.php
-.*
\ No newline at end of file
+.*
lib/config.local.php
lib/tos.local.txt
media/custom/
+media/dark-custom/
var-*
*._*
composer.phar
-# Select docker image from https://hub.docker.com/_/php/
-image: php:8.1
-
# Select what we should cache
cache:
paths:
- vendor/
-before_script:
- # Install git, the docker php image doesn't have it installed by default
- - apt-get update -yqq
- - apt-get install git -yqq
- - apt-get install zip -yqq
- # Enable necessary php extensions
- - docker-php-ext-enable curl && docker-php-ext-enable json && docker-php-ext-enable zip && docker-php-ext-enable mbstring && docker-php-ext-enable gd && docker-php-ext-enable pdo_mysql
- # Install composer
- - curl -sS https://getcomposer.org/installer | php
- # Create composer.json file manually, since this is a project without any non-dev dependencies yet
- - php composer.phar require --dev php-parallel-lint/php-parallel-lint
- - php composer.phar require --dev friendsofphp/php-cs-fixer:3.10.0
- # Install all project dependencies
- - php composer.phar install
+# Run tests for php:8.2
+job_lint_app_82:
+ image: php:8.2
+ before_script: &before_linter_script
+ # Install git, the docker php image doesn't have it installed by default
+ - apt-get update -yqq
+ - apt-get install git -yqq
+ - apt-get install zip -yqq
+ # Enable necessary php extensions
+ - docker-php-ext-enable curl && docker-php-ext-enable json && docker-php-ext-enable zip && docker-php-ext-enable mbstring && docker-php-ext-enable gd && docker-php-ext-enable pdo_mysql
+ # Install composer
+ - curl -sS https://getcomposer.org/installer | php
+ # Create composer.json file manually, since this is a project without any non-dev dependencies yet
+ - php composer.phar require --dev php-parallel-lint/php-parallel-lint
+ - php composer.phar require --dev friendsofphp/php-cs-fixer:3.64.0
+ # Install all project dependencies
+ - php composer.phar install
+ script: &linter_script
+ - ./vendor/bin/parallel-lint --exclude vendor .
+ - ./vendor/bin/php-cs-fixer -vvv check . --using-cache=no --rules=@PSR12,-single_space_around_construct
-# Run tests
+# Run tests for php:8.1
job_lint_app_81:
image: php:8.1
- script:
- - ./vendor/bin/parallel-lint --exclude vendor .
- - ./vendor/bin/php-cs-fixer -vvv fix . --dry-run --using-cache=no --rules=@PSR2
+ before_script: *before_linter_script
+ script: *linter_script
+# Run tests for php:7.4
job_lint_app_74:
image: php:7.4
+ before_script: *before_linter_script
+ script: *linter_script
+
+publish:
+ image: docker:latest
+ stage: deploy
+ services:
+ - docker:dind
script:
- - ./vendor/bin/parallel-lint --exclude vendor .
- - ./vendor/bin/php-cs-fixer -vvv fix . --dry-run --using-cache=no --rules=@PSR2
+ # Login to GitLab's Docker registry
+ - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
+ # Create a new builder instance and switch to it
+ - docker buildx create --use
+ # Build the image:
+ # 1. Build a Docker image for linux/arm/v7, linux/arm64/v8 and linux/amd64
+ # 2. Tag it with the current commit tag and "latest"
+ # 3. Push it to GitLab's Docker registry
+ - docker buildx build --push --platform linux/arm/v7,linux/arm64/v8,linux/amd64 --tag $CI_REGISTRY/$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG --tag $CI_REGISTRY/$CI_REGISTRY_IMAGE:latest .
+ only:
+ - tags
--- /dev/null
+# Authors of Jirafeau
+
+## Main author of Jirafeau from 2015 to 2024
+
+Jirafeau was originally a project by **Jérôme Jutteau**, who forked the [Jyraphe](https://web.archive.org/web/20170506133242/home.gna.org/jyraphe) project in 2015. He was the main author Jirafeau from 2015 to 2024.
+
+Jyraphe was authored by **Julien "axolotl" Bernard**.
+
+## Contributors of Jirafeau from 2015 to present
+
+This is a list of people who contributed to Jirafeau over the years. The list was generated by extracting the authors from the Git history. If we forgot someone, it was simply by accident and not intentionally.
+
+- Allan Nordhøy
+- Alper Burcu Torun
+- Andrea Zucchelli
+- Ante Nakic
+- asashi
+- Asharas
+- bendia
+- Blackeye
+- Borja Saavedra Valdés
+- ButterflyOfFire
+- Cem
+- Dan Untenzu
+- Dark Horse
+- Dennis de Best
+- Edwin Bos
+- Erik Hubers
+- Erik Lundin
+- Étienne Deparis
+- Eugene Barbashin
+- Fabien Clément
+- Federico Bailes
+- Fedor Piecka
+- ferranroig
+- Florian Fricke
+- flsabourin
+- fm-sys
+- François Boulogne
+- François L
+- GoZ
+- Guilherme Andrade
+- gwunderlich
+- Hunter Fuller
+- hüseyinyıldız
+- Igor Posledov
+- ikmaak
+- Ioannis
+- Jack Footner
+- Jasper
+- j-broo
+- Jeannette L
+- Jimmy Beauvois
+- Jindřich Skácel
+- J. Lavoie
+- João Paulo Freire
+- JuLien42
+- Julien Malik
+- KajmaczeK
+- Kidhoma Norman
+- Lari Oesch
+- Laurentiu Dobrota
+- Luna Jernberg
+- Marc Gallet
+- Marc Hauswirth
+- Mathis Mensing
+- Matthieu Schneider
+- Mattias Münster
+- max keiser
+- Michal Čihař
+- Milo Ivir
+- Misik
+- M Krisztián
+- MrWouterNL
+- Nelson Pereira
+- Nicky Galliano
+- Oded
+- Oğuz Ersen
+- Olivier Esver
+- omar anwar aglan
+- Oskar Fagerfjäll
+- Patrick Canterino
+- Pierre-Alain Bandinelli
+- pixelbrackets
+- Poorchop
+- Pyry
+- Pyry Kujala
+- R.W
+- Sabri Ünal
+- sam lt
+- Sandybunting
+- scumjr
+- Sebastien Mennetrier
+- Slobodan Simić
+- Spanti Nicola (RyDroid)
+- Srikanth L
+- ssantos
+- Starus
+- Stefano Mortellaro
+- Sven Dickert
+- Sylke Vicious
+- Szylu
+- Thomas LEBEAU
+- Thomas Sontheimer
+- Tymofij Lytvynenko
+- Vasilis Giann
+- Victor Lamoine
+- Viktar Vauchkevich
+- Wim Livens
+- Yaron Shahrabani
+- YFdyh000
+- Your Name
+- Zertrin
+- Zoltán Faludi
+- Степанчук Максим
+- Слободан Симић
\ No newline at end of file
5. Follow the installation wizard, it should propose you the same data folder or even update automatically
6. Check your `/lib/config.local.php` and compare it with the `/lib/config.original.php` to see if new configuration items are available. If a new item is missing in your `config.local.php`, this may trigger some errors as Jirafeau may expect to have them.
+## Version 4.6.1
+
+- Removed the download button and the corresponding link for encrypted files from the admin interface
+- Fixed an issue with sending the wrong filesize after decrypting an encrypted file
+- Fixed the possibility to bypass the check for CVE-2022-30110 (prevent preview of SVG images) by sending a manipulated HTTP request with a MIME type like "image/svg+XML".
+- We now provide Docker images for AMD64 and ARM64 systems
+- Lots of code refactoring and cleanup
+- Few more little fixes
+- Typo and spelling mistakes
+- Upgrade from 4.6.0: in-place upgrade
+
+New configuration items:
+- `one_time_download_preselected` for preselecting the checkbox for deleting the file after the first download
+
## Version 4.6.0
- New configuration options for allowing to require, check or generate file download passwords
- Removed usage of deprecated `strftime()` function
- Few more little fixes
- Typo and spelling mistakes
+- Upgrade from 4.5.0: in-place upgrade
New configuration items:
- `download_password_requirement`, `download_password_gen_len`, `download_password_gen_chars`, `download_password_policy` and `download_password_policy_regex` for configuring file download passwords
## Translations
-Translation may be added via [Jirafeau's Weblate](https://hosted.weblate.org/projects/jirafeau/master/).
+Translations may be added by creating a new JSON file under `locales` and submitting a merge request.
## Coding style
-- This project follows the [PSR-2](http://www.php-fig.org/psr/psr-2/) Coding Style
+- This project follows the [PSR-12](https://www.php-fig.org/psr/psr-12/) coding style
- Files must be in UTF-8 without BOM and use Unix Line Endings (LF)
## Branches
## New Releases
-* Fetch weblate and rebase and import translations
* If the release is not done for security purposes: create a new issue and freeze next-release branch for at least week.
* Compare the [`next-release` branch to `master`](https://gitlab.com/jirafeau/Jirafeau/compare/master...next-release)
* Add a list of noteworthy features and bugfixes to `CHANGELOG.md`
ln -snf /usr/share/zoneinfo/Etc/UTC /etc/localtime && \
echo "UTC" > /etc/timezone
-COPY docker/cleanup.sh /cleanup.sh
-COPY docker/run.sh /run.sh
-RUN chmod o=,ug=rx /cleanup.sh /run.sh
-COPY docker/docker_config.php /docker_config.php
+COPY --chmod=550 docker/cleanup.sh docker/run.sh /
+COPY --chmod=640 docker/docker_config.php /docker_config.php
-RUN mkdir -p /usr/local/etc/php
COPY docker/php.ini /usr/local/etc/php/php.ini
COPY docker/lighttpd.conf /etc/lighttpd/lighttpd.conf
-# install jirafeau
-RUN mkdir /www
+# Install Jirafeau
WORKDIR /www
-# Will ignore some files through .dockerignore
-COPY . .
-RUN rm -rf docker && \
+
+RUN --mount=type=bind,source=.,target=/mnt \
+ cp -r /mnt/* /www/ && \
+ rm -rf /www/docker && \
touch /www/lib/config.local.php && \
chown -R $(id -u lighttpd).$(id -g www-data) /www && \
- chmod o=,ug=rwX -R /www
+ chmod 770 /www
-CMD /run.sh
+CMD ["/run.sh"]
EXPOSE 80
\ No newline at end of file
See [jirafeau.net](https://jirafeau.net/) for a demo.
-![Screenshot1](http://i.imgur.com/TPjh48P.png)
+![Screenshot1](screenshots/upload1.png)
## DISCLAMER
## Screenshots
-- [Installation - Step 1](http://i.imgur.com/hmpT1eN.jpg)
-- [Installation - Step 2](http://i.imgur.com/2e0UGKE.jpg)
-- [Installation - Step 3](http://i.imgur.com/ofAjLXh.jpg)
-- [Installation - Step 4](http://i.imgur.com/WXqnfqJ.jpg)
-- [Upload - Step 1](http://i.imgur.com/SBmSwzJ.jpg)
-- [Upload - Step 2](http://i.imgur.com/wzPkb1Z.jpg)
-- [Upload - Progress](http://i.imgur.com/i6n95kv.jpg)
-- [Upload - Confirmation page](http://i.imgur.com/P2oS1MY.jpg)
-- [Admin Interface](http://i.imgur.com/nTdsVzn.png)
+- [Installation - Step 1](screenshots/install1.png)
+- [Installation - Step 2](screenshots/install2.png)
+- [Installation - Step 3](screenshots/install3.png)
+- [Upload - Step 1](screenshots/upload1.png)
+- [Upload - Step 2](screenshots/upload2.png)
+- [Upload - Progress](screenshots/upload_progress.png)
+- [Upload - Confirmation page](screenshots/upload_confirm.png)
+- [Admin Interface](screenshots/admin.png)
## Installation
This shows how to install Jirafeau by your own, it's quite simple but you can
-also use a [docker image](https://hub.docker.com/r/mojo42/jirafeau/) or build
-it yourself. Check [docker folder](docker/README.md) for more informations.
+also use a [docker image](https://gitlab.com/jirafeau/Jirafeau/container_registry/) or build
+it yourself. Check [docker folder](docker/README.md) for more information.
System requirements:
- PHP >= 7.4
- Check your `/lib/config.local.php` file and compare it with `/lib/config.original.php`, the configuration syntax or a parameter may have changed
- Check owner and permissions of your files
-- set `debug` option to `true` to check any warning or error
+- Set `debug` option to `true` to check any warning or error
## Security
`var` directory contains all files and links. It is randomly named to limit access but you may add better protection to prevent un-authorized access to it.
You have several options:
+
- Configure a `.htaccess`
- Move var folder to a place on your server which can't be directly accessed
- Disable automatic listing on your web server config or place a index.html in var's sub-directory (this is a limited solution)
-If you are using Apache, you can add the following line to your configuration to prevent people to access to your `var` folder:
+If you are using Apache, you can add the following lines to your configuration to prevent people to access to your `var` folder:
+
+```apache
+<LocationMatch "^/var-*">
+ Require all denied
+</LocationMatch>
+```
+
+Or you can put a `.htaccess` file containing this into your `var` folder:
-`RedirectMatch 301 ^/var-.* http://my.service.jirafeau`
+```apache
+Require all denied
+```
If you are using nginx, you can add the following to your $vhost.conf:
You may change the default theme to any of the existing ones or a custom.
-Open your `lib/config.local.php` and change setting in the `style` key to the name of any folder in the `/media` directory.
+Open your `lib/config.local.php` and change setting in the `style` key to the name of any folder in the `/media` directory. If you want to change the theme for dark mode, you have to set the `dark_style` key in the config file.
-Hint: To create a custom theme just copy the `courgette` folder and name your theme `custom` (this way it will be ignored by git and not overwritten during updates). You are invited to enhance the existing themes and send pull requests however.
+Hint: To create a custom theme just copy the `courgette` folder and name your theme `custom` (this way it will be ignored by git and not overwritten during updates). If you want to create a custom theme for dark mode, you have to put it in a folder named `dark-custom`. You are invited to enhance the existing themes and send pull requests however.
### I found a bug, what should I do?
Feel free to open a bug in the [GitLab's issues](https://gitlab.com/jirafeau/Jirafeau/issues).
-If you can, please copy-paste informations related to bug opening provided in admin interface.
+If you can, please copy-paste information related to bug opening provided in admin interface.
Admin interface can be reached by accessing `/admin.php`.
### How to set maximum file size?
### How can I edit an option?
-Documentation of all default options are located in [lib/config.original.php](https://gitlab.com/jirafeau/Jirafeau/blob/master/lib/config.original.php).
-If you want to change an option, just edit your `lib/config.local.php`.
+Documentation of all default options are located in [/lib/config.original.php](https://gitlab.com/jirafeau/Jirafeau/blob/master/lib/config.original.php).
+If you want to change an option, just edit your `/lib/config.local.php`.
### How can I change the Terms of Service?
### Can I buy you a coffee?
-You can [drop few bucks for Jérôme Jutteau](https://www.paypal.com/paypalme/jeromejutteau).
+You can [drop few bucks for Jérôme Jutteau](https://www.paypal.com/paypalme/jeromejutteau)
+
+Many Thanks <3
<?php
/*
* Jirafeau, your web file repository
+ * Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
* Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* 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/>.
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
session_start();
define('JIRAFEAU_ROOT', dirname(__FILE__) . '/');
if ($cfg['installation_done'] == false) {
die("Installation not completed yet.\n");
}
- if ((count($argv)>1) && $argv[1]=="clean_expired") {
+ if ((count($argv) > 1) && $argv[1] == 'clean_expired') {
$total = jirafeau_admin_clean();
echo "$total expired files deleted.\n";
- } elseif ((count($argv)>1) && $argv[1]=="clean_async") {
+ } elseif ((count($argv) > 1) && $argv[1] == 'clean_async') {
$total = jirafeau_admin_clean_async();
echo "$total old unfinished transfers deleted.\n";
} else {
die("No command found. Should be admin.php <clean_expired|clean_async>.\n");
}
-// Second check: Challenge by IP
-} elseif (true === jirafeau_challenge_admin_ip($cfg, get_ip_address($cfg))) {
+}
+/* Second check: Challenge by IP */
+elseif (true === jirafeau_challenge_admin_ip($cfg, get_ip_address($cfg))) {
/* Disable admin interface if we have a empty admin password. */
if (empty($cfg['admin_password']) && empty($cfg['admin_http_auth_user'])) {
require(JIRAFEAU_ROOT . 'lib/template/header.php');
## Run Jirafeau through a pre-made Docker image
-**There are currently no official pre-made Docker images of Jirafeau! The repository mentioned in this section is outdated!**
+Jirafeau is a small PHP application so running it inside a Docker container is pretty straightforward. Container images are built for AMD64 and ARM64 systems and can be downloaded from our registry at `registry.gitlab.com`.
-Jirafeau is a small PHP application so running it inside a docker container is pretty straightforward.
-
-```
-docker pull mojo42/jirafeau:latest
-docker run -it --rm -p 8080:80 mojo42/jirafeau:latest
+```shell
+docker pull registry.gitlab.com/jirafeau/jirafeau:latest
+docker run -it --rm -p 8080:80 registry.gitlab.com/jirafeau/jirafeau:latest
```
Then connect on [localhost:8080](http://localhost:8080/).
## Build your own Jirafeau docker image
-```
+```shell
git clone https://gitlab.com/jirafeau/Jirafeau.git
cd Jirafeau
docker build -t your/jirafeau:latest .
## Security
You may be interested in running Jirafeau on port 80:
-```
-docker run -d -p 80:80 --sysctl net.ipv4.ip_unprivileged_port_start=80 mojo42/jirafeau
+
+```shell
+docker run -d -p 80:80 --sysctl net.ipv4.ip_unprivileged_port_start=80 registry.gitlab.com/jirafeau/jirafeau
```
Note that Jirafeau image does not provide any SSL/TLS. You may be interested in using [docker compose](https://docs.docker.com/compose/) combined with [Let's Encrypt](https://letsencrypt.org/).
- `DARK_STYLE`: apply a specific style for browsers in dark mode.
- `AVAILABILITY_DEFAULT`: setup which availability shows by default.
- `ONE_TIME_DOWNLOAD`: set to 1 or 0 to enable or disable one time downloads.
+- `ONE_TIME_DOWNLOAD_PRESELECTED`: set to 1 or 0 to preselect the checkbox for one time downloads.
- `ENABLE_CRYPT`: set to 1 or 0 to enable or disable server side encryption.
- `DEBUG`: set to 1 or 0 to enable or disable debug mode.
- `MAXIMAL_UPLOAD_SIZE`: maximal file size allowed (expressed in MB).
- `DOWNLOAD_PASSWORD_POLICY_REGEX`: regex to check against if password policy is set to regex
Example:
-```
-docker run -it -p 8080:80 --rm -e ADMIN_PASSWORD='p4ssw0rd' -e WEB_ROOT='jirafeau.mydomain.com/' -e UPLOAD_PASSWORD='foo,bar' -e PREVIEW=0 mojo42/jirafeau:latest
+
+```shell
+docker run -it -p 8080:80 --rm -e ADMIN_PASSWORD='p4ssw0rd' -e WEB_ROOT='jirafeau.mydomain.com/' -e UPLOAD_PASSWORD='foo,bar' -e PREVIEW=0 registry.gitlab.com/jirafeau/jirafeau:latest
```
## Data storage
Note that configuration is not stored in /data.
Example of using a dedicated volume to store Jirafeau data separately from the container:
-```
+
+```shell
docker volume create jirafeau_data
-docker run -it --rm -p 8080:80 --mount source=jirafeau_data,target=/data mojo42/jirafeau:latest
+docker run -it --rm -p 8080:80 --mount source=jirafeau_data,target=/data registry.gitlab.com/jirafeau/jirafeau:latest
+```
+
+It is also possible to put Jirafeau data into an already existing directory outside the container:
+
+```shell
+mkdir /tmp/jirafeau_data
+docker run -it --rm -p 8080:80 -v /tmp/jirafeau_data:/data registry.gitlab.com/jirafeau/jirafeau:latest
```
+Please note that the files and directories created in the directory outside the container will probably be owned by UID 100.
+
## Few notes
- `var-...` folder where lives all uploaded data is protected from direct access
<?php
/*
* Jirafeau, your web file repository
- * Copyright (C) 2020 Jérôme Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
+ * Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
env_2_cfg_string($cfg, 'availability_default');
env_2_cfg_string($cfg, 'dark_style');
env_2_cfg_bool($cfg, 'one_time_download');
+ env_2_cfg_bool($cfg, 'one_time_download_preselected');
env_2_cfg_bool($cfg, 'enable_crypt');
env_2_cfg_bool($cfg, 'debug');
env_2_cfg_int($cfg, 'maximal_upload_size');
}
}
-run_setup($cfg);
\ No newline at end of file
+run_setup($cfg);
* Jirafeau, your web file repository
* Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
* Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* 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/>.
+ * along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
define('JIRAFEAU_ROOT', dirname(__FILE__) . '/');
<?php
/*
* Jirafeau, your web file repository
- * Copyright (C) 2013
- * Jerome Jutteau <jerome@jutteau.fr>
- * Jimmy Beauvois <jimmy.beauvois@gmail.com>
+ * Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
+ * Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
require(JIRAFEAU_ROOT . 'lib/functions.php');
require(JIRAFEAU_ROOT . 'lib/lang.php');
-if ($cfg['download_password_requirement'] === "generated"){
+if ($cfg['download_password_requirement'] === "generated") {
$download_pass = jirafeau_gen_download_pass($cfg['download_password_gen_len'], $cfg['download_password_gen_chars']);
}
}
?>
-<div id="upload_finished">
- <p><?php echo t('FILE_UP') ?></p>
- <div id="upload_finished_download_page">
- <p>
- <a id="upload_link" href=""><?php echo t('DL_PAGE') ?></a>
- <a id="upload_link_email" href=""><img id="upload_image_email"/></a>
- </p><p>
- <code id=upload_link_text></code>
- <button id="upload_link_button">📋</button>
- </p>
- </div>
-
- <?php if ($cfg['download_password_requirement'] === "generated"){
- ?>
- <div id="show_password">
- <p><?php echo t('PSW') ?></p>
-
- <div id="download_password">
- <p>
- <?php echo '<input id="output_key" value="' . $download_pass . '"/>'?>
- <button id="password_copy_button">📋</button>
- </p>
- </div>
- </div>
- <?php
- }?>
-
- <?php if ($cfg['preview'] == true) {
- ?>
- <div id="upload_finished_preview">
- <p>
- <a id="preview_link" href=""><?php echo t('VIEW_LINK') ?></a>
- </p><p>
- <code id=preview_link_text></code>
- <button id="preview_link_button">📋</button>
- </p>
- </div>
- <?php
- } ?>
-
- <div id="upload_direct_download">
- <p>
- <a id="direct_link" href=""><?php echo t('DIRECT_DL') ?></a>
- </p><p>
- <code id=direct_link_text></code>
- <button id="direct_link_button">📋</button>
- </p>
- </div>
-
- <div id="upload_delete">
- <p>
- <a id="delete_link" href=""><?php echo t('DELETE_LINK') ?></a>
- </p><p>
- <code id=delete_link_text></code>
- <button id="delete_link_button">📋</button>
- </p>
- </div>
-
- <div id="upload_validity">
- <p><?php echo t('VALID_UNTIL'); ?>:</p>
- <p id="date"></p>
- </div>
-</div>
+<?php jirafeau_create_upload_finished_box($cfg['preview']); ?>
<div id="uploading">
<p>
<input type="file" id="file_select" size="30"
onchange="control_selected_file_size(<?php echo $cfg['maximal_upload_size'] ?>, '<?php
if ($cfg['maximal_upload_size'] >= 1024) {
- echo t('2_BIG') . ', ' . t('FILE_LIM') . " " . number_format($cfg['maximal_upload_size']/1024, 2) . " GB.";
+ echo t('2_BIG') . ', ' . t('FILE_LIM') . " " . number_format($cfg['maximal_upload_size'] / 1024, 2) . " GB.";
} elseif ($cfg['maximal_upload_size'] > 0) {
echo t('2_BIG') . ', ' . t('FILE_LIM') . " " . $cfg['maximal_upload_size'] . " MB.";
}
<?php
if ($cfg['one_time_download']) {
echo '<tr><td>' . t('ONE_TIME_DL') . ':</td>';
- echo '<td><input type="checkbox" id="one_time_download" /></td></tr>';
- }
- if ($cfg['download_password_requirement'] === 'generated'){
- echo '<input type="hidden" name="key" id="input_key" value="' . $download_pass .'"/>';
- }else{
- echo '<tr><td><label for="input_key">' . t('PSW') . ':' . '</label></td>';
- echo '<td><input type="password" name="key" id="input_key" autocomplete = "new-password"';
- if ($cfg['download_password_policy'] === 'regex'){
- echo ' pattern="' . substr($cfg['download_password_policy_regex'], 1, strlen($cfg['download_password_policy_regex']) - 2) . '"'; //remove php delimiters
- }
- if ($cfg['download_password_requirement'] === 'required'){
- echo ' required';
+ echo '<td><input type="checkbox" id="one_time_download"';
+
+ if ($cfg['one_time_download_preselected']) {
+ echo ' checked';
}
- echo '/></td></tr>';
- }?>
+
+ echo ' /></td></tr>';
+ }
+if ($cfg['download_password_requirement'] === 'generated') {
+ echo '<input type="hidden" name="key" id="input_key" value="' . $download_pass .'"/>';
+} else {
+ echo '<tr><td><label for="input_key">' . t('PSW') . ':' . '</label></td>';
+ echo '<td><input type="password" name="key" id="input_key" autocomplete = "new-password"';
+ if ($cfg['download_password_policy'] === 'regex') {
+ echo ' pattern="' . substr($cfg['download_password_policy_regex'], 1, strlen($cfg['download_password_policy_regex']) - 2) . '"'; //remove php delimiters
+ }
+ if ($cfg['download_password_requirement'] === 'required') {
+ echo ' required';
+ }
+ echo '/></td></tr>';
+}?>
<tr>
<td><label for="select_time"><?php echo t('TIME_LIM') . ':'; ?></label></td>
- <td><select name="time" id="select_time">
- <?php
-$expirationTimeOptions = array(
- array(
- 'value' => 'minute',
- 'label' => '1_MIN'
- ),
- array(
- 'value' => 'hour',
- 'label' => '1_H'
- ),
- array(
- 'value' => 'day',
- 'label' => '1_D'
- ),
- array(
- 'value' => 'week',
- 'label' => '1_W'
- ),
- array(
- 'value' => 'fortnight',
- 'label' => '2_W'
- ),
- array(
- 'value' => 'month',
- 'label' => '1_M'
- ),
- array(
- 'value' => 'quarter',
- 'label' => '1_Q'
- ),
- array(
- 'value' => 'year',
- 'label' => '1_Y'
- ),
- array(
- 'value' => 'none',
- 'label' => 'NONE'
- )
-);
-foreach ($expirationTimeOptions as $expirationTimeOption) {
- $selected = ($expirationTimeOption['value'] === $cfg['availability_default'])? 'selected="selected"' : '';
- if (true === $cfg['availabilities'][$expirationTimeOption['value']]) {
- echo '<option value="' . $expirationTimeOption['value'] . '" ' .
- $selected . '>' . t($expirationTimeOption['label']) . '</option>';
- }
-}
-?>
- </select></td>
+ <td>
+ <?php jirafeau_create_selection_array($cfg); ?>
+ </td>
</tr>
<?php
/*
* Jirafeau, your web file repository
* Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
- * Copyright (C) 2015 Nicola Spanti (RyDroid) <dev@nicola-spanti.info>
+ * Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
'abcdefghijklmnopqrstuvwxyz' . '0123456789';
$len_alphanum = strlen($alphanum);
$var = 'var-';
- for ($i = 0; $i <JIRAFEAU_VAR_RAND_LENGTH; $i++) {
+ for ($i = 0; $i < JIRAFEAU_VAR_RAND_LENGTH; $i++) {
$var .= substr($alphanum, mt_rand(0, $len_alphanum - 1), 1);
}
echo JIRAFEAU_ROOT . $var . '/';
* Jirafeau, your web file repository
* Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
* Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
*/
$cfg['one_time_download'] = true;
+/* When set to "true", the checkbox for deleting the file after the first download
+ * is preselected.
+ */
+$cfg['one_time_download_preselected'] = false;
+
/* Set maximal upload size expressed in MB.
* »0« means unlimited upload size.
*/
<?php
/*
* Jirafeau, your web file repository
+ * Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
* Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
- * Copyright (C) 2015 Nicola Spanti (RyDroid) <dev@nicola-spanti.info>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*/
+function template_js_preview_link()
+{
+ ?>
+ if (!!document.getElementById('preview_link'))
+ {
+ document.getElementById('upload_finished_preview').style.display = 'none';
+ var preview_link_href = 'f.php?h=' + reference + '&p=1';
+ if (crypt_key.length > 0)
+ {
+ preview_link_href += '&k=' + crypt_key;
+ }
+
+ // Test if content can be previewed
+ type = document.getElementById('file_select').files[0].type;
+ if ((type.startsWith('image/')
+ || type.startsWith('audio')
+ || type.startsWith('text/plain')
+ || type.startsWith('video/'))
+ && !type.includes('image/svg+xml'))
+ {
+ document.getElementById('preview_link').href = preview_link_href;
+ document.getElementById('preview_link_text').innerHTML = web_root + preview_link_href;
+ document.getElementById('upload_finished_preview').style.display = '';
+ }
+ }
+ <?php
+}
+function template_js_download_page()
+{
+ ?>
+ // Download page
+ var download_link_href = 'f.php?h=' + reference;
+ if (crypt_key.length > 0)
+ {
+ download_link_href += '&k=' + crypt_key;
+ }
+ if (!!document.getElementById('upload_finished_download_page'))
+ {
+ document.getElementById('upload_link').href = download_link_href;
+ document.getElementById('upload_link_text').innerHTML = web_root + download_link_href;
+ }
+ <?php
+}
+function template_js_email_link()
+{
+ ?>
+ // Email link
+ var b = encodeURIComponent("<?php echo t("DL"); ?> \"" + filename + "\":") + "%0D" + "%0A";
+ b += encodeURIComponent(web_root + download_link_href) + "%0D" + "%0A";
+ if (false == isEmpty(date))
+ {
+ b += "%0D" + "%0A" + encodeURIComponent("<?php echo t("VALID_UNTIL"); ?>: " + date.format('YYYY-MM-DD hh:mm (GMT O)')) + "%0D" + "%0A";
+ document.getElementById('upload_link_email').href = "mailto:?body=" + b + "&subject=" + encodeURIComponent(filename);
+ }
+ <?php
+}
+function template_js_delete_link()
+{
+ ?>
+ // Delete link
+ var delete_link_href = 'f.php?h=' + reference + '&d=' + delete_code;
+ document.getElementById('delete_link').href = delete_link_href;
+ document.getElementById('delete_link_text').innerHTML = web_root + delete_link_href;
+ <?php
+}
+function template_js_direct_download()
+{
+ ?>
+ // Direct download link
+ var direct_download_link_href = 'f.php?h=' + reference + '&d=1';
+ if (crypt_key.length > 0)
+ {
+ direct_download_link_href += '&k=' + crypt_key;
+ }
+ document.getElementById('direct_link').href = direct_download_link_href;
+ document.getElementById('direct_link_text').innerHTML = web_root + direct_download_link_href;
+ <?php
+}
+function template_js_date_function()
+{
+ ?>
+ // Validity date
+ if (isEmpty(date))
+ {
+ document.getElementById('date').style.display = 'none';
+ }
+ else {
+ document.getElementById('date').innerHTML =
+ '<span class="datetime"'
+ + 'data-datetime="'
+ + dateToUtcString(date) + ' (GMT"'
+ + 'title="'
+ + dateToUtcString(date) + ' (GMT)">'
+ + date.format('YYYY-MM-DD hh:mm (GMT O)')
+ + '</span>';
+ document.getElementById('date').style.display = '';
+ }
+ <?php
+}
+
+
+
+
header('Content-Type: text/javascript');
define('JIRAFEAU_ROOT', dirname(__FILE__) . '/../');
}
}
+// evil copy and paste from show_link - TODO refactor show link
+function show_link_from_php (file_name,file_type, reference, delete_code, crypt_key, date)
+{
+ <?php template_js_download_page(); ?>
+
+
+ var filename = file_name;
+ <?php template_js_email_link(); ?>
+ <?php template_js_delete_link(); ?>
+ <?php template_js_date_function(); ?>
+ var type = file_type;
+ <?php template_js_direct_download();?>
+}
+
+
+
function show_link (reference, delete_code, crypt_key, date)
{
// Upload finished
document.getElementById('upload_finished').style.display = '';
document.title = "100% - <?php echo empty($cfg['title']) ? 'Jirafeau' : $cfg['title']; ?>";
- // Download page
- var download_link_href = 'f.php?h=' + reference;
- if (crypt_key.length > 0)
- {
- download_link_href += '&k=' + crypt_key;
- }
- if (!!document.getElementById('upload_finished_download_page'))
- {
- document.getElementById('upload_link').href = download_link_href;
- document.getElementById('upload_link_text').innerHTML = web_root + download_link_href;
- }
-
+ <?php template_js_download_page(); ?>
// Email link
var filename = document.getElementById('file_select').files[0].name;
- var b = encodeURIComponent("<?php echo t("DL"); ?> \"" + filename + "\":") + "%0D" + "%0A";
- b += encodeURIComponent(web_root + download_link_href) + "%0D" + "%0A";
- if (false == isEmpty(date))
- {
- b += "%0D" + "%0A" + encodeURIComponent("<?php echo t("VALID_UNTIL"); ?>: " + date.format('YYYY-MM-DD hh:mm (GMT O)')) + "%0D" + "%0A";
- document.getElementById('upload_link_email').href = "mailto:?body=" + b + "&subject=" + encodeURIComponent(filename);
- }
- // Delete link
- var delete_link_href = 'f.php?h=' + reference + '&d=' + delete_code;
- document.getElementById('delete_link').href = delete_link_href;
- document.getElementById('delete_link_text').innerHTML = web_root + delete_link_href;
+ <?php template_js_email_link(); ?>
+
+ <?php template_js_delete_link(); ?>
+ <?php template_js_date_function(); ?>
- // Validity date
- if (isEmpty(date))
- {
- document.getElementById('date').style.display = 'none';
- }
- else {
- document.getElementById('date').innerHTML = '<span class="datetime" title="'
- + dateToUtcString(date) + ' (GMT)">'
- + date.format('YYYY-MM-DD hh:mm (GMT O)')
- + '</span>';
- document.getElementById('date').style.display = '';
- }
// Preview link (if allowed)
- if (!!document.getElementById('preview_link'))
- {
- document.getElementById('upload_finished_preview').style.display = 'none';
- var preview_link_href = 'f.php?h=' + reference + '&p=1';
- if (crypt_key.length > 0)
- {
- preview_link_href += '&k=' + crypt_key;
- }
+
+ var type = document.getElementById('file_select').files[0].type;
+ <?php template_js_preview_link(); ?>
- // Test if content can be previewed
- type = document.getElementById('file_select').files[0].type;
- if ((type.startsWith('image/')
- || type.startsWith('audio')
- || type.startsWith('text/plain')
- || type.startsWith('video/'))
- && !type.includes('image/svg+xml'))
- {
- document.getElementById('preview_link').href = preview_link_href;
- document.getElementById('preview_link_text').innerHTML = web_root + preview_link_href;
- document.getElementById('upload_finished_preview').style.display = '';
- }
- }
+ <?php template_js_direct_download();?>
- // Direct download link
- var direct_download_link_href = 'f.php?h=' + reference + '&d=1';
- if (crypt_key.length > 0)
- {
- direct_download_link_href += '&k=' + crypt_key;
- }
- document.getElementById('direct_link').href = direct_download_link_href;
- document.getElementById('direct_link_text').innerHTML = web_root + direct_download_link_href;
// Hide preview and direct download link if password is set
if (document.getElementById('input_key').value.length > 0)
* Jirafeau, your web file repository
* Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
* Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
- * Copyright (C) 2015 Nicola Spanti (RyDroid) <dev@nicola-spanti.info>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
return 42;
}
- $code="";
+ $code = '';
for ($i = 0; $i < $l; $i++) {
$code .= dechex(rand(0, 15));
}
if ($length <= 0) {
return false;
}
- $pass="";
+ $pass = '';
for ($i = 0; $i < $length; $i++) {
$pass .= $allowed_chars[rand(0, strlen($allowed_chars) - 1)];
}
// Convert UTC timestamp to a datetime field
function jirafeau_get_datetimefield($timestamp)
{
-
- $ts = date_create("@" . $timestamp);
+ $ts = date_create('@' . $timestamp);
$content = '<span class="datetime" data-datetime="' . date_format($ts, 'Y-m-d H:i') . '">'
. date_format($ts, 'Y-m-d H:i') . ' (GMT)</span>';
-
+
return $content;
}
function jirafeau_md5_outside($file_path)
{
$out = false;
- $handle = fopen($file_path, "r");
+ $handle = fopen($file_path, 'r');
if ($handle === false) {
return false;
}
'link' => '',
'delete_link' => ''));
}
+ jirafeau_add_file($file, $one_time_download, $key, $time, $ip, $crypt, $link_name_length, $file_hash_method);
+}
- /* array representing no error */
- $noerr = array('has_error' => false, 'why' => '');
-
+/**
+ *
+ * @param bool $crypt_module_enabled
+ * @param string $file_path
+ * @return array [bool, string]
+ */
+function jirafeau_handle_add_file_encryption($crypt_module_enabled, $file_path)
+{
/* Crypt file if option is enabled. */
$crypted = false;
$crypt_key = '';
- if ($crypt == true && !(extension_loaded('sodium') == true)) {
+ if ($crypt_module_enabled == true && !(extension_loaded('sodium') == true)) {
error_log("PHP extension sodium not loaded, won't encrypt in Jirafeau");
}
- if ($crypt == true && extension_loaded('sodium') == true) {
- $crypt_key = jirafeau_encrypt_file($file['tmp_name'], $file['tmp_name'].'crypt');
+ if ($crypt_module_enabled == true && extension_loaded('sodium') == true) {
+ $crypt_key = jirafeau_encrypt_file($file_path, $file_path.'crypt');
if (strlen($crypt_key) > 0) {
- if (rename($file['tmp_name'].'crypt', $file['tmp_name']) === true) {
+ if (rename($file_path.'crypt', $file_path) === true) {
$crypted = true;
}
}
}
+ return [$crypted, $crypt_key];
+}
+
+/**
+ * adds an uploaded or copy/linked local file
+ * @param $file the file struct given by $_FILE[]
+ * @param $one_time_download is the file a one time download ?
+ * @param $key if not empty, protect the file with this key
+ * @param $time the time of validity of the file
+ * @param $ip uploader's ip
+ * @param $crypt boolean asking to crypt or not
+ * @param $link_name_length size of the link name
+ * @param $is_upload, determines if the file is uploaded or local - it controls which file-functions are used
+ * @return array an array containing some information
+ * 'error' => information on possible errors
+ * 'link' => the link name of the uploaded file
+ * 'delete_link' => the link code to delete file
+ */
+function jirafeau_add_file($file, $one_time_download, $key, $time, $ip, $crypt, $link_name_length, $file_hash_method, $is_upload = true)
+{
+ // TODO needs to be adapted
+ $move_operation = $is_upload ? 'move_uploaded_file' : 'symlink';
+
+ /* array representing no error */
+ $noerr = array('has_error' => false, 'why' => '');
+
+ $crypted = false;
+ $crypt_key = '';
+ list($crypted, $crypt_key) = jirafeau_handle_add_file_encryption($crypt, $file['tmp_name']);
+
/* file information */
$hash = jirafeau_hash_file($file_hash_method, $file['tmp_name']);
$name = str_replace(NL, '', trim($file['name']));
$p = s2p("$hash");
if (file_exists(VAR_FILES . $p . $hash)) {
$rc = unlink($file['tmp_name']);
- } elseif ((file_exists(VAR_FILES . $p) || @mkdir(VAR_FILES . $p, 0755, true))
- && move_uploaded_file($file['tmp_name'], VAR_FILES . $p . $hash)) {
+ } elseif (
+ (file_exists(VAR_FILES . $p) || @mkdir(VAR_FILES . $p, 0755, true)) &&
+ $move_operation($file['tmp_name'], VAR_FILES . $p . $hash)) {
$rc = true;
}
if (!$rc) {
'error' =>
array('has_error' => true,
'why' => t('INTERNAL_ERROR_DEL')),
- 'link' =>'',
+ 'link' => '',
'delete_link' => ''));
}
$handle,
$name . NL. $mime_type . NL. $size . NL. $password . NL. $time .
NL . $hash. NL . ($one_time_download ? 'O' : 'R') . NL . time() .
- NL . $ip . NL. $delete_link_code . NL . ($crypted ? 'C2' : 'O')
+ NL . $ip . NL. $delete_link_code . NL . ($crypted ? 'C' : 'O')
);
fclose($handle);
$hash_link = substr(base_16_to_64(md5_file($link_tmp_name)), 0, $link_name_length);
'error' =>
array('has_error' => true,
'why' => t('Internal error during file creation. ')),
- 'link' =>'',
+ 'link' => '',
'delete_link' => '');
}
return array( 'error' => $noerr,
'crypt_key' => $crypt_key);
}
+function jirafeau_admin_list_table($name, $file_hash, $link_hash, $visitor_function = null)
+{
+ echo '<fieldset><legend>';
+ if (!empty($name)) {
+ echo t('FILENAME') . ": " . jirafeau_escape($name);
+ }
+ if (!empty($file_hash)) {
+ echo t('FILE') . ": " . jirafeau_escape($file_hash);
+ }
+ if (!empty($link_hash)) {
+ echo t('LINK') . ": " . jirafeau_escape($link_hash);
+ }
+ if (empty($name) && empty($file_hash) && empty($link_hash)) {
+ echo t('LS_FILES');
+ }
+ echo '</legend>';
+ echo '<table>';
+ echo '<tr>';
+ echo '<th></th>';
+ echo '<th>' . t('ACTION') . '</th>';
+ echo '</tr>';
+ if ($visitor_function != null) {
+ $visitor_function($name, $file_hash, $link_hash);
+ }
+ echo '</table></fieldset>';
+}
+
/**
* Tells if a mime-type is viewable in a browser
* @param $mime the mime type
if (!empty($mime)) {
$viewable = array('image', 'video', 'audio');
$decomposed = explode('/', $mime);
- if (in_array($decomposed[0], $viewable) && strpos($mime, 'image/svg+xml') === false) {
+ if (in_array($decomposed[0], $viewable) && stripos($mime, 'image/svg+xml') === false) {
return true;
}
$viewable = array('text/plain');
*/
function jirafeau_admin_list($name, $file_hash, $link_hash)
{
- echo '<fieldset><legend>';
- if (!empty($name)) {
- echo t('FILENAME') . ": " . jirafeau_escape($name);
- }
- if (!empty($file_hash)) {
- echo t('FILE') . ": " . jirafeau_escape($file_hash);
- }
- if (!empty($link_hash)) {
- echo t('LINK') . ": " . jirafeau_escape($link_hash);
- }
- if (empty($name) && empty($file_hash) && empty($link_hash)) {
- echo t('LS_FILES');
- }
- echo '</legend>';
- echo '<table>';
- echo '<tr>';
- echo '<th></th>';
- echo '<th>' . t('ACTION') . '</th>';
- echo '</tr>';
-
- /* Get all links files. */
- $stack = array(VAR_LINKS);
- while (($d = array_shift($stack)) && $d != null) {
- $dir = scandir($d);
- foreach ($dir as $node) {
- if (strcmp($node, '.') == 0 || strcmp($node, '..') == 0 ||
- preg_match('/\.tmp/i', "$node")) {
- continue;
- }
- if (is_dir($d . $node)) {
- /* Push new found directory. */
- $stack[] = $d . $node . '/';
- } elseif (is_file($d . $node)) {
- /* Read link information. */
- $l = jirafeau_get_link($node);
- if (!count($l)) {
+ $function = function ($name, $file_hash, $link_hash) {
+ /* Get all links files. */
+ $stack = array(VAR_LINKS);
+ while (($d = array_shift($stack)) && $d != null) {
+ $dir = scandir($d);
+ foreach ($dir as $node) {
+ if (strcmp($node, '.') == 0 || strcmp($node, '..') == 0 ||
+ preg_match('/\.tmp/i', "$node")) {
continue;
}
- $ld = jirafeau_get_download_stats($node);
-
- /* Filter. */
- if (!empty($name) && !@preg_match("/$name/i", jirafeau_escape($l['file_name']))) {
- continue;
- }
- if (!empty($file_hash) && $file_hash != $l['hash']) {
- continue;
- }
- if (!empty($link_hash) && $link_hash != $node) {
- continue;
- }
- /* Print link information. */
- echo '<tr>';
- echo '<td>' .
- '<strong><a id="upload_link" href="f.php?h='. jirafeau_escape($node) .'" title="' .
- t('DL_PAGE') . '">' . jirafeau_escape($l['file_name']) . '</a></strong><br/>';
- echo t('TYPE') . ': ' . jirafeau_escape($l['mime_type']) . '<br/>';
- echo t('SIZE') . ': ' . jirafeau_human_size($l['file_size']) . '<br>';
- echo t('EXPIRE') . ': ' . ($l['time'] == -1 ? '∞' : jirafeau_get_datetimefield($l['time'])) . '<br/>';
- echo t('ONETIME') . ': ' . ($l['onetime'] == 'O' ? 'Yes' : 'No') . '<br/>';
- echo t('UPLOAD_DATE') . ': ' . jirafeau_get_datetimefield($l['upload_date']) . '<br/>';
- if (strlen($l['ip']) > 0) {
- echo t('ORIGIN') . ': ' . $l['ip'] . '<br/>';
- }
- echo t('DOWNLOAD_COUNT') . ': ' . $ld['count'] . '<br/>';
- if ($ld['count'] > 0) {
- echo t('DOWNLOAD_DATE') . ': ' . jirafeau_get_datetimefield($ld['date']) . '<br/>';
- echo t('DOWNLOAD_IP') . ': ' . $ld['ip'] . '<br/>';
+ if (is_dir($d . $node)) {
+ /* Push new found directory. */
+ $stack[] = $d . $node . '/';
+ } elseif (is_file($d . $node)) {
+ /* Read link information. */
+ $l = jirafeau_get_link($node);
+ if (!count($l)) {
+ continue;
+ }
+
+ /* Filter. */
+ if (!empty($name) && !@preg_match("/$name/i", jirafeau_escape($l['file_name']))) {
+ continue;
+ }
+ if (!empty($file_hash) && $file_hash != $l['hash']) {
+ continue;
+ }
+ if (!empty($link_hash) && $link_hash != $node) {
+ continue;
+ }
+ /* Print link information. */
+ echo '<tr>';
+ echo '<td><strong>';
+
+ if (!$l['crypted'] && !$l['crypted_legacy']) {
+ echo'<a href="f.php?h='. jirafeau_escape($node) .'" title="' .
+ t('DL_PAGE') . '">' . jirafeau_escape($l['file_name']) . '</a>';
+ } else {
+ echo jirafeau_escape($l['file_name']);
+ }
+
+ echo '</strong><br/>';
+
+ echo t('TYPE') . ': ' . jirafeau_escape($l['mime_type']) . '<br/>';
+ echo t('SIZE') . ': ' . jirafeau_human_size($l['file_size']) . '<br>';
+ echo t('EXPIRE') . ': ' . ($l['time'] == -1 ? '∞' : jirafeau_get_datetimefield($l['time'])) . '<br/>';
+ echo t('ONETIME') . ': ' . ($l['onetime'] == 'O' ? t('YES') : t('NO')) . '<br/>';
+ echo t('ENCRYPTED') . ': ' . (($l['crypted'] || $l['crypted_legacy']) ? t('YES') : t('NO')) . '<br/>';
+ echo t('UPLOAD_DATE') . ': ' . jirafeau_get_datetimefield($l['upload_date']) . '<br/>';
+ if (strlen($l['ip']) > 0) {
+ echo t('ORIGIN') . ': ' . $l['ip'] . '<br/>';
+ }
+ echo '</td><td>';
+
+ if (!$l['crypted'] && !$l['crypted_legacy']) {
+ echo '<form method="post">' .
+ '<input type = "hidden" name = "action" value = "download"/>' .
+ '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
+ jirafeau_admin_csrf_field() .
+ '<input type = "submit" value = "' . t('DL') . '" />' .
+ '</form>';
+ }
+
+ echo '<form method="post">' .
+ '<input type = "hidden" name = "action" value = "delete_link"/>' .
+ '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
+ jirafeau_admin_csrf_field() .
+ '<input type = "submit" value = "' . t('DEL_LINK') . '" />' .
+ '</form>' .
+ '<form method="post">' .
+ '<input type = "hidden" name = "action" value = "delete_file"/>' .
+ '<input type = "hidden" name = "hash" value = "' . $l['hash'] . '"/>' .
+ jirafeau_admin_csrf_field() .
+ '<input type = "submit" value = "' . t('DEL_FILE_LINKS') . '" />' .
+ '</form>' .
+ '</td>';
+ echo '</tr>';
}
- echo '</td><td>';
- echo '<form method="post">' .
- '<input type = "hidden" name = "action" value = "download"/>' .
- '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
- jirafeau_admin_csrf_field() .
- '<input type = "submit" value = "' . t('DL') . '" />' .
- '</form>' .
- '<form method="post">' .
- '<input type = "hidden" name = "action" value = "delete_link"/>' .
- '<input type = "hidden" name = "link" value = "' . $node . '"/>' .
- jirafeau_admin_csrf_field() .
- '<input type = "submit" value = "' . t('DEL_LINK') . '" />' .
- '</form>' .
- '<form method="post">' .
- '<input type = "hidden" name = "action" value = "delete_file"/>' .
- '<input type = "hidden" name = "hash" value = "' . $l['hash'] . '"/>' .
- jirafeau_admin_csrf_field() .
- '<input type = "submit" value = "' . t('DEL_FILE_LINKS') . '" />' .
- '</form>' .
- '</td>';
- echo '</tr>';
}
}
- }
- echo '</table></fieldset>';
+ };
+
+ jirafeau_admin_list_table($name, $file_hash, $link_hash, $function);
}
/**
function jirafeau_admin_bug_report($cfg)
{
$out = "<fieldset><legend>" . t('REPORTING_AN_ISSUE') . "</legend>";
- $out .= "If you have a problem related to Jirafeau, please <a href='https://gitlab.com/jirafeau/Jirafeau/-/issues'>open an issue</a>, explain your problem in english and copy-paste the following content:<br/><br/><code>";
+ $out .= "If you have a problem related to Jirafeau, please <a href='" . JIRAFEAU_WEBSITE . "/-/issues'>open an issue</a>, explain your problem in english and copy-paste the following content:<br/><br/><code>";
$out .= "# Jirafeau<br/>";
$out .= "- version: " . JIRAFEAU_VERSION . "<br/>";
function jirafeau_async_init($filename, $type, $one_time, $key, $time, $ip)
{
/* Create temporary folder. */
- $ref;
- $p;
+ $ref = '';
+ $p = '';
$code = jirafeau_gen_random(4);
do {
$ref = jirafeau_gen_random(32);
return "Error: referenced file does not exist";
}
+ /* Store filesize before encrypting the file */
+ /* Otherwise we would send the size of the encrypted file and the data of the unencrypted file */
+ /* This would break some browsers */
+ $size = filesize($p);
+
$crypted = false;
$crypt_key = '';
if ($crypt == true && extension_loaded('sodium') == true) {
}
$hash = jirafeau_hash_file($file_hash_method, $p);
- $size = filesize($p);
$np = s2p($hash);
$delete_link_code = jirafeau_gen_random(5);
$enc = sodium_crypto_secretstream_xchacha20poly1305_push($crypt_state, $to_enc);
if (fwrite($w, $enc) === false) {
- return '';
+ return '';
}
}
for ($i = SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_HEADERBYTES; $i < $fs; $i += JIRAFEAU_SODIUM_CHUNKSIZE + SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES) {
$to_dec = fread($r, JIRAFEAU_SODIUM_CHUNKSIZE + SODIUM_CRYPTO_SECRETSTREAM_XCHACHA20POLY1305_ABYTES);
[$dec, $crypt_tag] = sodium_crypto_secretstream_xchacha20poly1305_pull($crypt_state, $to_dec);
-
+
if (fwrite($w, $dec) === false) {
return false;
}
$filename = VAR_LINKS . s2p("$hash") . $hash . '_download';
if (!file_exists($filename)) {
- return array('count'=>0);
+ return array('count' => 0);
}
$c = file($filename);
fwrite($handle, $count . NL . time() . NL . $ip);
fclose($handle);
}
+
+function jirafeau_create_upload_finished_box($preview = true)
+{
+ ?>
+
+ <div id="upload_finished">
+ <p><?php echo t('FILE_UP') ?></p>
+
+ <div id="upload_finished_download_page">
+ <p>
+ <a id="upload_link" href=""><?php echo t('DL_PAGE') ?></a>
+ <a id="upload_link_email" href=""><img id="upload_image_email"/></a>
+ </p><p>
+ <code id=upload_link_text></code>
+ <button id="upload_link_button">📋</button>
+ </p>
+ </div>
+
+ <?php
+ if ($preview == true) { ?>
+ <div id="upload_finished_preview">
+ <p>
+ <a id="preview_link" href=""><?php echo t('VIEW_LINK') ?></a>
+ </p><p>
+ <code id=preview_link_text></code>
+ <button id="preview_link_button">📋</button>
+ </p>
+ </div>
+ <?php
+ }
+ ?>
+
+ <div id="upload_direct_download">
+ <p>
+ <a id="direct_link" href=""><?php echo t('DIRECT_DL') ?></a>
+ </p><p>
+ <code id=direct_link_text></code>
+ <button id="direct_link_button">📋</button>
+ </p>
+ </div>
+
+ <div id="upload_delete">
+ <p>
+ <a id="delete_link" href=""><?php echo t('DELETE_LINK') ?></a>
+ </p><p>
+ <code id=delete_link_text></code>
+ <button id="delete_link_button">📋</button>
+ </p>
+ </div>
+
+ <div id="upload_validity">
+ <p><?php echo t('VALID_UNTIL'); ?>:</p>
+ <p id="date"></p>
+ </div>
+</div>
+<?php
+}
+
+function jirafeau_get_expiration_time_options()
+{
+ return array(
+ array(
+ 'value' => 'minute',
+ 'label' => '1_MIN'
+ ),
+ array(
+ 'value' => 'hour',
+ 'label' => '1_H'
+ ),
+ array(
+ 'value' => 'day',
+ 'label' => '1_D'
+ ),
+ array(
+ 'value' => 'week',
+ 'label' => '1_W'
+ ),
+ array(
+ 'value' => 'fortnight',
+ 'label' => '2_W'
+ ),
+ array(
+ 'value' => 'month',
+ 'label' => '1_M'
+ ),
+ array(
+ 'value' => 'quarter',
+ 'label' => '1_Q'
+ ),
+ array(
+ 'value' => 'year',
+ 'label' => '1_Y'
+ ),
+ array(
+ 'value' => 'none',
+ 'label' => 'NONE'
+ )
+ );
+}
+
+/**
+ *
+ * creates the time selection field
+ * @param mixed $cfg
+ * @return void
+ */
+function jirafeau_create_selection_array($cfg)
+{
+ echo '<select name="time" id="select_time">';
+
+ $expirationTimeOptions = jirafeau_get_expiration_time_options();
+
+ foreach ($expirationTimeOptions as $expirationTimeOption) {
+ $selected = ($expirationTimeOption['value'] === $cfg['availability_default']) ? 'selected="selected"' : '';
+ if (true === $cfg['availabilities'][$expirationTimeOption['value']]) {
+ echo '<option value="' . $expirationTimeOption['value'] . '" ' .
+ $selected . '>' . t($expirationTimeOption['label']) . '</option>';
+ }
+ }
+
+ echo '</select>';
+}
+
+function jirafeau_datestr_to_int($time_str)
+{
+ $time = time();
+ switch ($time_str) {
+ case 'minute':
+ $time += JIRAFEAU_MINUTE;
+ break;
+ case 'hour':
+ $time += JIRAFEAU_HOUR;
+ break;
+ case 'day':
+ $time += JIRAFEAU_DAY;
+ break;
+ case 'week':
+ $time += JIRAFEAU_WEEK;
+ break;
+ case 'fortnight':
+ $time += JIRAFEAU_FORTNIGHT;
+ break;
+ case 'month':
+ $time += JIRAFEAU_MONTH;
+ break;
+ case 'quarter':
+ $time += JIRAFEAU_QUARTER;
+ break;
+ case 'year':
+ $time += JIRAFEAU_YEAR;
+ break;
+ default:
+ $time = JIRAFEAU_INFINITY;
+ break;
+ }
+ return $time;
+}
+
+
+
+
+/**
+ * links or copy a local file
+ * TODO: boolean in config for linking
+ * @param string $filepath
+ * @param $one_time_download is the file a one time download?
+ * @param $key if not empty, protect the file with this key
+ * @param $time the time of validity of the file
+ * @param $ip uploader's ip
+ * @param $crypt boolean asking to crypt or not
+ * @param $link_name_length size of the link name
+ * @returns an array containing some information
+ * 'error' => information on possible errors
+ * 'link' => the link name of the uploaded file
+ * 'delete_link' => the link code to delete file
+ */
+function jirafeau_copy_local_file($local_file_path, $one_time_download, $key, $time, $ip, $crypt, $link_name_length, $file_hash_method)
+{
+ if (!file_exists($local_file_path)) {
+ return (array(
+ 'error' =>
+ array('has_error' => true,
+ 'why' => t('INTERNAL_ERROR_FILE_NOT_EXIST')),
+ 'link' => '',
+ 'delete_link' => ''));
+ }
+ if (
+ // sanity check if file can be opened
+ $file = fopen($local_file_path, 'r')
+ ) {
+ // close file pointer - it's not needed here
+ fclose($file);
+ $time_in_int = jirafeau_datestr_to_int($time);
+ return jirafeau_add_file(
+ jirafeau_create_file_array($local_file_path),
+ $one_time_download,
+ $key,
+ $time_in_int,
+ $ip,
+ $crypt,
+ $link_name_length,
+ $file_hash_method,
+ false
+ );
+ } else {
+ return (array(
+ 'error' =>
+ array('has_error' => true,
+ 'why' => t('INTERNAL_ERROR_FP_OPEN_LOCAL')),
+ 'link' => '',
+ 'delete_link' => ''));
+ }
+}
+
+
+function jirafeau_create_file_array($file_path)
+{
+ return [
+ 'type' => mime_content_type($file_path),
+ 'tmp_name' => $file_path,
+ 'name' => basename($file_path),
+ 'size' => filesize($file_path),
+ ];
+}
<?php
/*
* Jirafeau, your web file repository
+ * Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
* Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "Una quincena",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "Nein",
+ "YES": "Ja",
+ "ENCRYPTED": "Verschlüsselt",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "Verschlüsselung ist in der Konfiguration aktiviert, aber das PHP-Modul \"Sodium\" ist nicht verfügbar! Verschlüsselung ist nicht verfügbar!",
+ "ADMIN_FOLDER_INFO": "(Datei muss im Ordner %s liegen)",
+ "ADMIN_FILE_SELECT": "Dateiname:",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "Die zu verlinkende Datei konnte nicht gefunden werden",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "Internal Error - Die zu verlinkende Datei konnte nicht geöffnet werden",
"INSTALL_FILE_NOT_FOUND_TITLE": "Installationsprogramm nicht gefunden",
"INSTALL_FILE_NOT_FOUND_DESC": "Installation wurde nicht erfolgreich abgeschlossen und install.php scheint nicht zu existieren",
"2_W": "Zwei Wochen",
"LOGIN": "Anmelden",
"LOGOUT": "Abmelden",
"MADE_WITH": "Erstellt mit",
+ "DESIGNED": "",
"MAX_FILE_SIZE": "Maximale Dateigröße",
"NEXT_STEP": "Nächster Schritt",
"NONE": "Nie",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "No",
+ "YES": "Yes",
+ "ENCRYPTED": "Encrypted",
"SODIUM_UNAVAILABLE": "Encryption is enabled in configuration, but the Sodium PHP module is not loaded! Encryption is not available!",
+ "ADMIN_FOLDER_INFO": "(File must be in Folder %s)",
+ "ADMIN_FILE_SELECT": "Filename",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "Requested File not found.",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "Internal Error - Requested File could not be opened",
"INSTALL_FILE_NOT_FOUND_TITLE": "Installation file not found",
"INSTALL_FILE_NOT_FOUND_DESC": "Installation is not complete and install.php file does not seem to exist",
"REPORTING_AN_ISSUE": "Reporting an issue",
"MAX_FILE_SIZE": "Maximum file size",
"POWERED_BY": "powered by the copyleft, libre software project Jirafeau",
"MADE_WITH": "Made with",
+ "DESIGNED": "Designed and hosted by",
"JI_PROJECT": "Jirafeau Project",
"1_MIN": "One minute",
"1_H": "One hour",
{
+ "NO": "No",
+ "YES": "Sí",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "Una quincena",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "Non",
+ "YES": "Oui",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "Fichier d'installation non-trouvé",
"INSTALL_FILE_NOT_FOUND_DESC": "L'installation est incomplète et le ficher install.php est introuvable",
"2_W": "Deux semaines",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "No",
+ "YES": "Sì",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "Due settimane",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "To uker",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "Twee weken",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "Uma quinzena",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "Uma quinzena",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"REPORTING_AN_ISSUE": "",
"SIZE_DATA": "",
"INCOMPATIBLE_OPTIONS_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "Två veckor",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
"ONETIME": "",
"UPLOAD_DATE": "",
"ORIGIN": "",
+ "DOWNLOAD_COUNT": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_IP": "",
"ACTION": "",
"DEL_LINK": "",
"DEL_FILE_LINKS": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "İki hafta",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
{
+ "NO": "",
+ "YES": "",
+ "ENCRYPTED": "",
+ "DOWNLOAD_IP": "",
+ "DOWNLOAD_DATE": "",
+ "DOWNLOAD_COUNT": "",
"SODIUM_UNAVAILABLE": "",
+ "ADMIN_FOLDER_INFO": "",
+ "ADMIN_FILE_SELECT": "",
+ "INTERNAL_ERROR_FILE_NOT_EXIST": "",
+ "INTERNAL_ERROR_FP_OPEN_LOCAL": "",
+ "DESIGNED": "",
"INSTALL_FILE_NOT_FOUND_TITLE": "",
"INSTALL_FILE_NOT_FOUND_DESC": "",
"2_W": "",
/*
* Jirafeau, your web file repository
* Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
+ * Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
/* Jirafeau package */
define('JIRAFEAU_PACKAGE', 'Jirafeau');
-define('JIRAFEAU_VERSION', '4.6.0');
+define('JIRAFEAU_VERSION', '4.6.1');
+
+define('JIRAFEAU_WEBSITE', 'https://gitlab.com/jirafeau/Jirafeau');
/* Directories. */
define('VAR_FILES', $cfg['var_root'] . 'files/');
<!-- Project links -->
<?php
echo t('MADE_WITH') .
- ' <a href="https://gitlab.com/jirafeau/Jirafeau" target="_blank" rel="noopener noreferrer">' . t('JI_PROJECT') . '</a>' .
+ ' <a href="' . JIRAFEAU_WEBSITE . '" target="_blank" rel="noopener noreferrer">' . t('JI_PROJECT') . '</a>' .
' (<a href="https://www.gnu.org/licenses/agpl.html" target="_blank" rel="noopener noreferrer"><abbr title="GNU Affero General Public License v3">AGPL-3.0</abbr></a>)';
?>
<!-- Installation dependent links -->
<?php
if (false === empty($cfg['installation_done'])) {
+ if(false === empty($cfg['organisation'])) {
+ echo ' <span>|</span> ';
+ echo ' ' . t('DESIGNED') . ' ' . $cfg['organisation'];
+ }
+
echo ' <span>|</span> ';
- echo '<a href="tos.php" target="_blank" rel="noopener noreferrer">' . t('TOS') . '</a>';
+ echo '<a href="tos.php" target="_blank" rel="nooener noreferrer">' . t('TOS') . '</a>';
}
?>
</p>
<html>
<head>
<meta charset="utf-8">
- <title><?php echo (true === empty($cfg['title']))? t('JI_WEB_RE') : $cfg['title']; ?></title>
+ <title><?php echo (true === empty($cfg['title'])) ? t('JI_WEB_RE') : $cfg['title']; ?></title>
<meta name="viewport" content="width=device-width, initial-scale=1">
<link id="shortcut_icon" rel="shortcut icon" href="<?php echo 'media/' . $cfg['style'] . '/favicon.ico'; ?>">
<link id="stylesheet" rel="stylesheet" href="<?php echo 'media/' . $cfg['style'] . '/style.css.php'; ?>" type="text/css" />
<div id="content">
<h1>
<a href="./">
- <?php echo (true === empty($cfg['title']))? t('JI_WEB_RE') : $cfg['title']; ?>
+ <?php echo (true === empty($cfg['title'])) ? t('JI_WEB_RE') : $cfg['title']; ?>
</a>
</h1>
<?php
/*
* Jirafeau, your web file repository
+ * Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
* Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
<div class="info">
<h2>Scripting interface</h2>
<p>This interface permits to script your uploads and downloads.</p>
- <p>See <a href="https://gitlab.com/jirafeau/Jirafeau/blob/master/script.php">source code</a> of this interface to get available calls :)</p>
+ <p>See <a href="<?php echo JIRAFEAU_WEBSITE ?>/blob/master/script.php">source code</a> of this interface to get available calls :)</p>
<p>You may download a preconfigured <a href="script.php?lang=bash">Bash Script</a> to easily send to and get files from the API via command line.</p>
</div>
<br />
$key = '';
if (isset($_POST['key'])) {
$key = $_POST['key'];
- if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex'){
- if (!preg_match($cfg['download_password_policy_regex'], $key)){
+ if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex') {
+ if (!preg_match($cfg['download_password_policy_regex'], $key)) {
echo 'Error 14: The download password is not complying to the security standards.';
exit;
}
}
- }elseif ($cfg['download_password_requirement'] !== 'optional'){
+ } elseif ($cfg['download_password_requirement'] !== 'optional') {
echo 'Error 13: The parameter password is required.';
exit;
}
- $time = time();
if (!isset($_POST['time']) || !$cfg['availabilities'][$_POST['time']]) {
echo 'Error 4: The parameter time is invalid.';
exit;
} else {
- switch ($_POST['time']) {
- case 'minute':
- $time += JIRAFEAU_MINUTE;
- break;
- case 'hour':
- $time += JIRAFEAU_HOUR;
- break;
- case 'day':
- $time += JIRAFEAU_DAY;
- break;
- case 'week':
- $time += JIRAFEAU_WEEK;
- break;
- case 'fortnight':
- $time += JIRAFEAU_FORTNIGHT;
- break;
- case 'month':
- $time += JIRAFEAU_MONTH;
- break;
- case 'quarter':
- $time += JIRAFEAU_QUARTER;
- break;
- case 'year':
- $time += JIRAFEAU_YEAR;
- break;
- default:
- $time = JIRAFEAU_INFINITY;
- break;
- }
+ $time = jirafeau_datestr_to_int($_POST['time']);
}
// Check file size
$key = '';
if (isset($_POST['key'])) {
$key = $_POST['key'];
- if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex'){
- if (!preg_match($cfg['download_password_policy_regex'], $key)){
+ if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex') {
+ if (!preg_match($cfg['download_password_policy_regex'], $key)) {
echo 'Error 14: The download password is not complying to the security standards.';
exit;
}
}
- }elseif ($cfg['download_password_requirement'] !== 'optional'){
+ } elseif ($cfg['download_password_requirement'] !== 'optional') {
echo 'Error 13: The parameter password is required.';
exit;
}
}
if (strlen($d) > 0 && $d == $link['link_code']) {
jirafeau_delete_link($link_name);
- echo "Ok";
+ echo 'Ok';
exit;
}
if ($link['time'] != JIRAFEAU_INFINITY && time() > $link['time']) {
} elseif (isset($_GET['get_version'])) {
echo JIRAFEAU_VERSION;
} elseif (isset($_GET['lang'])) {
- $l=$_GET['lang'];
- if ($l == "bash") {
+ $l = $_GET['lang'];
+ if ($l == 'bash') {
?>
#!/bin/bash
$key = '';
if (isset($_POST['key'])) {
$key = $_POST['key'];
- if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex'){
- if (!preg_match($cfg['download_password_policy_regex'], $key)){
+ if ($cfg['download_password_requirement'] !== 'generated' && $cfg['download_password_policy'] === 'regex') {
+ if (!preg_match($cfg['download_password_policy_regex'], $key)) {
echo 'Error 14: The download password is not complying to the security standards.';
exit;
}
}
- }elseif ($cfg['download_password_requirement'] !== 'optional'){
+ } elseif ($cfg['download_password_requirement'] !== 'optional') {
echo 'Error 13: The parameter password is required.';
exit;
}
exit;
}
- $time = time();
if (!isset($_POST['time']) || !$cfg['availabilities'][$_POST['time']]) {
echo 'Error 22';
exit;
} else {
- switch ($_POST['time']) {
- case 'minute':
- $time += JIRAFEAU_MINUTE;
- break;
- case 'hour':
- $time += JIRAFEAU_HOUR;
- break;
- case 'day':
- $time += JIRAFEAU_DAY;
- break;
- case 'week':
- $time += JIRAFEAU_WEEK;
- break;
- case 'fortnight':
- $time += JIRAFEAU_FORTNIGHT;
- break;
- case 'month':
- $time += JIRAFEAU_MONTH;
- break;
- case 'quarter':
- $time += JIRAFEAU_QUARTER;
- break;
- case 'year':
- $time += JIRAFEAU_YEAR;
- break;
- default:
- $time = JIRAFEAU_INFINITY;
- break;
- }
+ $time = jirafeau_datestr_to_int($_POST['time']);
}
if ($cfg['store_uploader_ip']) {
<?php
/*
* Jirafeau, your web file repository
+ * Copyright (C) 2008 Julien "axolotl" BERNARD <axolotl@magieeternelle.org>
+ * Copyright (C) 2015 Jerome Jutteau <jerome@jutteau.fr>
+ * Copyright (C) 2024 Jirafeau project <https://gitlab.com/jirafeau> (see AUTHORS.md)
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as