diff --git a/.travis.yml b/.travis.yml index 6be6a246..9d735216 100644 --- a/.travis.yml +++ b/.travis.yml @@ -4,7 +4,7 @@ language: java before_install: - sudo add-apt-repository -y ppa:mc3man/trusty-media - sudo apt-get -qq update - - sudo apt-get -y -q install ffmpeg mediainfo tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra tesseract-ocr-nld tesseract-ocr-tur tesseract-ocr-heb tesseract-ocr-hun tesseract-ocr-fin tesseract-ocr-swe tesseract-ocr-lav tesseract-ocr-dan + - sudo apt-get -y -q install ffmpeg mediainfo tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra tesseract-ocr-nld tesseract-ocr-tur tesseract-ocr-heb tesseract-ocr-hun tesseract-ocr-fin tesseract-ocr-swe tesseract-ocr-lav tesseract-ocr-dan tesseract-ocr-nor - sudo apt-get -y -q install haveged && sudo service haveged start after_success: - | diff --git a/Dockerfile b/Dockerfile index c16338d9..37d168a4 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,7 +1,7 @@ FROM sismics/ubuntu-jetty:9.4.12-2 MAINTAINER b.gamard@sismics.com -RUN apt-get update && apt-get -y -q install ffmpeg mediainfo tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra tesseract-ocr-nld tesseract-ocr-tur tesseract-ocr-heb tesseract-ocr-hun tesseract-ocr-fin tesseract-ocr-swe tesseract-ocr-lav tesseract-ocr-dan && \ +RUN apt-get update && apt-get -y -q install ffmpeg mediainfo tesseract-ocr tesseract-ocr-fra tesseract-ocr-ita tesseract-ocr-kor tesseract-ocr-rus tesseract-ocr-ukr tesseract-ocr-spa tesseract-ocr-ara tesseract-ocr-hin tesseract-ocr-deu tesseract-ocr-pol tesseract-ocr-jpn tesseract-ocr-por tesseract-ocr-tha tesseract-ocr-jpn tesseract-ocr-chi-sim tesseract-ocr-chi-tra tesseract-ocr-nld tesseract-ocr-tur tesseract-ocr-heb tesseract-ocr-hun tesseract-ocr-fin tesseract-ocr-swe tesseract-ocr-lav tesseract-ocr-dan tesseract-ocr-nor && \ apt-get clean && rm -rf /var/lib/apt/lists/* # Remove the embedded javax.mail jar from Jetty diff --git a/README.md b/README.md index 1f3244c8..a3f26f30 100644 --- a/README.md +++ b/README.md @@ -74,6 +74,7 @@ To build external URL, the server is expecting a `DOCS_BASE_URL` environment var - General - `DOCS_BASE_URL`: The base url used by the application. Generated url's will be using this as base. - `DOCS_GLOBAL_QUOTA`: Defines the default quota applying to all users. + - `DOCS_BCRYPT_WORK`: Defines the work factor which is used for password hashing. The default is `10`. This value may be `4...31` including `4` and `31`. The specified value will be used for all new users and users changing their password. Be aware that setting this factor to high can heavily impact login and user creation performance. - Admin - `DOCS_ADMIN_EMAIL_INIT`: Defines the e-mail-address the admin user should have upon initialization. diff --git a/docs-core/src/main/java/com/sismics/docs/core/constant/Constants.java b/docs-core/src/main/java/com/sismics/docs/core/constant/Constants.java index 9c316d49..4b03e395 100644 --- a/docs-core/src/main/java/com/sismics/docs/core/constant/Constants.java +++ b/docs-core/src/main/java/com/sismics/docs/core/constant/Constants.java @@ -25,6 +25,11 @@ public class Constants { */ public static final String DEFAULT_ADMIN_EMAIL = "admin@localhost"; + /** + * Bcrypt default work factor + */ + public static final int DEFAULT_BCRYPT_WORK = 10; + /** * Guest user ID. */ @@ -38,7 +43,7 @@ public class Constants { /** * Supported document languages. */ - public static final List SUPPORTED_LANGUAGES = Lists.newArrayList("eng", "fra", "ita", "deu", "spa", "por", "pol", "rus", "ukr", "ara", "hin", "chi_sim", "chi_tra", "jpn", "tha", "kor", "nld", "tur", "heb", "hun", "fin", "swe", "lav", "dan"); + public static final List SUPPORTED_LANGUAGES = Lists.newArrayList("eng", "fra", "ita", "deu", "spa", "por", "pol", "rus", "ukr", "ara", "hin", "chi_sim", "chi_tra", "jpn", "tha", "kor", "nld", "tur", "heb", "hun", "fin", "swe", "lav", "dan", "nor"); /** * Base URL environment variable. @@ -73,6 +78,11 @@ public class Constants { */ public static final String ADMIN_EMAIL_INIT_ENV = "DOCS_ADMIN_EMAIL_INIT"; + /** + * Work factor to be used by Bcrypt + */ + public static final String BCRYPT_WORK_ENV = "DOCS_BCRYPT_WORK"; + /** * Expiration time of the password recovery in hours. */ diff --git a/docs-core/src/main/java/com/sismics/docs/core/dao/UserDao.java b/docs-core/src/main/java/com/sismics/docs/core/dao/UserDao.java index 6583a532..074a6c7c 100644 --- a/docs-core/src/main/java/com/sismics/docs/core/dao/UserDao.java +++ b/docs-core/src/main/java/com/sismics/docs/core/dao/UserDao.java @@ -1,8 +1,13 @@ package com.sismics.docs.core.dao; -import at.favre.lib.crypto.bcrypt.BCrypt; import com.google.common.base.Joiner; +import at.favre.lib.crypto.bcrypt.BCrypt; +import org.joda.time.DateTime; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + import com.sismics.docs.core.constant.AuditLogType; +import com.sismics.docs.core.constant.Constants; import com.sismics.docs.core.dao.criteria.UserCriteria; import com.sismics.docs.core.dao.dto.UserDto; import com.sismics.docs.core.model.jpa.User; @@ -12,7 +17,6 @@ import com.sismics.docs.core.util.jpa.QueryParam; import com.sismics.docs.core.util.jpa.QueryUtil; import com.sismics.docs.core.util.jpa.SortCriteria; import com.sismics.util.context.ThreadLocalContext; -import org.joda.time.DateTime; import javax.persistence.EntityManager; import javax.persistence.NoResultException; @@ -26,6 +30,11 @@ import java.util.*; * @author jtremeaux */ public class UserDao { + /** + * Logger. + */ + private static final Logger log = LoggerFactory.getLogger(UserDao.class); + /** * Authenticates an user. * @@ -278,7 +287,21 @@ public class UserDao { * @return Hashed password */ private String hashPassword(String password) { - return BCrypt.withDefaults().hashToString(10, password.toCharArray()); + int bcryptWork = Constants.DEFAULT_BCRYPT_WORK; + String envBcryptWork = System.getenv(Constants.BCRYPT_WORK_ENV); + if (envBcryptWork != null) { + try { + int envBcryptWorkInt = Integer.parseInt(envBcryptWork); + if (envBcryptWorkInt >= 4 && envBcryptWorkInt <= 31) { + bcryptWork = envBcryptWorkInt; + } else { + log.warn(Constants.BCRYPT_WORK_ENV + " needs to be in range 4...31. Falling back to " + Constants.DEFAULT_BCRYPT_WORK + "."); + } + } catch (NumberFormatException e) { + log.warn(Constants.BCRYPT_WORK_ENV + " needs to be a number in range 4...31. Falling back to " + Constants.DEFAULT_BCRYPT_WORK + "."); + } + } + return BCrypt.withDefaults().hashToString(bcryptWork, password.toCharArray()); } /** diff --git a/docs-importer/Dockerfile b/docs-importer/Dockerfile index 450fb2f5..d83d981e 100644 --- a/docs-importer/Dockerfile +++ b/docs-importer/Dockerfile @@ -5,7 +5,7 @@ RUN npm install && npm install -g pkg RUN pkg -t node14-alpine-x64 . FROM alpine -ENV TEEDY_TAG= TEEDY_ADDTAGS=false TEEDY_LANG=eng TEEDY_URL='http://localhost:8080' TEEDY_USERNAME=username TEEDY_PASSWORD=password TEEDY_COPYFOLDER= TEEDY_FILEFILTER= +ENV TEEDY_TAG= TEEDY_ADDTAGS=false TEEDY_LANG=eng TEEDY_URL='http://localhost:8080' TEEDY_USERNAME=username TEEDY_PASSWORD=password TEEDY_COPYFOLDER= TEEDY_FILEFILTER=* RUN apk add --no-cache \ libc6-compat \ libstdc++ diff --git a/docs-web/src/main/webapp/src/app/docs/app.js b/docs-web/src/main/webapp/src/app/docs/app.js index 11999661..06d53f5c 100644 --- a/docs-web/src/main/webapp/src/app/docs/app.js +++ b/docs-web/src/main/webapp/src/app/docs/app.js @@ -540,7 +540,8 @@ angular.module('docs', { key: 'fin', label: 'Suomi' }, { key: 'swe', label: 'Svenska' }, { key: 'lav', label: 'Latviešu' }, - { key: 'dan', label: 'Dansk' } + { key: 'dan', label: 'Dansk' }, + { key: 'nor', label: 'Norsk' } ]; }) /**