]> git.p6c8.net - jirafeau_mojo42.git/commitdiff
[FEATURE] add LDAP authentication support for uploaders ldap
authorJerome Jutteau <jerome@jutteau.fr>
Sun, 28 Aug 2022 14:02:35 +0000 (16:02 +0200)
committerJerome Jutteau <jerome@jutteau.fr>
Sun, 28 Aug 2022 14:42:01 +0000 (16:42 +0200)
closes #311

Signed-off-by: Jerome Jutteau <jerome@jutteau.fr>
59 files changed:
Dockerfile
README.md
docker/README.md
docker/docker-compose-examples/ldap/README.md [new file with mode: 0644]
docker/docker-compose-examples/ldap/bootstrap.jirafeau.ldif [new file with mode: 0644]
docker/docker-compose-examples/ldap/docker-compose.yml [new file with mode: 0644]
docker/docker_config.php
index.php
lib/config.original.php
lib/functions.php
lib/locales/ar.json
lib/locales/be.json
lib/locales/bn_IN.json
lib/locales/bo.json
lib/locales/ca.json
lib/locales/ckb.json
lib/locales/cs.json
lib/locales/da.json
lib/locales/de.json
lib/locales/el.json
lib/locales/en.json
lib/locales/es.json
lib/locales/et.json
lib/locales/fi.json
lib/locales/fr.json
lib/locales/he.json
lib/locales/hi.json
lib/locales/hr.json
lib/locales/hu.json
lib/locales/id.json
lib/locales/it.json
lib/locales/ja.json
lib/locales/ko.json
lib/locales/la.json
lib/locales/mfe.json
lib/locales/ms.json
lib/locales/nb_NO.json
lib/locales/nl.json
lib/locales/pl.json
lib/locales/ps.json
lib/locales/pt.json
lib/locales/pt_BR.json
lib/locales/ro.json
lib/locales/ru.json
lib/locales/sh.json
lib/locales/si.json
lib/locales/sk.json
lib/locales/sl.json
lib/locales/sq.json
lib/locales/sr.json
lib/locales/sv.json
lib/locales/ta.json
lib/locales/template.json
lib/locales/th.json
lib/locales/tr.json
lib/locales/uk.json
lib/locales/vi.json
lib/locales/zh.json
lib/locales/zh_TW.json

index 9eb04233aa3b0d2d3acd2d55a0126c62a336b24f..ccb100b24e4786ccff9be65e01f6cb75f94441f8 100644 (file)
@@ -3,7 +3,9 @@ LABEL org.opencontainers.image.authors="jerome@jutteau.fr"
 
 # base install
 RUN apk update && \
-    apk add lighttpd && \
+    apk add lighttpd openldap-dev && \
+    docker-php-ext-install ldap && \
+    docker-php-ext-enable  ldap && \
     rm -rf /var/cache/apk/* && \
     ln -snf /usr/share/zoneinfo/Etc/UTC /etc/localtime  && \
     echo "UTC" > /etc/timezone
index 9105c7ff044ee2c9ed4b9b4337b3ab85358149bc..405185c2d89e5eb8c36af118117298fcb8bba802 100644 (file)
--- a/README.md
+++ b/README.md
@@ -20,6 +20,7 @@ See [jirafeau.net](https://jirafeau.net/) for a demo.
 - Shows progression: speed, percentage and remaining upload time
 - Preview content in browser (if possible)
 - Optional password protection (for uploading or downloading)
+- LDAP authentication for uploaders
 - Set expiration time for downloads
 - Option to self-destruct after first download
 - Shortened URLs using base 64 encoding
@@ -292,6 +293,17 @@ So:
 - The button "delete link" will delete the reference to the file but might not destroy the file.
 - The button "delete file and links" will delete all references pointing to the file and will destroy the file.
 
+### How can I setup LDAP authentication?
+
+LDAP authentication is disabled by default. To use it, you will need to install [PHP LDAP extension](https://www.php.net/manual/en/book.ldap.php) and edit your `lib/config.local.php` to set those options:
+- `upload_ldap_auth`: set it to `true`
+- `upload_ldap_host`: set it to your ldap host
+- `upload_ldap_base_dn`: set it to your base DN
+
+More details in [config.original.php](lib/config.original.php)'s documentation.
+
+Note that you can test around LDAP with [docker-compose example](./docker/docker-compose-examples/ldap/).
+
 ### How to contact someone from Jirafeau?
 
 Feel free to create an issue if you found a bug.
index daf5302bb4f202722b5d290194406adf6c03c841..d2ee3ad91de100d7c8ef36d748dddba784511114 100644 (file)
@@ -52,6 +52,9 @@ Available options:
 - `UPLOAD_IP_NO_PASSWORD`: set one or more ip allowed to upload files without password (separated by comma).
 - `PROXY_IP`: set one or more proxy ip (separated by comma).
 - `STORE_UPLOADER_IP`: set to 1 or 0 to enable or disable keeping sender's IP with the _link_ file.
+- `UPLOAD_LDAP_AUTH`: set 1 or 0 to enable or disable LDAP authentication.
+- `UPLOAD_LDAP_HOST`: set LDAP host to contact (with `UPLOAD_LDAP_AUTH=1`)
+- `UPLOAD_LDAP_BASE_DN`: set LDAP base DN to use (with `UPLOAD_LDAP_AUTH=1`)
 
 Example:
 ```
diff --git a/docker/docker-compose-examples/ldap/README.md b/docker/docker-compose-examples/ldap/README.md
new file mode 100644 (file)
index 0000000..8f198f2
--- /dev/null
@@ -0,0 +1,38 @@
+# Docker-compose example with LDAP
+
+This example help users (and developpers) to setup a LDAP deployment with Jirafeau.
+
+# Build Jirafeau's image
+
+You can skip this step if you are not developping Jirafeau.
+
+In Jirafeau's project folder:
+```
+docker build . -t mojo42/jirafeau:dev
+```
+
+# Customize docker-compose.yml
+
+Open [docker-compose.yml](docker-compose.yml) file and tweak it as needed.
+You can change Jirafeau's image to an official release if you are not developping Jirafeau.
+
+# Run docker compose
+
+```
+docker-compose up -d
+docker-compose logs -f
+```
+
+# Testing
+
+You can now connect to [127.0.0.1:8080](http://127.0.0.1:8080/) to access Jirafeau instance and [127.0.0.1:8090](http://127.0.0.1:8090/) to access PHP LDAP Admin.
+
+You can login on PHP LDAP admin with those default credentials:
+- login DN: `cn=admin,dc=jirafeau,dc=net`
+- Password: `admin`
+
+Once connected on PHP LDAP Admin, you can import [bootstrap.jirafeau.ldif](bootstrap.jirafeau.ldif) to inject a test user.
+Once imported, you should be able to login on Jirafeau with those credentials:
+- Login: `jerome`
+- Password: `password`
+
diff --git a/docker/docker-compose-examples/ldap/bootstrap.jirafeau.ldif b/docker/docker-compose-examples/ldap/bootstrap.jirafeau.ldif
new file mode 100644 (file)
index 0000000..266a26e
--- /dev/null
@@ -0,0 +1,39 @@
+# LDIF Export for dc=jirafeau,dc=net
+# Server: openldap_server (openldap_server)
+# Search Scope: sub
+# Search Filter: (objectClass=*)
+# Total Entries: 3
+#
+# Generated by phpLDAPadmin (http://phpldapadmin.sourceforge.net) on August 5, 2022 4:20 pm
+# Version: 1.2.3
+
+version: 1
+
+# Entry 1: dc=jirafeau,dc=net
+dn: dc=jirafeau,dc=net
+dc: jirafeau
+o: Example Inc.
+objectclass: top
+objectclass: dcObject
+objectclass: organization
+
+# Entry 2: cn=jerome,dc=jirafeau,dc=net
+dn: cn=jerome,dc=jirafeau,dc=net
+cn: jerome
+gidnumber: 500
+givenname: jerome
+homedirectory: /home/users/jjutteau
+objectclass: inetOrgPerson
+objectclass: posixAccount
+objectclass: top
+sn: jutteau
+uid: jjutteau
+uidnumber: 1000
+userpassword: password
+
+# Entry 3: cn=users,dc=jirafeau,dc=net
+dn: cn=users,dc=jirafeau,dc=net
+cn: users
+gidnumber: 500
+objectclass: posixGroup
+objectclass: top
\ No newline at end of file
diff --git a/docker/docker-compose-examples/ldap/docker-compose.yml b/docker/docker-compose-examples/ldap/docker-compose.yml
new file mode 100644 (file)
index 0000000..8cd1955
--- /dev/null
@@ -0,0 +1,43 @@
+version: '3.7'
+
+networks:
+  jirafeau:
+
+services:
+  openldap_server:
+    image: osixia/openldap:1.5.0
+    ports:
+      - "389:389"
+    environment:
+      LDAP_TLS: "false"
+      LDAP_ADMIN_PASSWORD: "admin"
+      LDAP_DOMAIN: "jirafeau.net"
+      LDAP_BASE_DN: "dc=jirafeau,dc=net"
+    volumes:
+      - 'openldap_data:/bitnami/openldap'
+    networks:
+      - jirafeau
+  phpldapadmin:
+    image: osixia/phpldapadmin:0.7.2
+    ports:
+      - 8090:80
+    environment:
+      PHPLDAPADMIN_LDAP_HOSTS: openldap_server
+      PHPLDAPADMIN_HTTPS: "false"
+    networks:
+      - jirafeau
+  jirafeau:
+    image: mojo42/jirafeau:dev
+    ports:
+      - "8080:80"
+    environment:
+      DEBUG: 0
+      ADMIN_PASSWORD: "password"
+      UPLOAD_LDAP_AUTH: 1
+      UPLOAD_LDAP_HOST: openldap_server
+      UPLOAD_LDAP_BASE_DS: "dc=jirafeau,dc=net"
+    networks:
+      - jirafeau
+
+volumes:
+  openldap_data:
index 6a03b7360aebd63308c0ac8ea49cde3f85e612f1..a9eae5ce1e03fe7f031d6b34fc208ed90a1adcd2 100644 (file)
@@ -175,6 +175,9 @@ function run_setup(&$cfg)
     env_2_cfg_string_array($cfg, 'upload_ip_nopassword');
     env_2_cfg_string_array($cfg, 'proxy_ip');
     env_2_cfg_bool($cfg, 'store_uploader_ip');
+    env_2_cfg_bool($cfg, 'upload_ldap_auth');
+    env_2_cfg_string($cfg, 'upload_ldap_host');
+    env_2_cfg_string($cfg, 'upload_ldap_base_dn');
 
     if ($setup_ok) {
         $cfg['installation_done'] = true;
index b6dac09040a714ee8fb8aff50cc590d6e01cb7c8..f60c37d8d2046e7508a6d75796d70d7f1b5af799 100644 (file)
--- a/index.php
+++ b/index.php
@@ -40,14 +40,60 @@ if (isset($_POST['action']) && (strcmp($_POST['action'], 'logout') == 0)) {
 }
 
 /* Check if user is allowed to upload. */
-// First check: Is user already logged
+// check if user already logged
 if (jirafeau_user_session_logged()) {
 }
-// Second check: Challenge by IP NO PASSWORD
+// check of ldap authentication
+elseif (jirafeau_has_ldap_auth($cfg)) {
+    if (isset($_POST['ldap_user']) and isset($_POST['ldap_password'])) {
+        $result = jirafeau_challenge_ldap_auth($cfg, $_POST['ldap_user'], $_POST['ldap_password']);
+        if (true === $result) {
+            jirafeau_user_session_start();
+        } else {
+            jirafeau_session_end();
+            jirafeau_non_fatal_error(t('BAD_PSW'));
+        }
+    }
+    // Show login form if user session is not authorized yet
+    if (!jirafeau_user_session_logged()) {
+        ?>
+        <form method="post" class="form login">
+            <fieldset>
+            <table>
+            <tr>
+              <td class = "label"><label for = "enter_user">
+              <?php echo t('UP_USER') . ':'; ?></label>
+              </td>
+            </tr><tr>
+              <td class = "field">
+                <input type="text" name="ldap_user" id="ldap_user" size="40" autocomplete="ldap-user"/>
+               </td>
+            </tr><tr>
+              <td class="label"><label for="enter_password">
+              <?php echo t('PASSWORD') . ':'; ?></label>
+              </td>
+            </tr><tr>
+              <td class="field">
+                <input type="password" name="ldap_password" id="ldap_password" size="40" autocomplete="ldap-password" />
+              </td>
+            </tr><tr class = "nav">
+              <td class = "nav next">
+                <input type="submit" name="key" value="<?php echo t('LOGIN'); ?>"/>
+              </td>
+            </tr>
+          </table>
+          </fieldset>
+       </form>
+<?php
+        require(JIRAFEAU_ROOT.'lib/template/footer.php');
+        exit;
+    }
+}
+// Allow certains IP to upload with no password
 elseif (true === jirafeau_challenge_upload_ip_without_password($cfg, get_ip_address($cfg))) {
     jirafeau_user_session_start();
 }
-// Third check: Challenge by IP
+// Challenge by IP
 elseif (true === jirafeau_challenge_upload_ip($cfg, get_ip_address($cfg))) {
     // Is an upload password required?
     if (jirafeau_has_upload_password($cfg)) {
index 1f2e8b7073b441454bea055c5843c876371085c5..7d221b701bf28806fba591f9202bfeb2ead0fe36 100644 (file)
@@ -222,3 +222,14 @@ $cfg['debug'] = false;
  * Set to 0 to remove limitation.
  */
 $cfg['max_upload_chunk_size_bytes'] = 100000000; // 100MB
+
+/** Enable LDAP authentication for uploaders
+ * Cannot be used with 'upload_password' or 'upload_ip_nopassword' options.
+ */
+$cfg['upload_ldap_auth'] = false;
+
+/** LDAP host to reach when 'upload_ldap_auth' is enabled */
+$cfg['upload_ldap_host'] = "";
+
+/** LDAP Base DN to authenticate users with 'upload_ldap_auth' option enabled*/
+$cfg['upload_ldap_base_dn'] = "dc=jirafeau,dc=net";
index 850386b79ee6c5e6aa5e111dd8866b24d2d338c8..58001902d71b0ceda4922be9588ea57ef1b6f9db 100644 (file)
@@ -142,6 +142,11 @@ function jirafeau_fatal_error($errorText, $cfg = array())
     exit;
 }
 
+function jirafeau_non_fatal_error($errorText)
+{
+    echo '<div class="error"><p>' . $errorText . '</p></div>';
+}
+
 function jirafeau_clean_rm_link($link)
 {
     $p = s2p("$link");
@@ -619,6 +624,14 @@ function check_errors($cfg)
     if ($cfg['one_time_download'] && $cfg['litespeed_workaround']) {
         add_error(t('INCOMPATIBLE_OPTIONS_W'), 'one_time_download=true<br>litespeed_workaround=true');
     }
+    if ($cfg['upload_ldap_auth'] === true) {
+        if (sizeof($cfg['upload_password']) > 0) {
+            add_error(t('INCOMPATIBLE_OPTIONS_W'), 'upload_ldap_auth=true<br>sizeof(upload_password) > 0');
+        }
+        if (sizeof($cfg['upload_ip_nopassword']) > 0) {
+            add_error(t('INCOMPATIBLE_OPTIONS_W'), 'upload_ldap_auth=true<br>sizeof(upload_ip_nopassword) > 0');
+        }
+    }
 }
 
 /**
@@ -1587,3 +1600,49 @@ function jirafeau_default_web_root()
 {
     return $_SERVER['HTTP_HOST'] . str_replace('install.php', '', $_SERVER['REQUEST_URI']);
 }
+
+function jirafeau_has_ldap_auth($cfg)
+{
+    return $cfg['upload_ldap_auth'] === true;
+}
+
+function jirafeau_challenge_ldap_auth($cfg, $user, $password)
+{
+    if (!jirafeau_has_ldap_auth($cfg)) {
+        return "upload_ldap_auth not set";
+    }
+    if (strlen($cfg['upload_ldap_host']) == 0) {
+        return "upload_ldap_host not set";
+    }
+    if (strlen($cfg['upload_ldap_base_dn']) == 0) {
+        return "upload_ldap_base_dn not set";
+    }
+    $host = $cfg['upload_ldap_host'];
+    $base_dn = $cfg['upload_ldap_base_dn'];
+    $con = ldap_connect("ldap://$host");
+    $ldap_user = "cn=$user,$base_dn";
+    if (!$con) {
+        return "cannot initiate connection to ldap server";
+    }
+    ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
+    ldap_set_option($con, LDAP_OPT_REFERRALS, 0);
+    $bind = ldap_bind_ext($con, $ldap_user, $password, [['oid' => LDAP_CONTROL_PASSWORDPOLICYREQUEST]]);
+    if (!$bind) {
+        ldap_close($con);
+        return "cannot bind to ldap server";
+    }
+    $parsing = ldap_parse_result($con, $bind, $errcode, $matcheddn, $errmsg, $referrals, $ctrls);
+    if (!$parsing) {
+        ldap_close($con);
+        return "cannot parlse ldap results";
+    }
+    if ($errcode == 49) {
+        ldap_close($con);
+        return "bad password";
+    }
+    if ($errcode != 0) {
+        ldap_close($con);
+        return "ldap auth error: $errmsg ($errcode)";
+    }
+    return true;
+}
index 771da14ac96593d8b3b5e97242e27b6ad1b95309..b235238fb56015a0bbd5aedc98fdd7dbdf8b1de3 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 4c7218ae626cfe3526565e44aa1c2bcf4116ea7b..833a8fbeda9c62eac4c9c5c8d90c8bead7000b4c 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index da6831affd3b5423742fb3989b2ba53945ba221d..142aa64d64363e8630da66924c26e829fcb3c891 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 58a68454f3163160e227c3e0bbb12a980091aa2b..cca0debf28d291db799b294b78668b475cfce52f 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index fdcaa45d083ae29e9a2718a045ea0d557ece392b..83817822f86959f924437d22c820b734eaa1c650 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "Una quincena",
index 6bca483e0677e1cc6abc79fff29f2b64496a3e03..449e08d4dededb7e479a302c41f1d47b03f32d97 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 2803a33a1bdea7882d39707e87b2c8d9f2d0ddb4..258898fd4744cd37f7a412e8428b3e82d2a57f9b 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 9fa71451471371772117283bd9e8ad4c600361e1..6bdaa9483e89455d920cb2e1049621812ef1b031 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 3b6d96f65bbc5ac0d27cbb7c108cc13648b6d025..464e776b27c9686b85df7024d3ff9c41cf795c0b 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "Zwei Wochen",
index 1e8248a0ee503acadbfe06d0c5a725129a3517ef..63ec11d6595650295c9c0d3f3aedacc8d00e169a 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index b3de22ca073959429c6a29e156259f398e6a2700..e06282fa1df8e31eb7a7eb34bafd1c57c2468c2f 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "Password",
+    "UP_USER": "User",
     "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",
index 6ea061949c75c1447426ba4135848ce9ea4a5f00..f1c6842b4259002e7ebf2e9d0847d9f563273285 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "Una quincena",
index 6bca483e0677e1cc6abc79fff29f2b64496a3e03..449e08d4dededb7e479a302c41f1d47b03f32d97 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 5bd161313aa9c61e329b2d2e2b0b4fe12f4381f1..0ce4dc4f6271ba88abc4433777278cd2253d683a 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 5c5d76611e59bb2339fdf6b735cebb1ae6f34cce..b598de73aab76bb6779c30aa58995e64d3915677 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "Mot de passe",
+    "UP_USER": "Utilisateur",
     "INSTALL_FILE_NOT_FOUND_TITLE": "Fichier d'installation non-trouvé",
     "INSTALL_FILE_NOT_FOUND_DESC": "L'installation est incomplète et le ficher install.php est introuvable",
     "2_W": "Deux semaines",
index 21a4464fdc277535b0246a0df454ceba9a9f44ea..20ab4d9f54468eedb11f62ee6992fdfe3152bf1a 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 1c8538f99a57a0af2eda9d99db46ee0381f2b04c..666f80714bc459990d57071c3ce01268f3d821c9 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 3a9ccb1c8f8cfcad8089a49aaf775c3b55aaece0..6a8e0f1f9d420d3550d525f74d512b8010d0cadf 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 129c3e5b90622ef43a6cb578cce96b2029de74ee..028835ac5d26a54390ca7203eebdc8b83ff605c5 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 95511635d9ad4f4a411db605b60c5c7455bd6c30..26c0a21b6f48383026d7e452f431442e1b936fdb 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 94a3abb01cfbf4125b2bea663f9636200587974c..fd142221181799febed2f30b570878a5f6d6094f 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "Due settimane",
index 4d32118a7920fdbdef65131a779a3a77f6a888d9..d6223ecd964cd435f7e35c30a082af2126934fd7 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 1c8538f99a57a0af2eda9d99db46ee0381f2b04c..666f80714bc459990d57071c3ce01268f3d821c9 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 846f564179d224b96742a15c2df980b9f279369c..5870a2b33bdbbb77af1f8cf7e4b79522838548ff 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 6bca483e0677e1cc6abc79fff29f2b64496a3e03..449e08d4dededb7e479a302c41f1d47b03f32d97 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 066ecd8a91ab3099107475c525ba1e6a33e0aa60..1c291f6369cc340469d6ac5a0dcfd747aaaf7481 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index cacbca10a3419a1ac53396cabc868efb46f12a49..96c3adda8ec31f2336caf6777a0d8c0c39ffddbd 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "To uker",
index 36243f9cee602334ede8a7bb6ddba007c9945e1f..ced6452602a670913cdbf4af3197b5b0155d8eea 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "Twee weken",
index eea531bb1d2eca33d333c873d70ba416981757a4..39bbe5bcea864d87057a6cf3410cbdab6045f1bf 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 6bca483e0677e1cc6abc79fff29f2b64496a3e03..449e08d4dededb7e479a302c41f1d47b03f32d97 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 782b63e866c645d7dfadd5a48752d8149cc7d8d1..da5d92c4c67f9288e54ff0677982041ee161bad3 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "Uma quinzena",
index 08d4104b8b6119508fa48da65f6345a23db24275..87eaa8cc7791dcf68e4460362b19f25f87e1bdaf 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "Uma quinzena",
index f3d9841490fedb54b8854cb447f6eba0f9542e4c..5dd8cc84765487285e1b9782f9266b1b0d77719b 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index aba71f519859241a5e87ff9529e748561501e248..308abd3f695f47e4bf3607a6c6d0d06b57829af7 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 6bca483e0677e1cc6abc79fff29f2b64496a3e03..449e08d4dededb7e479a302c41f1d47b03f32d97 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 786a8bfb9a7162933277f5930b4c4598cd023b38..70cb7a584120e04418bd6703dffd2fc6eb2c9217 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "REPORTING_AN_ISSUE": "",
     "SIZE_DATA": "",
     "INCOMPATIBLE_OPTIONS_W": "",
index bbf21ead2f7acb26d3d6d3c12d418ad1b79f1b8a..73af2fd233c962c334ad59f813458975e9d3fc60 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index aca3a2d5771bd6d270cca99295be3ea6f7cb2c90..43eea83d8a858d6b31a6e376b19f406e05edd1d5 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 6bca483e0677e1cc6abc79fff29f2b64496a3e03..449e08d4dededb7e479a302c41f1d47b03f32d97 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 2149291318d89cd2202c172a90ebb1aabef96584..6828890e86ac5078d1187a08a99d7e92211970bd 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 134763f5bdea23718c975496fbc09ee59f4565d1..98e75493b65c38b4015013b88de67cb83fda4169 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "Två veckor",
index 16ee6fcbb287050c9609fa2b7794890690352aef..ffedb6e5326301c5f761f89d6ae369f8a0b61d0f 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 5a55190c5824fd8e9fb69dda617f3d886ca875e7..d9179d632ae0d4445dfc593d7ae6ab32e40bb858 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 6bca483e0677e1cc6abc79fff29f2b64496a3e03..449e08d4dededb7e479a302c41f1d47b03f32d97 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index 6cfe69e33f357c54d439fe34230fde5c7f218a54..6da97973060f21c7cae923dad7917ff031498aff 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "İki hafta",
index a93343416bb56ef6fc77222d6c67d0d7d4332598..ab8218d9ca1355c69fe3fd0cde1af78dfd189720 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index cf36cc7ab99a1e974b8978e1a5ea6a9dff98a0e4..9955c9455e0dccf8cf74e158a949fd5d20dfc010 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index c3e89b42c91b66fc646255d07a733be6edc57a4f..93a01879a53ae540161de6703453f05263eb705f 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",
index b243155d24e19542b7788b17a58c7f07be6305e3..d2ccc24247cc75de39fc1a1376fcef437992cd60 100644 (file)
@@ -1,4 +1,6 @@
 {
+    "PASSWORD": "",
+    "UP_USER": "",
     "INSTALL_FILE_NOT_FOUND_TITLE": "",
     "INSTALL_FILE_NOT_FOUND_DESC": "",
     "2_W": "",

patrick-canterino.de