]> git.p6c8.net - jirafeau_project.git/commitdiff
Updated CHANGELOG master 1567935381 1567935385 4.6.1
authorPatrick Canterino <patrick@patrick-canterino.de>
Sun, 1 Dec 2024 14:27:35 +0000 (15:27 +0100)
committerPatrick Canterino <patrick@patrick-canterino.de>
Sun, 1 Dec 2024 14:27:35 +0000 (15:27 +0100)
80 files changed:
.dockerignore
.gitignore
.gitlab-ci.yml
AUTHORS.md [new file with mode: 0644]
CHANGELOG.md
CONTRIBUTING.md
Dockerfile
README.md
admin.php
docker/README.md
docker/docker_config.php
f.php
index.php
install.php
lib/config.original.php
lib/functions.js.php
lib/functions.php
lib/lang.php
lib/locales/ar.json
lib/locales/be.json
lib/locales/bn_IN.json
lib/locales/bo.json
lib/locales/ca.json
lib/locales/ckb.json
lib/locales/cs.json
lib/locales/da.json
lib/locales/de.json
lib/locales/el.json
lib/locales/en.json
lib/locales/es.json
lib/locales/et.json
lib/locales/fi.json
lib/locales/fr.json
lib/locales/he.json
lib/locales/hi.json
lib/locales/hr.json
lib/locales/hu.json
lib/locales/id.json
lib/locales/it.json
lib/locales/ja.json
lib/locales/ko.json
lib/locales/la.json
lib/locales/mfe.json
lib/locales/ms.json
lib/locales/nb_NO.json
lib/locales/nl.json
lib/locales/pl.json
lib/locales/ps.json
lib/locales/pt.json
lib/locales/pt_BR.json
lib/locales/ro.json
lib/locales/ru.json
lib/locales/sh.json
lib/locales/si.json
lib/locales/sk.json
lib/locales/sl.json
lib/locales/sq.json
lib/locales/sr.json
lib/locales/sv.json
lib/locales/ta.json
lib/locales/template.json
lib/locales/th.json
lib/locales/tr.json
lib/locales/uk.json
lib/locales/vi.json
lib/locales/zh.json
lib/locales/zh_TW.json
lib/settings.php
lib/template/footer.php
lib/template/header.php
screenshots/admin.png [new file with mode: 0644]
screenshots/install1.png [new file with mode: 0644]
screenshots/install2.png [new file with mode: 0644]
screenshots/install3.png [new file with mode: 0644]
screenshots/upload1.png [new file with mode: 0644]
screenshots/upload2.png [new file with mode: 0644]
screenshots/upload_confirm.png [new file with mode: 0644]
screenshots/upload_progress.png [new file with mode: 0644]
script.php
tos.php

index 4c72529bd5b431e6af93743959b1a806594e8e4c..670c26893cd23f95d0ab20a04dc9ca08530b7a59 100644 (file)
@@ -1,7 +1,9 @@
+screenshots
+AUTHORS.md
 CHANGELOG.md
 CONTRIBUTING.md
 Dockerfile
 README.md
 composer.json
 install.php
-.*
\ No newline at end of file
+.*
index c911a76c9cc6388f3b930ad481fa65f4fe1cd7cd..4c13bde9cd92aff8fce03d06c24d26dab14bea2c 100644 (file)
@@ -1,6 +1,7 @@
 lib/config.local.php
 lib/tos.local.txt
 media/custom/
+media/dark-custom/
 var-*
 *._*
 composer.phar
index 0d2d9c4a51ab8160a903b2431f48fa72e4b12598..627ed17edeafe41783446928a7827acd4a27ba9b 100644 (file)
@@ -1,35 +1,55 @@
-# 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
diff --git a/AUTHORS.md b/AUTHORS.md
new file mode 100644 (file)
index 0000000..a8e247e
--- /dev/null
@@ -0,0 +1,116 @@
+# 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
index c4e27de732ecafc1d7c80fafc142490f14eba0c9..13564df88c7346570bb950f52528ccd9d1659f52 100644 (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
@@ -22,6 +36,7 @@
 - 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
index c80c1cddf5054a5e78fb921f1cae0fbf45226bd9..bde45e89b834853bb172dbd457e5fb5111a59e47 100644 (file)
@@ -54,11 +54,11 @@ view only to show the most important files and their role.
 
 ## 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
@@ -90,7 +90,6 @@ Quick walkthrough:
 
 ## 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`
index 9eb04233aa3b0d2d3acd2d55a0126c62a336b24f..d4854a8fcbdf4e01f330a041f1f4577d0feb83e9 100644 (file)
@@ -8,24 +8,21 @@ RUN apk update && \
     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
index 0bd28ae0aa97db55e08e84cc61b19a7ed3062b52..d2ac2b5d34b964004b1a3433a7608c4d0e799b27 100644 (file)
--- a/README.md
+++ b/README.md
@@ -9,7 +9,7 @@ Jirafeau is a "one-click-filesharing": Select your file, upload, share a link. T
 
 See [jirafeau.net](https://jirafeau.net/) for a demo.
 
-![Screenshot1](http://i.imgur.com/TPjh48P.png)
+![Screenshot1](screenshots/upload1.png)
 
 ## DISCLAMER
 
@@ -50,21 +50,20 @@ Jirafeau project won't evolve to a file manager and will focus to keep a very fe
 
 ## 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
@@ -91,19 +90,30 @@ If you have some troubles, consider the following cases
 
 - 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:
 
@@ -206,14 +216,14 @@ Anyway I would recommend you to use another web browser. :)
 
 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?
@@ -227,8 +237,8 @@ If you don't want to allow unlimited upload size, you can still setup a maximal
 
 ### 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?
 
@@ -301,4 +311,6 @@ Feel free to create an [issue](https://gitlab.com/jirafeau/Jirafeau/-/issues) if
 
 ### 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
index 09bded527fa9ab6f59d204f537b39efaa150a756..f8270a28d3bef505f8888b1de17483d8cf780f1c 100644 (file)
--- a/admin.php
+++ b/admin.php
@@ -1,7 +1,9 @@
 <?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
@@ -14,7 +16,7 @@
  *  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__) . '/');
@@ -35,17 +37,18 @@ if (php_sapi_name() == "cli") {
     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');
index 2c56d26a1ab63d5b40850894751c62dc08bd11c7..10ee3224e986b53c79bc7930754b38f78ac1426c 100644 (file)
@@ -2,13 +2,11 @@
 
 ## 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/).
@@ -16,7 +14,7 @@ The admin console is located on `/admin.php`, check console output to get auto-g
 
 ## Build your own Jirafeau docker image
 
-```
+```shell
 git clone https://gitlab.com/jirafeau/Jirafeau.git
 cd Jirafeau
 docker build -t your/jirafeau:latest .
@@ -25,8 +23,9 @@ 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/).
@@ -50,6 +49,7 @@ Available options:
 - `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).
@@ -65,8 +65,9 @@ Available options:
 - `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
@@ -75,11 +76,21 @@ Files and links are stored in `/data` by default. Subfolders are automatically c
 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
index 634d58bfdcc5373a2b24f648006bc174a1be732f..75c6fb8cca3c58fefe62e53f2ab89d7e1646c3ba 100644 (file)
@@ -1,7 +1,9 @@
 <?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
@@ -168,6 +170,7 @@ function run_setup(&$cfg)
     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');
@@ -194,4 +197,4 @@ function run_setup(&$cfg)
     }
 }
 
-run_setup($cfg);
\ No newline at end of file
+run_setup($cfg);
diff --git a/f.php b/f.php
index 543fc1028cfb33371a009c49d111652c2f52c7c5..f523f728a2e57f0dfc75498a40315283033d0d8e 100644 (file)
--- a/f.php
+++ b/f.php
@@ -3,6 +3,7 @@
  *  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
@@ -15,7 +16,7 @@
  *  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__) . '/');
 
index 78c1beb42a647e5688660b9cea7e415ebfd8f88a..435e059711db7532e24bb67c6c8ef37f1c5dee49 100644 (file)
--- a/index.php
+++ b/index.php
@@ -1,9 +1,9 @@
 <?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
@@ -25,7 +25,7 @@ require(JIRAFEAU_ROOT . 'lib/settings.php');
 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']);
 }
 
@@ -101,70 +101,8 @@ elseif (true === jirafeau_challenge_upload_ip($cfg, get_ip_address($cfg))) {
 }
 
 ?>
-<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">&#128203;</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">&#128203;</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">&#128203;</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">&#128203;</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">&#128203;</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>
@@ -192,7 +130,7 @@ elseif (true === jirafeau_challenge_upload_ip($cfg, get_ip_address($cfg))) {
         <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.";
             }
@@ -204,72 +142,32 @@ elseif (true === jirafeau_challenge_upload_ip($cfg, get_ip_address($cfg))) {
         <?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
index ed99b19208642655512375150c34ca990633cde9..ebda6f566af9d0de581c5a102101eac03687881e 100644 (file)
@@ -2,7 +2,8 @@
 /*
  *  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
@@ -152,7 +153,7 @@ break;
           '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 . '/';
index bfa76af9c6f4332164799d7b263619a1019e5a5f..8aec8572dc52948ec3e89bc57a61e84e506d1fd0 100644 (file)
@@ -3,6 +3,7 @@
  *  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
@@ -152,6 +153,11 @@ $cfg['availability_default'] = 'month';
  */
 $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.
  */
index 3052bf03a45e2b9cf6a21a04d3c401574b322325..b8888a69f90114cba914523fc738301e46e93fd7 100644 (file)
@@ -1,8 +1,9 @@
 <?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__) . '/../');
 
@@ -124,6 +228,22 @@ function convertAllDatetimeFields() {
     }
 }
 
+// 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
@@ -132,78 +252,23 @@ function show_link (reference, delete_code, crypt_key, date)
     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)
index b87f6c3b17e8649b71b7a8523f1d004e055383e2..03725073dae490118cf8ae4837578c99e4d58e03 100644 (file)
@@ -3,7 +3,7 @@
  *  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
@@ -93,7 +93,7 @@ function jirafeau_gen_random($l)
         return 42;
     }
 
-    $code="";
+    $code = '';
     for ($i = 0; $i < $l; $i++) {
         $code .= dechex(rand(0, 15));
     }
@@ -106,7 +106,7 @@ function jirafeau_gen_download_pass($length, $allowed_chars)
     if ($length <= 0) {
         return false;
     }
-    $pass="";
+    $pass = '';
     for ($i = 0; $i < $length; $i++) {
         $pass .= $allowed_chars[rand(0, strlen($allowed_chars) - 1)];
     }
@@ -143,11 +143,10 @@ function jirafeau_human_size($octets)
 // 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;
 }
 
@@ -398,7 +397,7 @@ function jirafeau_hash_file($method, $file_path)
 function jirafeau_md5_outside($file_path)
 {
     $out = false;
-    $handle = fopen($file_path, "r");
+    $handle = fopen($file_path, 'r');
     if ($handle === false) {
         return false;
     }
@@ -447,25 +446,62 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
                  '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']));
@@ -477,8 +513,9 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
     $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) {
@@ -486,7 +523,7 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
                  'error' =>
                    array('has_error' => true,
                           'why' => t('INTERNAL_ERROR_DEL')),
-                 'link' =>'',
+                 'link' => '',
                  'delete_link' => ''));
     }
 
@@ -517,7 +554,7 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
         $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);
@@ -540,7 +577,7 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
                  'error' =>
                    array('has_error' => true,
                           'why' => t('Internal error during file creation. ')),
-                 'link' =>'',
+                 'link' => '',
                  'delete_link' => '');
     }
     return array( 'error' => $noerr,
@@ -549,6 +586,33 @@ function jirafeau_upload($file, $one_time_download, $key, $time, $ip, $crypt, $l
                   '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
@@ -559,7 +623,7 @@ function jirafeau_is_viewable($mime)
     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');
@@ -677,99 +741,89 @@ function jirafeau_get_link($hash)
  */
 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);
 }
 
 /**
@@ -879,7 +933,7 @@ function jirafeau_fileperms($path)
 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/>";
@@ -1010,8 +1064,8 @@ function jirafeau_async_delete($ref)
 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);
@@ -1143,6 +1197,11 @@ function jirafeau_async_end($ref, $code, $crypt, $link_name_length, $file_hash_m
         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) {
@@ -1155,7 +1214,6 @@ function jirafeau_async_end($ref, $code, $crypt, $link_name_length, $file_hash_m
     }
 
     $hash = jirafeau_hash_file($file_hash_method, $p);
-    $size = filesize($p);
     $np = s2p($hash);
     $delete_link_code = jirafeau_gen_random(5);
 
@@ -1239,7 +1297,7 @@ function jirafeau_encrypt_file($fp_src, $fp_dst)
         $enc = sodium_crypto_secretstream_xchacha20poly1305_push($crypt_state, $to_enc);
 
         if (fwrite($w, $enc) === false) {
-           return '';
+            return '';
         }
     }
 
@@ -1280,7 +1338,7 @@ function jirafeau_decrypt_file($fp_src, $fp_dst, $k)
     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;
         }
@@ -1697,7 +1755,7 @@ function jirafeau_get_download_stats($hash)
     $filename = VAR_LINKS . s2p("$hash") . $hash . '_download';
 
     if (!file_exists($filename)) {
-        return array('count'=>0);
+        return array('count' => 0);
     }
 
     $c = file($filename);
@@ -1720,3 +1778,227 @@ function jirafeau_write_download_stats($hash, $ip)
     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">&#128203;</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">&#128203;</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">&#128203;</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">&#128203;</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),
+    ];
+}
index cfb8f80cf7aa290325f10a83d6a35f417137cb00..abba1680b2ed49bbb88428d0caba4582385723dd 100644 (file)
@@ -1,7 +1,9 @@
 <?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
index a048c2b79d7a73bee3588239970580c598dd8066..83227b40cb5519cef6a3fc97d6a370cca68fb036 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 7f38ca97e9794a69fc68ba2acd97c0eb3c81a52d..4dc371c2954d395b8426fbe5d656387e99fb682f 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 796ceaa96fee4bf9e306dc36902e7bd9cd32a5a1..c0d7a26660c7deb2d32b9bce1f541f81475584b8 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 0a949679695979b42317d523f33246aa0af21e8d..9d08b73b4a7b1025b8ef9d154bb56e1e9309add4 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 9fa849998811ca5f62acc0694382b89f606dfe0f..2d259b9741d3909b8c5944a7d9d59c8279705c8d 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index 6277346fc5ae642fc71d3d72ec2230fccd3be7be..bbc76bc8e975288cc512417937fbaac36ea203b4 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 8aee6260e31a42476f468f40cceddd6c6b973613..9db9731ff5b42c35ca1804cac072efda604e8213 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index a08c46f369fe7c518af1ec9a74e345f35020dbf6..af0ccb848bba81b2555099a65292b37050e17d9b 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index ea3c2901e17e898d8f284a440049177cc1d2449e..8936ee124a91134c031a23bacf228f246945f342 100644 (file)
@@ -1,5 +1,15 @@
 {
+    "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",
@@ -54,6 +64,7 @@
     "LOGIN": "Anmelden",
     "LOGOUT": "Abmelden",
     "MADE_WITH": "Erstellt mit",
+    "DESIGNED": "",
     "MAX_FILE_SIZE": "Maximale Dateigröße",
     "NEXT_STEP": "Nächster Schritt",
     "NONE": "Nie",
index a0da96f5b773bf88ebe1ab8e543e4ebbbff1f0ea..2676b18dc325809d71225b70d2138175a68f25a2 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 092980aa9b79e8f7c47a2816921e83b7c8194659..f17bf9ac211dd04596616d4c74816f577b26f802 100644 (file)
@@ -1,5 +1,12 @@
 {
+    "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",
@@ -17,6 +24,7 @@
     "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",
index 50530410f4a766a10a63e76cf1fa6b7e30103b8c..3c6bac010eefc7f7a117f30df676a6c247868955 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index 6277346fc5ae642fc71d3d72ec2230fccd3be7be..bbc76bc8e975288cc512417937fbaac36ea203b4 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index db7eecf0e3d064d166abb7bbf071f1e144d20aba..debff9c7de7b5367d3890fd4e8a0ea84936ae22c 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index a9162abd1bb580091477d7db431e674e9c858f7b..8629b761453e2975193f5e1985bfd7b98c0660ea 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index 3e40020b7119f2d7c8fcd2cc60a630a67e1090f6..ea0f4e55a8b3950c28d2da3201c7e4f161999324 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 5c19acc64f93edeeacfe53177537ff6a19d4208f..fdca6222f49936c15aca593d3826f558872ea313 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 788ce9e12a1d8269a6acf3bfbe272ab39b13ddaf..d1994d6a1e7659721fa29443bb10b3a153a81032 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 4d3b8e0e29e3c39d72b5ad0b8d2dff47eb3f65e3..a4a075ec720adc21845bb236fd3855ee03a2b5aa 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 74fc27631d1e2523e80fb7d76497f4f25438d100..24cea5082702fb87bfc7b4a757dc735fd22eadd9 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index c4e53b5258824d759de6728f42fc0c6101c1b041..4be5d535d624f339d03bcd5ffe6e72c0e229d894 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index ee6a2e818439c6b20c1132d866e06613974fca78..04e67359bcb161c782e7f2cb1f105bc44233785e 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 5c19acc64f93edeeacfe53177537ff6a19d4208f..fdca6222f49936c15aca593d3826f558872ea313 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 45aeaaa5358c925ea4c6eb3b13ad0f81655bf38d..b5cf0a26aeb3e6a1a59984591185bba31eccac2a 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 6277346fc5ae642fc71d3d72ec2230fccd3be7be..bbc76bc8e975288cc512417937fbaac36ea203b4 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index c01c93d6c00ca863d9236f436c0d152c432b06f1..27575f76f20e8b5aa5b29d52d187641eb90b4f83 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index ce80c40d803a152dd23655bf6416d5d9492e5f90..939f52be458b7ba30489660da4e22e2411bbdd14 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index 1855d0bc5426798884263667522d819537af4ce5..c817eee7358c94255f0b740b17bc459ee8995056 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index 07a814a94747932944756b75a24ef8f9ef279fc1..d70f0dec1e3e0889f1c0a98b06c44537ddec87a5 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 6277346fc5ae642fc71d3d72ec2230fccd3be7be..bbc76bc8e975288cc512417937fbaac36ea203b4 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 9ec79a96c46feca94021e07e4e7b7ed960a3528c..812b59d1ee40d9b375bfdb76710400d9eaf678da 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index c902a9c4f32e735c1847e1cdb827eb151b1df158..1e36b53959ae012cb0ce2a7997edbd9488ca6bb3 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index dbe2046b563782ccf1a1d94858dca77d1d625df4..6d76460dfc617239d42ed7df3e4ee7541954ab2f 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 6452559d0b285db3dbf064728745050a90fb5078..6b0f95182e2b6d472f2fd16fa27c8e776bb6e165 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 6277346fc5ae642fc71d3d72ec2230fccd3be7be..bbc76bc8e975288cc512417937fbaac36ea203b4 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 54401df01ae1d6f5e72c2e941d4ecd0dc6365afb..842db6c66f61001db0ac0c0eaa115cc4dc27cb70 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index e40d2b95789c193cc35925778f87ded09e646696..8c42dc5fb8f65af0350d0cdc50150d6b4de0f774 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 7f06388f31c5cff4d6a3dc1a3ad92d92c303338a..463d58b7114060198ec1e84fcf6f294e32834b72 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 6277346fc5ae642fc71d3d72ec2230fccd3be7be..bbc76bc8e975288cc512417937fbaac36ea203b4 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 53f23a27067579846d08a506cd1505ad2add0614..6aca55ffa26de13c3ef486f220edce3befde64ab 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 01452063d0d999da0693c3e7b53639c5ecfbfc61..59c215bb4534f1694fccac2069ce0579a1ae8bf9 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index d6e0c1dc7321a66c995fc921dae8f94a8736d3b0..c46fd974fd1fa9472fa2e1f0f8c2c88c6be1532e 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index cfaefffe85b89c7b3751f84f800a59d0084a79c8..ce688bf7f3766a0372c5ab926482e53dba0930da 100644 (file)
@@ -1,5 +1,13 @@
 {
+    "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": "",
index 6277346fc5ae642fc71d3d72ec2230fccd3be7be..bbc76bc8e975288cc512417937fbaac36ea203b4 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 239a4329a7aa2ba0ca043b2c2b2ece481d0deeee..76287db6dee8fff6bb283ca0ec387ebb4c8d190e 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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",
index 6b9e17e573579a5a519b20efd1b7889842d4bc97..bd8f31c32b8a2aa56773b673945970a6d352783a 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index bcfad0a769376f95d89873afd2238907a9627fa2..35bb24eb6d503cfffb438e042e2dd54b9b77d3b6 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index cf65cc5a2691bf164e903ff18107334e269c4dde..5b01550a475304c4eb224644f81365dfac3e1ffc 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index a571dcb09f3501ef89ccd9505bbe3ee0d35066da..43877f5a7ee28440ea33d112c5aac671253fb14b 100644 (file)
@@ -1,5 +1,16 @@
 {
+    "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": "",
index 22a2a5a570086a2afe14bdd0c8adf249e4cb8399..f0f193e29bc00080bef3ebf013b96189506c69a3 100644 (file)
@@ -2,6 +2,8 @@
 /*
  *  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
@@ -41,7 +43,9 @@ if ($cfg['debug'] === true) {
 
 /* 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/');
index e0856a873a889f17211c8fdcce2764e2c403ddf7..64132c70966c4a6e5e2b0f8943422a245608764d 100644 (file)
@@ -3,14 +3,19 @@
         <!-- 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>
index 8be36c7213715974649826f308a7e007ad4267a7..93f7e1843d0f55c9025c81547b7eb45f42694bc4 100644 (file)
@@ -6,7 +6,7 @@ header('x-ua-compatible: ie=edge');
 <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" />
@@ -17,6 +17,6 @@ header('x-ua-compatible: ie=edge');
 <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>
diff --git a/screenshots/admin.png b/screenshots/admin.png
new file mode 100644 (file)
index 0000000..157c0d8
Binary files /dev/null and b/screenshots/admin.png differ
diff --git a/screenshots/install1.png b/screenshots/install1.png
new file mode 100644 (file)
index 0000000..6868082
Binary files /dev/null and b/screenshots/install1.png differ
diff --git a/screenshots/install2.png b/screenshots/install2.png
new file mode 100644 (file)
index 0000000..64aec66
Binary files /dev/null and b/screenshots/install2.png differ
diff --git a/screenshots/install3.png b/screenshots/install3.png
new file mode 100644 (file)
index 0000000..04428fb
Binary files /dev/null and b/screenshots/install3.png differ
diff --git a/screenshots/upload1.png b/screenshots/upload1.png
new file mode 100644 (file)
index 0000000..23dc334
Binary files /dev/null and b/screenshots/upload1.png differ
diff --git a/screenshots/upload2.png b/screenshots/upload2.png
new file mode 100644 (file)
index 0000000..4ee4a3d
Binary files /dev/null and b/screenshots/upload2.png differ
diff --git a/screenshots/upload_confirm.png b/screenshots/upload_confirm.png
new file mode 100644 (file)
index 0000000..89a6693
Binary files /dev/null and b/screenshots/upload_confirm.png differ
diff --git a/screenshots/upload_progress.png b/screenshots/upload_progress.png
new file mode 100644 (file)
index 0000000..5f0b1f2
Binary files /dev/null and b/screenshots/upload_progress.png differ
index be29f3d015dcbdf65ab50bbbbd6114ff3b0de0ca..5f3bc6f359996bd866a89a5b410b9fd8921b05e2 100644 (file)
@@ -1,7 +1,9 @@
 <?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
@@ -44,7 +46,7 @@ if ($_SERVER['REQUEST_METHOD'] == "GET" && count($_GET) == 0) {
     <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 />
@@ -81,51 +83,22 @@ if (isset($_FILES['file']) && is_writable(VAR_FILES)
     $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
@@ -175,13 +148,13 @@ if (isset($_FILES['file']) && is_writable(VAR_FILES)
     $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;
     }
@@ -202,7 +175,7 @@ if (isset($_FILES['file']) && is_writable(VAR_FILES)
     }
     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']) {
@@ -244,8 +217,8 @@ if (isset($_FILES['file']) && is_writable(VAR_FILES)
 } 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
 
@@ -451,13 +424,13 @@ elseif (isset($_GET['init_async'])) {
     $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;
     }
@@ -468,40 +441,11 @@ elseif (isset($_GET['init_async'])) {
         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']) {
diff --git a/tos.php b/tos.php
index 313f0daee5fbeaec22cbeddb94a2ee612f6b8931..cc4a8319b2072261201d56f7c72e7bfcdbf05ed7 100644 (file)
--- a/tos.php
+++ b/tos.php
@@ -1,6 +1,9 @@
 <?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

patrick-canterino.de