diff --git a/.github/workflows/push_trigger.yml b/.github/workflows/push_trigger.yml index 40cbefe5..f0db66b7 100644 --- a/.github/workflows/push_trigger.yml +++ b/.github/workflows/push_trigger.yml @@ -5,95 +5,26 @@ on: push: branches: - master - - 1.0.* - develop - 1.1.* - - MOSIP-11719 - 1.2.* + - release* + - MOSIP* jobs: - build-kernel-ref-idobjectvalidator: - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo ${{ env.BRANCH_NAME }} - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd kernel - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Analyze with SonarCloud - run: | - cd kernel - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_kernel-ref-idobjectvalidator -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - build-pre-registration-booking-service: + build-jboss-keycloak: runs-on: ubuntu-latest env: NAMESPACE: ${{ secrets. dev_namespace_docker_hub }} - SERVICE_NAME: pre-registration-booking-service - SERVICE_LOCATION: pre-registration-booking-service + SERVICE_NAME: mosip-keycloak + SERVICE_LOCATION: keycloak-jboss + + # Steps represent a sequence of tasks that will be executed as part of the job steps: + # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file + - uses: actions/setup-node@v1 - name: Setup branch and env run: | @@ -101,38 +32,10 @@ jobs: echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - name: Setup branch and GPG public key + - name: setup environment run: | # Strip git ref prefix from version echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd pre-registration-booking-service - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Analyze with SonarCloud - run: | - cd pre-registration-booking-service - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_pre-registration-booking-service -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - name: Build image run: | @@ -145,351 +48,23 @@ jobs: - name: Push image run: | IMAGE_ID=$NAMESPACE/$SERVICE_NAME - # Change all uppercase to lowercase - IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') - VERSION=$BRANCH_NAME - echo "push version $VERSION" - echo IMAGE_ID=$IMAGE_ID - echo VERSION=$VERSION - docker tag $SERVICE_NAME $IMAGE_ID:$VERSION - docker push $IMAGE_ID:$VERSION -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - publish_to_nexus_kernel_prereg: - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.RELEASE_USER}} ${{secrets.RELEASE_TOKEN}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd kernel - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - name: Publish the maven package - run: | - cd kernel && mvn deploy -DskipTests -DaltDeploymentRepository=ossrh::default::${{ secrets.OSSRH_SNAPSHOT_URL }} -s $GITHUB_WORKSPACE/settings.xml -f pom.xml - cd .. - cd pre-registration-booking-service && mvn deploy -DskipTests -DaltDeploymentRepository=ossrh::default::${{ secrets.OSSRH_SNAPSHOT_URL }} -s $GITHUB_WORKSPACE/settings.xml -f pom.xml - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} - GPG_TTY: $(tty) -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - docker-registration-processor-external-stage: - - runs-on: ubuntu-latest - env: - NAMESPACE: mosipdev - SERVICE_NAME: registration-processor-external-stage - SERVICE_LOCATION: registration-processor/registration-processor-external-stage - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd registration-processor/registration-processor-external-stage - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Analyze with SonarCloud - run: | - cd registration-processor/registration-processor-external-stage - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_registration-processor-external-stage -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - - name: Build image - run: | - cd "./${{env.SERVICE_LOCATION}}" - docker build . --file Dockerfile --tag ${{ env.SERVICE_NAME }} - - - name: Log into registry - run: echo "${{ secrets.release_docker_hub }}" | docker login -u ${{ secrets.actor_docker_hub }} --password-stdin - - - name: Push image - run: | - IMAGE_ID=$NAMESPACE/$SERVICE_NAME - - # Change all uppercase to lowercase - IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') - VERSION=$BRANCH_NAME - echo "push version $VERSION" - echo IMAGE_ID=$IMAGE_ID - echo VERSION=$VERSION - docker tag $SERVICE_NAME $IMAGE_ID:$VERSION - docker push $IMAGE_ID:$VERSION -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - docker-registration-processor-external-integration-service: - - runs-on: ubuntu-latest - env: - NAMESPACE: mosipdev - SERVICE_NAME: registration-processor-external-integration-service - SERVICE_LOCATION: registration-processor/registration-processor-external-integration-service - - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd registration-processor/registration-processor-external-integration-service - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Analyze with SonarCloud - run: | - cd registration-processor/registration-processor-external-integration-service - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_registration-processor-external-integration-service -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - - name: Build image - run: | - cd "./${{env.SERVICE_LOCATION}}" - docker build . --file Dockerfile --tag ${{ env.SERVICE_NAME }} - - - name: Log into registry - run: echo "${{ secrets.release_docker_hub }}" | docker login -u ${{ secrets.actor_docker_hub }} --password-stdin - - - name: Push image - run: | - IMAGE_ID=$NAMESPACE/$SERVICE_NAME - # Change all uppercase to lowercase IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') - VERSION=$BRANCH_NAME + VERSION=9.0.0 echo "push version $VERSION" echo IMAGE_ID=$IMAGE_ID echo VERSION=$VERSION docker tag $SERVICE_NAME $IMAGE_ID:$VERSION docker push $IMAGE_ID:$VERSION -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - build-biosdk-client: - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo ${{ env.BRANCH_NAME }} - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd biosdk-client - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Analyze with SonarCloud - run: | - cd biosdk-client - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_biosdk-client -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - - name: Publish the maven package - run: | - cd biosdk-client && mvn deploy -DskipTests -DaltDeploymentRepository=ossrh::default::${{ secrets.OSSRH_SNAPSHOT_URL }} -s $GITHUB_WORKSPACE/settings.xml -f pom.xml - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} - GPG_TTY: $(tty) -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - # This workflow contains a single job for building and pushing biosdk service docker" - build-biosdk-service: + build-keycloak-init: runs-on: ubuntu-latest env: NAMESPACE: ${{ secrets. dev_namespace_docker_hub }} - SERVICE_NAME: biosdk-server - SERVICE_LOCATION: biosdk-services + SERVICE_NAME: keycloak-init + SERVICE_LOCATION: keycloak-init # Steps represent a sequence of tasks that will be executed as part of the job steps: @@ -508,51 +83,6 @@ jobs: # Strip git ref prefix from version echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo ${{ env.BRANCH_NAME }} - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd biosdk-services - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - - name: Analyze with SonarCloud - run: | - cd biosdk-services - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_biosdk-service -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - name: Build image run: | cd "./${{env.SERVICE_LOCATION}}" @@ -564,6 +94,7 @@ jobs: - name: Push image run: | IMAGE_ID=$NAMESPACE/$SERVICE_NAME + # Change all uppercase to lowercase IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') VERSION=$BRANCH_NAME @@ -572,164 +103,14 @@ jobs: echo VERSION=$VERSION docker tag $SERVICE_NAME $IMAGE_ID:$VERSION docker push $IMAGE_ID:$VERSION -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - build-cache-provider-hazelcast: - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo ${{ env.BRANCH_NAME }} - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd cache-provider-hazelcast - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Publish the maven package - run: | - cd cache-provider-hazelcast && mvn deploy -DskipTests -DaltDeploymentRepository=ossrh::default::${{ secrets.OSSRH_SNAPSHOT_URL }} -s $GITHUB_WORKSPACE/settings.xml -f pom.xml - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} - GPG_TTY: $(tty) -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - -# build-admin-ui: -# runs-on: ubuntu-latest -# env: -# NAMESPACE: ${{ secrets. dev_namespace_docker_hub }} -# SERVICE_NAME: admin-ui -# SERVICE_LOCATION: admin-ui -# -# # Steps represent a sequence of tasks that will be executed as part of the job -# steps: -# # Checks-out your repository under $GITHUB_WORKSPACE, so your job can access it -# - uses: actions/checkout@v2 -# - uses: actions/setup-node@v1 -# -# - name: npm install -# run: cd ${{ env.SERVICE_LOCATION }} && npm install --ignore-scripts -# -# - name: npm build -# run: cd ${{ env.SERVICE_LOCATION }} && npm run-script build -- --prod --base-href . --output-path=dist -# -# - name: Setup branch and env -# run: | -# # Strip git ref prefix from version -# echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV -# echo "GPG_TTY=$(tty)" >> $GITHUB_ENV -# -# - name: setup environment -# run: | -# # Strip git ref prefix from version -# echo "GPG_TTY=$(tty)" >> $GITHUB_ENV -# echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV -# -# - name: run sonar analysis -# run: | -# cd "./${{env.SERVICE_LOCATION}}" -# echo "sonar.host.url=https://sonarcloud.io/ -# sonar.login=${{ secrets.SONAR_TOKEN }} -# sonar.projectKey=mosip_admin-ui -# sonar.organization=${{ secrets.ORG_KEY }} -# sonar.sourceEncoding=UTF-8 -# sonar.sources=src -# sonar.exclusions=**/node_modules/** -# sonar.tests=src -# sonar.test.inclusions=**/*.spec.ts -# sonar.typescript.lcov.reportPaths=coverage/lcov.info" >> sonar-project.properties -# npm install sonar-scanner && npm run sonar -# env: -# GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} -# SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} -# -# - name: Build image -# run: | -# cd "./${{env.SERVICE_LOCATION}}" -# docker build . --file Dockerfile --tag ${{ env.SERVICE_NAME }} -# -# - name: Log into registry -# run: echo "${{ secrets.release_docker_hub }}" | docker login -u ${{ secrets.actor_docker_hub }} --password-stdin -# -# - name: Push image -# run: | -# IMAGE_ID=$NAMESPACE/$SERVICE_NAME -# # Change all uppercase to lowercase -# IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') -# VERSION=$BRANCH_NAME -# echo "push version $VERSION" -# echo IMAGE_ID=$IMAGE_ID -# echo VERSION=$VERSION -# docker tag $SERVICE_NAME $IMAGE_ID:$VERSION -# docker push $IMAGE_ID:$VERSION -## - uses: 8398a7/action-slack@v3 -## with: -## status: ${{ job.status }} -## fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -## env: -## SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -## if: failure() # Pick up events even if the job fails or is canceled. - - # This workflow contains a single job called "build" - build-keycloak: + build-artemis-keycloak: runs-on: ubuntu-latest env: NAMESPACE: ${{ secrets. dev_namespace_docker_hub }} SERVICE_NAME: mosip-keycloak - SERVICE_LOCATION: keycloak + SERVICE_LOCATION: keycloak-artemis # Steps represent a sequence of tasks that will be executed as part of the job steps: @@ -742,176 +123,25 @@ jobs: # Strip git ref prefix from version echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - name: setup environment run: | # Strip git ref prefix from version echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - - name: Build image run: | cd "./${{env.SERVICE_LOCATION}}" docker build . --file Dockerfile --tag ${{ env.SERVICE_NAME }} - - name: Log into registry run: echo "${{ secrets.release_docker_hub }}" | docker login -u ${{ secrets.actor_docker_hub }} --password-stdin - name: Push image run: | IMAGE_ID=$NAMESPACE/$SERVICE_NAME - # Change all uppercase to lowercase IMAGE_ID=$(echo $IMAGE_ID | tr '[A-Z]' '[a-z]') - VERSION=$BRANCH_NAME + VERSION=16.1.1-debian-10-r85 echo "push version $VERSION" echo IMAGE_ID=$IMAGE_ID echo VERSION=$VERSION docker tag $SERVICE_NAME $IMAGE_ID:$VERSION docker push $IMAGE_ID:$VERSION -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - - build-demosdk: - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo ${{ env.BRANCH_NAME }} - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd demosdk - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Analyze with SonarCloud - run: | - cd demosdk - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_biosdk-client -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - - name: Publish the maven package - run: | - cd demosdk && mvn deploy -DskipTests -DaltDeploymentRepository=ossrh::default::${{ secrets.OSSRH_SNAPSHOT_URL }} -s $GITHUB_WORKSPACE/settings.xml -f pom.xml - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} - GPG_TTY: $(tty) -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - - build-authentication-ref-impl: - - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v2 - - name: Set up JDK 11 - uses: actions/setup-java@v1 - with: - ref: ${{ github.ref }} - java-version: 11 - server-id: ossrh # Value of the distributionManagement/repository/id field of the pom.xml - settings-path: ${{ github.workspace }} # location for the settings.xml file - - - name: Setup branch and env - run: | - # Strip git ref prefix from version - echo "BRANCH_NAME=$(echo ${{ github.ref }} | sed -e 's,.*/\(.*\),\1,')" >> $GITHUB_ENV - echo "GPG_TTY=$(tty)" >> $GITHUB_ENV - - name: Setup branch and GPG public key - run: | - # Strip git ref prefix from version - echo ${{ env.BRANCH_NAME }} - echo ${{ env.GPG_TTY }} - sudo apt-get --yes install gnupg2 - gpg2 --import ./.github/keys/mosipgpgkey_pub.gpg - gpg2 --quiet --batch --passphrase=${{secrets.gpg_secret}} --allow-secret-key-import --import ./.github/keys/mosipgpgkey_sec.gpg - - uses: actions/cache@v1 - with: - path: ~/.m2/repository - key: ${{ runner.os }}-maven-${{ hashFiles('**/pom.xml') }} - restore-keys: | - ${{ runner.os }}-maven-${{ env.BRANCH_NAME }} - - name: Install xmllint - run: | - sudo apt-get update - sudo apt-get install libxml2-utils - - name: Setup the settings file for ossrh server - run: echo " ossrh ${{secrets.ossrh_user}} ${{secrets.ossrh_secret}} ossrh true gpg2 ${{secrets.gpg_secret}} allow-snapshots true snapshots-repo https://oss.sonatype.org/content/repositories/snapshots false true releases-repo https://oss.sonatype.org/service/local/staging/deploy/maven2 true false sonar . https://sonarcloud.io false " > $GITHUB_WORKSPACE/settings.xml - - - name: Build with Maven - run: | - cd authentication - mvn -B package -s $GITHUB_WORKSPACE/settings.xml --file pom.xml - - name: Ready the springboot artifacts - run: find -name '*.jar' -executable -type f -exec zip release.zip {} + - - - name: Analyze with SonarCloud - run: | - cd authentication - mvn -B -Dgpg.skip verify sonar:sonar -Dsonar.projectKey=mosip_biosdk-client -Dsonar.organization=${{ secrets.ORG_KEY }} -Dsonar.host.url=https://sonarcloud.io -Dsonar.login=${{ secrets.SONAR_TOKEN }} - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - - - name: Publish the maven package - run: | - cd authentication && mvn deploy -DskipTests -DaltDeploymentRepository=ossrh::default::${{ secrets.OSSRH_SNAPSHOT_URL }} -s $GITHUB_WORKSPACE/settings.xml -f pom.xml - env: - GITHUB_TOKEN: ${{ secrets.RELEASE_TOKEN }} - GPG_TTY: $(tty) -# - uses: 8398a7/action-slack@v3 -# with: -# status: ${{ job.status }} -# fields: repo,message,commit,author,action,eventName,ref,workflow,job,took # selectable (default: repo,message) -# env: -# SLACK_WEBHOOK_URL: ${{ secrets.SLACK_WEBHOOK }} # required -# if: failure() # Pick up events even if the job fails or is canceled. - - diff --git a/.github/workflows/tag.yaml b/.github/workflows/tag.yaml new file mode 100644 index 00000000..e9bba0e6 --- /dev/null +++ b/.github/workflows/tag.yaml @@ -0,0 +1,43 @@ +name: Tagging of repos + +env: + tag: v1.2.3 + +on: + workflow_dispatch: + inputs: + tag: + description: 'Tag to be published' + required: true + default: 'v1.2.3' + type: string + body: + description: 'Release body message' + required: true + default: 'Changes in this Release' + type: string + pre-release: + description: 'Pre-release? True/False' + required: true + default: False + type: string + +jobs: + build: + name: Create Release + runs-on: ubuntu-latest + steps: + - name: Checkout code + uses: actions/checkout@v2 + - name: Create Release + id: create_release + uses: actions/create-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} # This token is provided by Actions, you do not need to create your own token + with: + tag_name: ${{ github.event.inputs.tag }} + release_name: ${{ github.event.inputs.tag }} + body: | + ${{ github.event.inputs.body }} + draft: false + prerelease: ${{fromJSON(github.event.inputs.pre-release)}} diff --git a/keycloak-artemis/Dockerfile b/keycloak-artemis/Dockerfile new file mode 100644 index 00000000..7736540b --- /dev/null +++ b/keycloak-artemis/Dockerfile @@ -0,0 +1,45 @@ +FROM docker.io/bitnami/minideb:buster +LABEL maintainer "Bitnami " + +ENV HOME="/" \ + OS_ARCH="amd64" \ + OS_FLAVOUR="debian-10" \ + OS_NAME="linux" + +ARG JAVA_EXTRA_SECURITY_DIR="/bitnami/java/extra-security" + +COPY prebuildfs / +RUN chmod +x /usr/sbin/install_packages +# Install required system packages and dependencies +RUN install_packages acl ca-certificates curl gzip libaio1 libc6 procps rsync tar zlib1g +RUN . /opt/bitnami/scripts/libcomponent.sh && component_unpack "wait-for-port" "1.0.1-10" --checksum 35c818ba3f4b5aae905959bc7d3a5e81fc63786e3c662b604612c0aa7fcda8fd +RUN . /opt/bitnami/scripts/libcomponent.sh && component_unpack "java" "11.0.14-7" --checksum 900545c4f346a0ece8abf2caf64fd9d4ab7514967d4614d716bf7362b24f828b +RUN . /opt/bitnami/scripts/libcomponent.sh && component_unpack "keycloak" "16.1.1-8" --checksum c432a2b3551a40e48b77f63257def52e9556c2b6ffa989e7eb6847ad87fdd9db +RUN . /opt/bitnami/scripts/libcomponent.sh && component_unpack "gosu" "1.14.0-7" --checksum d6280b6f647a62bf6edc74dc8e526bfff63ddd8067dcb8540843f47203d9ccf1 +RUN apt-get update && apt-get upgrade -y && \ + rm -r /var/lib/apt/lists /var/cache/apt/archives +RUN chmod g+rwX /opt/bitnami + +COPY ./theme/base /opt/bitnami/keycloak/themes/base + +COPY ./theme/mosip /opt/bitnami/keycloak/themes/mosip + +COPY ./standalone/deployments/* /opt/bitnami/keycloak/standalone/deployments + +COPY rootfs / +RUN chmod +x /opt/bitnami/scripts/keycloak/postunpack.sh +RUN chmod +x /opt/bitnami/scripts/java/postunpack.sh + +RUN /opt/bitnami/scripts/java/postunpack.sh +RUN /opt/bitnami/scripts/keycloak/postunpack.sh +ENV APP_VERSION="16.1.1" \ + BITNAMI_APP_NAME="keycloak" \ + JAVA_HOME="/opt/bitnami/java" \ + PATH="/opt/bitnami/common/bin:/opt/bitnami/java/bin:/opt/bitnami/keycloak/bin:$PATH" + +RUN chmod +x /opt/bitnami/scripts/keycloak/entrypoint.sh +RUN chmod +x /opt/bitnami/scripts/keycloak/setup.sh +RUN chmod +x /opt/bitnami/scripts/keycloak/run.sh +USER 1001 +ENTRYPOINT [ "/opt/bitnami/scripts/keycloak/entrypoint.sh" ] +CMD [ "/opt/bitnami/scripts/keycloak/run.sh" ] diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/.bitnami_components.json b/keycloak-artemis/prebuildfs/opt/bitnami/.bitnami_components.json new file mode 100644 index 00000000..ca9199fc --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/.bitnami_components.json @@ -0,0 +1,30 @@ +{ + "gosu": { + "arch": "amd64", + "digest": "d6280b6f647a62bf6edc74dc8e526bfff63ddd8067dcb8540843f47203d9ccf1", + "distro": "debian-10", + "type": "NAMI", + "version": "1.14.0-7" + }, + "java": { + "arch": "amd64", + "digest": "900545c4f346a0ece8abf2caf64fd9d4ab7514967d4614d716bf7362b24f828b", + "distro": "debian-10", + "type": "NAMI", + "version": "11.0.14-7" + }, + "keycloak": { + "arch": "amd64", + "digest": "c432a2b3551a40e48b77f63257def52e9556c2b6ffa989e7eb6847ad87fdd9db", + "distro": "debian-10", + "type": "NAMI", + "version": "16.1.1-8" + }, + "wait-for-port": { + "arch": "amd64", + "digest": "35c818ba3f4b5aae905959bc7d3a5e81fc63786e3c662b604612c0aa7fcda8fd", + "distro": "debian-10", + "type": "NAMI", + "version": "1.0.1-10" + } +} \ No newline at end of file diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/licenses/licenses.txt b/keycloak-artemis/prebuildfs/opt/bitnami/licenses/licenses.txt new file mode 100644 index 00000000..c76ba31f --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/licenses/licenses.txt @@ -0,0 +1,3 @@ +Bitnami containers ship with software bundles. You can find the licenses under: +/opt/bitnami/nami/COPYING +/opt/bitnami/[name-of-bundle]/licenses/[bundle-version].txt diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libbitnami.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libbitnami.sh new file mode 100644 index 00000000..ef29e361 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libbitnami.sh @@ -0,0 +1,51 @@ +#!/bin/bash +# +# Bitnami custom library + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/liblog.sh + +# Constants +BOLD='\033[1m' + +# Functions + +######################## +# Print the welcome page +# Globals: +# DISABLE_WELCOME_MESSAGE +# BITNAMI_APP_NAME +# Arguments: +# None +# Returns: +# None +######################### +print_welcome_page() { + if [[ -z "${DISABLE_WELCOME_MESSAGE:-}" ]]; then + if [[ -n "$BITNAMI_APP_NAME" ]]; then + print_image_welcome_page + fi + fi +} + +######################## +# Print the welcome page for a Bitnami Docker image +# Globals: +# BITNAMI_APP_NAME +# Arguments: +# None +# Returns: +# None +######################### +print_image_welcome_page() { + local github_url="https://github.com/bitnami/bitnami-docker-${BITNAMI_APP_NAME}" + + log "" + log "${BOLD}Welcome to the Bitnami ${BITNAMI_APP_NAME} container${RESET}" + log "Subscribe to project updates by watching ${BOLD}${github_url}${RESET}" + log "Submit issues and feature requests at ${BOLD}${github_url}/issues${RESET}" + log "" +} + diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libcomponent.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libcomponent.sh new file mode 100644 index 00000000..e3098a93 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libcomponent.sh @@ -0,0 +1,65 @@ +#!/bin/bash +# +# Library for managing Bitnami components + +# Constants +CACHE_ROOT="/tmp/bitnami/pkg/cache" +DOWNLOAD_URL="https://downloads.bitnami.com/files/stacksmith" + +# Functions + +######################## +# Download and unpack a Bitnami package +# Globals: +# OS_NAME +# OS_ARCH +# OS_FLAVOUR +# Arguments: +# $1 - component's name +# $2 - component's version +# Returns: +# None +######################### +component_unpack() { + local name="${1:?name is required}" + local version="${2:?version is required}" + local base_name="${name}-${version}-${OS_NAME}-${OS_ARCH}-${OS_FLAVOUR}" + local package_sha256="" + local directory="/opt/bitnami" + + # Validate arguments + shift 2 + while [ "$#" -gt 0 ]; do + case "$1" in + -c|--checksum) + shift + package_sha256="${1:?missing package checksum}" + ;; + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + + echo "Downloading $base_name package" + if [ -f "${CACHE_ROOT}/${base_name}.tar.gz" ]; then + echo "${CACHE_ROOT}/${base_name}.tar.gz already exists, skipping download." + cp "${CACHE_ROOT}/${base_name}.tar.gz" . + rm "${CACHE_ROOT}/${base_name}.tar.gz" + if [ -f "${CACHE_ROOT}/${base_name}.tar.gz.sha256" ]; then + echo "Using the local sha256 from ${CACHE_ROOT}/${base_name}.tar.gz.sha256" + package_sha256="$(< "${CACHE_ROOT}/${base_name}.tar.gz.sha256")" + rm "${CACHE_ROOT}/${base_name}.tar.gz.sha256" + fi + else + curl --remote-name --silent --show-error --fail "${DOWNLOAD_URL}/${base_name}.tar.gz" + fi + if [ -n "$package_sha256" ]; then + echo "Verifying package integrity" + echo "$package_sha256 ${base_name}.tar.gz" | sha256sum --check - || exit "$?" + fi + tar --directory "${directory}" --extract --gunzip --file "${base_name}.tar.gz" --no-same-owner --strip-components=2 + rm "${base_name}.tar.gz" +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libfile.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libfile.sh new file mode 100644 index 00000000..41ebaf74 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libfile.sh @@ -0,0 +1,139 @@ +#!/bin/bash +# +# Library for managing files + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/libos.sh + +# Functions + +######################## +# Replace a regex-matching string in a file +# Arguments: +# $1 - filename +# $2 - match regex +# $3 - substitute regex +# $4 - use POSIX regex. Default: true +# Returns: +# None +######################### +replace_in_file() { + local filename="${1:?filename is required}" + local match_regex="${2:?match regex is required}" + local substitute_regex="${3:?substitute regex is required}" + local posix_regex=${4:-true} + + local result + + # We should avoid using 'sed in-place' substitutions + # 1) They are not compatible with files mounted from ConfigMap(s) + # 2) We found incompatibility issues with Debian10 and "in-place" substitutions + local -r del=$'\001' # Use a non-printable character as a 'sed' delimiter to avoid issues + if [[ $posix_regex = true ]]; then + result="$(sed -E "s${del}${match_regex}${del}${substitute_regex}${del}g" "$filename")" + else + result="$(sed "s${del}${match_regex}${del}${substitute_regex}${del}g" "$filename")" + fi + echo "$result" > "$filename" +} + +######################## +# Replace a regex-matching multiline string in a file +# Arguments: +# $1 - filename +# $2 - match regex +# $3 - substitute regex +# Returns: +# None +######################### +replace_in_file_multiline() { + local filename="${1:?filename is required}" + local match_regex="${2:?match regex is required}" + local substitute_regex="${3:?substitute regex is required}" + + local result + local -r del=$'\001' # Use a non-printable character as a 'sed' delimiter to avoid issues + result="$(perl -pe "BEGIN{undef $/;} s${del}${match_regex}${del}${substitute_regex}${del}sg" "$filename")" + echo "$result" > "$filename" +} + +######################## +# Remove a line in a file based on a regex +# Arguments: +# $1 - filename +# $2 - match regex +# $3 - use POSIX regex. Default: true +# Returns: +# None +######################### +remove_in_file() { + local filename="${1:?filename is required}" + local match_regex="${2:?match regex is required}" + local posix_regex=${3:-true} + local result + + # We should avoid using 'sed in-place' substitutions + # 1) They are not compatible with files mounted from ConfigMap(s) + # 2) We found incompatibility issues with Debian10 and "in-place" substitutions + if [[ $posix_regex = true ]]; then + result="$(sed -E "/$match_regex/d" "$filename")" + else + result="$(sed "/$match_regex/d" "$filename")" + fi + echo "$result" > "$filename" +} + +######################## +# Appends text after the last line matching a pattern +# Arguments: +# $1 - file +# $2 - match regex +# $3 - contents to add +# Returns: +# None +######################### +append_file_after_last_match() { + local file="${1:?missing file}" + local match_regex="${2:?missing pattern}" + local value="${3:?missing value}" + + # We read the file in reverse, replace the first match (0,/pattern/s) and then reverse the results again + result="$(tac "$file" | sed -E "0,/($match_regex)/s||${value}\n\1|" | tac)" + echo "$result" > "$file" +} + +######################## +# Wait until certain entry is present in a log file +# Arguments: +# $1 - entry to look for +# $2 - log file +# $3 - max retries. Default: 12 +# $4 - sleep between retries (in seconds). Default: 5 +# Returns: +# Boolean +######################### +wait_for_log_entry() { + local -r entry="${1:-missing entry}" + local -r log_file="${2:-missing log file}" + local -r retries="${3:-12}" + local -r interval_time="${4:-5}" + local attempt=0 + + check_log_file_for_entry() { + if ! grep -qE "$entry" "$log_file"; then + debug "Entry \"${entry}\" still not present in ${log_file} (attempt $((++attempt))/${retries})" + return 1 + fi + } + debug "Checking that ${log_file} log file contains entry \"${entry}\"" + if retry_while check_log_file_for_entry "$retries" "$interval_time"; then + debug "Found entry \"${entry}\" in ${log_file}" + true + else + error "Could not find entry \"${entry}\" in ${log_file} after ${retries} retries" + debug_execute cat "$log_file" + return 1 + fi +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libfs.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libfs.sh new file mode 100644 index 00000000..1b504b1d --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libfs.sh @@ -0,0 +1,190 @@ +#!/bin/bash +# +# Library for file system actions + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/liblog.sh + +# Functions + +######################## +# Ensure a file/directory is owned (user and group) but the given user +# Arguments: +# $1 - filepath +# $2 - owner +# Returns: +# None +######################### +owned_by() { + local path="${1:?path is missing}" + local owner="${2:?owner is missing}" + local group="${3:-}" + + if [[ -n $group ]]; then + chown "$owner":"$group" "$path" + else + chown "$owner":"$owner" "$path" + fi +} + +######################## +# Ensure a directory exists and, optionally, is owned by the given user +# Arguments: +# $1 - directory +# $2 - owner +# Returns: +# None +######################### +ensure_dir_exists() { + local dir="${1:?directory is missing}" + local owner_user="${2:-}" + local owner_group="${3:-}" + + mkdir -p "${dir}" + if [[ -n $owner_user ]]; then + owned_by "$dir" "$owner_user" "$owner_group" + fi +} + +######################## +# Checks whether a directory is empty or not +# arguments: +# $1 - directory +# returns: +# boolean +######################### +is_dir_empty() { + local -r path="${1:?missing directory}" + # Calculate real path in order to avoid issues with symlinks + local -r dir="$(realpath "$path")" + if [[ ! -e "$dir" ]] || [[ -z "$(ls -A "$dir")" ]]; then + true + else + false + fi +} + +######################## +# Checks whether a mounted directory is empty or not +# arguments: +# $1 - directory +# returns: +# boolean +######################### +is_mounted_dir_empty() { + local dir="${1:?missing directory}" + + if is_dir_empty "$dir" || find "$dir" -mindepth 1 -maxdepth 1 -not -name ".snapshot" -not -name "lost+found" -exec false {} +; then + true + else + false + fi +} + +######################## +# Checks whether a file can be written to or not +# arguments: +# $1 - file +# returns: +# boolean +######################### +is_file_writable() { + local file="${1:?missing file}" + local dir + dir="$(dirname "$file")" + + if [[ (-f "$file" && -w "$file") || (! -f "$file" && -d "$dir" && -w "$dir") ]]; then + true + else + false + fi +} + +######################## +# Relativize a path +# arguments: +# $1 - path +# $2 - base +# returns: +# None +######################### +relativize() { + local -r path="${1:?missing path}" + local -r base="${2:?missing base}" + pushd "$base" >/dev/null || exit + realpath -q --no-symlinks --relative-base="$base" "$path" | sed -e 's|^/$|.|' -e 's|^/||' + popd >/dev/null || exit +} + +######################## +# Configure permisions and ownership recursively +# Globals: +# None +# Arguments: +# $1 - paths (as a string). +# Flags: +# -f|--file-mode - mode for directories. +# -d|--dir-mode - mode for files. +# -u|--user - user +# -g|--group - group +# Returns: +# None +######################### +configure_permissions_ownership() { + local -r paths="${1:?paths is missing}" + local dir_mode="" + local file_mode="" + local user="" + local group="" + + # Validate arguments + shift 1 + while [ "$#" -gt 0 ]; do + case "$1" in + -f | --file-mode) + shift + file_mode="${1:?missing mode for files}" + ;; + -d | --dir-mode) + shift + dir_mode="${1:?missing mode for directories}" + ;; + -u | --user) + shift + user="${1:?missing user}" + ;; + -g | --group) + shift + group="${1:?missing group}" + ;; + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + + read -r -a filepaths <<<"$paths" + for p in "${filepaths[@]}"; do + if [[ -e "$p" ]]; then + if [[ -n $dir_mode ]]; then + find -L "$p" -type d -exec chmod "$dir_mode" {} \; + fi + if [[ -n $file_mode ]]; then + find -L "$p" -type f -exec chmod "$file_mode" {} \; + fi + if [[ -n $user ]] && [[ -n $group ]]; then + chown -LR "$user":"$group" "$p" + elif [[ -n $user ]] && [[ -z $group ]]; then + chown -LR "$user" "$p" + elif [[ -z $user ]] && [[ -n $group ]]; then + chgrp -LR "$group" "$p" + fi + else + stderr_print "$p does not exist" + fi + done +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libhook.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libhook.sh new file mode 100644 index 00000000..9694852a --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libhook.sh @@ -0,0 +1,16 @@ +#!/bin/bash +# +# Library to use for scripts expected to be used as Kubernetes lifecycle hooks + +# shellcheck disable=SC1091 + +# Load generic libraries +. /opt/bitnami/scripts/liblog.sh +. /opt/bitnami/scripts/libos.sh + +# Override functions that log to stdout/stderr of the current process, so they print to process 1 +for function_to_override in stderr_print debug_execute; do + # Output is sent to output of process 1 and thus end up in the container log + # The hook output in general isn't saved + eval "$(declare -f "$function_to_override") >/proc/1/fd/1 2>/proc/1/fd/2" +done diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/liblog.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/liblog.sh new file mode 100644 index 00000000..c7c0f6d4 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/liblog.sh @@ -0,0 +1,112 @@ +#!/bin/bash +# +# Library for logging functions + +# Constants +RESET='\033[0m' +RED='\033[38;5;1m' +GREEN='\033[38;5;2m' +YELLOW='\033[38;5;3m' +MAGENTA='\033[38;5;5m' +CYAN='\033[38;5;6m' + +# Functions + +######################## +# Print to STDERR +# Arguments: +# Message to print +# Returns: +# None +######################### +stderr_print() { + # 'is_boolean_yes' is defined in libvalidations.sh, but depends on this file so we cannot source it + local bool="${BITNAMI_QUIET:-false}" + # comparison is performed without regard to the case of alphabetic characters + shopt -s nocasematch + if ! [[ "$bool" = 1 || "$bool" =~ ^(yes|true)$ ]]; then + printf "%b\\n" "${*}" >&2 + fi +} + +######################## +# Log message +# Arguments: +# Message to log +# Returns: +# None +######################### +log() { + stderr_print "${CYAN}${MODULE:-} ${MAGENTA}$(date "+%T.%2N ")${RESET}${*}" +} +######################## +# Log an 'info' message +# Arguments: +# Message to log +# Returns: +# None +######################### +info() { + log "${GREEN}INFO ${RESET} ==> ${*}" +} +######################## +# Log message +# Arguments: +# Message to log +# Returns: +# None +######################### +warn() { + log "${YELLOW}WARN ${RESET} ==> ${*}" +} +######################## +# Log an 'error' message +# Arguments: +# Message to log +# Returns: +# None +######################### +error() { + log "${RED}ERROR${RESET} ==> ${*}" +} +######################## +# Log a 'debug' message +# Globals: +# BITNAMI_DEBUG +# Arguments: +# None +# Returns: +# None +######################### +debug() { + # 'is_boolean_yes' is defined in libvalidations.sh, but depends on this file so we cannot source it + local bool="${BITNAMI_DEBUG:-false}" + # comparison is performed without regard to the case of alphabetic characters + shopt -s nocasematch + if [[ "$bool" = 1 || "$bool" =~ ^(yes|true)$ ]]; then + log "${MAGENTA}DEBUG${RESET} ==> ${*}" + fi +} + +######################## +# Indent a string +# Arguments: +# $1 - string +# $2 - number of indentation characters (default: 4) +# $3 - indentation character (default: " ") +# Returns: +# None +######################### +indent() { + local string="${1:-}" + local num="${2:?missing num}" + local char="${3:-" "}" + # Build the indentation unit string + local indent_unit="" + for ((i = 0; i < num; i++)); do + indent_unit="${indent_unit}${char}" + done + # shellcheck disable=SC2001 + # Complex regex, see https://github.com/koalaman/shellcheck/wiki/SC2001#exceptions + echo "$string" | sed "s/^/${indent_unit}/" +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libnet.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libnet.sh new file mode 100644 index 00000000..8bbf165e --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libnet.sh @@ -0,0 +1,163 @@ +#!/bin/bash +# +# Library for network functions + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/liblog.sh + +# Functions + +######################## +# Resolve IP address for a host/domain (i.e. DNS lookup) +# Arguments: +# $1 - Hostname to resolve +# $2 - IP address version (v4, v6), leave empty for resolving to any version +# Returns: +# IP +######################### +dns_lookup() { + local host="${1:?host is missing}" + local ip_version="${2:-}" + getent "ahosts${ip_version}" "$host" | awk '/STREAM/ {print $1 }' | head -n 1 +} + +######################### +# Wait for a hostname and return the IP +# Arguments: +# $1 - hostname +# $2 - number of retries +# $3 - seconds to wait between retries +# Returns: +# - IP address that corresponds to the hostname +######################### +wait_for_dns_lookup() { + local hostname="${1:?hostname is missing}" + local retries="${2:-5}" + local seconds="${3:-1}" + check_host() { + if [[ $(dns_lookup "$hostname") == "" ]]; then + false + else + true + fi + } + # Wait for the host to be ready + retry_while "check_host ${hostname}" "$retries" "$seconds" + dns_lookup "$hostname" +} + +######################## +# Get machine's IP +# Arguments: +# None +# Returns: +# Machine IP +######################### +get_machine_ip() { + local -a ip_addresses + local hostname + hostname="$(hostname)" + read -r -a ip_addresses <<< "$(dns_lookup "$hostname" | xargs echo)" + if [[ "${#ip_addresses[@]}" -gt 1 ]]; then + warn "Found more than one IP address associated to hostname ${hostname}: ${ip_addresses[*]}, will use ${ip_addresses[0]}" + elif [[ "${#ip_addresses[@]}" -lt 1 ]]; then + error "Could not find any IP address associated to hostname ${hostname}" + exit 1 + fi + echo "${ip_addresses[0]}" +} + +######################## +# Check if the provided argument is a resolved hostname +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_hostname_resolved() { + local -r host="${1:?missing value}" + if [[ -n "$(dns_lookup "$host")" ]]; then + true + else + false + fi +} + +######################## +# Parse URL +# Globals: +# None +# Arguments: +# $1 - uri - String +# $2 - component to obtain. Valid options (scheme, authority, userinfo, host, port, path, query or fragment) - String +# Returns: +# String +parse_uri() { + local uri="${1:?uri is missing}" + local component="${2:?component is missing}" + + # Solution based on https://tools.ietf.org/html/rfc3986#appendix-B with + # additional sub-expressions to split authority into userinfo, host and port + # Credits to Patryk Obara (see https://stackoverflow.com/a/45977232/6694969) + local -r URI_REGEX='^(([^:/?#]+):)?(//((([^@/?#]+)@)?([^:/?#]+)(:([0-9]+))?))?(/([^?#]*))?(\?([^#]*))?(#(.*))?' + # || | ||| | | | | | | | | | + # |2 scheme | ||6 userinfo 7 host | 9 port | 11 rpath | 13 query | 15 fragment + # 1 scheme: | |5 userinfo@ 8 :... 10 path 12 ?... 14 #... + # | 4 authority + # 3 //... + local index=0 + case "$component" in + scheme) + index=2 + ;; + authority) + index=4 + ;; + userinfo) + index=6 + ;; + host) + index=7 + ;; + port) + index=9 + ;; + path) + index=10 + ;; + query) + index=13 + ;; + fragment) + index=14 + ;; + *) + stderr_print "unrecognized component $component" + return 1 + ;; + esac + [[ "$uri" =~ $URI_REGEX ]] && echo "${BASH_REMATCH[${index}]}" +} + +######################## +# Wait for a HTTP connection to succeed +# Globals: +# * +# Arguments: +# $1 - URL to wait for +# $2 - Maximum amount of retries (optional) +# $3 - Time between retries (optional) +# Returns: +# true if the HTTP connection succeeded, false otherwise +######################### +wait_for_http_connection() { + local url="${1:?missing url}" + local retries="${2:-}" + local sleep_time="${3:-}" + if ! retry_while "debug_execute curl --silent ${url}" "$retries" "$sleep_time"; then + error "Could not connect to ${url}" + return 1 + fi +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libos.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libos.sh new file mode 100644 index 00000000..b6c50da9 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libos.sh @@ -0,0 +1,466 @@ +#!/bin/bash +# +# Library for operating system actions + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/liblog.sh +. /opt/bitnami/scripts/libfs.sh +. /opt/bitnami/scripts/libvalidations.sh + +# Functions + +######################## +# Check if an user exists in the system +# Arguments: +# $1 - user +# Returns: +# Boolean +######################### +user_exists() { + local user="${1:?user is missing}" + id "$user" >/dev/null 2>&1 +} + +######################## +# Check if a group exists in the system +# Arguments: +# $1 - group +# Returns: +# Boolean +######################### +group_exists() { + local group="${1:?group is missing}" + getent group "$group" >/dev/null 2>&1 +} + +######################## +# Create a group in the system if it does not exist already +# Arguments: +# $1 - group +# Flags: +# -i|--gid - the ID for the new group +# -s|--system - Whether to create new user as system user (uid <= 999) +# Returns: +# None +######################### +ensure_group_exists() { + local group="${1:?group is missing}" + local gid="" + local is_system_user=false + + # Validate arguments + shift 1 + while [ "$#" -gt 0 ]; do + case "$1" in + -i | --gid) + shift + gid="${1:?missing gid}" + ;; + -s | --system) + is_system_user=true + ;; + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + + if ! group_exists "$group"; then + local -a args=("$group") + if [[ -n "$gid" ]]; then + if group_exists "$gid"; then + error "The GID $gid is already in use." >&2 + return 1 + fi + args+=("--gid" "$gid") + fi + $is_system_user && args+=("--system") + groupadd "${args[@]}" >/dev/null 2>&1 + fi +} + +######################## +# Create an user in the system if it does not exist already +# Arguments: +# $1 - user +# Flags: +# -i|--uid - the ID for the new user +# -g|--group - the group the new user should belong to +# -a|--append-groups - comma-separated list of supplemental groups to append to the new user +# -h|--home - the home directory for the new user +# -s|--system - whether to create new user as system user (uid <= 999) +# Returns: +# None +######################### +ensure_user_exists() { + local user="${1:?user is missing}" + local uid="" + local group="" + local append_groups="" + local home="" + local is_system_user=false + + # Validate arguments + shift 1 + while [ "$#" -gt 0 ]; do + case "$1" in + -i | --uid) + shift + uid="${1:?missing uid}" + ;; + -g | --group) + shift + group="${1:?missing group}" + ;; + -a | --append-groups) + shift + append_groups="${1:?missing append_groups}" + ;; + -h | --home) + shift + home="${1:?missing home directory}" + ;; + -s | --system) + is_system_user=true + ;; + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + + if ! user_exists "$user"; then + local -a user_args=("-N" "$user") + if [[ -n "$uid" ]]; then + if user_exists "$uid"; then + error "The UID $uid is already in use." + return 1 + fi + user_args+=("--uid" "$uid") + else + $is_system_user && user_args+=("--system") + fi + useradd "${user_args[@]}" >/dev/null 2>&1 + fi + + if [[ -n "$group" ]]; then + local -a group_args=("$group") + $is_system_user && group_args+=("--system") + ensure_group_exists "${group_args[@]}" + usermod -g "$group" "$user" >/dev/null 2>&1 + fi + + if [[ -n "$append_groups" ]]; then + local -a groups + read -ra groups <<<"$(tr ',;' ' ' <<<"$append_groups")" + for group in "${groups[@]}"; do + ensure_group_exists "$group" + usermod -aG "$group" "$user" >/dev/null 2>&1 + done + fi + + if [[ -n "$home" ]]; then + mkdir -p "$home" + usermod -d "$home" "$user" >/dev/null 2>&1 + configure_permissions_ownership "$home" -d "775" -f "664" -u "$user" -g "$group" + fi +} + +######################## +# Check if the script is currently running as root +# Arguments: +# $1 - user +# $2 - group +# Returns: +# Boolean +######################### +am_i_root() { + if [[ "$(id -u)" = "0" ]]; then + true + else + false + fi +} + +######################## +# Print OS metadata +# Arguments: +# $1 - Flag name +# Flags: +# --id - Distro ID +# --version - Distro version +# --branch - Distro branch +# --codename - Distro codename +# Returns: +# String +######################### +get_os_metadata() { + local -r flag_name="${1:?missing flag}" + # Helper function + get_os_release_metadata() { + local -r env_name="${1:?missing environment variable name}" + ( + . /etc/os-release + echo "${!env_name}" + ) + } + case "$flag_name" in + --id) + get_os_release_metadata ID + ;; + --version) + get_os_release_metadata VERSION_ID + ;; + --branch) + get_os_release_metadata VERSION_ID | sed 's/\..*//' + ;; + --codename) + get_os_release_metadata VERSION_CODENAME + ;; + *) + error "Unknown flag ${flag_name}" + return 1 + ;; + esac +} + +######################## +# Get total memory available +# Arguments: +# None +# Returns: +# Memory in bytes +######################### +get_total_memory() { + echo $(($(grep MemTotal /proc/meminfo | awk '{print $2}') / 1024)) +} + +######################## +# Get machine size depending on specified memory +# Globals: +# None +# Arguments: +# None +# Flags: +# --memory - memory size (optional) +# Returns: +# Detected instance size +######################### +get_machine_size() { + local memory="" + # Validate arguments + while [[ "$#" -gt 0 ]]; do + case "$1" in + --memory) + shift + memory="${1:?missing memory}" + ;; + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + if [[ -z "$memory" ]]; then + debug "Memory was not specified, detecting available memory automatically" + memory="$(get_total_memory)" + fi + sanitized_memory=$(convert_to_mb "$memory") + if [[ "$sanitized_memory" -gt 26000 ]]; then + echo 2xlarge + elif [[ "$sanitized_memory" -gt 13000 ]]; then + echo xlarge + elif [[ "$sanitized_memory" -gt 6000 ]]; then + echo large + elif [[ "$sanitized_memory" -gt 3000 ]]; then + echo medium + elif [[ "$sanitized_memory" -gt 1500 ]]; then + echo small + else + echo micro + fi +} + +######################## +# Get machine size depending on specified memory +# Globals: +# None +# Arguments: +# $1 - memory size (optional) +# Returns: +# Detected instance size +######################### +get_supported_machine_sizes() { + echo micro small medium large xlarge 2xlarge +} + +######################## +# Convert memory size from string to amount of megabytes (i.e. 2G -> 2048) +# Globals: +# None +# Arguments: +# $1 - memory size +# Returns: +# Result of the conversion +######################### +convert_to_mb() { + local amount="${1:-}" + if [[ $amount =~ ^([0-9]+)(m|M|g|G) ]]; then + size="${BASH_REMATCH[1]}" + unit="${BASH_REMATCH[2]}" + if [[ "$unit" = "g" || "$unit" = "G" ]]; then + amount="$((size * 1024))" + else + amount="$size" + fi + fi + echo "$amount" +} + +######################### +# Redirects output to /dev/null if debug mode is disabled +# Globals: +# BITNAMI_DEBUG +# Arguments: +# $@ - Command to execute +# Returns: +# None +######################### +debug_execute() { + if is_boolean_yes "${BITNAMI_DEBUG:-false}"; then + "$@" + else + "$@" >/dev/null 2>&1 + fi +} + +######################## +# Retries a command a given number of times +# Arguments: +# $1 - cmd (as a string) +# $2 - max retries. Default: 12 +# $3 - sleep between retries (in seconds). Default: 5 +# Returns: +# Boolean +######################### +retry_while() { + local cmd="${1:?cmd is missing}" + local retries="${2:-12}" + local sleep_time="${3:-5}" + local return_value=1 + + read -r -a command <<<"$cmd" + for ((i = 1; i <= retries; i += 1)); do + "${command[@]}" && return_value=0 && break + sleep "$sleep_time" + done + return $return_value +} + +######################## +# Generate a random string +# Arguments: +# -t|--type - String type (ascii, alphanumeric, numeric), defaults to ascii +# -c|--count - Number of characters, defaults to 32 +# Arguments: +# None +# Returns: +# None +# Returns: +# String +######################### +generate_random_string() { + local type="ascii" + local count="32" + local filter + local result + # Validate arguments + while [[ "$#" -gt 0 ]]; do + case "$1" in + -t | --type) + shift + type="$1" + ;; + -c | --count) + shift + count="$1" + ;; + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + # Validate type + case "$type" in + ascii) + filter="[:print:]" + ;; + alphanumeric) + filter="a-zA-Z0-9" + ;; + numeric) + filter="0-9" + ;; + *) + echo "Invalid type ${type}" >&2 + return 1 + ;; + esac + # Obtain count + 10 lines from /dev/urandom to ensure that the resulting string has the expected size + # Note there is a very small chance of strings starting with EOL character + # Therefore, the higher amount of lines read, this will happen less frequently + result="$(head -n "$((count + 10))" /dev/urandom | tr -dc "$filter" | head -c "$count")" + echo "$result" +} + +######################## +# Create md5 hash from a string +# Arguments: +# $1 - string +# Returns: +# md5 hash - string +######################### +generate_md5_hash() { + local -r str="${1:?missing input string}" + echo -n "$str" | md5sum | awk '{print $1}' +} + +######################## +# Create sha1 hash from a string +# Arguments: +# $1 - string +# $2 - algorithm - 1 (default), 224, 256, 384, 512 +# Returns: +# sha1 hash - string +######################### +generate_sha_hash() { + local -r str="${1:?missing input string}" + local -r algorithm="${2:-1}" + echo -n "$str" | "sha${algorithm}sum" | awk '{print $1}' +} + +######################## +# Converts a string to its hexadecimal representation +# Arguments: +# $1 - string +# Returns: +# hexadecimal representation of the string +######################### +convert_to_hex() { + local -r str=${1:?missing input string} + local -i iterator + local char + for ((iterator = 0; iterator < ${#str}; iterator++)); do + char=${str:iterator:1} + printf '%x' "'${char}" + done +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libpersistence.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libpersistence.sh new file mode 100644 index 00000000..99df6968 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libpersistence.sh @@ -0,0 +1,122 @@ +#!/bin/bash +# +# Bitnami persistence library +# Used for bringing persistence capabilities to applications that don't have clear separation of data and logic + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/libfs.sh +. /opt/bitnami/scripts/libos.sh +. /opt/bitnami/scripts/liblog.sh +. /opt/bitnami/scripts/libversion.sh + +# Functions + +######################## +# Persist an application directory +# Globals: +# BITNAMI_ROOT_DIR +# BITNAMI_VOLUME_DIR +# Arguments: +# $1 - App folder name +# $2 - List of app files to persist +# Returns: +# true if all steps succeeded, false otherwise +######################### +persist_app() { + local -r app="${1:?missing app}" + local -a files_to_restore + read -r -a files_to_persist <<< "$(tr ',;:' ' ' <<< "$2")" + local -r install_dir="${BITNAMI_ROOT_DIR}/${app}" + local -r persist_dir="${BITNAMI_VOLUME_DIR}/${app}" + # Persist the individual files + if [[ "${#files_to_persist[@]}" -le 0 ]]; then + warn "No files are configured to be persisted" + return + fi + pushd "$install_dir" >/dev/null || exit + local file_to_persist_relative file_to_persist_destination file_to_persist_destination_folder + local -r tmp_file="/tmp/perms.acl" + for file_to_persist in "${files_to_persist[@]}"; do + if [[ ! -f "$file_to_persist" && ! -d "$file_to_persist" ]]; then + error "Cannot persist '${file_to_persist}' because it does not exist" + return 1 + fi + file_to_persist_relative="$(relativize "$file_to_persist" "$install_dir")" + file_to_persist_destination="${persist_dir}/${file_to_persist_relative}" + file_to_persist_destination_folder="$(dirname "$file_to_persist_destination")" + # Get original permissions for existing files, which will be applied later + # Exclude the root directory with 'sed', to avoid issues when copying the entirety of it to a volume + getfacl -R "$file_to_persist_relative" | sed -E '/# file: (\..+|[^.])/,$!d' > "$tmp_file" + # Copy directories to the volume + ensure_dir_exists "$file_to_persist_destination_folder" + cp -Lr --preserve=links "$file_to_persist_relative" "$file_to_persist_destination_folder" + # Restore permissions + pushd "$persist_dir" >/dev/null || exit + if am_i_root; then + setfacl --restore="$tmp_file" + else + # When running as non-root, don't change ownership + setfacl --restore=<(grep -E -v '^# (owner|group):' "$tmp_file") + fi + popd >/dev/null || exit + done + popd >/dev/null || exit + rm -f "$tmp_file" + # Install the persisted files into the installation directory, via symlinks + restore_persisted_app "$@" +} + +######################## +# Restore a persisted application directory +# Globals: +# BITNAMI_ROOT_DIR +# BITNAMI_VOLUME_DIR +# FORCE_MAJOR_UPGRADE +# Arguments: +# $1 - App folder name +# $2 - List of app files to restore +# Returns: +# true if all steps succeeded, false otherwise +######################### +restore_persisted_app() { + local -r app="${1:?missing app}" + local -a files_to_restore + read -r -a files_to_restore <<< "$(tr ',;:' ' ' <<< "$2")" + local -r install_dir="${BITNAMI_ROOT_DIR}/${app}" + local -r persist_dir="${BITNAMI_VOLUME_DIR}/${app}" + # Restore the individual persisted files + if [[ "${#files_to_restore[@]}" -le 0 ]]; then + warn "No persisted files are configured to be restored" + return + fi + local file_to_restore_relative file_to_restore_origin file_to_restore_destination + for file_to_restore in "${files_to_restore[@]}"; do + file_to_restore_relative="$(relativize "$file_to_restore" "$install_dir")" + # We use 'realpath --no-symlinks' to ensure that the case of '.' is covered and the directory is removed + file_to_restore_origin="$(realpath --no-symlinks "${install_dir}/${file_to_restore_relative}")" + file_to_restore_destination="$(realpath --no-symlinks "${persist_dir}/${file_to_restore_relative}")" + rm -rf "$file_to_restore_origin" + ln -sfn "$file_to_restore_destination" "$file_to_restore_origin" + done +} + +######################## +# Check if an application directory was already persisted +# Globals: +# BITNAMI_VOLUME_DIR +# Arguments: +# $1 - App folder name +# Returns: +# true if all steps succeeded, false otherwise +######################### +is_app_initialized() { + local -r app="${1:?missing app}" + local -r persist_dir="${BITNAMI_VOLUME_DIR}/${app}" + if ! is_mounted_dir_empty "$persist_dir"; then + true + else + false + fi +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libservice.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libservice.sh new file mode 100644 index 00000000..a713bd10 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libservice.sh @@ -0,0 +1,273 @@ +#!/bin/bash +# +# Library for managing services + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/libvalidations.sh +. /opt/bitnami/scripts/liblog.sh + +# Functions + +######################## +# Read the provided pid file and returns a PID +# Arguments: +# $1 - Pid file +# Returns: +# PID +######################### +get_pid_from_file() { + local pid_file="${1:?pid file is missing}" + + if [[ -f "$pid_file" ]]; then + if [[ -n "$(< "$pid_file")" ]] && [[ "$(< "$pid_file")" -gt 0 ]]; then + echo "$(< "$pid_file")" + fi + fi +} + +######################## +# Check if a provided PID corresponds to a running service +# Arguments: +# $1 - PID +# Returns: +# Boolean +######################### +is_service_running() { + local pid="${1:?pid is missing}" + + kill -0 "$pid" 2>/dev/null +} + +######################## +# Stop a service by sending a termination signal to its pid +# Arguments: +# $1 - Pid file +# $2 - Signal number (optional) +# Returns: +# None +######################### +stop_service_using_pid() { + local pid_file="${1:?pid file is missing}" + local signal="${2:-}" + local pid + + pid="$(get_pid_from_file "$pid_file")" + [[ -z "$pid" ]] || ! is_service_running "$pid" && return + + if [[ -n "$signal" ]]; then + kill "-${signal}" "$pid" + else + kill "$pid" + fi + + local counter=10 + while [[ "$counter" -ne 0 ]] && is_service_running "$pid"; do + sleep 1 + counter=$((counter - 1)) + done +} + +######################## +# Start cron daemon +# Arguments: +# None +# Returns: +# true if started correctly, false otherwise +######################### +cron_start() { + if [[ -x "/usr/sbin/cron" ]]; then + /usr/sbin/cron + elif [[ -x "/usr/sbin/crond" ]]; then + /usr/sbin/crond + else + false + fi +} + +######################## +# Generate a cron configuration file for a given service +# Arguments: +# $1 - Service name +# $2 - Command +# Flags: +# --run-as - User to run as (default: root) +# --schedule - Cron schedule configuration (default: * * * * *) +# Returns: +# None +######################### +generate_cron_conf() { + local service_name="${1:?service name is missing}" + local cmd="${2:?command is missing}" + local run_as="root" + local schedule="* * * * *" + local clean="true" + + local clean="true" + + # Parse optional CLI flags + shift 2 + while [[ "$#" -gt 0 ]]; do + case "$1" in + --run-as) + shift + run_as="$1" + ;; + --schedule) + shift + schedule="$1" + ;; + --no-clean) + clean="false" + ;; + *) + echo "Invalid command line flag ${1}" >&2 + return 1 + ;; + esac + shift + done + + mkdir -p /etc/cron.d + if "$clean"; then + echo "${schedule} ${run_as} ${cmd}" > /etc/cron.d/"$service_name" + else + echo "${schedule} ${run_as} ${cmd}" >> /etc/cron.d/"$service_name" + fi +} + +######################## +# Remove a cron configuration file for a given service +# Arguments: +# $1 - Service name +# Returns: +# None +######################### +remove_cron_conf() { + local service_name="${1:?service name is missing}" + local cron_conf_dir="/etc/monit/conf.d" + rm -f "${cron_conf_dir}/${service_name}" +} + +######################## +# Generate a monit configuration file for a given service +# Arguments: +# $1 - Service name +# $2 - Pid file +# $3 - Start command +# $4 - Stop command +# Flags: +# --disable - Whether to disable the monit configuration +# Returns: +# None +######################### +generate_monit_conf() { + local service_name="${1:?service name is missing}" + local pid_file="${2:?pid file is missing}" + local start_command="${3:?start command is missing}" + local stop_command="${4:?stop command is missing}" + local monit_conf_dir="/etc/monit/conf.d" + local disabled="no" + + # Parse optional CLI flags + shift 4 + while [[ "$#" -gt 0 ]]; do + case "$1" in + --disable) + disabled="yes" + ;; + *) + echo "Invalid command line flag ${1}" >&2 + return 1 + ;; + esac + shift + done + + is_boolean_yes "$disabled" && conf_suffix=".disabled" + mkdir -p "$monit_conf_dir" + cat >"${monit_conf_dir}/${service_name}.conf${conf_suffix:-}" <&2 + return 1 + ;; + esac + shift + done + + mkdir -p "$logrotate_conf_dir" + cat <"${logrotate_conf_dir}/${service_name}" +${log_path} { + ${period} + rotate ${rotations} + dateext + compress + copytruncate + missingok +$(indent "$extra" 2) +} +EOF +} + +######################## +# Remove a logrotate configuration file +# Arguments: +# $1 - Service name +# Returns: +# None +######################### +remove_logrotate_conf() { + local service_name="${1:?service name is missing}" + local logrotate_conf_dir="/etc/logrotate.d" + rm -f "${logrotate_conf_dir}/${service_name}" +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libvalidations.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libvalidations.sh new file mode 100644 index 00000000..2d7aaa94 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libvalidations.sh @@ -0,0 +1,264 @@ +#!/bin/bash +# +# Validation functions library + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/liblog.sh + +# Functions + +######################## +# Check if the provided argument is an integer +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_int() { + local -r int="${1:?missing value}" + if [[ "$int" =~ ^-?[0-9]+ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is a positive integer +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_positive_int() { + local -r int="${1:?missing value}" + if is_int "$int" && (( "${int}" >= 0 )); then + true + else + false + fi +} + +######################## +# Check if the provided argument is a boolean or is the string 'yes/true' +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_boolean_yes() { + local -r bool="${1:-}" + # comparison is performed without regard to the case of alphabetic characters + shopt -s nocasematch + if [[ "$bool" = 1 || "$bool" =~ ^(yes|true)$ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is a boolean yes/no value +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_yes_no_value() { + local -r bool="${1:-}" + if [[ "$bool" =~ ^(yes|no)$ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is a boolean true/false value +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_true_false_value() { + local -r bool="${1:-}" + if [[ "$bool" =~ ^(true|false)$ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is a boolean 1/0 value +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_1_0_value() { + local -r bool="${1:-}" + if [[ "$bool" =~ ^[10]$ ]]; then + true + else + false + fi +} + +######################## +# Check if the provided argument is an empty string or not defined +# Arguments: +# $1 - Value to check +# Returns: +# Boolean +######################### +is_empty_value() { + local -r val="${1:-}" + if [[ -z "$val" ]]; then + true + else + false + fi +} + +######################## +# Validate if the provided argument is a valid port +# Arguments: +# $1 - Port to validate +# Returns: +# Boolean and error message +######################### +validate_port() { + local value + local unprivileged=0 + + # Parse flags + while [[ "$#" -gt 0 ]]; do + case "$1" in + -unprivileged) + unprivileged=1 + ;; + --) + shift + break + ;; + -*) + stderr_print "unrecognized flag $1" + return 1 + ;; + *) + break + ;; + esac + shift + done + + if [[ "$#" -gt 1 ]]; then + echo "too many arguments provided" + return 2 + elif [[ "$#" -eq 0 ]]; then + stderr_print "missing port argument" + return 1 + else + value=$1 + fi + + if [[ -z "$value" ]]; then + echo "the value is empty" + return 1 + else + if ! is_int "$value"; then + echo "value is not an integer" + return 2 + elif [[ "$value" -lt 0 ]]; then + echo "negative value provided" + return 2 + elif [[ "$value" -gt 65535 ]]; then + echo "requested port is greater than 65535" + return 2 + elif [[ "$unprivileged" = 1 && "$value" -lt 1024 ]]; then + echo "privileged port requested" + return 3 + fi + fi +} + +######################## +# Validate if the provided argument is a valid IPv4 address +# Arguments: +# $1 - IP to validate +# Returns: +# Boolean +######################### +validate_ipv4() { + local ip="${1:?ip is missing}" + local stat=1 + + if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then + read -r -a ip_array <<< "$(tr '.' ' ' <<< "$ip")" + [[ ${ip_array[0]} -le 255 && ${ip_array[1]} -le 255 \ + && ${ip_array[2]} -le 255 && ${ip_array[3]} -le 255 ]] + stat=$? + fi + return $stat +} + +######################## +# Validate a string format +# Arguments: +# $1 - String to validate +# Returns: +# Boolean +######################### +validate_string() { + local string + local min_length=-1 + local max_length=-1 + + # Parse flags + while [ "$#" -gt 0 ]; do + case "$1" in + -min-length) + shift + min_length=${1:-} + ;; + -max-length) + shift + max_length=${1:-} + ;; + --) + shift + break + ;; + -*) + stderr_print "unrecognized flag $1" + return 1 + ;; + *) + break + ;; + esac + shift + done + + if [ "$#" -gt 1 ]; then + stderr_print "too many arguments provided" + return 2 + elif [ "$#" -eq 0 ]; then + stderr_print "missing string" + return 1 + else + string=$1 + fi + + if [[ "$min_length" -ge 0 ]] && [[ "${#string}" -lt "$min_length" ]]; then + echo "string length is less than $min_length" + return 1 + fi + if [[ "$max_length" -ge 0 ]] && [[ "${#string}" -gt "$max_length" ]]; then + echo "string length is great than $max_length" + return 1 + fi +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libversion.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libversion.sh new file mode 100644 index 00000000..f3bc7568 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libversion.sh @@ -0,0 +1,49 @@ +#!/bin/bash +# +# Library for managing versions strings + +# shellcheck disable=SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/liblog.sh + +# Functions +######################## +# Gets semantic version +# Arguments: +# $1 - version: string to extract major.minor.patch +# $2 - section: 1 to extract major, 2 to extract minor, 3 to extract patch +# Returns: +# array with the major, minor and release +######################### +get_sematic_version () { + local version="${1:?version is required}" + local section="${2:?section is required}" + local -a version_sections + + #Regex to parse versions: x.y.z + local -r regex='([0-9]+)(\.([0-9]+)(\.([0-9]+))?)?' + + if [[ "$version" =~ $regex ]]; then + local i=1 + local j=1 + local n=${#BASH_REMATCH[*]} + + while [[ $i -lt $n ]]; do + if [[ -n "${BASH_REMATCH[$i]}" ]] && [[ "${BASH_REMATCH[$i]:0:1}" != '.' ]]; then + version_sections[$j]=${BASH_REMATCH[$i]} + ((j++)) + fi + ((i++)) + done + + local number_regex='^[0-9]+$' + if [[ "$section" =~ $number_regex ]] && (( section > 0 )) && (( section <= 3 )); then + echo "${version_sections[$section]}" + return + else + stderr_print "Section allowed values are: 1, 2, and 3" + return 1 + fi + fi +} diff --git a/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libwebserver.sh b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libwebserver.sh new file mode 100644 index 00000000..818c2158 --- /dev/null +++ b/keycloak-artemis/prebuildfs/opt/bitnami/scripts/libwebserver.sh @@ -0,0 +1,458 @@ +#!/bin/bash +# +# Bitnami web server handler library + +# shellcheck disable=SC1090,SC1091 + +# Load generic libraries +. /opt/bitnami/scripts/liblog.sh + +######################## +# Execute a command (or list of commands) with the web server environment and library loaded +# Globals: +# * +# Arguments: +# None +# Returns: +# None +######################### +web_server_execute() { + local -r web_server="${1:?missing web server}" + shift + # Run program in sub-shell to avoid web server environment getting loaded when not necessary + ( + . "/opt/bitnami/scripts/lib${web_server}.sh" + . "/opt/bitnami/scripts/${web_server}-env.sh" + "$@" + ) +} + +######################## +# Prints the list of enabled web servers +# Globals: +# None +# Arguments: +# None +# Returns: +# None +######################### +web_server_list() { + local -r -a supported_web_servers=(apache nginx) + local -a existing_web_servers=() + for web_server in "${supported_web_servers[@]}"; do + [[ -f "/opt/bitnami/scripts/${web_server}-env.sh" ]] && existing_web_servers+=("$web_server") + done + echo "${existing_web_servers[@]:-}" +} + +######################## +# Prints the currently-enabled web server type (only one, in order of preference) +# Globals: +# None +# Arguments: +# None +# Returns: +# None +######################### +web_server_type() { + local -a web_servers + read -r -a web_servers <<< "$(web_server_list)" + echo "${web_servers[0]:-}" +} + +######################## +# Validate that a supported web server is configured +# Globals: +# None +# Arguments: +# None +# Returns: +# None +######################### +web_server_validate() { + local error_code=0 + local supported_web_servers=("apache" "nginx") + + # Auxiliary functions + print_validation_error() { + error "$1" + error_code=1 + } + + if [[ -z "$(web_server_type)" || ! " ${supported_web_servers[*]} " == *" $(web_server_type) "* ]]; then + print_validation_error "Could not detect any supported web servers. It must be one of: ${supported_web_servers[*]}" + elif ! web_server_execute "$(web_server_type)" type -t "is_$(web_server_type)_running" >/dev/null; then + print_validation_error "Could not load the $(web_server_type) web server library from /opt/bitnami/scripts. Check that it exists and is readable." + fi + + return "$error_code" +} + +######################## +# Check whether the web server is running +# Globals: +# * +# Arguments: +# None +# Returns: +# true if the web server is running, false otherwise +######################### +is_web_server_running() { + "is_$(web_server_type)_running" +} + +######################## +# Start web server +# Globals: +# * +# Arguments: +# None +# Returns: +# None +######################### +web_server_start() { + info "Starting $(web_server_type) in background" + "${BITNAMI_ROOT_DIR}/scripts/$(web_server_type)/start.sh" +} + +######################## +# Stop web server +# Globals: +# * +# Arguments: +# None +# Returns: +# None +######################### +web_server_stop() { + info "Stopping $(web_server_type)" + "${BITNAMI_ROOT_DIR}/scripts/$(web_server_type)/stop.sh" +} + +######################## +# Restart web server +# Globals: +# * +# Arguments: +# None +# Returns: +# None +######################### +web_server_restart() { + info "Restarting $(web_server_type)" + "${BITNAMI_ROOT_DIR}/scripts/$(web_server_type)/restart.sh" +} + +######################## +# Reload web server +# Globals: +# * +# Arguments: +# None +# Returns: +# None +######################### +web_server_reload() { + "${BITNAMI_ROOT_DIR}/scripts/$(web_server_type)/reload.sh" +} + +######################## +# Ensure a web server application configuration exists (i.e. Apache virtual host format or NGINX server block) +# It serves as a wrapper for the specific web server function +# Globals: +# * +# Arguments: +# $1 - App name +# Flags: +# --type - Application type, which has an effect on which configuration template to use +# --hosts - Host listen addresses +# --server-name - Server name +# --server-aliases - Server aliases +# --allow-remote-connections - Whether to allow remote connections or to require local connections +# --disable - Whether to render server configurations with a .disabled prefix +# --disable-http - Whether to render the app's HTTP server configuration with a .disabled prefix +# --disable-https - Whether to render the app's HTTPS server configuration with a .disabled prefix +# --http-port - HTTP port number +# --https-port - HTTPS port number +# --document-root - Path to document root directory +# Apache-specific flags: +# --apache-additional-configuration - Additional vhost configuration (no default) +# --apache-additional-http-configuration - Additional HTTP vhost configuration (no default) +# --apache-additional-https-configuration - Additional HTTPS vhost configuration (no default) +# --apache-before-vhost-configuration - Configuration to add before the directive (no default) +# --apache-allow-override - Whether to allow .htaccess files (only allowed when --move-htaccess is set to 'no' and type is not defined) +# --apache-extra-directory-configuration - Extra configuration for the document root directory +# --apache-proxy-address - Address where to proxy requests +# --apache-proxy-configuration - Extra configuration for the proxy +# --apache-proxy-http-configuration - Extra configuration for the proxy HTTP vhost +# --apache-proxy-https-configuration - Extra configuration for the proxy HTTPS vhost +# --apache-move-htaccess - Move .htaccess files to a common place so they can be loaded during Apache startup (only allowed when type is not defined) +# NGINX-specific flags: +# --nginx-additional-configuration - Additional server block configuration (no default) +# --nginx-external-configuration - Configuration external to server block (no default) +# Returns: +# true if the configuration was enabled, false otherwise +######################## +ensure_web_server_app_configuration_exists() { + local app="${1:?missing app}" + shift + local -a apache_args nginx_args web_servers args_var + apache_args=("$app") + nginx_args=("$app") + # Validate arguments + while [[ "$#" -gt 0 ]]; do + case "$1" in + # Common flags + --disable \ + | --disable-http \ + | --disable-https \ + ) + apache_args+=("$1") + nginx_args+=("$1") + ;; + --hosts \ + | --server-name \ + | --server-aliases \ + | --type \ + | --allow-remote-connections \ + | --http-port \ + | --https-port \ + | --document-root \ + ) + apache_args+=("$1" "${2:?missing value}") + nginx_args+=("$1" "${2:?missing value}") + shift + ;; + + # Specific Apache flags + --apache-additional-configuration \ + | --apache-additional-http-configuration \ + | --apache-additional-https-configuration \ + | --apache-before-vhost-configuration \ + | --apache-allow-override \ + | --apache-extra-directory-configuration \ + | --apache-proxy-address \ + | --apache-proxy-configuration \ + | --apache-proxy-http-configuration \ + | --apache-proxy-https-configuration \ + | --apache-move-htaccess \ + ) + apache_args+=("${1//apache-/}" "${2:?missing value}") + shift + ;; + + # Specific NGINX flags + --nginx-additional-configuration \ + | --nginx-external-configuration) + nginx_args+=("${1//nginx-/}" "${2:?missing value}") + shift + ;; + + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + read -r -a web_servers <<< "$(web_server_list)" + for web_server in "${web_servers[@]}"; do + args_var="${web_server}_args[@]" + web_server_execute "$web_server" "ensure_${web_server}_app_configuration_exists" "${!args_var}" + done +} + +######################## +# Ensure a web server application configuration does not exist anymore (i.e. Apache virtual host format or NGINX server block) +# It serves as a wrapper for the specific web server function +# Globals: +# * +# Arguments: +# $1 - App name +# Returns: +# true if the configuration was disabled, false otherwise +######################## +ensure_web_server_app_configuration_not_exists() { + local app="${1:?missing app}" + local -a web_servers + read -r -a web_servers <<< "$(web_server_list)" + for web_server in "${web_servers[@]}"; do + web_server_execute "$web_server" "ensure_${web_server}_app_configuration_not_exists" "$app" + done +} + +######################## +# Ensure the web server loads the configuration for an application in a URL prefix +# It serves as a wrapper for the specific web server function +# Globals: +# * +# Arguments: +# $1 - App name +# Flags: +# --allow-remote-connections - Whether to allow remote connections or to require local connections +# --document-root - Path to document root directory +# --prefix - URL prefix from where it will be accessible (i.e. /myapp) +# --type - Application type, which has an effect on what configuration template will be used +# Apache-specific flags: +# --apache-additional-configuration - Additional vhost configuration (no default) +# --apache-allow-override - Whether to allow .htaccess files (only allowed when --move-htaccess is set to 'no') +# --apache-extra-directory-configuration - Extra configuration for the document root directory +# --apache-move-htaccess - Move .htaccess files to a common place so they can be loaded during Apache startup +# NGINX-specific flags: +# --nginx-additional-configuration - Additional server block configuration (no default) +# Returns: +# true if the configuration was enabled, false otherwise +######################## +ensure_web_server_prefix_configuration_exists() { + local app="${1:?missing app}" + shift + local -a apache_args nginx_args web_servers args_var + apache_args=("$app") + nginx_args=("$app") + # Validate arguments + while [[ "$#" -gt 0 ]]; do + case "$1" in + # Common flags + --allow-remote-connections \ + | --document-root \ + | --prefix \ + | --type \ + ) + apache_args+=("$1" "${2:?missing value}") + nginx_args+=("$1" "${2:?missing value}") + shift + ;; + + # Specific Apache flags + --apache-additional-configuration \ + | --apache-allow-override \ + | --apache-extra-directory-configuration \ + | --apache-move-htaccess \ + ) + apache_args+=("${1//apache-/}" "$2") + shift + ;; + + # Specific NGINX flags + --nginx-additional-configuration) + nginx_args+=("${1//nginx-/}" "$2") + shift + ;; + + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + read -r -a web_servers <<< "$(web_server_list)" + for web_server in "${web_servers[@]}"; do + args_var="${web_server}_args[@]" + web_server_execute "$web_server" "ensure_${web_server}_prefix_configuration_exists" "${!args_var}" + done +} + +######################## +# Ensure a web server application configuration is updated with the runtime configuration (i.e. ports) +# It serves as a wrapper for the specific web server function +# Globals: +# * +# Arguments: +# $1 - App name +# Flags: +# --hosts - Host listen addresses +# --server-name - Server name +# --server-aliases - Server aliases +# --enable-http - Enable HTTP app configuration (if not enabled already) +# --enable-https - Enable HTTPS app configuration (if not enabled already) +# --disable-http - Disable HTTP app configuration (if not disabled already) +# --disable-https - Disable HTTPS app configuration (if not disabled already) +# --http-port - HTTP port number +# --https-port - HTTPS port number +# Returns: +# true if the configuration was updated, false otherwise +######################## +web_server_update_app_configuration() { + local app="${1:?missing app}" + shift + local -a args web_servers + args=("$app") + # Validate arguments + while [[ "$#" -gt 0 ]]; do + case "$1" in + # Common flags + --enable-http \ + | --enable-https \ + | --disable-http \ + | --disable-https \ + ) + args+=("$1") + ;; + --hosts \ + | --server-name \ + | --server-aliases \ + | --http-port \ + | --https-port \ + ) + args+=("$1" "${2:?missing value}") + shift + ;; + + *) + echo "Invalid command line flag $1" >&2 + return 1 + ;; + esac + shift + done + read -r -a web_servers <<< "$(web_server_list)" + for web_server in "${web_servers[@]}"; do + web_server_execute "$web_server" "${web_server}_update_app_configuration" "${args[@]}" + done +} + +######################## +# Enable loading page, which shows users that the initialization process is not yet completed +# Globals: +# * +# Arguments: +# None +# Returns: +# None +######################### +web_server_enable_loading_page() { + ensure_web_server_app_configuration_exists "__loading" --hosts "_default_" \ + --apache-additional-configuration " +# Show a HTTP 503 Service Unavailable page by default +RedirectMatch 503 ^/$ +# Show index.html if server is answering with 404 Not Found or 503 Service Unavailable status codes +ErrorDocument 404 /index.html +ErrorDocument 503 /index.html" \ + --nginx-additional-configuration " +# Show a HTTP 503 Service Unavailable page by default +location / { + return 503; +} +# Show index.html if server is answering with 404 Not Found or 503 Service Unavailable status codes +error_page 404 @installing; +error_page 503 @installing; +location @installing { + rewrite ^(.*)$ /index.html break; +}" + web_server_reload +} + +######################## +# Enable loading page, which shows users that the initialization process is not yet completed +# Globals: +# * +# Arguments: +# None +# Returns: +# None +######################### +web_server_disable_install_page() { + ensure_web_server_app_configuration_not_exists "__loading" + web_server_reload +} diff --git a/keycloak-artemis/prebuildfs/usr/sbin/install_packages b/keycloak-artemis/prebuildfs/usr/sbin/install_packages new file mode 100644 index 00000000..c9577647 --- /dev/null +++ b/keycloak-artemis/prebuildfs/usr/sbin/install_packages @@ -0,0 +1,24 @@ +#!/bin/sh +set -e +set -u +export DEBIAN_FRONTEND=noninteractive +n=0 +max=2 +until [ $n -gt $max ]; do + set +e + ( + apt-get update -qq && + apt-get install -y --no-install-recommends "$@" + ) + CODE=$? + set -e + if [ $CODE -eq 0 ]; then + break + fi + if [ $n -eq $max ]; then + exit $CODE + fi + echo "apt failed, retrying" + n=$(($n + 1)) +done +rm -r /var/lib/apt/lists /var/cache/apt/archives diff --git a/keycloak-artemis/rootfs/opt/bitnami/scripts/java/entrypoint.sh b/keycloak-artemis/rootfs/opt/bitnami/scripts/java/entrypoint.sh new file mode 100644 index 00000000..15cf7d18 --- /dev/null +++ b/keycloak-artemis/rootfs/opt/bitnami/scripts/java/entrypoint.sh @@ -0,0 +1,17 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace # Uncomment this line for debugging purposes + +# Load libraries +. /opt/bitnami/scripts/libbitnami.sh +. /opt/bitnami/scripts/liblog.sh + +print_welcome_page + +echo "" +exec "$@" diff --git a/keycloak-artemis/rootfs/opt/bitnami/scripts/java/postunpack.sh b/keycloak-artemis/rootfs/opt/bitnami/scripts/java/postunpack.sh new file mode 100644 index 00000000..24a5c9bc --- /dev/null +++ b/keycloak-artemis/rootfs/opt/bitnami/scripts/java/postunpack.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace # Uncomment this line for debugging purpose + +# Load libraries +. /opt/bitnami/scripts/libfile.sh +. /opt/bitnami/scripts/liblog.sh + +# +# Java post-unpack operations +# + +# Override default files in the Java security directory. This is used for +# custom base images (with custom CA certificates or block lists is used) + +if ! is_dir_empty "$JAVA_EXTRA_SECURITY_DIR"; then + info "Adding custom CAs to the Java security folder" + cp -Lr "$JAVA_EXTRA_SECURITY_DIR" /opt/bitnami/java/lib/security +fi diff --git a/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak-env.sh b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak-env.sh new file mode 100644 index 00000000..33eb1783 --- /dev/null +++ b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak-env.sh @@ -0,0 +1,162 @@ +#!/bin/bash +# +# Environment configuration for keycloak + +# The values for all environment variables will be set in the below order of precedence +# 1. Custom environment variables defined below after Bitnami defaults +# 2. Constants defined in this file (environment variables with no default), i.e. BITNAMI_ROOT_DIR +# 3. Environment variables overridden via external files using *_FILE variables (see below) +# 4. Environment variables set externally (i.e. current Bash context/Dockerfile/userdata) + +# Load logging library +# shellcheck disable=SC1090,SC1091 +. /opt/bitnami/scripts/liblog.sh + +export BITNAMI_ROOT_DIR="/opt/bitnami" +export BITNAMI_VOLUME_DIR="/bitnami" + +# Logging configuration +export MODULE="${MODULE:-keycloak}" +export BITNAMI_DEBUG="${BITNAMI_DEBUG:-false}" + +# By setting an environment variable matching *_FILE to a file path, the prefixed environment +# variable will be overridden with the value specified in that file +keycloak_env_vars=( + KEYCLOAK_MOUNTED_CONF_DIR + KEYCLOAK_MANAGEMENT_USER + KEYCLOAK_MANAGEMENT_PASSWORD + KEYCLOAK_ADMIN_USER + KEYCLOAK_ADMIN_PASSWORD + KEYCLOAK_HTTP_PORT + KEYCLOAK_HTTPS_PORT + KEYCLOAK_BIND_ADDRESS + KEYCLOAK_FRONTEND_URL + KEYCLOAK_INIT_MAX_RETRIES + KEYCLOAK_CACHE_OWNERS_COUNT + KEYCLOAK_AUTH_CACHE_OWNERS_COUNT + KEYCLOAK_JGROUPS_DISCOVERY_PROTOCOL + KEYCLOAK_JGROUPS_DISCOVERY_PROPERTIES + KEYCLOAK_JGROUPS_TRANSPORT_STACK + KEYCLOAK_EXTRA_ARGS + KEYCLOAK_ENABLE_STATISTICS + KEYCLOAK_ENABLE_TLS + KEYCLOAK_TLS_TRUSTSTORE_FILE + KEYCLOAK_TLS_TRUSTSTORE_PASSWORD + KEYCLOAK_TLS_KEYSTORE_FILE + KEYCLOAK_TLS_KEYSTORE_PASSWORD + KEYCLOAK_LOG_LEVEL + KEYCLOAK_ROOT_LOG_LEVEL + KEYCLOAK_PROXY_ADDRESS_FORWARDING + KEYCLOAK_CREATE_ADMIN_USER + KEYCLOAK_DATABASE_HOST + KEYCLOAK_DATABASE_PORT + KEYCLOAK_DATABASE_USER + KEYCLOAK_DATABASE_NAME + KEYCLOAK_DATABASE_PASSWORD + KEYCLOAK_DATABASE_SCHEMA + KEYCLOAK_JDBC_PARAMS + KEYCLOAK_DAEMON_USER + KEYCLOAK_DAEMON_GROUP + KEYCLOAK_USER + KEYCLOAK_PASSWORD + CACHE_OWNERS_COUNT + CACHE_OWNERS_AUTH_SESSIONS_COUNT + JGROUPS_DISCOVERY_PROTOCOL + JGROUPS_DISCOVERY_PROPERTIES + JGROUPS_TRANSPORT_STACK + PROXY_ADDRESS_FORWARDING + DB_ADDR + DB_PORT + DB_USER + DB_DATABASE + DB_PASSWORD + DB_SCHEMA + JDBC_PARAMS +) +for env_var in "${keycloak_env_vars[@]}"; do + file_env_var="${env_var}_FILE" + if [[ -n "${!file_env_var:-}" ]]; then + if [[ -r "${!file_env_var:-}" ]]; then + export "${env_var}=$(< "${!file_env_var}")" + unset "${file_env_var}" + else + warn "Skipping export of '${env_var}'. '${!file_env_var:-}' is not readable." + fi + fi +done +unset keycloak_env_vars + +# Paths +export BITNAMI_VOLUME_DIR="/bitnami" +export JAVA_HOME="/opt/bitnami/java" +export KEYCLOAK_BASE_DIR="/opt/bitnami/keycloak" +export KEYCLOAK_BIN_DIR="$KEYCLOAK_BASE_DIR/bin" +export KEYCLOAK_STANDALONE_DIR="$KEYCLOAK_BASE_DIR/standalone" +export KEYCLOAK_LOG_DIR="$KEYCLOAK_STANDALONE_DIR/log" +export KEYCLOAK_TMP_DIR="$KEYCLOAK_STANDALONE_DIR/tmp" +export KEYCLOAK_DOMAIN_CONF_DIR="$KEYCLOAK_BASE_DIR/domain/configuration" +export KEYCLOAK_DOMAIN_TMP_DIR="$KEYCLOAK_BASE_DIR/domain/tmp" +export KEYCLOAK_DATA_DIR="$KEYCLOAK_STANDALONE_DIR/data" +export KEYCLOAK_DEPLOYMENTS_DIR="$KEYCLOAK_STANDALONE_DIR/deployments" +export WILDFLY_BASE_DIR="/opt/bitnami/wildfly" +export KEYCLOAK_VOLUME_DIR="/bitnami/keycloak" +export KEYCLOAK_CONF_DIR="$KEYCLOAK_STANDALONE_DIR/configuration" +export KEYCLOAK_MOUNTED_CONF_DIR="${KEYCLOAK_MOUNTED_CONF_DIR:-${KEYCLOAK_VOLUME_DIR}/configuration}" +export KEYCLOAK_INITSCRIPTS_DIR="/docker-entrypoint-initdb.d" +export KEYCLOAK_CONF_FILE="standalone-ha.xml" +export KEYCLOAK_DEFAULT_CONF_FILE="standalone-ha-default.xml" + +# Keycloak configuration +export KEYCLOAK_MANAGEMENT_USER="${KEYCLOAK_MANAGEMENT_USER:-manager}" +export KEYCLOAK_MANAGEMENT_PASSWORD="${KEYCLOAK_MANAGEMENT_PASSWORD:-bitnami1}" +KEYCLOAK_ADMIN_USER="${KEYCLOAK_ADMIN_USER:-"${KEYCLOAK_USER:-}"}" +export KEYCLOAK_ADMIN_USER="${KEYCLOAK_ADMIN_USER:-user}" +KEYCLOAK_ADMIN_PASSWORD="${KEYCLOAK_ADMIN_PASSWORD:-"${KEYCLOAK_PASSWORD:-}"}" +export KEYCLOAK_ADMIN_PASSWORD="${KEYCLOAK_ADMIN_PASSWORD:-bitnami}" +export KEYCLOAK_HTTP_PORT="${KEYCLOAK_HTTP_PORT:-8080}" +export KEYCLOAK_HTTPS_PORT="${KEYCLOAK_HTTPS_PORT:-8443}" +export KEYCLOAK_BIND_ADDRESS="${KEYCLOAK_BIND_ADDRESS:-$(hostname --fqdn)}" +export KEYCLOAK_FRONTEND_URL="${KEYCLOAK_FRONTEND_URL:-}" +export KEYCLOAK_INIT_MAX_RETRIES="${KEYCLOAK_INIT_MAX_RETRIES:-10}" +KEYCLOAK_CACHE_OWNERS_COUNT="${KEYCLOAK_CACHE_OWNERS_COUNT:-"${CACHE_OWNERS_COUNT:-}"}" +export KEYCLOAK_CACHE_OWNERS_COUNT="${KEYCLOAK_CACHE_OWNERS_COUNT:-1}" +KEYCLOAK_AUTH_CACHE_OWNERS_COUNT="${KEYCLOAK_AUTH_CACHE_OWNERS_COUNT:-"${CACHE_OWNERS_AUTH_SESSIONS_COUNT:-}"}" +export KEYCLOAK_AUTH_CACHE_OWNERS_COUNT="${KEYCLOAK_AUTH_CACHE_OWNERS_COUNT:-1}" +KEYCLOAK_JGROUPS_DISCOVERY_PROTOCOL="${KEYCLOAK_JGROUPS_DISCOVERY_PROTOCOL:-"${JGROUPS_DISCOVERY_PROTOCOL:-}"}" +export KEYCLOAK_JGROUPS_DISCOVERY_PROTOCOL="${KEYCLOAK_JGROUPS_DISCOVERY_PROTOCOL:-}" +KEYCLOAK_JGROUPS_DISCOVERY_PROPERTIES="${KEYCLOAK_JGROUPS_DISCOVERY_PROPERTIES:-"${JGROUPS_DISCOVERY_PROPERTIES:-}"}" +export KEYCLOAK_JGROUPS_DISCOVERY_PROPERTIES="${KEYCLOAK_JGROUPS_DISCOVERY_PROPERTIES:-}" +KEYCLOAK_JGROUPS_TRANSPORT_STACK="${KEYCLOAK_JGROUPS_TRANSPORT_STACK:-"${JGROUPS_TRANSPORT_STACK:-}"}" +export KEYCLOAK_JGROUPS_TRANSPORT_STACK="${KEYCLOAK_JGROUPS_TRANSPORT_STACK:-tcp}" +export KEYCLOAK_EXTRA_ARGS="${KEYCLOAK_EXTRA_ARGS:-}" +export KEYCLOAK_ENABLE_STATISTICS="${KEYCLOAK_ENABLE_STATISTICS:-false}" +export KEYCLOAK_ENABLE_TLS="${KEYCLOAK_ENABLE_TLS:-false}" +export KEYCLOAK_TLS_TRUSTSTORE_FILE="${KEYCLOAK_TLS_TRUSTSTORE_FILE:-}" +export KEYCLOAK_TLS_TRUSTSTORE_PASSWORD="${KEYCLOAK_TLS_TRUSTSTORE_PASSWORD:-}" +export KEYCLOAK_TLS_KEYSTORE_FILE="${KEYCLOAK_TLS_KEYSTORE_FILE:-}" +export KEYCLOAK_TLS_KEYSTORE_PASSWORD="${KEYCLOAK_TLS_KEYSTORE_PASSWORD:-}" +export KEYCLOAK_LOG_LEVEL="${KEYCLOAK_LOG_LEVEL:-INFO}" +export KEYCLOAK_ROOT_LOG_LEVEL="${KEYCLOAK_ROOT_LOG_LEVEL:-INFO}" +KEYCLOAK_PROXY_ADDRESS_FORWARDING="${KEYCLOAK_PROXY_ADDRESS_FORWARDING:-"${PROXY_ADDRESS_FORWARDING:-}"}" +export KEYCLOAK_PROXY_ADDRESS_FORWARDING="${KEYCLOAK_PROXY_ADDRESS_FORWARDING:-false}" +export KEYCLOAK_CREATE_ADMIN_USER="${KEYCLOAK_CREATE_ADMIN_USER:-true}" +KEYCLOAK_DATABASE_HOST="${KEYCLOAK_DATABASE_HOST:-"${DB_ADDR:-}"}" +export KEYCLOAK_DATABASE_HOST="${KEYCLOAK_DATABASE_HOST:-postgresql}" +KEYCLOAK_DATABASE_PORT="${KEYCLOAK_DATABASE_PORT:-"${DB_PORT:-}"}" +export KEYCLOAK_DATABASE_PORT="${KEYCLOAK_DATABASE_PORT:-5432}" +KEYCLOAK_DATABASE_USER="${KEYCLOAK_DATABASE_USER:-"${DB_USER:-}"}" +export KEYCLOAK_DATABASE_USER="${KEYCLOAK_DATABASE_USER:-bn_keycloak}" +KEYCLOAK_DATABASE_NAME="${KEYCLOAK_DATABASE_NAME:-"${DB_DATABASE:-}"}" +export KEYCLOAK_DATABASE_NAME="${KEYCLOAK_DATABASE_NAME:-bitnami_keycloak}" +KEYCLOAK_DATABASE_PASSWORD="${KEYCLOAK_DATABASE_PASSWORD:-"${DB_PASSWORD:-}"}" +export KEYCLOAK_DATABASE_PASSWORD="${KEYCLOAK_DATABASE_PASSWORD:-}" +KEYCLOAK_DATABASE_SCHEMA="${KEYCLOAK_DATABASE_SCHEMA:-"${DB_SCHEMA:-}"}" +export KEYCLOAK_DATABASE_SCHEMA="${KEYCLOAK_DATABASE_SCHEMA:-public}" +KEYCLOAK_JDBC_PARAMS="${KEYCLOAK_JDBC_PARAMS:-"${JDBC_PARAMS:-}"}" +export KEYCLOAK_JDBC_PARAMS="${KEYCLOAK_JDBC_PARAMS:-}" + +# System users (when running with a privileged user) +export KEYCLOAK_DAEMON_USER="${KEYCLOAK_DAEMON_USER:-keycloak}" +export KEYCLOAK_DAEMON_GROUP="${KEYCLOAK_DAEMON_GROUP:-keycloak}" + +# Custom environment variables may be defined below diff --git a/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/entrypoint.sh b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/entrypoint.sh new file mode 100644 index 00000000..5036f17d --- /dev/null +++ b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/entrypoint.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +#set -o xtrace # Uncomment this line for debugging purposes + +# Load libraries +. /opt/bitnami/scripts/libbitnami.sh +. /opt/bitnami/scripts/liblog.sh +. /opt/bitnami/scripts/libkeycloak.sh + +# Load keycloak environment variables +. /opt/bitnami/scripts/keycloak-env.sh + +print_welcome_page + +if [[ "$*" = *"/opt/bitnami/scripts/keycloak/run.sh"* ]]; then + info "** Starting keycloak setup **" + /opt/bitnami/scripts/keycloak/setup.sh + info "** keycloak setup finished! **" +fi + +echo "" +exec "$@" diff --git a/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/postunpack.sh b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/postunpack.sh new file mode 100644 index 00000000..9a042ab6 --- /dev/null +++ b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/postunpack.sh @@ -0,0 +1,24 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace # Uncomment this line for debugging purpose + +# Load libraries +. /opt/bitnami/scripts/libkeycloak.sh +. /opt/bitnami/scripts/libfs.sh +. /opt/bitnami/scripts/libos.sh + +# Load keycloak environment variables +. /opt/bitnami/scripts/keycloak-env.sh + +for dir in "$KEYCLOAK_LOG_DIR" "$KEYCLOAK_TMP_DIR" "$KEYCLOAK_VOLUME_DIR" "$KEYCLOAK_DATA_DIR" "$KEYCLOAK_CONF_DIR" "$KEYCLOAK_INITSCRIPTS_DIR" "$KEYCLOAK_DEPLOYMENTS_DIR" "$KEYCLOAK_DOMAIN_TMP_DIR" "$KEYCLOAK_DOMAIN_CONF_DIR" "${KEYCLOAK_BASE_DIR}/.installation"; do + ensure_dir_exists "$dir" + chmod -R g+rwX "$dir" +done + +cp "$KEYCLOAK_CONF_DIR"/"$KEYCLOAK_CONF_FILE" "$KEYCLOAK_CONF_DIR"/"$KEYCLOAK_DEFAULT_CONF_FILE" +keycloak_clean_from_restart diff --git a/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/run.sh b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/run.sh new file mode 100644 index 00000000..c18b17eb --- /dev/null +++ b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/run.sh @@ -0,0 +1,35 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace # Uncomment this line for debugging purpose + +# Load libraries +. /opt/bitnami/scripts/liblog.sh +. /opt/bitnami/scripts/libkeycloak.sh +. /opt/bitnami/scripts/libos.sh + +# Load keycloak environment variables +. /opt/bitnami/scripts/keycloak-env.sh + +info "** Starting keycloak **" +# Use only basename +conf_file="$(basename "$KEYCLOAK_CONF_FILE")" +start_command=("${KEYCLOAK_BIN_DIR}/standalone.sh" "-Djboss.bind.address=${KEYCLOAK_BIND_ADDRESS}" "-Djboss.bind.address.private=${KEYCLOAK_BIND_ADDRESS}" "-Dkeycloak.hostname.fixed.httpPort=${KEYCLOAK_HTTP_PORT}" "-c=${conf_file}" -b "0.0.0.0") +is_boolean_yes "$KEYCLOAK_ENABLE_TLS" && start_command=("${start_command[@]}" "-Dkeycloak.hostname.fixed.httpsPort=${KEYCLOAK_HTTPS_PORT}") +is_boolean_yes "$KEYCLOAK_ENABLE_STATISTICS" && start_command=("${start_command[@]}" "-Djboss.bind.address.management=0.0.0.0") +! is_empty_value "$KEYCLOAK_FRONTEND_URL" && start_command=("${start_command[@]}" "-Dkeycloak.frontendUrl=${KEYCLOAK_FRONTEND_URL}") +# Add extra args +if [[ -n "$KEYCLOAK_EXTRA_ARGS" ]]; then + read -r -a extra_args <<<"$KEYCLOAK_EXTRA_ARGS" + start_command+=("${extra_args[@]}") +fi + +if am_i_root; then + exec gosu "$KEYCLOAK_DAEMON_USER" "${start_command[@]}" +else + exec "${start_command[@]}" +fi diff --git a/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/setup.sh b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/setup.sh new file mode 100644 index 00000000..719210f4 --- /dev/null +++ b/keycloak-artemis/rootfs/opt/bitnami/scripts/keycloak/setup.sh @@ -0,0 +1,26 @@ +#!/bin/bash + +# shellcheck disable=SC1091 + +set -o errexit +set -o nounset +set -o pipefail +# set -o xtrace # Uncomment this line for debugging purpose + +# Load libraries +. /opt/bitnami/scripts/libkeycloak.sh + +# Load keycloak environment variables +. /opt/bitnami/scripts/keycloak-env.sh + +# Ensure keycloak environment variables are valid +keycloak_validate + +# Ensure 'daemon' user exists when running as 'root' +am_i_root && ensure_user_exists "$KEYCLOAK_DAEMON_USER" --group "$KEYCLOAK_DAEMON_GROUP" + +# Ensure keycloak is initialized +keycloak_initialize + +# keycloak init scripts +keycloak_custom_init_scripts diff --git a/keycloak-artemis/rootfs/opt/bitnami/scripts/libkeycloak.sh b/keycloak-artemis/rootfs/opt/bitnami/scripts/libkeycloak.sh new file mode 100644 index 00000000..727ac904 --- /dev/null +++ b/keycloak-artemis/rootfs/opt/bitnami/scripts/libkeycloak.sh @@ -0,0 +1,439 @@ +#!/bin/bash +# +# Bitnami Keycloak library + +# shellcheck disable=SC1090,SC1091 + +# Load Generic Libraries +. /opt/bitnami/scripts/libfs.sh +. /opt/bitnami/scripts/liblog.sh +. /opt/bitnami/scripts/libnet.sh +. /opt/bitnami/scripts/libos.sh +. /opt/bitnami/scripts/libvalidations.sh + +######################## +# Validate settings in KEYCLOAK_* env. variables +# Globals: +# KEYCLOAK_* +# Arguments: +# None +# Returns: +# None +######################### +keycloak_validate() { + info "Validating settings in KEYCLOAK_* env vars..." + local error_code=0 + + # Auxiliary functions + print_validation_error() { + error "$1" + error_code=1 + } + + check_allowed_port() { + local port_var="${1:?missing port variable}" + local -a validate_port_args=() + ! am_i_root && validate_port_args+=("-unprivileged") + validate_port_args+=("${!port_var}") + if ! err=$(validate_port "${validate_port_args[@]}"); then + print_validation_error "An invalid port was specified in the environment variable ${port_var}: ${err}." + fi + } + + if is_boolean_yes "$KEYCLOAK_ENABLE_TLS"; then + if is_empty_value "$KEYCLOAK_TLS_TRUSTSTORE_FILE"; then + print_validation_error "Path to the TLS truststore file not defined. Please set the KEYCLOAK_TLS_TRUSTSTORE_FILE variable to the mounted truststore" + fi + if is_empty_value "$KEYCLOAK_TLS_KEYSTORE_FILE"; then + print_validation_error "Path to the TLS keystore file not defined. Please set the KEYCLOAK_TLS_KEYSTORE_FILE variable to the mounted keystore" + fi + fi + + if ! validate_ipv4 "${KEYCLOAK_BIND_ADDRESS}"; then + if ! is_hostname_resolved "${KEYCLOAK_BIND_ADDRESS}"; then + print_validation_error print_validation_error "The value for KEYCLOAK_BIND_ADDRESS ($KEYCLOAK_BIND_ADDRESS) should be an IPv4 address or it must be a resolvable hostname" + fi + fi + + if ! is_empty_value "$KEYCLOAK_JGROUPS_DISCOVERY_PROTOCOL" && is_empty_value "$KEYCLOAK_JGROUPS_TRANSPORT_STACK"; then + print_validation_error "jgroups discovery protocol configured but transport stack not set. Please set the KEYCLOAK_JGROUPS_TRANSPORT_STACK variable with the proper stack" + fi + + if [[ "$KEYCLOAK_HTTP_PORT" -eq "$KEYCLOAK_HTTPS_PORT" ]]; then + print_validation_error "KEYCLOAK_HTTP_PORT and KEYCLOAK_HTTPS_PORT are bound to the same port!" + fi + check_allowed_port KEYCLOAK_HTTP_PORT + check_allowed_port KEYCLOAK_HTTPS_PORT + + for var in KEYCLOAK_CREATE_ADMIN_USER KEYCLOAK_ENABLE_TLS KEYCLOAK_ENABLE_STATISTICS; do + if ! is_true_false_value "${!var}"; then + print_validation_error "The allowed values for $var are [true, false]" + fi + done + + for var in KEYCLOAK_INIT_MAX_RETRIES KEYCLOAK_CACHE_OWNERS_COUNT KEYCLOAK_AUTH_CACHE_OWNERS_COUNT; do + if ! is_positive_int "${!var}"; then + print_validation_error "The variable $var must be positive integer" + fi + done + + [[ "$error_code" -eq 0 ]] || exit "$error_code" +} + +######################## +# Configure database settings using JBoss CLI +# Globals: +# KEYCLOAK_* +# Arguments: +# None +# Returns: +# None +######################### +keycloak_configure_database() { + # Prepare JDBC Params if set - add '?' at the beginning if the value is not empty and doesn't start with '?' + local jdbc_params + jdbc_params="$(echo "$KEYCLOAK_JDBC_PARAMS" | sed -E '/^$|^\?+.*$/!s/^/?/')" + + info "Configuring database settings" + debug_execute jboss-cli.sh < ${KEYCLOAK_TLS_TRUSTSTORE_FILE}, password => ${KEYCLOAK_TLS_TRUSTSTORE_PASSWORD}, hostname-verification-policy => "WILDCARD", disabled => "false"}) +run-batch +stop-embedded-server +EOF +} + +######################## +# Configure logging settings using JBoss CLI +# Globals: +# KEYCLOAK_* +# Arguments: +# None +# Returns: +# None +######################### +keycloak_configure_loglevel() { + info "Configuring log level" + debug_execute jboss-cli.sh <"$tmp_file" + while read -r f; do + case "$f" in + *.sh) + if [[ -x "$f" ]]; then + debug "Executing $f" + "$f" + else + debug "Sourcing $f" + . "$f" + fi + ;; + *) debug "Ignoring $f" ;; + esac + done <$tmp_file + rm -f "$tmp_file" + touch "$KEYCLOAK_VOLUME_DIR"/.user_scripts_initialized + fi +} diff --git a/keycloak-artemis/standalone/deployments/spi-keycloak.jar b/keycloak-artemis/standalone/deployments/spi-keycloak.jar new file mode 100644 index 00000000..eaee3fa4 Binary files /dev/null and b/keycloak-artemis/standalone/deployments/spi-keycloak.jar differ diff --git a/keycloak/theme/base/account/theme.properties b/keycloak-artemis/theme/base/account/theme.properties similarity index 100% rename from keycloak/theme/base/account/theme.properties rename to keycloak-artemis/theme/base/account/theme.properties diff --git a/keycloak/theme/base/email/theme.properties b/keycloak-artemis/theme/base/email/theme.properties similarity index 100% rename from keycloak/theme/base/email/theme.properties rename to keycloak-artemis/theme/base/email/theme.properties diff --git a/keycloak/theme/base/login/messages/messages_ara.properties b/keycloak-artemis/theme/base/login/messages/messages_ara.properties similarity index 100% rename from keycloak/theme/base/login/messages/messages_ara.properties rename to keycloak-artemis/theme/base/login/messages/messages_ara.properties diff --git a/keycloak/theme/base/login/messages/messages_eng.properties b/keycloak-artemis/theme/base/login/messages/messages_eng.properties similarity index 100% rename from keycloak/theme/base/login/messages/messages_eng.properties rename to keycloak-artemis/theme/base/login/messages/messages_eng.properties diff --git a/keycloak/theme/base/login/messages/messages_fra.properties b/keycloak-artemis/theme/base/login/messages/messages_fra.properties similarity index 100% rename from keycloak/theme/base/login/messages/messages_fra.properties rename to keycloak-artemis/theme/base/login/messages/messages_fra.properties diff --git a/keycloak/theme/base/login/messages/messages_hin.properties b/keycloak-artemis/theme/base/login/messages/messages_hin.properties similarity index 100% rename from keycloak/theme/base/login/messages/messages_hin.properties rename to keycloak-artemis/theme/base/login/messages/messages_hin.properties diff --git a/keycloak/theme/base/login/messages/messages_kan.properties b/keycloak-artemis/theme/base/login/messages/messages_kan.properties similarity index 100% rename from keycloak/theme/base/login/messages/messages_kan.properties rename to keycloak-artemis/theme/base/login/messages/messages_kan.properties diff --git a/keycloak/theme/base/login/messages/messages_tam.properties b/keycloak-artemis/theme/base/login/messages/messages_tam.properties similarity index 100% rename from keycloak/theme/base/login/messages/messages_tam.properties rename to keycloak-artemis/theme/base/login/messages/messages_tam.properties diff --git a/keycloak/theme/base/login/register.ftl b/keycloak-artemis/theme/base/login/register.ftl similarity index 98% rename from keycloak/theme/base/login/register.ftl rename to keycloak-artemis/theme/base/login/register.ftl index f0c13009..25b5c9cd 100644 --- a/keycloak/theme/base/login/register.ftl +++ b/keycloak-artemis/theme/base/login/register.ftl @@ -47,6 +47,8 @@ + + diff --git a/keycloak/theme/base/login/theme.properties b/keycloak-artemis/theme/base/login/theme.properties similarity index 100% rename from keycloak/theme/base/login/theme.properties rename to keycloak-artemis/theme/base/login/theme.properties diff --git a/keycloak/theme/mosip/account/resources/css/account.css b/keycloak-artemis/theme/mosip/account/resources/css/account.css similarity index 100% rename from keycloak/theme/mosip/account/resources/css/account.css rename to keycloak-artemis/theme/mosip/account/resources/css/account.css diff --git a/keycloak/theme/mosip/account/resources/img/favicon.ico b/keycloak-artemis/theme/mosip/account/resources/img/favicon.ico similarity index 100% rename from keycloak/theme/mosip/account/resources/img/favicon.ico rename to keycloak-artemis/theme/mosip/account/resources/img/favicon.ico diff --git a/keycloak/theme/mosip/account/resources/img/icon-sidebar-active.png b/keycloak-artemis/theme/mosip/account/resources/img/icon-sidebar-active.png similarity index 100% rename from keycloak/theme/mosip/account/resources/img/icon-sidebar-active.png rename to keycloak-artemis/theme/mosip/account/resources/img/icon-sidebar-active.png diff --git a/keycloak/theme/mosip/account/resources/img/keycloak-logo.png b/keycloak-artemis/theme/mosip/account/resources/img/keycloak-logo.png similarity index 100% rename from keycloak/theme/mosip/account/resources/img/keycloak-logo.png rename to keycloak-artemis/theme/mosip/account/resources/img/keycloak-logo.png diff --git a/keycloak/theme/mosip/account/resources/img/logo.png b/keycloak-artemis/theme/mosip/account/resources/img/logo.png similarity index 100% rename from keycloak/theme/mosip/account/resources/img/logo.png rename to keycloak-artemis/theme/mosip/account/resources/img/logo.png diff --git a/keycloak/theme/mosip/account/theme.properties b/keycloak-artemis/theme/mosip/account/theme.properties similarity index 100% rename from keycloak/theme/mosip/account/theme.properties rename to keycloak-artemis/theme/mosip/account/theme.properties diff --git a/keycloak/theme/mosip/admin/resources/css/styles.css b/keycloak-artemis/theme/mosip/admin/resources/css/styles.css similarity index 100% rename from keycloak/theme/mosip/admin/resources/css/styles.css rename to keycloak-artemis/theme/mosip/admin/resources/css/styles.css diff --git a/keycloak/theme/mosip/admin/resources/img/favicon.ico b/keycloak-artemis/theme/mosip/admin/resources/img/favicon.ico similarity index 100% rename from keycloak/theme/mosip/admin/resources/img/favicon.ico rename to keycloak-artemis/theme/mosip/admin/resources/img/favicon.ico diff --git a/keycloak/theme/mosip/admin/resources/img/keyclok-logo.png b/keycloak-artemis/theme/mosip/admin/resources/img/keyclok-logo.png similarity index 100% rename from keycloak/theme/mosip/admin/resources/img/keyclok-logo.png rename to keycloak-artemis/theme/mosip/admin/resources/img/keyclok-logo.png diff --git a/keycloak/theme/mosip/admin/resources/img/keyclok-logo.svg b/keycloak-artemis/theme/mosip/admin/resources/img/keyclok-logo.svg similarity index 100% rename from keycloak/theme/mosip/admin/resources/img/keyclok-logo.svg rename to keycloak-artemis/theme/mosip/admin/resources/img/keyclok-logo.svg diff --git a/keycloak/theme/mosip/admin/resources/img/select-arrow.png b/keycloak-artemis/theme/mosip/admin/resources/img/select-arrow.png similarity index 100% rename from keycloak/theme/mosip/admin/resources/img/select-arrow.png rename to keycloak-artemis/theme/mosip/admin/resources/img/select-arrow.png diff --git a/keycloak/theme/mosip/admin/theme.properties b/keycloak-artemis/theme/mosip/admin/theme.properties similarity index 100% rename from keycloak/theme/mosip/admin/theme.properties rename to keycloak-artemis/theme/mosip/admin/theme.properties diff --git a/keycloak/theme/mosip/email/theme.properties b/keycloak-artemis/theme/mosip/email/theme.properties similarity index 100% rename from keycloak/theme/mosip/email/theme.properties rename to keycloak-artemis/theme/mosip/email/theme.properties diff --git a/keycloak/theme/mosip/login/resources/css/login.css b/keycloak-artemis/theme/mosip/login/resources/css/login.css similarity index 100% rename from keycloak/theme/mosip/login/resources/css/login.css rename to keycloak-artemis/theme/mosip/login/resources/css/login.css diff --git a/keycloak/theme/mosip/login/resources/img/favicon.ico b/keycloak-artemis/theme/mosip/login/resources/img/favicon.ico similarity index 100% rename from keycloak/theme/mosip/login/resources/img/favicon.ico rename to keycloak-artemis/theme/mosip/login/resources/img/favicon.ico diff --git a/keycloak/theme/mosip/login/resources/img/feedback-error-arrow-down.png b/keycloak-artemis/theme/mosip/login/resources/img/feedback-error-arrow-down.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/feedback-error-arrow-down.png rename to keycloak-artemis/theme/mosip/login/resources/img/feedback-error-arrow-down.png diff --git a/keycloak/theme/mosip/login/resources/img/feedback-error-sign.png b/keycloak-artemis/theme/mosip/login/resources/img/feedback-error-sign.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/feedback-error-sign.png rename to keycloak-artemis/theme/mosip/login/resources/img/feedback-error-sign.png diff --git a/keycloak/theme/mosip/login/resources/img/feedback-success-arrow-down.png b/keycloak-artemis/theme/mosip/login/resources/img/feedback-success-arrow-down.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/feedback-success-arrow-down.png rename to keycloak-artemis/theme/mosip/login/resources/img/feedback-success-arrow-down.png diff --git a/keycloak/theme/mosip/login/resources/img/feedback-success-sign.png b/keycloak-artemis/theme/mosip/login/resources/img/feedback-success-sign.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/feedback-success-sign.png rename to keycloak-artemis/theme/mosip/login/resources/img/feedback-success-sign.png diff --git a/keycloak/theme/mosip/login/resources/img/feedback-warning-arrow-down.png b/keycloak-artemis/theme/mosip/login/resources/img/feedback-warning-arrow-down.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/feedback-warning-arrow-down.png rename to keycloak-artemis/theme/mosip/login/resources/img/feedback-warning-arrow-down.png diff --git a/keycloak/theme/mosip/login/resources/img/feedback-warning-sign.png b/keycloak-artemis/theme/mosip/login/resources/img/feedback-warning-sign.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/feedback-warning-sign.png rename to keycloak-artemis/theme/mosip/login/resources/img/feedback-warning-sign.png diff --git a/keycloak/theme/mosip/login/resources/img/keycloak-bg.png b/keycloak-artemis/theme/mosip/login/resources/img/keycloak-bg.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/keycloak-bg.png rename to keycloak-artemis/theme/mosip/login/resources/img/keycloak-bg.png diff --git a/keycloak/theme/mosip/login/resources/img/keycloak-logo-text.png b/keycloak-artemis/theme/mosip/login/resources/img/keycloak-logo-text.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/keycloak-logo-text.png rename to keycloak-artemis/theme/mosip/login/resources/img/keycloak-logo-text.png diff --git a/keycloak/theme/mosip/login/resources/img/keycloak-logo.png b/keycloak-artemis/theme/mosip/login/resources/img/keycloak-logo.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/keycloak-logo.png rename to keycloak-artemis/theme/mosip/login/resources/img/keycloak-logo.png diff --git a/keycloak/theme/mosip/login/resources/img/mosiplogo.png b/keycloak-artemis/theme/mosip/login/resources/img/mosiplogo.png similarity index 100% rename from keycloak/theme/mosip/login/resources/img/mosiplogo.png rename to keycloak-artemis/theme/mosip/login/resources/img/mosiplogo.png diff --git a/keycloak/theme/mosip/login/theme.properties b/keycloak-artemis/theme/mosip/login/theme.properties similarity index 100% rename from keycloak/theme/mosip/login/theme.properties rename to keycloak-artemis/theme/mosip/login/theme.properties diff --git a/keycloak/theme/mosip/welcome/index.ftl b/keycloak-artemis/theme/mosip/welcome/index.ftl similarity index 100% rename from keycloak/theme/mosip/welcome/index.ftl rename to keycloak-artemis/theme/mosip/welcome/index.ftl diff --git a/keycloak/theme/mosip/welcome/resources/admin-console.png b/keycloak-artemis/theme/mosip/welcome/resources/admin-console.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/admin-console.png rename to keycloak-artemis/theme/mosip/welcome/resources/admin-console.png diff --git a/keycloak/theme/mosip/welcome/resources/alert.png b/keycloak-artemis/theme/mosip/welcome/resources/alert.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/alert.png rename to keycloak-artemis/theme/mosip/welcome/resources/alert.png diff --git a/keycloak/theme/mosip/welcome/resources/bg.png b/keycloak-artemis/theme/mosip/welcome/resources/bg.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/bg.png rename to keycloak-artemis/theme/mosip/welcome/resources/bg.png diff --git a/keycloak/theme/mosip/welcome/resources/bug.png b/keycloak-artemis/theme/mosip/welcome/resources/bug.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/bug.png rename to keycloak-artemis/theme/mosip/welcome/resources/bug.png diff --git a/keycloak/theme/mosip/welcome/resources/css/welcome.css b/keycloak-artemis/theme/mosip/welcome/resources/css/welcome.css similarity index 100% rename from keycloak/theme/mosip/welcome/resources/css/welcome.css rename to keycloak-artemis/theme/mosip/welcome/resources/css/welcome.css diff --git a/keycloak/theme/mosip/welcome/resources/favicon.ico b/keycloak-artemis/theme/mosip/welcome/resources/favicon.ico similarity index 100% rename from keycloak/theme/mosip/welcome/resources/favicon.ico rename to keycloak-artemis/theme/mosip/welcome/resources/favicon.ico diff --git a/keycloak/theme/mosip/welcome/resources/jboss_community.png b/keycloak-artemis/theme/mosip/welcome/resources/jboss_community.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/jboss_community.png rename to keycloak-artemis/theme/mosip/welcome/resources/jboss_community.png diff --git a/keycloak/theme/mosip/welcome/resources/keycloak-project.png b/keycloak-artemis/theme/mosip/welcome/resources/keycloak-project.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/keycloak-project.png rename to keycloak-artemis/theme/mosip/welcome/resources/keycloak-project.png diff --git a/keycloak/theme/mosip/welcome/resources/keycloak_logo.png b/keycloak-artemis/theme/mosip/welcome/resources/keycloak_logo.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/keycloak_logo.png rename to keycloak-artemis/theme/mosip/welcome/resources/keycloak_logo.png diff --git a/keycloak/theme/mosip/welcome/resources/logo.png b/keycloak-artemis/theme/mosip/welcome/resources/logo.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/logo.png rename to keycloak-artemis/theme/mosip/welcome/resources/logo.png diff --git a/keycloak/theme/mosip/welcome/resources/mail.png b/keycloak-artemis/theme/mosip/welcome/resources/mail.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/mail.png rename to keycloak-artemis/theme/mosip/welcome/resources/mail.png diff --git a/keycloak/theme/mosip/welcome/resources/user.png b/keycloak-artemis/theme/mosip/welcome/resources/user.png similarity index 100% rename from keycloak/theme/mosip/welcome/resources/user.png rename to keycloak-artemis/theme/mosip/welcome/resources/user.png diff --git a/keycloak/theme/mosip/welcome/theme.properties b/keycloak-artemis/theme/mosip/welcome/theme.properties similarity index 100% rename from keycloak/theme/mosip/welcome/theme.properties rename to keycloak-artemis/theme/mosip/welcome/theme.properties diff --git a/keycloak-init/.gitignore b/keycloak-init/.gitignore new file mode 100644 index 00000000..b3de60f1 --- /dev/null +++ b/keycloak-init/.gitignore @@ -0,0 +1 @@ +python-keycloak-plus.tgz diff --git a/keycloak-init/Dockerfile b/keycloak-init/Dockerfile new file mode 100644 index 00000000..bf0040ce --- /dev/null +++ b/keycloak-init/Dockerfile @@ -0,0 +1,48 @@ +FROM python:3 + +ARG SOURCE +ARG COMMIT_HASH +ARG COMMIT_ID +ARG BUILD_TIME +LABEL source=${SOURCE} +LABEL commit_hash=${COMMIT_HASH} +LABEL commit_id=${COMMIT_ID} +LABEL build_time=${BUILD_TIME} + +# can be passed during Docker build as build time environment for github branch to pickup configuration from. +ARG container_user=mosip + +# can be passed during Docker build as build time environment for github branch to pickup configuration from. +ARG container_user_group=mosip + +# can be passed during Docker build as build time environment for github branch to pickup configuration from. +ARG container_user_uid=1001 + +# can be passed during Docker build as build time environment for github branch to pickup configuration from. +ARG container_user_gid=1001 + +# install packages and create user +RUN apt-get -y update \ +&& groupadd -g ${container_user_gid} ${container_user_group} \ +&& useradd -u ${container_user_uid} -g ${container_user_group} -s /bin/sh -m ${container_user} + +COPY requirements.txt . +RUN pip3 install -r requirements.txt + +# change permissions of file inside working dir +RUN chown -R ${container_user}:${container_user} /home/${container_user} + +# select container user for all tasks +USER ${container_user_uid}:${container_user_gid} + +WORKDIR /home/${container_user} +COPY keycloak_init.py . + +ENV KEYCLOAK_SERVER_URL= +ENV KEYCLOAK_ADMIN_USER=user +ENV KEYCLOAK_ADMIN_PASSWORD= +ENV INPUT_DIR=/opt/mosip/input +ENV INPUT_FILE=input.yaml +ENV FRONTEND_URL= + +CMD python3 keycloak_init.py $KEYCLOAK_SERVER_URL $KEYCLOAK_ADMIN_USER $KEYCLOAK_ADMIN_PASSWORD $INPUT_DIR/$INPUT_FILE --frontend_url $FRONTEND_URL diff --git a/keycloak-init/README.md b/keycloak-init/README.md new file mode 100644 index 00000000..805a5599 --- /dev/null +++ b/keycloak-init/README.md @@ -0,0 +1,38 @@ +# Keycloak Init + +## Context + +After Keycloak is installed, it needs to be populated with base data that is needed for MOSIP. The script and docker created here provide this function. The script may be run standalone or as a docker. + +## Prerequisites +* Keycloak server must be running and available via a url like `https://iam.xyz.net`. +* Updated `input.yaml` file (an example is given here). +* Install utilities +* Install python3 virtual environment and activate the same as per the link https://packaging.python.org/guides/installing-using-pip-and-virtual-environments/ + + +``` +$ pip3 install -r requirements.txt +``` + +## Script +* Help +``` +$ python3 keycloak_init.py --help +``` +* Run (example): +``` +$ python3 keycloak_init.py https://iam.xyz.net user user password input.yaml +``` + +# Docker +* Create +``` +$ docker build -t /keycloak-init: . +$ docker push /keycloak-init: +``` +* Run + +See `run.sh` + +To just create users see example `users.yaml` diff --git a/keycloak-init/input.yaml b/keycloak-init/input.yaml new file mode 100644 index 00000000..32e4d674 --- /dev/null +++ b/keycloak-init/input.yaml @@ -0,0 +1,364 @@ +mosip: # realm + roles: + - Default + - ABIS_PARTNER + - SDK_PARTNER + - AUTH + - AUTH_PARTNER + - BIOMETRIC_READ + - CENTRAL_ADMIN + - CENTRAL_APPROVER + - CREATE_SHARE + - CREDENTIAL_ISSUANCE + - CREDENTIAL_PARTNER + - CREDENTIAL_REQUEST + - DATA_READ + - DEVICE_PROVIDER + - DOCUMENT_READ + - FTM_PROVIDER + - GLOBAL_ADMIN + - ID_AUTHENTICATION + - ID_REPOSITORY + - INDIVIDUAL + - KEY_MAKER + - MASTERDATA_ADMIN + - METADATA_READ + - MISP + - MISP_PARTNER + - offline_access + - ONLINE_VERIFICATION_PARTNER + - PARTNER + - PARTNER_ADMIN + - PARTNERMANAGER + - PMS_ADMIN + - PMS_USER + - POLICYMANAGER + - PREREG + - PRE_REGISTRATION + - PRE_REGISTRATION_ADMIN + - PRINT_PARTNER + - PUBLISH_ACTIVATE_ID_ALL_INDIVIDUAL + - PUBLISH_ANONYMOUS_PROFILE_GENERAL + - PUBLISH_APIKEY_APPROVED_GENERAL + - PUBLISH_APIKEY_UPDATED_GENERAL + - PUBLISH_AUTHENTICATION_TRANSACTION_STATUS_GENERAL + - PUBLISH_AUTH_TYPE_STATUS_UPDATE_ACK_GENERAL + - PUBLISH_AUTH_TYPE_STATUS_UPDATE_ALL_INDIVIDUAL + - PUBLISH_CA_CERTIFICATE_UPLOADED_GENERAL + - PUBLISH_CREDENTIAL_ISSUED_ALL_INDIVIDUAL + - PUBLISH_CREDENTIAL_STATUS_UPDATE_GENERAL + - PUBLISH_DEACTIVATE_ID_ALL_INDIVIDUAL + - PUBLISH_IDA_FRAUD_ANALYTICS_GENERAL + - PUBLISH_MASTERDATA_IDAUTHENTICATION_TEMPLATES_GENERAL + - PUBLISH_MASTERDATA_TITLES_GENERAL + - PUBLISH_MISP_LICENSE_GENERATED_GENERAL + - PUBLISH_MISP_LICENSE_UPDATED_GENERAL + - PUBLISH_MOSIP_HOTLIST_GENERAL + - PUBLISH_PARTNER_UPDATED_GENERAL + - PUBLISH_POLICY_UPDATED_GENERAL + - PUBLISH_REGISTRATION_PROCESSOR_WORKFLOW_COMPLETED_EVENT_GENERAL + - PUBLISH_REGISTRATION_PROCESSOR_WORKFLOW_PAUSED_FOR_ADDITIONAL_INFO_EVENT_GENERAL + - PUBLISH_REMOVE_ID_ALL_INDIVIDUAL + - PUBLISH_VID_CRED_STATUS_UPDATE_GENERAL + - REGISTRATION_ADMIN + - REGISTRATION_OFFICER + - REGISTRATION_OPERATOR + - REGISTRATION_PROCESSOR + - REGISTRATION_SUPERVISOR + - RESIDENT + - SUBSCRIBE_ACTIVATE_ID_INDIVIDUAL + - SUBSCRIBE_APIKEY_APPROVED_GENERAL + - SUBSCRIBE_APIKEY_UPDATED_GENERAL + - SUBSCRIBE_AUTH_TYPE_STATUS_UPDATE_ACK_GENERAL + - SUBSCRIBE_AUTH_TYPE_STATUS_UPDATE_INDIVIDUAL + - SUBSCRIBE_CA_CERTIFICATE_UPLOADED_GENERAL + - SUBSCRIBE_CREDENTIAL_ISSUED_INDIVIDUAL + - SUBSCRIBE_CREDENTIAL_STATUS_UPDATE_GENERAL + - SUBSCRIBE_DEACTIVATE_ID_INDIVIDUAL + - SUBSCRIBE_MASTERDATA_IDAUTHENTICATION_TEMPLATES_GENERAL + - SUBSCRIBE_MASTERDATA_TITLES_GENERAL + - SUBSCRIBE_MISP_LICENSE_GENERATED_GENERAL + - SUBSCRIBE_MISP_LICENSE_UPDATED_GENERAL + - SUBSCRIBE_MOSIP_HOTLIST_GENERAL + - SUBSCRIBE_PARTNER_UPDATED_GENERAL + - SUBSCRIBE_POLICY_UPDATED_GENERAL + - SUBSCRIBE_REMOVE_ID_INDIVIDUAL + - SUBSCRIBE_VID_CRED_STATUS_UPDATE_GENERAL + - uma_authorization + - ZONAL_ADMIN + - ZONAL_APPROVER + - HOTLIST_ADMIN + - SUBSCRIBE_REGISTRATION_PROCESSOR_WORKFLOW_COMPLETED_EVENT_GENERAL + - SUBSCRIBE_REGISTRATION_PROCESSOR_WORKFLOW_PAUSED_FOR_ADDITIONAL_INFO_EVENT_GENERAL + clients: + - name: mosip-abis-client + mappers: [] + saroles: [] + + - name: mosip-admin-client + mappers: [] + saroles: + - MASTERDATA_ADMIN + - GLOBAL_ADMIN + - PUBLISH_MASTERDATA_IDAUTHENTICATION_TEMPLATES_GENERAL + - offline_access + - PUBLISH_MOSIP_HOTLIST_GENERAL + - uma_authorization + - PUBLISH_MASTERDATA_TITLES_GENERAL + + - name: mosip-admin-services-client + mappers: [] + saroles: [] + + - name: mosip-auth-client + mappers: [] + saroles: + - AUTH + + - name: mosip-crereq-client + mappers: [] + saroles: + - CREDENTIAL_ISSUANCE + - CREDENTIAL_REQUEST + - SUBSCRIBE_CREDENTIAL_STATUS_UPDATE_GENERAL + - offline_access + - uma_authorization + + - name: mosip-creser-client + mappers: [] + saroles: + - CREDENTIAL_ISSUANCE + - REGISTRATION_PROCESSOR + - POLICYMANAGER + - CREATE_SHARE + - offline_access + - PUBLISH_CREDENTIAL_ISSUED_ALL_INDIVIDUAL + - uma_authorization + - name: mosip-creser-idpass-client + mappers: [] + saroles: + - REGISTRATION_PROCESSOR + - DATA_READ + - DOCUMENT_READ + - BIOMETRIC_READ + - METADATA_READ + - CREATE_SHARE + - CREDENTIAL_REQUEST + + - name: mosip-datsha-client + mappers: [] + saroles: + - CREATE_SHARE + - REGISTRATION_PROCESSOR + - POLICYMANAGER + + - name: mosip-ida-client + mappers: [] + saroles: + - CREDENTIAL_REQUEST + - GLOBAL_ADMIN + - ID_AUTHENTICATION + - PARTNERMANAGER # Added only for cert upload using postman during install. Not required otherwise. + + - name: mosip-misp-client + mappers: [] + saroles: [] + + - name: mosip-partner-client + mappers: + - mapper_name: phoneNumber + mapper_user_attribute: phoneNumber + token_claim_name: phoneNumber + - mapper_name: organizationName + mapper_user_attribute: organizationName + token_claim_name: organizationName + - mapper_name: partnerType + mapper_user_attribute: partnerType + token_claim_name: partnerType + - mapper_name: addressTest + mapper_user_attribute: address + token_claim_name: addressTest + saroles: + - REGISTRATION_PROCESSOR + - CREATE_SHARE + - PMS_USER + - PMS_ADMIN + - PARTNER_ADMIN + - SUBSCRIBE_CA_CERTIFICATE_UPLOADED_GENERAL + - PUBLISH_MISP_LICENSE_UPDATED_GENERAL + - PUBLISH_PARTNER_UPDATED_GENERAL + - PUBLISH_MISP_LICENSE_GENERATED_GENERAL + - PUBLISH_APIKEY_APPROVED_GENERAL + - PUBLISH_APIKEY_UPDATED_GENERAL + - PUBLISH_CA_CERTIFICATE_UPLOADED_GENERAL + - PUBLISH_POLICY_UPDATED_GENERAL + + - name: mosip-partnermanager-client + mappers: [] + saroles: + - PARTNERMANAGER + - KEY_MAKER + + - name: mosip-pms-client + mappers: [] + saroles: + - PARTNER_ADMIN + + - name: mosip-policymanager-client + mappers: [] + saroles: [] + + - name: mosip-reg-client + mappers: [] + saroles: + - GLOBAL_ADMIN + - REGISTRATION_ADMIN + - REGISTRATION_OFFICER + - REGISTRATION_OPERATOR + - REGISTRATION_SUPERVISOR + + - name: mosip-regproc-client + mappers: [] + saroles: + - REGISTRATION_PROCESSOR + - DATA_READ + - DOCUMENT_READ + - BIOMETRIC_READ + - METADATA_READ + - CREATE_SHARE + - CREDENTIAL_REQUEST + + - name: mpartner-default-mobile + mappers: [] + saroles: + - CREDENTIAL_PARTNER + - SUBSCRIBE_REGISTRATION_PROCESSOR_WORKFLOW_COMPLETED_EVENT_GENERAL + - SUBSCRIBE_REGISTRATION_PROCESSOR_WORKFLOW_PAUSED_FOR_ADDITIONAL_INFO_EVENT_GENERAL + - PUBLISH_REGISTRATION_PROCESSOR_WORKFLOW_COMPLETED_EVENT_GENERAL + - PUBLISH_CREDENTIAL_STATUS_UPDATE_GENERAL + - PUBLISH_REGISTRATION_PROCESSOR_WORKFLOW_PAUSED_FOR_ADDITIONAL_INFO_EVENT_GENERAL + - SUBSCRIBE_CREDENTIAL_ISSUED_INDIVIDUAL + + - name: mosip-resident-client + mappers: [] + saroles: + - RESIDENT + - PARTNER_ADMIN + - CREDENTIAL_REQUEST + - offline_access + - uma_authorization + + - name: mosip-prereg-client + mappers: [] + saroles: + - PREREG + - REGISTRATION_PROCESSOR + - PRE_REGISTRATION_ADMIN + + - name: mosip-creser-idpass-client + mappers: [] + saroles: + - REGISTRATION_PROCESSOR + - DATA_READ + - DOCUMENT_READ + - BIOMETRIC_READ + - METADATA_READ + - CREATE_SHARE + - CREDENTIAL_REQUEST + + - name: mosip-syncdata-client + mappers: [] + saroles: + - REGISTRATION_ADMIN + - GLOBAL_ADMIN + - SUBSCRIBE_CA_CERTIFICATE_UPLOADED_GENERAL + - REGISTRATION_SUPERVISOR + - REGISTRATION_OFFICER + + - name: mpartner-default-auth + mappers: + - mapper_name: langCode + mapper_user_attribute: langCode + token_claim_name: langCode + saroles: + - SUBSCRIBE_AUTH_TYPE_STATUS_UPDATE_INDIVIDUAL + - SUBSCRIBE_POLICY_UPDATED_GENERAL + - SUBSCRIBE_MISP_LICENSE_GENERATED_GENERAL + - CREDENTIAL_REQUEST + - SUBSCRIBE_MOSIP_HOTLIST_GENERAL + - PUBLISH_ANONYMOUS_PROFILE_GENERAL + - SUBSCRIBE_ACTIVATE_ID_INDIVIDUAL + - SUBSCRIBE_REMOVE_ID_INDIVIDUAL + - SUBSCRIBE_MASTERDATA_TITLES_GENERAL + - SUBSCRIBE_CREDENTIAL_ISSUED_INDIVIDUAL + - SUBSCRIBE_MISP_LICENSE_UPDATED_GENERAL + - ID_AUTHENTICATION + - PUBLISH_CREDENTIAL_STATUS_UPDATE_GENERAL + - SUBSCRIBE_AUTH_TYPE_STATUS_UPDATE_ACK_GENERAL + - SUBSCRIBE_PARTNER_UPDATED_GENERAL + - offline_access + - SUBSCRIBE_APIKEY_APPROVED_GENERAL + - PUBLISH_AUTH_TYPE_STATUS_UPDATE_ACK_GENERAL + - SUBSCRIBE_MASTERDATA_IDAUTHENTICATION_TEMPLATES_GENERAL + - uma_authorization + - SUBSCRIBE_APIKEY_UPDATED_GENERAL + - SUBSCRIBE_DEACTIVATE_ID_INDIVIDUAL + - SUBSCRIBE_CA_CERTIFICATE_UPLOADED_GENERAL + - PUBLISH_AUTHENTICATION_TRANSACTION_STATUS_GENERAL + - PUBLISH_IDA_FRAUD_ANALYTICS_GENERAL + + - name: mosip-idrepo-client + mappers: [] + saroles: + - PUBLISH_DEACTIVATE_ID_ALL_INDIVIDUAL + - SUBSCRIBE_VID_CRED_STATUS_UPDATE_GENERAL + - ID_REPOSITORY + - PUBLISH_ACTIVATE_ID_ALL_INDIVIDUAL + - offline_access + - PUBLISH_REMOVE_ID_ALL_INDIVIDUAL + - PUBLISH_AUTHENTICATION_TRANSACTION_STATUS_GENERAL + - uma_authorization + - PUBLISH_VID_CRED_STATUS_UPDATE_GENERAL + - PUBLISH_AUTH_TYPE_STATUS_UPDATE_ALL_INDIVIDUAL + + - name: mpartner-default-print + mappers: [] + saroles: + - SUBSCRIBE_CREDENTIAL_ISSUED_INDIVIDUAL + - PUBLISH_CREDENTIAL_STATUS_UPDATE_GENERAL + - CREATE_SHARE + - PRINT_PARTNER + + - name: mosip-hotlist-client + saroles: + - HOTLIST_ADMIN + - uma_authorization + - offline_access + - PUBLISH_MOSIP_HOTLIST_GENERAL + + # Used only for initial deployment purposes. Maybe deleted from installation later. + - name: mosip-deployment-client + saroles: + - ID_AUTHENTICATION + - GLOBAL_ADMIN # TODO: do we need this? + - PARTNER_ADMIN + - uma_authorization + - offline_access + + - name: mosip-testrig-client + saroles: + - ID_AUTHENTICATION + - GLOBAL_ADMIN # TODO: do we need this? + - PARTNER_ADMIN + - REGISTRATION_PROCESSOR + - CREATE_SHARE + - PMS_ADMIN + - PMS_USER + - uma_authorization + - offline_access + sa_client_roles: + - realm-management: ## realm-management client id + - view-users # realm-management client roles + - view-clients + - view-realm + - manage-users diff --git a/keycloak-init/keycloak_init.py b/keycloak-init/keycloak_init.py new file mode 100755 index 00000000..270a6cf3 --- /dev/null +++ b/keycloak-init/keycloak_init.py @@ -0,0 +1,384 @@ +#!/usr/local/bin/python3 +# Script to initialize values in Keycloak + +import os +import sys +import ast +import argparse +import secrets +import json +import yaml +import traceback +from keycloak import KeycloakAdmin +from keycloak.exceptions import raise_error_from_response, KeycloakError, KeycloakGetError +from keycloak.connection import ConnectionManager +from keycloak.urls_patterns import URL_ADMIN_USER_REALM_ROLES + +class KeycloakSession: + def __init__(self, realm, server_url, user, pwd, ssl_verify): + self.keycloak_admin = KeycloakAdmin(server_url=server_url, + username=user, + password=pwd, + realm_name=realm, + verify=ssl_verify) + def create_realm(self, realm, frontend_url=''): + payload = { + "realm" : realm, + "enabled": True, + "accessCodeLifespan": 7200, + "accessCodeLifespanLogin": 1800, + "accessCodeLifespanUserAction": 300, + "accessTokenLifespan": 86400, + "accessTokenLifespanForImplicitFlow": 900, + "actionTokenGeneratedByAdminLifespan": 43200, + "actionTokenGeneratedByUserLifespan": 300, + "passwordPolicy":"length(8)", + "bruteForceProtected":True, + "permanentLockout":False, + "maxFailureWaitSeconds":900, + "minimumQuickLoginWaitSeconds":60, + "waitIncrementSeconds":300, + "quickLoginCheckMilliSeconds":1000, + "maxDeltaTimeSeconds":600, + "failureFactor":5, + "attributes": {"frontendUrl": frontend_url} + } + try: + self.keycloak_admin.create_realm(payload, skip_exists=False) + except KeycloakError as e: + if e.response_code == 409: + print('\tExists, updating %s' % realm) + self.keycloak_admin.update_realm(realm, payload) + except: + raise + + def delete_realm(self, realm, skip_exists=False): + self.keycloak_admin.realm_name = realm # work around because otherwise client was getting created in master + url = 'admin/realms/'+realm + payload = { + } + try: + print('\tDeleting realm %s' % realm) + data_raw = self.keycloak_admin.connection.raw_delete(url, data=json.dumps(payload)) + return raise_error_from_response(data_raw, KeycloakGetError, skip_exists=skip_exists) + + except KeycloakError as e: + if e.response_code == 404: + print('\tRealm %s does not exists; SKIPPING;' % realm) + + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + def delete_client(self, realm, client, skip_exists=False): + self.keycloak_admin.realm_name = realm # work around because otherwise client was getting created in master + try: + print('\tDeleting client %s' % client) + client_id = self.keycloak_admin.get_client_id(client) + data_raw = self.keycloak_admin.delete_client(client_id) + + except KeycloakError as e: + if e.response_code == 404: + print('\tClient %s does not exists; SKIPPING;' % client) + + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + # del_sa_roles: remove roles from service account user + def remove_sa_roles(self, realm, client, del_sa_roles=None): + self.keycloak_admin.realm_name = realm + try: + roles = [] # Get full role reprentation of all roles + for role in del_sa_roles: + print("\t\tRole : %s" % role) + role_rep = self.keycloak_admin.get_realm_role(role) + roles.append(role_rep) + client_id = self.keycloak_admin.get_client_id(client) + user = self.keycloak_admin.get_client_service_account_user(client_id) + params_path = {"realm-name": self.keycloak_admin.realm_name, "id": user["id"]} + self.keycloak_admin.raw_delete(URL_ADMIN_USER_REALM_ROLES.format(**params_path), data=json.dumps(roles)) + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + self.keycloak_admin.realm_name = 'master' # restore + + def delete_realm_role(self, realm, role, skip_exists=False): + self.keycloak_admin.realm_name = realm + try: + print("\tRole : %s" % role) + role_rep = self.keycloak_admin.get_realm_role(role) + URL_ADMIN_REALM_ROLE = 'admin/realms/{realm-name}/roles-by-id/{id}' + payload = { + } + params_path = {"realm-name": self.keycloak_admin.realm_name, "id": role_rep["id"]} + data_raw = self.keycloak_admin.raw_delete(URL_ADMIN_REALM_ROLE.format(**params_path), data=json.dumps(payload)) + return raise_error_from_response(data_raw, KeycloakGetError, skip_exists=skip_exists) + + except KeycloakError as e: + if e.response_code == 404: + print('\tRole %s does not exists; SKIPPING;' % role) + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + self.keycloak_admin.realm_name = 'master' # restore + + def create_role(self, realm, role): + print('\tCreating role %s for realm %s' % (role, realm)) + self.keycloak_admin.realm_name = realm # work around because otherwise role was getting created in master + self.keycloak_admin.create_realm_role({'name' : role, 'clientRole' : False}, skip_exists=True) + self.keycloak_admin.realm_name = 'master' # restore + + # sa_roles: service account roles + def create_client(self, realm, client, secret, sa_roles=None): + self.keycloak_admin.realm_name = realm # work around because otherwise client was getting created in master + payload = { + "clientId" : client, + "secret" : secret, + "standardFlowEnabled": True, + "serviceAccountsEnabled": True, + "directAccessGrantsEnabled": True, + "redirectUris": ['*'], + "authorizationServicesEnabled": True + } + try: + print('\tCreating client %s' % client) + self.keycloak_admin.create_client(payload, skip_exists=False) # If exists, update. So don't skip + except KeycloakError as e: + if e.response_code == 409: + print('\tExists, updating %s' % client) + client_id = self.keycloak_admin.get_client_id(client) + self.keycloak_admin.update_client(client_id, payload) + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + if len(sa_roles) == 0: # Skip the below step + self.keycloak_admin.realm_name = 'master' # restore + return + + try: + roles = [] # Get full role reprentation of all roles + for role in sa_roles: + role_rep = self.keycloak_admin.get_realm_role(role) + roles.append(role_rep) + client_id = self.keycloak_admin.get_client_id(client) + user = self.keycloak_admin.get_client_service_account_user(client_id) + params_path = {"realm-name": self.keycloak_admin.realm_name, "id": user["id"]} + self.keycloak_admin.raw_post(URL_ADMIN_USER_REALM_ROLES.format(**params_path), data=json.dumps(roles)) + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + self.keycloak_admin.realm_name = 'master' # restore + + def create_mapper(self, realm, client, mapper, skip_exists=False): + self.keycloak_admin.realm_name = realm # work around because otherwise client was getting created in master + client_id = self.keycloak_admin.get_client_id(client) + mapper_url = 'admin/realms/'+realm+'/clients/'+client_id+'/protocol-mappers/models' + payload = { + "protocol":"openid-connect", + "config": { + "id.token.claim":"true", + "access.token.claim":"true", + "userinfo.token.claim":"true", + "multivalued":"", + "aggregate.attrs":"", + "user.attribute":mapper['mapper_user_attribute'], + "claim.name":mapper['token_claim_name'], + "jsonType.label":"String" + }, + "name":mapper['mapper_name'], + "protocolMapper":"oidc-usermodel-attribute-mapper" + } + try: + print('\t\tCreating Mapper %s' % mapper['mapper_name']) + data_raw = self.keycloak_admin.connection.raw_post(mapper_url, data=json.dumps(payload)) + return raise_error_from_response(data_raw, KeycloakGetError, skip_exists=skip_exists) + + except KeycloakError as e: + if e.response_code == 409: + print('\t\tMapper %s Exists already exists; SKIPPING;' % mapper['mapper_name']) + + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + def create_user(self, realm, uname, email, fname, lname, password, temp_flag): + self.keycloak_admin.realm_name = realm + payload = { + "username" : uname, + "email" : email, + "firstName" : fname, + "lastName" : lname, + "enabled": True + } + try: + print('Creating user %s' % uname) + self.keycloak_admin.create_user(payload, False) # If exists, update. So don't skip + user_id = self.keycloak_admin.get_user_id(uname) + self.keycloak_admin.set_user_password(user_id, password, temporary=temp_flag) + except KeycloakError as e: + if e.response_code == 409: + print('Exists, updating %s' % uname) + user_id = self.keycloak_admin.get_user_id(uname) + self.keycloak_admin.update_user(user_id, payload) + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + self.keycloak_admin.realm_name = 'master' # restore + + def assign_user_roles(self, realm, username, roles): + self.keycloak_admin.realm_name = realm + roles = [self.keycloak_admin.get_realm_role(role) for role in roles] + try: + print(f'''Get user id for {username}''') + user_id = self.keycloak_admin.get_user_id(username) + self.keycloak_admin.assign_realm_roles(user_id, roles) + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + + self.keycloak_admin.realm_name = 'master' # restore + + def assign_sa_client_roles(self, realm, client, sa_client, sa_client_roles=None): + self.keycloak_admin.realm_name = realm + try: + client_id = self.keycloak_admin.get_client_id(client) + user = self.keycloak_admin.get_client_service_account_user(client_id) + sa_client_id = self.keycloak_admin.get_client_id(sa_client) + sa_client_role_list = [] # Get full role representation of all roles + + for sa_client_role in sa_client_roles: + print('\t\t\tAdding Client Role :: "%s" to =====> client user :: "%s"' %(sa_client_role, user['username'])) + sa_client_role_list.append(self.keycloak_admin.get_client_role(sa_client_id, sa_client_role)) + + URL = 'admin/realms/{realm-name}/users/{user}/role-mappings/clients/{sa-client-id}' + params_path = {"realm-name": self.keycloak_admin.realm_name, "user": user["id"], "sa-client-id": sa_client_id} + data_raw = self.keycloak_admin.connection.raw_post(URL.format(**params_path), data=json.dumps(sa_client_role_list)) + return raise_error_from_response(data_raw, KeycloakGetError) + except: + self.keycloak_admin.realm_name = 'master' # restore + raise + +def args_parse(): + parser = argparse.ArgumentParser() + parser.add_argument('server_url', type=str, help='Full url to point to the server for auth: Eg. https://iam.xyz.com/auth/. Note: slash is important') + parser.add_argument('user', type=str, help='Admin user') + parser.add_argument('password', type=str, help='Admin password') + parser.add_argument('input_yaml', type=str, help='File containing input for roles and clients in YAML format') + parser.add_argument('--disable_ssl_verify', help='Disable ssl cert verification while connecting to server', action='store_true') + parser.add_argument('--frontend_url', help='Frontend URL', dest='frontend_url', action='store', default='') + + args = parser.parse_args() + return args + +def main(): + + args = args_parse() + server_url = args.server_url + user = args.user + password = args.password + input_yaml = args.input_yaml + + ssl_verify = True + if args.disable_ssl_verify: + ssl_verify = False + + fp = open(input_yaml, 'rt') + values = yaml.load(fp, Loader=yaml.FullLoader) + + server_url = server_url + '/auth/' # Full url to access api + + try: + print(server_url) + ks = KeycloakSession('master', server_url, user, password, ssl_verify) + for realm in values: + if realm == "del_realms": + print("Delete realms : ") + for r in values[realm]: + ks.delete_realm(r) + break + + print('Create realms :') + for realm in values: + if realm == "del_realms": + continue + print('\tCreate realms : %s' % realm) + ks.create_realm(realm, args.frontend_url) # {realm : [role]} + + for realm in values: + roles = [] + if 'roles' in values[realm]: + print('Create roles for realm %s' % realm) + roles = values[realm]['roles'] + for role in roles: + ks.create_role(realm, role) + + del_roles = [] + if 'del_roles' in values[realm]: + print('Delete roles for realm %s' % realm) + del_roles = values[realm]['del_roles'] + for role in del_roles: + ks.delete_realm_role(realm, role) + del_clients = [] + if 'del_clients' in values[realm]: + print("Deleting clients for realm %s" % realm) + del_clients = values[realm]['del_clients'] + for client in del_clients: + ks.delete_client(realm, client) + + # Expect secrets passed via env variables. + clients = [] + if 'clients' in values[realm]: + print('Create clients for realm %s' % realm) + clients = values[realm]['clients'] + for client in clients: + secret_env_name = '%s_secret' % client['name'] + secret_env_name = secret_env_name.replace('-', '_') # Compatible with environment variables + secret = os.environ.get(secret_env_name) + if secret is None: # Env variable not found + print('\tSecret environment variable %s not found, generating' % secret_env_name) + secret = secrets.token_urlsafe(16) + + if 'saroles' in client: + ks.create_client(realm, client['name'], secret, client['saroles']) + + if 'del_saroles' in client: + print("\tRemoving roles from service account user for client %s" % client['name']) + ks.remove_sa_roles(realm, client['name'], client['del_saroles']) + + if 'mappers' in client: + mappers = client['mappers'] + print("\tCreating mappers for %s client " % client['name']) + for mapper in mappers: + ks.create_mapper(realm, client['name'], mapper) + + if 'sa_client_roles' in client: + sa_client_roles = client['sa_client_roles'] + print('\tAssigning service account client roles for %s client ' % client['name']) + for cid_roles in sa_client_roles: + sa_client = list(cid_roles)[0] + sa_client_role_list = cid_roles[sa_client] + print('\t\tService account client name :: "%s"' % list(cid_roles)[0]) + ks.assign_sa_client_roles(realm, client['name'], sa_client, sa_client_role_list) + + users = [] + if 'users' in values[realm]: + users = values[realm]['users'] + for user in users: + print(f'''Creating user {user['username']}''') + ks.create_user(realm, user['username'], user['email'], user['firstName'], user['lastName'], user['password'], user['temporary']) + ks.assign_user_roles(realm, user['username'], user['realmRoles']) + except: + formatted_lines = traceback.format_exc() + print(formatted_lines) + sys.exit(1) + + sys.exit(0) + +if __name__=="__main__": + main() diff --git a/keycloak-init/keycloak_logout.py b/keycloak-init/keycloak_logout.py new file mode 100755 index 00000000..bb23e5b9 --- /dev/null +++ b/keycloak-init/keycloak_logout.py @@ -0,0 +1,55 @@ +#!/usr/local/bin/python3 +# Script to logout a given user (given by user name) + +import os +import sys +import ast +import argparse +import secrets +import json +import yaml +import traceback +from keycloak import KeycloakAdmin +from keycloak.exceptions import raise_error_from_response, KeycloakError +from keycloak.connection import ConnectionManager +from keycloak.urls_patterns import URL_ADMIN_USER_REALM_ROLES + +def args_parse(): + parser = argparse.ArgumentParser() + parser.add_argument('server_url', type=str, help='Full url to point to the server for auth: Eg. https://iam.xyz.com') + parser.add_argument('admin_user', type=str, help='Admin user') + parser.add_argument('admin_password', type=str, help='Admin password') + parser.add_argument('client_name', type=str, help='Name of the client that needs to be logged out') + parser.add_argument('realm', type=str, help='Realm of client') + parser.add_argument('--disable_ssl_verify', help='Disable ssl cert verification while connecting to server', action='store_true') + args = parser.parse_args() + return args + +def main(): + + args = args_parse() + ssl_verify = True + if args.disable_ssl_verify: + ssl_verify = False + + server_url = args.server_url + '/auth/' # Full url to access api + try: + keycloak_admin = KeycloakAdmin(server_url=server_url, + username=args.admin_user, + password=args.admin_password, + realm_name='master', + verify=ssl_verify) + keycloak_admin.realm_name = args.realm + client_id = keycloak_admin.get_client_id(args.client_name) + user = keycloak_admin.get_client_service_account_user(client_id) + keycloak_admin.logout(user['id']) + except: + formatted_lines = traceback.format_exc() + print(formatted_lines) + sys.exit(1) + + sys.exit(0) + +if __name__=="__main__": + main() + diff --git a/keycloak-init/requirements.txt b/keycloak-init/requirements.txt new file mode 100644 index 00000000..5910c263 --- /dev/null +++ b/keycloak-init/requirements.txt @@ -0,0 +1,12 @@ +certifi==2022.12.7 +chardet==4.0.0 +ecdsa==0.17.0 +idna==2.10 +pyasn1==0.4.8 +python-jose==3.3.0 +python-keycloak==0.26.1 +PyYAML==5.4.1 +requests==2.25.1 +rsa==4.7.2 +six==1.16.0 +urllib3==1.26.5 diff --git a/keycloak-init/run.sh b/keycloak-init/run.sh new file mode 100755 index 00000000..cf1b79e6 --- /dev/null +++ b/keycloak-init/run.sh @@ -0,0 +1,5 @@ +#!/bin/sh +# Examples of how to run keycloak init using docker and directly with python. +docker run --rm -v ~/mosip-infra/build/keycloak-init/:/opt/mosip/input -e KEYCLOAK_ADMIN_USER=admin -e KEYCLOAK_ADMIN_PASSWORD=password -e KEYCLOAK_SERVER_URL=https://iam.sandbox.mosip.net -e INPUT_FILE=user.yaml mosipdev/keycloak-init:1.2.0.1 + +#python keycloak_init.py https://iam.v3box1.mosip.net admin input.yaml diff --git a/keycloak-init/users.yaml b/keycloak-init/users.yaml new file mode 100644 index 00000000..00918fa3 --- /dev/null +++ b/keycloak-init/users.yaml @@ -0,0 +1,22 @@ +## YAML to create a users +mosip: # realm + roles: [] + clients: [] + users: # list of users + - username: test_user15 + email: test_user15@xyz.com + firstName: Test + lastName: User15 + password: abcde + temporary: False + realmRoles: + - PARTNER + - username: test_user16 + email: test_user16@xyz.com + firstName: Test + lastName: User16 + password: abcde + temporary: False + realmRoles: + - REGISTRATION_OFFICER + diff --git a/keycloak/Dockerfile b/keycloak-jboss/Dockerfile similarity index 100% rename from keycloak/Dockerfile rename to keycloak-jboss/Dockerfile diff --git a/keycloak/standalone/deployments/spi-keycloak-1.0.jar b/keycloak-jboss/standalone/deployments/spi-keycloak-1.0.jar similarity index 100% rename from keycloak/standalone/deployments/spi-keycloak-1.0.jar rename to keycloak-jboss/standalone/deployments/spi-keycloak-1.0.jar diff --git a/keycloak-jboss/theme/base/account/theme.properties b/keycloak-jboss/theme/base/account/theme.properties new file mode 100644 index 00000000..1f7d337b --- /dev/null +++ b/keycloak-jboss/theme/base/account/theme.properties @@ -0,0 +1 @@ +locales=ca,de,eng,es,fra,it,ja,lt,nl,no,pl,pt-BR,ru,sk,sv,tr,zh-CN,ara,hin,kan,tam diff --git a/keycloak-jboss/theme/base/email/theme.properties b/keycloak-jboss/theme/base/email/theme.properties new file mode 100644 index 00000000..1f7d337b --- /dev/null +++ b/keycloak-jboss/theme/base/email/theme.properties @@ -0,0 +1 @@ +locales=ca,de,eng,es,fra,it,ja,lt,nl,no,pl,pt-BR,ru,sk,sv,tr,zh-CN,ara,hin,kan,tam diff --git a/keycloak-jboss/theme/base/login/messages/messages_ara.properties b/keycloak-jboss/theme/base/login/messages/messages_ara.properties new file mode 100644 index 00000000..d6a91687 --- /dev/null +++ b/keycloak-jboss/theme/base/login/messages/messages_ara.properties @@ -0,0 +1,327 @@ +# encoding: utf-8 +doLogIn=تسجيل الدخول +doRegister=登録 +doCancel=キャンセル +doSubmit=送信 +doYes=はい +doNo=いいえ +doContinue=続ける +doIgnore=無視 +doAccept=承諾 +doDecline=却下 +doForgotPassword=パスワードをお忘れですか? +doClickHere=クリックしてください +doImpersonate=代理ログイン +kerberosNotConfigured=Kerberos は設定されていません +kerberosNotConfiguredTitle=Kerberos は設定されていません +bypassKerberosDetail=Kerberos 経由でログインしていないか、ブラウザーで Kerberos ログインの設定がされていません。他の手段でログインするには 「続ける」 をクリックしてください。 +kerberosNotSetUp=Kerberos が設定されていません。ログインできません。 +registerTitle=登録 +loginTitle={0} تسجيل الدخول إلى +loginTitleHtml={0} +impersonateTitle={0} ユーザーの代理 +impersonateTitleHtml={0} ユーザーの代理 +realmChoice=レルム +unknownUser=不明なユーザー +loginTotpTitle=モバイル Authenticator セットアップ +loginProfileTitle=アカウント情報の更新 +loginTimeout=انتهت مهلة محاولة تسجيل الدخول الخاصة بك. سيبدأ تسجيل الدخول من البداية. +oauthGrantTitle={0}へのアクセスを許可 +oauthGrantTitleHtml={0} +errorTitle=申し訳ございません +errorTitleHtml=申し訳ございません +emailVerifyTitle=Eメール確認 +emailForgotTitle=パスワードをお忘れですか? +updatePasswordTitle=パスワード更新 +codeSuccessTitle=成功コード +codeErrorTitle=エラーコード\: {0} +displayUnsupported=要求された表示タイプがサポートされていません +browserRequired=ログインに必要なブラウザー +browserContinue=ログインを完了するために必要なブラウザー +browserContinuePrompt=ブラウザーを開いてログインを続行しますか? [y/n]: +browserContinueAnswer=y + + +termsTitle=利用規約 +termsText=

利用規約はここで設定する必要があります

+termsPlainText=定義される利用規約。 + +recaptchaFailed=無効な reCAPTCHA +recaptchaNotConfigured=reCAPTCHA が必須ですが、設定されていません +consentDenied=同意は拒否されました。 + +noAccount=新規ユーザーですか? +username=ユーザー名 +usernameOrEmail=اسم المستخدم أو البريد الالكتروني +firstName=名 +givenName=名 +fullName=氏名 +lastName=姓 +familyName=姓 +email=Eメール +password=كلمه السر +passwordConfirm=パスワード (確認) +passwordNew=新しいパスワード +passwordNewConfirm=新しいパスワード (確認) +rememberMe=ログイン状態の保存 +authenticatorCode=ワンタイムコード +address=住所 +street=番地 +locality=市区町村 +region=都道府県 +postal_code=郵便番号 +country=国 +emailVerified=確認済みEメール +gssDelegationCredential=GSS 代行クレデンシャル + +profileScopeConsentText=ユーザープロフィール +emailScopeConsentText=メールアドレス +addressScopeConsentText=アドレス +phoneScopeConsentText=電話番号 +offlineAccessScopeConsentText=オフラインアクセス +samlRoleListScopeConsentText=ロール +rolesScopeConsentText=ユーザーロール + +loginTotpIntro=このアカウントにアクセスするには、ワンタイムパスワードジェネレーターを設定する必要があります +loginTotpStep1=次のアプリケーションのいずれかをモバイルにインストールしてください +loginTotpStep2=アプリケーションを開き、バーコードをスキャンしてください +loginTotpStep3=アプリケーションで提供されたワンタイムコードを入力して送信をクリックし、セットアップを完了してください。 +loginTotpManualStep2=アプリケーションを開き、キーを入力してください +loginTotpManualStep3=アプリケーションが設定できる場合は、次の設定値を使用してください +loginTotpUnableToScan=スキャンできませんか? +loginTotpScanBarcode=バーコードをスキャンしますか? +loginOtpOneTime=ワンタイムコード +loginTotpType=タイプ +loginTotpAlgorithm=アルゴリズム +loginTotpDigits=桁 +loginTotpInterval=間隔 +loginTotpCounter=カウンター + +loginTotp.totp=時間ベース +loginTotp.hotp=カウンターベース + + +oauthGrantRequest=アクセス権を許可してよろしいでしょうか? +inResource=in + +emailVerifyInstruction1=メールアドレスを確認する手順を記載したEメールを送信しました。 +emailVerifyInstruction2=Eメールで確認コードを受け取っていませんか? +emailVerifyInstruction3=Eメールを再送信します。 + +emailLinkIdpTitle=リンク {0} +emailLinkIdp1={0} の {1} アカウントを あなたの {2} アカウントとリンクするための手順を記載したEメールを送信しました。 +emailLinkIdp2=Eメールで確認コードを受け取っていませんか? +emailLinkIdp3=Eメールを再送信します。 +emailLinkIdp4=別のブラウザーでメールを確認済みの場合 +emailLinkIdp5=続けるには + +backToLogin=« ログインに戻る + +emailInstruction=ユーザー名またメールアドレスを入力してください。新しいパスワードの設定方法をご案内いたします。 + +copyCodeInstruction=このコードをコピーし、あなたのアプリケーションにペーストしてください: + +pageExpiredTitle=ページの有効期限が切れています +pageExpiredMsg1=ログインプロセスを再開するには +pageExpiredMsg2=ログイン処理を続行するには + +personalInfo=個人情報: +role_admin=管理者 +role_realm-admin=レルム管理者 +role_create-realm=レルムの作成 +role_create-client=クライアントの作成 +role_view-realm=レルムの参照 +role_view-users=ユーザーの参照 +role_view-applications=アプリケーションの参照 +role_view-clients=クライアントの参照 +role_view-events=イベントの参照 +role_view-identity-providers=アイデンティティ プロバイダーの参照 +role_manage-realm=レルムの管理 +role_manage-users=ユーザーの管理 +role_manage-applications=アプリケーションの管理 +role_manage-identity-providers=アイデンティティ プロバイダーの管理 +role_manage-clients=クライアントの管理 +role_manage-events=イベントの管理 +role_view-profile=プロフィールの参照 +role_manage-account=アカウントの管理 +role_manage-account-links=アカウントリンクの管理 +role_read-token=トークンの読み取り +role_offline-access=オフラインアクセス +client_account=アカウント +client_security-admin-console=セキュリティ管理コンソール +client_admin-cli=管理 CLI +client_realm-management=レルム管理 +client_broker=ブローカー + +invalidUserMessage=خطأ في اسم المستخدم أو كلمة مرور +invalidEmailMessage=無効なメールアドレスです。 +accountDisabledMessage=アカウントは無効です。管理者に連絡してください。 +accountTemporarilyDisabledMessage=アカウントは一時的に無効です。管理者に連絡、またはしばらく時間をおいてから再度お試しください。 +expiredCodeMessage=ログインタイムアウトが発生しました。再度ログインしてください。 +expiredActionMessage=アクションは期限切れです。今すぐログインしてください。 +expiredActionTokenNoSessionMessage=アクションは期限切れです。 +expiredActionTokenSessionExistsMessage=アクションは期限切れです。もう一度やり直してください。 + +missingFirstNameMessage=名を指定してください。 +missingLastNameMessage=姓を指定してください。 +missingEmailMessage=Eメールを指定してください。 +missingUsernameMessage=ユーザー名を指定してください。 +missingPasswordMessage=رمز مرور خاطئ +missingTotpMessage=Authenticator コードを指定してください。 +notMatchPasswordMessage=パスワードが一致していません。 + +invalidPasswordExistingMessage=間違った既存のパスワードです。 +invalidPasswordBlacklistedMessage=無効なパスワード: パスワードがブラックリストに含まれています。 +invalidPasswordConfirmMessage=パスワード確認が一致していません。 +invalidTotpMessage=間違った Authenticator コードです。 + +usernameExistsMessage=既に存在するユーザー名です。 +emailExistsMessage=既に存在するEメールです。 + +federatedIdentityExistsMessage={0} {1} のユーザーは既に存在します。そのアカウントをリンクするにはアカウント管理にログインしてください。 + +confirmLinkIdpTitle=既に存在するアカウントです。 +federatedIdentityConfirmLinkMessage={0} {1} のユーザーは既に存在します。継続しますか? +#federatedIdentityConfirmReauthenticateMessage={1} でアカウントをリンクするために {0} として認証します +confirmLinkIdpReviewProfile=プロフィールの確認 +confirmLinkIdpContinue=既存のアカウントに追加する + +configureTotpMessage=アカウントを有効にするにはモバイル Authenticator のセットアップが必要です。 +updateProfileMessage=アカウントを有効にするにはユーザープロフィールの更新が必要です。 +updatePasswordMessage=アカウントを有効にするにはパスワードの更新が必要です。 +resetPasswordMessage=パスワードを変更する必要があります。 +verifyEmailMessage=アカウントを有効にするにはメールアドレスの確認が必要です。 +linkIdpMessage=アカウントを {0} とリンクするにはメールアドレスの確認が必要です。 + +emailSentMessage=詳細な手順を記載したEメールをすぐに受信してください。 +emailSendErrorMessage=Eメールの送信に失敗しました。しばらく時間をおいてから再度お試しください。 + +accountUpdatedMessage=アカウントが更新されました。 +accountPasswordUpdatedMessage=パスワードが更新されました。 + +delegationCompleteHeader=ログインに成功しました +delegationCompleteMessage=このブラウザーのウィンドウを閉じて、コンソールアプリケーションに戻ることができます。 +delegationFailedHeader=ログインに失敗しました +delegationFailedMessage=このブラウザーウィンドウを閉じてコンソールアプリケーションに戻り、再度ログインを試みることができます。 + +noAccessMessage=アクセスがありません + +invalidPasswordMinLengthMessage=無効なパスワード: 最小 {0} の長さが必要です。 +invalidPasswordMinDigitsMessage=無効なパスワード: 少なくとも {0} 文字の数字を含む必要があります。 +invalidPasswordMinLowerCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の小文字を含む必要があります。 +invalidPasswordMinUpperCaseCharsMessage=無効なパスワード: 少なくとも {0} 文字の大文字を含む必要があります。 +invalidPasswordMinSpecialCharsMessage=無効なパスワード: 少なくとも {0} 文字の特殊文字を含む必要があります。 +invalidPasswordNotUsernameMessage=無効なパスワード: ユーザー名と同じパスワードは禁止されています。 +invalidPasswordRegexPatternMessage=無効なパスワード: 正規表現パターンと一致しません。 +invalidPasswordHistoryMessage=無効なパスワード: 最近の {0} パスワードのいずれかと同じパスワードは禁止されています。 +invalidPasswordGenericMessage=無効なパスワード: 新しいパスワードはパスワードポリシーと一致しません。 + +failedToProcessResponseMessage=応答を処理できませんでした +httpsRequiredMessage=HTTPS が必須です +realmNotEnabledMessage=レルムが有効ではありません +invalidRequestMessage=無効なリクエストです +failedLogout=ログアウトに失敗しました +unknownLoginRequesterMessage=不明なログイン要求元です +loginRequesterNotEnabledMessage=ログイン要求元は有効ではありません +bearerOnlyMessage=bearer-only のアプリケーションはブラウザーログインを開始することが許可されていません +standardFlowDisabledMessage=与えられた response_type でクライアントはブラウザーログインを開始することが許可されていません。 Standard Flow は無効です。 +implicitFlowDisabledMessage=与えられた response_type でクライアントはブラウザーログインを開始することが許可されていません。 Implicit Flow は無効です。 +invalidRedirectUriMessage=無効なリダイレクト URI です +unsupportedNameIdFormatMessage=サポートされていない NameID Format です +invalidRequesterMessage=無効な要求元です +registrationNotAllowedMessage=登録は許可されていません +resetCredentialNotAllowedMessage=クレデンシャルのリセットは許可されていません + +permissionNotApprovedMessage=アクセス権は承認されていません。 +noRelayStateInResponseMessage=アイデンティティ プロバイダーからの応答に RelayState がありません。 +insufficientPermissionMessage=アイデンティティにリンクするには不十分なアクセス権です。 +couldNotProceedWithAuthenticationRequestMessage=アイデンティティ プロバイダーに認証要求を続行できませんでした。 +couldNotObtainTokenMessage=アイデンティティ プロバイダーからトークンを取得できませんでした。 +unexpectedErrorRetrievingTokenMessage=アイデンティティ プロバイダーからのトークン取得で予期せぬエラーが発生しました。 +unexpectedErrorHandlingResponseMessage=アイデンティティ プロバイダーからの応答を処理する際に予期せぬエラーが発生しました。 +identityProviderAuthenticationFailedMessage=認証に失敗しました。アイデンティティ プロバイダーを使用して認証できませんでした。 +couldNotSendAuthenticationRequestMessage=アイデンティティ プロバイダーに認証要求を送信することができませんでした。 +unexpectedErrorHandlingRequestMessage=アイデンティティ プロバイダーへの認証要求を処理する際に予期せぬエラーが発生しました。 +invalidAccessCodeMessage=無効なアクセスコードです。 +sessionNotActiveMessage=セッションが有効ではありません。 +invalidCodeMessage=エラーが発生しました。アプリケーションを介して再度ログインしてください。 +identityProviderUnexpectedErrorMessage=アイデンティティ プロバイダーによる認証の際に予期せぬエラーが発生しました +identityProviderNotFoundMessage=該当の識別子を持つアイデンティティ プロバイダーが見つかりませんでした。 +identityProviderLinkSuccess=Eメールを正常に確認しました。元のブラウザーに戻ってログインしてください。 +staleCodeMessage=このページはもはや有効ではありませんので、アプリケーションに戻り再度ログインしてください +realmSupportsNoCredentialsMessage=レルムはクレデンシャルタイプをサポートしていません。 +identityProviderNotUniqueMessage=レルムは複数のアイデンティティ プロバイダーをサポートしています。どのアイデンティティ プロバイダーが認証に使用されるべきか判断できませんでした。 +emailVerifiedMessage=メールアドレスが確認できました。 +staleEmailVerificationLink=クリックしたリンクは古いリンクであり、有効ではありません。すでにメールを確認していませんか? +identityProviderAlreadyLinkedMessage={0}によって返された連携されたアイデンティティは、すでに別のユーザーにリンクされています。 +confirmAccountLinking=アイデンティティプロバイダー{1}のアカウント{0}とあなたのアカウントとのリンクを確認してください。 +confirmEmailAddressVerification=Eメールアドレス{0}の有効性を確認してください。 +confirmExecutionOfActions=次の操作を実行します。 + +locale_ca=Catal\u00E0 +locale_de=Deutsch +locale_eng=English +locale_es=Espa\u00F1ol +locale_fra=Fran\u00E7ais +locale_it=Italiano +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_pl=Polish +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_lt=Lietuvi\u0173 +locale_zh-CN=\u4E2D\u6587\u7B80\u4F53 +locale_sk=Sloven\u010Dina +locale_sv=Svenska +locale_ara=Arabic +locale_tam=தமிழ் +locale_kan=ಕನ್ನಡ +locale_hin=हिंदी + +backToApplication=« アプリケーションに戻る +missingParameterMessage=不足パラメータ\: {0} +clientNotFoundMessage=クライアントが見つかりません。 +clientDisabledMessage=クライアントが無効になっています。 +invalidParameterMessage=無効なパラメータ\: {0} +alreadyLoggedIn=既にログインしています。 +differentUserAuthenticated=すでにこのセッションで異なるユーザー''{0}''として認証されています。まずログアウトしてください。 +brokerLinkingSessionExpired=要求されたブローカーアカウントのリンクは、現在のセッションでは有効ではありません。 +proceedWithAction=» 続行するにはここをクリックしてください + +requiredAction.CONFIGURE_TOTP=OTPの設定 +requiredAction.terms_and_conditions=利用規約 +requiredAction.UPDATE_PASSWORD=パスワードの更新 +requiredAction.UPDATE_PROFILE=プロフィールの更新 +requiredAction.VERIFY_EMAIL=Eメールの確認 + +doX509Login=次のユーザーとしてログインします\: +clientCertificate=X509クライアント証明書\: +noCertificate=[証明書なし] + + +pageNotFound=ページが見つかりません +internalServerError=内部サーバーエラーが発生しました + +console-username=ユーザー名: +console-password=パスワード: +console-otp=ワンタイムパスワード: +console-new-password=新しいパスワード: +console-confirm-password=パスワードの確認: +console-update-password=パスワードの更新が必要です。 +console-verify-email=メールアドレスを確認する必要があります。確認コードを含むメールが{0}に送信されました。このコードを以下に入力してください。 +console-email-code=Eメールコード: +console-accept-terms=利用規約に同意しますか? [y/n]: +console-accept=y + +# Openshift messages +openshift.scope.user_info=ユーザー情報 +openshift.scope.user_check-access=ユーザーアクセス情報 +openshift.scope.user_full=フルアクセス +openshift.scope.list-projects=プロジェクトの一覧表示 + +# SAML authentication +saml.post-form.title=認証リダイレクト +saml.post-form.message=リダイレクトしています。お待ちください。 +saml.post-form.js-disabled=JavaScriptが無効になっています。有効にすることを強くお勧めします。継続するには、下のボタンをクリックしてください。 diff --git a/keycloak-jboss/theme/base/login/messages/messages_eng.properties b/keycloak-jboss/theme/base/login/messages/messages_eng.properties new file mode 100644 index 00000000..62893f74 --- /dev/null +++ b/keycloak-jboss/theme/base/login/messages/messages_eng.properties @@ -0,0 +1,376 @@ +doLogIn=Log In +doRegister=Register +doCancel=Cancel +doSubmit=Submit +doBack=Back +doYes=Yes +doNo=No +doContinue=Continue +doIgnore=Ignore +doAccept=Accept +doDecline=Decline +doForgotPassword=Forgot Password? +doClickHere=Click here +doImpersonate=Impersonate +doTryAgain=Try again +doTryAnotherWay=Try Another Way +kerberosNotConfigured=Kerberos Not Configured +kerberosNotConfiguredTitle=Kerberos Not Configured +bypassKerberosDetail=Either you are not logged in by Kerberos or your browser is not set up for Kerberos login. Please click continue to login in through other means +kerberosNotSetUp=Kerberos is not set up. You cannot login. +registerTitle=Register +loginTitle=Log in to {0} +loginTitleHtml={0} +impersonateTitle={0} Impersonate User +impersonateTitleHtml={0} Impersonate User +realmChoice=Realm +unknownUser=Unknown user +loginTotpTitle=Mobile Authenticator Setup +loginProfileTitle=Update Account Information +loginTimeout=Your login attempt timed out. Login will start from the beginning. +oauthGrantTitle=Grant Access to {0} +oauthGrantTitleHtml={0} +errorTitle=We are sorry... +errorTitleHtml=We are sorry ... +emailVerifyTitle=Email verification +emailForgotTitle=Forgot Your Password? +updatePasswordTitle=Update password +codeSuccessTitle=Success code +codeErrorTitle=Error code\: {0} +displayUnsupported=Requested display type unsupported +browserRequired=Browser required to login +browserContinue=Browser required to complete login +browserContinuePrompt=Open browser and continue login? [y/n]: +browserContinueAnswer=y + + +termsTitle=Terms and Conditions +termsText=

Terms and conditions to be defined

+termsPlainText=Terms and conditions to be defined. + +recaptchaFailed=Invalid Recaptcha +recaptchaNotConfigured=Recaptcha is required, but not configured +consentDenied=Consent denied. + +noAccount=New user? +username=Username +usernameOrEmail=Username or email +firstName=First name +givenName=Given name +fullName=Full name +lastName=Last name +familyName=Family name +email=Email +password=Password +passwordConfirm=Confirm password +passwordNew=New Password +passwordNewConfirm=New Password confirmation +rememberMe=Remember me +authenticatorCode=One-time code +address=Address +street=Street +locality=City or Locality +region=State, Province, or Region +postal_code=Zip or Postal code +country=Country +emailVerified=Email verified +gssDelegationCredential=GSS Delegation Credential +organizationName=Organization Name +phoneNumber=Phone Number +partnerType=Partner Type +langCode=Notification Language + +profileScopeConsentText=User profile +emailScopeConsentText=Email address +addressScopeConsentText=Address +phoneScopeConsentText=Phone number +offlineAccessScopeConsentText=Offline Access +samlRoleListScopeConsentText=My Roles +rolesScopeConsentText=User roles + +restartLoginTooltip=Restart login + +loginTotpIntro=You need to set up a One Time Password generator to access this account +loginTotpStep1=Install one of the following applications on your mobile: +loginTotpStep2=Open the application and scan the barcode: +loginTotpStep3=Enter the one-time code provided by the application and click Submit to finish the setup. +loginTotpStep3DeviceName=Provide a Device Name to help you manage your OTP devices. +loginTotpManualStep2=Open the application and enter the key: +loginTotpManualStep3=Use the following configuration values if the application allows setting them: +loginTotpUnableToScan=Unable to scan? +loginTotpScanBarcode=Scan barcode? +loginCredential=Credential +loginOtpOneTime=One-time code +loginTotpType=Type +loginTotpAlgorithm=Algorithm +loginTotpDigits=Digits +loginTotpInterval=Interval +loginTotpCounter=Counter +loginTotpDeviceName=Device Name + +loginTotp.totp=Time-based +loginTotp.hotp=Counter-based + +loginChooseAuthenticator=Select login method + +oauthGrantRequest=Do you grant these access privileges? +inResource=in + +emailVerifyInstruction1=An email with instructions to verify your email address has been sent to you. +emailVerifyInstruction2=Haven''t received a verification code in your email? +emailVerifyInstruction3=to re-send the email. + +emailLinkIdpTitle=Link {0} +emailLinkIdp1=An email with instructions to link {0} account {1} with your {2} account has been sent to you. +emailLinkIdp2=Haven''t received a verification code in your email? +emailLinkIdp3=to re-send the email. +emailLinkIdp4=If you already verified the email in different browser +emailLinkIdp5=to continue. + +backToLogin=« Back to Login + +emailInstruction=Enter your username or email address and we will send you instructions on how to create a new password. + +copyCodeInstruction=Please copy this code and paste it into your application: + +pageExpiredTitle=Page has expired +pageExpiredMsg1=To restart the login process +pageExpiredMsg2=To continue the login process + +personalInfo=Personal Info: +role_admin=Admin +role_realm-admin=Realm Admin +role_create-realm=Create realm +role_create-client=Create client +role_view-realm=View realm +role_view-users=View users +role_view-applications=View applications +role_view-clients=View clients +role_view-events=View events +role_view-identity-providers=View identity providers +role_manage-realm=Manage realm +role_manage-users=Manage users +role_manage-applications=Manage applications +role_manage-identity-providers=Manage identity providers +role_manage-clients=Manage clients +role_manage-events=Manage events +role_view-profile=View profile +role_manage-account=Manage account +role_manage-account-links=Manage account links +role_read-token=Read token +role_offline-access=Offline access +client_account=Account +client_account-console=Account Console +client_security-admin-console=Security Admin Console +client_admin-cli=Admin CLI +client_realm-management=Realm Management +client_broker=Broker + +requiredFields=Required fields + +invalidUserMessage=Invalid username or password. +invalidUsernameMessage=Invalid username. +invalidUsernameOrEmailMessage=Invalid username or email. +invalidPasswordMessage=Invalid password. +invalidEmailMessage=Invalid email address. +accountDisabledMessage=Account is disabled, contact your administrator. +accountTemporarilyDisabledMessage=Account is temporarily disabled; contact your administrator or retry later. +expiredCodeMessage=Login timeout. Please log in again. +expiredActionMessage=Action expired. Please continue with login now. +expiredActionTokenNoSessionMessage=Action expired. +expiredActionTokenSessionExistsMessage=Action expired. Please start again. + +missingFirstNameMessage=Please specify first name. +missingLastNameMessage=Please specify last name. +missingEmailMessage=Please specify email. +missingUsernameMessage=Please specify username. +missingPasswordMessage=Please specify password. +missingTotpMessage=Please specify authenticator code. +missingTotpDeviceNameMessage=Please specify device name. +notMatchPasswordMessage=Passwords don''t match. + +invalidPasswordExistingMessage=Invalid existing password. +invalidPasswordBlacklistedMessage=Invalid password: password is blacklisted. +invalidPasswordConfirmMessage=Password confirmation doesn''t match. +invalidTotpMessage=Invalid authenticator code. + +usernameExistsMessage=Username already exists. +emailExistsMessage=Email already exists. + +federatedIdentityExistsMessage=User with {0} {1} already exists. Please login to account management to link the account. + +confirmLinkIdpTitle=Account already exists +federatedIdentityConfirmLinkMessage=User with {0} {1} already exists. How do you want to continue? +federatedIdentityConfirmReauthenticateMessage=Authenticate to link your account with {0} +nestedFirstBrokerFlowMessage=The {0} user {1} is not linked to any known user. +confirmLinkIdpReviewProfile=Review profile +confirmLinkIdpContinue=Add to existing account + +configureTotpMessage=You need to set up Mobile Authenticator to activate your account. +updateProfileMessage=You need to update your user profile to activate your account. +updatePasswordMessage=You need to change your password to activate your account. +resetPasswordMessage=You need to change your password. +verifyEmailMessage=You need to verify your email address to activate your account. +linkIdpMessage=You need to verify your email address to link your account with {0}. + +emailSentMessage=You should receive an email shortly with further instructions. +emailSendErrorMessage=Failed to send email, please try again later. + +accountUpdatedMessage=Your account has been updated. +accountPasswordUpdatedMessage=Your password has been updated. + +delegationCompleteHeader=Login Successful +delegationCompleteMessage=You may close this browser window and go back to your console application. +delegationFailedHeader=Login Failed +delegationFailedMessage=You may close this browser window and go back to your console application and try logging in again. + +noAccessMessage=No access + +invalidPasswordMinLengthMessage=Invalid password: minimum length {0}. +invalidPasswordMinDigitsMessage=Invalid password: must contain at least {0} numerical digits. +invalidPasswordMinLowerCaseCharsMessage=Invalid password: must contain at least {0} lower case characters. +invalidPasswordMinUpperCaseCharsMessage=Invalid password: must contain at least {0} upper case characters. +invalidPasswordMinSpecialCharsMessage=Invalid password: must contain at least {0} special characters. +invalidPasswordNotUsernameMessage=Invalid password: must not be equal to the username. +invalidPasswordRegexPatternMessage=Invalid password: fails to match regex pattern(s). +invalidPasswordHistoryMessage=Invalid password: must not be equal to any of last {0} passwords. +invalidPasswordGenericMessage=Invalid password: new password doesn''t match password policies. + +failedToProcessResponseMessage=Failed to process response +httpsRequiredMessage=HTTPS required +realmNotEnabledMessage=Realm not enabled +invalidRequestMessage=Invalid Request +failedLogout=Logout failed +unknownLoginRequesterMessage=Unknown login requester +loginRequesterNotEnabledMessage=Login requester not enabled +bearerOnlyMessage=Bearer-only applications are not allowed to initiate browser login +standardFlowDisabledMessage=Client is not allowed to initiate browser login with given response_type. Standard flow is disabled for the client. +implicitFlowDisabledMessage=Client is not allowed to initiate browser login with given response_type. Implicit flow is disabled for the client. +invalidRedirectUriMessage=Invalid redirect uri +unsupportedNameIdFormatMessage=Unsupported NameIDFormat +invalidRequesterMessage=Invalid requester +registrationNotAllowedMessage=Registration not allowed +resetCredentialNotAllowedMessage=Reset Credential not allowed + +permissionNotApprovedMessage=Permission not approved. +noRelayStateInResponseMessage=No relay state in response from identity provider. +insufficientPermissionMessage=Insufficient permissions to link identities. +couldNotProceedWithAuthenticationRequestMessage=Could not proceed with authentication request to identity provider. +couldNotObtainTokenMessage=Could not obtain token from identity provider. +unexpectedErrorRetrievingTokenMessage=Unexpected error when retrieving token from identity provider. +unexpectedErrorHandlingResponseMessage=Unexpected error when handling response from identity provider. +identityProviderAuthenticationFailedMessage=Authentication failed. Could not authenticate with identity provider. +couldNotSendAuthenticationRequestMessage=Could not send authentication request to identity provider. +unexpectedErrorHandlingRequestMessage=Unexpected error when handling authentication request to identity provider. +invalidAccessCodeMessage=Invalid access code. +sessionNotActiveMessage=Session not active. +invalidCodeMessage=An error occurred, please login again through your application. +identityProviderUnexpectedErrorMessage=Unexpected error when authenticating with identity provider +identityProviderNotFoundMessage=Could not find an identity provider with the identifier. +identityProviderLinkSuccess=You successfully verified your email. Please go back to your original browser and continue there with the login. +staleCodeMessage=This page is no longer valid, please go back to your application and log in again +realmSupportsNoCredentialsMessage=Realm does not support any credential type. +credentialSetupRequired=Cannot login, credential setup required. +identityProviderNotUniqueMessage=Realm supports multiple identity providers. Could not determine which identity provider should be used to authenticate with. +emailVerifiedMessage=Your email address has been verified. +staleEmailVerificationLink=The link you clicked is an old stale link and is no longer valid. Maybe you have already verified your email. +identityProviderAlreadyLinkedMessage=Federated identity returned by {0} is already linked to another user. +confirmAccountLinking=Confirm linking the account {0} of identity provider {1} with your account. +confirmEmailAddressVerification=Confirm validity of e-mail address {0}. +confirmExecutionOfActions=Perform the following action(s) + +locale_ca=Catal\u00E0 +locale_de=Deutsch +locale_eng=English +locale_es=Espa\u00F1ol +locale_fra=Fran\u00E7ais +locale_it=Italiano +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_pl=Polish +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_lt=Lietuvi\u0173 +locale_zh-CN=\u4E2D\u6587\u7B80\u4F53 +locale_sk=Sloven\u010Dina +locale_sv=Svenska +locale_ara=Arabic + +backToApplication=« Back to Application +missingParameterMessage=Missing parameters\: {0} +clientNotFoundMessage=Client not found. +clientDisabledMessage=Client disabled. +invalidParameterMessage=Invalid parameter\: {0} +alreadyLoggedIn=You are already logged in. +differentUserAuthenticated=You are already authenticated as different user ''{0}'' in this session. Please log out first. +brokerLinkingSessionExpired=Requested broker account linking, but current session is no longer valid. +proceedWithAction=» Click here to proceed + +requiredAction.CONFIGURE_TOTP=Configure OTP +requiredAction.terms_and_conditions=Terms and Conditions +requiredAction.UPDATE_PASSWORD=Update Password +requiredAction.UPDATE_PROFILE=Update Profile +requiredAction.VERIFY_EMAIL=Verify Email + +doX509Login=You will be logged in as\: +clientCertificate=X509 client certificate\: +noCertificate=[No Certificate] + + +pageNotFound=Page not found +internalServerError=An internal server error has occurred + +console-username=Username: +console-password=Password: +console-otp=One Time Password: +console-new-password=New Password: +console-confirm-password=Confirm Password: +console-update-password=Update of your password is required. +console-verify-email=You need to verify your email address. We sent an email to {0} that contains a verification code. Please enter this code into the input below. +console-email-code=Email Code: +console-accept-terms=Accept Terms? [y/n]: +console-accept=y + +# Openshift messages +openshift.scope.user_info=User information +openshift.scope.user_check-access=User access information +openshift.scope.user_full=Full Access +openshift.scope.list-projects=List projects + +# SAML authentication +saml.post-form.title=Authentication Redirect +saml.post-form.message=Redirecting, please wait. +saml.post-form.js-disabled=JavaScript is disabled. We strongly recommend to enable it. Click the button below to continue. + +#authenticators +otp-display-name=Authenticator Application +otp-help-text=Enter a verification code from authenticator application. +password-display-name=Password +password-help-text=Log in by entering your password. +auth-username-form-display-name=Username +auth-username-form-help-text=Start log in by entering your username +auth-username-password-form-display-name=Username and password +auth-username-password-form-help-text=Log in by entering your username and password. + +# WebAuthn +webauthn-display-name=Security Key +webauthn-help-text=Use your security key to log in. +webauthn-passwordless-display-name=Security Key +webauthn-passwordless-help-text=Use your security key for passwordless log in. +webauthn-login-title=Security Key login +webauthn-registration-title=Security Key Registration +webauthn-available-authenticators=Available authenticators + +# WebAuthn Error +webauthn-error-title=Security Key Error +webauthn-error-registration=Failed to register your Security key. +webauthn-error-api-get=Failed to authenticate by the Security key. +webauthn-error-different-user=First authenticated user is not the one authenticated by the Security key. +webauthn-error-auth-verification=Security key authentication result is invalid. +webauthn-error-register-verification=Security key registration result is invalid. +webauthn-error-user-not-found=Unknown user authenticated by the Security key. + +identity-provider-redirector=Connect with another Identity Provider + diff --git a/keycloak-jboss/theme/base/login/messages/messages_fra.properties b/keycloak-jboss/theme/base/login/messages/messages_fra.properties new file mode 100644 index 00000000..7c9a2a99 --- /dev/null +++ b/keycloak-jboss/theme/base/login/messages/messages_fra.properties @@ -0,0 +1,299 @@ +# encoding: utf-8 + +doLogIn=Connexion +doRegister=Enregistrement +doCancel=Annuler +doSubmit=Soumettre +doYes=Oui +doNo=Non +doContinue=Continuer +doIgnore=Ignorer +doAccept=Accepter +doDecline=D\u00e9cliner +doForgotPassword=Mot de passe oubli\u00e9 ? +doClickHere=Cliquez ici +doImpersonate=Impersonate +kerberosNotConfigured=Kerberos non configur\u00e9 +kerberosNotConfiguredTitle=Kerberos non configur\u00e9 +bypassKerberosDetail=Si vous n''\u00eates pas connect\u00e9 via Kerberos ou bien que votre navigateur n''est pas configur\u00e9 pour la connexion via Kerberos. Veuillez cliquer pour vous connecter via un autre moyen. +kerberosNotSetUp=Kerberos n''est pas configur\u00e9. Connexion impossible. +registerTitle=S''enregistrer +registerWithTitle=Enregistrement avec {0} +registerWithTitleHtml={0} +loginTitle=Se connecter \u00e0 {0} +loginTitleHtml={0} +impersonateTitle={0} utilisateur impersonate +impersonateTitleHtml={0} utilisateur impersonate +realmChoice=Domaine +unknownUser=Utilisateur inconnu +loginTotpTitle=Configuration de l''authentification par mobile +loginProfileTitle=Mise \u00e0 jour du compte +loginTimeout=Le temps imparti pour la connexion est \u00e9coul\u00e9. Le processus de connexion red\u00e9marre depuis le d\u00e9but. +oauthGrantTitle=OAuth Grant +oauthGrantTitleHtml={0} +errorTitle=Nous sommes d\u00e9sol\u00e9s... +errorTitleHtml=Nous sommes d\u00e9sol\u00e9s... +emailVerifyTitle=V\u00e9rification du courriel +emailForgotTitle=Mot de passe oubli\u00e9 ? +updatePasswordTitle=Mise \u00e0 jour du mot de passe +codeSuccessTitle=Code succ\u00e8s +codeErrorTitle=Code d''erreur \: {0} +displayUnsupported=Type d''affichage demand\u00e9 non support\u00e9 +browserRequired=Navigateur requis pour se connecter +browserContinue=Navigateur requis pour continuer la connexion +browserContinuePrompt=Ouvrir le navigateur et continuer la connexion? [y/n]: +browserContinueAnswer=y + +termsTitle=Termes et Conditions +termsTitleHtml=Termes et Conditions +termsText=

Termes et conditions \u00e0 d\u00e9finir

+termsPlainText=Termes et conditions \u00e0 d\u00e9finir + +recaptchaFailed=Re-captcha invalide +recaptchaNotConfigured=Re-captcha est requis, mais il n''est pas configur\u00e9 +consentDenied=Consentement refus\u00e9. + +noAccount=Nouvel utilisateur ? +username=Nom d''utilisateur +usernameOrEmail=Nom d''utilisateur ou courriel +firstName=Pr\u00e9nom +givenName=Pr\u00e9nom +fullName=Nom complet +lastName=Nom +familyName=Nom de famille +email=Courriel +password=Mot de passe +passwordConfirm=Confirmation du mot de passe +passwordNew=Nouveau mot de passe +passwordNewConfirm=Confirmation du nouveau mot de passe +rememberMe=Se souvenir de moi +authenticatorCode=Code \u00e0 usage unique +address=Adresse +street=Rue +locality=Ville ou Localit\u00e9 +region=\u00c9tat, Province ou R\u00e9gion +postal_code=Code postal +country=Pays +emailVerified=Courriel v\u00e9rifi\u00e9 +gssDelegationCredential=Accr\u00e9ditation de d\u00e9l\u00e9gation GSS + +loginTotpIntro=Il est n\u00e9cessaire de configurer un g\u00e9n\u00e9rateur One Time Password pour acc\u00e9der \u00e0 ce compte +loginTotpStep1=Installez FreeOTP ou bien Google Authenticator sur votre mobile. Ces deux applications sont disponibles sur Google Play et Apple App Store. +loginTotpStep2=Ouvrez l''application et scannez le code-barres ou entrez la clef. +loginTotpStep3=Entrez le code \u00e0 usage unique fourni par l''application et cliquez sur Sauvegarder pour terminer. +loginTotpManualStep2=Ouvrez l''application et saisissez la cl\u00e9 +loginTotpManualStep3=Utilisez la configuration de valeur suivante si l''application permet son \u00e9dition +loginTotpUnableToScan=Impossible de scanner? +loginTotpScanBarcode=Scanner le code barre ? +loginOtpOneTime=Code \u00e0 usage unique +loginTotpType=Type +loginTotpAlgorithm=Algorithme +loginTotpDigits=Chiffres +loginTotpInterval=Intervalle +loginTotpCounter=Compteur + +loginTotp.totp=Bas\u00e9 sur le temps +loginTotp.hotp=Bas\u00e9 sur les compteurs + +oauthGrantRequest=Voulez-vous accorder ces privil\u00e8ges d''acc\u00e8s ? +inResource=dans + +emailVerifyInstruction1=Un courriel avec des instructions \u00e0 suivre vous a \u00e9t\u00e9 envoy\u00e9. +emailVerifyInstruction2=Vous n''avez pas re\u00e7u de code dans le courriel ? +emailVerifyInstruction3=pour renvoyer le courriel. + +emailLinkIdpTitle=Association avec {0} +emailLinkIdp1=Un courriel avec des instructions pour associer le compte {1} sur {0} avec votre compte {2} vous a \u00e9t\u00e9 envoy\u00e9. +emailLinkIdp2=Vous n''avez pas re\u00e7u de code dans le courriel ? +emailLinkIdp3=pour renvoyer le courriel. +emailLinkIdp4=Si vous avez d\u00e9j\u00e0 v\u00e9rifi\u00e9 votre courriel dans un autre navigateur +emailLinkIdp5=pour continuer. + +backToLogin=« Retour \u00e0 la connexion + +emailInstruction=Entrez votre nom d''utilisateur ou votre courriel ; un courriel va vous \u00eatre envoy\u00e9 vous permettant de cr\u00e9er un nouveau mot de passe. + +copyCodeInstruction=Copiez le code et recopiez le dans votre application : + +pageExpiredTitle=La page a expir\u00e9 +pageExpiredMsg1=Pour recommencer le processus d''authentification +pageExpiredMsg2=Pour continuer le processus d''authentification + +personalInfo=Information personnelle : +role_admin=Administrateur +role_realm-admin=Administrateur du domaine +role_create-realm=Cr\u00e9er un domaine +role_create-client=Cr\u00e9er un client +role_view-realm=Voir un domaine +role_view-users=Voir les utilisateurs +role_view-applications=Voir les applications +role_view-clients=Voir les clients +role_view-events=Voir les \u00e9v\u00e9nements +role_view-identity-providers=Voir les fournisseurs d''identit\u00e9 +role_manage-realm=G\u00e9rer le domaine +role_manage-users=G\u00e9rer les utilisateurs +role_manage-applications=G\u00e9rer les applications +role_manage-identity-providers=G\u00e9rer les fournisseurs d''identit\u00e9 +role_manage-clients=G\u00e9rer les clients +role_manage-events=G\u00e9rer les \u00e9v\u00e9nements +role_view-profile=Voir le profil +role_manage-account=G\u00e9rer le compte +role_manage-account-links=G\u00e9rer les liens de compte +role_read-token=Lire le jeton d''authentification +role_offline-access=Acc\u00e8s hors-ligne +client_account=Compte +client_security-admin-console=Console d''administration de la s\u00e9curit\u00e9 +client_admin-cli=Admin CLI +client_realm-management=Gestion du domaine +client_broker=Broker + +invalidUserMessage=Nom d''utilisateur ou mot de passe invalide. +invalidEmailMessage=Courriel invalide. +accountDisabledMessage=Compte d\u00e9sactiv\u00e9, contactez votre administrateur. +accountTemporarilyDisabledMessage=Ce compte est temporairement d\u00e9sactiv\u00e9, contactez votre administrateur ou bien r\u00e9essayez plus tard. +expiredCodeMessage=Connexion expir\u00e9e. Veuillez vous reconnecter. +expiredActionMessage=Action expir\u00e9e. Merci de continuer la connexion. +expiredActionTokenNoSessionMessage=Action expir\u00e9e. +expiredActionTokenSessionExistsMessage=Action expir\u00e9e. Merci de recommencer. + +missingFirstNameMessage=Veuillez entrer votre pr\u00e9nom. +missingLastNameMessage=Veuillez entrer votre nom. +missingEmailMessage=Veuillez entrer votre courriel. +missingUsernameMessage=Veuillez entrer votre nom d''utilisateur. +missingPasswordMessage=Veuillez entrer votre mot de passe. +missingTotpMessage=Veuillez entrer votre code d''authentification. +notMatchPasswordMessage=Les mots de passe ne sont pas identiques. + +invalidPasswordExistingMessage=Mot de passe existant invalide. +invalidPasswordBlacklistedMessage=Mot de passe invalide : ce mot de passe est blacklist\u00e9. +invalidPasswordConfirmMessage=Le mot de passe de confirmation ne correspond pas. +invalidTotpMessage=Le code d''authentification est invalide. + +usernameExistsMessage=Le nom d''utilisateur existe d\u00e9j\u00e0. +emailExistsMessage=Le courriel existe d\u00e9j\u00e0. + +federatedIdentityExistsMessage=L''utilisateur avec {0} {1} existe d\u00e9j\u00e0. Veuillez acc\u00e9der \u00e0 au gestionnaire de compte pour lier le compte. +federatedIdentityEmailExistsMessage=Cet utilisateur avec ce courriel existe d\u00e9j\u00e0. Veuillez vous connecter au gestionnaire de compte pour lier le compte. + +confirmLinkIdpTitle=Ce compte existe d\u00e9j\u00e0 +federatedIdentityConfirmLinkMessage=L''utilisateur {0} {1} existe d\u00e9j\u00e0. Que souhaitez-vous faire ? +federatedIdentityConfirmReauthenticateMessage=Identifiez vous afin de lier votre compte avec {0} +confirmLinkIdpReviewProfile=V\u00e9rifiez vos informations de profil +confirmLinkIdpContinue=Souhaitez-vous lier {0} \u00e0 votre compte existant + +configureTotpMessage=Vous devez configurer l''authentification par mobile pour activer votre compte. +updateProfileMessage=Vous devez mettre \u00e0 jour votre profil pour activer votre compte. +updatePasswordMessage=Vous devez changer votre mot de passe pour activer votre compte. +resetPasswordMessage=Vous devez changer votre mot de passe. +verifyEmailMessage=Vous devez v\u00e9rifier votre courriel pour activer votre compte. +linkIdpMessage=Vous devez v\u00e9rifier votre courriel pour lier votre compte avec {0}. + +emailSentMessage=Vous devriez recevoir rapidement un courriel avec de plus amples instructions. +emailSendErrorMessage=Erreur lors de l''envoi du courriel, veuillez essayer plus tard. + +accountUpdatedMessage=Votre compte a \u00e9t\u00e9 mis \u00e0 jour. +accountPasswordUpdatedMessage=Votre mot de passe a \u00e9t\u00e9 mis \u00e0 jour. + +noAccessMessage=Aucun acc\u00e8s + +invalidPasswordMinLengthMessage=Mot de passe invalide : longueur minimale requise de {0}. +invalidPasswordMinDigitsMessage=Mot de passe invalide : doit contenir au moins {0} chiffre(s). +invalidPasswordMinLowerCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en minuscule. +invalidPasswordMinUpperCaseCharsMessage=Mot de passe invalide : doit contenir au moins {0} lettre(s) en majuscule. +invalidPasswordMinSpecialCharsMessage=Mot de passe invalide : doit contenir au moins {0} caract\u00e8re(s) sp\u00e9ciaux. +invalidPasswordNotUsernameMessage=Mot de passe invalide : ne doit pas \u00eatre identique au nom d''utilisateur. +invalidPasswordRegexPatternMessage=Mot de passe invalide : ne valide pas l''expression rationnelle. +invalidPasswordHistoryMessage=Mot de passe invalide : ne doit pas \u00eatre \u00e9gal aux {0} derniers mots de passe. +invalidPasswordGenericMessage=Mot de passe invalide : le nouveau mot de passe ne r\u00e9pond pas \u00e0 la politique de mot de passe. + +failedToProcessResponseMessage=Erreur lors du traitement de la r\u00e9ponse +httpsRequiredMessage=Le protocole HTTPS est requis +realmNotEnabledMessage=Le domaine n''est pas activ\u00e9 +invalidRequestMessage=Requ\u00eate invalide +failedLogout=La d\u00e9connexion a \u00e9chou\u00e9e +unknownLoginRequesterMessage=Compte inconnu du demandeur +loginRequesterNotEnabledMessage=La connexion du demandeur n''est pas active +bearerOnlyMessage=Les applications Bearer-only ne sont pas autoris\u00e9es \u00e0 initier la connexion par navigateur. +standardFlowDisabledMessage=Le client n''est pas autoris\u00e9 \u00e0 initier une connexion avec le navigateur avec ce response_type. Le flux standard est d\u00e9sactiv\u00e9 pour le client. +implicitFlowDisabledMessage=Le client n''est pas autoris\u00e9 \u00e0 initier une connexion avec le navigateur avec ce response_type. Le flux implicite est d\u00e9sactiv\u00e9 pour le client. +invalidRedirectUriMessage=L''URI de redirection est invalide +unsupportedNameIdFormatMessage=NameIDFormat non support\u00e9 +invalidRequesterMessage=Demandeur invalide +registrationNotAllowedMessage=L''enregistrement n''est pas autoris\u00e9 +resetCredentialNotAllowedMessage=La remise \u00e0 z\u00e9ro n''est pas autoris\u00e9e + +permissionNotApprovedMessage=La permission n''est pas approuv\u00e9e. +noRelayStateInResponseMessage=Aucun \u00e9tat de relais dans la r\u00e9ponse du fournisseur d''identit\u00e9. +insufficientPermissionMessage=Permissions insuffisantes pour lier les identit\u00e9s. +couldNotProceedWithAuthenticationRequestMessage=Impossible de continuer avec la requ\u00eate d''authentification vers le fournisseur d''identit\u00e9. +couldNotObtainTokenMessage=Impossible de r\u00e9cup\u00e9rer le jeton du fournisseur d''identit\u00e9. +unexpectedErrorRetrievingTokenMessage=Erreur inattendue lors de la r\u00e9cup\u00e9ration du jeton provenant du fournisseur d''identit\u00e9. +unexpectedErrorHandlingResponseMessage=Erreur inattendue lors du traitement de la r\u00e9ponse provenant du fournisseur d''identit\u00e9. +identityProviderAuthenticationFailedMessage=L''authentification a \u00e9chou\u00e9e. Impossible de s''authentifier avec le fournisseur d''identit\u00e9. +couldNotSendAuthenticationRequestMessage=Impossible d''envoyer la requ\u00eate d''authentification vers le fournisseur d''identit\u00e9. +unexpectedErrorHandlingRequestMessage=Erreur inattendue lors du traitement de la requ\u00eate vers le fournisseur d''identit\u00e9. +invalidAccessCodeMessage=Code d''acc\u00e8s invalide. +sessionNotActiveMessage=La session n''est pas active. +invalidCodeMessage=Une erreur est survenue, veuillez vous reconnecter \u00e0 votre application. +identityProviderUnexpectedErrorMessage=Erreur inattendue lors de l''authentification avec fournisseur d''identit\u00e9. +identityProviderNotFoundMessage=Impossible de trouver le fournisseur d''identit\u00e9 avec cet identifiant. +identityProviderLinkSuccess=Votre compte a \u00e9t\u00e9 correctement li\u00e9 avec {0} compte {1} . +staleCodeMessage=Cette page n''est plus valide, merci de retourner \u00e0 votre application et de vous connecter \u00e0 nouveau. +realmSupportsNoCredentialsMessage=Ce domaine ne supporte aucun type d''accr\u00e9ditation. +identityProviderNotUniqueMessage=Ce domaine autorise plusieurs fournisseurs d''identit\u00e9. Impossible de d\u00e9terminer le fournisseur d''identit\u00e9 avec lequel s''authentifier. +emailVerifiedMessage=Votre courriel a \u00e9t\u00e9 v\u00e9rifi\u00e9. + +staleEmailVerificationLink=Le lien que vous avez cliqu\u00e9 est p\u00e9rim\u00e9 et n''est plus valide. Peut-\u00eatre avez vous d\u00e9j\u00e0 v\u00e9rifi\u00e9 votre mot de passe ? +identityProviderAlreadyLinkedMessage=L''identit\u00e9 f\u00e9d\u00e9r\u00e9e retourn\u00e9e par {0} est d\u00e9j\u00e0 li\u00e9e \u00e0 un autre utilisateur. +confirmAccountLinking=Confirmez la liaison du compte {0} du fournisseur d''entit\u00e9 {1} avec votre compte. +confirmEmailAddressVerification=Confirmez la validit\u00e9 de l''adresse courriel {0}. +confirmExecutionOfActions=Suivez les instructions suivantes + + +backToApplication=« Revenir \u00e0 l''application +missingParameterMessage=Param\u00e8tres manquants \: {0} +clientNotFoundMessage=Client inconnu. +clientDisabledMessage=Client d\u00e9sactiv\u00e9. +invalidParameterMessage=Param\u00e8tre invalide \: {0} +alreadyLoggedIn=Vous \u00eates d\u00e9j\u00e0 connect\u00e9. + +differentUserAuthenticated=Vous \u00eates d\u00e9j\u00e0 authentifi\u00e9 avec un autre utilisateur ''{0}'' dans cette session. Merci de vous d\u00e9connecter. +proceedWithAction=» Cliquez ici + + +requiredAction.CONFIGURE_TOTP=Configurer OTP +requiredAction.terms_and_conditions=Termes et conditions +requiredAction.UPDATE_PASSWORD=Mettre \u00e0 jour votre mot de passe +requiredAction.UPDATE_PROFILE=Mettre \u00e0 jour votre profil +requiredAction.VERIFY_EMAIL=Valider votre adresse email + + +doX509Login=Vous allez \u00eatre connect\u00e9 en tant que\: +clientCertificate=X509 certificat client\: +noCertificate=[Pas de certificat] + + +pageNotFound=Page non trouv\u00e9e +internalServerError=Une erreur interne du serveur s''est produite + +locale_ca=Catal\u00E0 +locale_de=Deutsch +locale_eng=English +locale_es=Espa\u00F1ol +locale_fra=Fran\u00E7ais +locale_it=Italiano +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_pl=Polish +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_lt=Lietuvi\u0173 +locale_zh-CN=\u4E2D\u6587\u7B80\u4F53 +locale_sk=Sloven\u010Dina +locale_sv=Svenska +locale_ara=Arabic +locale_tam=தமிழ் +locale_kan=ಕನ್ನಡ +locale_hin=हिंदी \ No newline at end of file diff --git a/keycloak-jboss/theme/base/login/messages/messages_hin.properties b/keycloak-jboss/theme/base/login/messages/messages_hin.properties new file mode 100644 index 00000000..094e34af --- /dev/null +++ b/keycloak-jboss/theme/base/login/messages/messages_hin.properties @@ -0,0 +1,374 @@ +# encoding: utf-8 +doLogIn=लॉग इन करें +doRegister=रजिस्टर करें +doCancel=रद्द करना +doSubmit=प्रस्तुत +doBack=वापस +doYes=हाँ +doNo=नहीं न +doContinue=जारी रखें +doIgnore=नज़रअंदाज़ करना +doAccept=स्वीकार करना +doDecline=पतन +doForgotPassword=Forgot Password? +doClickHere=यहाँ क्लिक करें +doImpersonate=अभिनय करना +doTryAgain=Try फिर व +doTryAnotherWay=दूसरा तरीका आजमाएं +kerberosNotConfigured=Kerberos कॉन्फ़िगर नहीं किया गया +kerberosNotConfiguredTitle=Kerberos कॉन्फ़िगर नहीं किया गया +bypassKerberosDetail=या तो आप Kerberos द्वारा लॉग इन नहीं हैं या आपका ब्राउज़र Kerberos लॉगिन के लिए सेट अप नहीं है। कृपया अन्य माध्यमों से लॉगिन करना जारी रखें पर क्लिक करें +kerberosNotSetUp=Kerberos सेट नहीं है। आप लॉगिन नहीं कर सकते। +registerTitle=रजिस्टर करें +loginTitle=में प्रवेश करें {0} +loginTitleHtml={0} +impersonateTitle={0} प्रतिरूपण उपयोगकर्ता +impersonateTitleHtml={0} प्रतिरूपण उपयोगकर्ता +realmChoice=क्षेत्र +unknownUser=अज्ञात उपयोगकर्ता +loginTotpTitle=मोबाइल प्रमाणक सेटअप +loginProfileTitle=लेखा जानकारी को अद्यतन बनाएं +loginTimeout=आपके लॉगिन प्रयास का समय समाप्त हो गया। लॉगिन शुरुआत से शुरू हो जाएगा। +oauthGrantTitle=पहुँच प्रदान करें{0} +oauthGrantTitleHtml={0} +errorTitle=हमें खेद है... +errorTitleHtml=हम हैं माफ़ करना ... +emailVerifyTitle=ईमेल सत्यापन +emailForgotTitle=क्या आप पासवर्ड भूल गए? +updatePasswordTitle=पासवर्ड अपडेट करें +codeSuccessTitle=सफलता कोड +codeErrorTitle=त्रुटि कोड\: {0} +displayUnsupported=अनुरोधित प्रदर्शन प्रकार असमर्थित +browserRequired=लॉगिन करने के लिए आवश्यक ब्राउज़र +browserContinue=लॉगिन पूरा करने के लिए ब्राउज़र की आवश्यकता है +browserContinuePrompt=ब्राउज़र खोलें और लॉगिन जारी रखें? [y/n]: +browserContinueAnswer=y + + +termsTitle=नियम और शर्तें +termsText=

परिभाषित किए जाने वाले नियम और शर्तें

+termsPlainText=परिभाषित किए जाने वाले नियम और शर्तें. + +recaptchaFailed=अमान्य रीकैप्चा +recaptchaNotConfigured=रिकैप्चा आवश्यक है, लेकिन कॉन्फ़िगर नहीं किया गया है +consentDenied=सहमति अस्वीकृत. + +noAccount=नया उपयोगकर्ता? +username=उपयोगकर्ता नाम +usernameOrEmail=उपयोगकर्ता का नाम या ईमेल +firstName=पहला नाम +givenName=प्रदत्त नाम +fullName=पूरा नाम +lastName=अंतिम नाम +familyName=परिवार का नाम +email=ईमेल +password=कुंजिका +passwordConfirm=पासवर्ड की पुष्टि कीजिये +passwordNew=नया पासवर्ड +passwordNewConfirm=नया पासवर्ड पुष्टि +rememberMe=मुझे याद रखना +authenticatorCode=एक बार का कोड +address=पता +street=सड़क +locality=शहर या इलाका +region=राज्य, प्रांत या क्षेत्र +postal_code=डाक कोड +country=देश +emailVerified=ईमेल सत्यापित हुआ +gssDelegationCredential=जीएसएस प्रतिनिधिमंडल क्रेडेंशियल + +profileScopeConsentText=उपयोगकर्ता प्रोफ़ाइल +emailScopeConsentText=ईमेल पता +addressScopeConsentText=पता +phoneScopeConsentText=फ़ोन नंबर +offlineAccessScopeConsentText=ऑफलाइन एक्सेस +samlRoleListScopeConsentText=मेरी भूमिकाएं +rolesScopeConsentText=उपयोगकर्ता भूमिका + +restartLoginTooltip=लॉगिन पुनरारंभ करें + +loginTotpIntro=इस खाते तक पहुंचने के लिए आपको वन टाइम पासवर्ड जनरेटर सेट करना होगा +loginTotpStep1=अपने मोबाइल में निम्न में से कोई एक एप्लिकेशन इंस्टॉल करें: +loginTotpStep2=एप्लिकेशन खोलें और बारकोड को स्कैन करें: +loginTotpStep3=एप्लिकेशन द्वारा प्रदान किया गया वन-टाइम कोड दर्ज करें और सेटअप समाप्त करने के लिए सबमिट पर क्लिक करें। +loginTotpStep3DeviceName=अपने ओटीपी उपकरणों को प्रबंधित करने में आपकी सहायता के लिए डिवाइस का नाम प्रदान करें। +loginTotpManualStep2=एप्लिकेशन खोलें और कुंजी दर्ज करें: +loginTotpManualStep3=यदि एप्लिकेशन उन्हें सेट करने की अनुमति देता है तो निम्न कॉन्फ़िगरेशन मानों का उपयोग करें: +loginTotpUnableToScan=स्कैन करने में असमर्थ? +loginTotpScanBarcode=बारकोड स्कैन करें? +loginCredential=क्रेडेंशियल +loginOtpOneTime=एक बार का कोड +loginTotpType=प्रकार +loginTotpAlgorithm=कलन विधि +loginTotpDigits=कलन विधि +loginTotpInterval=मध्यान्तर +loginTotpCounter=काउंटर +loginTotpDeviceName=डिवाइस का नाम + +loginTotp.totp=समय पर आधारित +loginTotp.hotp=काउंटर-आधारित + +loginChooseAuthenticator=लॉगिन विधि चुनें + +oauthGrantRequest=क्या आप इन एक्सेस विशेषाधिकारों को प्रदान करते हैं? +inResource=में + +emailVerifyInstruction1=आपका ईमेल पता सत्यापित करने के निर्देशों वाला एक ईमेल आपको भेज दिया गया है। +emailVerifyInstruction2=आपके ईमेल में सत्यापन कोड प्राप्त नहीं हुआ है? +emailVerifyInstruction3=ईमेल को फिर से भेजने के लिए। + +emailLinkIdpTitle=संपर्क{0} +emailLinkIdp1=आपके {2} खाते के साथ {0} खाते {1} को लिंक करने के निर्देशों वाला एक ईमेल आपको भेजा गया है। +emailLinkIdp2=आपके ईमेल में सत्यापन कोड प्राप्त नहीं हुआ है? +emailLinkIdp3=ईमेल को फिर से भेजने के लिए। +emailLinkIdp4=यदि आप पहले ही ईमेल को भिन्न ब्राउज़र में सत्यापित कर चुके हैं +emailLinkIdp5=जारी रखने के लिए। + +backToLogin=« लॉगिन पर वापस जाएं + +emailInstruction=अपना उपयोगकर्ता नाम या ईमेल पता दर्ज करें और हम आपको एक नया पासवर्ड बनाने के निर्देश भेजेंगे। + +copyCodeInstruction=कृपया इस कोड को कॉपी करें और इसे अपने आवेदन में पेस्ट करें: + +pageExpiredTitle=पृष्ठ समाप्त हो गया है +pageExpiredMsg1=लॉगिन प्रक्रिया को पुनः आरंभ करने के लिए +pageExpiredMsg2=लॉगिन प्रक्रिया जारी रखने के लिए + +personalInfo=व्यक्तिगत जानकारी: +role_admin=व्यवस्थापक +role_realm-admin=क्षेत्र व्यवस्थापक +role_create-realm=दायरे बनाएं +role_create-client=क्लाइंट बनाएं +role_view-realm=क्षेत्र देखें +role_view-users=उपयोगकर्ताओं को देखें +role_view-applications=एप्लिकेशन देखें +role_view-clients=ग्राहकों को देखें +role_view-events=इवेंट देखें +role_view-identity-providers=पहचान प्रदाता देखें +role_manage-realm=दायरे का प्रबंधन करें +role_manage-users=उपयोगकर्ताओं को प्रबंधित करें +role_manage-applications=अनुप्रयोगों का प्रबंधन +role_manage-identity-providers=पहचान प्रदाताओं को प्रबंधित करें +role_manage-clients=ग्राहकों को प्रबंधित करें +role_manage-events=ईवेंट प्रबंधित करें +role_view-profile=प्रोफ़ाइल देखें +role_manage-account=खाते का प्रबंधन करें +role_manage-account-links=खाता लिंक प्रबंधित करें +role_read-token=टोकन पढ़ें +role_offline-access=ऑफ़लाइन पहुंच +client_account=लेखा +client_account-console=खाता कंसोल +client_security-admin-console=सुरक्षा व्यवस्थापक कंसोल +client_admin-cli=व्यवस्थापक सीएलआई +client_realm-management=क्षेत्र प्रबंधन +client_broker=दलाल + +requiredFields=आवश्यक फील्ड्स + +invalidUserMessage=अमान्य उपयोगकर्ता नाम या पासवर्ड। +invalidUsernameMessage=अमान्य उपयोगकर्ता नाम। +invalidUsernameOrEmailMessage=अमान्य उपयोगकर्ता नाम या ईमेल। +invalidPasswordMessage=अवैध पासवर्ड। +invalidEmailMessage=अमान्य ईमेल पता। +accountDisabledMessage=खाता अक्षम है, अपने व्यवस्थापक से संपर्क करें। +accountTemporarilyDisabledMessage=खाता अस्थायी रूप से अक्षम है; अपने व्यवस्थापक से संपर्क करें या बाद में पुनः प्रयास करें। +expiredCodeMessage=लॉगिन मध्यांतर। कृपया फिर भाग लें। +expiredActionMessage=कार्रवाई समाप्त हो गई। कृपया अभी लॉगिन जारी रखें। +expiredActionTokenNoSessionMessage=कार्रवाई समाप्त हो गई। +expiredActionTokenSessionExistsMessage=कार्रवाई समाप्त हो गई। कृपया फिर से शुरू करें। + +missingFirstNameMessage=कृपया प्रथम नाम निर्दिष्ट करें। +missingLastNameMessage=कृपया अंतिम नाम निर्दिष्ट करें। +missingEmailMessage=कृपया ईमेल निर्दिष्ट करें। +missingUsernameMessage=कृपया उपयोगकर्ता नाम निर्दिष्ट करें। +missingPasswordMessage=कृपया पासवर्ड निर्दिष्ट करें। +missingTotpMessage=कृपया प्रमाणक कोड निर्दिष्ट करें। +missingTotpDeviceNameMessage=कृपया डिवाइस का नाम निर्दिष्ट करें। +notMatchPasswordMessage=पासवर्ड मेल नहीं खाते। + +invalidPasswordExistingMessage=अमान्य मौजूदा पासवर्ड। +invalidPasswordBlacklistedMessage=अमान्य पासवर्ड: पासवर्ड काली सूची में डाल दिया गया है। +invalidPasswordConfirmMessage=पासवर्ड पुष्टिकरण मेल नहीं खाता। +invalidTotpMessage=अमान्य प्रमाणक कोड। + +usernameExistsMessage=उपयोगकर्ता का नाम पहले से मौजूद है। +emailExistsMessage=ईमेल पहले से मौजूद है। + +federatedIdentityExistsMessage={0} {1} वाला उपयोगकर्ता पहले से मौजूद है। खाते को लिंक करने के लिए कृपया खाता प्रबंधन में लॉगिन करें। + +confirmLinkIdpTitle=खाता पहले से मौजूद है +federatedIdentityConfirmLinkMessage={0} {1} वाला उपयोगकर्ता पहले से मौजूद है। आप कैसे जारी रखना चाहते हैं? +federatedIdentityConfirmReauthenticateMessage=अपने खाते को {0} से जोड़ने के लिए प्रमाणित करें +nestedFirstBrokerFlowMessage={0} उपयोगकर्ता {1} किसी ज्ञात उपयोगकर्ता से लिंक नहीं है। +confirmLinkIdpReviewProfile=प्रोफ़ाइल की समीक्षा करें +confirmLinkIdpContinue=मौजूदा खाते में जोड़ें + +configureTotpMessage=अपना खाता सक्रिय करने के लिए आपको मोबाइल प्रमाणक सेट करना होगा। +updateProfileMessage=अपने खाते को सक्रिय करने के लिए आपको अपनी उपयोगकर्ता प्रोफ़ाइल को अपडेट करना होगा। +updatePasswordMessage=अपना खाता सक्रिय करने के लिए आपको अपना पासवर्ड बदलना होगा। +resetPasswordMessage=आपको अपना पासवर्ड बदलना होगा। +verifyEmailMessage=अपना खाता सक्रिय करने के लिए आपको अपना ईमेल पता सत्यापित करना होगा। +linkIdpMessage=अपने खाते को {0} से जोड़ने के लिए आपको अपना ईमेल पता सत्यापित करना होगा। + +emailSentMessage=आपको आगे के निर्देशों के साथ शीघ्र ही एक ईमेल प्राप्त होना चाहिए। +emailSendErrorMessage=ईमेल भेजने में विफल, कृपया बाद में पुन: प्रयास करें। +accountUpdatedMessage=आपका खाता नवीनीकृत हो चुका है। +accountPasswordUpdatedMessage=आपका पासवर्ड बदला जा चुका है। + +delegationCompleteHeader=लॉग इन सफल +delegationCompleteMessage=आप इस ब्राउज़र विंडो को बंद कर सकते हैं और अपने कंसोल एप्लिकेशन पर वापस जा सकते हैं। +delegationFailedHeader=लॉगिन विफल +delegationFailedMessage=आप इस ब्राउज़र विंडो को बंद कर सकते हैं और अपने कंसोल एप्लिकेशन पर वापस जा सकते हैं और फिर से लॉग इन करने का प्रयास कर सकते हैं। + +noAccessMessage=तक पहुँच नहीं + +invalidPasswordMinLengthMessage=अमान्य पासवर्ड: न्यूनतम लंबाई {0}. +invalidPasswordMinDigitsMessage=अमान्य पासवर्ड: कम से कम {0} संख्यात्मक अंक होने चाहिए। +invalidPasswordMinLowerCaseCharsMessage=अमान्य पासवर्ड: कम से कम {0} लोअर केस वर्ण होने चाहिए। +invalidPasswordMinUpperCaseCharsMessage=अमान्य पासवर्ड: कम से कम {0} अपर केस वर्ण होने चाहिए। +invalidPasswordMinSpecialCharsMessage=अमान्य पासवर्ड: कम से कम {0} विशेष वर्ण होने चाहिए। +invalidPasswordNotUsernameMessage=अमान्य पासवर्ड: उपयोगकर्ता नाम के बराबर नहीं होना चाहिए। +invalidPasswordRegexPatternMessage=अमान्य पासवर्ड: रेगेक्स पैटर्न से मेल नहीं खाता (एस .)). +invalidPasswordHistoryMessage=अमान्य पासवर्ड: किसी भी अंतिम {0} पासवर्ड के बराबर नहीं होना चाहिए। +invalidPasswordGenericMessage=अमान्य पासवर्ड: नया पासवर्ड पासवर्ड नीतियों से मेल नहीं खाता। + +failedToProcessResponseMessage=प्रतिक्रिया संसाधित करने में विफल +httpsRequiredMessage=HTTPS आवश्यक +realmNotEnabledMessage=क्षेत्र सक्षम नहीं है +invalidRequestMessage=अमान्य अनुरोध +failedLogout=लॉगआउट विफल +unknownLoginRequesterMessage=अज्ञात लॉगिन अनुरोधकर्ता +loginRequesterNotEnabledMessage=लॉगिन अनुरोधकर्ता सक्षम नहीं है +bearerOnlyMessage=केवल वाहक अनुप्रयोगों को ब्राउज़र लॉगिन आरंभ करने की अनुमति नहीं है +standardFlowDisabledMessage=क्लाइंट को दिए गए response_type के साथ ब्राउज़र लॉगिन शुरू करने की अनुमति नहीं है। क्लाइंट के लिए मानक प्रवाह अक्षम है। +implicitFlowDisabledMessage=क्लाइंट को दिए गए response_type के साथ ब्राउज़र लॉगिन शुरू करने की अनुमति नहीं है। क्लाइंट के लिए निहित प्रवाह अक्षम है। +invalidRedirectUriMessage=अमान्य रीडायरेक्ट यूरी +unsupportedNameIdFormatMessage=असमर्थित NameIDFormat +invalidRequesterMessage=अमान्य अनुरोधकर्ता +registrationNotAllowedMessage=पंजीकरण की अनुमति नहीं है +resetCredentialNotAllowedMessage=क्रेडेंशियल रीसेट करने की अनुमति नहीं है + +permissionNotApprovedMessage=अनुमति स्वीकृत नहीं है। +noRelayStateInResponseMessage=पहचान प्रदाता के जवाब में कोई रिले स्थिति नहीं है। +insufficientPermissionMessage=पहचान लिंक करने के लिए अपर्याप्त अनुमतियां। +couldNotProceedWithAuthenticationRequestMessage=पहचान प्रदाता को प्रमाणीकरण अनुरोध के साथ आगे नहीं बढ़ सका। +couldNotObtainTokenMessage=पहचान प्रदाता से टोकन प्राप्त नहीं कर सका। +unexpectedErrorRetrievingTokenMessage=पहचान प्रदाता से टोकन प्राप्त करते समय अनपेक्षित त्रुटि। +unexpectedErrorHandlingResponseMessage=पहचान प्रदाता से प्रतिक्रिया को संभालते समय अनपेक्षित त्रुटि। +identityProviderAuthenticationFailedMessage=प्रमाणीकरण विफल होना। पहचान प्रदाता के साथ प्रमाणित नहीं किया जा सका। +couldNotSendAuthenticationRequestMessage=पहचान प्रदाता को प्रमाणीकरण अनुरोध नहीं भेजा जा सका। +unexpectedErrorHandlingRequestMessage=पहचान प्रदाता को प्रमाणीकरण अनुरोध को संसाधित करते समय अनपेक्षित त्रुटि। +invalidAccessCodeMessage=अमान्य एक्सेस कोड। +sessionNotActiveMessage=सत्र सक्रिय नहीं है। +invalidCodeMessage=एक त्रुटि हुई, कृपया अपने आवेदन के माध्यम से फिर से लॉगिन करें। +identityProviderUnexpectedErrorMessage=पहचान प्रदाता के साथ प्रमाणीकरण करते समय अनपेक्षित त्रुटि +identityProviderNotFoundMessage=पहचानकर्ता के साथ एक पहचान प्रदाता नहीं मिला। +identityProviderLinkSuccess=आपने अपना ईमेल सफलतापूर्वक सत्यापित कर लिया है। कृपया अपने मूल ब्राउज़र पर वापस जाएं और वहां लॉगिन के साथ जारी रखें। +staleCodeMessage=यह पृष्ठ अब मान्य नहीं है, कृपया अपने आवेदन पर वापस जाएं और फिर से लॉग इन करें +realmSupportsNoCredentialsMessage=दायरे किसी भी क्रेडेंशियल प्रकार का समर्थन नहीं करता है। +credentialSetupRequired=लॉगिन नहीं कर सकता, क्रेडेंशियल सेटअप की आवश्यकता है। +identityProviderNotUniqueMessage=दायरे कई पहचान प्रदाताओं का समर्थन करता है। यह निर्धारित नहीं किया जा सका कि किस पहचान प्रदाता के साथ प्रमाणित करने के लिए उपयोग किया जाना चाहिए। +emailVerifiedMessage=आपका ईमेल पता सत्यापित कर दिया गया है। +staleEmailVerificationLink=आपके द्वारा क्लिक किया गया लिंक पुराना पुराना लिंक है और अब मान्य नहीं है। हो सकता है कि आपने अपना ईमेल पहले ही सत्यापित कर लिया हो। +identityProviderAlreadyLinkedMessage={0} द्वारा लौटाई गई फ़ेडरेटेड पहचान पहले से ही किसी अन्य उपयोगकर्ता से जुड़ी हुई है। +confirmAccountLinking=पहचान प्रदाता {1} के खाते को अपने खाते से जोड़ने की पुष्टि करें। +confirmEmailAddressVerification=ई-मेल पते {0} की वैधता की पुष्टि करें। +confirmExecutionOfActions=निम्नलिखित क्रियाएं करें + +locale_ca=कैटल\u00E0 +locale_de=deutsch +locale_eng=अंग्रेज़ी +locale_es=एस्पा\u00F1ol +locale_fra=फ़्रैन\u00E7ais +locale_it=Italiano +locale_ja=\u65E5\u672C\u8A9E +locale_nl=नीदरलैंड्स +locale_no=Norsk +locale_pl=Polish +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_lt=Lietuvi\u0173 +locale_zh-CN=\u4E2D\u6587\u7B80\u4F53 +locale_sk=Sloven\u010Dina +locale_sv=Svenska +locale_ara=Arabic +locale_tam=தமிழ் +locale_kan=ಕನ್ನಡ +locale_hin=हिंदी + +backToApplication=« आवेदन पर वापस जाएं +missingParameterMessage=गुम पैरामीटर\: {0} +clientNotFoundMessage=ग्राहक नहीं मिला। +clientDisabledMessage=क्लाइंट अक्षम. +invalidParameterMessage=अमान्य मापदंड\: {0} +alreadyLoggedIn=आप पहले से लॉगिन कर रहे हैं. +differentUserAuthenticated=आप इस सत्र में पहले से ही भिन्न उपयोगकर्ता ''{0}'' के रूप में प्रमाणित हैं। कृपया पहले लॉग आउट करें। +brokerLinkingSessionExpired=अनुरोधित ब्रोकर खाता लिंकिंग, लेकिन वर्तमान सत्र अब मान्य नहीं है। +proceedWithAction=» आगे बढ़ने के लिए यहां क्लिक करें + +requiredAction.CONFIGURE_TOTP=ओटीपी कॉन्फ़िगर करें +requiredAction.terms_and_conditions=नियम और शर्तें +requiredAction.UPDATE_PASSWORD=पासवर्ड अपडेट करें +requiredAction.UPDATE_PROFILE=प्रोफ़ाइल अपडेट करें +requiredAction.VERIFY_EMAIL=Verify Email + +doX509Login=आप के रूप में लॉग इन किया जाएगा\: +clientCertificate=X509 क्लाइंट प्रमाणपत्र\: +noCertificate=[कोई प्रमाणपत्र नहीं] + + +pageNotFound=पृष्ठ नहीं मिला +internalServerError=एक आंतरिक सर्वर त्रुटि हुई है + +console-username=उपयोगकर्ता नाम: +console-password=कुंजिका: +console-otp=वन टाइम पासवर्ड: +console-new-password=नया पासवर्ड: +console-confirm-password=पासवर्ड की पुष्टि कीजिये: +console-update-password=आपके पासवर्ड का अद्यतन आवश्यक है। +console-verify-email=आपको अपना ईमेल पता सत्यापित करना होगा। हमने {0} को एक ईमेल भेजा है जिसमें एक सत्यापन कोड है। कृपया इस कोड को नीचे दिए गए इनपुट में दर्ज करें। +console-email-code=ईमेल कोड: +console-accept-terms=शर्तों को स्वीकारें? [y/n]: +console-accept=y + +# Openshift messages +openshift.scope.user_info=यूजर जानकारी +openshift.scope.user_check-access=उपयोगकर्ता पहुंच जानकारी +openshift.scope.user_full=Full Access +openshift.scope.list-projects=परियोजनाओं की सूची बनाएं + +# SAML authentication +saml.post-form.title=प्रमाणीकरण पुनर्निर्देशन +saml.post-form.message=फिर से भेजा जा रहा है ............ कृपया इंतजार करें। +saml.post-form.js-disabled=जावास्क्रिप्ट अक्षम है। हम इसे सक्षम करने की दृढ़ता से अनुशंसा करते हैं। जारी रखने के लिए नीचे के बटन पर क्लिक करें। + +#authenticators +otp-display-name=प्रमाणक आवेदन +otp-help-text=प्रमाणक आवेदन से सत्यापन कोड दर्ज करें। +password-display-name=कुंजिका +password-help-text=अपना पासवर्ड डालकर लॉग इन करें। +auth-username-form-display-name=उपयोगकर्ता नाम +auth-username-form-help-text=अपना उपयोगकर्ता नाम दर्ज करके लॉग इन प्रारंभ करें +auth-username-password-form-display-name=उपयोगकर्ता नाम और पासवर्ड +auth-username-password-form-help-text=अपना यूजरनेम और पासवर्ड डालकर लॉग इन करें। + +# WebAuthn +webauthn-display-name=सुरक्षा कुंजी +webauthn-help-text=लॉग इन करने के लिए अपनी सुरक्षा कुंजी का उपयोग करें। +webauthn-passwordless-display-name=सुरक्षा कुंजी +webauthn-passwordless-help-text=पासवर्ड रहित लॉग इन के लिए अपनी सुरक्षा कुंजी का उपयोग करें। +webauthn-login-title=सुरक्षा कुंजी लॉगिन +webauthn-registration-title=सुरक्षा कुंजी पंजीकरण +webauthn-available-authenticators=उपलब्ध प्रमाणक + +# WebAuthn Error +webauthn-error-title=सुरक्षा कुंजी त्रुटि +webauthn-error-registration=आपकी सुरक्षा कुंजी पंजीकृत करने में विफल. +webauthn-error-api-get=सुरक्षा कुंजी द्वारा प्रमाणित करने में विफल. +webauthn-error-different-user=पहला प्रमाणीकृत उपयोगकर्ता सुरक्षा कुंजी द्वारा प्रमाणित नहीं है. +webauthn-error-auth-verification=सुरक्षा कुंजी प्रमाणीकरण परिणाम अमान्य है. +webauthn-error-register-verification=सुरक्षा कुंजी पंजीकरण परिणाम अमान्य है. +webauthn-error-user-not-found=सुरक्षा कुंजी द्वारा प्रमाणित अज्ञात उपयोगकर्ता. + +identity-provider-redirector=किसी अन्य पहचान प्रदाता से जुड़ें \ No newline at end of file diff --git a/keycloak-jboss/theme/base/login/messages/messages_kan.properties b/keycloak-jboss/theme/base/login/messages/messages_kan.properties new file mode 100644 index 00000000..0dbe0594 --- /dev/null +++ b/keycloak-jboss/theme/base/login/messages/messages_kan.properties @@ -0,0 +1,375 @@ +# encoding: utf-8 +doLogIn=ಲಾಗ್ ಇನ್ ಮಾಡಿ +doRegister=ನೋಂದಾಯಿಸಿ +doCancel=ರದ್ದುಮಾಡಿ +doSubmit=ಸಲ್ಲಿಸಿ +doBack=ಹಿಂದೆ +doYes=ಹೌದು +doNo=ಇಲ್ಲ +doContinue=ಮುಂದುವರಿಸಿ +doIgnore=ನಿರ್ಲಕ್ಷಿಸು +doAccept=ಸ್ವೀಕರಿಸಿ +doDecline=ಅವನತಿ +doForgotPassword=ಪಾಸ್‌ವರ್ಡ್ ಮರೆತಿರುವಿರಾ? +doClickHere=ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ +doImpersonate=ಸೋಗು ಹಾಕಿ +doTryAgain=ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ +doTryAnotherWay=ಇನ್ನೊಂದು ರೀತಿಯಲ್ಲಿ ಪ್ರಯತ್ನಿಸಿ +kerberosNotConfigured=ಕರ್ಬರೋಸ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿಲ್ಲ +kerberosNotConfiguredTitle=ಕರ್ಬರೋಸ್ ಕಾನ್ಫಿಗರ್ ಮಾಡಿಲ್ಲ +bypassKerberosDetail=ಒಂದೋ ನೀವು ಕರ್ಬರೋಸ್‌ನಿಂದ ಲಾಗಿನ್ ಆಗಿಲ್ಲ ಅಥವಾ ಕರ್ಬರೋಸ್ ಲಾಗಿನ್‌ಗಾಗಿ ನಿಮ್ಮ ಬ್ರೌಸರ್ ಅನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ. ಇತರ ವಿಧಾನಗಳ ಮೂಲಕ ಲಾಗಿನ್ ಆಗಲು ಮುಂದುವರಿಸಿ ಕ್ಲಿಕ್ ಮಾಡಿ +kerberosNotSetUp= ಕರ್ಬರೋಸ್ ಅನ್ನು ಹೊಂದಿಸಲಾಗಿಲ್ಲ. ನೀವು ಲಾಗಿನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ. +registerTitle=ನೋಂದಾಯಿಸಿ +loginTitle={0} to ಗೆ ಲಾಗ್ ಇನ್ ಮಾಡಿ +loginTitleHtml={0} +impersonateTitle={0} ಸೋಗು ಹಾಕುವ ಬಳಕೆದಾರ +impersonateTitleHtml= {0} ಸೋಗು ಹಾಕುವ ಬಳಕೆದಾರ +realmChoice=ಕ್ಷೇತ್ರ +unknownUser=ಅಜ್ಞಾತ ಬಳಕೆದಾರ +loginTotpTitle=ಮೊಬೈಲ್ ದೃ hentic ೀಕರಣ ಸೆಟಪ್ +loginProfileTitle=ಖಾತೆ ಮಾಹಿತಿಯನ್ನು ನವೀಕರಿಸಿ +loginTimeout=ನಿಮ್ಮ ಲಾಗಿನ್ ಪ್ರಯತ್ನ ಮುಗಿದಿದೆ. ಲಾಗಿನ್ ಮೊದಲಿನಿಂದ ಪ್ರಾರಂಭವಾಗುತ್ತದೆ. +oauthGrantTitle={0}to ಗೆ ಪ್ರವೇಶವನ್ನು ನೀಡಿ +oauthGrantTitleHtml={0} +errorTitle=ನಮ್ಮನ್ನು ಕ್ಷಮಿಸಿ ... +errorTitleHtml=ನಾವು ಕ್ಷಮಿಸಿ ... +emailVerifyTitle=ಇಮೇಲ್ ಪರಿಶೀಲನೆ +emailForgotTitle=ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಮರೆತಿರುವಿರಾ? +updatePasswordTitle=ಪಾಸ್‌ವರ್ಡ್ ನವೀಕರಿಸಿ +codeSuccessTitle=ಯಶಸ್ಸಿನ ಕೋಡ್ +codeErrorTitle=ದೋಷ ಕೋಡ್ \: {0} +displayUnsupported=ವಿನಂತಿಸಿದ ಪ್ರದರ್ಶನ ಪ್ರಕಾರವನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ +browserRequired=ಲಾಗಿನ್ ಮಾಡಲು ಬ್ರೌಸರ್ ಅಗತ್ಯವಿದೆ +browserContinue=ಲಾಗಿನ್ ಪೂರ್ಣಗೊಳಿಸಲು ಬ್ರೌಸರ್ ಅಗತ್ಯವಿದೆ +browserContinuePrompt=ಬ್ರೌಸರ್ ತೆರೆಯಿರಿ ಮತ್ತು ಲಾಗಿನ್ ಮುಂದುವರಿಸುವುದೇ? [y / n]: +browserContinueAnswer=y + + +termsTitle=ನಿಯಮಗಳು ಮತ್ತು ಷರತ್ತುಗಳು +termsText=

ವ್ಯಾಖ್ಯಾನಿಸಬೇಕಾದ ನಿಯಮಗಳು ಮತ್ತು ಷರತ್ತುಗಳು +termsPlainText=ವ್ಯಾಖ್ಯಾನಿಸಬೇಕಾದ ನಿಯಮಗಳು ಮತ್ತು ಷರತ್ತುಗಳು. + +recaptchaFailed=ಅಮಾನ್ಯ ಮರುಸಂಗ್ರಹ +recaptchaNotConfigured=Recaptcha ಅಗತ್ಯವಿದೆ, ಆದರೆ ಕಾನ್ಫಿಗರ್ ಮಾಡಿಲ್ಲ +consentDenied=ಒಪ್ಪಿಗೆ ನಿರಾಕರಿಸಲಾಗಿದೆ. + +noAccount=ಹೊಸ ಬಳಕೆದಾರ? +username=ಬಳಕೆದಾರಹೆಸರು +usernameOrEmail=ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಇಮೇಲ್ +firstName=ಮೊದಲ ಹೆಸರು +givenName=ಕೊಟ್ಟಿರುವ ಹೆಸರು +fullName=ಪೂರ್ಣ ಹೆಸರು +lastName=ಕೊನೆಯ ಹೆಸರು +familyName=ಕುಟುಂಬದ ಹೆಸರು +email=ಇಮೇಲ್ +password=ಪಾಸ್ವರ್ಡ್ +passwordConfirm=ಪಾಸ್ವರ್ಡ್ ಅನ್ನು ದೃ irm ೀಕರಿಸಿ +passwordNew=ಹೊಸ ಪಾಸ್‌ವರ್ಡ್ +passwordNewConfirm=ಹೊಸ ಪಾಸ್‌ವರ್ಡ್ ದೃ mation ೀಕರಣ +rememberMe=ನನ್ನನ್ನು ನೆನಪಿಡಿ +authenticatorCode=ಒಂದು-ಬಾರಿ ಕೋಡ್ +address=ವಿಳಾಸ +street=ರಸ್ತೆ +locality=ನಗರ ಅಥವಾ ಸ್ಥಳ +region=ರಾಜ್ಯ, ಪ್ರಾಂತ್ಯ ಅಥವಾ ಪ್ರದೇಶ +postal_code=ಪಿನ್ ಅಥವಾ ಅಂಚೆ ಕೋಡ್ +country=ದೇಶ +emailVerified=ಇಮೇಲ್ ಪರಿಶೀಲಿಸಲಾಗಿದೆ +gssDelegationCredential=ಜಿಎಸ್ಎಸ್ ನಿಯೋಗ ರುಜುವಾತು + +profileScopeConsentText=ಬಳಕೆದಾರರ ಪ್ರೊಫೈಲ್ +emailScopeConsentText=ಇಮೇಲ್ ವಿಳಾಸ +addressScopeConsentText=ವಿಳಾಸ +phoneScopeConsentText=ಫೋನ್ ಸಂಖ್ಯೆ +offlineAccessScopeConsentText=ಆಫ್‌ಲೈನ್ ಪ್ರವೇಶ +samlRoleListScopeConsentText=ನನ್ನ ಪಾತ್ರಗಳು +rolesScopeConsentText=ಬಳಕೆದಾರರ ಪಾತ್ರಗಳು + +restartLoginTooltip=ಲಾಗಿನ್ ಅನ್ನು ಮರುಪ್ರಾರಂಭಿಸಿ + +loginTotpIntro=ಈ ಖಾತೆಯನ್ನು ಪ್ರವೇಶಿಸಲು ನೀವು ಒನ್ ಟೈಮ್ ಪಾಸ್ವರ್ಡ್ ಜನರೇಟರ್ ಅನ್ನು ಹೊಂದಿಸಬೇಕಾಗಿದೆ +loginTotpStep1=ನಿಮ್ಮ ಮೊಬೈಲ್‌ನಲ್ಲಿ ಈ ಕೆಳಗಿನ ಅಪ್ಲಿಕೇಶನ್‌ಗಳಲ್ಲಿ ಒಂದನ್ನು ಸ್ಥಾಪಿಸಿ: +loginTotpStep2=ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ ಮತ್ತು ಬಾರ್‌ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡಿ: +loginTotpStep3=ಅಪ್ಲಿಕೇಶನ್ ಒದಗಿಸಿದ ಒನ್-ಟೈಮ್ ಕೋಡ್ ಅನ್ನು ನಮೂದಿಸಿ ಮತ್ತು ಸೆಟಪ್ ಮುಗಿಸಲು ಸಲ್ಲಿಸು ಕ್ಲಿಕ್ ಮಾಡಿ. +loginTotpStep3DeviceName=ನಿಮ್ಮ OTP ಸಾಧನಗಳನ್ನು ನಿರ್ವಹಿಸಲು ನಿಮಗೆ ಸಹಾಯ ಮಾಡಲು ಸಾಧನದ ಹೆಸರನ್ನು ಒದಗಿಸಿ. +loginTotpManualStep2=ಅಪ್ಲಿಕೇಶನ್ ತೆರೆಯಿರಿ ಮತ್ತು ಕೀಲಿಯನ್ನು ನಮೂದಿಸಿ: +loginTotpManualStep3=ಅಪ್ಲಿಕೇಶನ್ ಅವುಗಳನ್ನು ಹೊಂದಿಸಲು ಅನುಮತಿಸಿದರೆ ಈ ಕೆಳಗಿನ ಸಂರಚನಾ ಮೌಲ್ಯಗಳನ್ನು ಬಳಸಿ: +loginTotpUnableToScan=ಸ್ಕ್ಯಾನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲವೇ? +loginTotpScanBarcode=ಬಾರ್‌ಕೋಡ್ ಅನ್ನು ಸ್ಕ್ಯಾನ್ ಮಾಡುವುದೇ? +loginCredential=ರುಜುವಾತು +loginOtpOneTime=ಒಂದು-ಬಾರಿ ಕೋಡ್ +loginTotpType=ಪ್ರಕಾರ +loginTotpAlgorithm=ಅಲ್ಗಾರಿದಮ್ +loginTotpDigits=ಅಂಕೆಗಳು +loginTotpInterval=ಮಧ್ಯಂತರ +loginTotpCounter=ಕೌಂಟರ್ +loginTotpDeviceName=ಸಾಧನದ ಹೆಸರು + +loginTotp.totp=ಸಮಯ ಆಧಾರಿತ +loginTotp.hotp=ಕೌಂಟರ್ ಆಧಾರಿತ + +loginChooseAuthenticator=ಲಾಗಿನ್ ವಿಧಾನವನ್ನು ಆರಿಸಿ + +oauthGrantRequest=ನೀವು ಈ ಪ್ರವೇಶ ಸೌಲಭ್ಯಗಳನ್ನು ನೀಡುತ್ತೀರಾ? +inResource=இல் + +emailVerifyInstruction1=ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಪರಿಶೀಲಿಸಲು ಸೂಚನೆಗಳನ್ನು ಹೊಂದಿರುವ ಇಮೇಲ್ ಅನ್ನು ನಿಮಗೆ ಕಳುಹಿಸಲಾಗಿದೆ. +emailVerifyInstruction2=ನಿಮ್ಮ ಇಮೇಲ್‌ನಲ್ಲಿ ಪರಿಶೀಲನೆ ಕೋಡ್ ಸ್ವೀಕರಿಸಿಲ್ಲವೇ? +emailVerifyInstruction3=ಇಮೇಲ್ ಅನ್ನು ಮರು ಕಳುಹಿಸಲು. + +emailLinkIdpTitle=ಲಿಂಕ್ {0} +emailLinkIdp1=ನಿಮ್ಮ {2} ಖಾತೆಯೊಂದಿಗೆ {0} ಖಾತೆ {1 link ಅನ್ನು ಲಿಂಕ್ ಮಾಡಲು ಸೂಚನೆಗಳನ್ನು ಹೊಂದಿರುವ ಇಮೇಲ್ ಅನ್ನು ನಿಮಗೆ ಕಳುಹಿಸಲಾಗಿದೆ. +emailLinkIdp2=ನಿಮ್ಮ ಇಮೇಲ್‌ನಲ್ಲಿ ಪರಿಶೀಲನೆ ಕೋಡ್ ಸ್ವೀಕರಿಸಿಲ್ಲವೇ? +emailLinkIdp3=ಇಮೇಲ್ ಅನ್ನು ಮರು ಕಳುಹಿಸಲು. +emailLinkIdp4=ನೀವು ಈಗಾಗಲೇ ಬೇರೆ ಬ್ರೌಸರ್‌ನಲ್ಲಿ ಇಮೇಲ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿದರೆ +emailLinkIdp5=ಮುಂದುವರಿಸಲು. + +backToLogin=& laquo; ಲಾಗಿನ್‌ಗೆ ಹಿಂತಿರುಗಿ + +emailInstruction=ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನಮೂದಿಸಿ ಮತ್ತು ಹೊಸ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಹೇಗೆ ರಚಿಸುವುದು ಎಂಬುದರ ಕುರಿತು ನಾವು ನಿಮಗೆ ಸೂಚನೆಗಳನ್ನು ಕಳುಹಿಸುತ್ತೇವೆ. + +copyCodeInstruction=ದಯವಿಟ್ಟು ಈ ಕೋಡ್ ಅನ್ನು ನಕಲಿಸಿ ಮತ್ತು ಅದನ್ನು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಅಂಟಿಸಿ: + +pageExpiredTitle=ಪುಟ ಅವಧಿ ಮೀರಿದೆ +pageExpiredMsg1=ಲಾಗಿನ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಮರುಪ್ರಾರಂಭಿಸಲು +pageExpiredMsg2=ಲಾಗಿನ್ ಪ್ರಕ್ರಿಯೆಯನ್ನು ಮುಂದುವರಿಸಲು + +personalInfo=ವೈಯಕ್ತಿಕ ಮಾಹಿತಿ: +role_admin=ನಿರ್ವಹಣೆ +role_realm-admin=ಕ್ಷೇತ್ರ ನಿರ್ವಹಣೆ +role_create-realm=ಕ್ಷೇತ್ರವನ್ನು ರಚಿಸಿ +role_create-client=ಕ್ಲೈಂಟ್ ರಚಿಸಿ +role_view-realm=ಕ್ಷೇತ್ರವನ್ನು ವೀಕ್ಷಿಸಿ +role_view-users=ಬಳಕೆದಾರರನ್ನು ವೀಕ್ಷಿಸಿ +role_view-applications=ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ +role_view-clients=ಗ್ರಾಹಕರನ್ನು ವೀಕ್ಷಿಸಿ +role_view-events=ಈವೆಂಟ್‌ಗಳನ್ನು ವೀಕ್ಷಿಸಿ +role_view-identity-providers=ಗುರುತಿನ ಪೂರೈಕೆದಾರರನ್ನು ವೀಕ್ಷಿಸಿ +role_manage-realm=ಕ್ಷೇತ್ರವನ್ನು ನಿರ್ವಹಿಸಿ +role_manage-users=ಬಳಕೆದಾರರನ್ನು ನಿರ್ವಹಿಸಿ +role_manage-applications=ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ +role_manage-identity-providers=ಗುರುತಿನ ಪೂರೈಕೆದಾರರನ್ನು ನಿರ್ವಹಿಸಿ +role_manage-clients=ಕ್ಲೈಂಟ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ +role_manage-events=ಈವೆಂಟ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ +role_view-profile= ಪ್ರೊಫೈಲ್ ವೀಕ್ಷಿಸಿ +role_manage-account=ಖಾತೆಯನ್ನು ನಿರ್ವಹಿಸಿ +role_manage-account-links=ಖಾತೆ ಲಿಂಕ್‌ಗಳನ್ನು ನಿರ್ವಹಿಸಿ +role_read-token=ಟೋಕನ್ ಓದಿ +role_offline-access=ಆಫ್‌ಲೈನ್ ಪ್ರವೇಶ +client_account=ಖಾತೆ +client_account-console=ಖಾತೆ ಕನ್ಸೋಲ್ +client_security-admin-console=ಭದ್ರತಾ ನಿರ್ವಹಣೆ ಕನ್ಸೋಲ್ +client_admin-cli=ನಿರ್ವಹಣೆ CLI +client_realm-management=ಕ್ಷೇತ್ರ ನಿರ್ವಹಣೆ +client_broker=ಬ್ರೋಕರ್ + +requiredFields=ಅಗತ್ಯವಿರುವ ಕ್ಷೇತ್ರಗಳು + +invalidUserMessage=ಅಮಾನ್ಯ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಪಾಸ್‌ವರ್ಡ್. +invalidUsernameMessage=ಅಮಾನ್ಯ ಬಳಕೆದಾರಹೆಸರು. +invalidUsernameOrEmailMessage=ಅಮಾನ್ಯ ಬಳಕೆದಾರಹೆಸರು ಅಥವಾ ಇಮೇಲ್. +invalidPasswordMessage=ಅಮಾನ್ಯ ಪಾಸ್ವರ್ಡ್. +invalidEmailMessage=ಅಮಾನ್ಯ ಇಮೇಲ್ ವಿಳಾಸ. +accountDisabledMessage=ಖಾತೆಯನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ, ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ. +accountTemporarilyDisabledMessage=ಖಾತೆಯನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ; ನಿಮ್ಮ ನಿರ್ವಾಹಕರನ್ನು ಸಂಪರ್ಕಿಸಿ ಅಥವಾ ನಂತರ ಮರುಪ್ರಯತ್ನಿಸಿ. +expiredCodeMessage=ಲಾಗಿನ್ ಕಾಲಾವಧಿ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಲಾಗ್ ಇನ್ ಮಾಡಿ. +expiredActionMessage=ಕ್ರಿಯೆಯ ಅವಧಿ ಮುಗಿದಿದೆ. ದಯವಿಟ್ಟು ಈಗ ಲಾಗಿನ್‌ನೊಂದಿಗೆ ಮುಂದುವರಿಸಿ. +expiredActionTokenNoSessionMessage=ಕ್ರಿಯೆಯ ಅವಧಿ ಮುಗಿದಿದೆ. +expiredActionTokenSessionExistsMessage=ಕ್ರಿಯೆಯ ಅವಧಿ ಮುಗಿದಿದೆ. ದಯವಿಟ್ಟು ಮತ್ತೆ ಪ್ರಾರಂಭಿಸಿ. + +missingFirstNameMessage=ದಯವಿಟ್ಟು ಮೊದಲ ಹೆಸರನ್ನು ಸೂಚಿಸಿ. +missingLastNameMessage=ದಯವಿಟ್ಟು ಕೊನೆಯ ಹೆಸರನ್ನು ಸೂಚಿಸಿ. +missingEmailMessage=ದಯವಿಟ್ಟು ಇಮೇಲ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ. +missingUsernameMessage=ದಯವಿಟ್ಟು ಬಳಕೆದಾರಹೆಸರನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ. +missingPasswordMessage=ದಯವಿಟ್ಟು ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ. +missingTotpMessage=ದಯವಿಟ್ಟು ದೃ hentic ೀಕರಣ ಕೋಡ್ ಅನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ. +missingTotpDeviceNameMessage=ದಯವಿಟ್ಟು ಸಾಧನದ ಹೆಸರನ್ನು ನಿರ್ದಿಷ್ಟಪಡಿಸಿ. +notMatchPasswordMessage=ಪಾಸ್‌ವರ್ಡ್‌ಗಳು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. + +invalidPasswordExistingMessage=ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಪಾಸ್‌ವರ್ಡ್ ಅಮಾನ್ಯವಾಗಿದೆ. +invalidPasswordBlacklistedMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ಕಪ್ಪುಪಟ್ಟಿಗೆ ಸೇರಿಸಲಾಗಿದೆ. +invalidPasswordConfirmMessage=ಪಾಸ್‌ವರ್ಡ್ ದೃ mation ೀಕರಣವು ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. +invalidTotpMessage=ಅಮಾನ್ಯ ದೃ hentic ೀಕರಣ ಕೋಡ್. + +usernameExistsMessage=ಬಳಕೆದಾರಹೆಸರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. +emailExistsMessage=ಇಮೇಲ್ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. + +federatedIdentityExistsMessage= {0} {1} with ಹೊಂದಿರುವ ಬಳಕೆದಾರರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದಾರೆ. ಖಾತೆಯನ್ನು ಲಿಂಕ್ ಮಾಡಲು ದಯವಿಟ್ಟು ಖಾತೆ ನಿರ್ವಹಣೆಗೆ ಲಾಗಿನ್ ಮಾಡಿ. + +confirmLinkIdpTitle=ಖಾತೆ ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ +federatedIdentityConfirmLinkMessage={0} {1} with ಹೊಂದಿರುವ ಬಳಕೆದಾರರು ಈಗಾಗಲೇ ಅಸ್ತಿತ್ವದಲ್ಲಿದ್ದಾರೆ. ನೀವು ಹೇಗೆ ಮುಂದುವರಿಸಲು ಬಯಸುತ್ತೀರಿ? +federatedIdentityConfirmReauthenticateMessage=ನಿಮ್ಮ ಖಾತೆಯನ್ನು {0 }with ನೊಂದಿಗೆ ಲಿಂಕ್ ಮಾಡಲು ದೃ hentic ೀಕರಿಸಿ +nestedFirstBrokerFlowMessage={0} ಬಳಕೆದಾರ {1} known ತಿಳಿದಿರುವ ಯಾವುದೇ ಬಳಕೆದಾರರೊಂದಿಗೆ ಸಂಪರ್ಕ ಹೊಂದಿಲ್ಲ. +confirmLinkIdpReviewProfile=ವಿಮರ್ಶೆ ಪ್ರೊಫೈಲ್ +confirmLinkIdpContinue=ಅಸ್ತಿತ್ವದಲ್ಲಿರುವ ಖಾತೆಗೆ ಸೇರಿಸಿ + +configureTotpMessage=ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನೀವು ಮೊಬೈಲ್ ದೃ hentic ೀಕರಣವನ್ನು ಹೊಂದಿಸಬೇಕಾಗಿದೆ. +updateProfileMessage=ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನಿಮ್ಮ ಬಳಕೆದಾರರ ಪ್ರೊಫೈಲ್ ಅನ್ನು ನೀವು ನವೀಕರಿಸಬೇಕಾಗಿದೆ. +updatePasswordMessage=ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನೀವು ಬದಲಾಯಿಸಬೇಕಾಗಿದೆ. +resetPasswordMessage=ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನೀವು ಬದಲಾಯಿಸಬೇಕಾಗಿದೆ. +verifyEmailMessage=ನಿಮ್ಮ ಖಾತೆಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬೇಕಾಗಿದೆ. +linkIdpMessage=ನಿಮ್ಮ ಖಾತೆಯನ್ನು {0} with ನೊಂದಿಗೆ ಲಿಂಕ್ ಮಾಡಲು ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬೇಕಾಗಿದೆ. + +emailSentMessage=ಹೆಚ್ಚಿನ ಸೂಚನೆಗಳೊಂದಿಗೆ ನೀವು ಶೀಘ್ರದಲ್ಲೇ ಇಮೇಲ್ ಸ್ವೀಕರಿಸಬೇಕು. +emailSendErrorMessage= ಇಮೇಲ್ ಕಳುಹಿಸುವಲ್ಲಿ ವಿಫಲವಾಗಿದೆ, ದಯವಿಟ್ಟು ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ. + +accountUpdatedMessage=ನಿಮ್ಮ ಖಾತೆಯನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ. +accountPasswordUpdatedMessage=ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನವೀಕರಿಸಲಾಗಿದೆ. + +delegationCompleteHeader=ಲಾಗಿನ್ ಯಶಸ್ವಿಯಾಗಿದೆ +delegationCompleteMessage=ನೀವು ಈ ಬ್ರೌಸರ್ ವಿಂಡೋವನ್ನು ಮುಚ್ಚಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕನ್ಸೋಲ್ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಹಿಂತಿರುಗಬಹುದು. +delegationFailedHeader=ಲಾಗಿನ್ ವಿಫಲವಾಗಿದೆ +delegationFailedMessage=ನೀವು ಈ ಬ್ರೌಸರ್ ವಿಂಡೋವನ್ನು ಮುಚ್ಚಬಹುದು ಮತ್ತು ನಿಮ್ಮ ಕನ್ಸೋಲ್ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಹಿಂತಿರುಗಿ ಮತ್ತು ಮತ್ತೆ ಲಾಗಿನ್ ಮಾಡಲು ಪ್ರಯತ್ನಿಸಿ. + +noAccessMessage=ಪ್ರವೇಶವಿಲ್ಲ + +invalidPasswordMinLengthMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಕನಿಷ್ಠ ಉದ್ದ {0}. +invalidPasswordMinDigitsMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಕನಿಷ್ಠ {0} ಸಂಖ್ಯಾತ್ಮಕ ಅಂಕೆಗಳನ್ನು ಹೊಂದಿರಬೇಕು. +invalidPasswordMinLowerCaseCharsMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಕನಿಷ್ಠ {0} ಲೋವರ್ ಕೇಸ್ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು. +invalidPasswordMinUpperCaseCharsMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಕನಿಷ್ಠ {0} ದೊಡ್ಡಕ್ಷರ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು. +invalidPasswordMinSpecialCharsMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಕನಿಷ್ಠ {0} ವಿಶೇಷ ಅಕ್ಷರಗಳನ್ನು ಹೊಂದಿರಬೇಕು. +invalidPasswordNotUsernameMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಬಳಕೆದಾರಹೆಸರಿಗೆ ಸಮನಾಗಿರಬಾರದು. +invalidPasswordRegexPatternMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ರಿಜೆಕ್ಸ್ ಮಾದರಿ (ಗಳನ್ನು) ಹೊಂದಿಸಲು ವಿಫಲವಾಗಿದೆ. +invalidPasswordHistoryMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಕೊನೆಯ {0} ಪಾಸ್‌ವರ್ಡ್‌ಗಳಿಗೆ ಸಮನಾಗಿರಬಾರದು. +invalidPasswordGenericMessage=ಅಮಾನ್ಯ ಪಾಸ್‌ವರ್ಡ್: ಹೊಸ ಪಾಸ್‌ವರ್ಡ್ ಪಾಸ್‌ವರ್ಡ್ ನೀತಿಗಳಿಗೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ. + +failedToProcessResponseMessage=ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ಪ್ರಕ್ರಿಯೆಗೊಳಿಸಲು ವಿಫಲವಾಗಿದೆ +httpsRequiredMessage=HTTPS ಅಗತ್ಯವಿದೆ +realmNotEnabledMessage=ಕ್ಷೇತ್ರವನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ +invalidRequestMessage=ಅಮಾನ್ಯ ವಿನಂತಿ +failedLogout=ಲಾಗ್ out ಟ್ ವಿಫಲವಾಗಿದೆ +unknownLoginRequesterMessage=ಅಜ್ಞಾತ ಲಾಗಿನ್ ವಿನಂತಿ +loginRequesterNotEnabledMessage=ಲಾಗಿನ್ ವಿನಂತಿಯನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲಾಗಿಲ್ಲ +bearerOnlyMessage=ಬ್ರೌಸರ್ ಲಾಗಿನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ಬೇರರ್-ಮಾತ್ರ ಅಪ್ಲಿಕೇಶನ್‌ಗಳನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ +standardFlowDisabledMessage= ಕೊಟ್ಟಿರುವ ಪ್ರತಿಕ್ರಿಯೆ_ ಪ್ರಕಾರದೊಂದಿಗೆ ಬ್ರೌಸರ್ ಲಾಗಿನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ಕ್ಲೈಂಟ್‌ಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ. ಕ್ಲೈಂಟ್ಗಾಗಿ ಪ್ರಮಾಣಿತ ಹರಿವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. +implicitFlowDisabledMessage=ಕೊಟ್ಟಿರುವ ಪ್ರತಿಕ್ರಿಯೆ_ ಪ್ರಕಾರದೊಂದಿಗೆ ಬ್ರೌಸರ್ ಲಾಗಿನ್ ಅನ್ನು ಪ್ರಾರಂಭಿಸಲು ಕ್ಲೈಂಟ್‌ಗೆ ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ. ಕ್ಲೈಂಟ್‌ಗೆ ಸೂಚ್ಯ ಹರಿವನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. +invalidRedirectUriMessage=ಅಮಾನ್ಯ ಮರುನಿರ್ದೇಶನ ಯೂರಿ +unsupportedNameIdFormatMessage=ಬೆಂಬಲಿಸದ NameIDFormat +invalidRequesterMessage=ಅಮಾನ್ಯ ವಿನಂತಿ +registrationNotAllowedMessage=ನೋಂದಣಿಯನ್ನು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ +resetCredentialNotAllowedMessage=ರುಜುವಾತು ಮರುಹೊಂದಿಸಲು ಅನುಮತಿಸಲಾಗುವುದಿಲ್ಲ + +permissionNotApprovedMessage=ಅನುಮತಿಯನ್ನು ಅನುಮೋದಿಸಲಾಗಿಲ್ಲ. +noRelayStateInResponseMessage=ಗುರುತಿನ ಪೂರೈಕೆದಾರರಿಂದ ಪ್ರತಿಕ್ರಿಯೆಯಾಗಿ ಯಾವುದೇ ರಿಲೇ ಸ್ಥಿತಿ ಇಲ್ಲ. +insufficientPermissionMessage=ಗುರುತುಗಳನ್ನು ಲಿಂಕ್ ಮಾಡಲು ಸಾಕಷ್ಟು ಅನುಮತಿಗಳು ಇಲ್ಲ. +couldNotProceedWithAuthenticationRequestMessage=ಗುರುತಿನ ಪೂರೈಕೆದಾರರಿಗೆ ದೃ request ೀಕರಣ ವಿನಂತಿಯೊಂದಿಗೆ ಮುಂದುವರಿಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. +couldNotObtainTokenMessage=ಗುರುತಿನ ಪೂರೈಕೆದಾರರಿಂದ ಟೋಕನ್ ಪಡೆಯಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. +unexpectedErrorRetrievingTokenMessage=ಗುರುತಿನ ಪೂರೈಕೆದಾರರಿಂದ ಟೋಕನ್ ಅನ್ನು ಹಿಂಪಡೆಯುವಾಗ ಅನಿರೀಕ್ಷಿತ ದೋಷ.. +unexpectedErrorHandlingResponseMessage=ಗುರುತಿನ ಪೂರೈಕೆದಾರರಿಂದ ಪ್ರತಿಕ್ರಿಯೆಯನ್ನು ನಿರ್ವಹಿಸುವಾಗ ಅನಿರೀಕ್ಷಿತ ದೋಷ. +identityProviderAuthenticationFailedMessage=ದೃ hentic ೀಕರಣ ವಿಫಲವಾಗಿದೆ. ಗುರುತಿನ ಪೂರೈಕೆದಾರರೊಂದಿಗೆ ದೃ ate ೀಕರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. +couldNotSendAuthenticationRequestMessage= ಗುರುತಿನ ಪೂರೈಕೆದಾರರಿಗೆ ದೃ request ೀಕರಣ ವಿನಂತಿಯನ್ನು ಕಳುಹಿಸಲಾಗಲಿಲ್ಲ. +unexpectedErrorHandlingRequestMessage=ಗುರುತಿನ ಪೂರೈಕೆದಾರರಿಗೆ ದೃ hentic ೀಕರಣ ವಿನಂತಿಯನ್ನು ನಿರ್ವಹಿಸುವಾಗ ಅನಿರೀಕ್ಷಿತ ದೋಷ. +invalidAccessCodeMessage=ಅಮಾನ್ಯ ಪ್ರವೇಶ ಕೋಡ್. +sessionNotActiveMessage=ಸೆಷನ್ ಸಕ್ರಿಯವಾಗಿಲ್ಲ. +invalidCodeMessage=ದೋಷ ಸಂಭವಿಸಿದೆ, ದಯವಿಟ್ಟು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್ ಮೂಲಕ ಮತ್ತೆ ಲಾಗಿನ್ ಮಾಡಿ. +identityProviderUnexpectedErrorMessage=ಗುರುತಿನ ಪೂರೈಕೆದಾರರೊಂದಿಗೆ ದೃ ating ೀಕರಿಸುವಾಗ ಅನಿರೀಕ್ಷಿತ ದೋಷ +identityProviderNotFoundMessage=ಗುರುತಿಸುವಿಕೆಯೊಂದಿಗೆ ಗುರುತಿನ ಪೂರೈಕೆದಾರರನ್ನು ಕಂಡುಹಿಡಿಯಲಾಗಲಿಲ್ಲ. +identityProviderLinkSuccess=ನಿಮ್ಮ ಇಮೇಲ್ ಅನ್ನು ನೀವು ಯಶಸ್ವಿಯಾಗಿ ಪರಿಶೀಲಿಸಿದ್ದೀರಿ. ದಯವಿಟ್ಟು ನಿಮ್ಮ ಮೂಲ ಬ್ರೌಸರ್‌ಗೆ ಹಿಂತಿರುಗಿ ಮತ್ತು ಲಾಗಿನ್‌ನೊಂದಿಗೆ ಮುಂದುವರಿಯಿರಿ. +staleCodeMessage=ಈ ಪುಟವು ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿಲ್ಲ, ದಯವಿಟ್ಟು ನಿಮ್ಮ ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಹಿಂತಿರುಗಿ ಮತ್ತು ಮತ್ತೆ ಲಾಗ್ ಇನ್ ಮಾಡಿ +realmSupportsNoCredentialsMessage= ಕ್ಷೇತ್ರವು ಯಾವುದೇ ರುಜುವಾತು ಪ್ರಕಾರವನ್ನು ಬೆಂಬಲಿಸುವುದಿಲ್ಲ. +credentialSetupRequired=ಲಾಗಿನ್ ಮಾಡಲು ಸಾಧ್ಯವಿಲ್ಲ, ರುಜುವಾತು ಸೆಟಪ್ ಅಗತ್ಯವಿದೆ. +identityProviderNotUniqueMessage=ಕ್ಷೇತ್ರವು ಅನೇಕ ಗುರುತಿನ ಪೂರೈಕೆದಾರರನ್ನು ಬೆಂಬಲಿಸುತ್ತದೆ. ದೃ ate ೀಕರಿಸಲು ಯಾವ ಗುರುತಿನ ಪೂರೈಕೆದಾರರನ್ನು ಬಳಸಬೇಕೆಂದು ನಿರ್ಧರಿಸಲು ಸಾಧ್ಯವಾಗಲಿಲ್ಲ. +emailVerifiedMessage=ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ಪರಿಶೀಲಿಸಲಾಗಿದೆ. +staleEmailVerificationLink= ನೀವು ಕ್ಲಿಕ್ ಮಾಡಿದ ಲಿಂಕ್ ಹಳೆಯ ಹಳೆಯ ಲಿಂಕ್ ಆಗಿದೆ ಮತ್ತು ಅದು ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿಲ್ಲ. ಬಹುಶಃ ನೀವು ಈಗಾಗಲೇ ನಿಮ್ಮ ಇಮೇಲ್ ಅನ್ನು ಪರಿಶೀಲಿಸಿದ್ದೀರಿ. +identityProviderAlreadyLinkedMessage={0} by ನಿಂದ ಹಿಂತಿರುಗಿಸಲಾದ ಫೆಡರೇಟೆಡ್ ಗುರುತನ್ನು ಈಗಾಗಲೇ ಇನ್ನೊಬ್ಬ ಬಳಕೆದಾರರಿಗೆ ಲಿಂಕ್ ಮಾಡಲಾಗಿದೆ. +confirmAccountLinking=ಗುರುತಿನ ಪೂರೈಕೆದಾರ {1 of ನ ಖಾತೆಯನ್ನು {0 your ನಿಮ್ಮ ಖಾತೆಯೊಂದಿಗೆ ಲಿಂಕ್ ಮಾಡುವುದನ್ನು ಖಚಿತಪಡಿಸಿ. +confirmEmailAddressVerification=ಇ-ಮೇಲ್ ವಿಳಾಸದ ಸಿಂಧುತ್ವವನ್ನು ದೃ irm ೀಕರಿಸಿ {0}. +confirmExecutionOfActions=ಈ ಕೆಳಗಿನ ಕ್ರಿಯೆಯನ್ನು (ಗಳನ್ನು) ಮಾಡಿ + +locale_ca=Catal\u00E0 +locale_de=Deutsch +locale_eng=English +locale_es=Espa\u00F1ol +locale_fra=Fran\u00E7ais +locale_it=Italiano +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_pl=Polish +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_lt=Lietuvi\u0173 +locale_zh-CN=\u4E2D\u6587\u7B80\u4F53 +locale_sk=Sloven\u010Dina +locale_sv=Svenska +locale_ara=Arabic +locale_tam=தமிழ் +locale_kan=ಕನ್ನಡ +locale_hin=हिंदी + +backToApplication=& laquo; ಅಪ್ಲಿಕೇಶನ್‌ಗೆ ಹಿಂತಿರುಗಿ +missingParameterMessage=ಕಾಣೆಯಾದ ನಿಯತಾಂಕಗಳು \: {0} +clientNotFoundMessage=ಗ್ರಾಹಕ ಕಂಡುಬಂದಿಲ್ಲ. +clientDisabledMessage=ಗ್ರಾಹಕನನ್ನು ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. +invalidParameterMessage=ಅಮಾನ್ಯ ನಿಯತಾಂಕ \: {0} +alreadyLoggedIn= ನೀವು ಈಗಾಗಲೇ ಲಾಗ್ ಇನ್ ಆಗಿದ್ದೀರಿ. +differentUserAuthenticated=ಈ ಅಧಿವೇಶನದಲ್ಲಿ ನೀವು ಈಗಾಗಲೇ ವಿಭಿನ್ನ ಬಳಕೆದಾರ '' {0} '' ಎಂದು ದೃ ated ೀಕರಿಸಲ್ಪಟ್ಟಿದ್ದೀರಿ. ದಯವಿಟ್ಟು ಮೊದಲು ಲಾಗ್ out ಟ್ ಮಾಡಿ. +brokerLinkingSessionExpired=ವಿನಂತಿಸಿದ ಬ್ರೋಕರ್ ಖಾತೆ ಲಿಂಕ್, ಆದರೆ ಪ್ರಸ್ತುತ ಸೆಷನ್ ಇನ್ನು ಮುಂದೆ ಮಾನ್ಯವಾಗಿಲ್ಲ. +proceedWithAction=& raquo; ಮುಂದುವರಿಯಲು ಇಲ್ಲಿ ಕ್ಲಿಕ್ ಮಾಡಿ + +requiredAction.CONFIGURE_TOTP= OTP ಅನ್ನು ಕಾನ್ಫಿಗರ್ ಮಾಡಿ +requiredAction.terms_and_conditions=ನಿಯಮಗಳು ಮತ್ತು ಷರತ್ತುಗಳು +requiredAction.UPDATE_PASSWORD=ಪಾಸ್‌ವರ್ಡ್ ನವೀಕರಿಸಿ +requiredAction.UPDATE_PROFILE=ಪ್ರೊಫೈಲ್ ನವೀಕರಿಸಿ +requiredAction.VERIFY_EMAIL=ಇಮೇಲ್ ಪರಿಶೀಲಿಸಿ + +doX509Login=ನಿಮ್ಮನ್ನು as ಆಗಿ ಲಾಗ್ ಇನ್ ಮಾಡಲಾಗುತ್ತದೆ: +clientCertificate=X509 ಕ್ಲೈಂಟ್ ಪ್ರಮಾಣಪತ್ರ \: +noCertificate=[ಪ್ರಮಾಣಪತ್ರವಿಲ್ಲ] + + +pageNotFound=ಪುಟ ಬಳಕೆದಾರಹೆಸರು +internalServerError=ಆಂತರಿಕ ಸರ್ವರ್ ದೋಷ ಸಂಭವಿಸಿದೆ + +console-username=ಬಳಕೆದಾರಹೆಸರು: +console-password=ಪಾಸ್‌ವರ್ಡ್: +console-otp= ಒನ್ ಟೈಮ್ ಪಾಸ್‌ವರ್ಡ್: +console-new-password=ಹೊಸ ಪಾಸ್‌ವರ್ಡ್: +console-confirm-password=ಪಾಸ್ವರ್ಡ್ ದೃ irm ೀಕರಿಸಿ: +console-update-password=ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್‌ನ ನವೀಕರಣದ ಅಗತ್ಯವಿದೆ. +console-verify-email=ನಿಮ್ಮ ಇಮೇಲ್ ವಿಳಾಸವನ್ನು ನೀವು ಪರಿಶೀಲಿಸಬೇಕಾಗಿದೆ. ಪರಿಶೀಲನಾ ಕೋಡ್ ಹೊಂದಿರುವ {0 to ಗೆ ನಾವು ಇಮೇಲ್ ಕಳುಹಿಸಿದ್ದೇವೆ. ದಯವಿಟ್ಟು ಈ ಕೋಡ್ ಅನ್ನು ಕೆಳಗಿನ ಇನ್ಪುಟ್ಗೆ ನಮೂದಿಸಿ. +console-email-code=ಇಮೇಲ್ ಕೋಡ್: +console-accept-terms=ನಿಯಮಗಳನ್ನು ಸ್ವೀಕರಿಸುತ್ತೀರಾ? [y / n]: +console-accept=y + +# Openshift messages +openshift.scope.user_info=ಬಳಕೆದಾರ ಮಾಹಿತಿ +openshift.scope.user_check-access=ಬಳಕೆದಾರ ಪ್ರವೇಶ ಮಾಹಿತಿ +openshift.scope.user_full=ಪೂರ್ಣ ಪ್ರವೇಶ +openshift.scope.list-projects=ಯೋಜನೆಗಳನ್ನು ಪಟ್ಟಿ ಮಾಡಿ + +# SAML authentication +saml.post-form.title=ದೃ hentic ೀಕರಣ ಮರುನಿರ್ದೇಶನ +saml.post-form.message=ಮರುನಿರ್ದೇಶಿಸಲಾಗುತ್ತಿದೆ, ದಯವಿಟ್ಟು ಕಾಯಿರಿ. +saml.post-form.js-disabled=ಜಾವಾಸ್ಕ್ರಿಪ್ಟ್ ನಿಷ್ಕ್ರಿಯಗೊಳಿಸಲಾಗಿದೆ. ಅದನ್ನು ಸಕ್ರಿಯಗೊಳಿಸಲು ನಾವು ಬಲವಾಗಿ ಶಿಫಾರಸು ಮಾಡುತ್ತೇವೆ. ಮುಂದುವರಿಸಲು ಕೆಳಗಿನ ಬಟನ್ ಕ್ಲಿಕ್ ಮಾಡಿ. + +#authenticators +otp-display-name=ದೃ hentic ೀಕರಣ ಅಪ್ಲಿಕೇಶನ್ +otp-help-text=ದೃ hentic ೀಕರಣ ಅಪ್ಲಿಕೇಶನ್‌ನಿಂದ ಪರಿಶೀಲನೆ ಕೋಡ್ ನಮೂದಿಸಿ. +password-display-name=ಪಾಸ್ವರ್ಡ್ +password-help-text=ನಿಮ್ಮ ಪಾಸ್‌ವರ್ಡ್ ನಮೂದಿಸುವ ಮೂಲಕ ಲಾಗ್ ಇನ್ ಮಾಡಿ. +auth-username-form-display-name=ಬಳಕೆದಾರಹೆಸರು +auth-username-form-help-text=ನಿಮ್ಮ ಬಳಕೆದಾರ ಹೆಸರನ್ನು ನಮೂದಿಸುವ ಮೂಲಕ ಲಾಗ್ ಇನ್ ಮಾಡಲು ಪ್ರಾರಂಭಿಸಿ +auth-username-password-form-display-name=ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು ಪಾಸ್‌ವರ್ಡ್ +auth-username-password-form-help-text=ನಿಮ್ಮ ಬಳಕೆದಾರಹೆಸರು ಮತ್ತು ಪಾಸ್‌ವರ್ಡ್ ಅನ್ನು ನಮೂದಿಸುವ ಮೂಲಕ ಲಾಗ್ ಇನ್ ಮಾಡಿ. + +# WebAuthn +webauthn-display-name=ಭದ್ರತಾ ಕೀ +webauthn-help-text=ಲಾಗ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಬಳಸಿ. +webauthn-passwordless-display-name=ಭದ್ರತಾ ಕೀ +webauthn-passwordless-help-text=ಪಾಸ್‌ವರ್ಡ್ ರಹಿತ ಲಾಗ್ ಇನ್ ಮಾಡಲು ನಿಮ್ಮ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ಬಳಸಿ. +webauthn-login-title=ಭದ್ರತಾ ಕೀ ಲಾಗಿನ್ +webauthn-registration-title=ಭದ್ರತಾ ಕೀ ನೋಂದಣಿ +webauthn-available-authenticators= ಲಭ್ಯವಿರುವ ದೃ hentic ೀಕರಣಕಾರರು + +# WebAuthn Error +webauthn-error-title=ಭದ್ರತಾ ಕೀ ದೋಷ +webauthn-error-registration= ನಿಮ್ಮ ಭದ್ರತಾ ಕೀಲಿಯನ್ನು ನೋಂದಾಯಿಸಲು ವಿಫಲವಾಗಿದೆ. +webauthn-error-api-get=ಭದ್ರತಾ ಕೀಲಿಯಿಂದ ದೃ ate ೀಕರಿಸಲು ವಿಫಲವಾಗಿದೆ. +webauthn-error-different-user=ಮೊದಲ ದೃ hentic ೀಕೃತ ಬಳಕೆದಾರನು ಭದ್ರತಾ ಕೀಲಿಯಿಂದ ದೃ ated ೀಕರಿಸಲ್ಪಟ್ಟವನಲ್ಲ. +webauthn-error-auth-verification=ಭದ್ರತಾ ಕೀ ದೃ hentic ೀಕರಣ ಫಲಿತಾಂಶವು ಅಮಾನ್ಯವಾಗಿದೆ. +webauthn-error-register-verification=ಭದ್ರತಾ ಕೀ ನೋಂದಣಿ ಫಲಿತಾಂಶ ಅಮಾನ್ಯವಾಗಿದೆ. +webauthn-error-user-not-found=ಅಜ್ಞಾತ ಬಳಕೆದಾರರನ್ನು ಭದ್ರತಾ ಕೀಲಿಯಿಂದ ದೃ ated ೀಕರಿಸಲಾಗಿದೆ. + +identity-provider-redirector=ಮತ್ತೊಂದು ಗುರುತಿನ ಪೂರೈಕೆದಾರರೊಂದಿಗೆ ಸಂಪರ್ಕ ಸಾಧಿಸಿ \ No newline at end of file diff --git a/keycloak-jboss/theme/base/login/messages/messages_tam.properties b/keycloak-jboss/theme/base/login/messages/messages_tam.properties new file mode 100644 index 00000000..526688b0 --- /dev/null +++ b/keycloak-jboss/theme/base/login/messages/messages_tam.properties @@ -0,0 +1,375 @@ +# encoding: utf-8 +doLogIn=உள்நுழைக +doRegister=பதிவு +doCancel=ரத்துசெய் +doSubmit=சமர்ப்பி +doBack=பின் +doYes=ஆம் +doNo=இல்லை +doContinue=தொடரவும் +doIgnore=புறக்கணிக்கவும் +doAccept=ஏற்றுக்கொள் +doDecline=சரிவு +doForgotPassword=கடவுச்சொல் மறந்துவிட்டதா? +doClickHere=இங்கே கிளிக் செய்க +doImpersonate=ஆள்மாறாட்டம் +doTryAgain=மீண்டும் முயற்சிக்கவும் +doTryAnotherWay=வேறு வழியில் முயற்சிக்கவும் +kerberosNotConfigured=கெர்பரோஸ் கட்டமைக்கப்படவில்லை +kerberosNotConfiguredTitle=கெர்பரோஸ் கட்டமைக்கப்படவில்லை +bypassKerberosDetail=ஒன்று நீங்கள் கெர்பரோஸால் உள்நுழைந்திருக்கவில்லை அல்லது உங்கள் உலாவி கெர்பரோஸ் உள்நுழைவுக்கு அமைக்கப்படவில்லை. பிற வழிகளில் உள்நுழைவதைத் தொடரவும் என்பதைக் கிளிக் செய்க +kerberosNotSetUp=கெர்பரோஸ் அமைக்கப்படவில்லை. நீங்கள் உள்நுழைய முடியாது.. +registerTitle=பதிவு +loginTitle={0} to இல் உள்நுழைக +loginTitleHtml={0} +impersonateTitle={0} ஆள்மாறாட்டம் பயனர் +impersonateTitleHtml= {0} ஆள்மாறாட்டம் பயனர் +realmChoice=சாம்ராஜ்யம் +unknownUser=தெரியாத பயனர் +loginTotpTitle=மொபைல் அங்கீகார அமைப்பு +loginProfileTitle=கணக்குத் தகவலைப் புதுப்பிக்கவும் +loginTimeout=உங்கள் உள்நுழைவு முயற்சி முடிந்தது. உள்நுழைவு தொடக்கத்திலிருந்தே தொடங்கும். +oauthGrantTitle={0} to க்கு அணுகலை வழங்குக +oauthGrantTitleHtml={0} +errorTitle=மன்னிக்கவும் ... +errorTitleHtml=நாங்கள் மன்னிக்கவும் ... +emailVerifyTitle=மின்னஞ்சல் சரிபார்ப்பு +emailForgotTitle=உங்கள் கடவுச்சொல்லை மறந்துவிட்டீர்களா? +updatePasswordTitle=கடவுச்சொல்லைப் புதுப்பிக்கவும் +codeSuccessTitle=வெற்றிக் குறியீடு +codeErrorTitle=பிழை குறியீடு \: {0} +displayUnsupported=கோரப்பட்ட காட்சி வகை ஆதரிக்கப்படவில்லை +browserRequired=உள்நுழைய உலாவி தேவை +browserContinue=உள்நுழைவை முடிக்க உலாவி தேவை +browserContinuePrompt=உலாவியைத் திறந்து உள்நுழைவைத் தொடரவா? [y / n]: +browserContinueAnswer=y + + +termsTitle=விதிமுறைகள் மற்றும் நிபந்தனைகள் +termsText=

வரையறுக்க வேண்டிய விதிமுறைகள் மற்றும் நிபந்தனைகள் +termsPlainText=வரையறுக்க வேண்டிய விதிமுறைகள் மற்றும் நிபந்தனைகள். + +recaptchaFailed=தவறான Recaptcha +recaptchaNotConfigured=Recaptcha தேவை, ஆனால் உள்ளமைக்கப்படவில்லை +consentDenied=ஒப்புதல் மறுக்கப்பட்டது. + +noAccount=புதிய பயனரா? +username=பயனர்பெயர் +usernameOrEmail=பயனர்பெயர் அல்லது மின்னஞ்சல் +firstName=முதல் பெயர் +givenName=கொடுக்கப்பட்ட பெயர் +fullName=முழு பெயர் +lastName=கடைசி பெயர் +familyName=குடும்ப பெயர் +email=மின்னஞ்சல் +password=கடவுச்சொல் +passwordConfirm=கடவுச்சொல்லை உறுதிப்படுத்தவும் +passwordNew=புதிய கடவுச்சொல் +passwordNewConfirm=புதிய கடவுச்சொல் உறுதிப்படுத்தல் +rememberMe=என்னை நினைவில் வையுங்கள் +authenticatorCode=ஒரு முறை குறியீடு +address=முகவரி +street=தெரு +locality=நகரம் அல்லது இடம் +region=மாநிலம், மாகாணம் அல்லது பிராந்தியம் +postal_code=ஜிப் அல்லது அஞ்சல் குறியீடு +country=நாடு +emailVerified=மின்னஞ்சல் சரிபார்க்கப்பட்டது +gssDelegationCredential=ஜிஎஸ்எஸ் பிரதிநிதிகள் நற்சான்றிதழ் + +profileScopeConsentText=பயனர் சுயவிவரம் +emailScopeConsentText=மின்னஞ்சல் முகவரி +addressScopeConsentText=முகவரி +phoneScopeConsentText=தொலைபேசி எண் +offlineAccessScopeConsentText=ஆஃப்லைன் அணுகல் +samlRoleListScopeConsentText=எனது பாத்திரங்கள் +rolesScopeConsentText=பயனர் பாத்திரங்கள் + +restartLoginTooltip=உள்நுழைவை மறுதொடக்கம் செய்யுங்கள் + +loginTotpIntro=இந்த கணக்கை அணுக நீங்கள் ஒரு முறை கடவுச்சொல் ஜெனரேட்டரை அமைக்க வேண்டும் +loginTotpStep1=உங்கள் மொபைலில் பின்வரும் பயன்பாடுகளில் ஒன்றை நிறுவவும்: +loginTotpStep2=பயன்பாட்டைத் திறந்து பார்கோடு ஸ்கேன் செய்யுங்கள்: +loginTotpStep3=பயன்பாடு வழங்கிய ஒரு முறை குறியீட்டை உள்ளிட்டு, அமைப்பை முடிக்க சமர்ப்பி என்பதைக் கிளிக் செய்க. +loginTotpStep3DeviceName=உங்கள் OTP சாதனங்களை நிர்வகிக்க உதவும் சாதன பெயரை வழங்கவும். +loginTotpManualStep2=பயன்பாட்டைத் திறந்து விசையை உள்ளிடவும்: +loginTotpManualStep3=பயன்பாடு அவற்றை அமைக்க அனுமதித்தால் பின்வரும் உள்ளமைவு மதிப்புகளைப் பயன்படுத்தவும்: +loginTotpUnableToScan=ஸ்கேன் செய்ய முடியவில்லையா? +loginTotpScanBarcode=பார்கோடு ஸ்கேன் செய்யவா? +loginCredential=நற்சான்றிதழ் +loginOtpOneTime=ஒரு முறை குறியீடு +loginTotpType=வகை +loginTotpAlgorithm=அல்காரிதம் +loginTotpDigits=இலக்கங்கள் +loginTotpInterval=இடைவெளி +loginTotpCounter=எதிர் +loginTotpDeviceName=சாதனத்தின் பெயர் + +loginTotp.totp=நேரத்தை அடிப்படையாகக் கொண்டது +loginTotp.hotp=எதிர் அடிப்படையிலான + +loginChooseAuthenticator=உள்நுழைவு முறையைத் தேர்ந்தெடுக்கவும் + +oauthGrantRequest=இந்த அணுகல் சலுகைகளை வழங்குகிறீர்களா? +inResource=இல் + +emailVerifyInstruction1=உங்கள் மின்னஞ்சல் முகவரியை சரிபார்க்க வழிமுறைகளுடன் ஒரு மின்னஞ்சல் உங்களுக்கு அனுப்பப்பட்டுள்ளது. +emailVerifyInstruction2=உங்கள் மின்னஞ்சலில் சரிபார்ப்புக் குறியீட்டைப் பெறவில்லையா? +emailVerifyInstruction3=மின்னஞ்சலை மீண்டும் அனுப்ப. + +emailLinkIdpTitle=இணைப்பு {0} +emailLinkIdp1=உங்கள் {2} கணக்குடன் {0} கணக்கு {1 link ஐ இணைப்பதற்கான வழிமுறைகளைக் கொண்ட மின்னஞ்சல் உங்களுக்கு அனுப்பப்பட்டுள்ளது. +emailLinkIdp2=உங்கள் மின்னஞ்சலில் சரிபார்ப்புக் குறியீட்டைப் பெறவில்லையா? +emailLinkIdp3=மின்னஞ்சலை மீண்டும் அனுப்ப. +emailLinkIdp4=நீங்கள் ஏற்கனவே வெவ்வேறு உலாவியில் மின்னஞ்சலை சரிபார்த்திருந்தால் +emailLinkIdp5=தொடர. + +backToLogin=& laquo; உள்நுழைவுக்குத் திரும்பு + +emailInstruction=உங்கள் பயனர்பெயர் அல்லது மின்னஞ்சல் முகவரியை உள்ளிடுக, புதிய கடவுச்சொல்லை எவ்வாறு உருவாக்குவது என்பது குறித்த வழிமுறைகளை நாங்கள் உங்களுக்கு அனுப்புவோம். + +copyCodeInstruction=தயவுசெய்து இந்த குறியீட்டை நகலெடுத்து உங்கள் பயன்பாட்டில் ஒட்டவும்: + +pageExpiredTitle=பக்கம் காலாவதியானது +pageExpiredMsg1=உள்நுழைவு செயல்முறையை மறுதொடக்கம் செய்ய +pageExpiredMsg2=உள்நுழைவு செயல்முறையைத் தொடர + +personalInfo=தனிப்பட்ட தகவல்: +role_admin=நிர்வாகம் +role_realm-admin=சாம்ராஜ்ய நிர்வாகம் +role_create-realm=சாம்ராஜ்யத்தை உருவாக்கு +role_create-client=கிளையண்டை உருவாக்கவும் +role_view-realm=சாம்ராஜ்யத்தைக் காண்க +role_view-users=பயனர்களைக் காண்க +role_view-applications=பயன்பாடுகளைக் காண்க +role_view-clients=வாடிக்கையாளர்களைக் காண்க +role_view-events=நிகழ்வுகளைக் காண்க +role_view-identity-providers=அடையாள வழங்குநர்களைக் காண்க +role_manage-realm=சாம்ராஜ்யத்தை நிர்வகிக்கவும் +role_manage-users=பயனர்களை நிர்வகிக்கவும் +role_manage-applications=பயன்பாடுகளை நிர்வகிக்கவும் +role_manage-identity-providers=அடையாள வழங்குநர்களை நிர்வகிக்கவும் +role_manage-clients=வாடிக்கையாளர்களை நிர்வகிக்கவும் +role_manage-events=நிகழ்வுகளை நிர்வகிக்கவும் +role_view-profile=சுயவிவரத்தைக் காண்க +role_manage-account=கணக்கை நிர்வகிக்கவும் +role_manage-account-links=கணக்கை நிர்வகிக்கவும் +role_read-token=டோக்கனைப் படியுங்கள் +role_offline-access=ஆஃப்லைன் அணுகல் +client_account=கணக்கு +client_account-console=கணக்கு பணியகம் +client_security-admin-console=பாதுகாப்பு நிர்வாக கன்சோல் +client_admin-cli=நிர்வாகம் CLI +client_realm-management=சாம்ராஜ்ய மேலாண்மை +client_broker=தரகர் + +requiredFields=தேவையான புலங்கள் + +invalidUserMessage=தவறான பயனர்பெயர் அல்லது கடவுச்சொல். +invalidUsernameMessage=தவறான பயனர்பெயர். +invalidUsernameOrEmailMessage=தவறான பயனர்பெயர் அல்லது மின்னஞ்சல். +invalidPasswordMessage=தவறான கடவுச்சொல். +invalidEmailMessage=தவறான மின்னஞ்சல் முகவரி. +accountDisabledMessage=கணக்கு முடக்கப்பட்டுள்ளது, உங்கள் நிர்வாகியைத் தொடர்பு கொள்ளுங்கள். +accountTemporarilyDisabledMessage=கணக்கு தற்காலிகமாக முடக்கப்பட்டுள்ளது; உங்கள் நிர்வாகியைத் தொடர்பு கொள்ளவும் அல்லது பின்னர் மீண்டும் முயற்சிக்கவும். +expiredCodeMessage=உள்நுழைவு நேரம் முடிந்தது. மீண்டும் உள்நுழைக. +expiredActionMessage=செயல் காலாவதியானது. இப்போது உள்நுழைவுடன் தொடரவும். +expiredActionTokenNoSessionMessage=செயல் காலாவதியானது. +expiredActionTokenSessionExistsMessage=செயல் காலாவதியானது. மீண்டும் தொடங்கவும். + +missingFirstNameMessage=தயவுசெய்து முதல் பெயரைக் குறிப்பிடவும். +missingLastNameMessage=தயவுசெய்து கடைசி பெயரைக் குறிப்பிடவும். +missingEmailMessage=தயவுசெய்து மின்னஞ்சலைக் குறிப்பிடவும். +missingUsernameMessage=தயவுசெய்து பயனர்பெயரைக் குறிப்பிடவும். +missingPasswordMessage=தயவுசெய்து கடவுச்சொல்லைக் குறிப்பிடவும். +missingTotpMessage=அங்கீகாரக் குறியீட்டைக் குறிப்பிடவும். +missingTotpDeviceNameMessage=சாதனத்தின் பெயரைக் குறிப்பிடவும். +notMatchPasswordMessage=கடவுச்சொற்கள் பொருந்தவில்லை. + +invalidPasswordExistingMessage=ஏற்கனவே உள்ள கடவுச்சொல் தவறானது. +invalidPasswordBlacklistedMessage=தவறான கடவுச்சொல்: கடவுச்சொல் தடுப்புப்பட்டியலில் உள்ளது. +invalidPasswordConfirmMessage=கடவுச்சொல் உறுதிப்படுத்தல் பொருந்தவில்லை. +invalidTotpMessage=தவறான அங்கீகார குறியீடு. + +usernameExistsMessage=பயனர்பெயர் ஏற்கனவே உள்ளது. +emailExistsMessage=மின்னஞ்சல் ஏற்கனவே உள்ளது. + +federatedIdentityExistsMessage= {0} {1} with உடன் பயனர் ஏற்கனவே உள்ளது. கணக்கை இணைக்க கணக்கு நிர்வாகத்தில் உள்நுழைக. + +confirmLinkIdpTitle=கணக்கு ஏற்கனவே உள்ளது +federatedIdentityConfirmLinkMessage={0} {1} with உடன் பயனர் ஏற்கனவே உள்ளது. நீங்கள் எவ்வாறு தொடர விரும்புகிறீர்கள்? +federatedIdentityConfirmReauthenticateMessage=உங்கள் கணக்கை உடன் இணைக்க அங்கீகரிக்கவும்{0} +nestedFirstBrokerFlowMessage=known {0} பயனர் {1} known எந்தவொரு அறியப்பட்ட பயனருடனும் இணைக்கப்படவில்லை. +confirmLinkIdpReviewProfile=மதிப்பாய்வு சுயவிவரம் +confirmLinkIdpContinue=இருக்கும் கணக்கில் சேர்க்கவும் + +configureTotpMessage=உங்கள் கணக்கைச் செயல்படுத்த மொபைல் அங்கீகாரத்தை அமைக்க வேண்டும். +updateProfileMessage=உங்கள் கணக்கைச் செயல்படுத்த உங்கள் பயனர் சுயவிவரத்தைப் புதுப்பிக்க வேண்டும். +updatePasswordMessage=உங்கள் கணக்கை செயல்படுத்த உங்கள் கடவுச்சொல்லை மாற்ற வேண்டும். +resetPasswordMessage=உங்கள் கடவுச்சொல்லை மாற்ற வேண்டும். +verifyEmailMessage=உங்கள் கணக்கைச் செயல்படுத்த உங்கள் மின்னஞ்சல் முகவரியை சரிபார்க்க வேண்டும். +linkIdpMessage=உங்கள் கணக்கை {0 with உடன் இணைக்க உங்கள் மின்னஞ்சல் முகவரியை சரிபார்க்க வேண்டும். + +emailSentMessage=மேலதிக வழிமுறைகளுடன் விரைவில் ஒரு மின்னஞ்சலைப் பெற வேண்டும். +emailSendErrorMessage=மின்னஞ்சல் அனுப்புவதில் தோல்வி, தயவுசெய்து பின்னர் மீண்டும் முயற்சிக்கவும். + +accountUpdatedMessage=உங்கள் கணக்கு புதுப்பிக்கப்பட்டது. +accountPasswordUpdatedMessage=உங்கள் கடவுச்சொல் புதுப்பிக்கப்பட்டது. + +delegationCompleteHeader=உள்நுழைவு வெற்றிகரமாக +delegationCompleteMessage=நீங்கள் இந்த உலாவி சாளரத்தை மூடிவிட்டு உங்கள் கன்சோல் பயன்பாட்டிற்குச் செல்லலாம். +delegationFailedHeader=உள்நுழைவு தோல்வியுற்றது +delegationFailedMessage=நீங்கள் இந்த உலாவி சாளரத்தை மூடிவிட்டு உங்கள் கன்சோல் பயன்பாட்டிற்குச் சென்று மீண்டும் உள்நுழைய முயற்சி செய்யலாம். + +noAccessMessage=அணுகல் இல்லை + +invalidPasswordMinLengthMessage=தவறான கடவுச்சொல்: குறைந்தபட்ச நீளம் {0}. +invalidPasswordMinDigitsMessage=தவறான கடவுச்சொல்: குறைந்தது {0} எண் இலக்கங்களைக் கொண்டிருக்க வேண்டும். +invalidPasswordMinLowerCaseCharsMessage=தவறான கடவுச்சொல்: குறைந்தது {0} சிறிய எழுத்துக்குறிகளைக் கொண்டிருக்க வேண்டும். +invalidPasswordMinUpperCaseCharsMessage=தவறான கடவுச்சொல்: குறைந்தது {0} மேல் வழக்கு எழுத்துக்களைக் கொண்டிருக்க வேண்டும். +invalidPasswordMinSpecialCharsMessage=தவறான கடவுச்சொல்: குறைந்தது {0} சிறப்பு எழுத்துக்களைக் கொண்டிருக்க வேண்டும். +invalidPasswordNotUsernameMessage=தவறான கடவுச்சொல்: பயனர்பெயருக்கு சமமாக இருக்கக்கூடாது. +invalidPasswordRegexPatternMessage=தவறான கடவுச்சொல்: ரீஜெக்ஸ் முறை (களை) பொருத்தத் தவறிவிட்டது. +invalidPasswordHistoryMessage=தவறான கடவுச்சொல்: கடைசி {0} கடவுச்சொற்களுக்கு சமமாக இருக்கக்கூடாது. +invalidPasswordGenericMessage=தவறான கடவுச்சொல்: புதிய கடவுச்சொல் கடவுச்சொல் கொள்கைகளுடன் பொருந்தவில்லை. + +failedToProcessResponseMessage=பதிலைச் செயலாக்குவதில் தோல்வி +httpsRequiredMessage=HTTPS தேவை +realmNotEnabledMessage=சாம்ராஜ்யம் இயக்கப்படவில்லை +invalidRequestMessage=தவறான கோரிக்கை +failedLogout=வெளியேறுதல் தோல்வியுற்றது +unknownLoginRequesterMessage=அறியப்படாத உள்நுழைவு கோரிக்கை +loginRequesterNotEnabledMessage=உள்நுழைவு கோரிக்கை இயக்கப்படவில்லை +bearerOnlyMessage=உலாவி உள்நுழைவைத் தொடங்க தாங்கி மட்டும் பயன்பாடுகள் அனுமதிக்கப்படவில்லை +standardFlowDisabledMessage=கொடுக்கப்பட்ட மறுமொழி_வகை மூலம் உலாவி உள்நுழைவைத் தொடங்க கிளையன்ட் அனுமதிக்கப்படுவதில்லை. வாடிக்கையாளருக்கு நிலையான ஓட்டம் முடக்கப்பட்டுள்ளது. +implicitFlowDisabledMessage=கொடுக்கப்பட்ட மறுமொழி_வகை மூலம் உலாவி உள்நுழைவைத் தொடங்க கிளையன்ட் அனுமதிக்கப்படுவதில்லை. கிளையண்ட்டுக்கு மறைமுக ஓட்டம் முடக்கப்பட்டுள்ளது. +invalidRedirectUriMessage=தவறான வழிமாற்று யூரி +unsupportedNameIdFormatMessage=ஆதரிக்கப்படாத NameIDFormat +invalidRequesterMessage=தவறான கோரிக்கை +registrationNotAllowedMessage=பதிவு செய்ய அனுமதிக்கப்படவில்லை +resetCredentialNotAllowedMessage=நற்சான்றிதழை மீட்டமைக்க அனுமதிக்கப்படவில்லை + +permissionNotApprovedMessage=அனுமதி அங்கீகரிக்கப்படவில்லை. +noRelayStateInResponseMessage=அடையாள வழங்குநரின் பதிலில் ரிலே நிலை இல்லை. +insufficientPermissionMessage=அடையாளங்களை இணைக்க போதுமான அனுமதி இல்லை. +couldNotProceedWithAuthenticationRequestMessage=அடையாள வழங்குநரிடம் அங்கீகார கோரிக்கையுடன் தொடர முடியவில்லை. +couldNotObtainTokenMessage=அடையாள வழங்குநரிடமிருந்து டோக்கனைப் பெற முடியவில்லை. +unexpectedErrorRetrievingTokenMessage=அடையாள வழங்குநரிடமிருந்து டோக்கனை மீட்டெடுக்கும்போது எதிர்பாராத பிழை. +unexpectedErrorHandlingResponseMessage=அடையாள வழங்குநரிடமிருந்து பதிலைக் கையாளும் போது எதிர்பாராத பிழை. +identityProviderAuthenticationFailedMessage=அங்கீகாரம் தோல்வியுற்றது. அடையாள வழங்குநருடன் அங்கீகரிக்க முடியவில்லை. +couldNotSendAuthenticationRequestMessage= அடையாள வழங்குநருக்கு அங்கீகார கோரிக்கையை அனுப்ப முடியவில்லை. +unexpectedErrorHandlingRequestMessage=அடையாள வழங்குநரிடம் அங்கீகார கோரிக்கையை கையாளும் போது எதிர்பாராத பிழை. +invalidAccessCodeMessage=தவறான அணுகல் குறியீடு. +sessionNotActiveMessage=அமர்வு செயலில் இல்லை. +invalidCodeMessage=பிழை ஏற்பட்டது, தயவுசெய்து உங்கள் விண்ணப்பத்தின் மூலம் மீண்டும் உள்நுழைக. +identityProviderUnexpectedErrorMessage=அடையாள வழங்குநருடன் அங்கீகரிக்கும் போது எதிர்பாராத பிழை +identityProviderNotFoundMessage=அடையாளங்காட்டியுடன் அடையாள வழங்குநரைக் கண்டுபிடிக்க முடியவில்லை. +identityProviderLinkSuccess=உங்கள் மின்னஞ்சலை வெற்றிகரமாக சரிபார்க்கிறீர்கள். தயவுசெய்து உங்கள் அசல் உலாவிக்குச் சென்று உள்நுழைவுடன் தொடரவும். +staleCodeMessage=இந்த பக்கம் இனி செல்லுபடியாகாது, தயவுசெய்து உங்கள் பயன்பாட்டிற்குச் சென்று மீண்டும் உள்நுழைக +realmSupportsNoCredentialsMessage=எந்த நற்சான்றிதழ் வகையையும் சாம்ராஜ்யம் ஆதரிக்கவில்லை. +credentialSetupRequired=உள்நுழைய முடியாது, நற்சான்றிதழ் அமைப்பு தேவை. +identityProviderNotUniqueMessage=பல அடையாள வழங்குநர்களை மெய்ப்பாடு ஆதரிக்கிறது. எந்த அடையாள வழங்குநரை அங்கீகரிக்க பயன்படுத்த வேண்டும் என்பதை தீர்மானிக்க முடியவில்லை. +emailVerifiedMessage=உங்கள் மின்னஞ்சல் முகவரி சரிபார்க்கப்பட்டது. +staleEmailVerificationLink=நீங்கள் கிளிக் செய்த இணைப்பு பழைய பழமையான இணைப்பு மற்றும் இனி செல்லுபடியாகாது. உங்கள் மின்னஞ்சலை நீங்கள் ஏற்கனவே சரிபார்த்திருக்கலாம். +identityProviderAlreadyLinkedMessage={0} by வழங்கிய கூட்டாட்சி அடையாளம் ஏற்கனவே மற்றொரு பயனருடன் இணைக்கப்பட்டுள்ளது. +confirmAccountLinking=அடையாள வழங்குநரின் {1} account கணக்கை your 1 your உங்கள் கணக்கோடு இணைப்பதை உறுதிப்படுத்தவும். +confirmEmailAddressVerification=மின்னஞ்சல் முகவரியின் செல்லுபடியை உறுதிப்படுத்தவும் {0}. +confirmExecutionOfActions=பின்வரும் செயலை (களை) செய்யவும் + +locale_ca=Catal\u00E0 +locale_de=Deutsch +locale_eng=English +locale_es=Espa\u00F1ol +locale_fra=Fran\u00E7ais +locale_it=Italiano +locale_ja=\u65E5\u672C\u8A9E +locale_nl=Nederlands +locale_no=Norsk +locale_pl=Polish +locale_pt_BR=Portugu\u00EAs (Brasil) +locale_pt-BR=Portugu\u00EAs (Brasil) +locale_ru=\u0420\u0443\u0441\u0441\u043A\u0438\u0439 +locale_lt=Lietuvi\u0173 +locale_zh-CN=\u4E2D\u6587\u7B80\u4F53 +locale_sk=Sloven\u010Dina +locale_sv=Svenska +locale_ara=Arabic +locale_tam=தமிழ் +locale_kan=ಕನ್ನಡ +locale_hin=हिंदी + +backToApplication=& laquo; பயன்பாட்டிற்குத் திரும்பு +missingParameterMessage=காணாமல் போன அளவுருக்கள் \: {0} +clientNotFoundMessage=வாடிக்கையாளர் கிடைக்கவில்லை. +clientDisabledMessage=வாடிக்கையாளர் முடக்கப்பட்டுள்ளது. +invalidParameterMessage=தவறான அளவுரு \: {0} +alreadyLoggedIn= நீங்கள் ஏற்கனவே உள்நுழைந்துள்ளீர்கள். +differentUserAuthenticated=இந்த அமர்வில் நீங்கள் ஏற்கனவே வெவ்வேறு பயனராக '' {0} '' அங்கீகரிக்கப்பட்டுள்ளீர்கள். முதலில் வெளியேறவும். +brokerLinkingSessionExpired=கோரப்பட்ட தரகர் கணக்கு இணைத்தல், ஆனால் தற்போதைய அமர்வு இனி செல்லுபடியாகாது. +proceedWithAction=& raquo; தொடர இங்கே கிளிக் செய்க + +requiredAction.CONFIGURE_TOTP= OTP ஐ உள்ளமைக்கவும் +requiredAction.terms_and_conditions=விதிமுறைகள் மற்றும் நிபந்தனைகள் +requiredAction.UPDATE_PASSWORD=கடவுச்சொல்லைப் புதுப்பிக்கவும் +requiredAction.UPDATE_PROFILE=சுயவிவரத்தைப் புதுப்பிக்கவும் +requiredAction.VERIFY_EMAIL=மின்னஞ்சலை சரிபார்க்கவும் + +doX509Login=நீங்கள் as ஆக உள்நுழைவீர்கள்: +clientCertificate=X509 கிளையன்ட் சான்றிதழ் \: +noCertificate=[சான்றிதழ் இல்லை] + + +pageNotFound=பக்கம் காணப்படவில்லை +internalServerError=உள் சேவையக பிழை ஏற்பட்டது + +console-username=பயனர்பெயர்: +console-password=கடவுச்சொல்: +console-otp=ஒரு முறை கடவுச்சொல்: +console-new-password=புதிய கடவுச்சொல்: +console-confirm-password=கடவுச்சொல்லை உறுதிப்படுத்தவும்: +console-update-password=உங்கள் கடவுச்சொல்லின் புதுப்பிப்பு தேவை. +console-verify-email=உங்கள் மின்னஞ்சல் முகவரியை நீங்கள் சரிபார்க்க வேண்டும். சரிபார்ப்புக் குறியீட்டைக் கொண்ட மின்னஞ்சலை {0 to க்கு அனுப்பினோம். கீழே உள்ளீட்டில் இந்த குறியீட்டை உள்ளிடவும். +console-email-code=மின்னஞ்சல் குறியீடு: +console-accept-terms=விதிமுறைகளை ஏற்கவா? [y/n]: +console-accept=y + +# Openshift messages +openshift.scope.user_info=பயனர் தகவல் +openshift.scope.user_check-access=பயனர் அணுகல் தகவல் +openshift.scope.user_full=முழு அணுகல் +openshift.scope.list-projects=திட்டங்களை பட்டியலிடுங்கள் + +# SAML authentication +saml.post-form.title=அங்கீகார வழிமாற்று +saml.post-form.message=திருப்பி விடுகிறது, தயவுசெய்து காத்திருங்கள். +saml.post-form.js-disabled=ஜாவாஸ்கிரிப்ட் முடக்கப்பட்டுள்ளது. அதை இயக்க நாங்கள் கடுமையாக பரிந்துரைக்கிறோம். தொடர கீழே உள்ள பொத்தானைக் கிளிக் செய்க. + +#authenticators +otp-display-name=அங்கீகார பயன்பாடு +otp-help-text=அங்கீகார பயன்பாட்டிலிருந்து சரிபார்ப்புக் குறியீட்டை உள்ளிடவும். +password-display-name=கடவுச்சொல் +password-help-text=உங்கள் கடவுச்சொல்லை உள்ளிட்டு உள்நுழைக. +auth-username-form-display-name=பயனர்பெயர் +auth-username-form-help-text=உங்கள் பயனர்பெயரை உள்ளிட்டு உள்நுழையத் தொடங்குங்கள் +auth-username-password-form-display-name=பயனர்பெயர் மற்றும் கடவுச்சொல் +auth-username-password-form-help-text=உங்கள் பயனர்பெயர் மற்றும் கடவுச்சொல்லை உள்ளிட்டு உள்நுழைக. + +# WebAuthn +webauthn-display-name=பாதுகாப்பு விசை +webauthn-help-text=உள்நுழைய உங்கள் பாதுகாப்பு விசையைப் பயன்படுத்தவும். +webauthn-passwordless-display-name=பாதுகாப்பு விசை +webauthn-passwordless-help-text=கடவுச்சொல் இல்லாத உள்நுழைவுக்கு உங்கள் பாதுகாப்பு விசையைப் பயன்படுத்தவும். +webauthn-login-title=பாதுகாப்பு விசை உள்நுழைவு +webauthn-registration-title=பாதுகாப்பு விசை பதிவு +webauthn-available-authenticators=கிடைக்கக்கூடிய அங்கீகாரங்கள் + +# WebAuthn Error +webauthn-error-title=பாதுகாப்பு விசை பிழை +webauthn-error-registration=உங்கள் பாதுகாப்பு விசையை பதிவு செய்வதில் தோல்வி. +webauthn-error-api-get=பாதுகாப்பு விசையால் அங்கீகரிக்க முடியவில்லை. +webauthn-error-different-user=முதல் அங்கீகரிக்கப்பட்ட பயனர் பாதுகாப்பு விசையால் அங்கீகரிக்கப்பட்டவர் அல்ல. +webauthn-error-auth-verification=பாதுகாப்பு விசை அங்கீகார முடிவு தவறானது. +webauthn-error-register-verification=பாதுகாப்பு விசை பதிவு முடிவு தவறானது. +webauthn-error-user-not-found=பாதுகாப்பு விசையால் அங்கீகரிக்கப்பட்ட அறியப்படாத பயனர். + +identity-provider-redirector=மற்றொரு அடையாள வழங்குநருடன் இணைக்கவும் \ No newline at end of file diff --git a/keycloak-jboss/theme/base/login/register.ftl b/keycloak-jboss/theme/base/login/register.ftl new file mode 100644 index 00000000..25b5c9cd --- /dev/null +++ b/keycloak-jboss/theme/base/login/register.ftl @@ -0,0 +1,152 @@ +<#import "template.ftl" as layout> +<@layout.registrationLayout; section> + <#if section = "header"> + ${msg("registerTitle")} + <#elseif section = "form"> +

+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + <#if !realm.registrationEmailAsUsername> +
+
+ +
+
+ +
+
+ + + <#if passwordRequired??> +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+ + + <#if recaptchaRequired??> +
+
+
+
+
+ + + + + + diff --git a/keycloak-jboss/theme/base/login/theme.properties b/keycloak-jboss/theme/base/login/theme.properties new file mode 100644 index 00000000..1f7d337b --- /dev/null +++ b/keycloak-jboss/theme/base/login/theme.properties @@ -0,0 +1 @@ +locales=ca,de,eng,es,fra,it,ja,lt,nl,no,pl,pt-BR,ru,sk,sv,tr,zh-CN,ara,hin,kan,tam diff --git a/keycloak-jboss/theme/mosip/account/resources/css/account.css b/keycloak-jboss/theme/mosip/account/resources/css/account.css new file mode 100644 index 00000000..3878e43a --- /dev/null +++ b/keycloak-jboss/theme/mosip/account/resources/css/account.css @@ -0,0 +1,277 @@ +html { + height: 100%; +} + +body { + background-color: #F9F9F9; + margin: 0; + padding: 0; + height: 100%; +} + +header .navbar { + margin-bottom: 0; + min-height: inherit; +} + +.header .container { + position: relative; +} + +.navbar-title { + background-image: url('../img/logo.png'); + height: 25px; + background-repeat: no-repeat; + width: 123px; + margin: 3px 10px 5px; + text-indent: -99999px; +} + +.navbar-pf .navbar-utility { + right: 20px; + top: -34px; + font-size: 12px; +} + +.navbar-pf .navbar-utility > li > a { + color: #fff !important; + padding-bottom: 12px; + padding-top: 11px; + border-left: medium none; +} + +.container { + height: 100%; +} + +.content-area { + background-color: #fff; + border-color: #CECECE; + border-style: solid; + border-width: 0 1px; + height: 100%; + padding: 0 30px; +} + +.margin-bottom { + margin-bottom: 10px; +} + +/* Sidebar */ + +.bs-sidebar { + background-color: #f9f9f9; + padding-top: 44px; + padding-right: 0; + padding-left: 0; + z-index: 20; +} +.bs-sidebar ul { + list-style: none; + padding-left: 12px; +} + +.bs-sidebar ul li { + margin-bottom: 0.5em; + margin-left: -1em; +} +.bs-sidebar ul li a { + font-size: 14px; + padding-left: 25px; + color: #4d5258; + line-height: 28px; + display: block; + border-width: 1px 0 1px 1px; + border-style: solid; + border-color: #f9f9f9; +} +.bs-sidebar ul li a:hover, +.bs-sidebar ul li a:focus { + text-decoration: none; + color: #777777; + border-right: 2px solid #aaa; +} +.bs-sidebar ul li.active a { + background-color: #c7e5f0; + border-color: #56bae0; + font-weight: bold; + background-image: url(../img/icon-sidebar-active.png); + background-repeat: no-repeat; + background-position: right center; +} + +.bs-sidebar ul li.active a:hover { + border-right: none; +} + + +.content-area h2 { + font-family: "Open Sans", sans-serif; + font-weight: 100; + font-size: 24px; + margin-bottom: 25px; + margin-top: 25px; +} + +.subtitle { + text-align: right; + margin-top: 30px; + color: #909090; +} + +.required { + color: #CB2915; +} + + +.alert { + margin-top: 30px; + margin-bottom: 0; +} + +.feedback-aligner .alert { + background-position: 1.27273em center; + background-repeat: no-repeat; + border-radius: 2px; + border-width: 1px; + color: #4D5258; + display: inline-block; + font-size: 1.1em; + line-height: 1.4em; + margin: 0; + padding: 0.909091em 3.63636em; + position: relative; + text-align: left; +} +.alert.alert-success { + background-color: #E4F1E1; + border-color: #4B9E39; +} +.alert.alert-error { + background-color: #F8E7E7; + border-color: #B91415; +} +.alert.alert-warning { + background-color: #FEF1E9; + border-color: #F17528; +} +.alert.alert-info { + background-color: #E4F3FA; + border-color: #5994B2; +} + +.form-horizontal { + border-top: 1px solid #E9E8E8; + padding-top: 23px; +} + +.form-horizontal .control-label { + color: #909090; + line-height: 1.4em; + padding-top: 5px; + position: relative; + text-align: right; + width: 100%; +} + +.form-group { + position: relative; +} + +.control-label + .required { + position: absolute; + right: -2px; + top: 0; +} + +#kc-form-buttons { + text-align: right; + margin-top: 10px; +} + +#kc-form-buttons .btn-primary { + float: right; + margin-left: 8px; +} + +/* Authenticator page */ + +ol { + padding-left: 40px; +} + +ol li { + font-size: 13px; + margin-bottom: 10px; + position: relative; +} + +ol li img { + margin-top: 15px; + margin-bottom: 5px; + border: 1px solid #eee; +} + +hr + .form-horizontal { + border: none; + padding-top: 0; +} + +.kc-dropdown{ + position: relative; +} +.kc-dropdown > a{ + display:block; + padding: 11px 10px 12px; + line-height: 12px; + font-size: 12px; + color: #fff !important; + text-decoration: none; +} +.kc-dropdown > a::after{ + content: "\2c5"; + margin-left: 4px; +} +.kc-dropdown:hover > a{ + background-color: rgba(0,0,0,0.2); +} +.kc-dropdown ul li a{ + padding: 1px 11px; + font-size: 12px; + color: #000 !important; + border: 1px solid #fff; + text-decoration: none; + display:block; + line-height: 20px; +} +.kc-dropdown ul li a:hover{ + color: #4d5258; + background-color: #d4edfa; + border-color: #b3d3e7; +} +.kc-dropdown ul{ + position: absolute; + z-index: 2000; + list-style:none; + display:none; + padding: 5px 0px; + margin: 0px; + background-color: #fff !important; + border: 1px solid #b6b6b6; + border-radius: 1px; + -webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175); + background-clip: padding-box; + min-width: 100px; +} +.kc-dropdown:hover ul{ + display:block; +} + + +#kc-totp-secret-key { + border: 1px solid #eee; + font-size: 16px; + padding: 10px; + margin: 50px 0; +} \ No newline at end of file diff --git a/keycloak-jboss/theme/mosip/account/resources/img/favicon.ico b/keycloak-jboss/theme/mosip/account/resources/img/favicon.ico new file mode 100644 index 00000000..48188ded Binary files /dev/null and b/keycloak-jboss/theme/mosip/account/resources/img/favicon.ico differ diff --git a/keycloak-jboss/theme/mosip/account/resources/img/icon-sidebar-active.png b/keycloak-jboss/theme/mosip/account/resources/img/icon-sidebar-active.png new file mode 100644 index 00000000..e7b9b082 Binary files /dev/null and b/keycloak-jboss/theme/mosip/account/resources/img/icon-sidebar-active.png differ diff --git a/keycloak-jboss/theme/mosip/account/resources/img/keycloak-logo.png b/keycloak-jboss/theme/mosip/account/resources/img/keycloak-logo.png new file mode 100644 index 00000000..95557485 Binary files /dev/null and b/keycloak-jboss/theme/mosip/account/resources/img/keycloak-logo.png differ diff --git a/keycloak-jboss/theme/mosip/account/resources/img/logo.png b/keycloak-jboss/theme/mosip/account/resources/img/logo.png new file mode 100644 index 00000000..a698c548 Binary files /dev/null and b/keycloak-jboss/theme/mosip/account/resources/img/logo.png differ diff --git a/keycloak-jboss/theme/mosip/account/theme.properties b/keycloak-jboss/theme/mosip/account/theme.properties new file mode 100644 index 00000000..a4f97191 --- /dev/null +++ b/keycloak-jboss/theme/mosip/account/theme.properties @@ -0,0 +1,13 @@ +parent=base +import=common/keycloak + +styles=node_modules/patternfly/dist/css/patternfly.min.css node_modules/patternfly/dist/css/patternfly-additions.min.css css/account.css + +##### css classes for form buttons +# main class used for all buttons +kcButtonClass=btn +# classes defining priority of the button - primary or default (there is typically only one priority button for the form) +kcButtonPrimaryClass=btn-primary +kcButtonDefaultClass=btn-default +# classes defining size of the button +kcButtonLargeClass=btn-lg diff --git a/keycloak-jboss/theme/mosip/admin/resources/css/styles.css b/keycloak-jboss/theme/mosip/admin/resources/css/styles.css new file mode 100644 index 00000000..3f6b7b82 --- /dev/null +++ b/keycloak-jboss/theme/mosip/admin/resources/css/styles.css @@ -0,0 +1,486 @@ +html,body { + height: 100%; +} + +form { + margin-top: 20px; +} + +table { + margin-top: 20px; +} + +.required { + color: #f00; +} + +.tooltip-inner { + min-width: 200px; +} + +.margin-top { + margin-top: 20px; +} + +.no-margin-top { + margin-top: 0px !important; +} + +table { + max-width: 100%; +} + +td.clip { + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + max-width: 0; +} + +th.w-10 { + width: 10%; +} + +th.w-15 { + width: 15%; +} + +th.w-20 { + width: 20%; +} + + +th.w-25 { + width: 25%; +} + +th.w-30 { + width: 30%; +} + + +th.w-35 { + width: 35%; +} + +th.w-40 { + width: 40%; +} + +/*********** Loading ***********/ + +.loading { + background-color: #f5f5f5; + border: 1px solid #eee; + position: absolute; + bottom: 0px; + left: 0px; + padding: 2px 200px 2px 5px; +} + +/*********** Feedback ***********/ + +.feedback-aligner { + position: fixed; + top: 15px; + text-align: center; + width: 100%; + height: 0; + z-index: 100; +} +.feedback-aligner .alert { + border-radius: 2px; + border-width: 1px; + display: inline-block; + position: relative; +} + +/*********** On-Off Switch ***********/ + +.onoffswitch { + -moz-user-select: none; + height: 26px; + position: relative; + width: 62px; +} +.onoffswitch .onoffswitch-checkbox { + display: none; +} +.onoffswitch .onoffswitch-label { + border: 1px solid #bbb; + border-radius: 2px; + cursor: pointer; + display: block; + overflow: hidden; + width: 62px; +} +.onoffswitch .onoffswitch-inner { + display: block; + margin-left: -100%; + transition: margin 0.3s ease-in 0s; + width: 200%; +} +.onoffswitch .onoffswitch-inner > span { + -moz-box-sizing: border-box; + color: white; + float: left; + font-size: 11px; + font-family: "Open Sans", sans-serif; + font-weight: bold; + height: 24px; + line-height: 24px; + padding: 0; + width: 50%; +} +.onoffswitch .onoffswitch-switch { + background-image: linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -o-linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -moz-linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -webkit-linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -ms-linear-gradient(top, #fafafa 0%, #ededed 100%); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #fafafa), color-stop(1, 0, #ededed)); + border: 1px solid #aaa; + border-radius: 2px; + bottom: 0; + margin: 0; + position: absolute; + right: 39px; + top: 0; + transition: all 0.3s ease-in 0s; + -webkit-transition: all 0.3s ease-in 0s; + width: 23px; +} +.onoffswitch .onoffswitch-inner .onoffswitch-active { + background-image: linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -o-linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -moz-linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -webkit-linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -ms-linear-gradient(top, #00a9ec 0%, #009bd3 100%); + background-image: -webkit-gradient(linear, left top, left bottom, color-stop(0, #00a9ec), color-stop(1, 0, #009bd3)); + color: #FFFFFF; + padding-left: 10px; +} +.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-inner .onoffswitch-active, +.onoffswitch-checkbox:disabled + .onoffswitch-label .onoffswitch-inner .onoffswitch-inactive { + background-image: none; + background-color: #e5e5e5; + color: #9d9fa1; +} +.onoffswitch .onoffswitch-inner .onoffswitch-inactive { + background: linear-gradient(#fefefe, #e8e8e8) repeat scroll 0 0 transparent; + color: #4d5258; + padding-right: 10px; + text-align: right; +} +.onoffswitch .onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-inner { + margin-left: 0; +} +.onoffswitch .onoffswitch-checkbox:checked + .onoffswitch-label .onoffswitch-switch { + right: 0; +} + + +/*********** Select 2 ***********/ + +.select2-container { + width: 100%; +} + +.select2-container-multi .select2-choices .select2-search-field { + height: 26px; +} + +/*********** html select ********/ +.overflow-select { + overflow: auto; +} + + +/*********** New Menu ***********/ + + +.sidebar-pf-left{ + background: #292e34; +} + +.sidebar-pf .nav-pills > li a i, .sidebar-pf .nav-pills > li a span{ + color: #72767b; + display: inline-block; + margin-right: 10px; +} +.sidebar-pf .nav-pills > li > a{ + color: #dbdada; + padding: 0px 20px 0 30px!important; + line-height: 30px; + border-left-width: 12px; + border-left-style: solid; + border-left-color: #292e34; + margin-left: -6px; +} + +.sidebar-pf .nav-pills > li > a:hover{ + background: #393f44; + border-color:#292e34; + border-left-color: #393f44; + color: #fff; +} + +.sidebar-pf .nav-pills > li > a:after{ + display: none!important; +} + + +.sidebar-pf .nav-pills > li.active > a { + color: #fff; + background: #393f44!important; + border-bottom: 1px solid #000!important; + border-top: 1px solid #000!important; + border-left-color: #39a5dc!important; +} + +.sidebar-pf .nav-pills > li.active a i, .sidebar-pf .nav-pills > li.active a span{ + color: #39a5dc; +} + +/*********** Realm selector ***********/ + +.realm-selector{ + color: #fff; + margin: 0 -20px; + position: relative; +} + +.realm-dropmenu{ + display: none; + cursor: pointer; + position: absolute; + top: 60px; + left: 0; + right: 0; + z-index: 999; + background: #fff; +} + +.realm-selector:hover .realm-dropmenu{ + display: block; +} + +.realm-add{ + padding: 10px; +} + +.realm-selector h2{ + font-size: 16px; + line-height: 60px; + padding: 0 20px; + margin: 0; + border-bottom: 1px solid #d5d5d6; +} + +.realm-selector h2 i{ + display: inline-block; + float: right; + line-height: 60px; +} + + +.realm-selector ul{ + padding-left: 0; + margin: 0; + list-style: none; + max-height: 200px; + overflow-y:auto; +} + + +.realm-selector ul li a{ + line-height: 60px; + padding: 0 20px; + border-bottom: 1px solid #d5d5d6; + line-height: 39px; + display: block; + font-size: 14px; +} + + +/*********** Overwrites header defaults ***********/ + +.navbar-pf{ + border-top: none!important; +} + +.navbar-pf .navbar-brand { + padding: 0; + height: 56px; + line-height: 56px; + background-position: center center; + background-image: url('../img/keyclok-logo.png'); + background-size: 148px 30px; + background-repeat: no-repeat; + width: 148px; +} + +.navbar-pf .navbar-utility .dropdown-toggle { + padding: 23px !important; +} + +.clickable { + cursor: pointer; +} + +h1 i { + color: #999999; + font-size: 18px; + margin-left: 10px; +} + +/* Action cell */ +.kc-action-cell { + background-color: #eeeeee; + background-image: linear-gradient(to bottom, #fafafa 0%, #ededed 100%); + background-repeat: repeat-x; + + text-align: center; + vertical-align: middle; + + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; + + cursor:pointer; +} + +.kc-action-cell:hover { + background-color: #eeeeee; + background-image: none; +} + +.kc-sorter span { + margin-left: 10px; +} + + +/* Time selector */ + +.time-selector input { + display: inline-block; + width: 120px; + padding-right: 0; + margin-right: 0; +} + +.time-selector select { + display: inline-block; + width: 80px; + margin-left: 0; + padding-left: 0; +} + +.ace_editor { + height: 600px; + width: 100%; +} + +.kc-button-input-file input { + float: left; + width: 73%; +} + +.kc-button-input-file label { + float: left; + margin-left: 2%; + width: 25%; +} + +table.kc-authz-table-expanded { + margin-top: 0px !important; +} + +.no-gutter > [class*='col-'] { + padding-right:0!important; + padding-left:0!important; +} + +.password-conceal { + font-family: 'text-security-disc'; + font-size: 14px; +} + +/* Deactivation styles for user-group membership tree models */ + +div[tree-model] li .deactivate { + color: #4a5053; + opacity: 0.4; +} + +div[tree-model] li .deactivate_selected { + background-color: #dcdcdc; + font-weight: bold; + padding: 1px 5px; +} + +/* search highlighting */ + +div[tree-model] li .highlight { + background-color: #aaddff; +} + +/* Manage credentials */ +table.credentials-table { + margin-top: 0; + margin-bottom: 20px; +} + +table.credentials-table td.kc-action-cell { + vertical-align: middle; +} + +table.credentials-table input[type='text'] { + width: 100%; +} + +td.credential-label-cell { + padding: 5px !important; +} + +td.credential-data-cell { + padding: 0 !important; +} + +td.credential-data-cell a { + margin-left: 5px; + line-height: 2.5em; + cursor: pointer; +} + +td.credential-action-cell { + padding: 0px !important; +} + +td.credential-action-cell div.kc-action-cell { + width: 100%; + height: 36px; + line-height: 34px; +} + +td.credential-action-cell.expanded div.kc-action-cell { + border-bottom: 1px solid #d1d1d1; +} + +table.credential-data-table { + margin-top: 0; +} + +table.credential-data-table tr:first-child td { + border-top: 0; +} + +table.credential-data-table td:first-child { + width: 150px; +} + +table.credential-data-table td.key { + text-align: right; + font-weight: bold; +} + diff --git a/keycloak-jboss/theme/mosip/admin/resources/img/favicon.ico b/keycloak-jboss/theme/mosip/admin/resources/img/favicon.ico new file mode 100644 index 00000000..48188ded Binary files /dev/null and b/keycloak-jboss/theme/mosip/admin/resources/img/favicon.ico differ diff --git a/keycloak-jboss/theme/mosip/admin/resources/img/keyclok-logo.png b/keycloak-jboss/theme/mosip/admin/resources/img/keyclok-logo.png new file mode 100644 index 00000000..ca53f0a0 Binary files /dev/null and b/keycloak-jboss/theme/mosip/admin/resources/img/keyclok-logo.png differ diff --git a/keycloak-jboss/theme/mosip/admin/resources/img/keyclok-logo.svg b/keycloak-jboss/theme/mosip/admin/resources/img/keyclok-logo.svg new file mode 100644 index 00000000..05fa87b8 --- /dev/null +++ b/keycloak-jboss/theme/mosip/admin/resources/img/keyclok-logo.svg @@ -0,0 +1,194 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/keycloak-jboss/theme/mosip/admin/resources/img/select-arrow.png b/keycloak-jboss/theme/mosip/admin/resources/img/select-arrow.png new file mode 100644 index 00000000..a865a6fa Binary files /dev/null and b/keycloak-jboss/theme/mosip/admin/resources/img/select-arrow.png differ diff --git a/keycloak-jboss/theme/mosip/admin/theme.properties b/keycloak-jboss/theme/mosip/admin/theme.properties new file mode 100644 index 00000000..e245ed69 --- /dev/null +++ b/keycloak-jboss/theme/mosip/admin/theme.properties @@ -0,0 +1,2 @@ +parent=base +styles=node_modules/patternfly/dist/css/patternfly.min.css node_modules/patternfly/dist/css/patternfly-additions.min.css node_modules/select2/select2.css css/styles.css lib/angular/treeview/css/angular.treeview.css node_modules/text-security/text-security.css \ No newline at end of file diff --git a/keycloak-jboss/theme/mosip/email/theme.properties b/keycloak-jboss/theme/mosip/email/theme.properties new file mode 100644 index 00000000..f1dbb721 --- /dev/null +++ b/keycloak-jboss/theme/mosip/email/theme.properties @@ -0,0 +1 @@ +parent=base \ No newline at end of file diff --git a/keycloak-jboss/theme/mosip/login/resources/css/login.css b/keycloak-jboss/theme/mosip/login/resources/css/login.css new file mode 100644 index 00000000..13b33f01 --- /dev/null +++ b/keycloak-jboss/theme/mosip/login/resources/css/login.css @@ -0,0 +1,581 @@ +.login-pf body { + background: #ffffff; + background-size: cover; + height: 100%; +} + +@media (min-width: 768px) { + .login-pf-page .login-pf-header { + margin-bottom: 10px; + } +} +.login-pf-page .login-pf-header h1 { + text-align: center; + font-weight: 700; + color: #ff2199; +} +.login-pf-page .login-pf-header h1 { + font-size: 16px; +} +@media (min-width: 768px) { + .login-pf-page .login-pf-header h1 { + font-size: 24px; + } +} + +input:-internal-autofill-selected { + appearance: menulist-button; + background-color: white !important; + background-image: none !important; + color: -internal-light-dark(black, white) !important; +} + +.login-pf-page .btn-primary{ + line-height: 36px !important; + border-radius: 4px !important; + background: rgba(230,58,116,1) !important; + border: none !important; +} +.login-pf-page .form-control { + height: 50px; + border: 0px; + border-bottom: 1px solid; + font-size: 21px; +} + +.alert-error { + background-color: #ffffff; + border-color: #cc0000; + color: #333333; +} + +#kc-locale ul { + display: none; + position: absolute; + background-color: #fff; + list-style: none; + right: 0; + top: 20px; + min-width: 100px; + padding: 2px 0; + border: solid 1px #bbb; +} + +#kc-locale:hover ul { + display: block; + margin: 0; +} + +#kc-locale ul li a { + display: block; + padding: 5px 14px; + color: #000 !important; + text-decoration: none; + line-height: 20px; +} + +#kc-locale ul li a:hover { + color: #4d5258; + background-color: #d4edfa; +} + +#kc-locale-dropdown a { + color: #4d5258; + background: 0 0; + padding: 0 15px 0 0; + font-weight: 300; +} + +#kc-locale-dropdown a:hover { + text-decoration: none; +} + +a#kc-current-locale-link { + display: block; + padding: 0 5px; +} + +/* a#kc-current-locale-link:hover { + background-color: rgba(0,0,0,0.2); +} */ + +a#kc-current-locale-link::after { + content: "\2c5"; + margin-left: 4px; +} + +.login-pf .container { + padding-top: 40px; +} + +.login-pf a:hover { + color: #0099d3; +} + +#kc-logo { + width: 100%; +} + +#kc-logo-wrapper { + background-image: url(../img/mosiplogo.png); + background-repeat: no-repeat; + height: 63px; + width: 300px; + margin: 62px auto 0; +} + +div.kc-logo-text { + background-image: url(../img/mosiplogo.png); + background-repeat: no-repeat; + height: 131px; + width: 300px; + margin: -1em 30em; +} + +div.kc-logo-text span { + display: none; +} +.g-recaptcha { + transform:scale(0.77); + transform-origin:0 0; +} +#kc-header { + color: #ededed; + overflow: visible; + white-space: nowrap; +} + +#kc-header-wrapper { + font-size: 29px; + text-transform: uppercase; + letter-spacing: 3px; + line-height: 1.2em; + padding: 62px 10px 20px; + white-space: normal; +} + +#kc-content { + width: 100%; +} + +#kc-attempted-username{ + font-size: 20px; + font-family:inherit; + font-weight: normal; + padding-right:10px; +} + +#kc-username{ + text-align: center; +} + +#kc-webauthn-settings-form{ + padding-top:8px; +} + +/* #kc-content-wrapper { + overflow-y: hidden; +} */ + +#kc-info { + padding-bottom: 200px; + margin-bottom: -200px; +} + +#kc-info-wrapper { + font-size: 13px; +} + +#kc-form-options span { + display: block; +} + +#kc-form-options .checkbox { + margin-top: 0; + color: #72767b; +} + +#kc-terms-text { + margin-bottom: 20px; +} + +#kc-registration { + margin-bottom: 15px; +} + +/* TOTP */ + +.subtitle { + text-align: right; + margin-top: 30px; + color: #909090; +} + +.required { + color: #CB2915; +} + +ol#kc-totp-settings { + margin: 0; + padding-left: 20px; +} + +ul#kc-totp-supported-apps { + margin-bottom: 10px; +} + +#kc-totp-secret-qr-code { + max-width:150px; + max-height:150px; +} + +#kc-totp-secret-key { + background-color: #fff; + color: #333333; + font-size: 16px; + padding: 10px 0; +} + +/* OAuth */ + +#kc-oauth h3 { + margin-top: 0; +} + +#kc-oauth ul { + list-style: none; + padding: 0; + margin: 0; +} + +#kc-oauth ul li { + border-top: 1px solid rgba(255, 255, 255, 0.1); + font-size: 12px; + padding: 10px 0; +} + +#kc-oauth ul li:first-of-type { + border-top: 0; +} + +#kc-oauth .kc-role { + display: inline-block; + width: 50%; +} + +/* Code */ +#kc-code textarea { + width: 100%; + height: 8em; +} + +/* Social */ + +#kc-social-providers ul { + padding: 0; +} + +#kc-social-providers li { + display: block; +} + +#kc-social-providers li:first-of-type { + margin-top: 0; +} + +.kc-login-tooltip{ + position:relative; + display: inline-block; +} + +.kc-login-tooltip .kc-tooltip-text{ + top:-3px; + left:160%; + background-color: black; + visibility: hidden; + color: #fff; + + min-width:130px; + text-align: center; + border-radius: 2px; + box-shadow:0 1px 8px rgba(0,0,0,0.6); + padding: 5px; + + position: absolute; + opacity:0; + transition:opacity 0.5s; +} + +/* Show tooltip */ +.kc-login-tooltip:hover .kc-tooltip-text { + visibility: visible; + opacity:0.7; +} + +/* Arrow for tooltip */ +.kc-login-tooltip .kc-tooltip-text::after { + content: " "; + position: absolute; + top: 15px; + right: 100%; + margin-top: -5px; + border-width: 5px; + border-style: solid; + border-color: transparent black transparent transparent; +} + +.zocial, +a.zocial { + width: 100%; + font-weight: normal; + font-size: 14px; + text-shadow: none; + border: 0; + background: #f5f5f5; + color: #72767b; + border-radius: 0; + white-space: normal; +} +.zocial:before { + border-right: 0; + margin-right: 0; +} +.zocial span:before { + padding: 7px 10px; + font-size: 14px; +} +.zocial:hover { + background: #ededed !important; +} + +.zocial.facebook, +.zocial.github, +.zocial.google, +.zocial.microsoft, +.zocial.stackoverflow, +.zocial.linkedin, +.zocial.twitter { + background-image: none; + border: 0; + + box-shadow: none; + text-shadow: none; +} + +/* Copy of zocial windows classes to be used for microsoft's social provider button */ +.zocial.microsoft:before{ content: "\f15d"; } +.zocial.stackoverflow:before{ color: inherit; } + + +@media (min-width: 768px) { + #kc-container-wrapper { + position: absolute; + width: 100%; + } + + .login-pf .container { + padding-right: 80px; + } + + #kc-locale { + position: relative; + text-align: right; + z-index: 9999; + } +} + +@media (max-width: 767px) { + + .login-pf body { + background: white; + } + + #kc-header { + padding-left: 15px; + padding-right: 15px; + float: none; + text-align: left; + } + + #kc-header-wrapper { + font-size: 16px; + font-weight: bold; + padding: 20px 60px 0 0; + color: #72767b; + letter-spacing: 0; + } + + div.kc-logo-text { + margin: 0; + width: 150px; + height: 32px; + background-size: 100%; + } + + #kc-form { + float: none; + } + + #kc-info-wrapper { + border-top: 1px solid rgba(255, 255, 255, 0.1); + margin-top: 15px; + padding-top: 15px; + padding-left: 0px; + padding-right: 15px; + } + + #kc-social-providers li { + display: block; + margin-right: 5px; + } + + .login-pf .container { + padding-top: 15px; + padding-bottom: 15px; + } + + #kc-locale { + position: absolute; + width: 200px; + top: 20px; + right: 20px; + text-align: right; + z-index: 9999; + } + + #kc-logo-wrapper { + background-size: 100px 21px; + height: 21px; + width: 100px; + margin: 20px 0 0 20px; + } + +} + +@media (min-height: 646px) { + #kc-container-wrapper { + bottom: 12%; + } +} + +@media (max-height: 645px) { + #kc-container-wrapper { + padding-top: 50px; + top: 20%; + } +} + +.card-pf form.form-actions .btn { + float: right; + margin-left: 10px; +} + +#kc-form-buttons { + margin-top: 40px; +} + +.login-pf-page .login-pf-brand { + margin-top: 20px; + max-width: 360px; + width: 40%; +} + +.card-pf { + background: #fff; + margin: 0 auto; + padding: 0 20px; + max-width: 500px; + border-top: 0; + box-shadow: 0 0 0; +} + +/*tablet*/ +@media (max-width: 840px) { + .login-pf-page .card-pf{ + max-width: none; + margin-left: 20px; + margin-right: 20px; + padding: 20px 20px 30px 20px; + } +} +@media (max-width: 767px) { + .login-pf-page .card-pf{ + max-width: none; + margin-left: 0; + margin-right: 0; + padding-top: 0; + } + .card-pf.login-pf-accounts{ + max-width: none; + } +} + +.login-pf-page .login-pf-signup { + font-size: 15px; + color: #72767b; +} +#kc-content-wrapper .row { + margin-left: 0; + margin-right: 0; +} + +@media (min-width: 768px) { + .login-pf-page .login-pf-social-section:first-of-type { + padding-right: 39px; + border-right: 1px solid #d1d1d1; + margin-right: -1px; + } + .login-pf-page .login-pf-social-section:last-of-type { + padding-left: 40px; + } + .login-pf-page .login-pf-social-section .login-pf-social-link:last-of-type { + margin-bottom: 0; + } +} + +.login-pf-page .login-pf-social-link { + margin-bottom: 25px; +} +.login-pf-page .login-pf-social-link a { + padding: 2px 0; +} + +.login-pf-page.login-pf-page-accounts { + margin-left: auto; + margin-right: auto; +} + +.login-pf-page .btn-primary { + margin-top: 10px; + line-height: 36px !important; + border-radius: 4px !important; + background: rgba(230,58,116,1) !important; + border: none !important; +} + +.login-pf-page .list-view-pf .list-group-item { + border-bottom: 1px solid #ededed; +} + +.login-pf-page .list-view-pf-description { + width: 100%; +} + +.login-pf-page .card-pf{ + margin-bottom: 10px; +} + +#kc-form-login div.form-group:last-of-type, +#kc-register-form div.form-group:last-of-type, +#kc-update-profile-form div.form-group:last-of-type { + margin-bottom: 0px; +} + +#kc-back { + margin-top: 5px; +} + +form#kc-select-back-form div.login-pf-social-section { + padding-left: 0px; + border-left: 0px; +} diff --git a/keycloak-jboss/theme/mosip/login/resources/img/favicon.ico b/keycloak-jboss/theme/mosip/login/resources/img/favicon.ico new file mode 100644 index 00000000..48188ded Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/favicon.ico differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/feedback-error-arrow-down.png b/keycloak-jboss/theme/mosip/login/resources/img/feedback-error-arrow-down.png new file mode 100644 index 00000000..6f2d9d2a Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/feedback-error-arrow-down.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/feedback-error-sign.png b/keycloak-jboss/theme/mosip/login/resources/img/feedback-error-sign.png new file mode 100644 index 00000000..0dd50044 Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/feedback-error-sign.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/feedback-success-arrow-down.png b/keycloak-jboss/theme/mosip/login/resources/img/feedback-success-arrow-down.png new file mode 100644 index 00000000..03cc0c45 Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/feedback-success-arrow-down.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/feedback-success-sign.png b/keycloak-jboss/theme/mosip/login/resources/img/feedback-success-sign.png new file mode 100644 index 00000000..640bd71c Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/feedback-success-sign.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/feedback-warning-arrow-down.png b/keycloak-jboss/theme/mosip/login/resources/img/feedback-warning-arrow-down.png new file mode 100644 index 00000000..6f2d9d2a Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/feedback-warning-arrow-down.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/feedback-warning-sign.png b/keycloak-jboss/theme/mosip/login/resources/img/feedback-warning-sign.png new file mode 100644 index 00000000..f9392a35 Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/feedback-warning-sign.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/keycloak-bg.png b/keycloak-jboss/theme/mosip/login/resources/img/keycloak-bg.png new file mode 100644 index 00000000..4004db44 Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/keycloak-bg.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/keycloak-logo-text.png b/keycloak-jboss/theme/mosip/login/resources/img/keycloak-logo-text.png new file mode 100644 index 00000000..63f3b9f8 Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/keycloak-logo-text.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/keycloak-logo.png b/keycloak-jboss/theme/mosip/login/resources/img/keycloak-logo.png new file mode 100644 index 00000000..ffa5b0bf Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/keycloak-logo.png differ diff --git a/keycloak-jboss/theme/mosip/login/resources/img/mosiplogo.png b/keycloak-jboss/theme/mosip/login/resources/img/mosiplogo.png new file mode 100644 index 00000000..321ba3df Binary files /dev/null and b/keycloak-jboss/theme/mosip/login/resources/img/mosiplogo.png differ diff --git a/keycloak-jboss/theme/mosip/login/theme.properties b/keycloak-jboss/theme/mosip/login/theme.properties new file mode 100644 index 00000000..d266b1e1 --- /dev/null +++ b/keycloak-jboss/theme/mosip/login/theme.properties @@ -0,0 +1,94 @@ +parent=base +import=common/keycloak + +styles=node_modules/patternfly/dist/css/patternfly.min.css node_modules/patternfly/dist/css/patternfly-additions.min.css lib/zocial/zocial.css css/login.css +meta=viewport==width=device-width,initial-scale=1 + +kcHtmlClass=login-pf +kcLoginClass=login-pf-page + +kcLogoLink=http://www.keycloak.org + +kcLogoClass=login-pf-brand + +kcContainerClass=container-fluid +kcContentClass=col-sm-8 col-sm-offset-2 col-md-6 col-md-offset-3 col-lg-6 col-lg-offset-3 +kcContentWrapperClass=row + +kcHeaderClass=login-pf-page-header +kcFeedbackAreaClass=col-md-12 +kcLocaleClass=col-xs-12 col-sm-1 +kcAlertIconClasserror=pficon pficon-error-circle-o + +kcFormAreaClass=col-sm-10 col-sm-offset-1 col-md-8 col-md-offset-2 col-lg-8 col-lg-offset-2 +kcFormCardClass=card-pf +kcFormCardAccountClass=login-pf-accounts +kcFormSocialAccountClass=login-pf-social-section +kcFormSocialAccountContentClass=col-xs-12 col-sm-6 +kcFormSocialAccountListClass=login-pf-social list-unstyled login-pf-social-all +kcFormSocialAccountDoubleListClass=login-pf-social-double-col +kcFormSocialAccountListLinkClass=login-pf-social-link +kcFormHeaderClass=login-pf-header + +kcFeedbackErrorIcon=pficon pficon-error-circle-o +kcFeedbackWarningIcon=pficon pficon-warning-triangle-o +kcFeedbackSuccessIcon=pficon pficon-ok +kcFeedbackInfoIcon=pficon pficon-info + +kcResetFlowIcon=pficon pficon-arrow fa-2x +kcWebAuthnKeyIcon=pficon pficon-key + +kcFormClass=form-horizontal +kcFormGroupClass=form-group +kcFormGroupErrorClass=has-error +kcLabelClass=control-label +kcLabelWrapperClass=col-xs-12 col-sm-12 col-md-12 col-lg-12 +kcInputClass=form-control +kcInputWrapperClass=col-xs-12 col-sm-12 col-md-12 col-lg-12 +kcFormOptionsClass=col-xs-12 col-sm-12 col-md-12 col-lg-12 +kcFormButtonsClass=col-xs-12 col-sm-12 col-md-12 col-lg-12 +kcFormSettingClass=login-pf-settings +kcTextareaClass=form-control +kcSignUpClass=login-pf-signup + + +kcInfoAreaClass=col-xs-12 col-sm-4 col-md-4 col-lg-5 details + +##### css classes for form buttons +# main class used for all buttons +kcButtonClass=btn +# classes defining priority of the button - primary or default (there is typically only one priority button for the form) +kcButtonPrimaryClass=btn-primary +kcButtonDefaultClass=btn-default +# classes defining size of the button +kcButtonLargeClass=btn-lg +kcButtonBlockClass=btn-block + +##### css classes for input +kcInputLargeClass=input-lg + +##### css classes for form accessability +kcSrOnlyClass=sr-only + +##### css classes for select-authenticator form +kcSelectAuthListClass=list-group list-view-pf +kcSelectAuthListItemClass=list-group-item list-view-pf-stacked +kcSelectAuthListItemInfoClass=list-view-pf-main-info +kcSelectAuthListItemLeftClass=list-view-pf-left +kcSelectAuthListItemBodyClass=list-view-pf-body +kcSelectAuthListItemDescriptionClass=list-view-pf-description +kcSelectAuthListItemHeadingClass=list-group-item-heading +kcSelectAuthListItemHelpTextClass=list-group-item-text + +##### css classes for the authenticators +kcAuthenticatorDefaultClass=fa list-view-pf-icon-lg +kcAuthenticatorPasswordClass=fa fa-unlock list-view-pf-icon-lg +kcAuthenticatorOTPClass=fa fa-mobile list-view-pf-icon-lg +kcAuthenticatorWebAuthnClass=fa fa-key list-view-pf-icon-lg +kcAuthenticatorWebAuthnPasswordlessClass=fa fa-key list-view-pf-icon-lg + +##### css classes for the OTP Login Form +kcSelectOTPListClass=card-pf card-pf-view card-pf-view-select card-pf-view-single-select +kcSelectOTPListItemClass=card-pf-body card-pf-top-element +kcAuthenticatorOtpCircleClass=fa fa-mobile card-pf-icon-circle +kcSelectOTPItemHeadingClass=card-pf-title text-center \ No newline at end of file diff --git a/keycloak-jboss/theme/mosip/welcome/index.ftl b/keycloak-jboss/theme/mosip/welcome/index.ftl new file mode 100644 index 00000000..34983c36 --- /dev/null +++ b/keycloak-jboss/theme/mosip/welcome/index.ftl @@ -0,0 +1,132 @@ + + +  + + + Welcome to ${productNameFull} + + + + + + + + <#if properties.styles?has_content> + <#list properties.styles?split(' ') as style> + + + + + + +
+
+
+
+ ${productName} +

Welcome to ${productNameFull}

+
+
+
+
+ <#if successMessage?has_content> +

${successMessage}

+ <#elseif errorMessage?has_content> +

${errorMessage}

+

Administration Console

+ <#elseif bootstrap> + <#if localUser> +

Administration Console

+

Please create an initial admin user to get started.

+ <#else> +

+ You need local access to create the initial admin user.

Open http://localhost:8080/auth +
or use the add-user-keycloak script. +

+ + + + <#if bootstrap && localUser> +
+

+ + +

+ +

+ + +

+ +

+ + +

+ + + + +
+ + +
+
+
+
+

Documentation

+
+ + User Guide, Admin REST API and Javadocs + +
+
+
+
+ <#if properties.displayCommunityLinks = "true"> + + + + +
+
+ +
+
+
+ + diff --git a/keycloak-jboss/theme/mosip/welcome/resources/admin-console.png b/keycloak-jboss/theme/mosip/welcome/resources/admin-console.png new file mode 100644 index 00000000..ac734972 Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/admin-console.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/alert.png b/keycloak-jboss/theme/mosip/welcome/resources/alert.png new file mode 100644 index 00000000..74b4bc79 Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/alert.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/bg.png b/keycloak-jboss/theme/mosip/welcome/resources/bg.png new file mode 100644 index 00000000..b722a001 Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/bg.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/bug.png b/keycloak-jboss/theme/mosip/welcome/resources/bug.png new file mode 100644 index 00000000..4f00775c Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/bug.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/css/welcome.css b/keycloak-jboss/theme/mosip/welcome/resources/css/welcome.css new file mode 100644 index 00000000..c6a679a2 --- /dev/null +++ b/keycloak-jboss/theme/mosip/welcome/resources/css/welcome.css @@ -0,0 +1,140 @@ +body { + background: #fff url(../bg.png) no-repeat center bottom fixed; + background-size: cover; +} +.welcome-header { + margin-top: 10px; + margin-bottom: 50px; + margin-left: -10px; +} +.welcome-header img { + width: 150px; + margin-bottom: 40px; +} +.welcome-message { + margin-top: 20px; +} +.h-l { + min-height: 370px; + padding: 10px 20px 10px; + overflow: hidden; +} +.h-l h3 { + margin-bottom: 10px; +} +.h-m { + height: 110px; + padding-top: 23px; +} +.card-pf img { + width: 22px; + margin-right: 10px; + vertical-align: bottom; +} +img.doc-img { + width: auto; + height: 22px; +} +.link { + font-size: 16px; + vertical-align: baseline; + margin-left: 5px; +} +h3 { + font-weight: 550; +} +h3 a:link, +h3 a:visited { + color: #333; + font-weight: 550; +} +h3 a:hover, +h3 a:hover .link { + text-decoration: none; + color: #00659c; +} +.h-l h3 a img { + height: 30px; + width: auto; +} + +.description { + margin-top: 30px; +} + +.card-pf { + border-top: 1px solid rgba(3, 3, 3, 0.1); + box-shadow: 0 1px 1px rgba(3, 3, 3, 0.275); +} + +.welcome-form label, +.welcome-form input { + display: block; + width: 100%; +} + +.welcome-form label { + color: #828486; + font-weight: normal; + margin-top: 18px; +} +.welcome-form input { + border: 0; + border-bottom: solid 1px #cbcbcb; +} +.welcome-form input:focus { + border-bottom: solid 1px #5e99c6; + outline-width: 0; +} +.welcome-form button { + margin-top: 10px; +} +.error { + color: #c00; + border-color: #c00; + padding: 5px 10px; +} +.success { + color: #3f9c35; + border-color: #3f9c35; + padding: 5px 10px; +} +.welcome-form + .welcome-primary-link, +.welcome-message + .welcome-primary-link { + display: none; +} + +.footer img { + float: right; + width: 150px; + margin-top: 30px; +} + +@media (max-width: 768px) { + .welcome-header { + margin-top: 10px; + margin-bottom: 20px; + } + .welcome-header img { + margin-bottom: 20px; + } + h3 { + margin-top: 10px; + } + .h-l, + .h-m { + height: auto; + min-height: auto; + padding: 5px 10px; + } + .h-l img { + display: inline; + margin-bottom: auto; + } + .description { + display: none; + } + .footer img { + margin-top: 10px; + } +} diff --git a/keycloak-jboss/theme/mosip/welcome/resources/favicon.ico b/keycloak-jboss/theme/mosip/welcome/resources/favicon.ico new file mode 100644 index 00000000..48188ded Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/favicon.ico differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/jboss_community.png b/keycloak-jboss/theme/mosip/welcome/resources/jboss_community.png new file mode 100644 index 00000000..c4a133c1 Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/jboss_community.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/keycloak-project.png b/keycloak-jboss/theme/mosip/welcome/resources/keycloak-project.png new file mode 100644 index 00000000..cd63e5ab Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/keycloak-project.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/keycloak_logo.png b/keycloak-jboss/theme/mosip/welcome/resources/keycloak_logo.png new file mode 100644 index 00000000..134440b1 Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/keycloak_logo.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/logo.png b/keycloak-jboss/theme/mosip/welcome/resources/logo.png new file mode 100644 index 00000000..134440b1 Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/logo.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/mail.png b/keycloak-jboss/theme/mosip/welcome/resources/mail.png new file mode 100644 index 00000000..3a63e7b8 Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/mail.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/resources/user.png b/keycloak-jboss/theme/mosip/welcome/resources/user.png new file mode 100644 index 00000000..0d61bb47 Binary files /dev/null and b/keycloak-jboss/theme/mosip/welcome/resources/user.png differ diff --git a/keycloak-jboss/theme/mosip/welcome/theme.properties b/keycloak-jboss/theme/mosip/welcome/theme.properties new file mode 100644 index 00000000..154ff327 --- /dev/null +++ b/keycloak-jboss/theme/mosip/welcome/theme.properties @@ -0,0 +1,6 @@ +import=common/keycloak + +styles=node_modules/patternfly/dist/css/patternfly.css node_modules/patternfly/dist/css/patternfly-additions.css css/welcome.css + +documentationUrl=https://www.keycloak.org/documentation.html +displayCommunityLinks=true \ No newline at end of file