From: Patrick Canterino Date: Sun, 1 Dec 2024 14:27:35 +0000 (+0100) Subject: Updated CHANGELOG X-Git-Tag: 4.6.1 X-Git-Url: https://git.p6c8.net/jirafeau.git/commitdiff_plain/HEAD?hp=c0148db53bacf76d96f36fbf6c7e07f92ed6c7c5 Updated CHANGELOG --- diff --git a/.dockerignore b/.dockerignore index 4c72529..670c268 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,7 +1,9 @@ +screenshots +AUTHORS.md CHANGELOG.md CONTRIBUTING.md Dockerfile README.md composer.json install.php -.* \ No newline at end of file +.* diff --git a/.gitignore b/.gitignore index c911a76..4c13bde 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,7 @@ lib/config.local.php lib/tos.local.txt media/custom/ +media/dark-custom/ var-* *._* composer.phar diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 0d2d9c4..627ed17 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -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 index 0000000..a8e247e --- /dev/null +++ b/AUTHORS.md @@ -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 diff --git a/CHANGELOG.md b/CHANGELOG.md index c4e27de..13564df 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,20 @@ 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 diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c80c1cd..bde45e8 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -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` diff --git a/Dockerfile b/Dockerfile index 9eb0423..d4854a8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 diff --git a/README.md b/README.md index 0bd28ae..d2ac2b5 100644 --- 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 + + Require all denied + +``` + +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 diff --git a/admin.php b/admin.php index 09bded5..f8270a2 100644 --- a/admin.php +++ b/admin.php @@ -1,7 +1,9 @@ * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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 . + * along with this program. If not, see . */ 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 .\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'); diff --git a/docker/README.md b/docker/README.md index 2c56d26..10ee322 100644 --- a/docker/README.md +++ b/docker/README.md @@ -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 diff --git a/docker/docker_config.php b/docker/docker_config.php index 634d58b..75c6fb8 100644 --- a/docker/docker_config.php +++ b/docker/docker_config.php @@ -1,7 +1,9 @@ + * Copyright (C) 2008 Julien "axolotl" BERNARD + * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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 543fc10..f523f72 100644 --- a/f.php +++ b/f.php @@ -3,6 +3,7 @@ * Jirafeau, your web file repository * Copyright (C) 2008 Julien "axolotl" BERNARD * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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 . + * along with this program. If not, see . */ define('JIRAFEAU_ROOT', dirname(__FILE__) . '/'); diff --git a/index.php b/index.php index 78c1beb..435e059 100644 --- a/index.php +++ b/index.php @@ -1,9 +1,9 @@ - * Jimmy Beauvois + * Copyright (C) 2008 Julien "axolotl" BERNARD + * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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))) { } ?> -
-

-
-

- - -

- - -

-
- - -
-

- -
-

- '?> - -

-
-
- - - -
-

- -

- - -

-
- - -
-

- -

- - -

-
- -
-

- -

- - -

-
- -
-

:

-

-
-
+

@@ -192,7 +130,7 @@ elseif (true === jirafeau_challenge_upload_ip($cfg, get_ip_address($cfg))) { 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))) { ' . t('ONE_TIME_DL') . ':'; - echo ''; - } - if ($cfg['download_password_requirement'] === 'generated'){ - echo ''; - }else{ - echo ''; - echo ''; - }?> + + echo ' />'; + } +if ($cfg['download_password_requirement'] === 'generated') { + echo ''; +} else { + echo ''; + echo ''; +}?> - + + + - * Copyright (C) 2015 Nicola Spanti (RyDroid) + * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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 * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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. */ diff --git a/lib/functions.js.php b/lib/functions.js.php index 3052bf0..b8888a6 100644 --- a/lib/functions.js.php +++ b/lib/functions.js.php @@ -1,8 +1,9 @@ * Copyright (C) 2015 Jerome Jutteau - * Copyright (C) 2015 Nicola Spanti (RyDroid) + * Copyright (C) 2024 Jirafeau project (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 @@ -18,6 +19,109 @@ * along with this program. If not, see . */ +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 = ''; + } + } + + // 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; + } + + // Email link + var b = encodeURIComponent(" \"" + filename + "\":") + "%0D" + "%0A"; + b += encodeURIComponent(web_root + download_link_href) + "%0D" + "%0A"; + if (false == isEmpty(date)) + { + b += "%0D" + "%0A" + encodeURIComponent(": " + 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; + + // 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; + + // Validity date + if (isEmpty(date)) + { + document.getElementById('date').style.display = 'none'; + } + else { + document.getElementById('date').innerHTML = + '' + + date.format('YYYY-MM-DD hh:mm (GMT O)') + + ''; + document.getElementById('date').style.display = ''; + } + + + + var filename = file_name; + + + + var type = file_type; + +} + + + 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% - "; - // 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; - } - + // Email link var filename = document.getElementById('file_select').files[0].name; - var b = encodeURIComponent(" \"" + filename + "\":") + "%0D" + "%0A"; - b += encodeURIComponent(web_root + download_link_href) + "%0D" + "%0A"; - if (false == isEmpty(date)) - { - b += "%0D" + "%0A" + encodeURIComponent(": " + 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; + + + + - // Validity date - if (isEmpty(date)) - { - document.getElementById('date').style.display = 'none'; - } - else { - document.getElementById('date').innerHTML = '' - + date.format('YYYY-MM-DD hh:mm (GMT O)') - + ''; - 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; + - // 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 = ''; - } - } + - // 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) diff --git a/lib/functions.php b/lib/functions.php index b87f6c3..0372507 100644 --- a/lib/functions.php +++ b/lib/functions.php @@ -3,7 +3,7 @@ * Jirafeau, your web file repository * Copyright (C) 2008 Julien "axolotl" BERNARD * Copyright (C) 2015 Jerome Jutteau - * Copyright (C) 2015 Nicola Spanti (RyDroid) + * Copyright (C) 2024 Jirafeau project (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 = '' . date_format($ts, 'Y-m-d H:i') . ' (GMT)'; - + 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 '

'; + 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 ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + if ($visitor_function != null) { + $visitor_function($name, $file_hash, $link_hash); + } + echo '
' . t('ACTION') . '
'; +} + /** * 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 '
'; - 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 ''; - echo ''; - echo ''; - echo ''; - echo ''; - echo ''; - - /* 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 ''; - echo ''; + echo ''; + echo ''; } - echo ''; - echo ''; } } - } - echo '
' . t('ACTION') . '
' . - '' . jirafeau_escape($l['file_name']) . '
'; - echo t('TYPE') . ': ' . jirafeau_escape($l['mime_type']) . '
'; - echo t('SIZE') . ': ' . jirafeau_human_size($l['file_size']) . '
'; - echo t('EXPIRE') . ': ' . ($l['time'] == -1 ? '∞' : jirafeau_get_datetimefield($l['time'])) . '
'; - echo t('ONETIME') . ': ' . ($l['onetime'] == 'O' ? 'Yes' : 'No') . '
'; - echo t('UPLOAD_DATE') . ': ' . jirafeau_get_datetimefield($l['upload_date']) . '
'; - if (strlen($l['ip']) > 0) { - echo t('ORIGIN') . ': ' . $l['ip'] . '
'; - } - echo t('DOWNLOAD_COUNT') . ': ' . $ld['count'] . '
'; - if ($ld['count'] > 0) { - echo t('DOWNLOAD_DATE') . ': ' . jirafeau_get_datetimefield($ld['date']) . '
'; - echo t('DOWNLOAD_IP') . ': ' . $ld['ip'] . '
'; + 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 '
'; + + if (!$l['crypted'] && !$l['crypted_legacy']) { + echo'' . jirafeau_escape($l['file_name']) . ''; + } else { + echo jirafeau_escape($l['file_name']); + } + + echo '
'; + + echo t('TYPE') . ': ' . jirafeau_escape($l['mime_type']) . '
'; + echo t('SIZE') . ': ' . jirafeau_human_size($l['file_size']) . '
'; + echo t('EXPIRE') . ': ' . ($l['time'] == -1 ? '∞' : jirafeau_get_datetimefield($l['time'])) . '
'; + echo t('ONETIME') . ': ' . ($l['onetime'] == 'O' ? t('YES') : t('NO')) . '
'; + echo t('ENCRYPTED') . ': ' . (($l['crypted'] || $l['crypted_legacy']) ? t('YES') : t('NO')) . '
'; + echo t('UPLOAD_DATE') . ': ' . jirafeau_get_datetimefield($l['upload_date']) . '
'; + if (strlen($l['ip']) > 0) { + echo t('ORIGIN') . ': ' . $l['ip'] . '
'; + } + echo '
'; + + if (!$l['crypted'] && !$l['crypted_legacy']) { + echo '
' . + '' . + '' . + jirafeau_admin_csrf_field() . + '' . + '
'; + } + + echo '
' . + '' . + '' . + jirafeau_admin_csrf_field() . + '' . + '
' . + '
' . + '' . + '' . + jirafeau_admin_csrf_field() . + '' . + '
' . + '
'; - echo '
' . - '' . - '' . - jirafeau_admin_csrf_field() . - '' . - '
' . - '
' . - '' . - '' . - jirafeau_admin_csrf_field() . - '' . - '
' . - '
' . - '' . - '' . - jirafeau_admin_csrf_field() . - '' . - '
' . - '
'; + }; + + 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 = "
" . t('REPORTING_AN_ISSUE') . ""; - $out .= "If you have a problem related to Jirafeau, please open an issue, explain your problem in english and copy-paste the following content:

"; + $out .= "If you have a problem related to Jirafeau, please open an issue, explain your problem in english and copy-paste the following content:

"; $out .= "# Jirafeau
"; $out .= "- version: " . JIRAFEAU_VERSION . "
"; @@ -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) +{ + ?> + +
+

+ +
+

+ + +

+ + +

+
+ + +
+

+ +

+ + +

+
+ + +
+

+ +

+ + +

+
+ +
+

+ +

+ + +

+
+ +
+

:

+

+
+
+ '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 ''; +} + +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), + ]; +} diff --git a/lib/lang.php b/lib/lang.php index cfb8f80..abba168 100644 --- a/lib/lang.php +++ b/lib/lang.php @@ -1,7 +1,9 @@ * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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 diff --git a/lib/locales/ar.json b/lib/locales/ar.json index a048c2b..83227b4 100644 --- a/lib/locales/ar.json +++ b/lib/locales/ar.json @@ -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": "", diff --git a/lib/locales/be.json b/lib/locales/be.json index 7f38ca9..4dc371c 100644 --- a/lib/locales/be.json +++ b/lib/locales/be.json @@ -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": "", diff --git a/lib/locales/bn_IN.json b/lib/locales/bn_IN.json index 796ceaa..c0d7a26 100644 --- a/lib/locales/bn_IN.json +++ b/lib/locales/bn_IN.json @@ -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": "", diff --git a/lib/locales/bo.json b/lib/locales/bo.json index 0a94967..9d08b73 100644 --- a/lib/locales/bo.json +++ b/lib/locales/bo.json @@ -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": "", diff --git a/lib/locales/ca.json b/lib/locales/ca.json index 9fa8499..2d259b9 100644 --- a/lib/locales/ca.json +++ b/lib/locales/ca.json @@ -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", diff --git a/lib/locales/ckb.json b/lib/locales/ckb.json index 6277346..bbc76bc 100644 --- a/lib/locales/ckb.json +++ b/lib/locales/ckb.json @@ -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": "", diff --git a/lib/locales/cs.json b/lib/locales/cs.json index 8aee626..9db9731 100644 --- a/lib/locales/cs.json +++ b/lib/locales/cs.json @@ -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": "", diff --git a/lib/locales/da.json b/lib/locales/da.json index a08c46f..af0ccb8 100644 --- a/lib/locales/da.json +++ b/lib/locales/da.json @@ -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": "", diff --git a/lib/locales/de.json b/lib/locales/de.json index ea3c290..8936ee1 100644 --- a/lib/locales/de.json +++ b/lib/locales/de.json @@ -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", diff --git a/lib/locales/el.json b/lib/locales/el.json index a0da96f..2676b18 100644 --- a/lib/locales/el.json +++ b/lib/locales/el.json @@ -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": "", diff --git a/lib/locales/en.json b/lib/locales/en.json index 092980a..f17bf9a 100644 --- a/lib/locales/en.json +++ b/lib/locales/en.json @@ -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", diff --git a/lib/locales/es.json b/lib/locales/es.json index 5053041..3c6bac0 100644 --- a/lib/locales/es.json +++ b/lib/locales/es.json @@ -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", diff --git a/lib/locales/et.json b/lib/locales/et.json index 6277346..bbc76bc 100644 --- a/lib/locales/et.json +++ b/lib/locales/et.json @@ -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": "", diff --git a/lib/locales/fi.json b/lib/locales/fi.json index db7eecf..debff9c 100644 --- a/lib/locales/fi.json +++ b/lib/locales/fi.json @@ -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": "", diff --git a/lib/locales/fr.json b/lib/locales/fr.json index a9162ab..8629b76 100644 --- a/lib/locales/fr.json +++ b/lib/locales/fr.json @@ -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", diff --git a/lib/locales/he.json b/lib/locales/he.json index 3e40020..ea0f4e5 100644 --- a/lib/locales/he.json +++ b/lib/locales/he.json @@ -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": "", diff --git a/lib/locales/hi.json b/lib/locales/hi.json index 5c19acc..fdca622 100644 --- a/lib/locales/hi.json +++ b/lib/locales/hi.json @@ -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": "", diff --git a/lib/locales/hr.json b/lib/locales/hr.json index 788ce9e..d1994d6 100644 --- a/lib/locales/hr.json +++ b/lib/locales/hr.json @@ -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": "", diff --git a/lib/locales/hu.json b/lib/locales/hu.json index 4d3b8e0..a4a075e 100644 --- a/lib/locales/hu.json +++ b/lib/locales/hu.json @@ -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": "", diff --git a/lib/locales/id.json b/lib/locales/id.json index 74fc276..24cea50 100644 --- a/lib/locales/id.json +++ b/lib/locales/id.json @@ -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": "", diff --git a/lib/locales/it.json b/lib/locales/it.json index c4e53b5..4be5d53 100644 --- a/lib/locales/it.json +++ b/lib/locales/it.json @@ -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", diff --git a/lib/locales/ja.json b/lib/locales/ja.json index ee6a2e8..04e6735 100644 --- a/lib/locales/ja.json +++ b/lib/locales/ja.json @@ -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": "", diff --git a/lib/locales/ko.json b/lib/locales/ko.json index 5c19acc..fdca622 100644 --- a/lib/locales/ko.json +++ b/lib/locales/ko.json @@ -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": "", diff --git a/lib/locales/la.json b/lib/locales/la.json index 45aeaaa..b5cf0a2 100644 --- a/lib/locales/la.json +++ b/lib/locales/la.json @@ -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": "", diff --git a/lib/locales/mfe.json b/lib/locales/mfe.json index 6277346..bbc76bc 100644 --- a/lib/locales/mfe.json +++ b/lib/locales/mfe.json @@ -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": "", diff --git a/lib/locales/ms.json b/lib/locales/ms.json index c01c93d..27575f7 100644 --- a/lib/locales/ms.json +++ b/lib/locales/ms.json @@ -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": "", diff --git a/lib/locales/nb_NO.json b/lib/locales/nb_NO.json index ce80c40..939f52b 100644 --- a/lib/locales/nb_NO.json +++ b/lib/locales/nb_NO.json @@ -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", diff --git a/lib/locales/nl.json b/lib/locales/nl.json index 1855d0b..c817eee 100644 --- a/lib/locales/nl.json +++ b/lib/locales/nl.json @@ -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", diff --git a/lib/locales/pl.json b/lib/locales/pl.json index 07a814a..d70f0de 100644 --- a/lib/locales/pl.json +++ b/lib/locales/pl.json @@ -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": "", diff --git a/lib/locales/ps.json b/lib/locales/ps.json index 6277346..bbc76bc 100644 --- a/lib/locales/ps.json +++ b/lib/locales/ps.json @@ -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": "", diff --git a/lib/locales/pt.json b/lib/locales/pt.json index 9ec79a9..812b59d 100644 --- a/lib/locales/pt.json +++ b/lib/locales/pt.json @@ -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", diff --git a/lib/locales/pt_BR.json b/lib/locales/pt_BR.json index c902a9c..1e36b53 100644 --- a/lib/locales/pt_BR.json +++ b/lib/locales/pt_BR.json @@ -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", diff --git a/lib/locales/ro.json b/lib/locales/ro.json index dbe2046..6d76460 100644 --- a/lib/locales/ro.json +++ b/lib/locales/ro.json @@ -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": "", diff --git a/lib/locales/ru.json b/lib/locales/ru.json index 6452559..6b0f951 100644 --- a/lib/locales/ru.json +++ b/lib/locales/ru.json @@ -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": "", diff --git a/lib/locales/sh.json b/lib/locales/sh.json index 6277346..bbc76bc 100644 --- a/lib/locales/sh.json +++ b/lib/locales/sh.json @@ -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": "", diff --git a/lib/locales/si.json b/lib/locales/si.json index 54401df..842db6c 100644 --- a/lib/locales/si.json +++ b/lib/locales/si.json @@ -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": "", diff --git a/lib/locales/sk.json b/lib/locales/sk.json index e40d2b9..8c42dc5 100644 --- a/lib/locales/sk.json +++ b/lib/locales/sk.json @@ -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": "", diff --git a/lib/locales/sl.json b/lib/locales/sl.json index 7f06388..463d58b 100644 --- a/lib/locales/sl.json +++ b/lib/locales/sl.json @@ -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": "", diff --git a/lib/locales/sq.json b/lib/locales/sq.json index 6277346..bbc76bc 100644 --- a/lib/locales/sq.json +++ b/lib/locales/sq.json @@ -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": "", diff --git a/lib/locales/sr.json b/lib/locales/sr.json index 53f23a2..6aca55f 100644 --- a/lib/locales/sr.json +++ b/lib/locales/sr.json @@ -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": "", diff --git a/lib/locales/sv.json b/lib/locales/sv.json index 0145206..59c215b 100644 --- a/lib/locales/sv.json +++ b/lib/locales/sv.json @@ -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", diff --git a/lib/locales/ta.json b/lib/locales/ta.json index d6e0c1d..c46fd97 100644 --- a/lib/locales/ta.json +++ b/lib/locales/ta.json @@ -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": "", diff --git a/lib/locales/template.json b/lib/locales/template.json index cfaefff..ce688bf 100644 --- a/lib/locales/template.json +++ b/lib/locales/template.json @@ -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": "", @@ -110,6 +118,9 @@ "ONETIME": "", "UPLOAD_DATE": "", "ORIGIN": "", + "DOWNLOAD_COUNT": "", + "DOWNLOAD_DATE": "", + "DOWNLOAD_IP": "", "ACTION": "", "DEL_LINK": "", "DEL_FILE_LINKS": "", diff --git a/lib/locales/th.json b/lib/locales/th.json index 6277346..bbc76bc 100644 --- a/lib/locales/th.json +++ b/lib/locales/th.json @@ -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": "", diff --git a/lib/locales/tr.json b/lib/locales/tr.json index 239a432..76287db 100644 --- a/lib/locales/tr.json +++ b/lib/locales/tr.json @@ -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", diff --git a/lib/locales/uk.json b/lib/locales/uk.json index 6b9e17e..bd8f31c 100644 --- a/lib/locales/uk.json +++ b/lib/locales/uk.json @@ -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": "", diff --git a/lib/locales/vi.json b/lib/locales/vi.json index bcfad0a..35bb24e 100644 --- a/lib/locales/vi.json +++ b/lib/locales/vi.json @@ -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": "", diff --git a/lib/locales/zh.json b/lib/locales/zh.json index cf65cc5..5b01550 100644 --- a/lib/locales/zh.json +++ b/lib/locales/zh.json @@ -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": "", diff --git a/lib/locales/zh_TW.json b/lib/locales/zh_TW.json index a571dcb..43877f5 100644 --- a/lib/locales/zh_TW.json +++ b/lib/locales/zh_TW.json @@ -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": "", diff --git a/lib/settings.php b/lib/settings.php index 22a2a5a..f0f193e 100644 --- a/lib/settings.php +++ b/lib/settings.php @@ -2,6 +2,8 @@ /* * Jirafeau, your web file repository * Copyright (C) 2008 Julien "axolotl" BERNARD + * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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/'); diff --git a/lib/template/footer.php b/lib/template/footer.php index e0856a8..64132c7 100644 --- a/lib/template/footer.php +++ b/lib/template/footer.php @@ -3,14 +3,19 @@ ' . t('JI_PROJECT') . '' . + ' ' . t('JI_PROJECT') . '' . ' (AGPL-3.0)'; ?> | '; + echo ' ' . t('DESIGNED') . ' ' . $cfg['organisation']; + } + echo ' | '; - echo '' . t('TOS') . ''; + echo '' . t('TOS') . ''; } ?>

diff --git a/lib/template/header.php b/lib/template/header.php index 8be36c7..93f7e18 100644 --- a/lib/template/header.php +++ b/lib/template/header.php @@ -6,7 +6,7 @@ header('x-ua-compatible: ie=edge'); - <?php echo (true === empty($cfg['title']))? t('JI_WEB_RE') : $cfg['title']; ?> + <?php echo (true === empty($cfg['title'])) ? t('JI_WEB_RE') : $cfg['title']; ?> @@ -17,6 +17,6 @@ header('x-ua-compatible: ie=edge');

- +

diff --git a/screenshots/admin.png b/screenshots/admin.png new file mode 100644 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 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 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 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 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 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 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 index 0000000..5f0b1f2 Binary files /dev/null and b/screenshots/upload_progress.png differ diff --git a/script.php b/script.php index be29f3d..5f3bc6f 100644 --- a/script.php +++ b/script.php @@ -1,7 +1,9 @@ * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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) {

Scripting interface

This interface permits to script your uploads and downloads.

-

See source code of this interface to get available calls :)

+

See source code of this interface to get available calls :)

You may download a preconfigured Bash Script to easily send to and get files from the API via command line.


@@ -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 313f0da..cc4a831 100644 --- a/tos.php +++ b/tos.php @@ -1,6 +1,9 @@ + * Copyright (C) 2015 Jerome Jutteau + * Copyright (C) 2024 Jirafeau project (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