From: Jerome Jutteau Date: Sun, 28 Aug 2022 14:02:35 +0000 (+0200) Subject: [FEATURE] add LDAP authentication support for uploaders X-Git-Url: https://git.p6c8.net/jirafeau_mojo42.git/commitdiff_plain/refs/heads/ldap?hp=8dadaf0af0d3b92a2282a1c5bcb1305a97e135d8 [FEATURE] add LDAP authentication support for uploaders closes #311 Signed-off-by: Jerome Jutteau --- diff --git a/Dockerfile b/Dockerfile index 9eb0423..ccb100b 100644 --- a/Dockerfile +++ b/Dockerfile @@ -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 diff --git a/README.md b/README.md index 9105c7f..405185c 100644 --- 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. diff --git a/docker/README.md b/docker/README.md index daf5302..d2ee3ad 100644 --- a/docker/README.md +++ b/docker/README.md @@ -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 index 0000000..8f198f2 --- /dev/null +++ b/docker/docker-compose-examples/ldap/README.md @@ -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 index 0000000..266a26e --- /dev/null +++ b/docker/docker-compose-examples/ldap/bootstrap.jirafeau.ldif @@ -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 index 0000000..8cd1955 --- /dev/null +++ b/docker/docker-compose-examples/ldap/docker-compose.yml @@ -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: diff --git a/docker/docker_config.php b/docker/docker_config.php index 6a03b73..a9eae5c 100644 --- a/docker/docker_config.php +++ b/docker/docker_config.php @@ -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; diff --git a/index.php b/index.php index b6dac09..f60c37d 100644 --- 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()) { + ?> + +

' . $errorText . '

'; +} + 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
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
sizeof(upload_password) > 0'); + } + if (sizeof($cfg['upload_ip_nopassword']) > 0) { + add_error(t('INCOMPATIBLE_OPTIONS_W'), 'upload_ldap_auth=true
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; +} diff --git a/lib/locales/ar.json b/lib/locales/ar.json index 771da14..b235238 100644 --- a/lib/locales/ar.json +++ b/lib/locales/ar.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 4c7218a..833a8fb 100644 --- a/lib/locales/be.json +++ b/lib/locales/be.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 da6831a..142aa64 100644 --- a/lib/locales/bn_IN.json +++ b/lib/locales/bn_IN.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 58a6845..cca0deb 100644 --- a/lib/locales/bo.json +++ b/lib/locales/bo.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 fdcaa45..8381782 100644 --- a/lib/locales/ca.json +++ b/lib/locales/ca.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 6bca483..449e08d 100644 --- a/lib/locales/ckb.json +++ b/lib/locales/ckb.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 2803a33..258898f 100644 --- a/lib/locales/cs.json +++ b/lib/locales/cs.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 9fa7145..6bdaa94 100644 --- a/lib/locales/da.json +++ b/lib/locales/da.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 3b6d96f..464e776 100644 --- a/lib/locales/de.json +++ b/lib/locales/de.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "INSTALL_FILE_NOT_FOUND_TITLE": "", "INSTALL_FILE_NOT_FOUND_DESC": "", "2_W": "Zwei Wochen", diff --git a/lib/locales/el.json b/lib/locales/el.json index 1e8248a..63ec11d 100644 --- a/lib/locales/el.json +++ b/lib/locales/el.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 b3de22c..e06282f 100644 --- a/lib/locales/en.json +++ b/lib/locales/en.json @@ -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", diff --git a/lib/locales/es.json b/lib/locales/es.json index 6ea0619..f1c6842 100644 --- a/lib/locales/es.json +++ b/lib/locales/es.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 6bca483..449e08d 100644 --- a/lib/locales/et.json +++ b/lib/locales/et.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 5bd1613..0ce4dc4 100644 --- a/lib/locales/fi.json +++ b/lib/locales/fi.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 5c5d766..b598de7 100644 --- a/lib/locales/fr.json +++ b/lib/locales/fr.json @@ -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", diff --git a/lib/locales/he.json b/lib/locales/he.json index 21a4464..20ab4d9 100644 --- a/lib/locales/he.json +++ b/lib/locales/he.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 1c8538f..666f807 100644 --- a/lib/locales/hi.json +++ b/lib/locales/hi.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 3a9ccb1..6a8e0f1 100644 --- a/lib/locales/hr.json +++ b/lib/locales/hr.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 129c3e5..028835a 100644 --- a/lib/locales/hu.json +++ b/lib/locales/hu.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 9551163..26c0a21 100644 --- a/lib/locales/id.json +++ b/lib/locales/id.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 94a3abb..fd14222 100644 --- a/lib/locales/it.json +++ b/lib/locales/it.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 4d32118..d6223ec 100644 --- a/lib/locales/ja.json +++ b/lib/locales/ja.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 1c8538f..666f807 100644 --- a/lib/locales/ko.json +++ b/lib/locales/ko.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 846f564..5870a2b 100644 --- a/lib/locales/la.json +++ b/lib/locales/la.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 6bca483..449e08d 100644 --- a/lib/locales/mfe.json +++ b/lib/locales/mfe.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 066ecd8..1c291f6 100644 --- a/lib/locales/ms.json +++ b/lib/locales/ms.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 cacbca1..96c3add 100644 --- a/lib/locales/nb_NO.json +++ b/lib/locales/nb_NO.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 36243f9..ced6452 100644 --- a/lib/locales/nl.json +++ b/lib/locales/nl.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 eea531b..39bbe5b 100644 --- a/lib/locales/pl.json +++ b/lib/locales/pl.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 6bca483..449e08d 100644 --- a/lib/locales/ps.json +++ b/lib/locales/ps.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 782b63e..da5d92c 100644 --- a/lib/locales/pt.json +++ b/lib/locales/pt.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 08d4104..87eaa8c 100644 --- a/lib/locales/pt_BR.json +++ b/lib/locales/pt_BR.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 f3d9841..5dd8cc8 100644 --- a/lib/locales/ro.json +++ b/lib/locales/ro.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 aba71f5..308abd3 100644 --- a/lib/locales/ru.json +++ b/lib/locales/ru.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 6bca483..449e08d 100644 --- a/lib/locales/sh.json +++ b/lib/locales/sh.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 786a8bf..70cb7a5 100644 --- a/lib/locales/si.json +++ b/lib/locales/si.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "REPORTING_AN_ISSUE": "", "SIZE_DATA": "", "INCOMPATIBLE_OPTIONS_W": "", diff --git a/lib/locales/sk.json b/lib/locales/sk.json index bbf21ea..73af2fd 100644 --- a/lib/locales/sk.json +++ b/lib/locales/sk.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 aca3a2d..43eea83 100644 --- a/lib/locales/sl.json +++ b/lib/locales/sl.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 6bca483..449e08d 100644 --- a/lib/locales/sq.json +++ b/lib/locales/sq.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 2149291..6828890 100644 --- a/lib/locales/sr.json +++ b/lib/locales/sr.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 134763f..98e7549 100644 --- a/lib/locales/sv.json +++ b/lib/locales/sv.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 16ee6fc..ffedb6e 100644 --- a/lib/locales/ta.json +++ b/lib/locales/ta.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 5a55190..d9179d6 100644 --- a/lib/locales/template.json +++ b/lib/locales/template.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "INSTALL_FILE_NOT_FOUND_TITLE": "", "INSTALL_FILE_NOT_FOUND_DESC": "", "2_W": "", diff --git a/lib/locales/th.json b/lib/locales/th.json index 6bca483..449e08d 100644 --- a/lib/locales/th.json +++ b/lib/locales/th.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 6cfe69e..6da9797 100644 --- a/lib/locales/tr.json +++ b/lib/locales/tr.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 a933434..ab8218d 100644 --- a/lib/locales/uk.json +++ b/lib/locales/uk.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 cf36cc7..9955c94 100644 --- a/lib/locales/vi.json +++ b/lib/locales/vi.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 c3e89b4..93a0187 100644 --- a/lib/locales/zh.json +++ b/lib/locales/zh.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "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 b243155..d2ccc24 100644 --- a/lib/locales/zh_TW.json +++ b/lib/locales/zh_TW.json @@ -1,4 +1,6 @@ { + "PASSWORD": "", + "UP_USER": "", "INSTALL_FILE_NOT_FOUND_TITLE": "", "INSTALL_FILE_NOT_FOUND_DESC": "", "2_W": "",