]> git.p6c8.net - jirafeau.git/commitdiff
Merge branch 'master' into next-release
authorPatrick Canterino <patrick@patrick-canterino.de>
Sun, 18 Aug 2024 15:53:20 +0000 (17:53 +0200)
committerPatrick Canterino <patrick@patrick-canterino.de>
Sun, 18 Aug 2024 15:57:14 +0000 (17:57 +0200)
This will fix the history after commit 4efa531d in master

12 files changed:
.gitignore
.gitlab-ci.yml
Dockerfile
README.md
docker/README.md
docker/docker_config.php
index.php
lib/config.original.php
lib/functions.php
lib/settings.php
lib/template/footer.php
script.php

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..bf59897709bdf80f812c79592948627fdd45e9ab 100644 (file)
@@ -1,35 +1,45 @@
-# 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
+# Run tests for php:8.1
 job_lint_app_81:
   image: php:8.1
-  script:
+  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.10.0
+    # Install all project dependencies
+    - php composer.phar install
+  script: &linter_script
     - ./vendor/bin/parallel-lint --exclude vendor .
     - ./vendor/bin/php-cs-fixer -vvv fix . --dry-run --using-cache=no --rules=@PSR2
 
+# 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
+    - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" "$CI_REGISTRY"
+    - docker build -t $CI_REGISTRY/$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG .
+    # If we're on the default branch, also tag the image as latest
+    - docker build -t  $CI_REGISTRY/$CI_REGISTRY_IMAGE:$CI_COMMIT_TAG -t $CI_REGISTRY/$CI_REGISTRY_IMAGE:latest .
+    - docker push $CI_REGISTRY/$CI_REGISTRY_IMAGE --all-tags
+  only:
+    - tags
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 8f4d169b4d219e9092cb2b2aced3d4598bc8b0b0..4fff851c3272262e57ff870646e6feb43e9c3973 100644 (file)
--- a/README.md
+++ b/README.md
@@ -101,9 +101,19 @@ You have several options:
 - 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:
 
-`RedirectMatch 301 ^/var-.* http://my.service.jirafeau`
+```apache
+<LocationMatch "^/var-*">
+    Require all denied
+</LocationMatch>
+```
+
+Or you can put a `.htaccess` file containing this into your `var` folder:
+
+```apache
+Require all denied
+```
 
 If you are using nginx, you can add the following to your $vhost.conf:
 
@@ -206,9 +216,9 @@ 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?
 
index 8252795c297303e679b4421fe9f8e9e649bd501f..c506b43a477be8bc207709186f6728f1e028a1bf 100644 (file)
@@ -24,7 +24,7 @@ docker build -t your/jirafeau:latest .
 
 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
+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/).
@@ -64,7 +64,7 @@ Available options:
 
 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
+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,7 +75,7 @@ Note that configuration is not stored in /data.
 Example of using a dedicated volume to store Jirafeau data separately from the container:
 ```
 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
 ```
 
 ## Few notes
index 634d58bfdcc5373a2b24f648006bc174a1be732f..0becc2da3c601b4e13304d80610b6d2bf9b13cab 100644 (file)
@@ -194,4 +194,4 @@ function run_setup(&$cfg)
     }
 }
 
-run_setup($cfg);
\ No newline at end of file
+run_setup($cfg);
index 78c1beb42a647e5688660b9cea7e415ebfd8f88a..b7e2606930e5207e914d6cae4cbb4979cc58478a 100644 (file)
--- a/index.php
+++ b/index.php
@@ -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']);
 }
 
@@ -114,8 +114,8 @@ elseif (true === jirafeau_challenge_upload_ip($cfg, get_ip_address($cfg))) {
     </p>
     </div>
 
-    <?php if ($cfg['download_password_requirement'] === "generated"){
-    ?>
+    <?php if ($cfg['download_password_requirement'] === "generated") {
+        ?>
     <div id="show_password">
     <p><?php echo t('PSW') ?></p>
 
@@ -204,17 +204,23 @@ 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>';
+            echo '<td><input type="checkbox" id="one_time_download"';
+            
+            if ($cfg['one_time_download_preselected']) {
+                echo ' checked';
+            }
+
+            echo ' /></td></tr>';
         }
-        if ($cfg['download_password_requirement'] === 'generated'){
+        if ($cfg['download_password_requirement'] === 'generated') {
             echo '<input type="hidden" name="key" id="input_key" value="' . $download_pass .'"/>';
-        }else{
+        } 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'){
+            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'){
+            if ($cfg['download_password_requirement'] === 'required') {
                 echo ' required';
             }
             echo '/></td></tr>';
index bfa76af9c6f4332164799d7b263619a1019e5a5f..d261f682b1083b9b0ca0f30fbcd36fbfc8029ce4 100644 (file)
@@ -152,6 +152,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 b87f6c3b17e8649b71b7a8523f1d004e055383e2..4736b7f35b2d1b3d9454f631f26e28b824cfadeb 100644 (file)
@@ -143,7 +143,6 @@ function jirafeau_human_size($octets)
 // Convert UTC timestamp to a datetime field
 function jirafeau_get_datetimefield($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>';
@@ -879,7 +878,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/>";
@@ -1239,7 +1238,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 '';
         }
     }
 
index 22a2a5a570086a2afe14bdd0c8adf249e4cb8399..494dfd28f896314022e3a6cfb826835ae8840ea7 100644 (file)
@@ -41,7 +41,9 @@ if ($cfg['debug'] === true) {
 
 /* Jirafeau package */
 define('JIRAFEAU_PACKAGE', 'Jirafeau');
-define('JIRAFEAU_VERSION', '4.6.0');
+define('JIRAFEAU_VERSION', '4.6.x-dev');
+
+define('JIRAFEAU_WEBSITE', 'https://gitlab.com/jirafeau/Jirafeau');
 
 /* Directories. */
 define('VAR_FILES', $cfg['var_root'] . 'files/');
index e0856a873a889f17211c8fdcce2764e2c403ddf7..efe238f730b420521a44c05156d0943c2d6bd982 100644 (file)
@@ -3,7 +3,7 @@
         <!-- 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 -->
index be29f3d015dcbdf65ab50bbbbd6114ff3b0de0ca..8ebcce325fd078b50ada64535c7adc372c9f1285 100644 (file)
@@ -44,7 +44,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,13 +81,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;
     }
@@ -175,13 +175,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;
     }
@@ -451,13 +451,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;
     }

patrick-canterino.de