diff --git a/.github/dependabot.yml b/.github/dependabot.yml index adf9dcf0..6bd86d3e 100644 --- a/.github/dependabot.yml +++ b/.github/dependabot.yml @@ -9,6 +9,8 @@ updates: directory: "/" # Location of package manifests schedule: interval: "weekly" + open-pull-requests-limit: 10 + rebase-strategy: "auto" - package-ecosystem: "docker" directory: "/" # Location of Dockerfile schedule: diff --git a/.github/labeler-config.yml b/.github/labeler-config.yml index d96a2a19..a6cce904 100644 --- a/.github/labeler-config.yml +++ b/.github/labeler-config.yml @@ -47,3 +47,7 @@ Test: - changed-files: - any-glob-to-any-file: 'cucumber/**/*' - any-glob-to-any-file: 'src/test**/*' + +Github: + - changed-files: + - any-glob-to-any-file: '.github/**/*' diff --git a/.github/workflows/auto-labeler.yml b/.github/workflows/auto-labeler.yml index 6ade1de4..30bf857f 100644 --- a/.github/workflows/auto-labeler.yml +++ b/.github/workflows/auto-labeler.yml @@ -11,7 +11,9 @@ jobs: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - - uses: actions/labeler@v5 + + - name: Apply Labels + uses: actions/labeler@v5 with: repo-token: ${{ secrets.GITHUB_TOKEN }} configuration-path: .github/labeler-config.yml diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index de3b3569..d11e331b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -1,4 +1,4 @@ -name: "Build repo" +name: Build repo on: push: @@ -17,20 +17,72 @@ jobs: strategy: fail-fast: false + matrix: + jdk-version: [17, 21] steps: - name: Checkout repository uses: actions/checkout@v4 - - name: Set up JDK 17 + - name: Set up JDK ${{ matrix.jdk-version }} uses: actions/setup-java@v4 with: - java-version: "17" + java-version: ${{ matrix.jdk-version }} distribution: "temurin" - - uses: gradle/actions/setup-gradle@v3 + - name: Set up Gradle + uses: gradle/actions/setup-gradle@v3 with: gradle-version: 8.7 - name: Build with Gradle run: ./gradlew build --no-build-cache + + docker-compose-tests: + # if: github.event_name == 'push' && github.ref == 'refs/heads/main' || + # (github.event_name == 'pull_request' && + # contains(github.event.pull_request.labels.*.name, 'licenses') == false && + # ( + # contains(github.event.pull_request.labels.*.name, 'Front End') || + # contains(github.event.pull_request.labels.*.name, 'Java') || + # contains(github.event.pull_request.labels.*.name, 'Back End') || + # contains(github.event.pull_request.labels.*.name, 'Security') || + # contains(github.event.pull_request.labels.*.name, 'API') || + # contains(github.event.pull_request.labels.*.name, 'Docker') || + # contains(github.event.pull_request.labels.*.name, 'Test') + # ) + # ) + + runs-on: ubuntu-latest + + steps: + - name: Checkout Repository + uses: actions/checkout@v4 + + - name: Set up Java 17 + uses: actions/setup-java@v4 + with: + java-version: "17" + distribution: "adopt" + + - name: Set up Docker Buildx + uses: docker/setup-buildx-action@v3 + + - name: Install Docker Compose + run: | + sudo curl -SL "https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose + sudo chmod +x /usr/local/bin/docker-compose + + - name: Set up Python + uses: actions/setup-python@v4 + with: + python-version: "3.7" + + - name: Pip requirements + run: | + pip install -r ./cucumber/requirements.txt + + - name: Run Docker Compose Tests + run: | + chmod +x ./test.sh + ./test.sh diff --git a/.github/workflows/licenses-update.yml b/.github/workflows/licenses-update.yml index a3996bc6..8c39ccaa 100644 --- a/.github/workflows/licenses-update.yml +++ b/.github/workflows/licenses-update.yml @@ -45,6 +45,7 @@ jobs: git diff --staged --quiet || echo "CHANGES_DETECTED=true" >> $GITHUB_ENV - name: Create Pull Request + id: cpr if: env.CHANGES_DETECTED == 'true' uses: peter-evans/create-pull-request@v6 with: @@ -58,5 +59,20 @@ jobs: body: | Auto-generated by [create-pull-request][1] [1]: https://github.com/peter-evans/create-pull-request + labels: licenses draft: false delete-branch: true + + - name: Auto approve + if: steps.cpr.outputs.pull-request-operation == 'created' + run: gh pr review --approve "${{ steps.cpr.outputs.pull-request-number }}" + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + + - name: Enable auto-merge + if: steps.cpr.outputs.pull-request-operation == 'created' + uses: peter-evans/enable-pull-request-automerge@v3 + with: + token: ${{ secrets.GITHUB_TOKEN }} + pull-request-number: ${{ steps.cpr.outputs.pull-request-number }} + merge-method: squash # Choose the merge method: merge, squash, or rebase diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml deleted file mode 100644 index c4a4ff31..00000000 --- a/.github/workflows/test.yml +++ /dev/null @@ -1,47 +0,0 @@ -name: Docker Compose Tests - -on: - pull_request: - paths: - - "src/**" - - "**.gradle" - - "!src/main/java/resources/messages*" - - "exampleYmlFiles/**" - - "Dockerfile" - - "Dockerfile**" - -jobs: - test: - runs-on: ubuntu-latest - - steps: - - name: Checkout Repository - uses: actions/checkout@v4 - - - name: Set up Java 17 - uses: actions/setup-java@v4 - with: - java-version: "17" - distribution: "adopt" - - - name: Set up Docker Buildx - uses: docker/setup-buildx-action@v3 - - - name: Install Docker Compose - run: | - sudo curl -SL "https://github.com/docker/compose/releases/download/v2.29.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose - sudo chmod +x /usr/local/bin/docker-compose - - - name: Set up Python - uses: actions/setup-python@v4 - with: - python-version: "3.7" - - - name: Pip requirements - run: | - pip install -r ./cucumber/requirements.txt - - - name: Run Docker Compose Tests - run: | - chmod +x ./test.sh - ./test.sh diff --git a/README.md b/README.md index f09b64c8..5b590cd4 100644 --- a/README.md +++ b/README.md @@ -170,41 +170,41 @@ Stirling PDF currently supports 38! | Language | Progress | | ------------------------------------------- | -------------------------------------- | | Arabic (العربية) (ar_AR) | ![45%](https://geps.dev/progress/45) | -| Basque (Euskara) (eu_ES) | ![62%](https://geps.dev/progress/62) | +| Basque (Euskara) (eu_ES) | ![61%](https://geps.dev/progress/61) | | Bulgarian (Български) (bg_BG) | ![94%](https://geps.dev/progress/94) | | Catalan (Català) (ca_CA) | ![48%](https://geps.dev/progress/48) | -| Croatian (Hrvatski) (hr_HR) | ![95%](https://geps.dev/progress/95) | -| Czech (Česky) (cs_CZ) | ![90%](https://geps.dev/progress/90) | -| Danish (Dansk) (da_DK) | ![10%](https://geps.dev/progress/10) | -| Dutch (Nederlands) (nl_NL) | ![96%](https://geps.dev/progress/96) | +| Croatian (Hrvatski) (hr_HR) | ![94%](https://geps.dev/progress/94) | +| Czech (Česky) (cs_CZ) | ![89%](https://geps.dev/progress/89) | +| Danish (Dansk) (da_DK) | ![9%](https://geps.dev/progress/9) | +| Dutch (Nederlands) (nl_NL) | ![95%](https://geps.dev/progress/95) | | English (English) (en_GB) | ![100%](https://geps.dev/progress/100) | | English (US) (en_US) | ![100%](https://geps.dev/progress/100) | | French (Français) (fr_FR) | ![93%](https://geps.dev/progress/93) | | German (Deutsch) (de_DE) | ![99%](https://geps.dev/progress/99) | -| Greek (Ελληνικά) (el_GR) | ![82%](https://geps.dev/progress/82) | -| Hindi (हिंदी) (hi_IN) | ![77%](https://geps.dev/progress/77) | -| Hungarian (Magyar) (hu_HU) | ![76%](https://geps.dev/progress/76) | +| Greek (Ελληνικά) (el_GR) | ![81%](https://geps.dev/progress/81) | +| Hindi (हिंदी) (hi_IN) | ![76%](https://geps.dev/progress/76) | +| Hungarian (Magyar) (hu_HU) | ![75%](https://geps.dev/progress/75) | | Indonesia (Bahasa Indonesia) (id_ID) | ![76%](https://geps.dev/progress/76) | -| Irish (Gaeilge) (ga_IE) | ![99%](https://geps.dev/progress/99) | +| Irish (Gaeilge) (ga_IE) | ![98%](https://geps.dev/progress/98) | | Italian (Italiano) (it_IT) | ![99%](https://geps.dev/progress/99) | -| Japanese (日本語) (ja_JP) | ![90%](https://geps.dev/progress/90) | +| Japanese (日本語) (ja_JP) | ![92%](https://geps.dev/progress/92) | | Korean (한국어) (ko_KR) | ![84%](https://geps.dev/progress/84) | -| Norwegian (Norsk) (no_NB) | ![98%](https://geps.dev/progress/98) | -| Polish (Polski) (pl_PL) | ![93%](https://geps.dev/progress/93) | +| Norwegian (Norsk) (no_NB) | ![97%](https://geps.dev/progress/97) | +| Polish (Polski) (pl_PL) | ![92%](https://geps.dev/progress/92) | | Portuguese (Português) (pt_PT) | ![78%](https://geps.dev/progress/78) | -| Portuguese Brazilian (Português) (pt_BR) | ![59%](https://geps.dev/progress/59) | -| Romanian (Română) (ro_RO) | ![39%](https://geps.dev/progress/39) | -| Russian (Русский) (ru_RU) | ![84%](https://geps.dev/progress/84) | +| Portuguese Brazilian (Português) (pt_BR) | ![85%](https://geps.dev/progress/85) | +| Romanian (Română) (ro_RO) | ![38%](https://geps.dev/progress/38) | +| Russian (Русский) (ru_RU) | ![83%](https://geps.dev/progress/83) | | Sebian Latin alphabet (Srpski) (sr_LATN_RS) | ![78%](https://geps.dev/progress/78) | -| Simplified Chinese (简体中文) (zh_CN) | ![99%](https://geps.dev/progress/99) | -| Slovakian (Slovensky) (sk_SK) | ![92%](https://geps.dev/progress/92) | -| Spanish (Español) (es_ES) | ![98%](https://geps.dev/progress/98) | +| Simplified Chinese (简体中文) (zh_CN) | ![98%](https://geps.dev/progress/98) | +| Slovakian (Slovensky) (sk_SK) | ![91%](https://geps.dev/progress/91) | +| Spanish (Español) (es_ES) | ![97%](https://geps.dev/progress/97) | | Swedish (Svenska) (sv_SE) | ![39%](https://geps.dev/progress/39) | | Thai (ไทย) (th_TH) | ![99%](https://geps.dev/progress/99) | -| Traditional Chinese (繁體中文) (zh_TW) | ![98%](https://geps.dev/progress/98) | -| Turkish (Türkçe) (tr_TR) | ![99%](https://geps.dev/progress/99) | -| Ukrainian (Українська) (uk_UA) | ![90%](https://geps.dev/progress/90) | -| Vietnamese (Tiếng Việt) (vi_VN) | ![99%](https://geps.dev/progress/99) | +| Traditional Chinese (繁體中文) (zh_TW) | ![97%](https://geps.dev/progress/97) | +| Turkish (Türkçe) (tr_TR) | ![98%](https://geps.dev/progress/98) | +| Ukrainian (Українська) (uk_UA) | ![89%](https://geps.dev/progress/89) | +| Vietnamese (Tiếng Việt) (vi_VN) | ![98%](https://geps.dev/progress/98) | ## Contributing (creating issues, translations, fixing bugs, etc.) @@ -266,6 +266,7 @@ security: clientId: '' # Client ID from your provider clientSecret: '' # Client Secret from your provider autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users + blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin useAsUsername: email # Default is 'email'; custom fields can be used as the username scopes: openid, profile, email # Specify the scopes for which the application will request permissions provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' diff --git a/build.gradle b/build.gradle index 12780703..fb0015b8 100644 --- a/build.gradle +++ b/build.gradle @@ -4,19 +4,24 @@ plugins { id "io.spring.dependency-management" version "1.1.6" id "org.springdoc.openapi-gradle-plugin" version "1.8.0" id "io.swagger.swaggerhub" version "1.3.2" - id "edu.sc.seis.launch4j" version "3.0.5" + id "edu.sc.seis.launch4j" version "3.0.6" id "com.diffplug.spotless" version "6.25.0" - id "com.github.jk1.dependency-license-report" version "2.8" + id "com.github.jk1.dependency-license-report" version "2.9" } import com.github.jk1.license.render.* ext { springBootVersion = "3.3.2" + pdfboxVersion = "3.0.3" + logbackVersion = "1.5.7" + imageioVersion = "3.11.0" + lombokVersion = "1.18.34" + bouncycastleVersion = "1.78.1" } group = "stirling.software" -version = "0.27.0" +version = "0.28.0" java { // 17 is lowest but we support and recommend 21 @@ -45,6 +50,7 @@ sourceSets { exclude "stirling/software/SPDF/model/AttemptCounter.java" exclude "stirling/software/SPDF/model/Authority.java" exclude "stirling/software/SPDF/model/PersistentLogin.java" + exclude "stirling/software/SPDF/model/SessionEntity.java" exclude "stirling/software/SPDF/model/User.java" exclude "stirling/software/SPDF/repository/**" } @@ -100,11 +106,11 @@ tasks.wrapper { dependencies { //security updates - implementation "ch.qos.logback:logback-classic:1.5.6" - implementation "ch.qos.logback:logback-core:1.5.6" - implementation "org.springframework:spring-webmvc:6.1.9" + implementation "ch.qos.logback:logback-classic:$logbackVersion" + implementation "ch.qos.logback:logback-core:$logbackVersion" + implementation "org.springframework:spring-webmvc:6.1.12" - implementation("io.github.pixee:java-security-toolkit:1.1.3") + implementation("io.github.pixee:java-security-toolkit:1.2.0") // implementation "org.yaml:snakeyaml:2.2" implementation 'com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4' @@ -134,22 +140,22 @@ dependencies { implementation "org.apache.xmlgraphics:batik-all:1.17" // TwelveMonkeys - implementation "com.twelvemonkeys.imageio:imageio-batik:3.10.1" - implementation "com.twelvemonkeys.imageio:imageio-bmp:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-hdr:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-icns:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-iff:3.10.1" - implementation "com.twelvemonkeys.imageio:imageio-jpeg:3.11.0" - // implementation "com.twelvemonkeys.imageio:imageio-pcx:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-pict:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-pnm:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-psd:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-sgi:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-tga:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-thumbsdb:3.10.1" - implementation "com.twelvemonkeys.imageio:imageio-tiff:3.10.1" - implementation "com.twelvemonkeys.imageio:imageio-webp:3.10.1" - // implementation "com.twelvemonkeys.imageio:imageio-xwd:3.10.1" + implementation "com.twelvemonkeys.imageio:imageio-batik:$imageioVersion" + implementation "com.twelvemonkeys.imageio:imageio-bmp:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-hdr:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-icns:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-iff:$imageioVersion" + implementation "com.twelvemonkeys.imageio:imageio-jpeg:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-pcx:$imageioVersion@ + // implementation "com.twelvemonkeys.imageio:imageio-pict:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-pnm:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-psd:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-sgi:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-tga:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-thumbsdb:$imageioVersion" + implementation "com.twelvemonkeys.imageio:imageio-tiff:$imageioVersion" + implementation "com.twelvemonkeys.imageio:imageio-webp:$imageioVersion" + // implementation "com.twelvemonkeys.imageio:imageio-xwd:$imageioVersion" implementation "commons-io:commons-io:2.16.1" implementation "org.springdoc:springdoc-openapi-starter-webmvc-ui:2.2.0" @@ -161,31 +167,34 @@ dependencies { exclude group: "commons-logging", module: "commons-logging" } - implementation ("org.apache.pdfbox:pdfbox:3.0.2") { + implementation ("org.apache.pdfbox:pdfbox:$pdfboxVersion") { exclude group: "commons-logging", module: "commons-logging" } - implementation ("org.apache.pdfbox:xmpbox:3.0.2") { + implementation ("org.apache.pdfbox:xmpbox:$pdfboxVersion") { exclude group: "commons-logging", module: "commons-logging" } + + implementation 'org.apache.pdfbox:jbig2-imageio:3.0.4' + + implementation "com.github.Carleslc.Simple-YAML:Simple-Yaml:1.8.4" - implementation "org.bouncycastle:bcprov-jdk18on:1.78.1" - implementation "org.bouncycastle:bcpkix-jdk18on:1.78.1" + implementation "org.bouncycastle:bcprov-jdk18on:$bouncycastleVersion" + implementation "org.bouncycastle:bcpkix-jdk18on:$bouncycastleVersion" implementation "org.springframework.boot:spring-boot-starter-actuator:$springBootVersion" - implementation "io.micrometer:micrometer-core:1.13.0" + implementation "io.micrometer:micrometer-core:1.13.3" implementation group: "com.google.zxing", name: "core", version: "3.5.3" // https://mvnrepository.com/artifact/org.commonmark/commonmark implementation "org.commonmark:commonmark:0.22.0" implementation "org.commonmark:commonmark-ext-gfm-tables:0.22.0" // https://mvnrepository.com/artifact/com.bucket4j/bucket4j_jdk17 - implementation "com.bucket4j:bucket4j_jdk17-core:8.12.1" - - implementation "com.fathzer:javaluator:3.0.4" + implementation "com.bucket4j:bucket4j_jdk17-core:8.13.1" + implementation "com.fathzer:javaluator:3.0.4" developmentOnly("org.springframework.boot:spring-boot-devtools:$springBootVersion") - compileOnly "org.projectlombok:lombok:1.18.32" - annotationProcessor "org.projectlombok:lombok:1.18.32" + compileOnly "org.projectlombok:lombok:$lombokVersion" + annotationProcessor "org.projectlombok:lombok:$lombokVersion" testImplementation 'org.mockito:mockito-inline:5.2.0' } diff --git a/chart/stirling-pdf/Chart.yaml b/chart/stirling-pdf/Chart.yaml index 9b633ddb..a691eafd 100644 --- a/chart/stirling-pdf/Chart.yaml +++ b/chart/stirling-pdf/Chart.yaml @@ -1,5 +1,5 @@ apiVersion: v2 -appVersion: 0.26.2 +appVersion: 0.28.0 description: locally hosted web application that allows you to perform various operations on PDF files home: https://github.com/Stirling-Tools/Stirling-PDF diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java index 6193f216..23b6dc0d 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationFailureHandler.java @@ -3,9 +3,8 @@ package stirling.software.SPDF.config.security; import java.io.IOException; import java.util.Optional; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; import org.springframework.security.authentication.InternalAuthenticationServiceException; import org.springframework.security.authentication.LockedException; import org.springframework.security.core.AuthenticationException; @@ -15,17 +14,16 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.User; +@Slf4j public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { private LoginAttemptService loginAttemptService; private UserService userService; - private static final Logger logger = - LoggerFactory.getLogger(CustomAuthenticationFailureHandler.class); - public CustomAuthenticationFailureHandler( final LoginAttemptService loginAttemptService, UserService userService) { this.loginAttemptService = loginAttemptService; @@ -39,14 +37,17 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF AuthenticationException exception) throws IOException, ServletException { + if (exception instanceof DisabledException) { + log.error("User is deactivated: ", exception); + getRedirectStrategy().sendRedirect(request, response, "/logout?userIsDisabled=true"); + return; + } + String ip = request.getRemoteAddr(); - logger.error("Failed login attempt from IP: {}", ip); + log.error("Failed login attempt from IP: {}", ip); - String contextPath = request.getContextPath(); - - if (exception.getClass().isAssignableFrom(InternalAuthenticationServiceException.class) - || "Password must not be null".equalsIgnoreCase(exception.getMessage())) { - response.sendRedirect(contextPath + "/login?error=oauth2AuthenticationError"); + if (exception instanceof LockedException) { + getRedirectStrategy().sendRedirect(request, response, "/login?error=locked"); return; } @@ -54,20 +55,25 @@ public class CustomAuthenticationFailureHandler extends SimpleUrlAuthenticationF Optional optUser = userService.findByUsernameIgnoreCase(username); if (username != null && optUser.isPresent() && !isDemoUser(optUser)) { - logger.info( + log.info( "Remaining attempts for user {}: {}", - optUser.get().getUsername(), + username, loginAttemptService.getRemainingAttempts(username)); loginAttemptService.loginFailed(username); - if (loginAttemptService.isBlocked(username) - || exception.getClass().isAssignableFrom(LockedException.class)) { - response.sendRedirect(contextPath + "/login?error=locked"); + if (loginAttemptService.isBlocked(username) || exception instanceof LockedException) { + getRedirectStrategy().sendRedirect(request, response, "/login?error=locked"); return; } } - if (exception.getClass().isAssignableFrom(BadCredentialsException.class) - || exception.getClass().isAssignableFrom(UsernameNotFoundException.class)) { - response.sendRedirect(contextPath + "/login?error=badcredentials"); + if (exception instanceof BadCredentialsException + || exception instanceof UsernameNotFoundException) { + getRedirectStrategy().sendRedirect(request, response, "/login?error=badcredentials"); + return; + } + if (exception instanceof InternalAuthenticationServiceException + || "Password must not be null".equalsIgnoreCase(exception.getMessage())) { + getRedirectStrategy() + .sendRedirect(request, response, "/login?error=oauth2AuthenticationError"); return; } diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java index 73280d89..61d5a3ce 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomAuthenticationSuccessHandler.java @@ -10,15 +10,20 @@ import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.utils.RequestUriUtils; +@Slf4j public class CustomAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler { private LoginAttemptService loginAttemptService; + private UserService userService; - public CustomAuthenticationSuccessHandler(LoginAttemptService loginAttemptService) { + public CustomAuthenticationSuccessHandler( + LoginAttemptService loginAttemptService, UserService userService) { this.loginAttemptService = loginAttemptService; + this.userService = userService; } @Override @@ -27,6 +32,10 @@ public class CustomAuthenticationSuccessHandler throws ServletException, IOException { String userName = request.getParameter("username"); + if (userService.isUserDisabled(userName)) { + getRedirectStrategy().sendRedirect(request, response, "/logout?userIsDisabled=true"); + return; + } loginAttemptService.loginSucceeded(userName); // Get the saved request diff --git a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java index 71a17f07..d62956e1 100644 --- a/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/CustomLogoutSuccessHandler.java @@ -2,32 +2,26 @@ package stirling.software.SPDF.config.security; import java.io.IOException; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.core.Authentication; -import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpSession; public class CustomLogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler { - @Autowired SessionRegistry sessionRegistry; - @Override public void onLogoutSuccess( HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws IOException, ServletException { - HttpSession session = request.getSession(false); - if (session != null) { - String sessionId = session.getId(); - sessionRegistry.removeSessionInformation(sessionId); - session.invalidate(); - logger.debug("Session invalidated: " + sessionId); + + if (request.getParameter("userIsDisabled") != null) { + getRedirectStrategy() + .sendRedirect(request, response, "/login?erroroauth=userIsDisabled"); + return; } - response.sendRedirect(request.getContextPath() + "/login?logout=true"); + getRedirectStrategy().sendRedirect(request, response, "/login?logout=true"); } } diff --git a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java index da3e216e..6141be29 100644 --- a/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java +++ b/src/main/java/stirling/software/SPDF/config/security/LoginAttemptService.java @@ -3,8 +3,6 @@ package stirling.software.SPDF.config.security; import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.TimeUnit; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -17,8 +15,6 @@ public class LoginAttemptService { @Autowired ApplicationProperties applicationProperties; - private static final Logger logger = LoggerFactory.getLogger(LoginAttemptService.class); - private int MAX_ATTEMPT; private long ATTEMPT_INCREMENT_TIME; private ConcurrentHashMap attemptsCache; diff --git a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java index 4ecadda6..1e0ff786 100644 --- a/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java +++ b/src/main/java/stirling/software/SPDF/config/security/SecurityConfiguration.java @@ -18,8 +18,6 @@ import org.springframework.security.config.http.SessionCreationPolicy; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; import org.springframework.security.core.authority.mapping.GrantedAuthoritiesMapper; -import org.springframework.security.core.session.SessionRegistry; -import org.springframework.security.core.session.SessionRegistryImpl; import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.security.oauth2.client.registration.ClientRegistration; @@ -37,6 +35,7 @@ import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationF import stirling.software.SPDF.config.security.oauth2.CustomOAuth2AuthenticationSuccessHandler; import stirling.software.SPDF.config.security.oauth2.CustomOAuth2LogoutSuccessHandler; import stirling.software.SPDF.config.security.oauth2.CustomOAuth2UserService; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client; @@ -47,7 +46,7 @@ import stirling.software.SPDF.model.provider.KeycloakProvider; import stirling.software.SPDF.repository.JPATokenRepositoryImpl; @Configuration -@EnableWebSecurity() +@EnableWebSecurity @EnableMethodSecurity public class SecurityConfiguration { @@ -73,11 +72,7 @@ public class SecurityConfiguration { @Autowired private LoginAttemptService loginAttemptService; @Autowired private FirstLoginFilter firstLoginFilter; - - @Bean - public SessionRegistry sessionRegistry() { - return new SessionRegistryImpl(); - } + @Autowired private SessionPersistentRegistry sessionRegistry; @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { @@ -94,7 +89,7 @@ public class SecurityConfiguration { .sessionCreationPolicy(SessionCreationPolicy.IF_REQUIRED) .maximumSessions(10) .maxSessionsPreventsLogin(false) - .sessionRegistry(sessionRegistry()) + .sessionRegistry(sessionRegistry) .expiredUrl("/login?logout=true")); http.formLogin( @@ -103,7 +98,7 @@ public class SecurityConfiguration { .loginPage("/login") .successHandler( new CustomAuthenticationSuccessHandler( - loginAttemptService)) + loginAttemptService, userService)) .defaultSuccessUrl("/") .failureHandler( new CustomAuthenticationFailureHandler( @@ -160,7 +155,11 @@ public class SecurityConfiguration { // Handle OAUTH2 Logins if (applicationProperties.getSecurity().getOAUTH2() != null - && applicationProperties.getSecurity().getOAUTH2().getEnabled()) { + && applicationProperties.getSecurity().getOAUTH2().getEnabled() + && !applicationProperties + .getSecurity() + .getLoginMethod() + .equalsIgnoreCase("normal")) { http.oauth2Login( oauth2 -> @@ -191,10 +190,8 @@ public class SecurityConfiguration { .logout( logout -> logout.logoutSuccessHandler( - new CustomOAuth2LogoutSuccessHandler( - this.applicationProperties, - sessionRegistry())) - .invalidateHttpSession(true)); + new CustomOAuth2LogoutSuccessHandler( + applicationProperties))); } } else { http.csrf(csrf -> csrf.disable()) diff --git a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java index 8e0ae052..23269477 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserAuthenticationFilter.java @@ -1,6 +1,7 @@ package stirling.software.SPDF.config.security; import java.io.IOException; +import java.util.List; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; @@ -9,8 +10,9 @@ import org.springframework.http.HttpStatus; import org.springframework.security.core.Authentication; import org.springframework.security.core.AuthenticationException; import org.springframework.security.core.context.SecurityContextHolder; +import org.springframework.security.core.session.SessionInformation; import org.springframework.security.core.userdetails.UserDetails; -import org.springframework.security.core.userdetails.UserDetailsService; +import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Component; import org.springframework.web.filter.OncePerRequestFilter; @@ -18,15 +20,16 @@ import jakarta.servlet.FilterChain; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.ApiKeyAuthenticationToken; @Component public class UserAuthenticationFilter extends OncePerRequestFilter { - @Autowired private UserDetailsService userDetailsService; - @Autowired @Lazy private UserService userService; + @Autowired private SessionPersistentRegistry sessionPersistentRegistry; + @Autowired @Qualifier("loginEnabled") public boolean loginEnabledValue; @@ -87,6 +90,43 @@ public class UserAuthenticationFilter extends OncePerRequestFilter { } } + // Check if the authenticated user is disabled and invalidate their session if so + if (authentication != null && authentication.isAuthenticated()) { + Object principal = authentication.getPrincipal(); + String username = null; + if (principal instanceof UserDetails) { + username = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + username = ((OAuth2User) principal).getName(); + } else if (principal instanceof String) { + username = (String) principal; + } + + List sessionsInformations = + sessionPersistentRegistry.getAllSessions(principal, false); + + if (username != null) { + boolean isUserExists = userService.usernameExistsIgnoreCase(username); + boolean isUserDisabled = userService.isUserDisabled(username); + + if (!isUserExists || isUserDisabled) { + for (SessionInformation sessionsInformation : sessionsInformations) { + sessionsInformation.expireNow(); + sessionPersistentRegistry.expireSession(sessionsInformation.getSessionId()); + } + } + + if (!isUserExists) { + response.sendRedirect(request.getContextPath() + "/logout?badcredentials=true"); + return; + } + if (isUserDisabled) { + response.sendRedirect(request.getContextPath() + "/logout?userIsDisabled=true"); + return; + } + } + } + filterChain.doFilter(request, response); } diff --git a/src/main/java/stirling/software/SPDF/config/security/UserService.java b/src/main/java/stirling/software/SPDF/config/security/UserService.java index f6cdfb91..d20aba8b 100644 --- a/src/main/java/stirling/software/SPDF/config/security/UserService.java +++ b/src/main/java/stirling/software/SPDF/config/security/UserService.java @@ -15,12 +15,15 @@ import org.springframework.security.authentication.UsernamePasswordAuthenticatio import org.springframework.security.core.Authentication; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.authority.SimpleGrantedAuthority; +import org.springframework.security.core.session.SessionInformation; import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.core.userdetails.UsernameNotFoundException; import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.stereotype.Service; import stirling.software.SPDF.config.DatabaseBackupInterface; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.controller.api.pipeline.UserServiceInterface; import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.Authority; @@ -40,6 +43,8 @@ public class UserService implements UserServiceInterface { @Autowired private MessageSource messageSource; + @Autowired private SessionPersistentRegistry sessionRegistry; + @Autowired DatabaseBackupInterface databaseBackupHelper; // Handle OAUTH2 login and user auto creation. @@ -48,7 +53,7 @@ public class UserService implements UserServiceInterface { if (!isUsernameValid(username)) { return false; } - Optional existingUser = userRepository.findByUsernameIgnoreCase(username); + Optional existingUser = findByUsernameIgnoreCase(username); if (existingUser.isPresent()) { return true; } @@ -90,8 +95,7 @@ public class UserService implements UserServiceInterface { public User addApiKeyToUser(String username) { User user = - userRepository - .findByUsernameIgnoreCase(username) + findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); user.setApiKey(generateApiKey()); @@ -104,8 +108,7 @@ public class UserService implements UserServiceInterface { public String getApiKeyForUser(String username) { User user = - userRepository - .findByUsernameIgnoreCase(username) + findByUsernameIgnoreCase(username) .orElseThrow(() -> new UsernameNotFoundException("User not found")); return user.getApiKey(); } @@ -131,12 +134,17 @@ public class UserService implements UserServiceInterface { } public boolean validateApiKeyForUser(String username, String apiKey) { - Optional userOpt = userRepository.findByUsernameIgnoreCase(username); + Optional userOpt = findByUsernameIgnoreCase(username); return userOpt.isPresent() && apiKey.equals(userOpt.get().getApiKey()); } public void saveUser(String username, AuthenticationType authenticationType) throws IllegalArgumentException, IOException { + saveUser(username, authenticationType, Role.USER.getRoleId()); + } + + public void saveUser(String username, AuthenticationType authenticationType, String role) + throws IllegalArgumentException, IOException { if (!isUsernameValid(username)) { throw new IllegalArgumentException(getInvalidUsernameMessage()); } @@ -144,7 +152,7 @@ public class UserService implements UserServiceInterface { user.setUsername(username); user.setEnabled(true); user.setFirstLogin(false); - user.addAuthority(new Authority(Role.USER.getRoleId(), user)); + user.addAuthority(new Authority(role, user)); user.setAuthenticationType(authenticationType); userRepository.save(user); databaseBackupHelper.exportDatabase(); @@ -186,7 +194,7 @@ public class UserService implements UserServiceInterface { } public void deleteUser(String username) { - Optional userOpt = userRepository.findByUsernameIgnoreCase(username); + Optional userOpt = findByUsernameIgnoreCase(username); if (userOpt.isPresent()) { for (Authority authority : userOpt.get().getAuthorities()) { if (authority.getAuthority().equals(Role.INTERNAL_API_USER.getRoleId())) { @@ -195,21 +203,20 @@ public class UserService implements UserServiceInterface { } userRepository.delete(userOpt.get()); } + invalidateUserSessions(username); } public boolean usernameExists(String username) { - return userRepository.findByUsername(username).isPresent(); + return findByUsername(username).isPresent(); } public boolean usernameExistsIgnoreCase(String username) { - return userRepository.findByUsernameIgnoreCase(username).isPresent(); + return findByUsernameIgnoreCase(username).isPresent(); } public boolean hasUsers() { long userCount = userRepository.count(); - if (userRepository - .findByUsernameIgnoreCase(Role.INTERNAL_API_USER.getRoleId()) - .isPresent()) { + if (findByUsernameIgnoreCase(Role.INTERNAL_API_USER.getRoleId()).isPresent()) { userCount -= 1; } return userCount > 0; @@ -217,7 +224,7 @@ public class UserService implements UserServiceInterface { public void updateUserSettings(String username, Map updates) throws IOException { - Optional userOpt = userRepository.findByUsernameIgnoreCase(username); + Optional userOpt = findByUsernameIgnoreCase(username); if (userOpt.isPresent()) { User user = userOpt.get(); Map settingsMap = user.getSettings(); @@ -268,10 +275,17 @@ public class UserService implements UserServiceInterface { databaseBackupHelper.exportDatabase(); } - public void changeRole(User user, String newRole) { + public void changeRole(User user, String newRole) throws IOException { Authority userAuthority = this.findRole(user); userAuthority.setAuthority(newRole); authorityRepository.save(userAuthority); + databaseBackupHelper.exportDatabase(); + } + + public void changeUserEnabled(User user, Boolean enbeled) throws IOException { + user.setEnabled(enbeled); + userRepository.save(user); + databaseBackupHelper.exportDatabase(); } public boolean isPasswordCorrect(User user, String currentPassword) { @@ -295,14 +309,40 @@ public class UserService implements UserServiceInterface { } public boolean hasPassword(String username) { - Optional user = userRepository.findByUsernameIgnoreCase(username); + Optional user = findByUsernameIgnoreCase(username); return user.isPresent() && user.get().hasPassword(); } public boolean isAuthenticationTypeByUsername( String username, AuthenticationType authenticationType) { - Optional user = userRepository.findByUsernameIgnoreCase(username); + Optional user = findByUsernameIgnoreCase(username); return user.isPresent() && authenticationType.name().equalsIgnoreCase(user.get().getAuthenticationType()); } + + public boolean isUserDisabled(String username) { + Optional userOpt = findByUsernameIgnoreCase(username); + return userOpt.map(user -> !user.isEnabled()).orElse(false); + } + + public void invalidateUserSessions(String username) { + String usernameP = ""; + for (Object principal : sessionRegistry.getAllPrincipals()) { + for (SessionInformation sessionsInformation : + sessionRegistry.getAllSessions(principal, false)) { + if (principal instanceof UserDetails) { + UserDetails userDetails = (UserDetails) principal; + usernameP = userDetails.getUsername(); + } else if (principal instanceof OAuth2User) { + OAuth2User oAuth2User = (OAuth2User) principal; + usernameP = oAuth2User.getName(); + } else if (principal instanceof String) { + usernameP = (String) principal; + } + if (usernameP.equalsIgnoreCase(username)) { + sessionRegistry.expireSession(sessionsInformation.getSessionId()); + } + } + } + } } diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java index c3827bf3..ebbe08f4 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationFailureHandler.java @@ -2,8 +2,8 @@ package stirling.software.SPDF.config.security.oauth2; import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.security.authentication.BadCredentialsException; +import org.springframework.security.authentication.DisabledException; import org.springframework.security.authentication.LockedException; import org.springframework.security.core.AuthenticationException; import org.springframework.security.oauth2.core.OAuth2AuthenticationException; @@ -13,19 +13,34 @@ import org.springframework.security.web.authentication.SimpleUrlAuthenticationFa import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; +import lombok.extern.slf4j.Slf4j; +@Slf4j public class CustomOAuth2AuthenticationFailureHandler extends SimpleUrlAuthenticationFailureHandler { - private static final Logger logger = - LoggerFactory.getLogger(CustomOAuth2AuthenticationFailureHandler.class); - @Override public void onAuthenticationFailure( HttpServletRequest request, HttpServletResponse response, AuthenticationException exception) throws IOException, ServletException { + + if (exception instanceof BadCredentialsException) { + log.error("BadCredentialsException", exception); + getRedirectStrategy().sendRedirect(request, response, "/login?error=badcredentials"); + return; + } + if (exception instanceof DisabledException) { + log.error("User is deactivated: ", exception); + getRedirectStrategy().sendRedirect(request, response, "/logout?userIsDisabled=true"); + return; + } + if (exception instanceof LockedException) { + log.error("Account locked: ", exception); + getRedirectStrategy().sendRedirect(request, response, "/logout?error=locked"); + return; + } if (exception instanceof OAuth2AuthenticationException) { OAuth2Error error = ((OAuth2AuthenticationException) exception).getError(); @@ -34,17 +49,13 @@ public class CustomOAuth2AuthenticationFailureHandler if (error.getErrorCode().equals("Password must not be null")) { errorCode = "userAlreadyExistsWeb"; } - logger.error("OAuth2 Authentication error: " + errorCode); + log.error("OAuth2 Authentication error: " + errorCode); + log.error("OAuth2AuthenticationException", exception); getRedirectStrategy() .sendRedirect(request, response, "/logout?erroroauth=" + errorCode); return; - } else if (exception instanceof LockedException) { - logger.error("Account locked: ", exception); - getRedirectStrategy().sendRedirect(request, response, "/logout?error=locked"); - return; - } else { - logger.error("Unhandled authentication exception", exception); - super.onAuthenticationFailure(request, response, exception); } + log.error("Unhandled authentication exception", exception); + super.onAuthenticationFailure(request, response, exception); } } diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java index 6d68d95b..4c7e04d9 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2AuthenticationSuccessHandler.java @@ -2,10 +2,9 @@ package stirling.software.SPDF.config.security.oauth2; import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.security.authentication.LockedException; import org.springframework.security.core.Authentication; +import org.springframework.security.core.userdetails.UserDetails; import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.web.authentication.SavedRequestAwareAuthenticationSuccessHandler; import org.springframework.security.web.savedrequest.SavedRequest; @@ -26,9 +25,6 @@ public class CustomOAuth2AuthenticationSuccessHandler private LoginAttemptService loginAttemptService; - private static final Logger logger = - LoggerFactory.getLogger(CustomOAuth2AuthenticationSuccessHandler.class); - private ApplicationProperties applicationProperties; private UserService userService; @@ -46,6 +42,17 @@ public class CustomOAuth2AuthenticationSuccessHandler HttpServletRequest request, HttpServletResponse response, Authentication authentication) throws ServletException, IOException { + Object principal = authentication.getPrincipal(); + String username = ""; + + if (principal instanceof OAuth2User) { + OAuth2User oauthUser = (OAuth2User) principal; + username = oauthUser.getName(); + } else if (principal instanceof UserDetails) { + UserDetails oauthUser = (UserDetails) principal; + username = oauthUser.getUsername(); + } + // Get the saved request HttpSession session = request.getSession(false); String contextPath = request.getContextPath(); @@ -59,11 +66,8 @@ public class CustomOAuth2AuthenticationSuccessHandler // Redirect to the original destination super.onAuthenticationSuccess(request, response, authentication); } else { - OAuth2User oauthUser = (OAuth2User) authentication.getPrincipal(); OAUTH2 oAuth = applicationProperties.getSecurity().getOAUTH2(); - String username = oauthUser.getName(); - if (loginAttemptService.isBlocked(username)) { if (session != null) { session.removeAttribute("SPRING_SECURITY_SAVED_REQUEST"); @@ -78,15 +82,21 @@ public class CustomOAuth2AuthenticationSuccessHandler && oAuth.getAutoCreateUser()) { response.sendRedirect(contextPath + "/logout?oauth2AuthenticationErrorWeb=true"); return; - } else { - try { - userService.processOAuth2PostLogin(username, oAuth.getAutoCreateUser()); - response.sendRedirect(contextPath + "/"); - return; - } catch (IllegalArgumentException e) { - response.sendRedirect(contextPath + "/logout?invalidUsername=true"); + } + try { + if (oAuth.getBlockRegistration() + && !userService.usernameExistsIgnoreCase(username)) { + response.sendRedirect(contextPath + "/logout?oauth2_admin_blocked_user=true"); return; } + if (principal instanceof OAuth2User) { + userService.processOAuth2PostLogin(username, oAuth.getAutoCreateUser()); + } + response.sendRedirect(contextPath + "/"); + return; + } catch (IllegalArgumentException e) { + response.sendRedirect(contextPath + "/logout?invalidUsername=true"); + return; } } } diff --git a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java index 0f28025f..907ddd4b 100644 --- a/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java +++ b/src/main/java/stirling/software/SPDF/config/security/oauth2/CustomOAuth2LogoutSuccessHandler.java @@ -2,34 +2,26 @@ package stirling.software.SPDF.config.security.oauth2; import java.io.IOException; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.security.core.Authentication; -import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.oauth2.client.authentication.OAuth2AuthenticationToken; import org.springframework.security.web.authentication.logout.SimpleUrlLogoutSuccessHandler; import jakarta.servlet.ServletException; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; -import jakarta.servlet.http.HttpSession; +import lombok.extern.slf4j.Slf4j; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; import stirling.software.SPDF.model.Provider; import stirling.software.SPDF.model.provider.UnsupportedProviderException; import stirling.software.SPDF.utils.UrlUtils; +@Slf4j public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHandler { - private static final Logger logger = - LoggerFactory.getLogger(CustomOAuth2LogoutSuccessHandler.class); - - private final SessionRegistry sessionRegistry; private final ApplicationProperties applicationProperties; - public CustomOAuth2LogoutSuccessHandler( - ApplicationProperties applicationProperties, SessionRegistry sessionRegistry) { - this.sessionRegistry = sessionRegistry; + public CustomOAuth2LogoutSuccessHandler(ApplicationProperties applicationProperties) { this.applicationProperties = applicationProperties; } @@ -42,6 +34,15 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand String issuer = null; String clientId = null; + if (authentication == null) { + if (request.getParameter("userIsDisabled") != null) { + response.sendRedirect( + request.getContextPath() + "/login?erroroauth=userIsDisabled"); + } else { + super.onLogoutSuccess(request, response, authentication); + } + return; + } OAUTH2 oauth = applicationProperties.getSecurity().getOAUTH2(); if (authentication instanceof OAuth2AuthenticationToken) { @@ -53,9 +54,8 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand issuer = provider.getIssuer(); clientId = provider.getClientId(); } catch (UnsupportedProviderException e) { - logger.error(e.getMessage()); + log.error(e.getMessage()); } - } else { registrationId = oauth.getProvider() != null ? oauth.getProvider() : ""; issuer = oauth.getIssuer(); @@ -70,18 +70,16 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand param = "erroroauth=" + sanitizeInput(errorMessage); } else if (request.getParameter("oauth2AutoCreateDisabled") != null) { param = "error=oauth2AutoCreateDisabled"; + } else if (request.getParameter("oauth2_admin_blocked_user") != null) { + param = "erroroauth=oauth2_admin_blocked_user"; + } else if (request.getParameter("userIsDisabled") != null) { + param = "erroroauth=userIsDisabled"; + } else if (request.getParameter("badcredentials") != null) { + param = "error=badcredentials"; } String redirect_url = UrlUtils.getOrigin(request) + "/login?" + param; - HttpSession session = request.getSession(false); - if (session != null) { - String sessionId = session.getId(); - sessionRegistry.removeSessionInformation(sessionId); - session.invalidate(); - logger.info("Session invalidated: " + sessionId); - } - switch (registrationId.toLowerCase()) { case "keycloak": // Add Keycloak specific logout URL if needed @@ -92,13 +90,13 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand + clientId + "&post_logout_redirect_uri=" + response.encodeRedirectURL(redirect_url); - logger.info("Redirecting to Keycloak logout URL: " + logoutUrl); + log.info("Redirecting to Keycloak logout URL: " + logoutUrl); response.sendRedirect(logoutUrl); break; case "github": // Add GitHub specific logout URL if needed String githubLogoutUrl = "https://github.com/logout"; - logger.info("Redirecting to GitHub logout URL: " + githubLogoutUrl); + log.info("Redirecting to GitHub logout URL: " + githubLogoutUrl); response.sendRedirect(githubLogoutUrl); break; case "google": @@ -106,13 +104,14 @@ public class CustomOAuth2LogoutSuccessHandler extends SimpleUrlLogoutSuccessHand // String googleLogoutUrl = // "https://accounts.google.com/Logout?continue=https://appengine.google.com/_ah/logout?continue=" // + response.encodeRedirectURL(redirect_url); - // logger.info("Redirecting to Google logout URL: " + googleLogoutUrl); + log.info("Google does not have a specific logout URL"); + // log.info("Redirecting to Google logout URL: " + googleLogoutUrl); // response.sendRedirect(googleLogoutUrl); // break; default: - String redirectUrl = request.getContextPath() + "/login?" + param; - logger.info("Redirecting to default logout URL: " + redirectUrl); - response.sendRedirect(redirectUrl); + String defaultRedirectUrl = request.getContextPath() + "/login?" + param; + log.info("Redirecting to default logout URL: " + defaultRedirectUrl); + response.sendRedirect(defaultRedirectUrl); break; } } diff --git a/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java new file mode 100644 index 00000000..a4129e6a --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/CustomHttpSessionListener.java @@ -0,0 +1,26 @@ +package stirling.software.SPDF.config.security.session; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Component; + +import jakarta.servlet.http.HttpSessionEvent; +import jakarta.servlet.http.HttpSessionListener; +import lombok.extern.slf4j.Slf4j; + +@Component +@Slf4j +public class CustomHttpSessionListener implements HttpSessionListener { + + @Autowired private SessionPersistentRegistry sessionPersistentRegistry; + + @Override + public void sessionCreated(HttpSessionEvent se) { + log.info("Session created: " + se.getSession().getId()); + } + + @Override + public void sessionDestroyed(HttpSessionEvent se) { + log.info("Session destroyed: " + se.getSession().getId()); + sessionPersistentRegistry.expireSession(se.getSession().getId()); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java new file mode 100644 index 00000000..bb63a8b5 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionPersistentRegistry.java @@ -0,0 +1,183 @@ +package stirling.software.SPDF.config.security.session; + +import java.time.Duration; +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.List; +import java.util.Optional; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.security.core.session.SessionInformation; +import org.springframework.security.core.session.SessionRegistry; +import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; +import org.springframework.stereotype.Component; + +import jakarta.transaction.Transactional; +import stirling.software.SPDF.model.SessionEntity; + +@Component +public class SessionPersistentRegistry implements SessionRegistry { + + private final SessionRepository sessionRepository; + + @Value("${server.servlet.session.timeout:30m}") + private Duration defaultMaxInactiveInterval; + + public SessionPersistentRegistry(SessionRepository sessionRepository) { + this.sessionRepository = sessionRepository; + } + + @Override + public List getAllPrincipals() { + List sessions = sessionRepository.findAll(); + List principals = new ArrayList<>(); + for (SessionEntity session : sessions) { + principals.add(session.getPrincipalName()); + } + return principals; + } + + @Override + public List getAllSessions( + Object principal, boolean includeExpiredSessions) { + List sessionInformations = new ArrayList<>(); + String principalName = null; + + if (principal instanceof UserDetails) { + principalName = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + principalName = ((OAuth2User) principal).getName(); + } else if (principal instanceof String) { + principalName = (String) principal; + } + + if (principalName != null) { + List sessionEntities = + sessionRepository.findByPrincipalName(principalName); + for (SessionEntity sessionEntity : sessionEntities) { + if (includeExpiredSessions || !sessionEntity.isExpired()) { + sessionInformations.add( + new SessionInformation( + sessionEntity.getPrincipalName(), + sessionEntity.getSessionId(), + sessionEntity.getLastRequest())); + } + } + } + return sessionInformations; + } + + @Override + @Transactional + public void registerNewSession(String sessionId, Object principal) { + String principalName = null; + + if (principal instanceof UserDetails) { + principalName = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + principalName = ((OAuth2User) principal).getName(); + } else if (principal instanceof String) { + principalName = (String) principal; + } + + if (principalName != null) { + SessionEntity sessionEntity = new SessionEntity(); + sessionEntity.setSessionId(sessionId); + sessionEntity.setPrincipalName(principalName); + sessionEntity.setLastRequest(new Date()); // Set lastRequest to the current date + sessionEntity.setExpired(false); + sessionRepository.save(sessionEntity); + } + } + + @Override + @Transactional + public void removeSessionInformation(String sessionId) { + sessionRepository.deleteById(sessionId); + } + + @Override + @Transactional + public void refreshLastRequest(String sessionId) { + Optional sessionEntityOpt = sessionRepository.findById(sessionId); + if (sessionEntityOpt.isPresent()) { + SessionEntity sessionEntity = sessionEntityOpt.get(); + sessionEntity.setLastRequest(new Date()); // Update lastRequest to the current date + sessionRepository.save(sessionEntity); + } + } + + @Override + public SessionInformation getSessionInformation(String sessionId) { + Optional sessionEntityOpt = sessionRepository.findById(sessionId); + if (sessionEntityOpt.isPresent()) { + SessionEntity sessionEntity = sessionEntityOpt.get(); + return new SessionInformation( + sessionEntity.getPrincipalName(), + sessionEntity.getSessionId(), + sessionEntity.getLastRequest()); + } + return null; + } + + // Retrieve all non-expired sessions + public List getAllSessionsNotExpired() { + return sessionRepository.findByExpired(false); + } + + // Retrieve all sessions + public List getAllSessions() { + return sessionRepository.findAll(); + } + + // Mark a session as expired + public void expireSession(String sessionId) { + Optional sessionEntityOpt = sessionRepository.findById(sessionId); + if (sessionEntityOpt.isPresent()) { + SessionEntity sessionEntity = sessionEntityOpt.get(); + sessionEntity.setExpired(true); // Set expired to true + sessionRepository.save(sessionEntity); + } + } + + // Get the maximum inactive interval for sessions + public int getMaxInactiveInterval() { + return (int) defaultMaxInactiveInterval.getSeconds(); + } + + // Retrieve a session entity by session ID + public SessionEntity getSessionEntity(String sessionId) { + return sessionRepository.findBySessionId(sessionId); + } + + // Update session details by principal name + public void updateSessionByPrincipalName( + String principalName, boolean expired, Date lastRequest) { + sessionRepository.saveByPrincipalName(expired, lastRequest, principalName); + } + + // Find the latest session for a given principal name + public Optional findLatestSession(String principalName) { + List allSessions = sessionRepository.findByPrincipalName(principalName); + if (allSessions.isEmpty()) { + return Optional.empty(); + } + + // Sort sessions by lastRequest in descending order + Collections.sort( + allSessions, + new Comparator() { + @Override + public int compare(SessionEntity s1, SessionEntity s2) { + // Sort by lastRequest in descending order + return s2.getLastRequest().compareTo(s1.getLastRequest()); + } + }); + + // The first session in the list is the latest session for the given principal name + return Optional.of(allSessions.get(0)); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java new file mode 100644 index 00000000..8fa24e95 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionRegistryConfig.java @@ -0,0 +1,20 @@ +package stirling.software.SPDF.config.security.session; + +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.security.core.session.SessionRegistryImpl; + +@Configuration +public class SessionRegistryConfig { + + @Bean + public SessionRegistryImpl sessionRegistry() { + return new SessionRegistryImpl(); + } + + @Bean + public SessionPersistentRegistry sessionPersistentRegistry( + SessionRepository sessionRepository) { + return new SessionPersistentRegistry(sessionRepository); + } +} diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java new file mode 100644 index 00000000..0cc875a2 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionRepository.java @@ -0,0 +1,31 @@ +package stirling.software.SPDF.config.security.session; + +import java.util.Date; +import java.util.List; + +import org.springframework.data.jpa.repository.JpaRepository; +import org.springframework.data.jpa.repository.Modifying; +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.query.Param; +import org.springframework.stereotype.Repository; + +import jakarta.transaction.Transactional; +import stirling.software.SPDF.model.SessionEntity; + +@Repository +public interface SessionRepository extends JpaRepository { + List findByPrincipalName(String principalName); + + List findByExpired(boolean expired); + + SessionEntity findBySessionId(String sessionId); + + @Modifying + @Transactional + @Query( + "UPDATE SessionEntity s SET s.expired = :expired, s.lastRequest = :lastRequest WHERE s.principalName = :principalName") + void saveByPrincipalName( + @Param("expired") boolean expired, + @Param("lastRequest") Date lastRequest, + @Param("principalName") String principalName); +} diff --git a/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java b/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java new file mode 100644 index 00000000..aa920f84 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/config/security/session/SessionScheduled.java @@ -0,0 +1,35 @@ +package stirling.software.SPDF.config.security.session; + +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; +import java.util.List; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.security.core.session.SessionInformation; +import org.springframework.stereotype.Component; + +@Component +public class SessionScheduled { + @Autowired private SessionPersistentRegistry sessionPersistentRegistry; + + @Scheduled(cron = "0 0/5 * * * ?") + public void expireSessions() { + Instant now = Instant.now(); + + for (Object principal : sessionPersistentRegistry.getAllPrincipals()) { + List sessionInformations = + sessionPersistentRegistry.getAllSessions(principal, false); + for (SessionInformation sessionInformation : sessionInformations) { + Date lastRequest = sessionInformation.getLastRequest(); + int maxInactiveInterval = sessionPersistentRegistry.getMaxInactiveInterval(); + Instant expirationTime = + lastRequest.toInstant().plus(maxInactiveInterval, ChronoUnit.SECONDS); + if (now.isAfter(expirationTime)) { + sessionPersistentRegistry.expireSession(sessionInformation.getSessionId()); + } + } + } + } +} diff --git a/src/main/java/stirling/software/SPDF/controller/api/UserController.java b/src/main/java/stirling/software/SPDF/controller/api/UserController.java index b0deefa0..bc59b91e 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/UserController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/UserController.java @@ -3,6 +3,7 @@ package stirling.software.SPDF.controller.api; import java.io.IOException; import java.security.Principal; import java.util.HashMap; +import java.util.List; import java.util.Map; import java.util.Optional; @@ -12,8 +13,8 @@ import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.security.core.session.SessionInformation; -import org.springframework.security.core.session.SessionRegistry; import org.springframework.security.core.userdetails.UserDetails; +import org.springframework.security.oauth2.core.user.OAuth2User; import org.springframework.security.web.authentication.logout.SecurityContextLogoutHandler; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; @@ -30,6 +31,8 @@ import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import stirling.software.SPDF.config.security.UserService; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; +import stirling.software.SPDF.model.AuthenticationType; import stirling.software.SPDF.model.Role; import stirling.software.SPDF.model.User; import stirling.software.SPDF.model.api.user.UsernameAndPass; @@ -41,6 +44,8 @@ public class UserController { @Autowired private UserService userService; + @Autowired SessionPersistentRegistry sessionRegistry; + @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/register") public String register(@ModelAttribute UsernameAndPass requestModel, Model model) @@ -203,9 +208,10 @@ public class UserController { @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/admin/saveUser") public RedirectView saveUser( - @RequestParam(name = "username") String username, - @RequestParam(name = "password") String password, + @RequestParam String username, + @RequestParam(name = "password", required = false) String password, @RequestParam(name = "role") String role, + @RequestParam(name = "authType") String authType, @RequestParam(name = "forceChange", required = false, defaultValue = "false") boolean forceChange) throws IllegalArgumentException, IOException { @@ -237,7 +243,15 @@ public class UserController { return new RedirectView("/addUsers?messageType=invalidRole", true); } - userService.saveUser(username, password, role, forceChange); + if (authType.equalsIgnoreCase(AuthenticationType.OAUTH2.toString())) { + userService.saveUser(username, AuthenticationType.OAUTH2, role); + } else { + if (password.isBlank()) { + return new RedirectView("/addUsers?messageType=invalidPassword", true); + } + userService.saveUser(username, password, role, forceChange); + } + return new RedirectView( "/addUsers", true); // Redirect to account page after adding the user } @@ -247,7 +261,8 @@ public class UserController { public RedirectView changeRole( @RequestParam(name = "username") String username, @RequestParam(name = "role") String role, - Authentication authentication) { + Authentication authentication) + throws IOException { Optional userOpt = userService.findByUsernameIgnoreCase(username); @@ -278,6 +293,60 @@ public class UserController { User user = userOpt.get(); userService.changeRole(user, role); + + return new RedirectView( + "/addUsers", true); // Redirect to account page after adding the user + } + + @PreAuthorize("hasRole('ROLE_ADMIN')") + @PostMapping("/admin/changeUserEnabled/{username}") + public RedirectView changeUserEnabled( + @PathVariable("username") String username, + @RequestParam("enabled") boolean enabled, + Authentication authentication) + throws IOException { + + Optional userOpt = userService.findByUsernameIgnoreCase(username); + + if (!userOpt.isPresent()) { + return new RedirectView("/addUsers?messageType=userNotFound", true); + } + if (!userService.usernameExistsIgnoreCase(username)) { + return new RedirectView("/addUsers?messageType=userNotFound", true); + } + // Get the currently authenticated username + String currentUsername = authentication.getName(); + + // Check if the provided username matches the current session's username + if (currentUsername.equalsIgnoreCase(username)) { + return new RedirectView("/addUsers?messageType=disabledCurrentUser", true); + } + User user = userOpt.get(); + + userService.changeUserEnabled(user, enabled); + + if (!enabled) { + // Invalidate all sessions if the user is being disabled + List principals = sessionRegistry.getAllPrincipals(); + String userNameP = ""; + for (Object principal : principals) { + List sessionsInformations = + sessionRegistry.getAllSessions(principal, false); + if (principal instanceof UserDetails) { + userNameP = ((UserDetails) principal).getUsername(); + } else if (principal instanceof OAuth2User) { + userNameP = ((OAuth2User) principal).getName(); + } else if (principal instanceof String) { + userNameP = (String) principal; + } + if (userNameP.equalsIgnoreCase(username)) { + for (SessionInformation sessionsInformation : sessionsInformations) { + sessionRegistry.expireSession(sessionsInformation.getSessionId()); + } + } + } + } + return new RedirectView( "/addUsers", true); // Redirect to account page after adding the user } @@ -285,7 +354,7 @@ public class UserController { @PreAuthorize("hasRole('ROLE_ADMIN')") @PostMapping("/admin/deleteUser/{username}") public RedirectView deleteUser( - @PathVariable(name = "username") String username, Authentication authentication) { + @PathVariable("username") String username, Authentication authentication) { if (!userService.usernameExistsIgnoreCase(username)) { return new RedirectView("/addUsers?messageType=deleteUsernameExists", true); @@ -298,27 +367,18 @@ public class UserController { if (currentUsername.equalsIgnoreCase(username)) { return new RedirectView("/addUsers?messageType=deleteCurrentUser", true); } - invalidateUserSessions(username); + + // Invalidate all sessions before deleting the user + List sessionsInformations = + sessionRegistry.getAllSessions(authentication.getPrincipal(), false); + for (SessionInformation sessionsInformation : sessionsInformations) { + sessionRegistry.expireSession(sessionsInformation.getSessionId()); + sessionRegistry.removeSessionInformation(sessionsInformation.getSessionId()); + } userService.deleteUser(username); return new RedirectView("/addUsers", true); } - @Autowired private SessionRegistry sessionRegistry; - - private void invalidateUserSessions(String username) { - for (Object principal : sessionRegistry.getAllPrincipals()) { - if (principal instanceof UserDetails) { - UserDetails userDetails = (UserDetails) principal; - if (userDetails.getUsername().equals(username)) { - for (SessionInformation session : - sessionRegistry.getAllSessions(principal, false)) { - session.expireNow(); - } - } - } - } - } - @PreAuthorize("!hasAuthority('ROLE_DEMO_USER')") @PostMapping("/get-api-key") public ResponseEntity getApiKey(Principal principal) { diff --git a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java index 8bce1b22..026690fd 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java +++ b/src/main/java/stirling/software/SPDF/controller/api/converters/ConvertWebsiteToPDF.java @@ -39,6 +39,12 @@ public class ConvertWebsiteToPDF { if (!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) { throw new IllegalArgumentException("Invalid URL format provided."); } + + // validate the URL is reachable + if (!GeneralUtils.isURLReachable(URL)) { + throw new IllegalArgumentException("URL is not reachable, please provide a valid URL."); + } + Path tempOutputFile = null; byte[] pdfBytes; try { diff --git a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java index bb8a18cd..f3ccabf4 100644 --- a/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java +++ b/src/main/java/stirling/software/SPDF/controller/api/misc/OCRController.java @@ -13,8 +13,7 @@ import java.util.stream.Collectors; import java.util.zip.ZipEntry; import java.util.zip.ZipOutputStream; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.ModelAttribute; @@ -27,6 +26,7 @@ import io.github.pixee.security.Filenames; import io.swagger.v3.oas.annotations.Operation; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest; import stirling.software.SPDF.utils.ProcessExecutor; import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult; @@ -37,10 +37,10 @@ import stirling.software.SPDF.utils.WebResponseUtils; @Tag(name = "Misc", description = "Miscellaneous APIs") public class OCRController { - private static final Logger logger = LoggerFactory.getLogger(OCRController.class); + @Autowired ApplicationProperties applicationProperties; public List getAvailableTesseractLanguages() { - String tessdataDir = "/usr/share/tessdata"; + String tessdataDir = applicationProperties.getSystem().getTessdataDir(); File[] files = new File(tessdataDir).listFiles(); if (files == null) { return Collections.emptyList(); diff --git a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java index 73d2a0c4..57c97e75 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/AccountWebController.java @@ -1,13 +1,15 @@ package stirling.software.SPDF.controller.web; +import java.time.Instant; +import java.time.temporal.ChronoUnit; +import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Optional; +import java.util.stream.Collectors; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; @@ -23,11 +25,14 @@ import com.fasterxml.jackson.databind.ObjectMapper; import io.swagger.v3.oas.annotations.tags.Tag; import jakarta.servlet.http.HttpServletRequest; +import lombok.extern.slf4j.Slf4j; +import stirling.software.SPDF.config.security.session.SessionPersistentRegistry; import stirling.software.SPDF.model.ApplicationProperties; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2; import stirling.software.SPDF.model.ApplicationProperties.Security.OAUTH2.Client; import stirling.software.SPDF.model.Authority; import stirling.software.SPDF.model.Role; +import stirling.software.SPDF.model.SessionEntity; import stirling.software.SPDF.model.User; import stirling.software.SPDF.model.provider.GithubProvider; import stirling.software.SPDF.model.provider.GoogleProvider; @@ -35,15 +40,20 @@ import stirling.software.SPDF.model.provider.KeycloakProvider; import stirling.software.SPDF.repository.UserRepository; @Controller +@Slf4j @Tag(name = "Account Security", description = "Account Security APIs") public class AccountWebController { @Autowired ApplicationProperties applicationProperties; - private static final Logger logger = LoggerFactory.getLogger(AccountWebController.class); + @Autowired SessionPersistentRegistry sessionPersistentRegistry; + + @Autowired + private UserRepository userRepository; // Assuming you have a repository for user operations @GetMapping("/login") public String login(HttpServletRequest request, Model model, Authentication authentication) { + // If the user is already authenticated, redirect them to the home page. if (authentication != null && authentication.isAuthenticated()) { return "redirect:/"; } @@ -137,6 +147,13 @@ public class AccountWebController { break; case "invalid_id_token": erroroauth = "login.oauth2InvalidIdToken"; + break; + case "oauth2_admin_blocked_user": + erroroauth = "login.oauth2AdminBlockedUser"; + break; + case "userIsDisabled": + erroroauth = "login.userIsDisabled"; + break; default: break; } @@ -155,9 +172,6 @@ public class AccountWebController { return "login"; } - @Autowired - private UserRepository userRepository; // Assuming you have a repository for user operations - @PreAuthorize("hasRole('ROLE_ADMIN')") @GetMapping("/addUsers") public String showAddUserForm( @@ -166,6 +180,13 @@ public class AccountWebController { Iterator iterator = allUsers.iterator(); Map roleDetails = Role.getAllRoleDetails(); + // Map to store session information and user activity status + Map userSessions = new HashMap<>(); + Map userLastRequest = new HashMap<>(); + + int activeUsers = 0; + int disabledUsers = 0; + while (iterator.hasNext()) { User user = iterator.next(); if (user != null) { @@ -176,9 +197,73 @@ public class AccountWebController { break; // Break out of the inner loop once the user is removed } } + + // Determine the user's session status and last request time + int maxInactiveInterval = sessionPersistentRegistry.getMaxInactiveInterval(); + boolean hasActiveSession = false; + Date lastRequest = null; + + Optional latestSession = + sessionPersistentRegistry.findLatestSession(user.getUsername()); + if (latestSession.isPresent()) { + SessionEntity sessionEntity = latestSession.get(); + Date lastAccessedTime = sessionEntity.getLastRequest(); + Instant now = Instant.now(); + + // Calculate session expiration and update session status accordingly + Instant expirationTime = + lastAccessedTime + .toInstant() + .plus(maxInactiveInterval, ChronoUnit.SECONDS); + if (now.isAfter(expirationTime)) { + sessionPersistentRegistry.expireSession(sessionEntity.getSessionId()); + hasActiveSession = false; + } else { + hasActiveSession = !sessionEntity.isExpired(); + } + + lastRequest = sessionEntity.getLastRequest(); + } else { + hasActiveSession = false; + lastRequest = new Date(0); // No session, set default last request time + } + + userSessions.put(user.getUsername(), hasActiveSession); + userLastRequest.put(user.getUsername(), lastRequest); + + if (hasActiveSession) { + activeUsers++; + } + if (!user.isEnabled()) { + disabledUsers++; + } } } + // Sort users by active status and last request date + List sortedUsers = + allUsers.stream() + .sorted( + (u1, u2) -> { + boolean u1Active = userSessions.get(u1.getUsername()); + boolean u2Active = userSessions.get(u2.getUsername()); + + if (u1Active && !u2Active) { + return -1; + } else if (!u1Active && u2Active) { + return 1; + } else { + Date u1LastRequest = + userLastRequest.getOrDefault( + u1.getUsername(), new Date(0)); + Date u2LastRequest = + userLastRequest.getOrDefault( + u2.getUsername(), new Date(0)); + return u2LastRequest.compareTo(u1LastRequest); + } + }) + .collect(Collectors.toList()); + String messageType = request.getParameter("messageType"); String deleteMessage = null; @@ -203,6 +288,9 @@ public class AccountWebController { case "invalidUsername": addMessage = "invalidUsernameMessage"; break; + case "invalidPassword": + addMessage = "invalidPasswordMessage"; + break; default: break; } @@ -218,16 +306,24 @@ public class AccountWebController { case "downgradeCurrentUser": changeMessage = "downgradeCurrentUserMessage"; break; - + case "disabledCurrentUser": + changeMessage = "disabledCurrentUserMessage"; + break; default: + changeMessage = messageType; break; } model.addAttribute("changeMessage", changeMessage); } - model.addAttribute("users", allUsers); + model.addAttribute("users", sortedUsers); model.addAttribute("currentUsername", authentication.getName()); model.addAttribute("roleDetails", roleDetails); + model.addAttribute("userSessions", userSessions); + model.addAttribute("userLastRequest", userLastRequest); + model.addAttribute("totalUsers", allUsers.size()); + model.addAttribute("activeUsers", activeUsers); + model.addAttribute("disabledUsers", disabledUsers); return "addUsers"; } @@ -278,7 +374,7 @@ public class AccountWebController { settingsJson = objectMapper.writeValueAsString(user.get().getSettings()); } catch (JsonProcessingException e) { // Handle JSON conversion error - logger.error("exception", e); + log.error("exception", e); return "redirect:/error"; } diff --git a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java index 0e1fdf55..4eab1850 100644 --- a/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java +++ b/src/main/java/stirling/software/SPDF/controller/web/OtherWebController.java @@ -6,6 +6,7 @@ import java.util.Collections; import java.util.List; import java.util.stream.Collectors; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; @@ -14,10 +15,14 @@ import org.springframework.web.servlet.ModelAndView; import io.swagger.v3.oas.annotations.Hidden; import io.swagger.v3.oas.annotations.tags.Tag; +import stirling.software.SPDF.model.ApplicationProperties; + @Controller @Tag(name = "Misc", description = "Miscellaneous APIs") public class OtherWebController { + @Autowired ApplicationProperties applicationProperties; + @GetMapping("/compress-pdf") @Hidden public String compressPdfForm(Model model) { @@ -97,7 +102,7 @@ public class OtherWebController { } public List getAvailableTesseractLanguages() { - String tessdataDir = "/usr/share/tessdata"; + String tessdataDir = applicationProperties.getSystem().getTessdataDir(); File[] files = new File(tessdataDir).listFiles(); if (files == null) { return Collections.emptyList(); diff --git a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java index 6bad4a66..266d4520 100644 --- a/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java +++ b/src/main/java/stirling/software/SPDF/model/ApplicationProperties.java @@ -241,6 +241,7 @@ public class ApplicationProperties { private String clientId; private String clientSecret; private Boolean autoCreateUser = false; + private Boolean blockRegistration = false; private String useAsUsername; private Collection scopes = new ArrayList<>(); private String provider; @@ -286,6 +287,14 @@ public class ApplicationProperties { this.autoCreateUser = autoCreateUser; } + public Boolean getBlockRegistration() { + return blockRegistration; + } + + public void setBlockRegistration(Boolean blockRegistration) { + this.blockRegistration = blockRegistration; + } + public String getUseAsUsername() { return useAsUsername; } @@ -356,6 +365,8 @@ public class ApplicationProperties { + (clientSecret != null && !clientSecret.isEmpty() ? "MASKED" : "NULL") + ", autoCreateUser=" + autoCreateUser + + ", blockRegistration=" + + blockRegistration + ", useAsUsername=" + useAsUsername + ", provider=" @@ -431,6 +442,15 @@ public class ApplicationProperties { private boolean showUpdate; private Boolean showUpdateOnlyAdmin; private boolean customHTMLFiles; + private String tessdataDir; + + public String getTessdataDir() { + return tessdataDir; + } + + public void setTessdataDir(String tessdataDir) { + this.tessdataDir = tessdataDir; + } public boolean isCustomHTMLFiles() { return customHTMLFiles; diff --git a/src/main/java/stirling/software/SPDF/model/SessionEntity.java b/src/main/java/stirling/software/SPDF/model/SessionEntity.java new file mode 100644 index 00000000..3b4989d5 --- /dev/null +++ b/src/main/java/stirling/software/SPDF/model/SessionEntity.java @@ -0,0 +1,23 @@ +package stirling.software.SPDF.model; + +import java.io.Serializable; +import java.util.Date; + +import jakarta.persistence.Entity; +import jakarta.persistence.Id; +import jakarta.persistence.Lob; +import jakarta.persistence.Table; +import lombok.Data; + +@Entity +@Data +@Table(name = "sessions") +public class SessionEntity implements Serializable { + @Id private String sessionId; + + @Lob private String principalName; + + private Date lastRequest; + + private boolean expired; +} diff --git a/src/main/java/stirling/software/SPDF/model/provider/GoogleProvider.java b/src/main/java/stirling/software/SPDF/model/provider/GoogleProvider.java index 2863801b..a3608df8 100644 --- a/src/main/java/stirling/software/SPDF/model/provider/GoogleProvider.java +++ b/src/main/java/stirling/software/SPDF/model/provider/GoogleProvider.java @@ -31,6 +31,14 @@ public class GoogleProvider extends Provider { private Collection scopes = new ArrayList<>(); private String useAsUsername = "email"; + @Override + public String getIssuer() { + return new String(); + } + + @Override + public void setIssuer(String issuer) {} + @Override public String getClientId() { return this.clientId; diff --git a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java index ae86d8c1..aa5f3aea 100644 --- a/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java +++ b/src/main/java/stirling/software/SPDF/utils/GeneralUtils.java @@ -13,6 +13,8 @@ import java.nio.file.SimpleFileVisitor; import java.nio.file.attribute.BasicFileAttributes; import java.util.ArrayList; import java.util.List; +import java.net.URL; +import java.net.HttpURLConnection; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -71,6 +73,21 @@ public class GeneralUtils { } catch (MalformedURLException e) { return false; } + + } + + public static boolean isURLReachable(String urlStr) { + try { + URL url = new URL(urlStr); + HttpURLConnection connection = (HttpURLConnection) url.openConnection(); + connection.setRequestMethod("HEAD"); + int responseCode = connection.getResponseCode(); + return (200 <= responseCode && responseCode <= 399); + } catch (MalformedURLException e) { + return false; + } catch (IOException e) { + return false; + } } public static File multipartToFile(MultipartFile multipart) throws IOException { @@ -95,19 +112,16 @@ public class GeneralUtils { sizeStr = sizeStr.replace(",", ".").replace(" ", ""); try { if (sizeStr.endsWith("KB")) { - return (long) - (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024); + return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) * 1024); } else if (sizeStr.endsWith("MB")) { - return (long) - (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) - * 1024 - * 1024); + return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) + * 1024 + * 1024); } else if (sizeStr.endsWith("GB")) { - return (long) - (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) - * 1024 - * 1024 - * 1024); + return (long) (Double.parseDouble(sizeStr.substring(0, sizeStr.length() - 2)) + * 1024 + * 1024 + * 1024); } else if (sizeStr.endsWith("B")) { return Long.parseLong(sizeStr.substring(0, sizeStr.length() - 1)); } else { @@ -170,13 +184,15 @@ public class GeneralUtils { int n = 0; while (true) { - // Replace 'n' with the current value of n, correctly handling numbers before 'n' + // Replace 'n' with the current value of n, correctly handling numbers before + // 'n' String sanitizedExpression = insertMultiplicationBeforeN(expression, n); Double result = evaluator.evaluate(sanitizedExpression); // Check if the result is null or not within bounds if (result == null || result <= 0 || result.intValue() > maxValue) { - if (n != 0) break; + if (n != 0) + break; } else { results.add(result.intValue()); } diff --git a/src/main/resources/messages_ar_AR.properties b/src/main/resources/messages_ar_AR.properties index 88ec9539..3c7e03df 100644 --- a/src/main/resources/messages_ar_AR.properties +++ b/src/main/resources/messages_ar_AR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=لا يمكن خفض دور المستخدم الحالي +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=لا يمكن تخفيض دور المستخدم الحالي. وبالتالي، لن يظهر المستخدم الحالي. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=تغيير دور المستخدم adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=تسجيل الدخول عبر تسجيل الدخول الأحادي login.oauth2AutoCreateDisabled=تم تعطيل مستخدم الإنشاء التلقائي لـ OAuth2 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_bg_BG.properties b/src/main/resources/messages_bg_BG.properties index ce8bcc5e..a164a9da 100644 --- a/src/main/resources/messages_bg_BG.properties +++ b/src/main/resources/messages_bg_BG.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Потребителят не е намерен incorrectPasswordMessage=Текущата парола е неправилна. usernameExistsMessage=Новият потребител вече съществува. invalidUsernameMessage=Невалидно потребителско име, потребителското име може да съдържа само букви, цифри и следните специални знаци @._+- или трябва да е валиден имейл адрес. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Не може да се изтрие вписания в момента потребител. deleteUsernameExistsMessage=Потребителското име не съществува и не може да бъде изтрито. downgradeCurrentUserMessage=Не може да се понижи ролята на текущия потребител +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Не може да се понижи ролята на текущия потребител. Следователно текущият потребител няма да бъде показан. userAlreadyExistsOAuthMessage=Потребителят вече съществува като OAuth2 потребител. userAlreadyExistsWebMessage=Потребителят вече съществува като уеб-потребител. @@ -177,6 +179,7 @@ adminUserSettings.user=Потребител adminUserSettings.addUser=Добавяне на нов потребител adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Потребителското име може да съдържа само букви, цифри и следните специални символи @._+- или трябва да е валиден имейл адрес. adminUserSettings.roles=Роли adminUserSettings.role=Роля @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Принудете потребителя да п adminUserSettings.submit=Съхранете потребителя adminUserSettings.changeUserRole=Промяна на ролята на потребителя adminUserSettings.authenticated=Удостоверен +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Вашият акаунт е заключен. login.signinTitle=Моля впишете се login.ssoSignIn=Влизане чрез еднократно влизане login.oauth2AutoCreateDisabled=OAUTH2 Автоматично създаване на потребител е деактивирано +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Заявката за оторизация не е намерена login.oauth2InvalidUserInfoResponse=Невалидна информация за потребителя login.oauth2invalidRequest=Невалидна заявка login.oauth2AccessDenied=Отказан достъп login.oauth2InvalidTokenResponse=Невалиден отговор на токена login.oauth2InvalidIdToken=Невалиден токен за идентификатор +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ca_CA.properties b/src/main/resources/messages_ca_CA.properties index 3d52a609..24c73bdb 100644 --- a/src/main/resources/messages_ca_CA.properties +++ b/src/main/resources/messages_ca_CA.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=No es pot reduir la funció de l'usuari actual +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=No es pot baixar la funció de l'usuari actual. Per tant, no es mostrarà l'usuari actual. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Usuari adminUserSettings.addUser=Afegir Usuari adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Rols adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Desar Usuari adminUserSettings.changeUserRole=Canvia el rol de l'usuari adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Compte bloquejat login.signinTitle=Autenticat login.ssoSignIn=Inicia sessió mitjançant l'inici de sessió ún login.oauth2AutoCreateDisabled=L'usuari de creació automàtica OAUTH2 està desactivat +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_cs_CZ.properties b/src/main/resources/messages_cs_CZ.properties index 490de1f7..bdbf6844 100644 --- a/src/main/resources/messages_cs_CZ.properties +++ b/src/main/resources/messages_cs_CZ.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Uživatel nenalezen. incorrectPasswordMessage=Současné heslo není správné. usernameExistsMessage=Nové uživatelské jméno již existuje. invalidUsernameMessage=Nesprávné uživatelské jméno, smí obsahovat pouze písmena, číslice a následující speciální znaky @._+- nebo musí být validní emailová adresa. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Nelze smazat aktuální přihlášeného uživatele. deleteUsernameExistsMessage=Uživatelské jméno neexistuje a nelze ho smazat. downgradeCurrentUserMessage=Nelze snížit roli aktuálního uživatele. +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nelze snížit roli aktuálního uživatele. Proto nebude aktuální uživatel zobrazen. userAlreadyExistsOAuthMessage=Uživatel již existuje jako OAuth2 uživatel. userAlreadyExistsWebMessage=Uživatel již existuje jako webový uživatel. @@ -177,6 +179,7 @@ adminUserSettings.user=Uživatel adminUserSettings.addUser=Přidat Nového Uživatele adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Uživatelské Jméno může obsahovat pouze písmena, čísla a následující speciální znaky @._+- nebo musí být správná emailová adresa. adminUserSettings.roles=Role adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Vynutit uživateli změnu hesla při přihlášen adminUserSettings.submit=Uložit Uživatele adminUserSettings.changeUserRole=Zmenit Roli Uživatele adminUserSettings.authenticated=Ověřeno +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Login via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_da_DK.properties b/src/main/resources/messages_da_DK.properties index d445e4ef..e86a8a1c 100644 --- a/src/main/resources/messages_da_DK.properties +++ b/src/main/resources/messages_da_DK.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr=left to right, rtl = right to left) +# the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr pdfPrompt=Vælg PDF-fil(er) @@ -55,10 +55,12 @@ userNotFoundMessage=Bruger ikke fundet. incorrectPasswordMessage=Nuværende adgangskode er forkert. usernameExistsMessage=Nyt brugernavn findes allerede. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Cannot downgrade current user's role +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Cannot downgrade current user's role. Hence, current user will not be shown. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Login via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_de_DE.properties b/src/main/resources/messages_de_DE.properties index d3f085cc..1edc764c 100644 --- a/src/main/resources/messages_de_DE.properties +++ b/src/main/resources/messages_de_DE.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Benutzer nicht gefunden. incorrectPasswordMessage=Das Passwort ist falsch. usernameExistsMessage=Neuer Benutzername existiert bereits. invalidUsernameMessage=Ungültiger Benutzername. Der Benutzername darf nur Buchstaben, Zahlen und die folgenden Sonderzeichen @._+- enthalten oder muss eine gültige E-Mail-Adresse sein. +invalidPasswordMessage=Das Passwort darf nicht leer sein und kein Leerzeichen am Anfang und Ende haben. confirmPasswordErrorMessage=„Neues Passwort“ und „Neues Passwort bestätigen“ müssen übereinstimmen. deleteCurrentUserMessage=Der aktuell angemeldete Benutzer kann nicht gelöscht werden. deleteUsernameExistsMessage=Der Benutzername existiert nicht und kann nicht gelöscht werden. downgradeCurrentUserMessage=Die Rolle des aktuellen Benutzers kann nicht herabgestuft werden +disabledCurrentUserMessage=Der aktuelle Benutzer kann nicht deaktiviert werden downgradeCurrentUserLongMessage=Die Rolle des aktuellen Benutzers kann nicht herabgestuft werden. Daher wird der aktuelle Benutzer nicht angezeigt. userAlreadyExistsOAuthMessage=Der Benutzer ist bereits als OAuth2-Benutzer vorhanden. userAlreadyExistsWebMessage=Der Benutzer ist bereits als Webbenutzer vorhanden. @@ -177,10 +179,11 @@ adminUserSettings.user=Benutzer adminUserSettings.addUser=Neuen Benutzer hinzufügen adminUserSettings.deleteUser=Benutzer löschen adminUserSettings.confirmDeleteUser=Soll der Benutzer gelöscht werden? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Der Benutzername darf nur Buchstaben, Zahlen und die folgenden Sonderzeichen @._+- enthalten oder muss eine gültige E-Mail-Adresse sein. adminUserSettings.roles=Rollen adminUserSettings.role=Rolle -adminUserSettings.actions=Aktion +adminUserSettings.actions=Aktions adminUserSettings.apiUser=Eingeschränkter API-Benutzer adminUserSettings.extraApiUser=Zusätzlicher eingeschränkter API-Benutzer adminUserSettings.webOnlyUser=Nur Web-Benutzer @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Benutzer dazu zwingen, Benutzernamen/Passwort bei adminUserSettings.submit=Benutzer speichern adminUserSettings.changeUserRole=Benutzerrolle ändern adminUserSettings.authenticated=Authentifiziert +adminUserSettings.editOwnProfil=Eigenes Profil bearbeiten +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Datenbank Import/Export @@ -481,12 +491,14 @@ login.locked=Ihr Konto wurde gesperrt. login.signinTitle=Bitte melden Sie sich an. login.ssoSignIn=Anmeldung per Single Sign-On login.oauth2AutoCreateDisabled=OAUTH2 Benutzer automatisch erstellen deaktiviert +login.oauth2AdminBlockedUser=Die Registrierung bzw. das anmelden von nicht registrierten Benutzern ist derzeit gesperrt. Bitte wenden Sie sich an den Administrator. login.oauth2RequestNotFound=Autorisierungsanfrage nicht gefunden login.oauth2InvalidUserInfoResponse=Ungültige Benutzerinformationsantwort login.oauth2invalidRequest=ungültige Anfrage login.oauth2AccessDenied=Zugriff abgelehnt login.oauth2InvalidTokenResponse=Ungültige Token-Antwort login.oauth2InvalidIdToken=Ungültiges ID-Token +login.userIsDisabled=Benutzer ist deaktiviert, die Anmeldung ist mit diesem Benutzernamen derzeit gesperrt. Bitte wenden Sie sich an den Administrator. #auto-redact diff --git a/src/main/resources/messages_el_GR.properties b/src/main/resources/messages_el_GR.properties index 22faef0e..c6a955b0 100644 --- a/src/main/resources/messages_el_GR.properties +++ b/src/main/resources/messages_el_GR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Ο χρήστης δεν βρέθηκε. incorrectPasswordMessage=Ο τρέχων κωδικός πρόσβασης είναι λανθασμένος. usernameExistsMessage=Το νέο όνομα χρήστη υπάρχει ήδη. invalidUsernameMessage=Μη έγκυρο όνομα χρήστη, όνομα χρήστη μπορεί να περιέχει μόνο γράμματα, αριθμούς και τους ακόλουθους ειδικούς χαρακτήρες @._+- ή πρέπει να είναι έγκυρη διεύθυνση email. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Δεν είναι δυνατή η διαγραφή του τρέχοντος συνδεδεμένου χρήστη. deleteUsernameExistsMessage=Το όνομα χρήστη δεν υπάρχει και δεν μπορεί να διαγραφεί. downgradeCurrentUserMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Δεν είναι δυνατή η υποβάθμιση του ρόλου του τρέχοντος χρήστη. Ως εκ τούτου, ο τρέχων χρήστης δεν θα εμφανίζεται. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Χρήστης adminUserSettings.addUser=Προσθήκη νέου Χρήστη adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Ρόλοι adminUserSettings.role=Ρόλος @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Αναγκάστε τον χρήστη να αλλ adminUserSettings.submit=Αποθήκευση Χρήστη adminUserSettings.changeUserRole=Αλλαγή ρόλου χρήστη adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Ο λογαριασμός σας έχει κλειδωθεί. login.signinTitle=Παρακαλώ, συνδεθείτε login.ssoSignIn=Σύνδεση μέσω μοναδικής σύνδεσης login.oauth2AutoCreateDisabled=Απενεργοποιήθηκε ο χρήστης αυτόματης δημιουργίας OAUTH2 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_en_GB.properties b/src/main/resources/messages_en_GB.properties index e072dc64..6ecafacc 100644 --- a/src/main/resources/messages_en_GB.properties +++ b/src/main/resources/messages_en_GB.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Cannot downgrade current user's role +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Cannot downgrade current user's role. Hence, current user will not be shown. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Login via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_en_US.properties b/src/main/resources/messages_en_US.properties index bd31c0b0..a4d8cd09 100644 --- a/src/main/resources/messages_en_US.properties +++ b/src/main/resources/messages_en_US.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Cannot downgrade current user's role +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Cannot downgrade current user's role. Hence, current user will not be shown. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Change User's Role adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Login via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User Disabled +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_es_ES.properties b/src/main/resources/messages_es_ES.properties index 30fd1194..57087bd0 100644 --- a/src/main/resources/messages_es_ES.properties +++ b/src/main/resources/messages_es_ES.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Usuario no encontrado. incorrectPasswordMessage=La contraseña actual no es correcta. usernameExistsMessage=El nuevo nombre de usuario está en uso. invalidUsernameMessage=Nombre de usuario no válido, el nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=No puede eliminar el usuario que tiene la sesión actualmente en uso. deleteUsernameExistsMessage=El usuario no existe y no puede eliminarse. downgradeCurrentUserMessage=No se puede degradar el rol del usuario actual +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=No se puede degradar el rol del usuario actual. Por lo tanto, el usuario actual no se mostrará. userAlreadyExistsOAuthMessage=La usuario ya existe como usuario de OAuth2. userAlreadyExistsWebMessage=El usuario ya existe como usuario web. @@ -177,6 +179,7 @@ adminUserSettings.user=Usuario adminUserSettings.addUser=Añadir Nuevo Usuario adminUserSettings.deleteUser=Eliminar Usuario adminUserSettings.confirmDeleteUser=¿Se debe eliminar al usuario? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=El nombre de usuario solo puede contener letras, números y los siguientes caracteres especiales @._+- o debe ser una dirección de correo electrónico válida. adminUserSettings.roles=Roles adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Forzar usuario a cambiar usuario/contraseña en el adminUserSettings.submit=Guardar Usuario adminUserSettings.changeUserRole=Cambiar rol de usuario adminUserSettings.authenticated=Autenticado +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Base de Datos Importar/Exportar @@ -481,12 +491,14 @@ login.locked=Su cuenta se ha bloqueado. login.signinTitle=Por favor, inicie sesión login.ssoSignIn=Iniciar sesión a través del inicio de sesión único login.oauth2AutoCreateDisabled=Usuario de creación automática de OAUTH2 DESACTIVADO +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Solicitud de autorización no encontrada login.oauth2InvalidUserInfoResponse=Respuesta de información de usuario no válida login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Respuesta de token no válida login.oauth2InvalidIdToken=Token de identificación no válido +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_eu_ES.properties b/src/main/resources/messages_eu_ES.properties index c87a03cd..42775ed6 100644 --- a/src/main/resources/messages_eu_ES.properties +++ b/src/main/resources/messages_eu_ES.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Ezin da uneko erabiltzailearen rola jaitsi +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Ezin da uneko erabiltzailearen rola jaitsi. Beraz, oraingo erabiltzailea ez da erakutsiko. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Erabiltzaile adminUserSettings.addUser=Erabiltzaile berria adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Rolak adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Gorde Erabiltzailea adminUserSettings.changeUserRole=Erabiltzailearen rola aldatu adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Zure kontua blokeatu egin da. login.signinTitle=Mesedez, hasi saioa login.ssoSignIn=Hasi saioa Saioa hasteko modu bakarraren bidez login.oauth2AutoCreateDisabled=OAUTH2 Sortu automatikoki erabiltzailea desgaituta dago +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_fr_FR.properties b/src/main/resources/messages_fr_FR.properties index ff199478..3062d93f 100644 --- a/src/main/resources/messages_fr_FR.properties +++ b/src/main/resources/messages_fr_FR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Utilisateur non trouvé. incorrectPasswordMessage=Le mot de passe actuel est incorrect. usernameExistsMessage=Le nouveau nom d’utilisateur existe déjà. invalidUsernameMessage=Nom d’utilisateur invalide, le nom d’utilisateur ne peut contenir que des lettres, des chiffres et les caractères spéciaux suivants @._+- ou doit être une adresse e-mail valide. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Impossible de supprimer l’utilisateur actuellement connecté. deleteUsernameExistsMessage=Le nom d’utilisateur n’existe pas et ne peut pas être supprimé. downgradeCurrentUserMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Impossible de rétrograder le rôle de l'utilisateur actuel. Par conséquent, l'utilisateur actuel ne sera pas affiché. userAlreadyExistsOAuthMessage=L'utilisateur existe déjà en tant qu'utilisateur OAuth2. userAlreadyExistsWebMessage=L'utilisateur existe déjà en tant qu'utilisateur Web. @@ -177,6 +179,7 @@ adminUserSettings.user=Utilisateur adminUserSettings.addUser=Ajouter un utilisateur adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Le nom d'utilisateur ne peut contenir que des lettres, des chiffres et les caractères spéciaux suivants @._+- ou doit être une adresse e-mail valide. adminUserSettings.roles=Rôles adminUserSettings.role=Rôle @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Forcer l’utilisateur à changer son nom d’util adminUserSettings.submit=Ajouter adminUserSettings.changeUserRole=Changer le rôle de l'utilisateur adminUserSettings.authenticated=Authentifié +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Votre compte a été verrouillé. login.signinTitle=Veuillez vous connecter login.ssoSignIn=Se connecter via l'authentification unique login.oauth2AutoCreateDisabled=OAUTH2 Création automatique d'utilisateur désactivée +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Demande d'autorisation introuvable login.oauth2InvalidUserInfoResponse=Réponse contenant les informations de l'utilisateur est invalide login.oauth2invalidRequest=Requête invalide login.oauth2AccessDenied=Accès refusé login.oauth2InvalidTokenResponse=Réponse contenant le jeton est invalide login.oauth2InvalidIdToken=Jeton d'identification invalide +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ga_IE.properties b/src/main/resources/messages_ga_IE.properties index b2422077..f5567315 100644 --- a/src/main/resources/messages_ga_IE.properties +++ b/src/main/resources/messages_ga_IE.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr=left to right, rtl = right to left) +# the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr pdfPrompt=Roghnaigh PDF(s) @@ -55,10 +55,12 @@ userNotFoundMessage=Úsáideoir gan aimsiú. incorrectPasswordMessage=Tá an pasfhocal reatha mícheart. usernameExistsMessage=Tá Ainm Úsáideora Nua ann cheana féin. invalidUsernameMessage=Ainm úsáideora neamhbhailí, ní féidir ach litreacha, uimhreacha agus na carachtair speisialta seo a leanas @._+- a bheith san ainm úsáideora nó ní mór gur seoladh ríomhphoist bailí é. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Ní mór Pasfhocal Nua agus Deimhnigh Pasfhocal Nua a bheith ag teacht leis. deleteCurrentUserMessage=Ní féidir an t-úsáideoir atá logáilte isteach faoi láthair a scriosadh. deleteUsernameExistsMessage=Níl an t-ainm úsáideora ann agus ní féidir é a scriosadh. downgradeCurrentUserMessage=Ní féidir ról an úsáideora reatha a íosghrádú +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Ní féidir ról an úsáideora reatha a íosghrádú. Mar sin, ní thaispeánfar an t-úsáideoir reatha. userAlreadyExistsOAuthMessage=Tá an t-úsáideoir ann cheana mar úsáideoir OAuth2. userAlreadyExistsWebMessage=Tá an t-úsáideoir ann cheana féin mar úsáideoir gréasáin. @@ -177,6 +179,7 @@ adminUserSettings.user=Úsáideoir adminUserSettings.addUser=Cuir Úsáideoir Nua leis adminUserSettings.deleteUser=Scrios Úsáideoir adminUserSettings.confirmDeleteUser=Ar cheart an t-úsáideoir a scriosadh? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Ní féidir ach litreacha, uimhreacha agus na carachtair speisialta seo a leanas @._+- a bheith san ainm úsáideora nó ní mór gur seoladh ríomhphoist bailí é. adminUserSettings.roles=Róil adminUserSettings.role=Ról @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Cuir iallach ar an úsáideoir pasfhocal a athrú adminUserSettings.submit=Sábháil Úsáideoir adminUserSettings.changeUserRole=Athraigh Ról an Úsáideora adminUserSettings.authenticated=Fíordheimhnithe +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Iompórtáil / Easpórtáil Bunachar Sonraí @@ -481,12 +491,14 @@ login.locked=Tá do chuntas glasáilte. login.signinTitle=Sínigh isteach le do thoil login.ssoSignIn=Logáil isteach trí Chlárú Aonair login.oauth2AutoCreateDisabled=OAUTH2 Uath-Chruthaigh Úsáideoir faoi Mhíchumas +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Níor aimsíodh iarratas údaraithe login.oauth2InvalidUserInfoResponse=Freagra Neamhbhailí Faisnéise Úsáideora login.oauth2invalidRequest=Iarratas Neamhbhailí login.oauth2AccessDenied=Rochtain Diúltaithe login.oauth2InvalidTokenResponse=Freagra Comhartha Neamhbhailí login.oauth2InvalidIdToken=Comhartha Aitheantais Neamhbhailí +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_hi_IN.properties b/src/main/resources/messages_hi_IN.properties index 88082fa3..38bf33d5 100644 --- a/src/main/resources/messages_hi_IN.properties +++ b/src/main/resources/messages_hi_IN.properties @@ -55,10 +55,12 @@ userNotFoundMessage=उपयोगकर्ता नहीं मिला। incorrectPasswordMessage=वर्तमान पासवर्ड गलत है। usernameExistsMessage=नया उपयोगकर्ता नाम पहले से मौजूद है। invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=मौजूदा यूज़र की भूमिका को डाउनग्रेड नहीं किया जा सकता। इसलिए, वर्तमान उपयोगकर्ता को नहीं दिखाया जाएगा। userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=उपयोगकर्ता adminUserSettings.addUser=नया उपयोगकर्ता जोड़ें adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=रोल्स adminUserSettings.role=रोल @@ -190,6 +193,13 @@ adminUserSettings.forceChange=उपयोगकर्ता को लॉगि adminUserSettings.submit=उपयोगकर्ता को सहेजें adminUserSettings.changeUserRole=यूज़र की भूमिका बदलें adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=आपका खाता लॉक कर दिया गया login.signinTitle=कृपया साइन इन करें login.ssoSignIn=सिंगल साइन - ऑन के ज़रिए लॉग इन करें login.oauth2AutoCreateDisabled=OAUTH2 ऑटो - क्रिएट यूज़र अक्षम किया गया +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_hr_HR.properties b/src/main/resources/messages_hr_HR.properties index 76bf2d27..e169a228 100644 --- a/src/main/resources/messages_hr_HR.properties +++ b/src/main/resources/messages_hr_HR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Korisnik nije pronađen. incorrectPasswordMessage=Kriva zaporka. usernameExistsMessage=Korisničko ime već postoji invalidUsernameMessage=Nevažeće korisničko ime, korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Nije moguće izbrisati trenutno prijavljenog korisnika. deleteUsernameExistsMessage=Korisničko ime ne postoji i ne može se izbrisati. downgradeCurrentUserMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nije moguće vratiti unazad ulogu trenutnog korisnika. Dakle, trenutni korisnik neće biti prikazan. userAlreadyExistsOAuthMessage=Korisnik već postoji kao OAuth2 korisnik. userAlreadyExistsWebMessage=Korisnik već postoji kao web korisnik. @@ -177,6 +179,7 @@ adminUserSettings.user=Korisnik adminUserSettings.addUser=Dodaj novog korisnika adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Korisničko ime može sadržavati samo slova, brojke i sljedeće posebne znakove @._+- ili mora biti važeća adresa e-pošte. adminUserSettings.roles=Uloge adminUserSettings.role=Uloga @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Prisiliti korisnika da promijeni lozinku prilikom adminUserSettings.submit=Spremi korisnika adminUserSettings.changeUserRole=Promijenite korisničku ulogu adminUserSettings.authenticated=Autentificirano +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Vaš račun je zaključan. login.signinTitle=Molimo vas da se prijavite login.ssoSignIn=Prijavite se putem jedinstvene prijave login.oauth2AutoCreateDisabled=OAUTH2 automatsko kreiranje korisnika je onemogućeno +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Zahtjev za autorizaciju nije pronađen login.oauth2InvalidUserInfoResponse=Nevažeće informacije o korisniku login.oauth2invalidRequest=Neispravan zahtjev login.oauth2AccessDenied=Pristup odbijen login.oauth2InvalidTokenResponse=Nevažeći odgovor tokena login.oauth2InvalidIdToken=Nevažeći ID token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_hu_HU.properties b/src/main/resources/messages_hu_HU.properties index a032a9ea..e74120fc 100644 --- a/src/main/resources/messages_hu_HU.properties +++ b/src/main/resources/messages_hu_HU.properties @@ -55,10 +55,12 @@ userNotFoundMessage=A felhasználó nem található. incorrectPasswordMessage=A jelenlegi jelszó helytelen. usernameExistsMessage=Az új felhasználónév már létezik. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=A jelenlegi felhasználó szerepkörét nem lehet visszaminősíteni +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Az aktuális felhasználó szerepkörét nem lehet visszaminősíteni. Ezért az aktuális felhasználó nem jelenik meg. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Felhasználó adminUserSettings.addUser=Új felhasználó hozzáadása adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Szerepek adminUserSettings.role=Szerep @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Kényszerítse a felhasználót a felhasználóné adminUserSettings.submit=Felhasználó mentése adminUserSettings.changeUserRole=Felhasználó szerepkörének módosítása adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=A fiókja zárolva lett! login.signinTitle=Kérjük, jelentkezzen be! login.ssoSignIn=Bejelentkezés egyszeri bejelentkezéssel login.oauth2AutoCreateDisabled=OAUTH2 Felhasználó automatikus létrehozása letiltva +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_id_ID.properties b/src/main/resources/messages_id_ID.properties index f081c1e3..2beee887 100644 --- a/src/main/resources/messages_id_ID.properties +++ b/src/main/resources/messages_id_ID.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Pengguna tidak ditemukan. incorrectPasswordMessage=Kata sandi saat ini salah. usernameExistsMessage=Nama pengguna baru sudah ada. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Tidak dapat menurunkan peran pengguna saat ini +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Tidak dapat menurunkan peran pengguna saat ini. Oleh karena itu, pengguna saat ini tidak akan ditampilkan. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Pengguna adminUserSettings.addUser=Tambahkan Pengguna Baru adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Peran adminUserSettings.role=Peran @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Memaksa pengguna untuk mengubah nama pengguna/kata adminUserSettings.submit=Simpan Pengguna adminUserSettings.changeUserRole=Ubah Peran Pengguna adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Akun Anda telah dikunci. login.signinTitle=Silakan masuk login.ssoSignIn=Masuk melalui Single Sign - on login.oauth2AutoCreateDisabled=OAUTH2 Buat Otomatis Pengguna Dinonaktifkan +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_it_IT.properties b/src/main/resources/messages_it_IT.properties index 56ef2a83..5d8b1eac 100644 --- a/src/main/resources/messages_it_IT.properties +++ b/src/main/resources/messages_it_IT.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Utente non trovato. incorrectPasswordMessage=La password attuale non è corretta. usernameExistsMessage=Il nuovo nome utente esiste già. invalidUsernameMessage=Nome utente non valido, il nome utente può contenere solo lettere, numeri e i seguenti caratteri speciali @._+- o deve essere un indirizzo email valido. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=La nuova password e la conferma della nuova password devono corrispondere. deleteCurrentUserMessage=Impossibile eliminare l'utente attualmente connesso. deleteUsernameExistsMessage=Il nome utente non esiste e non può essere eliminato. downgradeCurrentUserMessage=Impossibile declassare il ruolo dell'utente corrente +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Impossibile declassare il ruolo dell'utente corrente. Pertanto, l'utente corrente non verrà visualizzato. userAlreadyExistsOAuthMessage=L'utente esiste già come utente OAuth2. userAlreadyExistsWebMessage=L'utente esiste già come utente web. @@ -177,6 +179,7 @@ adminUserSettings.user=Utente adminUserSettings.addUser=Aggiungi un nuovo Utente adminUserSettings.deleteUser=Elimina utente adminUserSettings.confirmDeleteUser=L'utente deve essere eliminato? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Il nome utente può contenere solo lettere, numeri e i seguenti caratteri speciali @._+- oppure deve essere un indirizzo email valido. adminUserSettings.roles=Ruoli adminUserSettings.role=Ruolo @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Forza l'utente a cambiare nome username/password a adminUserSettings.submit=Salva utente adminUserSettings.changeUserRole=Cambia il ruolo dell'utente adminUserSettings.authenticated=Autenticato +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Importazione/Esportazione database @@ -461,9 +471,9 @@ home.BookToPDF.title=Libro in PDF home.BookToPDF.desc=Converte i formati di libri/fumetti in PDF utilizzando Calibre BookToPDF.tags=Libro,fumetto,calibre,conversione,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Rimuovi immagine +home.removeImagePdf.desc=Rimuovi le immagini dal PDF per ridurre la dimensione del file +removeImagePdf.tags=Rimuovi immagine,operazioni sulla pagina,back-end,lato server ########################### @@ -481,12 +491,14 @@ login.locked=Il tuo account è stato bloccato. login.signinTitle=Per favore accedi login.ssoSignIn=Accedi tramite Single Sign-on login.oauth2AutoCreateDisabled=Creazione automatica utente OAUTH2 DISABILITATA +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Richiesta di autorizzazione non trovata login.oauth2InvalidUserInfoResponse=Risposta relativa alle informazioni utente non valida login.oauth2invalidRequest=Richiesta non valida login.oauth2AccessDenied=Accesso negato login.oauth2InvalidTokenResponse=Risposta token non valida login.oauth2InvalidIdToken=Id Token non valido +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact @@ -1132,7 +1144,7 @@ error.discordSubmit=Discord: invia post di supporto #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image +removeImage.title=Rimuovere immagine +removeImage.header=Rimuovi immagine +removeImage.removeImage=Rimuovi immagine +removeImage.submit=Rimuovi immagine diff --git a/src/main/resources/messages_ja_JP.properties b/src/main/resources/messages_ja_JP.properties index 3ba7ed9c..afaf0d80 100644 --- a/src/main/resources/messages_ja_JP.properties +++ b/src/main/resources/messages_ja_JP.properties @@ -55,10 +55,12 @@ userNotFoundMessage=ユーザーが見つかりません。 incorrectPasswordMessage=現在のパスワードが正しくありません。 usernameExistsMessage=新しいユーザー名はすでに存在します。 invalidUsernameMessage=ユーザー名が無効です。ユーザー名には文字、数字、およびそれに続く特殊文字 @._+- のみを含めることができます。または、有効な電子メール アドレスである必要があります。 +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=新しいパスワードと新しいパスワードの確認は一致する必要があります。 deleteCurrentUserMessage=現在ログインしているユーザーは削除できません。 deleteUsernameExistsMessage=そのユーザー名は存在しないため削除できません。 downgradeCurrentUserMessage=現在のユーザーの役割をダウングレードできません +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=現在のユーザーの役割をダウングレードできません。したがって、現在のユーザーは表示されません。 userAlreadyExistsOAuthMessage=ユーザーは既にOAuth2ユーザーとして存在します。 userAlreadyExistsWebMessage=ユーザーは既にWebユーザーとして存在します。 @@ -107,7 +109,7 @@ pipelineOptions.validateButton=検証 ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=お気に入り navbar.darkmode=ダークモード navbar.language=言語 navbar.settings=設定 @@ -177,6 +179,7 @@ adminUserSettings.user=ユーザー adminUserSettings.addUser=新しいユーザを追加 adminUserSettings.deleteUser=ユーザの削除 adminUserSettings.confirmDeleteUser=ユーザを本当に削除しますか? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=ユーザー名には、文字、数字、および次の特殊文字 @._+- のみを含めることができます。または、有効な電子メール アドレスである必要があります。 adminUserSettings.roles=役割 adminUserSettings.role=役割 @@ -190,23 +193,30 @@ adminUserSettings.forceChange=ログイン時にユーザー名/パスワード adminUserSettings.submit=ユーザーの保存 adminUserSettings.changeUserRole=ユーザーの役割を変更する adminUserSettings.authenticated=認証済 +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=データベースのインポート/エクスポート +database.header=データベースのインポート/エクスポート +database.fileName=ファイル名 +database.creationDate=作成日 +database.fileSize=ファイルサイズ +database.deleteBackupFile=バックアップファイルの削除 +database.importBackupFile=バックアップファイルをインポート +database.downloadBackupFile=バックアップファイルをダウンロード +database.info_1=データをインポートする際には、正しい構造を確保することが極めて重要です。不明な点がある場合は、専門家のアドバイスやサポートを受けてください。構造上のエラーは、アプリケーションの誤動作を引き起こす可能性があります。 +database.info_2=ファイル名はアップロード時には関係ありません。アップロード後にbackup_user_yyyyMMddHHmm.sqlという形式にリネームされ、一貫した命名規則が保証されます。 +database.submit=バックアップをインポート +database.importIntoDatabaseSuccessed=データベースへのインポートに成功 +database.fileNotFound=ファイルが見つかりません +database.fileNullOrEmpty=ファイルは null または空であってはなりません +database.failedImportFile=ファイルのインポートに失敗 ############# # HOME-PAGE # @@ -461,8 +471,8 @@ home.BookToPDF.title=PDFを書籍に変換 home.BookToPDF.desc=calibreを使用してPDFを書籍/コミック形式に変換します BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size +home.removeImagePdf.title=画像の削除 +home.removeImagePdf.desc=PDFから画像を削除してファイルサイズを小さくします removeImagePdf.tags=Remove Image,Page operations,Back end,server side @@ -481,12 +491,14 @@ login.locked=あなたのアカウントはロックされています。 login.signinTitle=サインインしてください login.ssoSignIn=シングルサインオンでログイン login.oauth2AutoCreateDisabled=OAuth 2自動作成ユーザーが無効 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=認証リクエストが見つかりません login.oauth2InvalidUserInfoResponse=無効なユーザー情報の応答 login.oauth2invalidRequest=無効なリクエスト login.oauth2AccessDenied=アクセス拒否 login.oauth2InvalidTokenResponse=無効なトークン応答 login.oauth2InvalidIdToken=無効なIDトークン +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact @@ -1132,7 +1144,7 @@ error.discordSubmit=Discord - サポート投稿を提出 #remove-image -removeImage.title=Remove image -removeImage.header=Remove image -removeImage.removeImage=Remove image -removeImage.submit=Remove image +removeImage.title=画像の削除 +removeImage.header=画像の削除 +removeImage.removeImage=画像の削除 +removeImage.submit=画像を削除 diff --git a/src/main/resources/messages_ko_KR.properties b/src/main/resources/messages_ko_KR.properties index a382f9d3..aaa68fba 100644 --- a/src/main/resources/messages_ko_KR.properties +++ b/src/main/resources/messages_ko_KR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=사용자를 찾을 수 없습니다. incorrectPasswordMessage=현재 비밀번호가 틀립니다. usernameExistsMessage=새 사용자명이 이미 존재합니다. invalidUsernameMessage=잘못된 사용자 이름입니다. 사용자 이름에는 문자, 숫자 및 다음 특수 문자(@._+-)만 포함할 수 있거나 유효한 이메일 주소여야 합니다. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=현재 로그인한 사용자를 삭제할 수 없습니다. deleteUsernameExistsMessage=사용자 이름이 존재하지 않으며 삭제할 수 없습니다. downgradeCurrentUserMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다 +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=현재 사용자의 역할을 다운그레이드할 수 없습니다. 따라서 현재 사용자는 표시되지 않습니다. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=사용자 adminUserSettings.addUser=새 사용자 추가 adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=사용자 이름은 문자, 숫자, 특수 문자 @._+-만 포함할 수 있으며 유효한 이메일 주소여야 합니다. adminUserSettings.roles=역할 adminUserSettings.role=역할 @@ -190,6 +193,13 @@ adminUserSettings.forceChange=다음 로그인 때 사용자명과 비밀번호 adminUserSettings.submit=사용자 저장 adminUserSettings.changeUserRole=사용자의 역할 변경 adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=계정이 잠겼습니다. login.signinTitle=로그인해 주세요. login.ssoSignIn=싱글사인온을 통한 로그인 login.oauth2AutoCreateDisabled=OAUTH2 사용자 자동 생성 비활성화됨 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_nl_NL.properties b/src/main/resources/messages_nl_NL.properties index 30396fda..a77e861b 100644 --- a/src/main/resources/messages_nl_NL.properties +++ b/src/main/resources/messages_nl_NL.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Gebruiker niet gevonden. incorrectPasswordMessage=Huidige wachtwoord is onjuist. usernameExistsMessage=Nieuwe gebruikersnaam bestaat al. invalidUsernameMessage=Ongeldige gebruikersnaam, gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Nieuw wachtwoord en bevestig wachtwoord moeten overeenkomen. deleteCurrentUserMessage=Kan niet een momenteel ingelogde gebruiker verwijderen. deleteUsernameExistsMessage=De gebruikersnaam bestaat niet en kan niet verwijderd worden. downgradeCurrentUserMessage=Kan de rol van de huidige gebruiker niet downgraden +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Kan de rol van de huidige gebruiker niet downgraden. Huidige gebruiker wordt dus niet weergegeven. userAlreadyExistsOAuthMessage=De gebruiker bestaat al als een OAuth2 gebruiker. userAlreadyExistsWebMessage=De gebruiker bestaat al als een web gebruiker. @@ -177,6 +179,7 @@ adminUserSettings.user=Gebruiker adminUserSettings.addUser=Voeg nieuwe gebruiker toe adminUserSettings.deleteUser=Verwijder gebruiker adminUserSettings.confirmDeleteUser=Moet deze gebruiker verwijderd worden? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Gebruikersnaam kan alleen letters, nummers en de volgende speciale tekens @._+- bevatten of moet een geldig emailadres zijn. adminUserSettings.roles=Rollen adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Forceer gebruiker om gebruikersnaam/wachtwoord te adminUserSettings.submit=Gebruiker opslaan adminUserSettings.changeUserRole=De rol van de gebruiker wijzigen adminUserSettings.authenticated=Geauthenticeerd +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Je account is geblokkeerd. login.signinTitle=Gelieve in te loggen login.ssoSignIn=Inloggen via Single Sign-on login.oauth2AutoCreateDisabled=OAUTH2 Automatisch aanmaken gebruiker uitgeschakeld +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Autorisatieverzoek niet gevonden login.oauth2InvalidUserInfoResponse=Ongeldige reactie op gebruikersinfo login.oauth2invalidRequest=Ongeldig verzoek login.oauth2AccessDenied=Toegang geweigerd login.oauth2InvalidTokenResponse=Ongeldige tokenreactie login.oauth2InvalidIdToken=Ongeldige ID token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_no_NB.properties b/src/main/resources/messages_no_NB.properties index 41f1870a..b4dcc466 100644 --- a/src/main/resources/messages_no_NB.properties +++ b/src/main/resources/messages_no_NB.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Bruker ikke funnet. incorrectPasswordMessage=Nåværende passord er feil. usernameExistsMessage=Det nye brukernavnet eksisterer allerede. invalidUsernameMessage=Ugyldig brukernavn, brukernavnet kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Nytt passord og Bekreft nytt passord må være like. deleteCurrentUserMessage=Kan ikke slette den innloggede brukeren. deleteUsernameExistsMessage=Brukernavnet eksisterer ikke og kan ikke slettes. downgradeCurrentUserMessage=Kan ikke nedgradere den innloggede brukerens rolle. +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Kan ikke nedgradere den innloggede brukerens rolle. Derfor vil ikke den innloggede brukeren bli vist. userAlreadyExistsOAuthMessage=Brukeren eksisterer allerede som en OAuth2-bruker. userAlreadyExistsWebMessage=Brukeren eksisterer allerede som en web-bruker. @@ -177,6 +179,7 @@ adminUserSettings.user=Bruker adminUserSettings.addUser=Legg til Ny Bruker adminUserSettings.deleteUser=Slett Bruker adminUserSettings.confirmDeleteUser=Skal brukeren slettes? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Brukernavn kan bare inneholde bokstaver, tall og følgende spesialtegn @._+- eller må være en gyldig e-postadresse. adminUserSettings.roles=Roller adminUserSettings.role=Rolle @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Tving bruker til å endre passord ved innlogging adminUserSettings.submit=Lagre Bruker adminUserSettings.changeUserRole=Endre Brukerens Rolle adminUserSettings.authenticated=Autentisert +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Eksport @@ -481,12 +491,14 @@ login.locked=Kontoen din har blitt låst. login.signinTitle=Vennligst logg inn login.ssoSignIn=Logg inn via Enkel Pålogging login.oauth2AutoCreateDisabled=OAUTH2 Auto-Opretting av bruker deaktivert +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Autentiseringsforespørsel ikke funnet login.oauth2InvalidUserInfoResponse=Ugyldig brukerinforespons login.oauth2invalidRequest=Ugyldig forespørsel login.oauth2AccessDenied=Tilgang nektet login.oauth2InvalidTokenResponse=Ugyldig tokenrespons login.oauth2InvalidIdToken=Ugyldig Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_pl_PL.properties b/src/main/resources/messages_pl_PL.properties index 55ce74f9..8958e6d0 100755 --- a/src/main/resources/messages_pl_PL.properties +++ b/src/main/resources/messages_pl_PL.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Brak użytkownika. incorrectPasswordMessage=Nieprawidłowe hasło. usernameExistsMessage=Taki uzytkownik już istnieje. invalidUsernameMessage=Niewłaściwa nazwa użytkownika - musi zawierać litery, cyfry i @._+- LUB być adresem email. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Wpisz poprawnie hasło w OBA pola. deleteCurrentUserMessage=Nie można usunąć zalogowanego użytkownika deleteUsernameExistsMessage=Nie można usunąć zalogowanego użytkownika downgradeCurrentUserMessage=Nie można obniżyć roli bieżącego użytkownika +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nie można obniżyć roli bieżącego użytkownika. W związku z tym bieżący użytkownik nie zostanie wyświetlony. userAlreadyExistsOAuthMessage=Takie konto użytkownika istnieje - stworzone za pomocą OAuth2. userAlreadyExistsWebMessage=Takie konto użytkownika istnieje - stworzone za pomocą przeglądarki. @@ -177,6 +179,7 @@ adminUserSettings.user=Użytkownik adminUserSettings.addUser=Dodaj nowego użytkownika adminUserSettings.deleteUser=Usuń użytkownika adminUserSettings.confirmDeleteUser=Czy na pewno usunąć użytkownika? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Niewłaściwa nazwa użytkownika - musi zawierać litery, cyfry i @._+- LUB być adresem email. adminUserSettings.roles=Role adminUserSettings.role=Rola @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Wymuś zmianę hasło po zalogowaniu adminUserSettings.submit=Zapisz użytkownika adminUserSettings.changeUserRole=Zmień rolę użytkownika adminUserSettings.authenticated=Zalogowany +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Import/Eksport bazy danych @@ -481,12 +491,14 @@ login.locked=Konto jest zablokowane login.signinTitle=Zaloguj się login.ssoSignIn=Zaloguj się za pomocą logowania jednokrotnego login.oauth2AutoCreateDisabled=Wyłączono automatyczne tworzenie użytkownika OAUTH2 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Błąd logowania OAuth2 login.oauth2InvalidUserInfoResponse=Niewłaściwe dane logowania login.oauth2invalidRequest=Nieprawidłowe żądanie login.oauth2AccessDenied=Brak dostępu login.oauth2InvalidTokenResponse=Nieprawidłowa odpowiedź na token login.oauth2InvalidIdToken=Nieprawidłowa wartość tokenu +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_pt_BR.properties b/src/main/resources/messages_pt_BR.properties index da82be3e..cda5cc43 100644 --- a/src/main/resources/messages_pt_BR.properties +++ b/src/main/resources/messages_pt_BR.properties @@ -11,17 +11,17 @@ imgPrompt=Selecione a(s) imagem(ns) genericSubmit=Enviar processTimeWarning=Aviso: esse processo pode levar até um minuto, dependendo do tamanho do arquivo pageOrderPrompt=Ordem das páginas (digite uma lista separada por vírgulas de números de página): -pageSelectionPrompt=Custom Page Selection (Enter a comma-separated list of page numbers 1,5,6 or Functions like 2n+1) : +pageSelectionPrompt=Seleção de página personalizada (Insira uma lista separada por vírgulas de números de página 1,5,6 ou funções como 2n+1) : goToPage=Ir true=Verdadeiro false=Falso unknown=Desconhecido save=Salvar -saveToBrowser=Save to Browser +saveToBrowser=Salvar no navegador close=Fechar filesSelected=arquivos selecionados noFavourites=Nenhum favorito adicionado -downloadComplete=Download Complete +downloadComplete=Download finalizado bored=Entediado esperando? alphabet=Alfabeto downloadPdf=baixar PDF @@ -34,43 +34,45 @@ sizes.medium=Médio sizes.large=Grande sizes.x-large=Muito grande error.pdfPassword=O documento PDF está protegido por senha e a senha não foi fornecida ou está incorreta -delete=Delete -username=Username -password=Password -welcome=Welcome -property=Property -black=Black -white=White -red=Red -green=Green -blue=Blue -custom=Custom... -WorkInProgess=Work in progress, May not work or be buggy, Please report any problems! -poweredBy=Powered by -yes=Yes -no=No -changedCredsMessage=Credentials changed! -notAuthenticatedMessage=User not authenticated. -userNotFoundMessage=User not found. -incorrectPasswordMessage=Current password is incorrect. -usernameExistsMessage=New Username already exists. -invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -confirmPasswordErrorMessage=New Password and Confirm New Password must match. -deleteCurrentUserMessage=Cannot delete currently logged in user. -deleteUsernameExistsMessage=The username does not exist and cannot be deleted. +delete=apagar +username=Usuário +password=Senha +welcome=Bem vindo +property=Propriedade +black=Preto +white=Branco +red=Vermelho +green=Verde +blue=Azul +custom=Personalizado... +WorkInProgess=Em progesso, Talvez não funcione ou apresente erros, Por favor, reporte qualquer problema! +poweredBy=Distribuído por +yes=Sim +no=Não +changedCredsMessage=Credenciais alteradas! +notAuthenticatedMessage=Usuário não autenticado. +userNotFoundMessage=Usuário não encontrado. +incorrectPasswordMessage=A senha atual está incorreta. +usernameExistsMessage=Novo Usuário já existe. +invalidUsernameMessage=Usuário inválido, nome de usuário só pode incluir letras, números e os seguintes caracteres especiais @._+- ou deve ser um email válido. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. +confirmPasswordErrorMessage=Nova Senha e Confirmar Nova Senha devem ser iguais. +deleteCurrentUserMessage=Não é possível apagar o usuário da sessão atual. +deleteUsernameExistsMessage=O usuário não existe e não pode ser apagado. downgradeCurrentUserMessage=Não é possível fazer downgrade da função do usuário atual +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Não é possível fazer downgrade da função do usuário atual. Portanto, o usuário atual não será mostrado. -userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. -userAlreadyExistsWebMessage=The user already exists as an web user. -error=Error +userAlreadyExistsOAuthMessage=O usuário já existe como um usuário OAuth2. +userAlreadyExistsWebMessage=O usuário já existe como um usuário web. +error=Erro oops=Oops! -help=Help -goHomepage=Go to Homepage -joinDiscord=Join our Discord server -seeDockerHub=See Docker Hub -visitGithub=Visit Github Repository -donate=Donate -color=Color +help=Ajuda +goHomepage=Ir para página inicial +joinDiscord=Entre em nosso servidor do Discord +seeDockerHub=Veja nosso Docker Hub +visitGithub=Visite o repositório no Github +donate=Doar +color=Cor sponsor=Sponsor info=Info @@ -79,27 +81,27 @@ info=Info ############### # Pipeline # ############### -pipeline.header=Pipeline Menu (Beta) -pipeline.uploadButton=Upload Custom -pipeline.configureButton=Configure -pipeline.defaultOption=Custom -pipeline.submitButton=Submit -pipeline.help=Pipeline Help -pipeline.scanHelp=Folder Scanning Help -pipeline.deletePrompt=Are you sure you want to delete pipeline +pipeline.header=Menu de Pipeline (Beta) +pipeline.uploadButton=Enviar personalizado +pipeline.configureButton=Configurar +pipeline.defaultOption=Personalizado +pipeline.submitButton=Enviar +pipeline.help=Ajuda de Pipeline +pipeline.scanHelp=Ajuda de verificação de pasta +pipeline.deletePrompt=Tem certeza que deseja deletar a pipeline ###################### # Pipeline Options # ###################### -pipelineOptions.header=Pipeline Configuration -pipelineOptions.pipelineNameLabel=Pipeline Name -pipelineOptions.saveSettings=Save Operation Settings -pipelineOptions.pipelineNamePrompt=Enter pipeline name here -pipelineOptions.selectOperation=Select Operation -pipelineOptions.addOperationButton=Add operation +pipelineOptions.header=Configurações de Pipeline +pipelineOptions.pipelineNameLabel=Nome da Pipeline +pipelineOptions.saveSettings=Salvar configurações de operação +pipelineOptions.pipelineNamePrompt=Insira o nome da pipeline aqui +pipelineOptions.selectOperation=Selecionar operação +pipelineOptions.addOperationButton=Adicionar operação pipelineOptions.pipelineHeader=Pipeline: pipelineOptions.saveButton=Download -pipelineOptions.validateButton=Validate +pipelineOptions.validateButton=Validar @@ -107,117 +109,125 @@ pipelineOptions.validateButton=Validate ############# # NAVBAR # ############# -navbar.favorite=Favorites +navbar.favorite=Favoritos navbar.darkmode=Modo Escuro -navbar.language=Languages +navbar.language=Idiomas navbar.settings=Configurações -navbar.allTools=Tools -navbar.multiTool=Multi Tools -navbar.sections.organize=Organize -navbar.sections.convertTo=Convert to PDF -navbar.sections.convertFrom=Convert from PDF -navbar.sections.security=Sign & Security -navbar.sections.advance=Advanced -navbar.sections.edit=View & Edit +navbar.allTools=Ferramentas +navbar.multiTool=Multiferramentas +navbar.sections.organize=Organizar +navbar.sections.convertTo=Converter para PDF +navbar.sections.convertFrom=Converter de PDF +navbar.sections.security=Assinatura & Segurança +navbar.sections.advance=Avançado +navbar.sections.edit=Visualizar & Editar ############# # SETTINGS # ############# settings.title=Configurações settings.update=Atualização disponível -settings.updateAvailable={0} is the current installed version. A new version ({1}) is available. +settings.updateAvailable={0} é a versão instalada. Uma nova versão ({1}) está disponível. settings.appVersion=Versão do aplicativo: settings.downloadOption.title=Escolha a opção de download (para downloads não compactados de arquivo único): settings.downloadOption.1=Abrir na mesma janela settings.downloadOption.2=Abrir em nova janela settings.downloadOption.3=⇬ Fazer download do arquivo settings.zipThreshold=Compactar arquivos quando o número de arquivos baixados exceder -settings.signOut=Sign Out -settings.accountSettings=Account Settings -settings.bored.help=Enables easter egg game -settings.cacheInputs.name=Save form inputs -settings.cacheInputs.help=Enable to store previously used inputs for future runs +settings.signOut=Encerrar sessão +settings.accountSettings=Configurações de conta +settings.bored.help=Habilitar nomes de easter egg +settings.cacheInputs.name=Salvar campos do formulário +settings.cacheInputs.help=Habilitar salvar campos utilizados anteriormenta para ações futuras -changeCreds.title=Change Credentials -changeCreds.header=Update Your Account Details -changeCreds.changePassword=You are using default login credentials. Please enter a new password -changeCreds.newUsername=New Username -changeCreds.oldPassword=Current Password -changeCreds.newPassword=New Password -changeCreds.confirmNewPassword=Confirm New Password -changeCreds.submit=Submit Changes +changeCreds.title=Alterar credenciais +changeCreds.header=Atualizar detalhes da sua conta +changeCreds.changePassword=Você está usando as credenciais padrões. Por favor, insira uma nova senha +changeCreds.newUsername=Novo usuário +changeCreds.oldPassword=Senha atual +changeCreds.newPassword=Nova senha +changeCreds.confirmNewPassword=Confirmar nova senha +changeCreds.submit=Enviar alterações -account.title=Account Settings -account.accountSettings=Account Settings -account.adminSettings=Admin Settings - View and Add Users -account.userControlSettings=User Control Settings -account.changeUsername=Change Username -account.newUsername=New Username +account.title=Configurações da conta +account.accountSettings=Configurações da conta +account.adminSettings=Configurações administrativas - Visualizar e adicionar usuários +account.userControlSettings=Configurações de controle de usuário +account.changeUsername=Alterar nome de usuário +account.newUsername=Novo usuário account.password=Confirmation Password -account.oldPassword=Old password -account.newPassword=New Password -account.changePassword=Change Password -account.confirmNewPassword=Confirm New Password -account.signOut=Sign Out -account.yourApiKey=Your API Key -account.syncTitle=Sync browser settings with Account -account.settingsCompare=Settings Comparison: -account.property=Property -account.webBrowserSettings=Web Browser Setting -account.syncToBrowser=Sync Account -> Browser -account.syncToAccount=Sync Account <- Browser +account.oldPassword=Senha antiga +account.newPassword=Nova senha +account.changePassword=Alterar senha +account.confirmNewPassword=Confirmar nova senha +account.signOut=Encerrar sessão +account.yourApiKey=Insira sua chave de API +account.syncTitle=Sincronizar configurações do navegador com a conta +account.settingsCompare=Comparação de configurações: +account.property=Propriedade +account.webBrowserSettings=Configurações do navegador +account.syncToBrowser=Sincronizar conta -> Navegador +account.syncToAccount=Sincronizar conta <- Navegador -adminUserSettings.title=User Control Settings -adminUserSettings.header=Admin User Control Settings -adminUserSettings.admin=Admin -adminUserSettings.user=User -adminUserSettings.addUser=Add New User -adminUserSettings.deleteUser=Delete User -adminUserSettings.confirmDeleteUser=Should the user be deleted? -adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. -adminUserSettings.roles=Roles -adminUserSettings.role=Role -adminUserSettings.actions=Actions -adminUserSettings.apiUser=Limited API User -adminUserSettings.extraApiUser=Additional Limited API User -adminUserSettings.webOnlyUser=Web Only User -adminUserSettings.demoUser=Demo User (No custom settings) -adminUserSettings.internalApiUser=Internal API User -adminUserSettings.forceChange=Force user to change password on login -adminUserSettings.submit=Save User +adminUserSettings.title=Configurações de controle de usuário +adminUserSettings.header=Configurações de controle de usuário administrador +adminUserSettings.admin=Administrador +adminUserSettings.user=Usuário +adminUserSettings.addUser=Adicionar novo usuário +adminUserSettings.deleteUser=Apagar usuário +adminUserSettings.confirmDeleteUser=O usuário deve ser apagado? +adminUserSettings.usernameInfo=Nome de usuário só pode incluir letras, números e os seguintes caracteres especiais @._+- ou deve ser um email válido. +adminUserSettings.roles=Funções +adminUserSettings.role=Função +adminUserSettings.actions=Ações +adminUserSettings.apiUser=Usuário de API limitado +adminUserSettings.extraApiUser=Usuário de API limitado adicional +adminUserSettings.webOnlyUser=Usuário apenas web +adminUserSettings.demoUser=Usuário demo (Sem configurações personalizadas) +adminUserSettings.internalApiUser=Usuário interno de API +adminUserSettings.forceChange=Forçar usuário a trocar a senha ao iniciar sessão +adminUserSettings.submit=Salvar usuário adminUserSettings.changeUserRole=Alterar Função de Usuário -adminUserSettings.authenticated=Authenticated +adminUserSettings.authenticated=Autenticado +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request -database.title=Database Import/Export -database.header=Database Import/Export -database.fileName=File Name -database.creationDate=Creation Date -database.fileSize=File Size -database.deleteBackupFile=Delete Backup File -database.importBackupFile=Import Backup File -database.downloadBackupFile=Download Backup File -database.info_1=When importing data, it is crucial to ensure the correct structure. If you are unsure of what you are doing, seek advice and support from a professional. An error in the structure can cause application malfunctions, up to and including the complete inability to run the application. -database.info_2=The file name does not matter when uploading. It will be renamed afterward to follow the format backup_user_yyyyMMddHHmm.sql, ensuring a consistent naming convention. -database.submit=Import Backup -database.importIntoDatabaseSuccessed=Import into database successed -database.fileNotFound=File not Found -database.fileNullOrEmpty=File must not be null or empty -database.failedImportFile=Failed Import File +database.title=Importar/Exportar banco de dados +database.header=Importar/Exportar banco de dados +database.fileName=Nome do arquivo +database.creationDate=Data de criação +database.fileSize=Tamanho do arquivo +database.deleteBackupFile=Apagar arquivo de backup +database.importBackupFile=Importar arquivo de backup +database.downloadBackupFile=Baixar arquivo de backup +database.info_1=Ao importar dados, é crucial garantir a estrutura correta. Se você não tem certeza do que está fazendo procure auxílio de um profissional. Um erro na estrutura pode ocasionar em mau funcionamento da aplicação, incluindo a possibilidade de perda total da aplicação. +database.info_2=O nome do arquivo não importa ao enviar. Ele será renomeado em seguida para seguir o formato backup_user_yyyyMMddHHmm.sql, garantindo uma convenção de nomes coerente. +database.submit=Importar Backup +database.importIntoDatabaseSuccessed=Importação para o banco de dados bem sucedida +database.fileNotFound=Arquivo não encontrado +database.fileNullOrEmpty=O arquivo não estar nulo ou vazio +database.failedImportFile=Falha ao importar arquivo + ############# # HOME-PAGE # ############# home.desc=Seu melhor utilitário para suas necessidades de PDF. -home.searchBar=Search for features... +home.searchBar=Procurar funcionalidades... -home.viewPdf.title=View PDF -home.viewPdf.desc=View, annotate, add text or images -viewPdf.tags=view,read,annotate,text,image +home.viewPdf.title=Visualizar PDF +home.viewPdf.desc=Visualize, anote, adicione textos ou imagens +viewPdf.tags=visualize,leia,anote,texto,imagem home.multiTool.title=Multiferramenta de PDF home.multiTool.desc=Mesclar, girar, reorganizar e remover páginas @@ -341,9 +351,9 @@ home.removeBlanks.title=Remover Páginas em Branco home.removeBlanks.desc=Detectar e remover páginas em branco de um documento removeBlanks.tags=limpeza,otimização,sem-conteúdo,organizar -home.removeAnnotations.title=Remove Annotations -home.removeAnnotations.desc=Removes all comments/annotations from a PDF -removeAnnotations.tags=comments,highlight,notes,markup,remove +home.removeAnnotations.title=Remover anotações +home.removeAnnotations.desc=Remover todos os comentários/anotações de um PDF +removeAnnotations.tags=comentários,destaque,notas,markup,remover home.compare.title=Comparar home.compare.desc=Comparar e mostrar as diferenças entre 2 documentos PDF @@ -353,9 +363,9 @@ home.certSign.title=Assinar com Certificado home.certSign.desc=Assinar um PDF com um Certificado/Chave (PEM/P12) certSign.tags=autenticar,PEM,P12,oficial,criptografar -home.removeCertSign.title=Remove Certificate Sign -home.removeCertSign.desc=Remove certificate signature from PDF -removeCertSign.tags=authenticate,PEM,P12,official,decrypt +home.removeCertSign.title=Remover Certificado de assinatura +home.removeCertSign.desc=Remove o certificado de assinatura de um PDF +removeCertSign.tags=autenticar,PEM,P12,oficial,descriptografar home.pageLayout.title=Layout de Múltiplas Páginas home.pageLayout.desc=Mesclar várias páginas de um documento PDF em uma única página @@ -426,44 +436,44 @@ home.showJS.title=Mostrar Javascript home.showJS.desc=Procura e exibe qualquer JavaScript injetado em um PDF showJS.tags=JavaScript -home.autoRedact.title=Auto Redact -home.autoRedact.desc=Auto Redacts(Blacks out) text in a PDF based on input text -autoRedact.tags=Redact,Hide,black out,black,marker,hidden +home.autoRedact.title=Edição automática +home.autoRedact.desc=Edita automaticamente(marca em preto) um texto em um PDF baseado no texto de entrada +autoRedact.tags=redigir,esconder,escurer,preto,marcador,oculto -home.tableExtraxt.title=PDF to CSV -home.tableExtraxt.desc=Extracts Tables from a PDF converting it to CSV -tableExtraxt.tags=CSV,Table Extraction,extract,convert +home.tableExtraxt.title=PDF para CSV +home.tableExtraxt.desc=Extrai tabelas de um PDF convertendo em CSV +tableExtraxt.tags=CSV,extração de tabela,extração,conversão -home.autoSizeSplitPDF.title=Auto Split by Size/Count -home.autoSizeSplitPDF.desc=Split a single PDF into multiple documents based on size, page count, or document count -autoSizeSplitPDF.tags=pdf,split,document,organization +home.autoSizeSplitPDF.title=Separar automaticamente por tamanho/quantidade +home.autoSizeSplitPDF.desc=Separa um único PDF em múltiplos documentos baseado no tamanho, quantidade de páginas, ou contagem de documentos +autoSizeSplitPDF.tags=pdf,separar,documento,organização -home.overlay-pdfs.title=Overlay PDFs -home.overlay-pdfs.desc=Overlays PDFs on-top of another PDF -overlay-pdfs.tags=Overlay +home.overlay-pdfs.title=Sobrepor PDFs +home.overlay-pdfs.desc=Sobrepõe PDFs em cima de outro PDF +overlay-pdfs.tags=sobrepor -home.split-by-sections.title=Split PDF by Sections -home.split-by-sections.desc=Divide each page of a PDF into smaller horizontal and vertical sections -split-by-sections.tags=Section Split, Divide, Customize +home.split-by-sections.title=Separar PDF por seções +home.split-by-sections.desc=Separa cada página de um pdf em seções verticais ou horizontais menores +split-by-sections.tags=Separação de sessão, separar, customizar -home.AddStampRequest.title=Add Stamp to PDF -home.AddStampRequest.desc=Add text or add image stamps at set locations -AddStampRequest.tags=Stamp, Add image, center image, Watermark, PDF, Embed, Customize +home.AddStampRequest.title=Adicionar carimbo ao PDF +home.AddStampRequest.desc=Adiciona um texto ou imagem como carimbo em locais definidos +AddStampRequest.tags=Carimbo, Adicionar image, centralizar imagem, marca d'agua, PDF, Incorporar, customizar -home.PDFToBook.title=PDF to Book -home.PDFToBook.desc=Converts PDF to Book/Comic formats using calibre -PDFToBook.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.PDFToBook.title=PDF para Livro +home.PDFToBook.desc=Converte PDF para formatos de Livros/Quadrinhos utilizando calibre +PDFToBook.tags=Livro,Quadrinho,Calibre,Converter,manga,amazon,kindle home.BookToPDF.title=Book to PDF -home.BookToPDF.desc=Converts Books/Comics formats to PDF using calibre -BookToPDF.tags=Book,Comic,Calibre,Convert,manga,amazon,kindle +home.BookToPDF.desc=Converte formatos de Livros/Quadrinhos para PDF utilizando calibre +BookToPDF.tags=Livro,Quadrinho,Calibre,Converter,manga,amazon,kindle -home.removeImagePdf.title=Remove image -home.removeImagePdf.desc=Remove image from PDF to reduce file size -removeImagePdf.tags=Remove Image,Page operations,Back end,server side +home.removeImagePdf.title=Remover imagem +home.removeImagePdf.desc=Remove uma imagem de um PDF para reduzir o tamanho do arquivo +removeImagePdf.tags=Remover imagem,Operações de página,Back end,server side ########################### @@ -472,34 +482,37 @@ removeImagePdf.tags=Remove Image,Page operations,Back end,server side # # ########################### #login -login.title=Sign in -login.header=Sign in -login.signin=Sign in -login.rememberme=Remember me -login.invalid=Invalid username or password. -login.locked=Your account has been locked. -login.signinTitle=Please sign in +login.title=Iniciar sessão +login.header=Iniciar sessão +login.signin=Iniciar sessão +login.rememberme=Lembrar de mim +login.invalid=Usuário ou senha inválidos. +login.locked=Sua conta foi bloqueada. +login.signinTitle=Por favor, inicie a sessão login.ssoSignIn=Iniciar sessão através de início de sessão único -login.oauth2AutoCreateDisabled=OAUTH2 Auto-Criar Usuário Desativado -login.oauth2RequestNotFound=Authorization request not found -login.oauth2InvalidUserInfoResponse=Invalid User Info Response -login.oauth2invalidRequest=Invalid Request -login.oauth2AccessDenied=Access Denied -login.oauth2InvalidTokenResponse=Invalid Token Response -login.oauth2InvalidIdToken=Invalid Id Token +login.oauth2AutoCreateDisabled=Auto-Criar Usuário OAUTH2 Desativado +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. +login.oauth2RequestNotFound=Solicitação de autorização não encontrada +login.oauth2InvalidUserInfoResponse=Resposta de informação de usuário inválida +login.oauth2invalidRequest=Requisição inválida +login.oauth2AccessDenied=Acesso negado +login.oauth2InvalidTokenResponse=Resposta de token inválida +login.oauth2InvalidIdToken=Id de token inválido +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. + #auto-redact -autoRedact.title=Auto Redact -autoRedact.header=Auto Redact -autoRedact.colorLabel=Colour -autoRedact.textsToRedactLabel=Text to Redact (line-separated) -autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret -autoRedact.useRegexLabel=Use Regex -autoRedact.wholeWordSearchLabel=Whole Word Search -autoRedact.customPaddingLabel=Custom Extra Padding -autoRedact.convertPDFToImageLabel=Convert PDF to PDF-Image (Used to remove text behind the box) -autoRedact.submitButton=Submit +autoRedact.title=Edição Automática +autoRedact.header=Edição Automática +autoRedact.colorLabel=Cor +autoRedact.textsToRedactLabel=Texto para editar (separado por linhas) +autoRedact.textsToRedactPlaceholder=exemplo: \nConfidencial \nSecreto +autoRedact.useRegexLabel=Usar Regex (Expressões regulares) +autoRedact.wholeWordSearchLabel=Pesquisa de palavras inteiras +autoRedact.customPaddingLabel=Padding extra personalizado +autoRedact.convertPDFToImageLabel=Converter PDF para PDF-Imagem (usado para remover texto atrás de caixas) +autoRedact.submitButton=Enviar #showJS @@ -519,14 +532,14 @@ pdfToSinglePage.submit=Converter para Página Única pageExtracter.title=Extrair Páginas pageExtracter.header=Extrair Páginas pageExtracter.submit=Extrair -pageExtracter.placeholder=(e.g. 1,2,8 or 4,7,12-16 or 2n-1) +pageExtracter.placeholder=(exemplo: 1,2,8 ou 4,7,12-16 ou 2n-1) #getPdfInfo getPdfInfo.title=Obter Informações do PDF getPdfInfo.header=Obter Informações do PDF getPdfInfo.submit=Obter Informações -getPdfInfo.downloadJson=Download JSON +getPdfInfo.downloadJson=Baixar JSON #markdown-to-pdf @@ -551,37 +564,37 @@ HTMLToPDF.header=HTML para PDF HTMLToPDF.help=Aceita arquivos HTML e ZIPs contendo html/css/imagens etc necessários HTMLToPDF.submit=Converter HTMLToPDF.credit=Usa o WeasyPrint -HTMLToPDF.zoom=Zoom level for displaying the website. -HTMLToPDF.pageWidth=Width of the page in centimeters. (Blank to default) -HTMLToPDF.pageHeight=Height of the page in centimeters. (Blank to default) -HTMLToPDF.marginTop=Top margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginBottom=Bottom margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginLeft=Left margin of the page in millimeters. (Blank to default) -HTMLToPDF.marginRight=Right margin of the page in millimeters. (Blank to default) -HTMLToPDF.printBackground=Render the background of websites. -HTMLToPDF.defaultHeader=Enable Default Header (Name and page number) -HTMLToPDF.cssMediaType=Change the CSS media type of the page. -HTMLToPDF.none=None -HTMLToPDF.print=Print -HTMLToPDF.screen=Screen +HTMLToPDF.zoom=Nível de zoom para exibição do site. +HTMLToPDF.pageWidth=Largura da página em centímetros. (Vazio por padrão) +HTMLToPDF.pageHeight=Altura da página em centímetros. (Vazio por padrão) +HTMLToPDF.marginTop=Margem superior da página em milímetros. (Vazio por padrão) +HTMLToPDF.marginBottom=Margem inferior da página em milímetros. (Vazio por padrão) +HTMLToPDF.marginLeft=Margem esquerda da página em milímetros. (Vazio por padrão) +HTMLToPDF.marginRight=Margem direita da página em milímetros. (Vazio por padrão) +HTMLToPDF.printBackground=Renderize o plano de fundo dos websites. +HTMLToPDF.defaultHeader=Habilitar cabeçalho padrão (Nome e número da página) +HTMLToPDF.cssMediaType=Altera o tipo da mídia CSS da página. +HTMLToPDF.none=Nenhum +HTMLToPDF.print=Imprimir +HTMLToPDF.screen=Tela #AddStampRequest -AddStampRequest.header=Stamp PDF -AddStampRequest.title=Stamp PDF -AddStampRequest.stampType=Stamp Type -AddStampRequest.stampText=Stamp Text -AddStampRequest.stampImage=Stamp Image -AddStampRequest.alphabet=Alphabet -AddStampRequest.fontSize=Font/Image Size -AddStampRequest.rotation=Rotation -AddStampRequest.opacity=Opacity -AddStampRequest.position=Position -AddStampRequest.overrideX=Override X Coordinate -AddStampRequest.overrideY=Override Y Coordinate -AddStampRequest.customMargin=Custom Margin -AddStampRequest.customColor=Custom Text Color -AddStampRequest.submit=Submit +AddStampRequest.header=Carimbar PDF +AddStampRequest.title=Carimbar PDF +AddStampRequest.stampType=Tipo de carimbo +AddStampRequest.stampText=Texto do carimbo +AddStampRequest.stampImage=Imagem do carimbo +AddStampRequest.alphabet=Alfabeto +AddStampRequest.fontSize=Fonte/Tamanho da imagem +AddStampRequest.rotation=Rotação +AddStampRequest.opacity=Opacidade +AddStampRequest.position=Posição +AddStampRequest.overrideX=Sobrescrever cordenada X +AddStampRequest.overrideY=Sobrescrever cordenada Y +AddStampRequest.customMargin=Margem personalizada +AddStampRequest.customColor=Cor de texto personalizada +AddStampRequest.submit=Carimbar #sanitizePDF @@ -605,15 +618,15 @@ addPageNumbers.selectText.4=Número Inicial addPageNumbers.selectText.5=Páginas a Numerar addPageNumbers.selectText.6=Texto Personalizado addPageNumbers.customTextDesc=Custom Text -addPageNumbers.numberPagesDesc=Which pages to number, default 'all', also accepts 1-5 or 2,5,9 etc -addPageNumbers.customNumberDesc=Defaults to {n}, also accepts 'Page {n} of {total}', 'Text-{n}', '{filename}-{n} +addPageNumbers.numberPagesDesc=Quais páginas devem ser numeradas, o padrão é 'all', também aceita 1-5 ou 2,5,9 etc +addPageNumbers.customNumberDesc=O padrão é {n}, também aceita 'Page {n} of {total}', 'Text-{n}', '{filename}-{n}. addPageNumbers.submit=Adicionar Números de Página #auto-rename -auto-rename.title=Rename Automático -auto-rename.header=Rename Automático de PDF -auto-rename.submit=Rename Automático +auto-rename.title=Renomear Automaticamente +auto-rename.header=Renomear Automaticamente o PDF +auto-rename.submit=Renomear Automaticamente #adjustContrast @@ -654,7 +667,7 @@ pipeline.title=Pipeline pageLayout.title=Layout de Múltiplas Páginas pageLayout.header=Layout de Múltiplas Páginas pageLayout.pagesPerSheet=Páginas por folha: -pageLayout.addBorder=Add Borders +pageLayout.addBorder=Adicionar bordas pageLayout.submit=Enviar diff --git a/src/main/resources/messages_pt_PT.properties b/src/main/resources/messages_pt_PT.properties index 512ba300..82d2721c 100644 --- a/src/main/resources/messages_pt_PT.properties +++ b/src/main/resources/messages_pt_PT.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Utilizador inexistente. incorrectPasswordMessage=Senha incorreta. usernameExistsMessage=Esse utilizador já existe. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Não é possível fazer downgrade da função do utilizador atual +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Não é possível fazer downgrade da função do utilizador atual. Portanto, o utilizador atual não será mostrado. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Alterar usuário adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=A sua conta foi bloqueada. login.signinTitle=Introduza os seus dados de acesso login.ssoSignIn=Iniciar sessão através de início de sessão único login.oauth2AutoCreateDisabled=OAUTH2 Criação Automática de Utilizador Desativada +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ro_RO.properties b/src/main/resources/messages_ro_RO.properties index 421efcfd..83d43c1d 100644 --- a/src/main/resources/messages_ro_RO.properties +++ b/src/main/resources/messages_ro_RO.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Rolul utilizatorului curent nu poate fi retrogradat +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Rolul utilizatorului curent nu poate fi retrogradat. Prin urmare, utilizatorul curent nu va fi afișat. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Schimbați rolul utilizatorului adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Conectare prin conectare unică login.oauth2AutoCreateDisabled=OAUTH2 Creare automată utilizator dezactivată +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_ru_RU.properties b/src/main/resources/messages_ru_RU.properties index 2f42ced2..4ffd0751 100644 --- a/src/main/resources/messages_ru_RU.properties +++ b/src/main/resources/messages_ru_RU.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Пользователь не найден. incorrectPasswordMessage=Текущий пароль неверен. usernameExistsMessage=Новое имя пользователя уже существует. invalidUsernameMessage=Неверное имя пользователя. Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Невозможно удалить пользователя, вошедшего в систему. deleteUsernameExistsMessage=Имя пользователя не существует и не может быть удалено. downgradeCurrentUserMessage=Невозможно понизить роль текущего пользователя +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Невозможно понизить роль текущего пользователя. Следовательно, текущий пользователь не будет отображаться. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Пользователь adminUserSettings.addUser=Добавить нового пользователя adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Имя пользователя может содержать только буквы, цифры и следующие специальные символы @._+- или должно быть действительным адресом электронной почты. adminUserSettings.roles=Роли adminUserSettings.role=Роль @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Просить пользователя измен adminUserSettings.submit=Сохранить пользователя adminUserSettings.changeUserRole=Изменить роль пользователя adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Ваша учетная запись заблокирована. login.signinTitle=Пожалуйста, войдите login.ssoSignIn=Вход через единый вход login.oauth2AutoCreateDisabled=OAUTH2 Автоматическое создание пользователя отключено +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_sk_SK.properties b/src/main/resources/messages_sk_SK.properties index 43ce8c67..80ed3079 100644 --- a/src/main/resources/messages_sk_SK.properties +++ b/src/main/resources/messages_sk_SK.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Používateľ nebol nájdený. incorrectPasswordMessage=Aktuálne heslo je nesprávne. usernameExistsMessage=Nové používateľské meno už existuje. invalidUsernameMessage=Neplatné používateľské meno, používateľské meno musí obsahovať len abecedné znaky a čísla. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Nie je možné zmazať aktuálne prihláseného používateľa. deleteUsernameExistsMessage=Používateľské meno neexistuje a nemôže byť zmazané. downgradeCurrentUserMessage=Nie je možné znížiť rolu aktuálneho používateľa +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nie je možné znížiť rolu aktuálneho používateľa. Preto, aktuálny používateľ nebude zobrazený. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Používateľ adminUserSettings.addUser=Pridať nového používateľa adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Používateľské meno musí obsahovať iba písmená a čísla, žiadne medzery alebo špeciálne znaky. adminUserSettings.roles=Role adminUserSettings.role=Rola @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Donútiť používateľa zmeniť heslo pri prihlá adminUserSettings.submit=Uložiť používateľa adminUserSettings.changeUserRole=Zmeniť rolu používateľa adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Váš účet bol uzamknutý. login.signinTitle=Prosím, prihláste sa login.ssoSignIn=Prihlásiť sa cez Single Sign-on login.oauth2AutoCreateDisabled=Vytváranie používateľa cez OAUTH2 je zakázané +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_sr_LATN_RS.properties b/src/main/resources/messages_sr_LATN_RS.properties index 6147c20b..0bb09c90 100644 --- a/src/main/resources/messages_sr_LATN_RS.properties +++ b/src/main/resources/messages_sr_LATN_RS.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Korisnik nije pronađen. incorrectPasswordMessage=Trenutna šifra je netačna. usernameExistsMessage=Novi korisnik već postoji invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Nije moguće degradirati ulogu trenutnog korisnika +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Nije moguće unazaditi ulogu trenutnog korisnika. Dakle, trenutni korisnik neće biti prikazan. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Korisnik adminUserSettings.addUser=Dodaj novog korisnika adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Uloge adminUserSettings.role=Uloga @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Prisili korisnika da promeni korisničko ime/lozin adminUserSettings.submit=Sačuvaj korisnika adminUserSettings.changeUserRole=Promenite ulogu korisnika adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Vaš nalog je zaključan. login.signinTitle=Molimo vas da se prijavite login.ssoSignIn=Prijavite se putem jedinstvene prijave login.oauth2AutoCreateDisabled=OAUTH2 automatsko kreiranje korisnika je onemogućeno +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_sv_SE.properties b/src/main/resources/messages_sv_SE.properties index 3fe4c0e9..a4a24f72 100644 --- a/src/main/resources/messages_sv_SE.properties +++ b/src/main/resources/messages_sv_SE.properties @@ -55,10 +55,12 @@ userNotFoundMessage=User not found. incorrectPasswordMessage=Current password is incorrect. usernameExistsMessage=New Username already exists. invalidUsernameMessage=Invalid username, username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Cannot delete currently logged in user. deleteUsernameExistsMessage=The username does not exist and cannot be deleted. downgradeCurrentUserMessage=Kan inte nedgradera nuvarande användares roll +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Kan inte nedgradera nuvarande användares roll. Därför kommer den aktuella användaren inte att visas. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=User adminUserSettings.addUser=Add New User adminUserSettings.deleteUser=Delete User adminUserSettings.confirmDeleteUser=Should the user be deleted? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Username can only contain letters, numbers and the following special characters @._+- or must be a valid email address. adminUserSettings.roles=Roles adminUserSettings.role=Role @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Force user to change password on login adminUserSettings.submit=Save User adminUserSettings.changeUserRole=Ändra användarens roll adminUserSettings.authenticated=Authenticated +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Your account has been locked. login.signinTitle=Please sign in login.ssoSignIn=Logga in via enkel inloggning login.oauth2AutoCreateDisabled=OAUTH2 Auto-Create User inaktiverad +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Authorization request not found login.oauth2InvalidUserInfoResponse=Invalid User Info Response login.oauth2invalidRequest=Invalid Request login.oauth2AccessDenied=Access Denied login.oauth2InvalidTokenResponse=Invalid Token Response login.oauth2InvalidIdToken=Invalid Id Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_th_TH.properties b/src/main/resources/messages_th_TH.properties index c38234e1..33cbd7ff 100644 --- a/src/main/resources/messages_th_TH.properties +++ b/src/main/resources/messages_th_TH.properties @@ -55,10 +55,12 @@ userNotFoundMessage=ไม่พบผู้ใช้ incorrectPasswordMessage=รหัสผ่านปัจจุบันไม่ถูกต้อง usernameExistsMessage=ชื่อผู้ใช้ใหม่มีอยู่แล้ว invalidUsernameMessage=ชื่อผู้ใช้ไม่ถูกต้อง ชื่อผู้ใช้สามารถประกอบด้วยตัวอักษร ตัวเลข และอักขระพิเศษต่อไปนี้ @._+- หรือจะต้องเป็นที่อยู่อีเมลที่ถูกต้อง +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=รหัสผ่านใหม่และยืนยันรหัสผ่านใหม่ต้องตรงกัน deleteCurrentUserMessage=ไม่สามารถลบผู้ใช้ที่เข้าสู่ระบบในปัจจุบันได้ deleteUsernameExistsMessage=ชื่อผู้ใช้ไม่ปรากฏและไม่สามารถลบได้ downgradeCurrentUserMessage=ไม่สามารถลดระดับบทบาทของผู้ใช้ปัจจุบันได้ +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=ไม่สามารถลดระดับบทบาทของผู้ใช้ปัจจุบันได้ ดังนั้นผู้ใช้ปัจจุบันจะไม่ปรากฏ userAlreadyExistsOAuthMessage=ผู้ใช้มีอยู่แล้วในฐานะผู้ใช้ OAuth2 userAlreadyExistsWebMessage=ผู้ใช้มีอยู่แล้วในฐานะผู้ใช้เว็บ @@ -177,6 +179,7 @@ adminUserSettings.user=ผู้ใช้ adminUserSettings.addUser=เพิ่มผู้ใช้ใหม่ adminUserSettings.deleteUser=ลบผู้ใช้ adminUserSettings.confirmDeleteUser=ควรลบผู้ใช้นี้หรือไม่? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=ชื่อผู้ใช้สามารถประกอบด้วยตัวอักษร ตัวเลข และอักขระพิเศษต่อไปนี้ @._+- หรือจะต้องเป็นที่อยู่อีเมลที่ถูกต้อง adminUserSettings.roles=บทบาท adminUserSettings.role=บทบาท @@ -190,6 +193,13 @@ adminUserSettings.forceChange=บังคับให้ผู้ใช้เ adminUserSettings.submit=บันทึกผู้ใช้ adminUserSettings.changeUserRole=เปลี่ยนบทบาทของผู้ใช้ adminUserSettings.authenticated=ได้รับการยืนยันแล้ว +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=การนำเข้า/ส่งออกฐานข้อมูล @@ -481,12 +491,14 @@ login.locked=บัญชีของคุณถูกล็อค login.signinTitle=กรุณาลงชื่อเข้าใช้ login.ssoSignIn=เข้าสู่ระบบด้วย Single Sign-on login.oauth2AutoCreateDisabled=การสร้างผู้ใช้ OAuth2 อัตโนมัติถูกปิดใช้งาน +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=ไม่พบคำขอการอนุญาต login.oauth2InvalidUserInfoResponse=การตอบกลับข้อมูลผู้ใช้ไม่ถูกต้อง login.oauth2invalidRequest=คำขอไม่ถูกต้อง login.oauth2AccessDenied=การเข้าถึงถูกปฏิเสธ login.oauth2InvalidTokenResponse=การตอบกลับโทเค็นไม่ถูกต้อง login.oauth2InvalidIdToken=โทเค็น Id ไม่ถูกต้อง +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_tr_TR.properties b/src/main/resources/messages_tr_TR.properties index 6a03d547..b87f611f 100644 --- a/src/main/resources/messages_tr_TR.properties +++ b/src/main/resources/messages_tr_TR.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Kullanıcı bulunamadı. incorrectPasswordMessage=Mevcut şifre yanlış. usernameExistsMessage=Yeni Kullanıcı Adı zaten var. invalidUsernameMessage=Geçersiz kullanıcı adı, kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Yeni Şifre ve Yeni Şifreyi Onayla eşleşmelidir. deleteCurrentUserMessage=Şu anda oturum açmış olan kullanıcı silinemiyor. deleteUsernameExistsMessage=Kullanıcı adı mevcut değil ve silinemez. downgradeCurrentUserMessage=Mevcut kullanıcının rolü düşürülemiyor +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Mevcut kullanıcının rolü düşürülemiyor. Bu nedenle, mevcut kullanıcı gösterilmeyecektir. userAlreadyExistsOAuthMessage=Kullanıcı zaten bir OAuth2 kullanıcısı olarak mevcut. userAlreadyExistsWebMessage=Kullanıcı zaten bir web kullanıcısı olarak mevcut. @@ -177,6 +179,7 @@ adminUserSettings.user=Kullanıcı adminUserSettings.addUser=Yeni Kullanıcı Ekle adminUserSettings.deleteUser=Kullanıcı Sil adminUserSettings.confirmDeleteUser=Kullanıcı silinsin mi? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Kullanıcı adı yalnızca harf, rakam ve aşağıdaki özel karakterleri @._+- içerebilir veya geçerli bir e-posta adresi olmalıdır. adminUserSettings.roles=Roller adminUserSettings.role=Rol @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Kullanıcının girişte kullanıcı adı/şifre d adminUserSettings.submit=Kullanıcıyı Kaydet adminUserSettings.changeUserRole=Kullanıcı rolünü değiştir adminUserSettings.authenticated=Onaylandı +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Veri Tabanını İçe/Dışa Aktar @@ -481,12 +491,14 @@ login.locked=Hesabınız kilitlendi. login.signinTitle=Lütfen giriş yapınız. login.ssoSignIn=Tek Oturum Açma ile Giriş Yap login.oauth2AutoCreateDisabled=OAUTH2 Otomatik Oluşturma Kullanıcı Devre Dışı Bırakıldı +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Yetkilendirme isteği bulunamadı login.oauth2InvalidUserInfoResponse=Geçersiz Kullanıcı Bilgisi Yanıtı login.oauth2invalidRequest=Geçersiz İstek login.oauth2AccessDenied=Erişim Reddedildi login.oauth2InvalidTokenResponse=Geçersiz Belirteç Yanıtı login.oauth2InvalidIdToken=Geçersiz Kimlik Belirteci +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_uk_UA.properties b/src/main/resources/messages_uk_UA.properties index 6e601195..a9df1da4 100644 --- a/src/main/resources/messages_uk_UA.properties +++ b/src/main/resources/messages_uk_UA.properties @@ -55,10 +55,12 @@ userNotFoundMessage=Користувача не знайдено. incorrectPasswordMessage=Поточний пароль невірний. usernameExistsMessage=Нове ім'я користувача вже існує. invalidUsernameMessage=Недійсне ім’я користувача, ім’я користувача може містити лише літери, цифри та наступні спеціальні символи @._+- або має бути дійсною електронною адресою. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=New Password and Confirm New Password must match. deleteCurrentUserMessage=Неможливо видалити користувача, який увійшов в систему. deleteUsernameExistsMessage=Ім'я користувача не існує і не може бути видалено. downgradeCurrentUserMessage=Неможливо понизити роль поточного користувача +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Неможливо понизити роль поточного користувача. Отже, поточний користувач не відображатиметься. userAlreadyExistsOAuthMessage=The user already exists as an OAuth2 user. userAlreadyExistsWebMessage=The user already exists as an web user. @@ -177,6 +179,7 @@ adminUserSettings.user=Користувач adminUserSettings.addUser=Додати нового користувача adminUserSettings.deleteUser=Видалити користувача adminUserSettings.confirmDeleteUser=Видалити цього користувача? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Ім’я користувача може містити лише літери, цифри та наступні спеціальні символи @._+- або має бути дійсною електронною адресою. adminUserSettings.roles=Ролі adminUserSettings.role=Роль @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Примусити користувача змін adminUserSettings.submit=Зберегти користувача adminUserSettings.changeUserRole=Змінити роль користувача adminUserSettings.authenticated=Автентифіковано +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Database Import/Export @@ -481,12 +491,14 @@ login.locked=Ваш обліковий запис заблоковано. login.signinTitle=Будь ласка, увійдіть login.ssoSignIn=Увійти через єдиний вхід login.oauth2AutoCreateDisabled=Автоматичне створення користувача OAUTH2 ВИМКНЕНО +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Запит на авторизація не знайдено login.oauth2InvalidUserInfoResponse=Недійсна відповідь з інформацією користувача login.oauth2invalidRequest=Недійсний запит login.oauth2AccessDenied=Доступ заблоковано login.oauth2InvalidTokenResponse=Недійсна відповідь з токеном login.oauth2InvalidIdToken=Недійсний Id токен +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_vi_VN.properties b/src/main/resources/messages_vi_VN.properties index b6234488..b8f1eb09 100644 --- a/src/main/resources/messages_vi_VN.properties +++ b/src/main/resources/messages_vi_VN.properties @@ -1,7 +1,7 @@ ########### # Generic # ########### -# the direction that the language is written (ltr=left to right, rtl = right to left) +# the direction that the language is written (ltr = left to right, rtl = right to left) language.direction=ltr pdfPrompt=Chọn (các) tệp PDF @@ -55,10 +55,12 @@ userNotFoundMessage=Không tìm thấy người dùng. incorrectPasswordMessage=Mật khẩu hiện tại không chính xác. usernameExistsMessage=Tên người dùng mới đã tồn tại. invalidUsernameMessage=Tên người dùng không hợp lệ, tên người dùng chỉ có thể chứa chữ cái, số và các ký tự đặc biệt sau @._+- hoặc phải là một địa chỉ email hợp lệ. +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=Mật khẩu mới và Xác nhận mật khẩu mới phải khớp nhau. deleteCurrentUserMessage=Không thể xóa người dùng đang đăng nhập. deleteUsernameExistsMessage=Tên người dùng không tồn tại và không thể bị xóa. downgradeCurrentUserMessage=Không thể hạ cấp vai trò của người dùng hiện tại +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=Không thể hạ cấp vai trò của người dùng hiện tại. Do đó, người dùng hiện tại sẽ không được hiển thị. userAlreadyExistsOAuthMessage=Người dùng đã tồn tại dưới dạng người dùng OAuth2. userAlreadyExistsWebMessage=Người dùng đã tồn tại dưới dạng người dùng web. @@ -177,6 +179,7 @@ adminUserSettings.user=Người dùng adminUserSettings.addUser=Thêm người dùng mới adminUserSettings.deleteUser=Xóa người dùng adminUserSettings.confirmDeleteUser=Bạn có muốn xóa người dùng không? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=Tên người dùng chỉ có thể chứa chữ cái, số và các ký tự đặc biệt sau @._+- hoặc phải là một địa chỉ email hợp lệ. adminUserSettings.roles=Vai trò adminUserSettings.role=Vai trò @@ -190,6 +193,13 @@ adminUserSettings.forceChange=Buộc người dùng thay đổi mật khẩu khi adminUserSettings.submit=Lưu người dùng adminUserSettings.changeUserRole=Thay đổi vai trò của người dùng adminUserSettings.authenticated=Đã xác thực +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=Nhập/Xuất cơ sở dữ liệu @@ -481,12 +491,14 @@ login.locked=Tài khoản của bạn đã bị khóa. login.signinTitle=Vui lòng đăng nhập login.ssoSignIn=Đăng nhập qua Single Sign-on login.oauth2AutoCreateDisabled=Tự động tạo người dùng OAUTH2 bị vô hiệu hóa +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=Không tìm thấy yêu cầu ủy quyền login.oauth2InvalidUserInfoResponse=Phản hồi thông tin người dùng không hợp lệ login.oauth2invalidRequest=Yêu cầu không hợp lệ login.oauth2AccessDenied=Truy cập bị từ chối login.oauth2InvalidTokenResponse=Phản hồi token không hợp lệ login.oauth2InvalidIdToken=Id Token không hợp lệ +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_zh_CN.properties b/src/main/resources/messages_zh_CN.properties index 690c8e05..918576ff 100644 --- a/src/main/resources/messages_zh_CN.properties +++ b/src/main/resources/messages_zh_CN.properties @@ -55,10 +55,12 @@ userNotFoundMessage=未找到用户。 incorrectPasswordMessage=当前密码不正确。 usernameExistsMessage=新用户名已存在。 invalidUsernameMessage=用户名无效,用户名只能包含字母、数字和以下特殊字符@._+- 或必须是有效的电子邮件地址。 +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=两次密码不一致。 deleteCurrentUserMessage=无法删除当前登录的用户。 deleteUsernameExistsMessage=用户名不存在,无法删除。 downgradeCurrentUserMessage=无法降级当前用户的角色 +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=无法降级当前用户的角色。因此,当前用户将不会显示。 userAlreadyExistsOAuthMessage=该用户已作为OAuth2用户存在。 userAlreadyExistsWebMessage=该用户已作为Web用户存在。 @@ -177,6 +179,7 @@ adminUserSettings.user=用户 adminUserSettings.addUser=添加新用户 adminUserSettings.deleteUser=删除用户 adminUserSettings.confirmDeleteUser=确认删除该用户? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=用户名只能包含字母、数字和以下特殊字符@._+-,或者必须是有效的电子邮件地址。 adminUserSettings.roles=角色 adminUserSettings.role=角色 @@ -190,6 +193,13 @@ adminUserSettings.forceChange=强制用户在登录时更改用户名/密码 adminUserSettings.submit=保存用户 adminUserSettings.changeUserRole=更改用户角色 adminUserSettings.authenticated=已验证 +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=数据库 导入/导出 @@ -481,12 +491,14 @@ login.locked=您的账户已被锁定。 login.signinTitle=请登录 login.ssoSignIn=通过单点登录登录 login.oauth2AutoCreateDisabled=OAuth2自动创建用户已禁用 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=找不到验证请求 login.oauth2InvalidUserInfoResponse=无效的用户信息响应 login.oauth2invalidRequest=无效请求 login.oauth2AccessDenied=拒绝访问 login.oauth2InvalidTokenResponse=无效的Token响应 login.oauth2InvalidIdToken=无效的Token +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/messages_zh_TW.properties b/src/main/resources/messages_zh_TW.properties index b2e9acea..9d158144 100644 --- a/src/main/resources/messages_zh_TW.properties +++ b/src/main/resources/messages_zh_TW.properties @@ -55,10 +55,12 @@ userNotFoundMessage=找不到使用者。 incorrectPasswordMessage=目前密碼不正確。 usernameExistsMessage=新使用者名稱已存在。 invalidUsernameMessage=使用者名稱無效,使用者名稱只能包含字母、數字和以下特殊字元 @._+- 或必須是有效的電子郵件地址。 +invalidPasswordMessage=The password must not be empty and must not have spaces at the beginning or end. confirmPasswordErrorMessage=輸入的密碼必需和確認密碼相同。 deleteCurrentUserMessage=無法刪除目前登錄的使用者。 deleteUsernameExistsMessage=使用者名不存在,無法刪除。 downgradeCurrentUserMessage=無法降級目前使用者的角色 +disabledCurrentUserMessage=The current user cannot be disabled downgradeCurrentUserLongMessage=無法降級目前使用者的角色。因此,不會顯示目前的使用者。 userAlreadyExistsOAuthMessage=該使用者已於 OAuth2 註冊。 userAlreadyExistsWebMessage=該使用者已於網頁註冊。 @@ -177,6 +179,7 @@ adminUserSettings.user=使用者 adminUserSettings.addUser=新增使用者 adminUserSettings.deleteUser=刪除使用者 adminUserSettings.confirmDeleteUser=確認刪除該使用者? +adminUserSettings.confirmChangeUserStatus=Should the user be disabled/enabled? adminUserSettings.usernameInfo=使用者名稱只能包含字母、數字和以下特殊字元 @._+-,或必須是有效的電子郵件地址。 adminUserSettings.roles=角色 adminUserSettings.role=角色 @@ -190,6 +193,13 @@ adminUserSettings.forceChange=強制使用者在登入時修改使用者名稱/ adminUserSettings.submit=儲存 adminUserSettings.changeUserRole=更改使用者身份 adminUserSettings.authenticated=已驗證 +adminUserSettings.editOwnProfil=Edit own profile +adminUserSettings.enabledUser=enabled user +adminUserSettings.disabledUser=disabled user +adminUserSettings.activeUsers=Active Users: +adminUserSettings.disabledUsers=Disabled Users: +adminUserSettings.totalUsers=Total Users: +adminUserSettings.lastRequest=Last Request database.title=資料庫匯入/匯出 @@ -481,12 +491,14 @@ login.locked=你的帳戶已被鎖定。 login.signinTitle=請登入 login.ssoSignIn=透過織網單一簽入 login.oauth2AutoCreateDisabled=OAuth 2.0 自動建立使用者已停用 +login.oauth2AdminBlockedUser=Registration or logging in of non-registered users is currently blocked. Please contact the administrator. login.oauth2RequestNotFound=找不到驗證請求 login.oauth2InvalidUserInfoResponse=無效的使用者資訊回應 login.oauth2invalidRequest=無效的回應 login.oauth2AccessDenied=存取被拒 login.oauth2InvalidTokenResponse=無效的 Token 回應 login.oauth2InvalidIdToken=無效的 Tokne +login.userIsDisabled=User is deactivated, login is currently blocked with this username. Please contact the administrator. #auto-redact diff --git a/src/main/resources/settings.yml.template b/src/main/resources/settings.yml.template index 86d88ea1..d139e712 100644 --- a/src/main/resources/settings.yml.template +++ b/src/main/resources/settings.yml.template @@ -43,6 +43,7 @@ security: clientId: '' # Client ID from your provider clientSecret: '' # Client Secret from your provider autoCreateUser: false # set to 'true' to allow auto-creation of non-existing users + blockRegistration: false # set to 'true' to deny login with SSO without prior registration by an admin useAsUsername: email # Default is 'email'; custom fields can be used as the username scopes: openid, profile, email # Specify the scopes for which the application will request permissions provider: google # Set this to your OAuth provider's name, e.g., 'google' or 'keycloak' @@ -54,6 +55,7 @@ system: showUpdate: false # see when a new update is available showUpdateOnlyAdmin: false # Only admins can see when a new update is available, depending on showUpdate it must be set to 'true' customHTMLFiles: false # enable to have files placed in /customFiles/templates override the existing template html files + tessdataDir: /usr/share/tessdata # Path to the directory containing the Tessdata files. This setting is relevant for Windows systems. For Windows users, this path should be adjusted to point to the appropriate directory where the Tessdata files are stored. ui: appName: '' # Application's visible name @@ -69,4 +71,4 @@ metrics: # Automatically Generated Settings (Do Not Edit Directly) AutomaticallyGenerated: - key: example \ No newline at end of file + key: example diff --git a/src/main/resources/static/3rdPartyLicenses.json b/src/main/resources/static/3rdPartyLicenses.json index 44c9bbdb..575edcc3 100644 --- a/src/main/resources/static/3rdPartyLicenses.json +++ b/src/main/resources/static/3rdPartyLicenses.json @@ -3,21 +3,21 @@ { "moduleName": "ch.qos.logback:logback-classic", "moduleUrl": "http://www.qos.ch", - "moduleVersion": "1.5.6", + "moduleVersion": "1.5.7", "moduleLicense": "GNU Lesser General Public License", "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" }, { "moduleName": "ch.qos.logback:logback-core", "moduleUrl": "http://www.qos.ch", - "moduleVersion": "1.5.6", + "moduleVersion": "1.5.7", "moduleLicense": "GNU Lesser General Public License", "moduleLicenseUrl": "http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html" }, { "moduleName": "com.bucket4j:bucket4j_jdk17-core", "moduleUrl": "http://github.com/bucket4j/bucket4j/bucket4j_jdk17-core", - "moduleVersion": "8.12.1", + "moduleVersion": "8.13.1", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0" }, @@ -194,13 +194,13 @@ }, { "moduleName": "com.twelvemonkeys.imageio:imageio-batik", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, { "moduleName": "com.twelvemonkeys.imageio:imageio-bmp", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, @@ -224,13 +224,13 @@ }, { "moduleName": "com.twelvemonkeys.imageio:imageio-tiff", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, { "moduleName": "com.twelvemonkeys.imageio:imageio-webp", - "moduleVersion": "3.10.1", + "moduleVersion": "3.11.0", "moduleLicense": "The BSD License", "moduleLicenseUrl": "https://github.com/haraldk/TwelveMonkeys#license" }, @@ -272,7 +272,7 @@ { "moduleName": "io.github.pixee:java-security-toolkit", "moduleUrl": "https://github.com/pixee/java-security-toolkit", - "moduleVersion": "1.1.3", + "moduleVersion": "1.2.0", "moduleLicense": "MIT License", "moduleLicenseUrl": "http://www.opensource.org/licenses/mit-license.php" }, @@ -286,7 +286,7 @@ { "moduleName": "io.micrometer:micrometer-core", "moduleUrl": "https://github.com/micrometer-metrics/micrometer", - "moduleVersion": "1.13.0", + "moduleVersion": "1.13.3", "moduleLicense": "The Apache Software License, Version 2.0", "moduleLicenseUrl": "http://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -485,28 +485,34 @@ { "moduleName": "org.apache.pdfbox:fontbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.2", + "moduleVersion": "3.0.3", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, + { + "moduleName": "org.apache.pdfbox:jbig2-imageio", + "moduleVersion": "3.0.4", + "moduleLicense": "Apache License, Version 2.0", + "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" + }, { "moduleName": "org.apache.pdfbox:pdfbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.2", + "moduleVersion": "3.0.3", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:pdfbox-io", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.2", + "moduleVersion": "3.0.3", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, { "moduleName": "org.apache.pdfbox:xmpbox", "moduleUrl": "https://pdfbox.apache.org", - "moduleVersion": "3.0.2", + "moduleVersion": "3.0.3", "moduleLicense": "Apache-2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0.txt" }, @@ -790,7 +796,7 @@ { "moduleName": "org.hdrhistogram:HdrHistogram", "moduleUrl": "http://hdrhistogram.github.io/HdrHistogram/", - "moduleVersion": "2.2.1", + "moduleVersion": "2.2.2", "moduleLicense": "Public Domain, per Creative Commons CC0", "moduleLicenseUrl": "http://creativecommons.org/publicdomain/zero/1.0/" }, @@ -1137,7 +1143,7 @@ { "moduleName": "org.springframework:spring-webmvc", "moduleUrl": "https://github.com/spring-projects/spring-framework", - "moduleVersion": "6.1.9", + "moduleVersion": "6.1.12", "moduleLicense": "Apache License, Version 2.0", "moduleLicenseUrl": "https://www.apache.org/licenses/LICENSE-2.0" }, diff --git a/src/main/resources/static/css/footer.css b/src/main/resources/static/css/footer.css index b004cc27..ee47f54c 100644 --- a/src/main/resources/static/css/footer.css +++ b/src/main/resources/static/css/footer.css @@ -21,4 +21,8 @@ .footer-icon { font-size: 2rem; -} \ No newline at end of file +} + +.footer-link { + text-decoration: none; +} diff --git a/src/main/resources/templates/addUsers.html b/src/main/resources/templates/addUsers.html index 025f758f..a91f0e46 100644 --- a/src/main/resources/templates/addUsers.html +++ b/src/main/resources/templates/addUsers.html @@ -2,6 +2,19 @@ + @@ -20,49 +33,82 @@
- + person_add Add New User - + edit Change User's Role +
+ Total Users: + Active Users: + Disabled Users: +
+
+
+
+ Default message if not found +
+
+
+
+ Default message if not found +
- Message + Default message if not found
- - - - - + + + + + + + - + - + + +
UIDUsernameRolesActionsAuthenticated#UsernameRolesAuthenticatedLast RequestActions
-
- -
- edit -
+
+ +
+ edit +
+
+ + + +
+
@@ -77,16 +123,11 @@