From 15d824261d31033b4a1c31fa0094a179848d46ce Mon Sep 17 00:00:00 2001 From: ckm007 Date: Fri, 4 Oct 2024 12:28:41 +0530 Subject: [PATCH 01/80] [DSD-6382] updated chart version in helm and deployment scripts Signed-off-by: ckm007 --- deploy/esignet/install.sh | 2 +- deploy/oidc-ui/install.sh | 2 +- helm/esignet/Chart.yaml | 2 +- helm/esignet/values.yaml | 2 +- helm/oidc-ui/Chart.yaml | 2 +- helm/oidc-ui/values.yaml | 2 +- partner-onboarder/install.sh | 2 +- partner-onboarder/values.yaml | 10 +++++----- 8 files changed, 12 insertions(+), 12 deletions(-) diff --git a/deploy/esignet/install.sh b/deploy/esignet/install.sh index cf240a99d..e6a3611ad 100755 --- a/deploy/esignet/install.sh +++ b/deploy/esignet/install.sh @@ -7,7 +7,7 @@ if [ $# -ge 1 ] ; then fi NS=esignet -CHART_VERSION=0.0.1-test +CHART_VERSION=1.5.0-develop ESIGNET_HOST=$(kubectl -n esignet get cm esignet-global -o jsonpath={.data.mosip-esignet-host}) diff --git a/deploy/oidc-ui/install.sh b/deploy/oidc-ui/install.sh index 4927f4a58..76faec6de 100755 --- a/deploy/oidc-ui/install.sh +++ b/deploy/oidc-ui/install.sh @@ -7,7 +7,7 @@ if [ $# -ge 1 ] ; then fi NS=esignet -CHART_VERSION=0.0.1-test +CHART_VERSION=1.5.0-develop echo Create $NS namespace kubectl create ns $NS diff --git a/helm/esignet/Chart.yaml b/helm/esignet/Chart.yaml index 265aabe4c..d23e1a56d 100644 --- a/helm/esignet/Chart.yaml +++ b/helm/esignet/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: esignet description: A Helm chart for MOSIP esignet module type: application -version: 0.0.1-test +version: 1.5.0-develop appVersion: "" dependencies: - name: common diff --git a/helm/esignet/values.yaml b/helm/esignet/values.yaml index 24fed18f2..d2d6a0d34 100644 --- a/helm/esignet/values.yaml +++ b/helm/esignet/values.yaml @@ -53,7 +53,7 @@ service: image: registry: docker.io repository: mosipdev/esignet - tag: develop + tag: release-1.5.x ## Specify a imagePullPolicy ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' ## ref: http://kubernetes.io/docs/user-guide/images/#pre-pulling-images diff --git a/helm/oidc-ui/Chart.yaml b/helm/oidc-ui/Chart.yaml index 1993fec29..e54a454e9 100644 --- a/helm/oidc-ui/Chart.yaml +++ b/helm/oidc-ui/Chart.yaml @@ -2,7 +2,7 @@ apiVersion: v2 name: oidc-ui description: A Helm chart for MOSIP OIDC UI module type: application -version: 0.0.1-test +version: 1.5.0-develop appVersion: "" dependencies: - name: common diff --git a/helm/oidc-ui/values.yaml b/helm/oidc-ui/values.yaml index 5c7b25212..db05da2aa 100755 --- a/helm/oidc-ui/values.yaml +++ b/helm/oidc-ui/values.yaml @@ -52,7 +52,7 @@ service: image: registry: docker.io repository: mosipdev/oidc-ui - tag: develop + tag: release-1.5.x ## Specify a imagePullPolicy ## Defaults to 'Always' if image tag is 'latest', else set to 'IfNotPresent' diff --git a/partner-onboarder/install.sh b/partner-onboarder/install.sh index ed442938d..1243b4001 100755 --- a/partner-onboarder/install.sh +++ b/partner-onboarder/install.sh @@ -21,7 +21,7 @@ if [ "$flag" = "n" ]; then fi NS=esignet -CHART_VERSION=0.0.1-develop +CHART_VERSION=1.5.0-ES-develop echo Create $NS namespace kubectl create ns $NS || true diff --git a/partner-onboarder/values.yaml b/partner-onboarder/values.yaml index c6adfd94c..691725e11 100644 --- a/partner-onboarder/values.yaml +++ b/partner-onboarder/values.yaml @@ -1,7 +1,7 @@ -image: - registry: docker.io - repository: mosipdev/partner-onboarder - tag: develop +#image: +# registry: docker.io +# repository: mosipdev/partner-onboarder +# tag: develop onboarding: modules: @@ -17,7 +17,7 @@ onboarding: # ns_esignet: esignet # ns_signup: signup # secrets: -# s3: +# s3: # s3-user-secret: 'password' # volumes: # reports: From 1013b060c2d587657488c0f06e8d23ea39916760 Mon Sep 17 00:00:00 2001 From: ckm007 Date: Fri, 4 Oct 2024 15:03:11 +0530 Subject: [PATCH 02/80] [DSD-6382] updated changes as reported during dev round Signed-off-by: ckm007 --- deploy/README.md | 11 ++++-- ...-cm.yaml => esignet-global-cm.yaml.sample} | 0 deploy/install-prereq.sh | 32 ++++++----------- deploy/postgres/install.sh | 29 ++++++++++++---- deploy/postgres/postgres-init.sh | 6 ++-- deploy/softhsm/install.sh | 34 +++++++++++++++++++ deploy/{ => softhsm}/softhsm-values.yaml | 0 7 files changed, 77 insertions(+), 35 deletions(-) rename deploy/{esignet-global-cm.yaml => esignet-global-cm.yaml.sample} (100%) create mode 100644 deploy/softhsm/install.sh rename deploy/{ => softhsm}/softhsm-values.yaml (100%) diff --git a/deploy/README.md b/deploy/README.md index d1ca09675..beb32572f 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -24,9 +24,14 @@ * __Logging__ : Setup logging as per [steps](https://github.com/mosip/k8s-infra/tree/v1.2.0.2/logging). * __Monitoring__ : Setup monitoring consisting elasticsearch, kibana, grafana using [steps](https://github.com/mosip/k8s-infra/tree/v1.2.0.2/monitoring). ### Install Pre-requisites -``` -./install-prereq.sh -``` +* `esignet-global` configmap: For eSignet K8's env, `esignet-global` configmap in `esignet` namespace contains Domain related information. Follow below steps to add domain details for `esignet-global` configmap. + * Make sure kubeconfig file is already set and k8 cluster is accessible and kubectl is installed. + * Copy `esignet-global-cm.yaml.sample` to `esignet-global-cm.yaml`. + * Update the domain names in `esignet-global-cm.yaml` correctly for your environment. +* Install pre-requisites + ``` + ./install-prereq.sh + ``` ### Initialise pre-requisites * Update values file for postgres init [here](postgres/init_values.yaml). * Execute `initialise-prereq.sh` script to initialise postgres and keycloak and set esignet captcha. diff --git a/deploy/esignet-global-cm.yaml b/deploy/esignet-global-cm.yaml.sample similarity index 100% rename from deploy/esignet-global-cm.yaml rename to deploy/esignet-global-cm.yaml.sample diff --git a/deploy/install-prereq.sh b/deploy/install-prereq.sh index ee18d008c..b74765fc9 100755 --- a/deploy/install-prereq.sh +++ b/deploy/install-prereq.sh @@ -8,8 +8,6 @@ if [ $# -ge 1 ]; then fi ROOT_DIR=$(pwd) -SOFTHSM_NS=softhsm -SOFTHSM_CHART_VERSION=12.0.1 function prompt_for_deployment() { local module_name=$1 @@ -30,36 +28,26 @@ function prompt_for_deployment() { function installing_prerequisites() { - helm repo add mosip https://mosip.github.io/mosip-helm - helm repo update - - # Create esignet, softhsm namespace if not present - kubectl create ns esignet || true - kubectl create ns "$SOFTHSM_NS" || true - # Apply esignet-global config-map - kubectl apply -f esignet-global-cm.yaml - - echo "Istio label" - kubectl label ns "$SOFTHSM_NS" istio-injection=enabled --overwrite - - # Deploy Softhsm for Esignet. - echo "Installing Softhsm for esignet" - helm -n "$SOFTHSM_NS" install esignet-softhsm mosip/softhsm -f softhsm-values.yaml --version "$SOFTHSM_CHART_VERSION" --wait - echo "Installed Softhsm for esignet" + echo "Creating esignet-global configmap in esignet namespace" + kubectl -n esignet apply -f esignet-global-cm.yaml - declare -a modules=("istio-gateway" "postgres" "keycloak" "kafka" "redis") + declare -a modules=("istio-gateway" "postgres" "keycloak" "kafka" "redis" "softhsm") declare -A prompts=( - ["keycloak"]="Do you want to deploy keycloak in the keycloak namespace?" - ["kafka"]="Do you want to deploy Kafka in the kafka namespace?" + ["softhsm"]="Do you want to install softhsm for esignet service in softhsm namespace? Opt "n" in case it already exists in Softhsm namespace: " + ["keycloak"]="Do you want to deploy keycloak in the keycloak namespace? Opt "n" in case it already exists in keycloak namespace : " + ["kafka"]="Do you want to deploy Kafka in the kafka namespace? Opt "n" in case it already exists in kafka namespace : " + ["redis"]="Do you want to deploy redis in Redis namespace? Opt "n" in case it already exists in Redis namespace : " ) echo "Installing prerequisite services" for module in "${modules[@]}"; do - if [ "$module" == "istio-gateway" ] || [ "$module" == "redis" ] || [ "$module" == "postgres" ]; then + if [ "$module" == "istio-gateway" ] || [ "$module" == "postgres" ]; then cd "$ROOT_DIR/$module" ./install.sh + elif [[ -n "${prompts[$module]}" ]]; then + prompt_for_deployment "$module" "${prompts[$module]}" fi done echo "All prerequisite services deployed successfully." diff --git a/deploy/postgres/install.sh b/deploy/postgres/install.sh index 22f017242..7bc4bc687 100755 --- a/deploy/postgres/install.sh +++ b/deploy/postgres/install.sh @@ -55,20 +55,35 @@ function installing_postgres() { # Prompt the user if they want to install PostgreSQL while true; do - read -p "Do you want to install Postgres? Opt for 'n' if you have Postgres already installed. (y/n): " answer + read -p "Do you want to install default Postgres in esignet namespace? (y/n): " answer if [ "$answer" = "Y" ] || [ "$answer" = "y" ]; then echo "Continuing with Postgres server deployment..." - break + break # Proceed with the installation elif [ "$answer" = "N" ] || [ "$answer" = "n" ]; then - echo "Skipping Postgres installation. Running generate_secret.py to create Postgres secrets..." - python3 generate-secret-cm.py # Ensure that Python and the script are available in the environment - echo "Secrets generated. Exiting script." - exit 0 # Exit the script after generating secrets + # Prompt the user for further options + while true; do + echo "You opted not to install Postgres. What would you like to do next?" + echo "1. Skip Postgres server installation and configuration in esignet namespace." + echo "2. Configure external Postgres details by generating secrets and configmap in esignet namespace." + + read -p "Enter your choice (1/2): " option + + if [ "$option" = "1" ]; then + echo "Skipping Postgres server installation and configuration in esignet namespace." + exit 0 # Exit the script as the user chose to skip Postgres installation + elif [ "$option" = "2" ]; then + echo "Running generate_secret.py to create Postgres secrets and configmap..." + python3 generate-secret-cm.py # Ensure Python and the script are available in the environment + echo "Secrets generated successfully." + exit 0 # Exit the script after generating secrets and configmap + else + echo "Not a correct option. Please try again or press Ctrl + C to exit." + fi + done else echo "Please provide a correct option (Y or N)" fi done - # set commands for error handling. set -e set -o errexit ## set -e : exit the script if any statement returns a non-true return value diff --git a/deploy/postgres/postgres-init.sh b/deploy/postgres/postgres-init.sh index 7b0068fdf..91029570f 100755 --- a/deploy/postgres/postgres-init.sh +++ b/deploy/postgres/postgres-init.sh @@ -28,15 +28,15 @@ function initialize_db() { then echo Removing existing mosip_esignet installation and secret helm -n $NS delete esignet-postgres-init || true - kubectl delete secret db-common-secrets -n $NS || true + kubectl -n NS delete secret db-common-secrets || true echo Initializing DB helm -n $NS install esignet-postgres-init mosip/postgres-init --version $CHART_VERSION -f init_values.yaml --wait --wait-for-jobs break elif [ "$yn" = "N" ] || [ "$yn" = "n" ]; then - echo "Skipping postgres initialisation as per your input" + echo "Skipping eSignet postgres DB initialisation as per your input" break else - echo "Incorrect Input" + echo "Incorrect Input. Please choose again" break fi done diff --git a/deploy/softhsm/install.sh b/deploy/softhsm/install.sh new file mode 100644 index 000000000..cbd47995e --- /dev/null +++ b/deploy/softhsm/install.sh @@ -0,0 +1,34 @@ +#!/bin/bash +# Installs Softhsm service for Esignet +## Usage: ./install.sh [kubeconfig] + +if [ $# -ge 1 ] ; then + export KUBECONFIG=$1 +fi + +NS=softhsm +CHART_VERSION=12.0.1 + +function installing_softhsm() { + echo Create $NS namespaces + kubectl create ns $NS || true + + echo Istio label + kubectl label ns $NS istio-injection=enabled --overwrite + helm repo update + + # Deploy Softhsm for Esignet. + echo "Installing Softhsm for esignet" + helm -n "$SOFTHSM_NS" install esignet-softhsm mosip/softhsm -f softhsm-values.yaml --version "$SOFTHSM_CHART_VERSION" --wait + echo "Installed Softhsm for esignet" + + return 0 +} + +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes +installing_softhsm # calling function diff --git a/deploy/softhsm-values.yaml b/deploy/softhsm/softhsm-values.yaml similarity index 100% rename from deploy/softhsm-values.yaml rename to deploy/softhsm/softhsm-values.yaml From 576292de8b1b9740cea07a72e00342103fc52cd3 Mon Sep 17 00:00:00 2001 From: ckm007 Date: Fri, 4 Oct 2024 17:52:36 +0530 Subject: [PATCH 03/80] [DSD-6382] adding fixes for issues reported during dev round Signed-off-by: ckm007 --- deploy/.gitignore | 1 + deploy/README.md | 1 - deploy/initialise-prereq.sh | 19 +++++++++++--- deploy/install-prereq.sh | 3 +-- deploy/postgres/.postgres-init.sh.swp | Bin 0 -> 1024 bytes deploy/postgres/postgres-init.sh | 2 +- deploy/redis/install.sh | 34 ++++++++++++++++++++++---- helm/esignet/values.yaml | 8 +++--- 8 files changed, 51 insertions(+), 17 deletions(-) create mode 100644 deploy/.gitignore create mode 100644 deploy/postgres/.postgres-init.sh.swp diff --git a/deploy/.gitignore b/deploy/.gitignore new file mode 100644 index 000000000..5440660c2 --- /dev/null +++ b/deploy/.gitignore @@ -0,0 +1 @@ +esignet-global-cm.yaml diff --git a/deploy/README.md b/deploy/README.md index beb32572f..eb16098e4 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -25,7 +25,6 @@ * __Monitoring__ : Setup monitoring consisting elasticsearch, kibana, grafana using [steps](https://github.com/mosip/k8s-infra/tree/v1.2.0.2/monitoring). ### Install Pre-requisites * `esignet-global` configmap: For eSignet K8's env, `esignet-global` configmap in `esignet` namespace contains Domain related information. Follow below steps to add domain details for `esignet-global` configmap. - * Make sure kubeconfig file is already set and k8 cluster is accessible and kubectl is installed. * Copy `esignet-global-cm.yaml.sample` to `esignet-global-cm.yaml`. * Update the domain names in `esignet-global-cm.yaml` correctly for your environment. * Install pre-requisites diff --git a/deploy/initialise-prereq.sh b/deploy/initialise-prereq.sh index a8259252f..e5723ab93 100755 --- a/deploy/initialise-prereq.sh +++ b/deploy/initialise-prereq.sh @@ -48,11 +48,22 @@ function initialising_Prerequisites() { echo Please enter the recaptcha admin secret key for domain $ESIGNET_HOST read ESECRET_KEY - echo Setting up captcha secrets - kubectl -n $NS create secret generic esignet-captcha --from-literal=esignet-captcha-site-key=$ESITE_KEY --from-literal=esignet-captcha-secret-key=$ESECRET_KEY --dry-run=client -o yaml | kubectl apply -f - +while true; do + read -p "Do you want to continue configuring Captcha secrets for esignet ? (y/n) : " ans + if [ $ans='Y' ] || [ $ans='y' ]; then + echo "Please create captcha site and secret key for esignet domain: esignet.sandbox.xyz.net" + echo "Setting up captcha secrets" + kubectl -n $NS create secret generic esignet-captcha --from-literal=esignet-captcha-site-key=$ESITE_KEY --from-literal=esignet-captcha-secret-key=$ESECRET_KEY --dry-run=client -o yaml | kubectl apply -f - + + echo Setting up dummy values for esignet misp license key + kubectl -n $NS create secret generic esignet-misp-onboarder-key --from-literal=mosip-esignet-misp-key='' --dry-run=client -o yaml | kubectl apply -f - + elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then + exit 1 + else + echo "Please provide a correct option (Y or N)" + fi +done - echo Setting up dummy values for esignet misp license key - kubectl -n $NS create secret generic esignet-misp-onboarder-key --from-literal=mosip-esignet-misp-key='' --dry-run=client -o yaml | kubectl apply -f - echo "All prerequisite services initialised successfully." return 0 diff --git a/deploy/install-prereq.sh b/deploy/install-prereq.sh index b74765fc9..dc5d4441d 100755 --- a/deploy/install-prereq.sh +++ b/deploy/install-prereq.sh @@ -37,13 +37,12 @@ function installing_prerequisites() { ["softhsm"]="Do you want to install softhsm for esignet service in softhsm namespace? Opt "n" in case it already exists in Softhsm namespace: " ["keycloak"]="Do you want to deploy keycloak in the keycloak namespace? Opt "n" in case it already exists in keycloak namespace : " ["kafka"]="Do you want to deploy Kafka in the kafka namespace? Opt "n" in case it already exists in kafka namespace : " - ["redis"]="Do you want to deploy redis in Redis namespace? Opt "n" in case it already exists in Redis namespace : " ) echo "Installing prerequisite services" for module in "${modules[@]}"; do - if [ "$module" == "istio-gateway" ] || [ "$module" == "postgres" ]; then + if [ "$module" == "istio-gateway" ] || [ "$module" == "postgres" ] || [ "$module" == "redis" ]; then cd "$ROOT_DIR/$module" ./install.sh elif [[ -n "${prompts[$module]}" ]]; then diff --git a/deploy/postgres/.postgres-init.sh.swp b/deploy/postgres/.postgres-init.sh.swp new file mode 100644 index 0000000000000000000000000000000000000000..1521d8eb2bde28879d06cfa52b76c28b6ae4816d GIT binary patch literal 1024 zcmYc?$V<%2S1{4DU_b%8^%xmSQj;_C@^wutEm5Q}I1qI}Wx76zC7C6qDXF@~CPoGr k>I(9UOVW!{i}hg)-ORkq620OK43(n-qaiRF0`v$00FI6r!~g&Q literal 0 HcmV?d00001 diff --git a/deploy/postgres/postgres-init.sh b/deploy/postgres/postgres-init.sh index 91029570f..aeb6d538d 100755 --- a/deploy/postgres/postgres-init.sh +++ b/deploy/postgres/postgres-init.sh @@ -16,7 +16,7 @@ function initialize_db() { if [ "$ans" = "Y" ] || [ "$ans" = "y" ]; then break elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then - exit + exit 1 else echo "Please provide a correct option (Y or N)" fi diff --git a/deploy/redis/install.sh b/deploy/redis/install.sh index 7a33fd5ae..9bf297b73 100755 --- a/deploy/redis/install.sh +++ b/deploy/redis/install.sh @@ -6,13 +6,37 @@ if [ $# -ge 1 ] ; then export KUBECONFIG=$1 fi -NS=redis -CHART_VERSION=17.3.14 +function installing_redis() { -echo Create $NS namespace -kubectl create ns $NS + while true; do + read -p "Do you want to install Redis in redis namespace? (y/n) :" ans + if [ "$ans" = "n" ] || [ "$ans" = "N" ]; then + read -p "Please confirm if redis-config is already present in redis namespace. (y/n):" response + if [ "$response" = "Y" ] || [ "$response" = "y" ]; then + echo "Skipping Redis installation as well as redis-config creation." + exit 1 + elif [ "$response" = "N" ] || [ "$response" = "n" ]; then + echo "Skipping Redis installation and continuing with redis-config creation." + kubectl apply -f redis-config.yaml + echo "redis-config configmap creation completed." + exit 1 + else + echo "Incorrect response. Please re-execute the redis installation script." + exit 1 + fi + elif [ "$ans" = "y" ] || [ "$ans" = "Y" ]; then + break + else + echo "Please provide a correct option (Y or N)" + fi + done + + NS=redis + CHART_VERSION=17.3.14 + + echo Create $NS namespace + kubectl create ns $NS || true -function installing_redis() { echo Istio label kubectl label ns $NS istio-injection=enabled --overwrite diff --git a/helm/esignet/values.yaml b/helm/esignet/values.yaml index d2d6a0d34..62a8cf442 100644 --- a/helm/esignet/values.yaml +++ b/helm/esignet/values.yaml @@ -273,22 +273,22 @@ extraEnvVars: | - name: DATABASE_HOST valueFrom: configMapKeyRef: - name: postgres-config + name: esignet-postgres-config key: database-host - name: DATABASE_PORT valueFrom: configMapKeyRef: - name: postgres-config + name: esignet-postgres-config key: database-port - name: DATABASE_NAME valueFrom: configMapKeyRef: - name: postgres-config + name: esignet-postgres-config key: database-name - name: DATABASE_USERNAME valueFrom: configMapKeyRef: - name: postgres-config + name: esignet-postgres-config key: database-username - name: DB_DBUSER_PASSWORD valueFrom: From 7a751a08528dec6689f50c473f7cac432fea76b5 Mon Sep 17 00:00:00 2001 From: ckm007 Date: Fri, 4 Oct 2024 17:57:32 +0530 Subject: [PATCH 04/80] [DSD-6382] removing swp file added by mistake Signed-off-by: ckm007 --- deploy/postgres/.gitignore | 1 + deploy/postgres/.postgres-init.sh.swp | Bin 1024 -> 0 bytes 2 files changed, 1 insertion(+) delete mode 100644 deploy/postgres/.postgres-init.sh.swp diff --git a/deploy/postgres/.gitignore b/deploy/postgres/.gitignore index 5e1d061c3..38b1baeae 100644 --- a/deploy/postgres/.gitignore +++ b/deploy/postgres/.gitignore @@ -1,3 +1,4 @@ db-common-secrets.yaml esignet-postgres-postgresql.yaml postgres-host.yaml +.*.swp diff --git a/deploy/postgres/.postgres-init.sh.swp b/deploy/postgres/.postgres-init.sh.swp deleted file mode 100644 index 1521d8eb2bde28879d06cfa52b76c28b6ae4816d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1024 zcmYc?$V<%2S1{4DU_b%8^%xmSQj;_C@^wutEm5Q}I1qI}Wx76zC7C6qDXF@~CPoGr k>I(9UOVW!{i}hg)-ORkq620OK43(n-qaiRF0`v$00FI6r!~g&Q From db488a1719a737607746dcac9a215b3d052c743f Mon Sep 17 00:00:00 2001 From: ckm007 Date: Fri, 4 Oct 2024 18:41:49 +0530 Subject: [PATCH 05/80] [DSD-6382] increased initialDelaySeconds in esignet helm Signed-off-by: ckm007 --- deploy/captcha/install.sh | 18 ++++++++++++++++++ deploy/esignet/install.sh | 25 ++++++++++++++++++++----- deploy/oidc-ui/install.sh | 22 +++++++++++++++++----- helm/esignet/values.yaml | 6 +++--- 4 files changed, 58 insertions(+), 13 deletions(-) diff --git a/deploy/captcha/install.sh b/deploy/captcha/install.sh index 6ba347253..e7d0b5cb1 100755 --- a/deploy/captcha/install.sh +++ b/deploy/captcha/install.sh @@ -13,6 +13,24 @@ echo Create $NS namespace kubectl create ns $NS function installing_captcha() { + + while true; do + read -p "Do you want to continue installing captcha validation service? (y/n): " + if [ "$ans" = "Y" ] || [ "$ans" = "y" ]; then + break + elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then + exit 1 + else + echo "Please provide a correct option (Y or N)" + fi + done + + NS=captcha + CHART_VERSION=0.1.0-develop + + echo Create $NS namespace + kubectl create ns $NS + echo Istio label kubectl label ns $NS istio-injection=disabled --overwrite diff --git a/deploy/esignet/install.sh b/deploy/esignet/install.sh index e6a3611ad..9b70b8365 100755 --- a/deploy/esignet/install.sh +++ b/deploy/esignet/install.sh @@ -6,16 +6,31 @@ if [ $# -ge 1 ] ; then export KUBECONFIG=$1 fi -NS=esignet -CHART_VERSION=1.5.0-develop - -ESIGNET_HOST=$(kubectl -n esignet get cm esignet-global -o jsonpath={.data.mosip-esignet-host}) - echo Create $NS namespace kubectl create ns $NS function installing_esignet() { + while true; do + read -p "Do you want to continue installing esignet services? (y/n): " + if [ "$ans" = "Y" ] || [ "$ans" = "y" ]; then + break + elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then + exit 1 + else + echo "Please provide a correct option (Y or N)" + fi + done + + + NS=esignet + CHART_VERSION=1.5.0-develop + + ESIGNET_HOST=$(kubectl -n esignet get cm esignet-global -o jsonpath={.data.mosip-esignet-host}) + + echo Create $NS namespace + kubectl create ns $NS || true + echo Istio label helm repo add mosip https://mosip.github.io/mosip-helm helm repo update diff --git a/deploy/oidc-ui/install.sh b/deploy/oidc-ui/install.sh index 76faec6de..d06b3931d 100755 --- a/deploy/oidc-ui/install.sh +++ b/deploy/oidc-ui/install.sh @@ -6,13 +6,25 @@ if [ $# -ge 1 ] ; then export KUBECONFIG=$1 fi -NS=esignet -CHART_VERSION=1.5.0-develop +function installing_oidc-ui() { -echo Create $NS namespace -kubectl create ns $NS + while true; do + read -p "Do you want to continue installing OIDC ui? (y/n) :" + if [ "$ans" = "Y" ] || [ "$ans" = "y" ]; then + break + elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then + exit 1 + else + echo "Please provide a correct option (Y or N)" + fi + done + + NS=esignet + CHART_VERSION=1.5.0-develop + + echo Create $NS namespace + kubectl create ns $NS -function installing_oidc-ui() { echo Istio label kubectl label ns $NS istio-injection=enabled --overwrite diff --git a/helm/esignet/values.yaml b/helm/esignet/values.yaml index 62a8cf442..49fe555b6 100644 --- a/helm/esignet/values.yaml +++ b/helm/esignet/values.yaml @@ -77,7 +77,7 @@ startupProbe: httpGet: path: /v1/esignet/actuator/health port: 8088 - initialDelaySeconds: 0 + initialDelaySeconds: 240 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 30 @@ -88,7 +88,7 @@ livenessProbe: httpGet: path: /v1/esignet/actuator/health port: 8088 - initialDelaySeconds: 20 + initialDelaySeconds: 260 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 6 @@ -99,7 +99,7 @@ readinessProbe: httpGet: path: /v1/esignet/actuator/health port: 8088 - initialDelaySeconds: 0 + initialDelaySeconds: 240 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 6 From 3c3e3ad54ad6abd0b75d11afa7e235232b8a9c4a Mon Sep 17 00:00:00 2001 From: ckm007 Date: Fri, 4 Oct 2024 19:10:18 +0530 Subject: [PATCH 06/80] [DSD-6382] updated healthcheck configurations Signed-off-by: ckm007 --- helm/esignet/values.yaml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/helm/esignet/values.yaml b/helm/esignet/values.yaml index 49fe555b6..b2127eaeb 100644 --- a/helm/esignet/values.yaml +++ b/helm/esignet/values.yaml @@ -77,10 +77,10 @@ startupProbe: httpGet: path: /v1/esignet/actuator/health port: 8088 - initialDelaySeconds: 240 + initialDelaySeconds: 180 periodSeconds: 10 timeoutSeconds: 5 - failureThreshold: 30 + failureThreshold: 60 successThreshold: 1 livenessProbe: @@ -88,7 +88,7 @@ livenessProbe: httpGet: path: /v1/esignet/actuator/health port: 8088 - initialDelaySeconds: 260 + initialDelaySeconds: 200 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 6 @@ -99,7 +99,7 @@ readinessProbe: httpGet: path: /v1/esignet/actuator/health port: 8088 - initialDelaySeconds: 240 + initialDelaySeconds: 180 periodSeconds: 10 timeoutSeconds: 5 failureThreshold: 6 From 8d373b477645cc931be2779846fa04ab28aac48a Mon Sep 17 00:00:00 2001 From: ckm007 Date: Fri, 4 Oct 2024 19:30:05 +0530 Subject: [PATCH 07/80] [DSD-6382] removed unused clusterrolebinding Signed-off-by: ckm007 --- .../esignet/templates/clusterrolebinding.yaml | 19 ------------------- .../oidc-ui/templates/clusterrolebinding.yaml | 19 ------------------- 2 files changed, 38 deletions(-) delete mode 100644 helm/esignet/templates/clusterrolebinding.yaml delete mode 100644 helm/oidc-ui/templates/clusterrolebinding.yaml diff --git a/helm/esignet/templates/clusterrolebinding.yaml b/helm/esignet/templates/clusterrolebinding.yaml deleted file mode 100644 index e44824537..000000000 --- a/helm/esignet/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -kind: ClusterRoleBinding -apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} -metadata: - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - name: {{ template "common.names.fullname" . }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "common.names.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "esignet.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} diff --git a/helm/oidc-ui/templates/clusterrolebinding.yaml b/helm/oidc-ui/templates/clusterrolebinding.yaml deleted file mode 100644 index a839a9b4c..000000000 --- a/helm/oidc-ui/templates/clusterrolebinding.yaml +++ /dev/null @@ -1,19 +0,0 @@ -kind: ClusterRoleBinding -apiVersion: {{ include "common.capabilities.rbac.apiVersion" . }} -metadata: - labels: {{- include "common.labels.standard" . | nindent 4 }} - {{- if .Values.commonLabels }} - {{- include "common.tplvalues.render" ( dict "value" .Values.commonLabels "context" $ ) | nindent 4 }} - {{- end }} - name: {{ template "common.names.fullname" . }} - {{- if .Values.commonAnnotations }} - annotations: {{- include "common.tplvalues.render" ( dict "value" .Values.commonAnnotations "context" $ ) | nindent 4 }} - {{- end }} -roleRef: - apiGroup: rbac.authorization.k8s.io - kind: ClusterRole - name: {{ template "common.names.fullname" . }} -subjects: - - kind: ServiceAccount - name: {{ template "oidc-ui.serviceAccountName" . }} - namespace: {{ .Release.Namespace }} From e0461c84764073e2485b889cedb9dc140e89168b Mon Sep 17 00:00:00 2001 From: ase-101 Date: Sun, 6 Oct 2024 23:43:56 +0530 Subject: [PATCH 08/80] Updated readme, pom.xml. Added NoOpKeyBinder default implementation Signed-off-by: ase-101 --- docker-compose/dependent-docker-compose.yml | 2 +- docker-compose/docker-compose.yml | 8 +-- docs/design/eSignet-overview.md | 6 ++ docs/design/identity-assurance-flow.md | 45 ++++++++++++ docs/identity-assurance-flow-drawio.png | Bin 0 -> 524928 bytes esignet-core/pom.xml | 2 +- .../esignet/core/util/NoOpKeyBinderImpl.java | 37 ++++++++++ esignet-service/README.md | 65 +++--------------- .../resources/application-default.properties | 20 +----- .../resources/application-local.properties | 14 +--- .../src/main/resources/bootstrap.properties | 18 +++++ pom.xml | 4 -- 12 files changed, 127 insertions(+), 94 deletions(-) create mode 100644 docs/design/eSignet-overview.md create mode 100644 docs/design/identity-assurance-flow.md create mode 100644 docs/identity-assurance-flow-drawio.png create mode 100644 esignet-core/src/main/java/io/mosip/esignet/core/util/NoOpKeyBinderImpl.java diff --git a/docker-compose/dependent-docker-compose.yml b/docker-compose/dependent-docker-compose.yml index 3e749e669..b3d462420 100644 --- a/docker-compose/dependent-docker-compose.yml +++ b/docker-compose/dependent-docker-compose.yml @@ -17,7 +17,7 @@ services: restart: always mock-identity-system: - image: 'mosipdev/mock-identity-system:develop' + image: 'mosipdev/mock-identity-system:release-0.10.x' user: root ports: - 8082:8082 diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 754d7a6b6..2d438f128 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -10,7 +10,7 @@ services: - ./init.sql:/docker-entrypoint-initdb.d/init.sql mock-identity-system: - image: 'mosipdev/mock-identity-system:develop' + image: 'mosipdev/mock-identity-system:release-0.10.x' user: root ports: - 8082:8082 @@ -24,7 +24,7 @@ services: - database esignet: - image: 'mosipdev/esignet:develop' + image: 'mosipdev/esignet:release-1.5.x' user: root ports: - 8088:8088 @@ -42,9 +42,7 @@ services: - mock-identity-system esignet-ui: - build: - context: ../oidc-ui - dockerfile: Dockerfile + image: 'mosipdev/oidc-ui:release-1.5.x' user: root ports: - 3000:3000 diff --git a/docs/design/eSignet-overview.md b/docs/design/eSignet-overview.md new file mode 100644 index 000000000..421f6205d --- /dev/null +++ b/docs/design/eSignet-overview.md @@ -0,0 +1,6 @@ +# Overview + +eSignet offers a seamless and straightforward solution for incorporating an existing trusted identity database into the +digital realm via plugins. + +![esignet-architecture-overview.png](../esignet-architecture-overview.png) \ No newline at end of file diff --git a/docs/design/identity-assurance-flow.md b/docs/design/identity-assurance-flow.md new file mode 100644 index 000000000..d8741bae9 --- /dev/null +++ b/docs/design/identity-assurance-flow.md @@ -0,0 +1,45 @@ +# Overview + +A relying party could request for verified claims using the claims request parameter. eSignet pulls the existing claims +metadata on successful authentication of the user. If the existing claims metadata does not suffice the relying party request +then eSignet prompts the user to go through eKYC verification process. To handle eKYC verification process user will be +redirected to eSignet signup portal. On successful eKYC verification process, verified claim and its verification details +are stored in the integrated ID registry. As the verified claim and its metadata is stored, eSignet will be able to serve +the relying party's verified claims request. + +User must consent to go through the eKYC verification process. if the user denies to take the verification process, then +it is considered as consent rejection to share the requested verified claims with the relying party. + +If any one of the requested verified claim is mandatory, then user is prompted to go through eKYC verification process. +On confirmation, user is redirected to signup portal to carry out the verification process. If all the +requested verified claims are optional, no prompt is displayed. User is directly taken to the consent screen. +Option to choose eKYC verification process is supposed to be displayed in the consent screen in the later case(not implemented). + +# Changes required in eSignet + +* Authenticator interface: + * On successful authentication, integrated IDA system should return back claims metadata of an authenticated user. + * On KYC exchange, requested verified claims should be sent to the kyc_exchange method so the plugin should have all + the requested details to build the userinfo JWT with the requested verified claim details. + +* OIDC UI: + * After successful authentication, display requested claim availability & verification status to the user. So user can + take well-informed decision to agree or deny eKYC verification process. + * Authenticated user should be able to start a verification process in signup portal with the same authenticated context. + ID token based authentication of the user should be provisioned. + * If no claims are requested by the relying party, consent screen should be skipped. + * Logic to handle flawless resume of OIDC transaction after successful eKYC verification process. + +* Authorization Controller: + * oauth-details endpoint should support verified_claims in the current claims request parameter. + * consent-management should be modified to consider verified claims. + * id_token_hint request parameter part of the OIDC protocols 'authorize' call should be supported and should be be only + allowed for signup portal OIDC client ID. + * v3/authenticate endpoint should support new 'IDT' ACR and support ID token based authentication only when a cookie + exists with name equal to the 'sub' in the input ID token. Value of the matching cookie should have valid server nonce. + * New endpoint to fetch authenticated user's claim status in the integrated ID system. Mainly availability and verification status. + +# Sequence diagram: + +![identity-assurance-flow-drawio.png](../identity-assurance-flow-drawio.png) + diff --git a/docs/identity-assurance-flow-drawio.png b/docs/identity-assurance-flow-drawio.png new file mode 100644 index 0000000000000000000000000000000000000000..c108ff28bd8e7a80a40badc97603610b8246277b GIT binary patch literal 524928 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

6>TNmeg#D1yG=*Fl!L{;^Z$#&rlJa%^ zH-D1qI#}F34VFDkd6iC#lAzWqe*H2B?s}d{r*pNNjG6_`&f2qC*L(&+u4d^H?yRoW z;`vV}U)tNU`)qmNrW4Zmpj<6S7vVw6ru)r{7X_1?O^s&`?lO5D;IUBLEx@BE)T>hm z(*ClQ!Ei87^(yc(nVKU{-1wk;tDflH^5x6*H*7wWpOik;vgFG9LE@zV0Elwl1tCPg zl0_;z`-jQy)MIhwKSzmXYQ8b6JD*I|k1@(oOgulkz(R!7s1mutsAD*T@}WFHwLh_8 zLpK+aju-&xh%Za3Qx+4BaA}6;TacfI$QA)n@d%=~4@^XVM#5s&Ny59qvOVraZu!QP zPpXGI#l+OA;dr{n2=Pm^!foecbv>7U!RzWCDF=+^g4m?na_yZG zR>bc0CdBA+a?2Dv&X}^{!cdidQqHO)jhpKl3T95`L{c`_PNo6n6)%$zTh~`cemgWz z66|gPSvY@ojbI_6;kbKoo<}=@dvtk=#qN(*}BCt zt1s>!5-uoJYRf;hJ#eH)+*7~cRuQG8ar@GF1xeX16nTSZ9s1TbFuSFOv2v%mqIKI6 zqcma__vBk}X`c>R5G2?XzPUu&WMRNUDYNSh2P(L_FPOy0<|L@KzX4X49_L;?& z_&&K{FQq94FCi{Ub&M2^yg2xCzJ*BGa}^J6VaNBke4iNA{RBx5_KOiW@}l7~ClA+1 za|;iyHxb?38#~V==gHK})N!gwP_fU0ESz9_B-5xqcVS|1`aqEB^%GvUUd<1F&CG9{ z>75t7-9$TVX?wYPYoh5(Ncbch&n#0^P!e35azyaz*}+Xk@8(|P8a__TV|?B{CDu1- z$$*l#zN44(!NU)dsDetX^p!iPc?UAXeUfrt0vDHMZe{v&P-(xJvv_RA{Pt3b16HOl za;jxxcO>s<3sbRg4dAW~X^;>fx_L(;Q>DxxV20q!u#iPn1^bMRyHiRPD<3u3AJw=0 z&B`d{yXiOA3W@{_^xU@B+I}cj@Cf1PnUKfE-KV+`AJ1$6aS2=aIiL7bk~$zws{JBm zr4j@^#4M)>)ghqQu}Mzz7chwR&9@&SuzJ)`X9>Z!QL>n^NrCa%Lte9N|zeza_TD05F9Wvi^^ZY52-%CD4!mJ zJkbkCEQ(^Gmb2<&Uh|~(^JcntT=QygU7iY&uPfpv`qOr=8q_aZ8>yw4Vg%XfE#&3B zqIZ0G__LzzezIAbZq@e#EJWfXlSOHe4VG_qc<}8xvSLs6_iG+KXm8|O>vO*T!5OZ7 zgB*&$XM$jjBfY(vb*-4s48YP(-bPe()j_sOrcXSMg&?E3(jRwc0&UO?|w`(7=) z6XB(Ka#*)WVDtLZ3PERwr9kNosF6Fqc<;fow18C+rFY+Ri3UQE~`^|JiD-c<$xiJg$Qf#ehIQgfa96YR|?R(zQeDk*P2 zcm#FNd3xsd{S|0n8!JN?n>!8y8=l|$K%J|g+fURu;t)SsaFGTOD@4IVIto!gESNE~ zP(_LF9g^x-rdHQ1G$#SFI>o6jXWSpBZPfBY(>4~^6fVbdTmkV$B>x5c!sl}!>Uz3{j3-}C%vub2?Wh! zUR?zXa!HH_gg}*-7r9RfF7}F@l&&Z?XM0RoLi##DyC~{d_Zb6ab zYdN#)i1_5SJOi~;K-Y{Wx{iKA2&1#Z7vw$K5$B0-0pxiFtc-}{&x{4jOuW#HPfF-4 zaQt@?7e0Z=_#@>_XY!GZz6C-#jUlTFxuSH}WpbS@)M{G2!uUvIl!i^$BZnhiVS$#=*?!q#w?&&UQ3hdAwz9O5!ogyZ+ya z0gcmSu1V;PxNFtaBFHoqCi8y?z82zk0#aJ_Zu)@VQ6#MU&)&b|Jy_rw zN%xlOilh&u?U&Vz(Q!dTPz9a3)6zCpW?B~&3Y*O!z}C(*PZ2baXx!3vw6r5qA?eA|FgOa`;agD!0pCYEef` zsK)B~v0SO~GV^%XxV`?F98BbX5K*Tf3SrSxdXp4sW>l`>oVq>6RUyYhO%@aFHsZ>> z3vBzk5_$u3kB*@Tp%x<}BD+erV1;UuVF|(%W=}zRtMThwbO!7MGezRhsqdTB@%${m zui$|co&cYS<`t9LA>$+W@#P&wUFAyD))(cDA|n>{d9Gq1DyA-$ovg1Pfg*Y9%_=Sv9j}iJZ{rn(Y|OhJ@xq9%})u1MW=~k02Z0;DCUq*mj%g1;}&SJM6LBZL@uKY^les zmcY84GqQ)kqG(FG7cKYO3|FOVn5QCXne08Acty@FoUS`pPMBp3{pGchmlGc)7Y&T_zIZMKT1VuITZ{sF;b$ZGJZG z_hVw)3L~sFGH5x4JJQiRmCEFN8}qdY)&kRJcy>-B8Ug1X~Uc2=Sr6Di1y zG~B0bk1zd^7u5AOM~BjrE%KfRAiWdv&`s0wlcch8t1XctgVL}onIf5lgQgl@aVq|= zW4#}H5Dw<*oXs4%c~b`Bdp*HkwD?}!RB4IKs+HUsCpTW&S*ZC^>z;ZzAMsBzeJ?%@ zyE@z%+TwB&YMUN+LNVb+)&hM|X+w!aVuLc1tpy*(nLb4O{A%DZD zD-^{O8R40nLGZ>W_|&^mY#^46rc|Ip(k#yQ+7mHssK z$Cau_!QNyq?F#xmgy^9WSGBTLOl&V_B2w(fQsOsO2d(Z;C{0p)-~ZedN?Y=}%k}D? z?c?j1ng_YZ#heLCGw?w+>-NsGn)mvJqX|qDdsX4#tsY{T`@-|S9A3bZAIcC zql1io`q;7|k<6P5J?3jqwX!^L;wD-EBljmu^bv)Dw@>CDE8hBl?7e4DRo&Jm3b;X{ zZZ<)JNX|jB1j!i$$tp=ua?TjZAVG4HB$5;nkep12fJjnMGAN)V2`U0A$vY;TbEEK_8UBB4C{VKcPbrL|7uR?|4%dq zj@5sSXq<@~2H=r{N+fv|a6D}A18*_;-$4XWe`qkC{O)t&{J@NT`*uj&jw|Nh+Za(U zgz0xqdEAwN2vV^Ajhe!`zSa-+??7DnEupy5LuGy9Pj=$fFK>mH1ceiJ1UpZ!0T2BL z)>?ks$5wt@>`XJ^&P1MY;Og5%+OHbHf6Nu!BkJzF*dup3U~ue^V7Q@Pv{2~(_2Gjt zMCo~dU$=&YifaTNm^BV>>rcpC8-dEX3k9QO?OnO+V*o&zCkDz$&(_A01H^50^kVks z;YYh~29&Xw5d+$AdV19~65)hWS3GxS4E~$}*4`G2tpr%_r*)<8Pk;7>5n)2PTAFEU zuhLsgVeY&LVZ1Y~w4blKVnV5g$Ld@hfYO(XB9)!zA;SN}0^C0wiXs$5>qDK3-W=)o z2;jU8DUd7V`1Po-gcu*@*A|OcP<}eYARBe*XE_VQOui_wm}nFqOqR(g-h@0cK~Et| zPbUjYaAV}rFOhglrtW8Y6%TQ=>`=TbAt%}Io8VZ1B0W@fS;O3?SE4-N+sD=8^*qKm z22IY@jk`bTl^k~!J6sKro%%MM&UxUqmD_cvZ?+sdIs(JFOKi)~D+C4Q8W-7XcTd36 z)<;6`+GgPW+#( zAw*myt6Uf=&#v?M^s!IsGx;`@p(Z6z)e99B?u#ekCOC@f9Q#{oEqx8n1ps;&fn1(I zwwcqoiKq_@E@erW%VRylFdi}2)6I7oU_2l0gvQ(6f$_ZRC|ttwpox(E5&;uoCD1FS zf+nKB^!C9-B(o&)dbuHL7SL^E@C9*iFvYO!Lb#QCVMok@lTHw)n>q7l95L*71%_P> zh2+T8+2foQKo3!CHek`$1b*!fKEWR5j>f*x^|0T-Bd`I|KiRAJ+Xe101%6^Pq{KyO zFbC!7`4Jiy@WWbwKwD`%Xxm$*{p6rS#Uf{;;oeBOEdv3p!f``#&hk4Ld$r8C7nd>{C zh3I_&cgIZ4-Ryww)Kva#bIiT1P$Qup@)>FTl~+d<#EX-cCz@({@5+tqo&KSkjY_qX z2mt;SxMx_ea`B6AW=&2T&kZb-%h-9h|7vB zPhg*n)-lQ5+E32Aa1a}r9yxJ>xGTTCu8y+h)^`{`@&#f=gv7!L-|>mVmEgD{mlcg^ zCaH8E?2Y1QNi+qmidwVCz=ORuhJ*=v+19yDFhC1UlU_KZ4i6V~mTJ!BgV7jghV?1l z`-njujcw@i>asBs60lNPPm+!{-xlC=p;qu!YINZU3A7#FEl4woE}804ysZpl0TXMzO-``C*Z36iyvhj@o7DW_2AP)Q z{Xf^S)+dTz)2?&Cdu!~!w<0Tko5T+5NzD0%wM$MN^lbQZ9#N)tXAbNI1JlJ(GGH$Z z??T>@N?sHLzcUGcTOP*Ra+(w_aLhw*&U+P4nn8ZaH2!w4ei%E9ps$FW_+YoQ!QqEJ zpG6S{q;s2*Bm-mEtR>AmP1ot*M(6?zk%GCC41cKn>G>?LNX_6sj0Gn2RQog-4m8&! zrM2|ru*bqgI1fF9(HYQ8`z%?*VuZqlH_|Y`99hNq$hXaD?3cwpOc4tQg^BSV3f*7N za99gYOuGFmmKGH|I)7X0LC%)br9wfgCy3xi=mKn*SBKY>gZ=nVrrYPR;;i=~9Zfng z`@JwNB%u+?=SHLwe5=d)%p1j0&ETuXYQHCB=wKny1#dkV;QW!q!s#0K+0GGi2`N~= zsWV-{2kXZQ>qin&JSq%qZ~90kdNn`fzPt0D+=9(P4HpP8MC5eVFLpPxwQLI&S!`j~ zvYKa9Md-mSG)K@g@6SS;8azZOxt59p&4M_8Sg9}!J|e{D2@BjV6fShZ8rB_Wkb9tF zKiTzgn%*A^R;_d=N$H?kNeHuGf+yP0`9E}>;Hnhh%p%>kAzixc_%r<7(8o9 z%=acgVOT|U;Y$v*YWkR1G+sGOb|qEOJA1+iUS_7^AM6QbFcKVrPK^zADqj?Bp07AK zGBOkbj)sA+gbSoF#OXsi^6?<~oDIQoc7N#e>Wx$mVSut{t%`oi2 z*|(Em7pF<#0s$=4Z$&HOO843Jf!kuLu!`97t~&>-NCN*;OTW0+8m;1OUV2R$w2H)e z=7&{a714!0v_i&L@I^fH6ml9(!QLs<3{nmEw#lgu-l)!UeutXe&Cd=N!rO<9`t8FrtLD-XpS6C&J&iW*Rt*Oz}G>*q*=* zdMZ{Hu3m%34_qd@mTU>;ygU|vSLI$J-pv2t0EIQi89Ry5fvNz}Wo;ruHTWH0>-^A5 z@G69GA=w9}N;)9;I7OZxzeb0B$xBKYfrBB@!G0nEK)(*LKyRcH>?h&nPM%U7*iV*w z6LREmBXr>)aQKhT%m3d9|HnpXab-GU6T-o4RY_8eGKvJN{pigXU?=9A-}!N{6D`0- zX4tf3l|be~RI^63gcJpDbW#mu$*>dAh2wBscjx!}$k+~*=P=y0IjjW646!F>-VVZ^p4_ z_JDe5ICMm+1x31+&AwG2y>YefoZc*AqJIqBc4L%qHkKX~^$|RpmMKERq$>jZFeXlA zSQIvLD!oy^0kJ?TY=9%l|4{_FzX5a{e*%@V5=yk=0F-kF7Fiv1_Y1MpK9cXt#q z_f#u5+UkJfGf8{FHp$FG$jcMy^Z+p8+AoD(nyV#eYWx<=O=164U*g@$L{W;k`K{+l z_k3aIifd-NTp=Lns^49>`5ZjqPq!fT19V0)kT3XiP0G$~F1~*~bisj%J4O!po|2$n zlA>9^v(`NhfFHL^yL7K#sHaIaMRfGUa$6&4SD>KJVce}DHn;ZE4#uBe z(?n%8UFA`TxMshWPC|-u9>{8EhRXmV>JPk)C-N5lqjsphIr`zD5hCu_LR+tXC=got z-hp4Twt{*@UhiizIs#SUme4^#(LK`6*cTsoYV#@*btzDgX#VYnQ|2byG#jnbf(N8ame-L z^m1LP8?J|deVE~tyX%wH=0__p{_gqzp1$?uE)tUHNMQB=((=PxuMYZ6Sg5QMzLJx^ zM%*#HOtzLYV~9QQPck}l(2fmgP&E6kPM~R!2>ABk?zOJs)TdDYa|80kYT&txH|r?q zgj+~1;U;4?mH?)gcd|lD+$ek;=A4$_%=H_!5EJHf$OKHOg;tyqY?vrCc z2=0+-ulu_*ub>y6(sG|iT&??I$x)=UAO|;F{f79Gf^{DZHvzWMs427Y8LFTDFZhQZ zw~7s$Ua+I#?(qW{z~CQvzU6h?yl);PY(2Xc2Gs(|}i?kcq?|H$q)^zd)=T@kOA;y}b;aCVxsh#4uW% zH8*g-_Gb?|9XUK3L*^b$oplNFTb(EyklkLc0o;V|QMJdASof%PFYd(%8I`^U6^Xa0 zVM+Y%umsG~c zj;1*^V0XI-z+cdosWQLU1LO54>sKI7Rfh;$T+bryCWLOI4Xo^)C*jZzbbH&mk6gQV z8us(-kG1D!^U1uNUvATjl>v^ULN3~++^o*qA!o5nBG<@&?G5)6@x;ro4>%;`b5dEfW$1EL$J>TG@;9JJmZa@M-J!eViC#@c`o*Hvxmt8DMvDi{CzKqa5 zxr)UD#X85v!Ral3Fgjaz&gyD=ZsvXBT2__F5A;p`kk>cW^c9HT#?AQ-nE{5j9ILiBFzq%W=cNGBw7q@`%IksiOQ-M52aq4k^20sI5R{vg47GUK!=M2y7fe3`qU{QG6 z^PAgd4epZ@SKeDecJ(A;;UX>aqSl;Scl^PN)|yA{DcuuCUes%*bQyWk=M?lxfyj%x zTvtD`9|_Gu9KxTF@oO;K<9So8_IrBA2(|vphYla9MYxt`3`G4K(C4C0Q~h!!#F`HEt7 z0@ZtvGtK#3_a#|p4A{zU<{r=d%4f{nc7X=t+cAa^C~eK)n`M(KK(tNr`lf3}tD!jhdNp-9DYFajx}|8{Fagi2w0?`Rqe+=HZR;t;_b zh#k3Jr5z|lupl#@9!;fehpIyt5-f3t$9ub6BRatjTLMH^NC`}US7ZvgQF8%gl6*1Q z*-9)ZF9r=0y8XZba|WJa{aI8z2x(INE1mvVa$OVx{*9qbk(o~^*zXZ8wdpV>nYCp{ zH*S}^Vc}s=)R+e%9S5IGxcBLi` zKLbgf?UHEyJCsZ`2!9USPYD|#nP^u__J^oh#V*m_PM?Mgk_ll?_hTIJD(HeVVo0eJ z&ii(jnM+HYesv@iN+?k0BHs7IC3rC3q>6L2qnvO9e>aV{?@{z{!u(yzG7QLW*nj;v zK?IET`>m&_;1OF)?+^u!oYgE%HmV-i86wH*ewUZ<{%w(jEhPnZY-@mTSui8Ky9sw8d zA*H{;^1nHy?_uzP`X4sWr&(vo#)x*&od2QJBpw{X#uqOx7t6cO(UYj#)imcqqihqO803e>v-R z#nORH)CK?(QS1}6^W&DK=SxDeDA&`*_OIgCMJHhwEY=@=){SZblFOhh~u}yCg?H0HUa4_FpkAb2$H;hl6q zCr*hx41dE-@hA)SFifTt&wx5DxOBUh+Ut}AbujW7`uzkFFJyrD3qVgO$j;41EB1Cu zM7wGqeTe>}S~2^EkoA z2bn-RypG*fpN3RQp3^>pxIs`(6nl|z+W3BtwJ&!HOm3z)W3C=OjIN7ZIesSig z%$R9)LP7wny>j`D z4g!H{beeW&Ke4+FH=q}zo7ClmiQ(&2ejut2?n5N3-;$UbBHT!qf1?J|f;7#L-rfIK zs!1hZRAxb`2a$ICfkr+=_OVDSr3}=#5GZhIpg0zx$^0Rb8hj*Z(hO(tGSIZ^Ap{$I z66eh)RMm!C4Mci4D?sC`bf0W)`iewxAmkV_y?ArOJF9!54m2q$hc5fMb+0`uyn2=`LzI8L|*jh(Nl6+d)N11Z<9)@m58`CIpRbiF%VOkQlC0? zaQKiT$6onk;o2I8?~ndfwABrD1nszUeGQ)x)q}DC(g|^eu<94>aNytFfNVfs_vXqD zXGyr2KHf_;UxcvSS9y&8@za@(9|$+Yg&p2Y_yS3g10t+$rxY6k%AQkborYi*&Vn?R zSQpkrE7*67brf>38Q{*Io_3-jNP|X1IfvUS;Q{2I3(h;crT$-SB*ts`YaT({*>Q9t ztw{B8Y4S-!taUcD$=o1E5W42tuXfC@-w`$CVyz6L_x2zWLgIsN?KJ0Vks7S~vkg;o z5b1M6S{49B9);-K4Ye=SXfL!`U0;zvY2Y$IL%rF0BaT@)0%h%%C8U?D0Z6j;#oyg; zdJC~^!~WxLr>?^^Ov-V72XdjzCWL=TkF^|d$3oR*|41o^{cQ|B!B2w5N2)GQCP+L- z`0&YdpHr^fm#>Fx$Lh*7;nIhPDK|kP5oxw%7W`P>CKGCGsd%<&w!QQ7?Fx!m#onIw z$*&Ir9gj&r1a6UV{?IAXPxs*$(%;)Sm*fp0ZLuGSF(L?$EFeQBM;IZ>JIv&ph_H#P zC!o4elnakW8nq)}JN78s%JuHzT@7G(1@N6Sfz<$amx*lt)Y=7tywhx?3V*&(nfncz ztbjCYwTbD4_JU4{(aJl!Aa`J!7jo$E7?cs*P`{ABqOtYFl_~sVyIkg{AwhG$9iy0f zF}kjRVDRE(LvnHQ&ywWNGgjCV6uWRb`J5!?Kx#13^|d)dkdQ1^AAT01C=G`UP@K&6 z58O^MFwxWIc~!$&_Y9Awp?r_(6-V-9(BEAoAvyw!xS*P?dusB7nzxodBBll)l{7XB zAjvL1$dgghRE`aV1s;~h*ZdpQCp|v`ipGw(YxNV}ItZKyT_yJ#@Z3_ns(8)&V}crJNOL@k~~3zEG`a^P|-m+I!@Jn zjXp^DWM8fV=DQwAl1J-<)Pr{qsuYcbdRp#6@wH2ZF2kUh#w`xa{XZO{rQfvMn?R4| zr1+ZtFD#=PuRjz6it%rPUd!ZpKw+-X)&v1jy8j25VnEQ|kAxs3v6~}Rx}GV!Tp311 z88GI=je4577qvK!L*M~q!n6J$mGxn9+sjJ-;Z&Cw8coWveY5#e9X8Di53} zNs~jVV-3Arq@pUc#ZLaKEd~c719wFiZ-};>G2e{l{B7P+O@bZ}QCz?<(x_?kmg*?$ zNdvuDOil42kKvhqr*YSsI5)`q^b`k1jO#}(k#W!QBx~L=B zPC<_`9M+$=%6Xbw3-%O1c=Eo_EC<6^`K>3IlhGc{!=QqoR^Zk+9a-__#m?->3JSIB zH2k=q9DGhYpo}uM({1dq^ZUn8zRKZWVrred1g;=1>P=~lJ8Z&X&-YcAAY1h$Nr(ZH z8ePmQSX@T{lBaKgyx(9Z@U*}^3Yv0wYgwd7m8^l>P1AZd!*!c4W+L0e)We9_#@&T< z67}$I7mz_#?|96zgr^mu-=UV}3OhMZ@Y(u+N#>ihEDaO-*S!@W# z&i@46jsIE!wB&7T9Hfv{6|)w|cipSUy@0yV-x`Ye8Z91$+7cT@F%SyW*H|Hp{}! z%GLs}#S_{`d8c)h3kI~lHiO>M6XGf$zQ@=bsitf5I#e$1NUCLN3A=oJ+Vmu0bsT_v z8Io1^g@+rxE@u#kZ8Z&O^3CWz6yUsu^5LQTx{LuqKgJ*pwH)i?c~%ry;qw)W7}6PI z)#sD$@t9MuB~%~+YVn<25VUE|*y5}JLBg?}>pI3%CwI>zc>;cy&3GoiV1kzG43|g} zzeGavg6!)crm25o0o;^9&Hj#tQx#@6IG7pI2taQ19f8n&c_ikp@;xs6xs&n-?F1}O z9K?T4IgNY|Fnk;Oy!|@7$C2_R+aQObCF0~nKb?&Bn21pNY*t~7WlMt z(DD%$bU>?^m+KY<<6JmDiHlc^OT^9o(aT7HWRahy{r+|SmBRfh$cXcC(CZ@{u*Lq;=}UYP36~ZH;uKkmVUl6WDom-o0!tVPPm z{n~h3H}#u3P*lh^WZ|=$0R%OmY`I=)IWcoO^V;RdV4edt=8gT^yDNsKUj-xpJs#w% zcL9{v|9%mPIg*n2U=sl?R391XNw=#RJp{7HYO$kCv?WMX^O##0ng0XS&?GP6G|*NY zm8!{WC6jPw*QB`#y=*S(xdYp851vK^ZnZmf2)>x5r%M5-eX z>sf=VF`-DpAh(j|lL4cQ*lLbXpVkfkbC*tV$`iZeh5QrIbAmtwCA%aXy+wB+c>JoX zdYDx|74PS$e zSd9Cb>b#ypl$2S4&)$a{$Ur!P01s?%2>vF(RO>)>0DuZU2i1Xpwgl+eq1Mtto~{^B z7$sVKN1*O0ND%>6s!XBywLo1UXGOM@SAh;m6V&Uu17+t7W}=#uj=&?lt!*RkkU{+0 zBrFyt{<(+iDINhmSBsBBWSqwEL1I>b5;G`Q*~LL(cA@6{&Te@^BW=*h>PfbrJmZ^% zzZM}`)V{^EK!~{kZQeh)qCiuWUbh>rQxODlwd}O>@7GH~MHQ75sm1xfNee{r7z3YA$g0$06L49A_H_+r$#;@*;Zv7%LDUPVr*z}IK&q=yH3N+1Zxh5T-8Gzl&JERnx_{|IIV3WqV-JS$4~WWa_>U*$eAMVn+c(?^52O%0l+$F#-{ zI6v>ea3Y|7G_Th3D}N1|L=B%46h1!R-8ARsvxJbb9^%e%)PzF%?{Q4BLn!w{4ZPfI zUmvOkRVbm(uB3erol&0ugqH>q`9*yMr0G2(vs88&5#Dxxz4%)fCpp#$IKIU|knjyM z_iCrnW%icwUv`wcwqA*{S_Vm1N4e{pwUCeW{kRH8$uiXTeM6HAij05N4O?v+wWYT` zKwv;nk^R4CC~#8z`U=_LBm^H^)6O8NR|6v$Er=CzhR7Vrky9L(dbj#~+Z`QTmhfl< z+G}(a*;oO}x~SSkOYb+Fl9$?uhle1%KX)o{@)REx*BQ^5_mB+A{B?lt&T~s>OxA;> z1`U%3MC%sM@>On)LCeIoX*RtEK522MO*76dPGYDMUb_cki8?r{+kd0P&3`K7uneo- zGEy*-1y!Cs>Zbb2CFh?h(5D?4vJ9}Cm(6yo&*UZj0f|)|%IiRQknHt5l3v?f8UMT3 z%;UX+r2V1nGzzu+&m$F}%-F|_;*2qwZ%==gLFp~tvg*fG-Fts8js~1)?>`K(vO`ck zs&-e}IvVnq6Dl{{|7qnW_!~r=v?LBl#})X7Zm8BLTcuubOTJ=f>Ehq&yr4alFv|fQ zDF>kt>-H=PMl&7mI-xEEl}W0} z%i#~9TR5R+0@`70B?uD9y&gRY8R}P6f#NU$YEa_a7q(RR`}?)RarWq|+OHa49g&s7 z*P^tAe$@S?*U36UPUuiWQqg)+)8T*iHegxDkVbU#W7X#hfEj1_c{-V%w^QAzxJbiP6FJnmc zxUC8){BU%>*<|<$RhfnsKZ6%`p8z5_3O$`gIz(X}J@1CJkmGB13@$lV{b(1-yg6@h z{N_ChV%uEs%S*IHe-FT4YEY}WxM^Q&17MX%yR+&CI%#jfo9o023LaL3J!{ySS

Q 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%0Av>fxr>&8Si#vbefq@Xrd$d-mMb- ziGPA)U7(LoT&fZ8LQFMY*t;6^kn(ecWS(=#3*HGQ~P+ctc1a#Iac=PyP%3c~uo*kYbgQB6*NwsETCi+ya-5Mo(+FVWvs z0hjA(M`N!VDe%22B6&T2#*}tkj{t}=&s7ETRywfP1-j655W#;72+%5NaQe*0lXZDCqN8H2T)U=2sA$I+nLB#6Z$9QRsN~Kv@Yu94n(+TC{T)szLw;DKgbs`$fqIwYYy4Zi}-^_7^*; z2S;W%gvgX+dqSI?id2&uR-n|ZbGQA!fln?l*GT^2UIQ2>?5i0tkTXxld3aI|5GaJ=00^lj%j< z7I2uE5Km*Wz486NfXSez%2J!pB6QiQkT9&-Jxh&}7N=DpS&~yv9%Vl0$vw(zAboRR z^oiK*EHEhP)~B%1>pa|DvV%b$KL%j$Tlh(GB?pJ47Aazq1?}SwdBk*%ZI=5r6X4qK zfNS;4V|NRt6wEoGQVsUP{9{&=!3_G;xBNF(wi|*Xf_&jM;81tLU^{KWTmuT=Rm83t zPD(D#cif~HcRi#4A)YmYA_o%AfisP%$+FG`i;Q0~y?^dBq^oD{M2X>FxB3z6(7!OB z)ehiP(ByPH%9StLWc-;yL!hhtd+Q<-!wpUaUOJ^8VV}W$sHwU2`0Bzrrk}~&rz#wH zqMkxAU(s^D*6B2aaU|Bk*b_eqzl7EgR~iI{n)f~{{h#?G|GP*BYi+fTSAF0uULYb4 z_hjS{@WPs5DeX1$2GFVNgHU>15x> zMM|>Y^8r+=+v=s9l4FT}Kfjq}L$#UFp>R-(_zWk z@eE<_!$f8|*1>t?dQ>~jVf`F4!?Y!+hQ0t+_U1jjLujVe0mph!fUT_rAj5mIg+v!j ztxm5%31I;rz1)E#O3BAUXFbkK{KC^C_uqi}0d-w?ui^50+1ADgU;@rch@rh6fC|aA z3pfCd`&>;e>||R2d&uL)5BEjtXot=0ON~Ym9^)A<-cKtEzQ#VZ2w%gV2jLh=|$^y8c0eJQCSu^t!b`;9~~h_rtm8 z02vw9_CoZ2x$NWznY1eRcNOn~D?znRcWONaPG?O7K>H$qMe{P!&6Q!@`U+}NSgFUZ z2ww?U7#3rqfY=T!_}Eh^XxQfi+(DWUZ@w%4V~?z1VzTl8N#DW$J~U&o=PrDAYY3A0 zE|0KcP_!J;CIue@8vnb<1BJy@rFu5A2aliP2Oa z)k8>8VrTsI3_Me=XfB0A{NX8xi;tml@ofy5XELXrdU2Y-{~v!GkbxK-_=YG3o!o0} z0d{K#hJyZz1H-G4;!*Z3CovhhQ@}P@`ws3D3o+h0FcLN-FS5#v8<1`yu0IP<^4K{d zi$g(isy1m26I7|du)jE-BZ|svyDq^5WN|pOEPi4_9uU2gBAWv&4n&!%i!neJ2c>i@ zIKv5yaKBAQ^?J#9am)XI^DdpZ`pp!X$4t&^WzF$|Zb|5Tqqk$Z)srfSDpiH!oew!@ z5jq6am&GAGET5npfDM#0{{U#2n;>7%1FgsOPsOhw&t z6G40k1ylfOFZ|F@WWpt)72FJIc&&<(Pk^4J`mF(2=k4`{5hH|ogaE!2NCVbI?3ZxZ zylYGcEz(yoSp;2p^m%VLUR|Wq1O>WjpBG@*7KPnCK^%;NP57-Ltcf!)t@#S@7W{c$=}{TZv+Xr zV!*1tc?8)vclR``JA$C9OR2PdVZ$A~J}Cdo@k?&QM76i?OJ|NbwJmcW{{8R&A0O~G z8kDD!?O|ijk0HiS-X32`Fu^3NQ)hj=rJ4oD)H5Dm0R8U(|JpovTcN)$kf< z9Ypo9pdI#OPzHEr|3GK|lr#f~KNb?m&jh zDhyN5+T-?$%|boug$P1TWCUG&ah9A!um|@fOvTH9HLC|2k>aF;##riCaMimqb4*j^ z8@heCA}?0#wHCXE`Kz1xD|^_1H{xU4^VRDB;#4}oEG|GI4zEjIMhEj7ex2@5Ih7K| zguFJD!{{O4v5Os8klgw&<@fT37O^NxMC(^Xu1?cl2KOaWx$%Qu=sXE6X=)=txk+Ff zD$myMTn3l-!(eqZ;{5mwWBmpeONuoUTy^CW(9f#BqdaAZVO(^;o)#O6)!RWuuA|hEaje< zXY`@)OB1)X(LC*wpsS?8%oip1VNTx~adhz`JrfXwJ7gwntY`}C>K-sQ=e8^Qdl^4m6eBPgWo9MdPhr^wU1Pzl!d*f4`aag zvS{j5&Elj~yPz~m6V~z@sTV0n4`F-drKq!mi41{o%#_5reOgQgYY%HSxD42o{Hqb> zo%}`CIGkl>#*txhG5)H%2ZidO>K5S{{caSBeu>tO?1G0>r7qYfy*4Z49!ZGx=b%=) z9GxV*MrgL@So}6td#`gqG`}^ZM<6W$_ZZt}xTbWgcbZgskwv(fIBTGI#V_y}6(tr0NZt!1B2;S0nEA~I zrEV_uAIKnC$u1uh+Xdi9)Bk1$-W}Zr8&p0qO+!j@1@kyy4H72h`Dg^N7u|@w?bd3I zMrk(}habETo@UExJ%sXfX_g$J#;$*^D+Q^&9CX! zeouP=o=oGhPwTR(up%i?iJ7-lsgdJB?0-ET5)=*#=Ms9v@!@K3Rs9&Fs0c35Z#69o z8V!obA_;-QVw7IAW5z@SjZRKIeg~zzwP=Pkc^2wyon`<|tEM<*@U}%oO}y}ba@9P6 zXVYlZNK-;;BaZp?PH$s!je0g9T{6Y zondQ!`w=^T|kHEWH>ppG3t0&<%pZp*2doMFs%B1AhMbi>oAXSMqb zx(EkSdNF1vKe}Dc{CapuDFCg-_562?MoLB5x}Z5Pb2^1}qh|96j|aaNO|aUi+T&3; zZ|Xnr*UTU)4|Q5S(qbjPkXUL#l&7!>N{x0p+iR9xDeMFpJrya7-tpqkn8l5{ZYxkR z3Z>aZ{fPRFtt-M~`>fk6T&rPh?Zn$Nsc808M?cuO!hxO?xpL3EJlJ0wa;t<`pP+3Q zAvh5A+7zw`Uz2z4;{+hb%k+{ypNMch!8=pSLI=Oo`WP^Wa{uVHZ5%?wocc43WSYb$^SRm_!zYeG%)8D{C-gvk*?pQhO*cPh?35J4}t z&|iLAW`ZcknfS59;v&&IQ|H^8jnz+_*yO;5xwaiwphL(TgMIBLJ#1YhwP+maL;d28 ze6N!Pl=GN&?Bg+n0=U4dc~ZAUj)Wit#)o=Ue1eSQdQ^`fkN#=gOiy}P@_|jr zFGsOMagve5G7Tq2vIekBmu;nk6ZZw^6|SKPFp{-=v*b$NCbWz2d?oy#_UNry7=2Wd zk${tWA9*H2VvJ^L;H-6IFnTe?E0($rPQnGw_D1Jf3X%sYD2;S^-Ag886! z%%R($ZLa!N-mjPt+kh`jYUg;z!8c-d1ou@R6uLVY!Rb5&>9nMvrN%ka0~?D%RSV-H zn+iX7Iz)oLI~(?Dkr)4@ z90&|TN~WXfF`mnxPW5(b2->9bYEEB<0i6Wb75ZB;J_S-Gx^`k`hTC;0_kufhJLeWNIwnJ_l13hscCn>2n;Rny zrZhs2t4Bap0Ls>10DGYWqMHk?5r#LzZX^Aj&$`P=O8J5Vo8S9xJW}EI=HA+;CH_`< zC_sBj|F7N-{;;dQYqO`>PF?p+D?@B0US4zTsmR>)ZCrH1AD0$`E@?_jHq%RHe_iYA#n!gfydAu$a z+%nxTA>a>0 zzT6_ckR=-y)~FUrDHdoDU~8gp_2CHrQ?ig{R79)2E{2@s;I|&x9Zv zjCtM71HE@jQz^7MU_rbz@D13^VUl~g5=_f7;pw_+9qLZC0VAe9q(aa^jG496)-DV$ z0tM#vq}1$^Uz_3E5btF3b+9BB>Ao;^h)uqWfUDhB3S*@{2MW#sX9fRLTa%Hgs#hnn zK0LAFrKXpQSi?+X3rY6Zlq`Zx3WgVFry|%SzQM=T8AQR}=ajyl#-rMOXLGPMQ?=j# zTgpG3f7I z5RDxZABFbzm;!|JC98N&szS>a9|Rr_1W#}b09t};glPQ?d>m=V&KueU|1|pwxNu^K zMs-A10G!ybQm~OWZ~mG5kUq348w|B}$;h|^NigjJrWp_swod8LGT)!jnq~J#tkmZ!&5JBTFLoxT zg7(Z50>1cRRSe6-RJI{p$fuB<%NP2$0$?J;8E}Y(H77J(;2c@bETrx;6x9e@YmqD} z#O|*+W+7N{(qktDFM-WI<5#3-s<>^li*mk7sEsB~iM3d}G>U)AE{&`AAu+51I$SnW{p!Ol(2CqOTVD5_CI$c52oFs_)A92`-Bap)qI zYKdXOhrAZSFl2VpGe#haYSgAsm1OMk<=n&eXkUma#6s_QUX3y|_Q#y1*xpE!M6@!gzK#0hgqV7WA2S8kID z69?)cKqBfWDg$ke8CN^vHqpEn90VS|Ue2Tmz7m=|7!=C!vlc)KkuddvaAC3nj69%W zXDkqQCgb>piZ#%6f=&m#2XB8J$N-3H;8#?Z8eZLrV>`_J&?EX_^}@ERpV-L|$sl6p zGPMg@e!gjXfJ|;pNmYsdS=RJ{R%yXMn8fP|flwfs@yE36LQPR7pD3>$miToOL1@qO z*s+*neR{2#8I-D-e<1!ZU)qZyP*9vl3ZgGJu394Ok{|Ym{SvS8i`~_PzSb?-rS~)X z18kc<-12;Go0ti#P3oiCwXEdia^Wlp6W4>q{tGbqVv9!dO59h063PlE92apdU4 z>I(ynHHcAT4KE8@%mcQE2*UmHf*Av06eU`tNd{<<=>w9NG3{YjOpB16 z#M2jJ6X-=#8~wh#W(t52q3fG=(l8W?Nf#oj;mfAM^liOKKK5Bw^TI^_#g}XMkz^4z zN%quqiqsJ+B<6zpz1=aKaQpD0P`kkuFI5UVgWp)cPt(cu2d%J2l-GKsOdO4{)Sc^r zwmu`74UeIy?In$}C5lFwCs1H%*or}7GN2;yB5~+GI)L6SuYh%e`F#jq^WIuWAbL`% z8nP4x_F;(6P){TTQM-gkBYwuI$pPv2NM_jSGM6&=373VuymS&7DF%JXtM|Nx4#7m& zB({>b4tTix=0`w#Q1g4$0e? z;Z|;xBKiY{6HLqxO=dL`HJrF{U5A-OTr!y17q5dT)~rEYS2xW(@qrq3luoQUEilvi zN7N_7ZQ(v0u9T79<<9mc@<#GFDT4zKoz>zBh~Z$5TAa3LxM~a}#^YCE?#|f#28z(u zHe#JdDU*5O9lphgUSf~>+OC2ibC%E~%zGBy8zp`qJzHDwW5kNn?wY}Gdv5=PliQth z!fJ6tGD3cmJL0dyG=B4MQZf|Occk66` z7o(23Po=Ed9&S!gXoz9BiT(q#NCGByqg^NhvGG&xihNeojt7ugAd;n+PPS}K`B-X; zFe0%6kmT_wic}PvXEjr3u_Rs)#>5C^SAOni%c)imd0cUX@wi?^REul@Nr_pJZx;u~e><@!xapXYN6U(Dw6>SsA;PR)+G zDHL>O1?QC&i?H6_F&%=D^v8Ys(toF=oHG?2WV`IzC_JU3o;WU~w|izmlalkv2k!(v zL3h z^i!Z4?c*P-@M$$|6$pG+YNVc1g$#SVO%$*{}M( zdDEX+6>0ni%v`Sb$`32nQ@7M%O>B7UWrgzU?y-?Axu&ealw!`SVnm`5M&oP#-)?Y6yQ_tvNf|Y`RD)*NoatQ%?n8koQB2k}f^Vap9%#zE@ECA@% zPmHh7HB}pc)vJRuVq$mYy7!HJkJtJIr`S^Fy|0S5lx%f3?*v|Wx*%9}HbEwi9zZ?u z?+*lQ3aXyJBGo-dgZhg9#XMqqHLa{v4|DT?z$4WiRfm+{$0c;sQ=-scoQf^A8f|>b zg6~ApQhGbzzIv`mHk5(IqiIEJMA29UNba4y19xkm@#A%LZk|$<`lj;d*A2!)H|O5` z!k24_c%2^6Uo>XA+4n=QZu@L5F7C`%f}7%5edi3_tXpWlN8jM|^n2&Z4r4;I?@#NY ztQZ6ZK9#Q;X*fSFPb%n3xi#ts2}{p>Bs%2N8%lSo8fV#e;8?xzGfnv-e_EMh)qF}} z&3lh$jj!wB-w!6c;vZTnRB)BHb4k3rdY5UW?yD^GK^`iV8gMZ!EFLSma*G|_fFl9SE^4j_!&%@z#!OBGM`c{Y*H2a=Qm;& z$rcglIKOd^uL?#t5Rbpu^+rswwVFFxJEu$T1mEiGau}VE8(Il>lN4%ECgx$KRR1mm zC0GU>e0}~FTBJ>;8T6b_)G%=e0^0q;RA2| zaHS##^z5089juK)g`s&EFDWl>izPACT>N&=%`(8*%<+WsX|;ETuFLhHd5Mt9X0Szy;3{^U zLtX_A1`P|H|5+@;QGfj`ITZOb)=ZIolZ_kWZXf&KGM_f%(vhi{ILeuu$59)@H5JJ2n_Ujz-9N8V~JM==^! zV>M#rr+&axb`i8z$649(RUI>7*A=1Ev)_s9wVzGi+B`Drh;z<>;*Dc` zn`G-_*;~}F_r6VCkSGg9r(C{amRjoC=i4{XJv*Mglv}85Tl1CAhukPE7_D^iT-X6J z%mES=SVF((wVP0c1LEl<;f~|x^q3nCOdfeO1l7^CvWC|(aR#nd0^y|qS}X;zQ;I5{ z)xBKzR?k4?je;6OJwv)%dAkgyiEC(SZ7@Ic*C4L?&u4OF_Ev4h9{Fyh{(jfock(*4 z!?#C&!X|#|mT*pCz6Vop`esaZ`u>Jbh0YuC+Ou(Pal`&Kawd(X!vTtsWe~nczEH7e zwQB4pU+;2D{@#W+#N2s4n5}AB)w^copd4q4%xhz`;Xm=snwK)xbs;0@g2>L>r(*9E z%O5*Uv%GT+xVPa0Mej9d_uDY%s){ME{S=KvW|nZMfao{td*F|>1eW%8p)mI=zA>8) zEr-%}&H8l41<)}~^eL_Nkb0etxP@y3_(O3;=3Pi?b(Y8y$z9uX_h@PxHlY7%7}YmE z%l*yz7-i8fc80U{w(%UURAtre~cY9U6Q+ta8(FO?Yvc!*MPC znVx=Fu(73sHQnFc;004ynMa5-*DT5W%MGX)S=0(~q@U?I$VjspQGwjL*0&~$Yon!o zA+b)viP;3SPsP5R-ftg?myNrjB=OBZufm_$Lj(z^oc|%dRwD!c5^(8H1sE zb|1&h27y%F^h@B^GTu-U}d$~$D*w?|4c94z^`;P_)b`{0%J@7>az3VOeAeuCjDsamS*I(0-u(X2r~lOD-K~{UpGs+dhl&bg(p-@dtz^!x z6%)QT=@q2<|H&kTVbYkIR?e~i@Ol&df`h>R0-_W z@z45~+GQ@h2av>BW13o)G6ATjr#qjH-pg|Uh`~#YUZ6^s^(OJo;mYTmpPr?-2znWR zXK>8L>C~&3Cg_{F-r=h%uQ?7Yl0ntowCE1AQ-#g5#hUI9cPlE-Y8Jvw^$Z3Sl!fz_ z-mm+MNgW1%-TMB~_5K5EnY7(^Dd_w0>K%sDmUs2it(k5P->fzt3Nf)7H1)cnev_|C z6RS6h3g2Qt?d)g;@!hiOA3N0erPmdW>}d1_Qi9uH5?97t7;I>TupWj_jQX;kee+)9uq?jnPX!wB4Yq1ddp&iW8)+;pkx-(@EO( z3^w|%PR|o^l3JQga)tM5igEeuPhu*B_#G4E8Kb)gti4~VxvfuCZO_tP+aW1wzDw)k zF|}GcFr+R}>Utlr#kF$olrTvYme8(Fw6GIyzExiU0t^SUm0b>JH2yMrT$`>(bwyGj zCP`7tmcHuLmAh1Fg~ZiBrzN>d%Wp);*M~VdnQc*!T4Nb@7$fUdGlarTX`_mY^s}v{ zD5v_?`B7c2m4ZXURI<(gB z=z=<^_Ne8^ zmOcYk%x(6ACIx~oHAm85zT4L%KemmerdCq17K+)HWx@=@m|cFn&5+HtmEWk}{L9sZ z4iK<YNYua$jIm#D-?P|;3IKU-VtkG`Yc+b9j{RFax{;Xw<_g7)oq zIcAWN${QLB@X<7xDMIPP#*{ZeF)sCOH=!l6D-H0|wrrwLn|#h~W|~k)eRs<@w_8=d zLSOE->5X6aHNMYATRhP6j=RfmYmvS;J>W~250cfP2Q|kh%0R)9Uu|ReS8gO_pvGas zkZwd-cA!>O%vxyI*2sI2?EY3$4Q{o%u6ExOg_Di1Wbz;InEpHS=C5yT$*+L67mnwC zMJqfhZ?B);slkuCy^?q$@ec|}U`b6K*4?)q6HLFq^WC2I4 z6$$%!iZe%2s_lMRzi9IJRf`ADQZv8H-8r+1Z~u}_0e3Hzq^bR?TlDKT=Kx66eYG}I zc}wM13h1S8_qgb29%#SmS}gbU-ns0!mt@Cc{XZ;4Np`$+?ON6A2gv=p5cex@q@*L) z^tx|wbKh=e@}q})Ej`GDlrn0i<7_ov6!wYkIo0K`*E zvwNet1cKdR);JkZ4KTjqe$ zCUs+u^8V{yQbO(8oiVbpPBvj~Wp70b4AULi_S5yhMRKgEKnvtit?0|N1B_YYKhyvI z+$6#po^G-5&GE-8M%`aCAAB~mKlE(8T1(dw^U!A|bN9+yDYQoKJig?W$o4i%(m14d zRq)B#W&Zsug0C}wQd}DD5-^;q=vO#1R2&-WeStb;;&G!r_3}9DRp!itliK!M$1b*v zJaT_HdxTVAszMpszfDq+vfnD>ETjhYIi?3LHOT&T8bPFcoz@P8$<$XlADE z6Qz8ZC~Od?t*0>BWqRtK`H;l4gc6p!;x6@%TfcLnA3vF!$BrtSLMCNJ>^%kFl}DT%qPAjf(=sBo2eVT>#SluA`ItmWqZQc^Zj^5*(p41`0JXspiV{67)@S_|n$y}<-L@Atrc`Zyr_KKck7RhC z3f)|HIpu0@rjFlzIS*amtn!1?AGWE{6W45@Cs2msCp9lRgC|i4D^By7sfoTX)ZrLi zr)9}buNSUT+#zBmw8LqSQ2Gjy3=@tAe`i0QSym&}b-Pno^xLa91*ff^&79xl(b&3d zYHv1E*(Tr`3z+&<7I=t>M?GnlT>UnyP^Yt$h4CEoRdp9;W_!IL#d=ct@-Am$?RXU# zLcQ$mn<+Z$EuG%9(^v}5nS&Wxf~gluG5a>eNo-c}=L~g6OV=6scmvf~BY87}%&Rq= zEQi?A$pGi+5zt_*m+fUa20*#2u-W~!`qZQ0 zbsmdIRmO}aCTmCM64uSZ$l_d9{r7Jlq-eKFxoQ>J8+C>wIk`>~@J#b%R7Vz``t&n+ zmEE8sj)$^Qj*coyP)szr(`li)!^t^U!=LFB4*-%1>Y>v~Nhf1^?7oM>9Rx#J>SoX(K&F$HbRI zUBH~lc<3l~rY*@ZpKqvQUv=p5oSg%LPNUBG+ZlAm>ObxqO6uOP1m~UFv_}aaPNS*_ z*u`?RoXEK*b?)1H=yHTQ<>r_cQkTZOz)bN#GmbbXo74^QRQ|i$tU&2^>v1hfbv~P{ z*jo7oCXPOBzEq=DKW``hJS|0f5I2OU3LEqtX``1lXRXELYE6s1hAn=THN?IYsq%OH zcKG6wx$t#$16B+pNJUo*RcSlyTX>->gI}5FoG3RJyCLJCA^8F8X0rEY#rSMBI2_sP z1T*{mMpD~vYO=S;*|Vvev}OBVp|ToZdJ30|^7`Wb%7=#@F^WiQ^1kXi$Trrr=Wl@7 z=Qyh}Vc0Y}JMKKvcwB5Pdp?s;!itUZyRw*Xa>mK@dB?Cj3!c(^K`4P1I4HGMS;UrC?p*lt^43w^Bx6~DhU!2QmF7On3pAS5o_yfs6&I_kHm zyis3zsb2NXnyoBh>#^_lJ%zuGyseg)qEN_(Uin&~w);X9TI{(z(KSQK-KLxy<-h8M ziuP0-@nk(*;D zUVIk4^4y_}(<6UdYpDn`qf=SV?E4-AhomM$V{P62qbxsuR~nvL|M>wZNN+j^8-ey+uFt2HL`1a9fv2JC_#WEi^ zSV^hZ*~!WoH-(9NE#uTYS|P54I&kF=fv4dy(Yj0PaAbEo*y7W@Ewj;PVoy)1t;-P78W|;1)|gmQ|Y7f35yw#bkM&!F}&IV^JmB=O=3DclQgI z_>LB7kHm4vd@IY1JGY#95Eg}RWWGG&n{+N*)nB>r)BJ_=3Ls3J_!inFAyjpT*ZHP2 zNiuxd+@PE&9>-LjpbphsVIR_>sXsFxlgIOnZ$+>>x1KKm_n;USUB-)oMf1R~oY=QM z_2CV#litHGKwfu)HI;`-59GZvtAUyGepc&G8jjZxirSxfm1#rjgKuqS2g}ORPX9XQ z4{BpynJRcaKKzL_w?j*PpR98%EsD4oar&6pJKc~DXf}^s;P$*&VH)eqcE^4igo!>m zeGt^|=_c%WpK68r8|xSNd7=lg!+!GaY-LBG-Z|a-_yQGqY*+FWf9C zyt#fD>0q?^mdT0^kRGPrfOa&zZ%APg&W-O zzXZQ0<#-5t-Yyb{iRTo1lAxXDj#mcXU%{$*g4z?F<|iDb&S6~s2YyM#peK}RMef^B zb2vioiOH2ITyW)n>>SqAT`gq?pY?YyT5I)|DHp@GTVS?jlVg3L@PIKCqaq7(KWNN|mi*Ho=grOyiTWaT)0;5b@s&Dicg7tC2a^Wv~qjX&_!jguNwT}HMhW< zX`PkSi=|K_j2y0^D!+sgH;-0p1&Hm<#u1s8${3?TWPtwyHC$dIKpAigWs}n zfrzcXN*p!Mgu~}^?b?bhl-lpuJe+JD-*%=h5(Y99QzO(@0&&w?s#VOPtetOLyNy)y zInm`9rA`XUV=V(*-c&wFR&6`><<8NeZoJ1tsfIn^2*=1=QGeAdGl?GJS=+yxHh4K-{W-py$jt)e+`*>sfIaBg{Y9^{F(Kf-rCDA!)9|5-Jf1 zjO?>!{vt}OAfIlC4yqe!mx)7Mj#bS28>Z)TMLSyg4ecVDtYUJaOSk)N$YIm9i)_+r zF&NWek$Z-Y=sVp#9nGyt1}d=@T*8;6EVT32LFw~J*Eeb3E${ItE|E-Sk|P^hCLPVaK~W(1qAsaa|JzDMqQVkGU^8Tttw9yHmg z^4c7$K5OHDQevKajWqdG)~ipf4s#az58F!gzqG9=W^7U3lWjN;MdjYWu2lQ2G%t0L;Mn;( zi(GOR>JqRWJ-628xEM!UgyCh_!9T=_m5u<2R#Ni%R73lngCD7*kd3(l5ONDH&6XO9 zZ|`Up5vR>s^$wW_C`S2d>X?jbnAKE*I6 z>SB{iI<;1m3$PE+eU>ZuFlK=A%12J?xzYBsrKV2yy~yncuacX{^SzSx>~@AJ21|yy z%7^zV4?_+8n|k!Y+JABZWIZT4Xq2sMsT%M#1=?j^`^;WK2-!pQ$xPqN^7`5#rUaF` zq{wsQO+P4}#2o8jUo+QI-na)-GRZ538&4I!Tm|g*wjN=iZg>NDG z!}^oGO`^yj@?;aYWg{bP4eltjrQXCXlBQ{|fSbB6(aFj98IX8pMbu@qFUMb8-|HZK zrTMJnje-5l%7=C`{RptVgb%l5t_obhILfYUrJc@U_T=h<306BUZ>uJGhCd>^$21am zoF{Lv*X+_GaqIFlQNF3S5uN1!mlHQ}^hx@xiaxcik)HWMtjE zfUs3n=sWaT@f7 ziD7Scp699KV`X8y@4k;;CwRj%C1!4kWpm3AB!U-EWD#^@QVoi)KU6B|d>rTeODDt5?*_5p=xxV+{W{l#kn%OT{y{0s3{A|_gqPa#U^GTF%&yj!c z-$CFNyyufk3;fpHIXU3E0}F)@wUxx`AzsV;FIfm&1MmQ`BQS|rNpB%9 z7xIcCf=Ra{ct2l!wC3XKc0fGOZQ>i2ac;M9!7cUxS6nl3PxT*3J>de!TXTtbkZ~4Z zNZEn0_WZtp9+#pk&}_Y!f~T-ibGnOTu6xAi6}F8xxGpU0;4?VF*u~nhUfSg-nXFK> zqL&$f0xw4}K>1Fvmlv$@V!VIiNx;IlN^_;kO|mMkCRSYPGA`lRbqczHss~~`S}UP!8;#UKiMsctSa~f@?<=rs+A7xf#}{MzeeeuE@BtMIlBt!z|AQ^n)16 z?E^2v9H=HQ9)RpzfW>OEig)IKr=`lmMqe0tOrhxEF=MjWkhAB;g65FNZ{3OeR^xAPs$a_O-0x-uYW zYxsBRsUM%-Nh9}C@kLpi>Wdl>Jn0)cGlSQR^$JL4ZlIPi{%RVI@9u0ro0Mi;PUur- z$m|Kn$Jj@s!)5rJiQ7d@h4^w62@ep-Nn5+qP<^8Vg0@%Vt`fT$q_y&|lPo*-fSfP< zlHwJJmCIhLRIA5L+Q4t@lYFt?bOQTNGuK2RLUP~W(NFhttKB(ya$*U?mySr;{&^^i zNgvzm9^30i|C|TK3wn3}263c5Z2^pHS>~BFx;6vpUGa@brEX!J zgtwtv!|d6t!o!cLJ$&s^w=p#c$t1VQgb(Dz3ZI8Td#00q%u6apYMkpAdZ(^J0V#MQ z(J`$6O}I9?tq!`hE)_8LOtlWHr(3#})v`D*+30Mm|&`a zbA;UL0uVvYog}C~dTAwc8ODuTJ%lngR?twkujWr(`e$fF{d9gr* zY<1v+$14?N8MLa+zFalPqHd+{0mry3?;6^|*5H9qOdr56*sc2l RH>B-ze@Ao0 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

  • 1 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 z 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 z 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 literal 0 HcmV?d00001 diff --git a/esignet-core/pom.xml b/esignet-core/pom.xml index 9a27b8de7..4e06e2702 100644 --- a/esignet-core/pom.xml +++ b/esignet-core/pom.xml @@ -25,7 +25,7 @@ 2.15.0 2.15.0 2.15.0 - 1.2.0.2-SNAPSHOT + 1.2.1.0 3.27.0-GA 4.13.2 2.22.0 diff --git a/esignet-core/src/main/java/io/mosip/esignet/core/util/NoOpKeyBinderImpl.java b/esignet-core/src/main/java/io/mosip/esignet/core/util/NoOpKeyBinderImpl.java new file mode 100644 index 000000000..9fc026489 --- /dev/null +++ b/esignet-core/src/main/java/io/mosip/esignet/core/util/NoOpKeyBinderImpl.java @@ -0,0 +1,37 @@ +package io.mosip.esignet.core.util; + +import io.mosip.esignet.api.dto.AuthChallenge; +import io.mosip.esignet.api.dto.KeyBindingResult; +import io.mosip.esignet.api.dto.SendOtpResult; +import io.mosip.esignet.api.exception.KeyBindingException; +import io.mosip.esignet.api.exception.SendOtpException; +import io.mosip.esignet.api.spi.KeyBinder; +import lombok.extern.slf4j.Slf4j; +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty; +import org.springframework.stereotype.Component; + +import java.util.List; +import java.util.Map; + +import static io.mosip.esignet.api.util.ErrorConstants.NOT_IMPLEMENTED; + +@ConditionalOnProperty(value = "mosip.esignet.integration.key-binder", havingValue = "NoOpKeyBinder") +@Component +@Slf4j +public class NoOpKeyBinderImpl implements KeyBinder { + + @Override + public SendOtpResult sendBindingOtp(String individualId, List otpChannels, Map requestHeaders) throws SendOtpException { + throw new SendOtpException(NOT_IMPLEMENTED); + } + + @Override + public KeyBindingResult doKeyBinding(String individualId, List challengeList, Map publicKeyJWK, String bindAuthFactorType, Map requestHeaders) throws KeyBindingException { + throw new KeyBindingException(NOT_IMPLEMENTED); + } + + @Override + public List getSupportedChallengeFormats(String authFactorType) { + return List.of(); + } +} diff --git a/esignet-service/README.md b/esignet-service/README.md index 0531ab4fc..c14821025 100644 --- a/esignet-service/README.md +++ b/esignet-service/README.md @@ -1,4 +1,4 @@ -## e-Signet Service +## eSignet Service * AuthorizationController - All the endpoints used by oidc-ui to begin the OIDC transaction, authenticate, take consent and generate auth-code. * ClientManagementController - Endpoints to create/update OIDC clients @@ -7,12 +7,10 @@ * OpenIdController - Endpoints specific to OIDC protocol like /userinfo and /.well-known/openid-configuration * SystemInfoController - Endpoints to get the pet public part of the keys managed in the keystore by keymanager. * KeyBindingController - Endpoints used by wallets to bind a key to an individual ID to support wallet local authentication. -* VCIController - Wallet initiated /credential endpoint returning just in time credential and /.well-known/openid-credential-issuer endpoint specific to [OpenID4VCI specification](https://openid.net/specs/openid-4-verifiable-credential-issuance-1_0.html) -Note: VCI implementations currently only supports ldp_vc format with 'jwt' PoP. And we only issue scope based VC. -Both mock plugin and the MOSIP IDA plugin supports only scoped based VC issuance. +Note: VCI implementations are permanently moved to Inji-Certify. -## e-Signet Plugins +## eSignet Plugins 1. We have well-defined plugin interfaces in esignet-intergration-api. 2. Mock plugin implementations and the MOSIP specific plugin implementations are available. 3. Check the below URL for more details: @@ -25,54 +23,9 @@ Both mock plugin and the MOSIP IDA plugin supports only scoped based VC issuance ![](/docs/esignet-service-basic-interations.png) -## Local setup of e-Signet with mock plugins - -1. Create database mosip_esignet. -2. Run all the scripts under db_scripts/mosip_esignet/ddl folder. -3. Run the below insert statements in mosip_esignet database: - - > INSERT INTO KEY_POLICY_DEF(APP_ID,KEY_VALIDITY_DURATION,PRE_EXPIRE_DAYS,ACCESS_ALLOWED,IS_ACTIVE,CR_BY,CR_DTIMES) VALUES ('ROOT', 1095, 50, 'NA', true, 'mosipadmin', now()); - - > INSERT INTO KEY_POLICY_DEF(APP_ID,KEY_VALIDITY_DURATION,PRE_EXPIRE_DAYS,ACCESS_ALLOWED,IS_ACTIVE,CR_BY,CR_DTIMES) VALUES ('OIDC_SERVICE', 1095, 50, 'NA', true, 'mosipadmin', now()); - - > INSERT INTO KEY_POLICY_DEF(APP_ID,KEY_VALIDITY_DURATION,PRE_EXPIRE_DAYS,ACCESS_ALLOWED,IS_ACTIVE,CR_BY,CR_DTIMES) VALUES ('OIDC_PARTNER', 1095, 50, 'NA', true, 'mosipadmin', now()); - - > INSERT INTO KEY_POLICY_DEF(APP_ID,KEY_VALIDITY_DURATION,PRE_EXPIRE_DAYS,ACCESS_ALLOWED,IS_ACTIVE,CR_BY,CR_DTIMES) VALUES ('BINDING_SERVICE', 1095, 50, 'NA', true, 'mosipadmin', now()); - - > INSERT INTO KEY_POLICY_DEF(APP_ID,KEY_VALIDITY_DURATION,PRE_EXPIRE_DAYS,ACCESS_ALLOWED,IS_ACTIVE,CR_BY,CR_DTIMES) VALUES ('MOCK_BINDING_SERVICE', 1095, 50, 'NA', true, 'mosipadmin', now()); - -4. Build the plugin jar from below repo and add the built plugin jar as runtime dependency in esignet-service - - > https://github.com/mosip/esignet-mock-services/tree/master/mock-esignet-integration-impl - -5. Build the current esignet repository with the below command: - - > mvn clean install -Dgpg.skip=true -DskipTests=true - -6. Run the below command to start the esignet-service with mock plugin - - > java -jar -Dloader.path=mock-esignet-integration-impl.jar esignet-service.jar - -7. Once the service is up, swagger should be accessible with the below URL - - > http://localhost:8088/v1/esignet/swagger-ui.html - -8. Mock plugins connect to mock-identity-system, refer below document to start mock-identity-system in parallel - - > https://github.com/mosip/esignet-mock-services/tree/master/mock-identity-system#local-setup-of-mock-identity-system - -9. Also find the latest postman collection under "docs/postman-collections" folder with environment json - - Order of execution in postman script for OIDC flow is: - * Create identity - * Create OIDC client - * Authorize / OAuthdetails request - * Send OTP - * Authenticate user - * Authorization Code - * Get Tokens - * Get Userinfo +## Local setup of eSignet with mock plugins +Kindly check our docker compose setup files to run eSignet locally [here](../docker-compose) ## Caching details @@ -102,7 +55,7 @@ Linked transactions | userinfo | | | -Identity verification transaction +eKYC verification transaction | Endpoint | Cache | Evict | |----------------------------------------|------------------------------------------------------|------------------------------------------------------| @@ -110,12 +63,16 @@ Identity verification transaction | authenticate | authenticated (k: transactionId, v: OIDCTransaction) | preauth (k: transactionId, v: OIDCTransaction) | | claim-details(limited to 1 invocation) | authenticated (k: transactionId, v: OIDCTransaction) | | | prepare-signup-redirect | halted (k: transactionId, v: OIDCTransaction) | authenticated (k: transactionId, v: OIDCTransaction) | -| resume | authenticated (k: transactionId, v: OIDCTransaction) | halted (k: transactionId, v: OIDCTransaction) | +| complete-signup-redirect | authenticated (k: transactionId, v: OIDCTransaction) | halted (k: transactionId, v: OIDCTransaction) | | authCode | authcodegenerated (k: codeHash, v: OIDCTransaction) | authenticated (k: transactionId, v: OIDCTransaction) | | token | userinfo (k: accessTokenHash, v: OIDCTransaction) | authcodegenerated (k: codeHash, v: OIDCTransaction) | | userinfo | | | +## API document + +eSignet API documentation can be found [here](../docs/esignet-openapi.yaml) + ## Databases Refer to [SQL scripts](db_scripts/mosip_esignet). diff --git a/esignet-service/src/main/resources/application-default.properties b/esignet-service/src/main/resources/application-default.properties index e94c2da14..ed7004346 100644 --- a/esignet-service/src/main/resources/application-default.properties +++ b/esignet-service/src/main/resources/application-default.properties @@ -2,24 +2,6 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. -## Tomcat access logs -server.tomcat.accesslog.enabled=true -server.tomcat.accesslog.directory=/dev -server.tomcat.accesslog.prefix=stdout -server.tomcat.accesslog.buffered=false -server.tomcat.accesslog.suffix= -server.tomcat.accesslog.file-date-format= -server.tomcat.accesslog.pattern={"@timestamp":"%{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}t","level":"ACCESS","level_value":70000,"traceId":"%{X-B3-TraceId}i","statusCode":%s,"req.requestURI":"%U","bytesSent":%b,"timeTaken":%T,"appName":"${spring.application.name}","req.userAgent":"%{User-Agent}i","req.xForwardedFor":"%{X-Forwarded-For}i","req.referer":"%{Referer}i","req.method":"%m","req.remoteHost":"%a"} -server.tomcat.accesslog.className=io.mosip.kernel.core.logger.config.SleuthValve -#logging.level.org.springframework.web.client.RestTemplate=INFO -logging.level.io.mosip.esignet=INFO - -## Prometheus -management.endpoint.metrics.enabled=true -management.endpoints.web.exposure.include=* -management.endpoint.prometheus.enabled=true -management.metrics.export.prometheus.enabled=true - ## eSignet configurations mosip.esignet.auth-txn-id-length=10 mosip.esignet.supported-id-regex=\\S* @@ -416,4 +398,6 @@ mosip.esignet.ui.config.key-values={'sbi.env': '${mosip.esignet.authenticator.id 'auth.factor.kbi.field-details': ${mosip.esignet.authenticator.default.auth-factor.kbi.field-details}} ##-------------------------------------------- Default Integrations ----------------------------------------------------- + mosip.esignet.integration.audit-plugin=LoggerAuditService +mosip.esignet.integration.key-binder=NoOpKeyBinder \ No newline at end of file diff --git a/esignet-service/src/main/resources/application-local.properties b/esignet-service/src/main/resources/application-local.properties index 396d4674e..802a3a338 100644 --- a/esignet-service/src/main/resources/application-local.properties +++ b/esignet-service/src/main/resources/application-local.properties @@ -4,17 +4,7 @@ mosip.esignet.mock.domain.url=http://localhost:8082 -## Tomcat access logs -server.tomcat.accesslog.enabled=true -server.tomcat.accesslog.directory=/dev -server.tomcat.accesslog.prefix=stdout -server.tomcat.accesslog.buffered=false -server.tomcat.accesslog.suffix= -server.tomcat.accesslog.file-date-format= -server.tomcat.accesslog.pattern={"@timestamp":"%{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}t","level":"ACCESS","level_value":70000,"traceId":"%{X-B3-TraceId}i","statusCode":%s,"req.requestURI":"%U","bytesSent":%b,"timeTaken":%T,"appName":"${spring.application.name}","req.userAgent":"%{User-Agent}i","req.xForwardedFor":"%{X-Forwarded-For}i","req.referer":"%{Referer}i","req.method":"%m","req.remoteHost":"%a"} -server.tomcat.accesslog.className=io.mosip.kernel.core.logger.config.SleuthValve -#logging.level.org.springframework.web.client.RestTemplate=INFO -logging.level.io.mosip.esignet=INFO +logging.level.io.mosip.esignet=DEBUG ## eSignet configurations mosip.esignet.amr-acr-mapping-file-path=amr_acr_mapping.json @@ -399,4 +389,6 @@ mosip.esignet.ui.config.key-values={'sbi.env': '${mosip.esignet.authenticator.id 'auth.factor.kbi.field-details': ${mosip.esignet.authenticator.default.auth-factor.kbi.field-details}} ##-------------------------------------------- Default Integrations ----------------------------------------------------- + mosip.esignet.integration.audit-plugin=LoggerAuditService +mosip.esignet.integration.key-binder=NoOpKeyBinder diff --git a/esignet-service/src/main/resources/bootstrap.properties b/esignet-service/src/main/resources/bootstrap.properties index 0e1c09ca7..4077637b0 100644 --- a/esignet-service/src/main/resources/bootstrap.properties +++ b/esignet-service/src/main/resources/bootstrap.properties @@ -28,3 +28,21 @@ spring.messages.basename=messages spring.messages.encoding=UTF-8 spring.main.allow-bean-definition-overriding=true + +## Tomcat access logs +server.tomcat.accesslog.enabled=true +server.tomcat.accesslog.directory=/dev +server.tomcat.accesslog.prefix=stdout +server.tomcat.accesslog.buffered=false +server.tomcat.accesslog.suffix= +server.tomcat.accesslog.file-date-format= +server.tomcat.accesslog.pattern={"@timestamp":"%{yyyy-MM-dd'T'HH:mm:ss.SSS'Z'}t","level":"ACCESS","level_value":70000,"traceId":"%{X-B3-TraceId}i","statusCode":%s,"req.requestURI":"%U","bytesSent":%b,"timeTaken":%T,"appName":"${spring.application.name}","req.userAgent":"%{User-Agent}i","req.xForwardedFor":"%{X-Forwarded-For}i","req.referer":"%{Referer}i","req.method":"%m","req.remoteHost":"%a"} +server.tomcat.accesslog.className=io.mosip.kernel.core.logger.config.SleuthValve +#logging.level.org.springframework.web.client.RestTemplate=INFO +logging.level.io.mosip.esignet=INFO + +## Prometheus +management.endpoint.metrics.enabled=true +management.endpoints.web.exposure.include=* +management.endpoint.prometheus.enabled=true +management.metrics.export.prometheus.enabled=true \ No newline at end of file diff --git a/pom.xml b/pom.xml index 9de96b60e..5439543a3 100644 --- a/pom.xml +++ b/pom.xml @@ -62,10 +62,6 @@ false - - danubetech-maven-public - https://repo.danubetech.com/repository/maven-public/ - From f0640faa51e65dbd73333c6dc5b4faf5be7bedad Mon Sep 17 00:00:00 2001 From: ckm007 Date: Mon, 7 Oct 2024 15:15:46 +0530 Subject: [PATCH 09/80] [DSD-6382] updated correct onboarder chart version Signed-off-by: ckm007 --- partner-onboarder/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner-onboarder/install.sh b/partner-onboarder/install.sh index 1243b4001..23470853d 100755 --- a/partner-onboarder/install.sh +++ b/partner-onboarder/install.sh @@ -21,7 +21,7 @@ if [ "$flag" = "n" ]; then fi NS=esignet -CHART_VERSION=1.5.0-ES-develop +CHART_VERSION=1.5.0-es-develop echo Create $NS namespace kubectl create ns $NS || true From 8f4233e2921e45e55a0b80fcf3a56b76c6c1db7e Mon Sep 17 00:00:00 2001 From: ckm007 Date: Mon, 7 Oct 2024 18:55:27 +0530 Subject: [PATCH 10/80] [DSD-6382] removed not required enabled params from realm attribute Signed-off-by: ckm007 --- deploy/keycloak/keycloak-init-values.yaml | 2 -- 1 file changed, 2 deletions(-) diff --git a/deploy/keycloak/keycloak-init-values.yaml b/deploy/keycloak/keycloak-init-values.yaml index 3dd04e513..9a8edccc0 100644 --- a/deploy/keycloak/keycloak-init-values.yaml +++ b/deploy/keycloak/keycloak-init-values.yaml @@ -14,8 +14,6 @@ keycloak: "actionTokenGeneratedByUserLifespan": 300 "passwordPolicy": "length(8)" "resetPasswordAllowed": 'True' - "registrationAllowed": 'True' - "verifyEmail": 'True' "bruteForceProtected": 'True' "permanentLockout": 'False' "maxFailureWaitSeconds": 900 From 68fd2fb61cb33ce58f34dd296a9e7d1807741bc6 Mon Sep 17 00:00:00 2001 From: ckm007 Date: Mon, 7 Oct 2024 20:14:09 +0530 Subject: [PATCH 11/80] [DSD-6382] added misp key update part Signed-off-by: ckm007 --- deploy/esignet-global-cm.yaml.sample | 1 + partner-onboarder/install.sh | 2 ++ 2 files changed, 3 insertions(+) diff --git a/deploy/esignet-global-cm.yaml.sample b/deploy/esignet-global-cm.yaml.sample index 3a5bdb357..ee12da13e 100644 --- a/deploy/esignet-global-cm.yaml.sample +++ b/deploy/esignet-global-cm.yaml.sample @@ -10,6 +10,7 @@ metadata: namespace: esignet data: mosip-version: develop + imstallation-domain: sandbox.xyz.net mosip-api-host: api.sandbox.xyz.net mosip-iam-external-host: iam.sandbox.xyz.net mosip-api-internal-host: api-internal.sandbox.xyz.net diff --git a/partner-onboarder/install.sh b/partner-onboarder/install.sh index 23470853d..20b755fe0 100755 --- a/partner-onboarder/install.sh +++ b/partner-onboarder/install.sh @@ -114,6 +114,8 @@ function installing_onboarder() { --version $CHART_VERSION \ --wait --wait-for-jobs echo "Partner onboarded successfully and reports are moved to S3 or NFS" + kubectl rollout restart deployment -n esignet esignet + echo eSignet MISP License Key updated successfully to eSignet. return 0 fi } From 8b96f25ee3adf49d33707086d4c78467001ac287 Mon Sep 17 00:00:00 2001 From: ckm007 Date: Mon, 7 Oct 2024 20:31:09 +0530 Subject: [PATCH 12/80] [DSD-6382] updated message Signed-off-by: ckm007 --- partner-onboarder/install.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/partner-onboarder/install.sh b/partner-onboarder/install.sh index 20b755fe0..d9cf12ab9 100755 --- a/partner-onboarder/install.sh +++ b/partner-onboarder/install.sh @@ -113,7 +113,7 @@ function installing_onboarder() { -f values.yaml \ --version $CHART_VERSION \ --wait --wait-for-jobs - echo "Partner onboarded successfully and reports are moved to S3 or NFS" + echo "Partner onboarder executed and reports are moved to S3 or NFS please check the same to make sure partner was onboarded sucessfully." kubectl rollout restart deployment -n esignet esignet echo eSignet MISP License Key updated successfully to eSignet. return 0 From d60c127db2dc8dc744ca8a8876bd8a195c01f004 Mon Sep 17 00:00:00 2001 From: Mohanachandran S <165888272+mohanachandran-s@users.noreply.github.com> Date: Wed, 9 Oct 2024 18:53:33 +0530 Subject: [PATCH 13/80] MOSIP-36454 - fixed build issue by adding suite setup in runner file (#947) Signed-off-by: Mohanachandran S --- .../apirig/testrunner/MosipTestRunner.java | 76 +++++++++---------- 1 file changed, 35 insertions(+), 41 deletions(-) diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testrunner/MosipTestRunner.java b/api-test/src/main/java/io/mosip/testrig/apirig/testrunner/MosipTestRunner.java index 68d9ed76e..8137a736b 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testrunner/MosipTestRunner.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/testrunner/MosipTestRunner.java @@ -14,6 +14,7 @@ import java.util.Map; import java.util.Properties; +import org.apache.log4j.Level; import org.apache.log4j.Logger; import org.bouncycastle.openssl.jcajce.JcaPEMWriter; import org.testng.TestNG; @@ -24,10 +25,9 @@ import io.mosip.testrig.apirig.dataprovider.BiometricDataProvider; import io.mosip.testrig.apirig.dbaccess.DBManager; import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.AuthTestsUtil; import io.mosip.testrig.apirig.utils.CertificateGenerationUtil; import io.mosip.testrig.apirig.utils.CertsUtil; -import io.mosip.testrig.apirig.utils.ConfigManager; -import io.mosip.testrig.apirig.utils.EncryptionDecrptionUtil; import io.mosip.testrig.apirig.utils.EsignetConfigManager; import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; @@ -60,7 +60,6 @@ public class MosipTestRunner { public static void main(String[] arg) { try { - Map envMap = System.getenv(); LOGGER.info("** ------------- Get ALL ENV varibales --------------------------------------------- **"); for (String envName : envMap.keySet()) { @@ -74,8 +73,9 @@ public static void main(String[] arg) { } else { ExtractResource.copyCommonResources(); } + AdminTestUtil.init(); EsignetConfigManager.init(); - BaseTestCase.suiteSetup(getRunType()); + suiteSetup(getRunType()); SkipTestCaseHandler.loadTestcaseToBeSkippedList("testCaseSkippedList.txt"); setLogLevels(); @@ -127,7 +127,6 @@ public static void main(String[] arg) { } catch (Exception e) { LOGGER.error("Exception " + e.getMessage()); } - OTPListener.bTerminate = true; HealthChecker.bTerminate = true; @@ -135,6 +134,34 @@ public static void main(String[] arg) { System.exit(0); } + + public static void suiteSetup(String runType) { + if (EsignetConfigManager.IsDebugEnabled()) + LOGGER.setLevel(Level.ALL); + else + LOGGER.info("Test Framework for Mosip api Initialized"); + BaseTestCase.initialize(); + LOGGER.info("Done with BeforeSuite and test case setup! su TEST EXECUTION!\n\n"); + + if (!runType.equalsIgnoreCase("JAR")) { + AuthTestsUtil.removeOldMosipTempTestResource(); + } + BaseTestCase.currentModule = GlobalConstants.ESIGNET; + BaseTestCase.certsForModule = GlobalConstants.ESIGNET; + DBManager.executeDBQueries(EsignetConfigManager.getKMDbUrl(), EsignetConfigManager.getKMDbUser(), + EsignetConfigManager.getKMDbPass(), EsignetConfigManager.getKMDbSchema(), + getGlobalResourcePath() + "/" + "config/keyManagerDataDeleteQueriesForEsignet.txt"); + DBManager.executeDBQueries(EsignetConfigManager.getIdaDbUrl(), EsignetConfigManager.getIdaDbUser(), + EsignetConfigManager.getPMSDbPass(), EsignetConfigManager.getIdaDbSchema(), + getGlobalResourcePath() + "/" + "config/idaDeleteQueriesForEsignet.txt"); + DBManager.executeDBQueries(EsignetConfigManager.getMASTERDbUrl(), EsignetConfigManager.getMasterDbUser(), + EsignetConfigManager.getMasterDbPass(), EsignetConfigManager.getMasterDbSchema(), + getGlobalResourcePath() + "/" + "config/masterDataDeleteQueriesForEsignet.txt"); + BaseTestCase.setReportName(GlobalConstants.ESIGNET); + AdminTestUtil.initiateesignetTest(); + BaseTestCase.otpListener = new OTPListener(); + BaseTestCase.otpListener.run(); + } private static void setLogLevels() { AdminTestUtil.setLogLevel(); @@ -155,7 +182,6 @@ public static void startTestRunner() { File homeDir = null; TestNG runner = new TestNG(); List suitefiles = new ArrayList<>(); - List modulesToRun = BaseTestCase.listOfModules; String os = System.getProperty("os.name"); LOGGER.info(os); if (getRunType().contains("IDE") || os.toLowerCase().contains("windows")) { @@ -167,12 +193,8 @@ public static void startTestRunner() { LOGGER.info("ELSE :" + homeDir); } for (File file : homeDir.listFiles()) { - for (String fileName : modulesToRun) { - if (file.getName().toLowerCase().contains(fileName)) { - suitefiles.add(file.getAbsolutePath()); - } else if (fileName.equals("all") && file.getName().toLowerCase().contains("testng")) { - suitefiles.add(file.getAbsolutePath()); - } + if (file.getName().toLowerCase().contains(GlobalConstants.ESIGNET)) { + suitefiles.add(file.getAbsolutePath()); } } runner.setTestSuites(suitefiles); @@ -181,25 +203,6 @@ public static void startTestRunner() { runner.run(); } - /** - * The method to return class loader resource path - * - * @return String - * @throws IOException - */ - /* - * public static String getGlobalResourcePath() { if - * (checkRunType().equalsIgnoreCase("JAR")) { return new - * File(jarUrl).getParentFile().getAbsolutePath() + - * "/MosipTestResource/MosipTemporaryTestResource"; } else if - * (checkRunType().equalsIgnoreCase("IDE")) { String path = new - * File(MosipTestRunner.class.getClassLoader().getResource("").getPath()). - * getAbsolutePath() + "/MosipTestResource/MosipTemporaryTestResource"; if - * (path.contains(GlobalConstants.TESTCLASSES)) path = - * path.replace(GlobalConstants.TESTCLASSES, "classes"); return path; } return - * "Global Resource File Path Not Found"; } - */ - public static String getGlobalResourcePath() { if (cachedPath != null) { return cachedPath; @@ -225,15 +228,6 @@ public static String getGlobalResourcePath() { public static String getResourcePath() { return getGlobalResourcePath(); -// if (checkRunType().equalsIgnoreCase("JAR")) { -// return new File(jarUrl).getParentFile().getAbsolutePath(); -// } else if (checkRunType().equalsIgnoreCase("IDE")) { -// String path = new File(MosipTestRunner.class.getClassLoader().getResource("").getPath()).getAbsolutePath(); -// if (path.contains(GlobalConstants.TESTCLASSES)) -// path = path.replace(GlobalConstants.TESTCLASSES, "classes"); -// return path; -// } -// return "Global Resource File Path Not Found"; } public static String generatePulicKey() { @@ -334,4 +328,4 @@ public static String getRunType() { return "IDE"; } -} +} \ No newline at end of file From 264c5100cace4349e24181ec22fcbbc1bf1beec6 Mon Sep 17 00:00:00 2001 From: Chandra Keshav Mishra Date: Tue, 15 Oct 2024 18:24:14 +0530 Subject: [PATCH 14/80] [DSD-6382] added captcha secret update part to initialisation script (#943) * [DSD-6382] added captcha secret update part to initialisation script Signed-off-by: ckm007 * Update initialise-prereq.sh Signed-off-by: Chandra Keshav Mishra * Update initialise-prereq.sh Signed-off-by: Chandra Keshav Mishra --------- Signed-off-by: ckm007 Signed-off-by: Chandra Keshav Mishra --- deploy/captcha/install.sh | 7 ++----- deploy/config-server/install.sh | 15 ++++++++------- deploy/esignet/install.sh | 2 +- deploy/initialise-prereq.sh | 33 +++++++++++++++++++++++++-------- deploy/oidc-ui/install.sh | 2 +- 5 files changed, 37 insertions(+), 22 deletions(-) diff --git a/deploy/captcha/install.sh b/deploy/captcha/install.sh index e7d0b5cb1..4f25b8a6e 100755 --- a/deploy/captcha/install.sh +++ b/deploy/captcha/install.sh @@ -9,13 +9,10 @@ fi NS=captcha CHART_VERSION=0.1.0-develop -echo Create $NS namespace -kubectl create ns $NS - function installing_captcha() { while true; do - read -p "Do you want to continue installing captcha validation service? (y/n): " + read -p "Do you want to continue installing captcha validation service? (y/n): " ans if [ "$ans" = "Y" ] || [ "$ans" = "y" ]; then break elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then @@ -29,7 +26,7 @@ function installing_captcha() { CHART_VERSION=0.1.0-develop echo Create $NS namespace - kubectl create ns $NS + kubectl create ns $NS || true echo Istio label diff --git a/deploy/config-server/install.sh b/deploy/config-server/install.sh index eee57f6d6..83ec9c90a 100755 --- a/deploy/config-server/install.sh +++ b/deploy/config-server/install.sh @@ -6,17 +6,18 @@ if [ $# -ge 1 ] ; then export KUBECONFIG=$1 fi +# set commands for error handling. +set -e +set -o errexit ## set -e : exit the script if any statement returns a non-true return value +set -o nounset ## set -u : exit the script if you try to use an uninitialised variable +set -o errtrace # trace ERR through 'time command' and other functions +set -o pipefail # trace ERR through pipes + NS=esignet CHART_VERSION=0.0.1-develop echo Create $NS namespace - kubectl create ns $NS - # set commands for error handling. - set -e - set -o errexit ## set -e : exit the script if any statement returns a non-true return value - set -o nounset ## set -u : exit the script if you try to use an uninitialised variable - set -o errtrace # trace ERR through 'time command' and other functions - set -o pipefail # trace ERR through pipes + kubectl create ns $NS || true echo Istio label kubectl label ns $NS istio-injection=enabled --overwrite diff --git a/deploy/esignet/install.sh b/deploy/esignet/install.sh index 9b70b8365..99fcdeb3b 100755 --- a/deploy/esignet/install.sh +++ b/deploy/esignet/install.sh @@ -12,7 +12,7 @@ kubectl create ns $NS function installing_esignet() { while true; do - read -p "Do you want to continue installing esignet services? (y/n): " + read -p "Do you want to continue installing esignet services? (y/n): " ans if [ "$ans" = "Y" ] || [ "$ans" = "y" ]; then break elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then diff --git a/deploy/initialise-prereq.sh b/deploy/initialise-prereq.sh index e5723ab93..46c095d52 100755 --- a/deploy/initialise-prereq.sh +++ b/deploy/initialise-prereq.sh @@ -42,21 +42,36 @@ function initialising_Prerequisites() { prompt_for_initialisation "$module" "${prompts[$module]}" done - ESIGNET_HOST=$(kubectl -n esignet get cm esignet-global -o jsonpath={.data.mosip-esignet-host}) - echo Please enter the recaptcha admin site key for domain $ESIGNET_HOST - read ESITE_KEY - echo Please enter the recaptcha admin secret key for domain $ESIGNET_HOST - read ESECRET_KEY - while true; do read -p "Do you want to continue configuring Captcha secrets for esignet ? (y/n) : " ans if [ $ans='Y' ] || [ $ans='y' ]; then echo "Please create captcha site and secret key for esignet domain: esignet.sandbox.xyz.net" + + ESIGNET_HOST=$(kubectl -n esignet get cm esignet-global -o jsonpath={.data.mosip-esignet-host}) + echo Please enter the recaptcha admin site key for domain $ESIGNET_HOST + read ESITE_KEY + echo Please enter the recaptcha admin secret key for domain $ESIGNET_HOST + read ESECRET_KEY + echo "Setting up captcha secrets" kubectl -n $NS create secret generic esignet-captcha --from-literal=esignet-captcha-site-key=$ESITE_KEY --from-literal=esignet-captcha-secret-key=$ESECRET_KEY --dry-run=client -o yaml | kubectl apply -f - + echo "Captcha secrets for esignet configured sucessfully" + + ./copy_cm_func.sh secret esignet-captcha $NS captcha + + # Check if the second environment variable exists + ENV_VAR_EXISTS=$(kubectl -n captcha get deployment captcha -o jsonpath="{.spec.template.spec.containers[0].env[?(@.name=='MOSIP_CAPTCHA_SECRET_ESIGNET')].name}") + + if [[ -z "$ENV_VAR_EXISTS" ]]; then + # If the environment variable does not exist, add it + echo "Environment variable 'MOSIP_CAPTCHA_SECRET_ESIGNET' does not exist. Adding it..." + kubectl patch deployment -n captcha captcha --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/env/-", "value": {"name": "MOSIP_CAPTCHA_SECRET_ESIGNET", "valueFrom": {"secretKeyRef": {"name": "esignet-captcha", "key": "esignet-captcha-secret-key"}}}}]' + else + # If the environment variable exists, update it + echo "Environment variable 'MOSIP_CAPTCHA_SECRET_ESIGNET' exists. Updating it..." + kubectl patch deployment -n captcha captcha --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/env[?(@.name==\"MOSIP_CAPTCHA_SECRET_ESIGNET\")]", "value": {"name": "MOSIP_CAPTCHA_SECRET_ESIGNET", "valueFrom": {"secretKeyRef": {"name": "esignet-captcha", "key": "esignet-captcha-secret-key"}}}}]' + fi - echo Setting up dummy values for esignet misp license key - kubectl -n $NS create secret generic esignet-misp-onboarder-key --from-literal=mosip-esignet-misp-key='' --dry-run=client -o yaml | kubectl apply -f - elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then exit 1 else @@ -64,6 +79,8 @@ while true; do fi done + echo "Setting up dummy values for esignet misp license key" + kubectl -n $NS create secret generic esignet-misp-onboarder-key --from-literal=mosip-esignet-misp-key='' --dry-run=client -o yaml | kubectl apply -f - echo "All prerequisite services initialised successfully." return 0 diff --git a/deploy/oidc-ui/install.sh b/deploy/oidc-ui/install.sh index d06b3931d..fd811529a 100755 --- a/deploy/oidc-ui/install.sh +++ b/deploy/oidc-ui/install.sh @@ -9,7 +9,7 @@ fi function installing_oidc-ui() { while true; do - read -p "Do you want to continue installing OIDC ui? (y/n) :" + read -p "Do you want to continue installing OIDC ui? (y/n) :" ans if [ "$ans" = "Y" ] || [ "$ans" = "y" ]; then break elif [ "$ans" = "N" ] || [ "$ans" = "n" ]; then From 0120dcfc199d3a58fadd5e4046f7be3a7756932b Mon Sep 17 00:00:00 2001 From: ase-101 Date: Tue, 15 Oct 2024 23:35:40 +0530 Subject: [PATCH 15/80] [ES-842] Updated the stoplight (#944) (#945) Signed-off-by: Venkata Saidurga Polamraju Signed-off-by: ase-101 Co-authored-by: pvsaidurga <132046494+pvsaidurga@users.noreply.github.com> --- docs/esignet-openapi.yaml | 248 +++++++++++++++++--------------------- 1 file changed, 111 insertions(+), 137 deletions(-) diff --git a/docs/esignet-openapi.yaml b/docs/esignet-openapi.yaml index 3711b9a07..1705b2a17 100644 --- a/docs/esignet-openapi.yaml +++ b/docs/esignet-openapi.yaml @@ -1,6 +1,6 @@ openapi: 3.1.0 x-stoplight: - id: brrez13r7qzhu + id: 2vyk8uw76c0j6 info: version: '1.0' title: eSignet @@ -25,7 +25,6 @@ info: VID - Virtual Identifier
    PSUT - Partner(Relying Party) Specific User Token
    VC - Verifiable Credential
    - VCI - Verifiable Credential Issuance contact: name: MOSIP Team email: info@mosip.io @@ -113,6 +112,8 @@ paths: - 'mosip:idp:acr:linked-wallet' - 'mosip:idp:acr:biometrics' - 'mosip:idp:acr:knowledge' + - 'mosip:idp:acr:password' + - 'mosip:idp:acr:id-token' publicKey: type: object description: |- @@ -254,7 +255,7 @@ paths: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-internal: false x-stoplight: - id: e1d4eu0x68j1p + id: 6pu0p3a6mhqvr /client-mgmt/oauth-client: post: tags: @@ -274,6 +275,9 @@ paths: schema: type: object description: OIDC client details + required: + - requestTime + - request properties: requestTime: type: string @@ -282,6 +286,17 @@ paths: pattern: '' request: type: object + required: + - clientId + - clientName + - clientNameLangMap + - relyingPartyId + - logoUri + - authContextRefs + - publicKey + - userClaims + - grantTypes + - clientAuthMethods properties: clientId: type: string @@ -336,6 +351,9 @@ paths: - 'mosip:idp:acr:generated-code' - 'mosip:idp:acr:linked-wallet' - 'mosip:idp:acr:biometrics' + - 'mosip:idp:acr:knowledge' + - 'mosip:idp:acr:id-token' + - 'mosip:idp:acr:password' publicKey: type: object description: |- @@ -373,20 +391,6 @@ paths: minItems: 1 items: const: private_key_jwt - required: - - clientId - - clientName - - clientNameLangMap - - relyingPartyId - - logoUri - - authContextRefs - - publicKey - - userClaims - - grantTypes - - clientAuthMethods - required: - - requestTime - - request examples: example-1: value: @@ -484,7 +488,7 @@ paths: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-internal: false x-stoplight: - id: 4qas6grdwg52i + id: 91b3a1508w0a5 '/client-mgmt/oidc-client/{client_id}': put: tags: @@ -683,7 +687,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: 2lomzfcpvkti7 + id: zr1f21tws4y9y '/client-mgmt/oauth-client/{client_id}': put: tags: @@ -779,6 +783,9 @@ paths: - 'mosip:idp:acr:generated-code' - 'mosip:idp:acr:linked-wallet' - 'mosip:idp:acr:biometrics' + - 'mosip:idp:acr:id-token' + - 'mosip:idp:acr:password' + - 'mosip:idp:acr:knowledge' grantTypes: type: array description: Form of Authorization Grant presented to token endpoint. @@ -893,7 +900,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: 0syn4o80iequr + id: dnbbtzbmppcsl /authorize: get: tags: @@ -999,6 +1006,7 @@ paths: - 'mosip:idp:acr:linked-wallet' - 'mosip:idp:acr:biometrics' - 'mosip:idp:acr:knowledge' + - 'mosip:idp:acr:id-token' - name: claims_locales in: query description: 'End-User''s preferred languages and scripts for Claims being returned, represented as a space-separated list of BCP47 [RFC5646] language tag values, ordered by preference. An error SHOULD NOT result if some or all of the requested locales are not supported by the OpenID Provider.' @@ -1033,7 +1041,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: ntvz9gsgrcrs0 + id: xel51v9q4xtvm /authorization/oauth-details: post: tags: @@ -1253,7 +1261,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: rt6d6bz7i81fg + id: plbkmewzwbi21 /authorization/v2/oauth-details: post: tags: @@ -1495,7 +1503,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: stphc8pf72gcj + id: i5ht0irlohp9g /authorization/v3/oauth-details: post: tags: @@ -1747,7 +1755,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: stphc8pf72g3j + id: 0d1dmkcadb7iu /authorization/send-otp: post: tags: @@ -1789,12 +1797,19 @@ paths: application/json: schema: type: object + required: + - requestTime + - request properties: requestTime: type: string format: date-time request: type: object + required: + - transactionId + - individualId + - otpChannels properties: transactionId: type: string @@ -1810,18 +1825,11 @@ paths: items: type: string enum: - - sms + - phone - email captchaToken: type: string description: 'Captcha token, if enabled.' - required: - - transactionId - - individualId - - otpChannels - required: - - requestTime - - request examples: Example 1: value: @@ -1830,7 +1838,7 @@ paths: transactionId: vKb8cVbq9PX_yt46_hX0xlBJNExl9cnYtL8kGRxU5OM individualId: '464737289558' otpChannels: - - sms + - phone - email captchaToken: ALSKDJFURIEOQPZMKFURHFVBH responses: @@ -1886,7 +1894,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: ddwp0qjcl3qqm + id: olqbk7247688b /linked-authorization/send-otp: post: tags: @@ -1908,12 +1916,19 @@ paths: application/json: schema: type: object + required: + - requestTime + - request properties: requestTime: type: string format: date-time request: type: object + required: + - transactionId + - individualId + - otpChannels properties: transactionId: type: string @@ -1929,15 +1944,8 @@ paths: items: type: string enum: - - sms + - phone - email - required: - - transactionId - - individualId - - otpChannels - required: - - requestTime - - request examples: Example 1: value: @@ -1946,7 +1954,7 @@ paths: transactionId: EKb8cVbq9PX_yt46_hX0xlBJNExl9cnYtL8kGRxU5OM individualId: '464737289558' otpChannels: - - sms + - phone - email responses: '200': @@ -2000,7 +2008,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: sw4pr6esnw5b1 + id: ww5t6kob3q1sc /authorization/authenticate: post: tags: @@ -2130,7 +2138,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: ezsllgwqoyybl + id: yo34tum285pjb /authorization/v2/authenticate: post: tags: @@ -2268,7 +2276,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: fg9n5i9qqnpew + id: lrym71d3b78v6 /authorization/v3/authenticate: post: tags: @@ -2338,7 +2346,7 @@ paths: type: string description: |- Below property is used to validate captcha. - mosip.esignet.captcha.required.auth-factors={'PWD'} + mosip.esignet.captcha.required=send-otp,pwd,kbi Only when configured auth-factors are part of the authenticate request v3 endpoint will validate the input captcha token. required: @@ -2425,7 +2433,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: 3fzhp6a5kiyuj + id: 4kjy5afix1m2p /authorization/auth-code: post: tags: @@ -2552,7 +2560,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: nq394tdttz64r + id: 4nac0grjh3ckp /linked-authorization/link-code: post: tags: @@ -2660,7 +2668,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: zfy86qve5nb8j + id: 3dysrxbef3ht3 /linked-authorization/link-transaction: post: tags: @@ -2791,7 +2799,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: loz6cuzhjk6kf + id: 6tybrn5kekolm /linked-authorization/v2/link-transaction: post: tags: @@ -2931,7 +2939,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: hkhmrwg8vszvo + id: t2hbrly00fjl3 /linked-authorization/link-status: post: tags: @@ -3044,7 +3052,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: c94ue4yd3zoht + id: vj7j4uk0geldw /linked-authorization/authenticate: post: tags: @@ -3155,7 +3163,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: p2rv0q4ljfahv + id: 1gukg1x66cs69 /linked-authorization/v2/authenticate: post: tags: @@ -3274,7 +3282,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: oslqpp3amg74i + id: lozvgnj5yg1be /linked-authorization/consent: post: tags: @@ -3370,7 +3378,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: tz53kdjtajys3 + id: w1xz5wefevlib /linked-authorization/v2/consent: post: tags: @@ -3469,7 +3477,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: wrt1asaxfysfy + id: m3xipj5r1svou /linked-authorization/link-auth-code: post: tags: @@ -3590,7 +3598,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: wygk6uuclzisk + id: h35gkz1v60phs /authorization/claim-details: get: tags: @@ -3608,8 +3616,8 @@ paths: **Background:** During kyc-auth, integrated ID system should return the list of claim details for the authenticated end user. - We have introduced new method in the `Authenticator` plugin. new kycAuth method will be invoked only when verified claims are requested by the relying party. - Claims details returned during the kcy-auth is cached in the `OIDCTransaction` to give out during GET consent-details call. + We have introduced new method in the `Authenticator` plugin. New kycAuth method will be invoked only when verified claims are requested by the relying party. + Claims details returned during the kcy-auth is cached in the `OIDCTransaction` to give out during fetch claim details call. operationId: get-consent-details parameters: - name: oauth-details-hash @@ -3708,7 +3716,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: Rtu111tudafOR + id: b7jnx7byz0ek4 parameters: [] /authorization/prepare-signup-redirect: post: @@ -3765,7 +3773,7 @@ paths: description: uuid=encoded-json operationId: post-authorization-prepare-signup-redirect x-stoplight: - id: 8bfv2zmvn8sls + id: 9wb2ekkaeg7mk parameters: - schema: type: string @@ -3908,7 +3916,7 @@ paths: x-stoplight: id: hnn4m8lfunl6d enum: - - VERIFICATION_COMPLETE + - COMPLETED errors: type: array description: 'List of Errors in case of request validation / processing failure in Idp server. if failure from IDA, the same error is relayed in this response.' @@ -3928,14 +3936,14 @@ paths: value: responseTime: string response: - status: VERIFICATION_COMPLETE + status: COMPLETED errors: - errorCode: invalid_transaction errorMessage: string servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: s59k6nihfltli + id: 5nj96giav3npy /oauth/token: post: tags: @@ -4081,7 +4089,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: a6ietxsl503wc + id: cdwhsjgoq9xbf /oauth/v2/token: post: tags: @@ -4244,7 +4252,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: s7ovkxzf27ndv + id: zkcvd1seyedmd /oidc/userinfo: get: tags: @@ -4315,7 +4323,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: 6ro1i3ag7h424 + id: 5dgir3dl27lvp /binding/binding-otp: post: tags: @@ -4339,11 +4347,17 @@ paths: application/json: schema: type: object + required: + - requestTime + - request properties: requestTime: type: string request: type: object + required: + - individualId + - otpChannels properties: individualId: type: string @@ -4353,12 +4367,6 @@ paths: description: Channels to which OTP should be delivered. items: type: string - required: - - individualId - - otpChannels - required: - - requestTime - - request examples: Example 1: value: @@ -4387,6 +4395,9 @@ paths: maskedMobile: type: string description: Masked mobile number of the individualId user. + transactionId: + type: string + description: oauth-details transactionId is used until the /token call. errors: type: array items: @@ -4416,7 +4427,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: xnl3gyq4v4bh4 + id: d3di5edwwt70b /binding/wallet-binding: post: tags: @@ -4554,7 +4565,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: nnoxi9ubatper + id: chsz43i4s7rkd /.well-known/jwks.json: get: tags: @@ -4638,7 +4649,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: kdk405b8t3z8c + id: azj8cuvdurps6 /.well-known/openid-configuration: get: tags: @@ -4835,7 +4846,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: lmo16h00dfu9w + id: o0uqnqgz9zm7j /oauth/introspect: get: tags: @@ -4891,7 +4902,7 @@ paths: servers: - url: 'https://esignet.collab.mosip.net/v1/esignet' x-stoplight: - id: jjlsk4bwyn9s8 + id: o9h010bmb1db5 tags: - name: Management description: Management level API's used for internal use. @@ -4939,7 +4950,7 @@ components: **Note:** Unknown claim names either in userinfo or id_token are ignored. x-stoplight: - id: hgny5fmmpiwsg + id: hhww7s6bqjn8j properties: userinfo: type: object @@ -4983,7 +4994,7 @@ components: type: object title: ClaimDetail x-stoplight: - id: b1gdl2i51ubba + id: 4enwly0dhq8tp properties: essential: type: boolean @@ -5031,13 +5042,13 @@ components: required: - type x-stoplight: - id: rn56y4vja1x6o + id: 50labrntmysgm AuthChallenge: type: object title: AuthChallenge description: Model to take any type of challenge from the end user as part of authenticate request. x-stoplight: - id: 7jq6fwka3vzhb + id: thl682syr59bm required: - authFactorType - challenge @@ -5066,53 +5077,10 @@ components: - number - base64url-encoded-json description: Format of the challenge provided. - CredentialProof: - type: object - title: CredentialProof - description: JSON object containing proof of possession of the key material the issued Credential shall be bound to. - properties: - proof_type: - const: jwt - description: The proof object MUST contain a proof_type claim of type JSON string denoting the concrete proof type. - jwt: - type: string - description: 'When proof_type is jwt, a proof object MUST include a jwt claim' - cwt: - type: string - description: 'When proof_type is cwt, a proof object MUST include a cwt claim' - required: - - proof_type - x-stoplight: - id: s4cu9uw18jk3l - CredentialDefinition: - type: object - title: CredentialDefinition - description: |- - JSON object containing (and isolating) the detailed description of the credential type. - * This object MUST be processed using full JSON-LD processing. - * It consists of the following sub claims: - * @context: REQUIRED. JSON array - * types: REQUIRED. JSON array. This claim contains the type values the Wallet shall request - * in the subsequent Credential Request. - properties: - '@context': - type: array - items: - type: string - type: - type: array - items: - type: string - credentialSubject: - type: object - required: - - type - x-stoplight: - id: ezs7iae5jlgln ClaimStatus: title: ClaimStatus x-stoplight: - id: vs8sddewhp5u8 + id: o85s4acpltciv type: object description: Resolved claims among the RP requested claims with their availability and verification status. required: @@ -5135,15 +5103,10 @@ components: x-stoplight: id: 8z1n64eu4tc1f description: True only if the claim is available and verified by atleast one trust framework. And also the verification process completed before the requested max_age. - purpose: - type: string - x-stoplight: - id: lkp89wz5vzwr2 - description: Purpose of the claim as provided in the authorize request by the relying party VerifiedClaimDetail: title: VerifiedClaimDetail x-stoplight: - id: 43qa5nmghhig5 + id: ombll0ox1abk0 type: object description: |- Verified claim detail that can be requested by the RP @@ -5318,6 +5281,17 @@ components: + + + + + + + + + + + JSON array representing the checks done in relation to the evidence. When present this array MUST have at least one member. This is applicable only for below evidence types: 1. document @@ -5443,7 +5417,7 @@ components: EvidenceCheckDetail: title: EvidenceCheckDetail x-stoplight: - id: n7ner5gwl8rzf + id: 56ntbetl6kt55 type: object description: |- Object representing the checks done in relation to the evidence. @@ -5480,7 +5454,7 @@ components: FilterCriteria: title: FilterCriteria x-stoplight: - id: enmdhvn8sjsg9 + id: xvfexlq01bb2w type: object description: Value or values used to filter the verified claims. if provided in the values parameter its a logical OR condition. properties: @@ -5499,7 +5473,7 @@ components: EvidenceIssuer: title: EvidenceIssuer x-stoplight: - id: cs2jghno7hu8d + id: hia062eivzuvp type: object description: ' JSON object containing information about the issuer of this document.' properties: @@ -5526,7 +5500,7 @@ components: ElectronicRecord: title: ElectronicRecord x-stoplight: - id: sma63x9gvcoi3 + id: 79aws43989s8i type: object description: 'JSON object representing the record used to perform the identity verification. It consists of the following properties:' properties: From 298844060911c1adb845960ffbab9c0dc7f1ae99 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Wed, 16 Oct 2024 00:33:08 +0530 Subject: [PATCH 16/80] ES-842 Using mulitple profiles to avoid duplicate configuration Signed-off-by: ase-101 --- docker-compose/docker-compose.yml | 7 +- esignet-service/configure_start.sh | 7 + .../resources/application-local.properties | 377 +----------------- .../src/main/resources/bootstrap.properties | 2 +- 4 files changed, 25 insertions(+), 368 deletions(-) diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 2d438f128..5ba0eb65f 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -24,18 +24,15 @@ services: - database esignet: - image: 'mosipdev/esignet:release-1.5.x' + image: mosipdev/esignet:release-1.5.x user: root ports: - 8088:8088 environment: - container_user=mosip - - active_profile_env=local + - active_profile_env=default,local - plugin_name_env=esignet-mock-plugin.jar - - KAFKA_ENABLED=false - - SPRING_AUTOCONFIGURE_EXCLUDE=org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration - SPRING_DATASOURCE_URL=jdbc:postgresql://database:5432/mosip_esignet?currentSchema=esignet - - SPRING_CACHE_TYPE=simple - MOSIP_ESIGNET_MOCK_DOMAIN_URL=http://mock-identity-system:8082 depends_on: - database diff --git a/esignet-service/configure_start.sh b/esignet-service/configure_start.sh index 2f82143f9..19346edb9 100644 --- a/esignet-service/configure_start.sh +++ b/esignet-service/configure_start.sh @@ -69,5 +69,12 @@ else exit 1 fi +## set active profile if not set +if [[ -z "$active_profile_env" ]]; then + echo "Alert: active_profile_env is not set. setting to default" + active_profile_env="default" + export active_profile_env +fi + cd $work_dir exec "$@" diff --git a/esignet-service/src/main/resources/application-local.properties b/esignet-service/src/main/resources/application-local.properties index 802a3a338..6d7bc0c66 100644 --- a/esignet-service/src/main/resources/application-local.properties +++ b/esignet-service/src/main/resources/application-local.properties @@ -2,393 +2,46 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at https://mozilla.org/MPL/2.0/. +## Domain configurations +mosip.esignet.domain.url=http://localhost:8088 +mosip.signup.domain.url=http://localhost:8089 mosip.esignet.mock.domain.url=http://localhost:8082 -logging.level.io.mosip.esignet=DEBUG - -## eSignet configurations +## ACR & AMR mapping configurations mosip.esignet.amr-acr-mapping-file-path=amr_acr_mapping.json -mosip.esignet.auth-txn-id-length=10 -mosip.esignet.supported-id-regex=\\S* -# Generated ID and access tokens 'exp' depends on the below properties, default value is 1-hour -mosip.esignet.id-token-expire-seconds=3600 -mosip.esignet.access-token-expire-seconds=3600 -# By default, only 2 link codes can be active, and the time period it can be active is defined here, default value is 1 minute -mosip.esignet.link-code-expire-in-secs=600 -# Number of link code allowed to be generated in a transaction, the default value is 10 -mosip.esignet.generate-link-code.limit-per-transaction=10 -# Time to complete consent after successful authentication, the default value is 120 -mosip.esignet.authentication-expire-in-secs=600 -# Time to complete authentication -mosip.esignet.preauthentication-expire-in-secs=600 - -## Auth challenge type & format mapping. Auth challenge length validations for each auth factor type. -mosip.esignet.auth-challenge.OTP.format=alpha-numeric -mosip.esignet.auth-challenge.OTP.min-length=6 -mosip.esignet.auth-challenge.OTP.max-length=6 - -mosip.esignet.auth-challenge.PWD.format=alpha-numeric -mosip.esignet.auth-challenge.PWD.min-length=8 -mosip.esignet.auth-challenge.PWD.max-length=30 - -mosip.esignet.auth-challenge.BIO.format=encoded-json -mosip.esignet.auth-challenge.BIO.min-length=500 -mosip.esignet.auth-challenge.BIO.max-length=4000 - -mosip.esignet.auth-challenge.WLA.format=jwt -mosip.esignet.auth-challenge.WLA.min-length=500 -mosip.esignet.auth-challenge.WLA.max-length=800 -mosip.esignet.auth-challenge.KBI.format=base64url-encoded-json -mosip.esignet.auth-challenge.KBI.min-length=50 -mosip.esignet.auth-challenge.KBI.max-length=100 - -mosip.esignet.auth-challenge.PIN.format=number -mosip.esignet.auth-challenge.PIN.min-length=6 -mosip.esignet.auth-challenge.PIN.max-length=6 - -mosip.esignet.auth-challenge.IDT.format=base64url-encoded-json -mosip.esignet.auth-challenge.IDT.min-length=20 -mosip.esignet.auth-challenge.IDT.max-length=2000 - -mosip.esignet.claim-detail.purpose.min-length=3 -mosip.esignet.claim-detail.purpose.max-length=300 - -## Endpoints required to have oauth-details-hash and oauth-details-key HTTP header -mosip.esignet.header-filter.paths-to-validate={'${server.servlet.path}/authorization/send-otp', \ - '${server.servlet.path}/authorization/authenticate', \ - '${server.servlet.path}/authorization/v2/authenticate', \ - '${server.servlet.path}/authorization/v3/authenticate', \ - '${server.servlet.path}/authorization/auth-code',\ - '${server.servlet.path}/authorization/prepare-signup-redirect',\ - '${server.servlet.path}/authorization/claim-details',\ - '${server.servlet.path}/authorization/complete-signup-redirect' } - -## captcha validation is enabled for the auth-factors - otp, pwd, bio and pin. +## Captcha configurations mosip.esignet.captcha.required= -mosip.esignet.captcha.validator-url=http://captcha.captcha/v1/captcha/validatecaptcha -mosip.esignet.captcha.module-name=esignet mosip.esignet.captcha.site-key=test-site-key -## Applicable for signup redirection to update profile -mosip.esignet.signup-id-token-expire-seconds=1800 -mosip.esignet.signup-id-token-audience=mosip-signup-oauth-client - -## ------------------------------------------ e-Signet binding --------------------------------------------------------- -mosip.esignet.binding.salt-length=16 -mosip.esignet.binding.audience-id=esignet-binding -mosip.esignet.binding.key-expire-days=10 - -## -------------------------------------- Authentication & Authorization ----------------------------------------------- +## Security configurations mosip.esignet.security.auth.post-urls={} mosip.esignet.security.auth.put-urls={} mosip.esignet.security.auth.get-urls={} +spring.security.oauth2.resourceserver.jwt.issuer-uri= +spring.security.oauth2.resourceserver.jwt.jwk-set-uri=http://localhost:8080/auth/realms/mosip/protocol/openid-connect/certs -mosip.esignet.security.ignore-csrf-urls=${server.servlet.path}/oidc/**,${server.servlet.path}/oauth/**,\ - ${server.servlet.path}/actuator/**,/favicon.ico,${server.servlet.path}/error,\ - ${server.servlet.path}/swagger-ui/**,${server.servlet.path}/v3/api-docs/**,\ - ${server.servlet.path}/linked-authorization/link-transaction,${server.servlet.path}/linked-authorization/authenticate,\ - ${server.servlet.path}/linked-authorization/consent,${server.servlet.path}/binding/**,${server.servlet.path}/client-mgmt/**,\ - ${server.servlet.path}/system-info/**,${server.servlet.path}/linked-authorization/v2/link-transaction,\ - ${server.servlet.path}/linked-authorization/v2/authenticate,${server.servlet.path}/linked-authorization/v2/consent - -mosip.esignet.security.ignore-auth-urls=${server.servlet.path}/csrf/**,${server.servlet.path}/authorization/**,\ - ${server.servlet.path}/linked-authorization/**,${server.servlet.path}/oidc/**,${server.servlet.path}/oauth/**,\ - ${server.servlet.path}/actuator/**,/favicon.ico,${server.servlet.path}/error,${server.servlet.path}/swagger-ui/**,\ - ${server.servlet.path}/v3/api-docs/**,${server.servlet.path}/binding/** - -##------------------------------------------ Kafka configurations ------------------------------------------------------ +## Kafka configurations kafka.enabled=false spring.autoconfigure.exclude=org.springframework.boot.autoconfigure.kafka.KafkaAutoConfiguration spring.kafka.bootstrap-servers=localhost:9092 -spring.kafka.consumer.group-id=esignet-consumer -spring.kafka.consumer.enable-auto-commit=true -#spring.kafka.listener.concurrency=1 - -mosip.esignet.kafka.linked-session.topic=esignet-linked -mosip.esignet.kafka.linked-auth-code.topic=esignet-consented - -## ------------------------------------------ oauth & openid supported values ------------------------------------------ - -## supported scopes -mosip.esignet.supported.authorize.scopes={'Manage-Identity-Data','Manage-VID','Manage-Authentication','Manage-Service-Requests','Manage-Credentials'} -mosip.esignet.supported.openid.scopes={'profile','email','phone'} -mosip.esignet.openid.scope.claims={'profile' : {'name','address','gender','birthdate','picture','email','phone_number','phone_number_verified','registration_type','updated_at'},'email' : {'email'}, 'phone' : {'phone_number','phone_number_verified'}} -mosip.esignet.supported.credential.scopes={'mosip_identity_vc_ldp'} -mosip.esignet.credential.scope-resource-mapping={ 'mosip_identity_vc_ldp': '${mosip.esignet.domain.url}${server.servlet.path}/vci/credential'} - -## supported authorization processing flow to be used, Currently only supports Authorization Code Flow. -mosip.esignet.supported.response.types={'code'} - -## Form of Authorization Grant presented to token endpoint -mosip.esignet.supported.grant.types={'authorization_code'} - -## specifies how the Authorization Server displays the authentication and consent user interface pages to the End-User -# page-The Authorization Server SHOULD display the authentication and consent UI consistent with a full User Agent page view. If the display parameter is not specified, this is the default display mode. -# popup-The Authorization Server SHOULD display the authentication and consent UI consistent with a popup User Agent window. The popup User Agent window should be of an appropriate size for a login-focused dialog and should not obscure the entire window that it is popping up over. -# touch-The Authorization Server SHOULD display the authentication and consent UI consistent with a device that leverages a touch interface. -# wap-The Authorization Server SHOULD display the authentication and consent UI consistent with a "feature phone" type display. -mosip.esignet.supported.ui.displays={'page','popup','touch','wap'} - -## specifies whether the Authorization Server prompts the End-User for reauthentication and consent -# none-The Authorization Server MUST NOT display any authentication or consent user interface pages. -# An error is returned if an End-User is not already authenticated or the Client does not have pre-configured consent -# for the requested Claims or does not fulfill other conditions for processing the request. -# The error code will typically be login_required, interaction_required, or another code defined in Section 3.1.2.6. -# This can be used as a method to check for existing authentication and/or consent. -# login-The Authorization Server SHOULD prompt the End-User for reauthentication. If it cannot reauthenticate the End-User, \ -# it MUST return an error, typically login_required. -# consent-The Authorization Server SHOULD prompt the End-User for consent before returning information to the Client. -# If it cannot obtain consent, it MUST return an error, typically consent_required. -# select_account-The Authorization Server SHOULD prompt the End-User to select a user account. This enables an End-User -# who has multiple accounts at the Authorization Server to select amongst the multiple accounts that they might have current -# sessions for. If it cannot obtain an account selection choice made by the End-User, it MUST return an error, -# typically account_selection_required. -mosip.esignet.supported.ui.prompts={'none','login','consent','select_account'} - -## Type of the client assertion -mosip.esignet.supported.client.assertion.types={'urn:ietf:params:oauth:client-assertion-type:jwt-bearer'} - -## Type of the client authentication methods for token endpoint -mosip.esignet.supported.client.auth.methods={'private_key_jwt'} - -## Only S256 method supported -mosip.esignet.supported-pkce-methods={'S256'} - -## ---------------------------------------- Cache configuration -------------------------------------------------------- -mosip.esignet.cache.secure.individual-id=true -mosip.esignet.cache.store.individual-id=true -mosip.esignet.cache.security.secretkey.reference-id=TRANSACTION_CACHE -mosip.esignet.cache.security.algorithm-name=AES/ECB/PKCS5Padding -mosip.esignet.cache.key.hash.algorithm=SHA3-256 - -mosip.esignet.cache.names=clientdetails,preauth,authenticated,authcodegenerated,userinfo,linkcodegenerated,linked,linkedcode,linkedauth,consented,authtokens,bindingtransaction,apiratelimit,blocked,halted - -# 'simple' cache type is only applicable only for Non-Production setup -spring.cache.type=redis -spring.cache.cache-names=${mosip.esignet.cache.names} +## Redis configuration +spring.cache.type=simple spring.redis.host=localhost spring.redis.port=6379 -management.health.redis.enabled=false - -# Cache size setup is applicable only for 'simple' cache type. -# Cache size configuration will not be considered with 'Redis' cache type -mosip.esignet.cache.size={'clientdetails' : 200, \ -'preauth': 200, \ -'authenticated': 200, \ -'authcodegenerated': 200, \ -'userinfo': 200, \ -'linkcodegenerated' : 500, \ -'linked': 200 , \ -'linkedcode': 200, \ -'linkedauth' : 200 , \ -'consented' :200, \ -'authtokens': 2, \ -'bindingtransaction': 200, \ -'apiratelimit' : 500, \ -'blocked': 500, \ -'halted' : 500 } - -# Cache expire in seconds is applicable for both 'simple' and 'Redis' cache type -mosip.esignet.cache.expire-in-seconds={'clientdetails' : 86400, \ -'preauth': ${mosip.esignet.preauthentication-expire-in-secs},\ -'authenticated': ${mosip.esignet.authentication-expire-in-secs}, \ -'authcodegenerated': 600, \ -'userinfo': ${mosip.esignet.access-token-expire-seconds}, \ -'linkcodegenerated' : ${mosip.esignet.link-code-expire-in-secs}, \ -'linked': 600, \ -'linkedcode': ${mosip.esignet.link-code-expire-in-secs}, \ -'linkedauth' : ${mosip.esignet.authentication-expire-in-secs}, \ -'consented': 600, \ -'authtokens': 86400, \ -'bindingtransaction': 600, \ -'apiratelimit' : 180, \ -'blocked': 300, \ -'halted' : ${mosip.esignet.signup-id-token-expire-seconds} } - -## ------------------------------------------ Discovery openid-configuration ------------------------------------------- - -mosip.esignet.domain.url=http://localhost:8088 -mosip.esignet.discovery.issuer-id=${mosip.esignet.domain.url}${server.servlet.path} -# This property holds ./wellknown/jwks.json URL, -# for local deployments without esignet-ui nginx change the value to ${mosip.esignet.domain.url}${server.servlet.path}/oauth/.well-known/jwks.json -mosip.esignet.jwks-uri=${mosip.esignet.domain.url}/.well-known/jwks.json - -mosip.esignet.token.endpoint=${mosip.esignet.domain.url}${server.servlet.path}/oauth/v2/token - -mosip.esignet.oauth.key-values={'issuer': '${mosip.esignet.domain.url}' ,\ - \ 'authorization_endpoint': '${mosip.esignet.domain.url}/authorize' , \ - \ 'token_endpoint': '${mosip.esignet.token.endpoint}' , \ - \ 'jwks_uri' : '${mosip.esignet.jwks-uri}' , \ - \ 'token_endpoint_auth_methods_supported' : ${mosip.esignet.supported.client.auth.methods}, \ - \ 'token_endpoint_auth_signing_alg_values_supported' : {'RS256'},\ - \ 'scopes_supported' : ${mosip.esignet.supported.openid.scopes}, \ - \ 'response_modes_supported' : { 'query' }, \ - \ 'grant_types_supported' : ${mosip.esignet.supported.grant.types},\ - \ 'response_types_supported' : ${mosip.esignet.supported.response.types}} - -mosip.esignet.discovery.key-values={'issuer': '${mosip.esignet.domain.url}' ,\ - \ 'authorization_endpoint': '${mosip.esignet.domain.url}/authorize' , \ - \ 'token_endpoint': '${mosip.esignet.token.endpoint}' ,\ - \ 'userinfo_endpoint' : '${mosip.esignet.domain.url}${server.servlet.path}/oidc/userinfo' ,\ - \ 'jwks_uri' : '${mosip.esignet.jwks-uri}' , \ - \ 'scopes_supported' : ${mosip.esignet.supported.openid.scopes}, \ - \ 'response_types_supported' : ${mosip.esignet.supported.response.types}, \ - \ 'acr_values_supported' : {'mosip:idp:acr:knowledge', 'mosip:idp:acr:password', 'mosip:idp:acr:static-code', 'mosip:idp:acr:generated-code', 'mosip:idp:acr:linked-wallet', 'mosip:idp:acr:biometrics'},\ - \ 'userinfo_signing_alg_values_supported' : {'RS256'}, \ - \ 'userinfo_encryption_alg_values_supported' : {'RSAXXXXX'},\ - \ 'userinfo_encryption_enc_values_supported' : {'A128GCM'}, \ - \ 'response_modes_supported' : { 'query' }, \ - \ 'token_endpoint_auth_methods_supported' : ${mosip.esignet.supported.client.auth.methods}, \ - \ 'token_endpoint_auth_signing_alg_values_supported' : {'RS256'}, \ - \ 'id_token_signing_alg_values_supported' : {'RS256'}, \ - \ 'claim_types_supported': {'normal'}, \ - \ 'claims_parameter_supported' : true, \ - \ 'display_values_supported' : ${mosip.esignet.supported.ui.displays}, \ - \ 'subject_types_supported' : { 'pairwise' }, \ - \ 'claims_supported' : {'name','address','gender','birthdate','picture','email','phone_number','individual_id','phone_number_verified','registration_type','updated_at'}, \ - \ 'claims_locales_supported' : {'en'}, \ - \ 'request_parameter_supported' : false, \ - \ 'display_values_supported' : ${mosip.esignet.supported.ui.displays}, \ - \ 'ui_locales_supported' : {'en'} } - -##----------------------------------------- Database properties -------------------------------------------------------- +## Database configuration mosip.esignet.database.hostname=localhost mosip.esignet.database.port=5455 mosip.esignet.database.name=mosip_esignet mosip.esignet.database.username=postgres -spring.datasource.url=jdbc:postgresql://${mosip.esignet.database.hostname}:${mosip.esignet.database.port}/${mosip.esignet.database.name}?currentSchema=esignet -spring.datasource.username=${mosip.esignet.database.username} spring.datasource.password=postgres -spring.jpa.database-platform=org.hibernate.dialect.PostgreSQL95Dialect -spring.jpa.show-sql=false -spring.jpa.hibernate.ddl-auto=none -spring.jpa.properties.hibernate.jdbc.lob.non_contextual_creation=true - -#------------------------------------ Key-manager specific properties -------------------------------------------------- -#Crypto asymmetric algorithm name -mosip.kernel.crypto.asymmetric-algorithm-name=RSA/ECB/OAEPWITHSHA-256ANDMGF1PADDING -#Crypto symmetric algorithm name -mosip.kernel.crypto.symmetric-algorithm-name=AES/GCM/PKCS5Padding -#Keygenerator asymmetric algorithm name -mosip.kernel.keygenerator.asymmetric-algorithm-name=RSA -#Keygenerator symmetric algorithm name -mosip.kernel.keygenerator.symmetric-algorithm-name=AES -#Asymmetric algorithm key length -mosip.kernel.keygenerator.asymmetric-key-length=2048 -#Symmetric algorithm key length -mosip.kernel.keygenerator.symmetric-key-length=256 -#Encrypted data and encrypted symmetric key separator -mosip.kernel.data-key-splitter=#KEY_SPLITTER# -#GCM tag length -mosip.kernel.crypto.gcm-tag-length=128 -#Hash algo name -mosip.kernel.crypto.hash-algorithm-name=PBKDF2WithHmacSHA512 -#Symmtric key length used in hash -mosip.kernel.crypto.hash-symmetric-key-length=256 -#No of iterations in hash -mosip.kernel.crypto.hash-iteration=100000 -#Sign algo name -mosip.kernel.crypto.sign-algorithm-name=RS256 -#Certificate Sign algo name -mosip.kernel.certificate.sign.algorithm=SHA256withRSA - -#Type of keystore, Supported Types: PKCS11, PKCS12, Offline, JCE +## Keymanager configuration mosip.kernel.keymanager.hsm.keystore-type=PKCS12 -# For PKCS11 provide Path of config file. -# For PKCS12 keystore type provide the p12/pfx file path. P12 file will be created internally so provide only file path & file name. -# For Offline & JCE property can be left blank, specified value will be ignored. mosip.kernel.keymanager.hsm.config-path=esignet_local.p12 -# Passkey of keystore for PKCS11, PKCS12 -# For Offline & JCE proer can be left blank. JCE password use other JCE specific properties. mosip.kernel.keymanager.hsm.keystore-pass=localtest -mosip.kernel.keymanager.certificate.default.common-name=www.mosip.io -mosip.kernel.keymanager.certificate.default.organizational-unit=MOSIP-TECH-CENTER -mosip.kernel.keymanager.certificate.default.organization=IITB -mosip.kernel.keymanager.certificate.default.location=BANGALORE -mosip.kernel.keymanager.certificate.default.state=KA -mosip.kernel.keymanager.certificate.default.country=IN - -mosip.kernel.keymanager.softhsm.certificate.common-name=www.mosip.io -mosip.kernel.keymanager.softhsm.certificate.organizational-unit=MOSIP -mosip.kernel.keymanager.softhsm.certificate.organization=IITB -mosip.kernel.keymanager.softhsm.certificate.country=IN - -# Application Id for PMS master key. -mosip.kernel.partner.sign.masterkey.application.id=PMS -mosip.kernel.partner.allowed.domains=DEVICE - -mosip.kernel.keymanager-service-validate-url=https://${mosip.hostname}/keymanager/validate -mosip.kernel.keymanager.jwtsign.validate.json=false -mosip.keymanager.dao.enabled=false -crypto.PrependThumbprint.enable=true - -mosip.kernel.keymgr.hsm.health.check.enabled=true -mosip.kernel.keymgr.hsm.health.key.app-id=OIDC_SERVICE -mosip.kernel.keymgr.hsm.healthkey.ref-id=TRANSACTION_CACHE -mosip.kernel.keymgr.hsm.health.check.encrypt=true - -## -------------------------------------------- IDP-UI config ---------------------------------------------------------- - -# NOTE: -# 1. linked-transaction-expire-in-secs value should be a sum of 'mosip.esignet.authentication-expire-in-secs' and 'linked' cache expire in seconds under mosip.esignet.cache.expire-in-seconds property -# 2. A new Qrcode will be autogenerated before the expiry of current qr-code, and the time difference in seconds for the same is defined in wallet.qr-code-buffer-in-secs property -# 3. If esignet is deployed with MOSIP IDA, then 'resend.otp.delay.secs' must be the same as 'mosip.kernel.otp.expiry-time' - -mosip.esignet.ui.wallet.config={{'wallet.name': 'walletName', 'wallet.logo-url': '/images/qr_code.png', 'wallet.download-uri': '#', \ - 'wallet.deep-link-uri': 'inji://landing-page-name?linkCode=LINK_CODE&linkExpireDateTime=LINK_EXPIRE_DT' }} - -mosip.signup.domain.url=http://localhost:8089 -mosip.esignet.ui.signup.config={'signup.banner': true, 'signup.url': '${mosip.signup.domain.url}/signup'} -mosip.esignet.ui.forgot-password.config={'forgot-password': true, 'forgot-password.url': '${mosip.signup.domain.url}/reset-password'} -mosip.esignet.ui.eKYC-steps.url=${mosip.signup.domain.url}/identity-verification - -## Configuration required to display KBI form. -# individual-id-field is set with field id which should be considered as an individual ID in the authenticate request. -# form-details holds the list of field details like below: -# id -> unique field Id, type -> holds datatype, format -> only supported for date fields, regex -> pattern to validate the input value, maxLength -> number of allowed characters -# Example: mosip.esignet.authenticator.default.auth-factor.kba.field-details={{'id': '${mosip.esignet.authenticator.default.auth-factor.kba.individual-id-field}', 'type':'text', 'format':'', 'maxLength': 50, 'regex': '^\\s*[+-]?(\\d+|\\d*\\.\\d+|\\d+\\.\\d*)([Ee][+-]?\\d*)?\\s*$'},{'id':'fullName', 'type':'text', 'format':'', 'maxLength': 50, 'regex': '^[A-Za-z\\s]{1,}[\\.]{0,1}[A-Za-z\\s]{0,}$'},{'id':'dob', 'type':'date', 'format':'dd/mm/yyyy'}} -mosip.esignet.authenticator.default.auth-factor.kbi.individual-id-field= -mosip.esignet.authenticator.default.auth-factor.kbi.field-details={} - -mosip.esignet.ui.config.otp.length=6 -mosip.esignet.ui.config.password.regex=^.{8,20}$ -mosip.esignet.ui.config.password.max-length=20 -mosip.esignet.ui.config.username.regex=.* -mosip.esignet.ui.config.username.prefix= -mosip.esignet.ui.config.username.postfix= -mosip.esignet.ui.config.username.max-length=12 -mosip.esignet.ui.config.username.input-type=text - -mosip.esignet.ui.config.key-values={'sbi.env': '${mosip.esignet.authenticator.ida-env:Developer}', 'sbi.timeout.DISC': 30, \ - 'sbi.timeout.DINFO': 30, 'sbi.timeout.CAPTURE': 30, 'sbi.capture.count.face': 1, 'sbi.capture.count.finger': 1, \ - 'sbi.capture.count.iris': 1, 'sbi.capture.score.face': 70, 'sbi.capture.score.finger':70, 'sbi.capture.score.iris':70, \ - 'resend.otp.delay.secs': ${mosip.kernel.otp.expiry-time:180}, 'send.otp.channels' : '${mosip.esignet.authenticator.ida.otp-channels:email,phone}', \ - 'captcha.sitekey' : '${mosip.esignet.captcha.site-key}', 'captcha.enable' : '${mosip.esignet.captcha.required}', \ - 'auth.txnid.length' : '${mosip.esignet.auth-txn-id-length}', \ - 'preauth-screen-timeout-in-secs':${mosip.esignet.preauthentication-expire-in-secs}, \ - 'consent.screen.timeout-in-secs':${mosip.esignet.authentication-expire-in-secs}, \ - 'consent.screen.timeout-buffer-in-secs': 5, 'linked-transaction-expire-in-secs': 240, 'sbi.port.range': '4501-4600', \ - 'sbi.bio.subtypes.iris': 'UNKNOWN', 'sbi.bio.subtypes.finger': 'UNKNOWN', 'wallet.qr-code-buffer-in-secs': 10, \ - 'otp.length': ${mosip.esignet.ui.config.otp.length}, \ - 'password.regex': '${mosip.esignet.ui.config.password.regex}', \ - 'password.max-length': ${mosip.esignet.ui.config.password.max-length}, \ - 'username.regex': '${mosip.esignet.ui.config.username.regex}',\ - 'username.prefix': '${mosip.esignet.ui.config.username.prefix}', \ - 'username.postfix': '${mosip.esignet.ui.config.username.postfix}', \ - 'username.max-length': ${mosip.esignet.ui.config.username.max-length}, \ - 'username.input-type': '${mosip.esignet.ui.config.username.input-type}', 'wallet.config': ${mosip.esignet.ui.wallet.config}, \'signup.config': ${mosip.esignet.ui.signup.config}, \ - 'forgot-password.config': ${mosip.esignet.ui.forgot-password.config}, \ - 'eKYC-steps.config': '${mosip.esignet.ui.eKYC-steps.url}', \ - 'error.banner.close-timer': 10,\ - 'auth.factor.kbi.individual-id-field' : '${mosip.esignet.authenticator.default.auth-factor.kbi.individual-id-field}',\ - 'auth.factor.kbi.field-details': ${mosip.esignet.authenticator.default.auth-factor.kbi.field-details}} - -##-------------------------------------------- Default Integrations ----------------------------------------------------- - -mosip.esignet.integration.audit-plugin=LoggerAuditService -mosip.esignet.integration.key-binder=NoOpKeyBinder +## Logging configuration +logging.level.io.mosip.esignet=DEBUG \ No newline at end of file diff --git a/esignet-service/src/main/resources/bootstrap.properties b/esignet-service/src/main/resources/bootstrap.properties index 4077637b0..eeb3a3cc4 100644 --- a/esignet-service/src/main/resources/bootstrap.properties +++ b/esignet-service/src/main/resources/bootstrap.properties @@ -5,7 +5,7 @@ ## Application Name spring.application.name=esignet spring.cloud.config.uri=http://localhost:8888 -spring.profiles.active=local +spring.profiles.active=default,local server.port=8088 server.servlet.path=/v1/esignet From e1d9b82fb0c1965fe91f8e9032ef95ac54afbcab Mon Sep 17 00:00:00 2001 From: rajapandi1234 <138785181+rajapandi1234@users.noreply.github.com> Date: Fri, 18 Oct 2024 12:23:42 +0530 Subject: [PATCH 17/80] Delete .github/workflows/codeql-analysis.yml (#965) Signed-off-by: rajapandi1234 <138785181+rajapandi1234@users.noreply.github.com> --- .github/workflows/codeql-analysis.yml | 37 --------------------------- 1 file changed, 37 deletions(-) delete mode 100644 .github/workflows/codeql-analysis.yml diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml deleted file mode 100644 index 8a663931d..000000000 --- a/.github/workflows/codeql-analysis.yml +++ /dev/null @@ -1,37 +0,0 @@ -# For most projects, this workflow file will not need changing; you simply need -# to commit it to your repository. -# -# You may wish to alter this file to override the set of languages analyzed, -# or to provide custom queries or build logic. -# -# ******** NOTE ******** -# We have attempted to detect the languages in your repository. Please check -# the `language` matrix defined below to confirm you have the correct set of -# supported CodeQL languages. -# -name: "CodeQL" - -on: - release: - types: [published] - pull_request: - types: [opened] - workflow_dispatch: - inputs: - message: - description: 'Message for manually triggering' - required: false - default: 'Triggered for Updates' - type: string - push: - branches: - - '!release-branch' - - master - - 1.* - - develop - - MOSIP* - - release* - -jobs: - analyze: - uses: mosip/kattu/.github/workflows/codeql-analysis.yml@master \ No newline at end of file From 0c670bf5bafe9f3d6f49f000dfad80b5a7002d25 Mon Sep 17 00:00:00 2001 From: ase-101 Date: Fri, 18 Oct 2024 12:32:17 +0530 Subject: [PATCH 18/80] ES-1807 & updated postman collection (#964) * ES-1807 Signed-off-by: ase-101 * Updated postman collection Signed-off-by: ase-101 --------- Signed-off-by: ase-101 --- docker-compose/docker-compose.yml | 3 +- .../services/AuthorizationServiceImpl.java | 7 ++- .../esignet/services/ClaimsHelperService.java | 3 +- .../services/AuthorizationServiceTest.java | 55 ++++++++++++++++++- .../eSignet.postman_collection.json | 17 +++--- 5 files changed, 69 insertions(+), 16 deletions(-) diff --git a/docker-compose/docker-compose.yml b/docker-compose/docker-compose.yml index 5ba0eb65f..29d93bc9f 100644 --- a/docker-compose/docker-compose.yml +++ b/docker-compose/docker-compose.yml @@ -20,11 +20,12 @@ services: - SPRING_DATASOURCE_URL=jdbc:postgresql://database:5432/mosip_mockidentitysystem?currentSchema=mockidentitysystem - SPRING_DATASOURCE_USERNAME=postgres - SPRING_DATASOURCE_PASSWORD=postgres + - MOSIP_MOCK_IDA_KYC_TRANSACTION_TIMEOUT_SECS=900 depends_on: - database esignet: - image: mosipdev/esignet:release-1.5.x + image: 'mosipdev/esignet:release-1.5.x' user: root ports: - 8088:8088 diff --git a/oidc-service-impl/src/main/java/io/mosip/esignet/services/AuthorizationServiceImpl.java b/oidc-service-impl/src/main/java/io/mosip/esignet/services/AuthorizationServiceImpl.java index b6a7dde57..6292e24a3 100644 --- a/oidc-service-impl/src/main/java/io/mosip/esignet/services/AuthorizationServiceImpl.java +++ b/oidc-service-impl/src/main/java/io/mosip/esignet/services/AuthorizationServiceImpl.java @@ -277,12 +277,13 @@ public ClaimDetailResponse getClaimDetails(String transactionId) { } //Profile update is mandated only if any essential verified claim is requested - boolean isEssentialVerifiedClaimRequested = transaction.getResolvedClaims().getUserinfo() + boolean unverifiedEssentialClaimsExists = transaction.getResolvedClaims().getUserinfo() .entrySet() .stream() .anyMatch( entry -> entry.getValue().stream() - .anyMatch(m -> (boolean) m.getOrDefault("essential", false) && m.get("verification") != null )); - claimDetailResponse.setProfileUpdateRequired(isEssentialVerifiedClaimRequested); + .anyMatch(m -> (boolean) m.getOrDefault("essential", false) && m.get("verification") != null && + transaction.getClaimMetadata().getOrDefault(entry.getKey(), Collections.EMPTY_LIST).isEmpty() )); + claimDetailResponse.setProfileUpdateRequired(unverifiedEssentialClaimsExists); claimDetailResponse.setClaimStatus(list); auditWrapper.logAudit(Action.CLAIM_DETAILS, ActionStatus.SUCCESS, AuditHelper.buildAuditDto(transactionId, transaction), null); diff --git a/oidc-service-impl/src/main/java/io/mosip/esignet/services/ClaimsHelperService.java b/oidc-service-impl/src/main/java/io/mosip/esignet/services/ClaimsHelperService.java index 446875ec4..e3cce84b6 100644 --- a/oidc-service-impl/src/main/java/io/mosip/esignet/services/ClaimsHelperService.java +++ b/oidc-service-impl/src/main/java/io/mosip/esignet/services/ClaimsHelperService.java @@ -164,7 +164,8 @@ protected ClaimStatus getClaimStatus(String claim, List> cla //if the claim is requested without any verification metadata if(CollectionUtils.isEmpty(claimDetails) || claimDetails.stream().allMatch( m -> m.get("verification") == null)) - return new ClaimStatus(claim, false, storedVerificationMetadata.containsKey(claim)); + return new ClaimStatus(claim, !storedVerificationMetadata.getOrDefault(claim, Collections.emptyList()).isEmpty(), + storedVerificationMetadata.containsKey(claim)); log.info("Request to fetch verification metadata for {} with filter criteria : {}", claim, claimDetails); List storedVerificationDetails = storedVerificationMetadata.get(claim); diff --git a/oidc-service-impl/src/test/java/io/mosip/esignet/services/AuthorizationServiceTest.java b/oidc-service-impl/src/test/java/io/mosip/esignet/services/AuthorizationServiceTest.java index 3de60b0ce..c982a6ac9 100644 --- a/oidc-service-impl/src/test/java/io/mosip/esignet/services/AuthorizationServiceTest.java +++ b/oidc-service-impl/src/test/java/io/mosip/esignet/services/AuthorizationServiceTest.java @@ -19,6 +19,7 @@ import io.mosip.esignet.api.spi.AuditPlugin; import io.mosip.esignet.api.spi.Authenticator; import io.mosip.esignet.api.util.ConsentAction; +import io.mosip.esignet.api.util.FilterCriteriaMatcher; import io.mosip.esignet.core.constants.Constants; import io.mosip.esignet.core.dto.*; import io.mosip.esignet.core.exception.EsignetException; @@ -102,9 +103,14 @@ public void setUp() { claims.put("profile", Arrays.asList("given_name", "profile_picture", "name", "phone_number", "email")); claims.put("email", Arrays.asList("email","email_verified")); claims.put("phone", Arrays.asList("phone_number","phone_number_verified")); + + FilterCriteriaMatcher filterCriteriaMatcher = new FilterCriteriaMatcher(); + ReflectionTestUtils.setField(filterCriteriaMatcher,"objectMapper", new ObjectMapper()); + ClaimsHelperService claimsHelperService = new ClaimsHelperService(); ReflectionTestUtils.setField(claimsHelperService,"claims", claims); ReflectionTestUtils.setField(claimsHelperService,"objectMapper", new ObjectMapper()); + ReflectionTestUtils.setField(claimsHelperService,"filterCriteriaMatcher", filterCriteriaMatcher); ReflectionTestUtils.setField(authorizationHelperService, "credentialScopes", Arrays.asList("sample_ldp_vc")); ReflectionTestUtils.setField(authorizationHelperService, "authorizeScopes", Arrays.asList("resident-service")); @@ -1371,24 +1377,67 @@ public void getAuthCode_withInValidTransactionId_thenFail() { } @Test - public void getClaimDetails_withValidTransaction_thenPass(){ + public void getClaimDetails_withUnVerifiedClaimsRequest_thenPass(){ OIDCTransaction transaction=new OIDCTransaction(); Claims resolvedClaims = new Claims(); resolvedClaims.setUserinfo(new HashMap<>()); Map map = new HashMap<>(); map.put("essential", true); - map.put("verification", new HashMap<>()); resolvedClaims.getUserinfo().put("name", Arrays.asList(map)); - transaction.setResolvedClaims(resolvedClaims); transaction.setEssentialClaims(List.of("name", "email")); transaction.setVoluntaryClaims(List.of("phone_number")); + + Map> claimMetadata = new HashMap<>(); + transaction.setClaimMetadata(claimMetadata); transaction.setConsentAction(ConsentAction.NOCAPTURE); Mockito.when(cacheUtilService.getAuthenticatedTransaction(Mockito.anyString())).thenReturn(transaction); ClaimDetailResponse claimDetailResponse = authorizationServiceImpl.getClaimDetails("transactionId"); Assert.assertEquals(claimDetailResponse.getConsentAction(),ConsentAction.NOCAPTURE); Assert.assertEquals(claimDetailResponse.getTransactionId(),"transactionId"); + Assert.assertFalse(claimDetailResponse.isProfileUpdateRequired()); + } + + @Test + public void getClaimDetails_withVerifiedClaimsRequest_thenPass() throws JsonProcessingException { + OIDCTransaction transaction=new OIDCTransaction(); + Claims resolvedClaims = new Claims(); + resolvedClaims.setUserinfo(new HashMap<>()); + Map map = new HashMap<>(); + map.put("essential", true); + Map requestedVerification = new HashMap<>(); + requestedVerification.put("trust_framework", null); + map.put("verification", requestedVerification); + resolvedClaims.getUserinfo().put("name", Arrays.asList(map)); + transaction.setResolvedClaims(resolvedClaims); + transaction.setEssentialClaims(List.of("name", "email")); + transaction.setVoluntaryClaims(List.of("phone_number")); + + Map> claimMetadata = new HashMap<>(); + transaction.setClaimMetadata(claimMetadata); + transaction.setConsentAction(ConsentAction.CAPTURE); + Mockito.when(cacheUtilService.getAuthenticatedTransaction(Mockito.anyString())).thenReturn(transaction); + + ClaimDetailResponse claimDetailResponse = authorizationServiceImpl.getClaimDetails("transactionId"); + Assert.assertEquals(claimDetailResponse.getConsentAction(),ConsentAction.CAPTURE); + Assert.assertEquals(claimDetailResponse.getTransactionId(),"transactionId"); + Assert.assertTrue(claimDetailResponse.getClaimStatus().stream().allMatch(cs -> !cs.isVerified() && !cs.isAvailable())); + Assert.assertTrue(claimDetailResponse.isProfileUpdateRequired()); + + Map emailMap = new HashMap<>(); + emailMap.put("essential", true); + resolvedClaims.getUserinfo().put("email", Arrays.asList(emailMap)); + Map phoneMap = new HashMap<>(); + phoneMap.put("essential", false); + resolvedClaims.getUserinfo().put("phone_number", Arrays.asList(phoneMap)); + claimMetadata.put("name", Arrays.asList(objectMapper.readTree("{\"verification\": {\"trust_framework\": \"XYZ TF\"}}"))); + claimMetadata.put("phone_number", Arrays.asList()); + claimDetailResponse = authorizationServiceImpl.getClaimDetails("transactionId"); + Assert.assertTrue(claimDetailResponse.getClaimStatus().stream().anyMatch(cs -> cs.getClaim().equals("name") && cs.isVerified() && cs.isAvailable())); + Assert.assertTrue(claimDetailResponse.getClaimStatus().stream().anyMatch(cs -> cs.getClaim().equals("email") && !cs.isVerified() && !cs.isAvailable())); + Assert.assertTrue(claimDetailResponse.getClaimStatus().stream().anyMatch(cs -> cs.getClaim().equals("phone_number") && !cs.isVerified() && cs.isAvailable())); + Assert.assertFalse(claimDetailResponse.isProfileUpdateRequired()); } @Test diff --git a/postman-collection/eSignet.postman_collection.json b/postman-collection/eSignet.postman_collection.json index 7e047571d..7d32a8f8d 100644 --- a/postman-collection/eSignet.postman_collection.json +++ b/postman-collection/eSignet.postman_collection.json @@ -192,7 +192,8 @@ "const publicKeyPem = pmlib.rs.KEYUTIL.getPEM(kp.pubKeyObj, \"PKCS8PUB\");", "// Convert the PEM format to a simple Base64 string (removing PEM headers)", "const publicKeyBase64 = publicKeyPem.replace(/-----BEGIN PUBLIC KEY-----|-----END PUBLIC KEY-----|\\n/g, '');", - "pm.environment.set(\"client_id\", publicKeyBase64.substring(2, 50));", + "let updatedStr = publicKeyBase64.replace(/\\//g, \"_\");", + "pm.environment.set(\"client_id\", updatedStr.substring(2, 50));", "", "// Log the result to Postman's console (option);", "pm.environment.set(\"client_private_key\", JSON.stringify(privateKey_jwk));", @@ -255,7 +256,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"requestTime\": \"{{$isoTimestamp}}\",\n \"request\": {\n \"logoUri\": \"{{$randomImageUrl}}\",\n \"redirectUris\": [\n \"{{redirection_url}}\",\n \"io.mosip.residentapp://oauth\",\n \"http://loclahost:3000/**\",\n \"http://loclahost:5000/registration/*\"\n ],\n \"userClaims\": [\n \"name\",\n \"email\",\n \"gender\",\n \"phone_number\",\n \"birthdate\",\n \"picture\",\n \"address\"\n ],\n \"authContextRefs\": [\n \"mosip:idp:acr:generated-code\",\n \"mosip:idp:acr:password\",\n \"mosip:idp:acr:linked-wallet\",\n \"mosip:idp:acr:biometrics\"\n ],\n \"status\": \"ACTIVE\",\n \"grantTypes\": [\n \"authorization_code\"\n ],\n \"clientName\": \"{{$randomCompanyName}}\",\n \"clientAuthMethods\": [\n \"private_key_jwt\"\n ]\n }\n}", + "raw": "{\n \"requestTime\": \"{{$isoTimestamp}}\",\n \"request\": {\n \"logoUri\": \"{{$randomImageUrl}}\",\n \"redirectUris\": [\n \"{{redirection_url}}\",\n \"io.mosip.residentapp://oauth\",\n \"http://loclahost:3000/**\",\n \"http://loclahost:5000/registration/*\"\n ],\n \"userClaims\": [\n \"name\",\n \"email\",\n \"gender\",\n \"phone_number\",\n \"birthdate\",\n \"picture\",\n \"address\"\n ],\n \"authContextRefs\": [\n \"mosip:idp:acr:generated-code\",\n \"mosip:idp:acr:password\",\n \"mosip:idp:acr:linked-wallet\",\n \"mosip:idp:acr:biometrics\",\n \"mosip:idp:acr:static-code\"\n ],\n \"status\": \"ACTIVE\",\n \"grantTypes\": [\n \"authorization_code\"\n ],\n \"clientName\": \"{{$randomCompanyName}}\",\n \"clientAuthMethods\": [\n \"private_key_jwt\"\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -1092,7 +1093,7 @@ "pm.test(\"Validate linkTransactionId\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData.response.linkTransactionId).not.equals(null);", - " pm.environment.set(\"linkTransactionId\", jsonData.response.linkTransactionId);", + " pm.environment.set(\"link_transaction_id\", jsonData.response.linkTransactionId);", "});" ], "type": "text/javascript", @@ -1210,7 +1211,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"requestTime\": \"{{$isoTimestamp}}\",\n \"request\": {\n \"linkedTransactionId\": \"{{linkTransactionId}}\",\n \"individualId\": \"{{individual_id}}\",\n \"challengeList\" : [\n {\n \"authFactorType\" : \"WLA\",\n \"challenge\" : \"{{wla_challenge}}\",\n \"format\" : \"jwt\"\n }\n ]\n }\n}", + "raw": "{\n \"requestTime\": \"{{$isoTimestamp}}\",\n \"request\": {\n \"linkedTransactionId\": \"{{link_transaction_id}}\",\n \"individualId\": \"{{individual_id}}\",\n \"challengeList\" : [\n {\n \"authFactorType\" : \"WLA\",\n \"challenge\" : \"{{wla_challenge}}\",\n \"format\" : \"jwt\"\n }\n ]\n }\n}", "options": { "raw": { "language": "json" @@ -1278,7 +1279,7 @@ "pm.test(\"Validate code\", function () {", " var jsonData = pm.response.json();", " pm.expect(jsonData.response.code).not.equals(null);", - " pm.environment.set(\"code\", jsonData.response.code);", + " pm.collectionVariables.set(\"code\", jsonData.response.code);", "});" ], "type": "text/javascript", @@ -1299,7 +1300,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"requestTime\": \"{{$isoTimestamp}}\",\n \"request\": {\n \"linkedTransactionId\": \"{{linkTransactionId}}\",\n \"acceptedClaims\": {{accepted_claims}},\n \"signature\": \"{{detachedSignature}}\"\n }\n}", + "raw": "{\n \"requestTime\": \"{{$isoTimestamp}}\",\n \"request\": {\n \"linkedTransactionId\": \"{{link_transaction_id}}\",\n \"acceptedClaims\": {{accepted_claims}},\n \"signature\": \"{{detachedSignature}}\"\n }\n}", "options": { "raw": { "language": "json" @@ -1874,7 +1875,7 @@ "response": [] }, { - "name": "Complete the verification process & Resume Halted Transaction", + "name": "Complete Signup Redirect", "request": { "method": "POST", "header": [ @@ -1970,7 +1971,7 @@ ], "body": { "mode": "raw", - "raw": "{\n \"requestTime\": \"{{$isoTimestamp}}\",\n \"request\": {\n \"transactionId\": \"{{transaction_id}}\",\n \"acceptedClaims\": {{accepted_claims}},\n \"permittedAuthorizeScopes\" : {{permitted_authorized_scopes}}\n }\n}", + "raw": "{\n \"requestTime\": \"{{$isoTimestamp}}\",\n \"request\": {\n \"transactionId\": \"{{transaction_id}}\",\n \"acceptedClaims\": [\"name\",\"phone_number\"],\n \"permittedAuthorizeScopes\" : {{permitted_authorized_scopes}}\n }\n}", "options": { "raw": { "language": "json" From dbeb9d76d07b9345a119667804d0ca85978b5f92 Mon Sep 17 00:00:00 2001 From: Chandra Keshav Mishra Date: Wed, 23 Oct 2024 14:43:23 +0530 Subject: [PATCH 19/80] [DSD-6445] (#974) * [DSD-6445 updated the readme n install script] Signed-off-by: techno-376 * [DSD-6445] Signed-off-by: techno-376 * [DSD-6445] Signed-off-by: techno-376 * Update install-prereq.sh Signed-off-by: Rakshitha650 <76676196+Rakshitha650@users.noreply.github.com> * Update install.sh Signed-off-by: Rakshitha650 <76676196+Rakshitha650@users.noreply.github.com> --------- Signed-off-by: techno-376 Signed-off-by: Rakshitha650 <76676196+Rakshitha650@users.noreply.github.com> Co-authored-by: techno-376 Co-authored-by: Rakshitha650 <76676196+Rakshitha650@users.noreply.github.com> --- deploy/README.md | 1 + deploy/captcha/install.sh | 13 +++++++++++++ deploy/initialise-prereq.sh | 2 ++ deploy/install-prereq.sh | 1 + deploy/keycloak/install.sh | 1 + deploy/oidc-ui/install.sh | 2 +- deploy/softhsm/install.sh | 4 ++-- 7 files changed, 21 insertions(+), 3 deletions(-) mode change 100644 => 100755 deploy/softhsm/install.sh diff --git a/deploy/README.md b/deploy/README.md index eb16098e4..e6e8e05d9 100644 --- a/deploy/README.md +++ b/deploy/README.md @@ -33,6 +33,7 @@ ``` ### Initialise pre-requisites * Update values file for postgres init [here](postgres/init_values.yaml). +* Create a google recaptcha v2 ("I am not a Robot") from Google with required domain name ex:[sandbox.mosip.net] [Recaptcha Admin](https://www.google.com/recaptcha/about/). * Execute `initialise-prereq.sh` script to initialise postgres and keycloak and set esignet captcha. ``` ./initialise-prereq.sh diff --git a/deploy/captcha/install.sh b/deploy/captcha/install.sh index 4f25b8a6e..c14209f92 100755 --- a/deploy/captcha/install.sh +++ b/deploy/captcha/install.sh @@ -50,6 +50,19 @@ function installing_captcha() { helm -n $NS install captcha mosip/captcha --version $CHART_VERSION --set metrics.serviceMonitor.enabled=$servicemonitorflag --wait echo Installed captcha service + # Check if the second environment variable exists + ENV_VAR_EXISTS=$(kubectl -n captcha get deployment captcha -o jsonpath="{.spec.template.spec.containers[0].env[?(@.name=='MOSIP_CAPTCHA_SECRET_ESIGNET')].name}") + + if [[ -z "$ENV_VAR_EXISTS" ]]; then + # If the environment variable does not exist, add it + echo "Environment variable 'MOSIP_CAPTCHA_SECRET_ESIGNET' does not exist. Adding it..." + kubectl patch deployment -n captcha captcha --type='json' -p='[{"op": "add", "path": "/spec/template/spec/containers/0/env/-", "value": {"name": "MOSIP_CAPTCHA_SECRET_ESIGNET", "valueFrom": {"secretKeyRef": {"name": "esignet-captcha", "key": "esignet-captcha-secret-key"}}}}]' + else + # If the environment variable exists, update it + echo "Environment variable 'MOSIP_CAPTCHA_SECRET_ESIGNET' exists. Updating it..." + kubectl patch deployment -n captcha captcha --type='json' -p='[{"op": "replace", "path": "/spec/template/spec/containers/0/env[?(@.name==\"MOSIP_CAPTCHA_SECRET_ESIGNET\")]", "value": {"name": "MOSIP_CAPTCHA_SECRET_ESIGNET", "valueFrom": {"secretKeyRef": {"name": "esignet-captcha", "key": "esignet-captcha-secret-key"}}}}]' + fi + return 0 } diff --git a/deploy/initialise-prereq.sh b/deploy/initialise-prereq.sh index 46c095d52..9a9d93711 100755 --- a/deploy/initialise-prereq.sh +++ b/deploy/initialise-prereq.sh @@ -57,6 +57,8 @@ while true; do kubectl -n $NS create secret generic esignet-captcha --from-literal=esignet-captcha-site-key=$ESITE_KEY --from-literal=esignet-captcha-secret-key=$ESECRET_KEY --dry-run=client -o yaml | kubectl apply -f - echo "Captcha secrets for esignet configured sucessfully" + kubectl create ns captcha || true + ./copy_cm_func.sh secret esignet-captcha $NS captcha # Check if the second environment variable exists diff --git a/deploy/install-prereq.sh b/deploy/install-prereq.sh index dc5d4441d..fc8a0e29e 100755 --- a/deploy/install-prereq.sh +++ b/deploy/install-prereq.sh @@ -8,6 +8,7 @@ if [ $# -ge 1 ]; then fi ROOT_DIR=$(pwd) +kubectl create ns esignet || true function prompt_for_deployment() { local module_name=$1 diff --git a/deploy/keycloak/install.sh b/deploy/keycloak/install.sh index 43623a6f7..6f85c7f4d 100755 --- a/deploy/keycloak/install.sh +++ b/deploy/keycloak/install.sh @@ -17,6 +17,7 @@ function installing_keycloak() { ## TODO: enable istio injection after testing well. kubectl label ns $NS istio-injection=disabled --overwrite helm repo add bitnami https://charts.bitnami.com/bitnami + helm repo add mosip https://mosip.github.io/mosip-helm helm repo update echo Installing diff --git a/deploy/oidc-ui/install.sh b/deploy/oidc-ui/install.sh index fd811529a..b458ba682 100755 --- a/deploy/oidc-ui/install.sh +++ b/deploy/oidc-ui/install.sh @@ -23,7 +23,7 @@ function installing_oidc-ui() { CHART_VERSION=1.5.0-develop echo Create $NS namespace - kubectl create ns $NS + kubectl create ns $NS || true echo Istio label kubectl label ns $NS istio-injection=enabled --overwrite diff --git a/deploy/softhsm/install.sh b/deploy/softhsm/install.sh old mode 100644 new mode 100755 index cbd47995e..9237e4dbc --- a/deploy/softhsm/install.sh +++ b/deploy/softhsm/install.sh @@ -6,8 +6,8 @@ if [ $# -ge 1 ] ; then export KUBECONFIG=$1 fi -NS=softhsm -CHART_VERSION=12.0.1 +SOFTHSM_NS=softhsm +SOFTHSM_CHART_VERSION=12.0.1 function installing_softhsm() { echo Create $NS namespaces From 3391008e2a524d62307f9d4450a842556ceca787 Mon Sep 17 00:00:00 2001 From: Abhishek S <127825992+abhishek8shankar@users.noreply.github.com> Date: Fri, 25 Oct 2024 11:02:27 +0530 Subject: [PATCH 20/80] [DSD-6445] Updated esignet-global-cm.yaml.sample Signed-off-by: Abhishek S <127825992+abhishek8shankar@users.noreply.github.com> --- deploy/esignet-global-cm.yaml.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/esignet-global-cm.yaml.sample b/deploy/esignet-global-cm.yaml.sample index ee12da13e..8db1d1246 100644 --- a/deploy/esignet-global-cm.yaml.sample +++ b/deploy/esignet-global-cm.yaml.sample @@ -10,7 +10,7 @@ metadata: namespace: esignet data: mosip-version: develop - imstallation-domain: sandbox.xyz.net + installation-domain: sandbox.xyz.net mosip-api-host: api.sandbox.xyz.net mosip-iam-external-host: iam.sandbox.xyz.net mosip-api-internal-host: api-internal.sandbox.xyz.net From acb8ca7fed5a2db6dd311c716c352dc6cbaf9b4d Mon Sep 17 00:00:00 2001 From: Abhishek S <127825992+abhishek8shankar@users.noreply.github.com> Date: Mon, 28 Oct 2024 11:27:38 +0530 Subject: [PATCH 21/80] [DSD-6445] Updated esignet-global-cm.yaml.sample (#977) Signed-off-by: Abhishek S <127825992+abhishek8shankar@users.noreply.github.com> --- deploy/esignet-global-cm.yaml.sample | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/deploy/esignet-global-cm.yaml.sample b/deploy/esignet-global-cm.yaml.sample index ee12da13e..8db1d1246 100644 --- a/deploy/esignet-global-cm.yaml.sample +++ b/deploy/esignet-global-cm.yaml.sample @@ -10,7 +10,7 @@ metadata: namespace: esignet data: mosip-version: develop - imstallation-domain: sandbox.xyz.net + installation-domain: sandbox.xyz.net mosip-api-host: api.sandbox.xyz.net mosip-iam-external-host: iam.sandbox.xyz.net mosip-api-internal-host: api-internal.sandbox.xyz.net From 267d23e0ec6e8392c17bcd76dd2c6e06069e9851 Mon Sep 17 00:00:00 2001 From: Abhishek S <127825992+abhishek8shankar@users.noreply.github.com> Date: Mon, 28 Oct 2024 16:05:27 +0530 Subject: [PATCH 22/80] [DSD-6445] Updated install.sh scripts for softhsm . Signed-off-by: Abhishek S <127825992+abhishek8shankar@users.noreply.github.com> --- deploy/softhsm/install.sh | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/deploy/softhsm/install.sh b/deploy/softhsm/install.sh index 9237e4dbc..65b14d092 100755 --- a/deploy/softhsm/install.sh +++ b/deploy/softhsm/install.sh @@ -10,11 +10,11 @@ SOFTHSM_NS=softhsm SOFTHSM_CHART_VERSION=12.0.1 function installing_softhsm() { - echo Create $NS namespaces - kubectl create ns $NS || true + echo Create $SOFTHSM_NS namespaces + kubectl create ns $SOFTHSM_NS || true echo Istio label - kubectl label ns $NS istio-injection=enabled --overwrite + kubectl label ns $SOFTHSM_NS istio-injection=enabled --overwrite helm repo update # Deploy Softhsm for Esignet. From d33db4fda98cb8fd18d81e95564f2370838b113c Mon Sep 17 00:00:00 2001 From: Rakshitha650 <76676196+Rakshitha650@users.noreply.github.com> Date: Wed, 30 Oct 2024 09:53:55 +0530 Subject: [PATCH 23/80] [DSD-6445]Updated application-default.properties Signed-off-by: Rakshitha650 <76676196+Rakshitha650@users.noreply.github.com> --- .../src/main/resources/application-default.properties | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/esignet-service/src/main/resources/application-default.properties b/esignet-service/src/main/resources/application-default.properties index ed7004346..b6946ea76 100644 --- a/esignet-service/src/main/resources/application-default.properties +++ b/esignet-service/src/main/resources/application-default.properties @@ -60,10 +60,11 @@ mosip.esignet.header-filter.paths-to-validate={'${server.servlet.path}/authoriza '${server.servlet.path}/authorization/complete-signup-redirect' } ## captcha validation is enabled for the auth-factors - otp, pwd, bio and pin. -mosip.esignet.captcha.required=send-otp,pwd,kbi +mosip.esignet.captcha.required= mosip.esignet.captcha.validator-url=http://captcha.captcha/v1/captcha/validatecaptcha mosip.esignet.captcha.module-name=esignet mosip.esignet.captcha.site-key=${esignet.captcha.site.key} +mosip.signup.send-challenge.captcha-required=false ## Applicable for signup redirection to update profile mosip.esignet.signup-id-token-expire-seconds=1800 @@ -400,4 +401,4 @@ mosip.esignet.ui.config.key-values={'sbi.env': '${mosip.esignet.authenticator.id ##-------------------------------------------- Default Integrations ----------------------------------------------------- mosip.esignet.integration.audit-plugin=LoggerAuditService -mosip.esignet.integration.key-binder=NoOpKeyBinder \ No newline at end of file +mosip.esignet.integration.key-binder=NoOpKeyBinder From 4e7e59a4e0da935c6d432f457059ef9fc57a4958 Mon Sep 17 00:00:00 2001 From: Gk <76690271+gk-4VII@users.noreply.github.com> Date: Mon, 4 Nov 2024 20:27:20 +0530 Subject: [PATCH 24/80] [ES-1892] [ES-1358] i18n translation changes and minor UI changes. (#986) Signed-off-by: GurukiranP --- oidc-ui/public/locales/ar.json | 5 +++-- oidc-ui/public/locales/en.json | 7 ++++--- oidc-ui/public/locales/hi.json | 5 +++-- oidc-ui/public/locales/km.json | 5 +++-- oidc-ui/public/locales/kn.json | 5 +++-- oidc-ui/public/locales/ta.json | 7 ++++--- oidc-ui/src/components/ClaimDetails.js | 13 ++++++++++++- 7 files changed, 32 insertions(+), 15 deletions(-) diff --git a/oidc-ui/public/locales/ar.json b/oidc-ui/public/locales/ar.json index 56dd59572..a4e573fcd 100644 --- a/oidc-ui/public/locales/ar.json +++ b/oidc-ui/public/locales/ar.json @@ -192,8 +192,8 @@ "consentDetails": { "essential_claims": "المطالبات الأساسية", "voluntary_claims": "المطالبات الطوعية", - "verified_claims": "المطالبات التي تم التحقق منها", - "unverified_claims": "مطالبات لم يتم التحقق منها", + "verified_claims": "تم التحقق منه", + "unverified_claims": "لم يتم التحقق منها", "name": "اسم", "given_name": "اسم", "middle_name": "الاسم الأوسط", @@ -455,6 +455,7 @@ "IDA-OTA-010": "نوع هوية الإدخال لا يتطابق مع نوع هوية طلب OTP", "IDA-OTA-011": "معرف الشريك المدخل لا يتطابق مع معرف الشريك لطلب OTP", "IDA-OTA-012": "لا يمكن إجراء التحقق من صحة كلمة المرور لمرة واحدة (OTP) مقابل معرف الفرد هذا. ", + "IDA-OTA-013": "تم حظر طلب/التحقق من صحة OTP مؤقتًا. يرجى المحاولة مرة أخرى بعد وقت ما.", "send_otp_failed": "غير قادر على إرسال OTP. ", "send_otp_failed_msg": "غير قادر على إرسال OTP. ", "invalid_otp_channel": "تم توفير قناة OTP غير صالحة.", diff --git a/oidc-ui/public/locales/en.json b/oidc-ui/public/locales/en.json index abadaf07a..a0551061c 100644 --- a/oidc-ui/public/locales/en.json +++ b/oidc-ui/public/locales/en.json @@ -192,8 +192,8 @@ "consentDetails": { "essential_claims": "Essential Claims", "voluntary_claims": "Voluntary Claims", - "verified_claims": "Verified Claims", - "unverified_claims": "Unverified Claims", + "verified_claims": "Verified", + "unverified_claims": "Not Verified", "name": "Name", "given_name": "Name", "middle_name": "Middle Name", @@ -215,7 +215,7 @@ "verified": "Verified", "not-verified": "Not Verified", "available": "Available", - "not-available": "Not-Available", + "not-available": "Not Available", "message": "Click on proceed to begin with the verification process", "proceed": "Proceed", "cancel": "Cancel", @@ -455,6 +455,7 @@ "IDA-OTA-010": "Input Identity Type does not match Identity Type of OTP Request", "IDA-OTA-011": "Input Partner-ID does not match Partner-ID of OTP Request", "IDA-OTA-012": "OTP validation can't be performed against this Individual-ID. Generate OTP first", + "IDA-OTA-013": "OTP request/validation has been temporarily blocked. Please try again after sometime.", "send_otp_failed": "Unable to send OTP. Please try again.", "send_otp_failed_msg": "Unable to send OTP. Please try again.", "invalid_otp_channel": "Invalid OTP Channel Provided.", diff --git a/oidc-ui/public/locales/hi.json b/oidc-ui/public/locales/hi.json index 301946ba1..cbfc50f8f 100644 --- a/oidc-ui/public/locales/hi.json +++ b/oidc-ui/public/locales/hi.json @@ -192,8 +192,8 @@ "consentDetails": { "essential_claims": "आवश्यक दावे", "voluntary_claims": "स्वैच्छिक दावे", - "verified_claims": "सत्यापित दावे", - "unverified_claims": "असत्यापित दावे", + "verified_claims": "सत्यापित", + "unverified_claims": "सत्यापित नहीं है", "name": "नाम", "given_name": "नाम", "middle_name": "मध्य नाम", @@ -455,6 +455,7 @@ "IDA-OTA-010": "इनपुट पहचान प्रकार ओटीपी अनुरोध के पहचान प्रकार से मेल नहीं खाता", "IDA-OTA-011": "इनपुट पार्टनर-आईडी ओटीपी अनुरोध के पार्टनर-आईडी से मेल नहीं खाता है", "IDA-OTA-012": "इस व्यक्तिगत-आईडी के विरुद्ध ओटीपी सत्यापन नहीं किया जा सकता है। ", + "IDA-OTA-013": "ओटीपी अनुरोध/सत्यापन अस्थायी रूप से अवरुद्ध कर दिया गया है। कृपया कुछ समय बाद पुनः प्रयास करें.", "send_otp_failed": "ओटीपी भेजने में असमर्थ. ", "send_otp_failed_msg": "ओटीपी भेजने में असमर्थ. ", "invalid_otp_channel": "अमान्य ओटीपी चैनल प्रदान किया गया।", diff --git a/oidc-ui/public/locales/km.json b/oidc-ui/public/locales/km.json index c16028d74..e64a031bc 100644 --- a/oidc-ui/public/locales/km.json +++ b/oidc-ui/public/locales/km.json @@ -192,8 +192,8 @@ "consentDetails": { "essential_claims": "ការទាមទារសំខាន់ៗ", "voluntary_claims": "ការទាមទារដោយស្ម័គ្រចិត្ត", - "verified_claims": "ការទាមទារដែលបានផ្ទៀងផ្ទាត់", - "unverified_claims": "ការទាមទារដែលមិនបានបញ្ជាក់", + "verified_claims": "ផ្ទៀងផ្ទាត់", + "unverified_claims": "មិនបានផ្ទៀងផ្ទាត់", "name": "ឈ្មោះ", "given_name": "ឈ្មោះ", "middle_name": "ឈ្មោះកណ្តាល", @@ -455,6 +455,7 @@ "IDA-OTA-010": "ប្រភេទអត្តសញ្ញាណបញ្ចូលមិនត្រូវគ្នានឹងប្រភេទអត្តសញ្ញាណនៃសំណើ OTP ទេ។", "IDA-OTA-011": "លេខសម្គាល់ដៃគូបញ្ចូលមិនត្រូវគ្នានឹងលេខសម្គាល់ដៃគូនៃសំណើ OTP ទេ។", "IDA-OTA-012": "សុពលភាព OTP មិនអាចត្រូវបានអនុវត្តប្រឆាំងនឹង Individual-ID នេះទេ។ ", + "IDA-OTA-013": "សំណើ/សុពលភាព OTP ត្រូវបានរារាំងជាបណ្តោះអាសន្ន។ សូមព្យាយាមម្តងទៀតបន្ទាប់ពីពេលខ្លះ។", "send_otp_failed": "មិនអាចផ្ញើ OTP បានទេ។ ", "send_otp_failed_msg": "មិនអាចផ្ញើ OTP បានទេ។ ", "invalid_otp_channel": "ប៉ុស្តិ៍ OTP មិនត្រឹមត្រូវត្រូវបានផ្តល់។", diff --git a/oidc-ui/public/locales/kn.json b/oidc-ui/public/locales/kn.json index 41c8eb604..3b7dcc264 100644 --- a/oidc-ui/public/locales/kn.json +++ b/oidc-ui/public/locales/kn.json @@ -192,8 +192,8 @@ "consentDetails": { "essential_claims": "ಅಗತ್ಯ ಹಕ್ಕುಗಳು", "voluntary_claims": "ಸ್ವಯಂಪ್ರೇರಿತ ಹಕ್ಕುಗಳು", - "verified_claims": "ಪರಿಶೀಲಿಸಿದ ಹಕ್ಕುಗಳು", - "unverified_claims": "ಪರಿಶೀಲಿಸದ ಹಕ್ಕುಗಳು", + "verified_claims": "ಪರಿಶೀಲಿಸಲಾಗಿದೆ", + "unverified_claims": "ಪರಿಶೀಲಿಸಲಾಗಿಲ್ಲ", "name": "ಹೆಸರು", "given_name": "ಹೆಸರು", "middle_name": "ಮಧ್ಯದ ಹೆಸರು", @@ -455,6 +455,7 @@ "IDA-OTA-010": "ಇನ್‌ಪುಟ್ ಗುರುತಿನ ಪ್ರಕಾರವು OTP ವಿನಂತಿಯ ಗುರುತಿನ ಪ್ರಕಾರಕ್ಕೆ ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ", "IDA-OTA-011": "OTP ವಿನಂತಿಯ ಪಾಲುದಾರ-ID ಇನ್‌ಪುಟ್ ಪಾಲುದಾರ-ID ಹೊಂದಿಕೆಯಾಗುವುದಿಲ್ಲ", "IDA-OTA-012": "ಈ ವೈಯಕ್ತಿಕ-ಐಡಿ ವಿರುದ್ಧ OTP ಮೌಲ್ಯೀಕರಣವನ್ನು ನಿರ್ವಹಿಸಲು ಸಾಧ್ಯವಿಲ್ಲ. ", + "IDA-OTA-013": "OTP ವಿನಂತಿ/ಮೌಲ್ಯಮಾಪನವನ್ನು ತಾತ್ಕಾಲಿಕವಾಗಿ ನಿರ್ಬಂಧಿಸಲಾಗಿದೆ. ದಯವಿಟ್ಟು ಸ್ವಲ್ಪ ಸಮಯದ ನಂತರ ಮತ್ತೆ ಪ್ರಯತ್ನಿಸಿ.", "send_otp_failed": "OTP ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ", "send_otp_failed_msg": "OTP ಕಳುಹಿಸಲು ಸಾಧ್ಯವಾಗುತ್ತಿಲ್ಲ. ", "invalid_otp_channel": "ಅಮಾನ್ಯ OTP ಚಾನಲ್ ಒದಗಿಸಲಾಗಿದೆ.", diff --git a/oidc-ui/public/locales/ta.json b/oidc-ui/public/locales/ta.json index acd757e88..ead4d1e83 100644 --- a/oidc-ui/public/locales/ta.json +++ b/oidc-ui/public/locales/ta.json @@ -192,8 +192,8 @@ "consentDetails": { "essential_claims": "அத்தியாவசிய உரிமைகோரல்கள்", "voluntary_claims": "தன்னார்வ உரிமைகோரல்கள்", - "verified_claims": "சரிபார்க்கப்பட்ட உரிமைகோரல்கள்", - "unverified_claims": "சரிபார்க்கப்படாத உரிமைகோரல்கள்", + "verified_claims": "சரிபார்க்கப்பட்டது", + "unverified_claims": "சரிபார்க்கப்படவில்லை", "name": "பெயர்", "given_name": "பெயர்", "middle_name": "நடுத்தர பெயர்", @@ -215,7 +215,7 @@ "verified": "சரிபார்க்கப்பட்டது", "not-verified": "சரிபார்க்கப்படவில்லை", "available": "கிடைக்கும்", - "not-available": "இல்லை-கிடைக்கவில்லை", + "not-available": "கிடைக்கவில்லை", "message": "சரிபார்ப்பு செயல்முறையைத் தொடங்க தொடர என்பதைக் கிளிக் செய்யவும்", "proceed": "தொடரவும்", "cancel": "ரத்து செய்", @@ -455,6 +455,7 @@ "IDA-OTA-010": "உள்ளீட்டு அடையாள வகை, OTP கோரிக்கையின் அடையாள வகையுடன் பொருந்தவில்லை", "IDA-OTA-011": "உள்ளீட்டு பார்ட்னர் ஐடி, OTP கோரிக்கையின் பார்ட்னர் ஐடியுடன் பொருந்தவில்லை", "IDA-OTA-012": "இந்த தனிநபர் ஐடிக்கு எதிராக OTP சரிபார்ப்பைச் செய்ய முடியாது. ", + "IDA-OTA-013": "OTP கோரிக்கை/சரிபார்ப்பு தற்காலிகமாக தடுக்கப்பட்டது. சிறிது நேரம் கழித்து மீண்டும் முயற்சிக்கவும்.", "send_otp_failed": "OTP ஐ அனுப்ப முடியவில்லை. ", "send_otp_failed_msg": "OTP ஐ அனுப்ப முடியவில்லை. ", "invalid_otp_channel": "தவறான OTP சேனல் வழங்கப்பட்டது.", diff --git a/oidc-ui/src/components/ClaimDetails.js b/oidc-ui/src/components/ClaimDetails.js index e83d81caa..344173b29 100644 --- a/oidc-ui/src/components/ClaimDetails.js +++ b/oidc-ui/src/components/ClaimDetails.js @@ -89,7 +89,18 @@ const ClaimDetails = ({ } else if (label === "voluntary") { return (

    -

    {t1("voluntaryClaimsTooltip")}

    +

    + {t1("voluntary_claims")}: + {t1("voluntaryClaimsTooltip")} +

    +

    + {t1("verified_claims")}: + {t1("verifiedClaimTooltip")} +

    +

    + {t1("unverified_claims")}: + {t1("unverifiedClaimTooltip")} +

    ); } From 6a2503f77b4c278f072ddcebfb0db42ec40bdd7b Mon Sep 17 00:00:00 2001 From: ase-101 Date: Mon, 4 Nov 2024 00:59:09 +0530 Subject: [PATCH 25/80] ES-842 Signed-off-by: ase-101 --- esignet-service/README.md | 44 +++++++++++++++++++ .../resources/application-default.properties | 4 +- .../resources/application-local.properties | 4 ++ 3 files changed, 50 insertions(+), 2 deletions(-) diff --git a/esignet-service/README.md b/esignet-service/README.md index c14821025..1bd942afc 100644 --- a/esignet-service/README.md +++ b/esignet-service/README.md @@ -69,6 +69,50 @@ eKYC verification transaction | userinfo | | | +## eSignet Service Configuration + +We've set up the eSignet service and OIDC UI so that they can run independently, without needing an external configuration server or Artifactory server. Here’s a breakdown of how to configure and customize these services in different environments. + +**Profile Configurations** + +The eSignet service comes with two profile-based property files, each designed to help with different deployment needs: + +* Default Profile Properties File (application-default.properties) + +This file contains properties with ideal default values suited for a typical deployment. + +* Local Profile Properties File (application-local.properties) + +This file only includes properties that need to be overridden to run the eSignet service in a local environment. + +**Note:** The bootstrap.properties file is configured to enable multiple profile mode "default,local", allowing easy local setup. + +**Using Placeholders** + +In application-default.properties, we use placeholders for values that are defined in the eSignet deployment scripts. +This allows you to easily substitute values as needed without modifying the properties file directly. + +**Running eSignet in a Docker Container** + +When running eSignet in Docker, you can override properties by setting environment variables. Spring Boot conveniently converts property names to an uppercase format with underscores, making it easy to map properties as needed. + +For example: + +* spring.datasource.url maps to SPRING_DATASOURCE_URL +* mosip.esignet.domain.url maps to MOSIP_ESIGNET_DOMAIN_URL +* mosip.kernel.keymanager.hsm.keystore-type maps to MOSIP_KERNEL_KEYMANAGER_HSM_KEYSTORE_TYPE + +**Flexible Configuration with or without a Config Server** + +The eSignet service can run independently of a config server, yet remains flexible. If you need to connect it to an external configuration server, you can easily do so by setting the following environment variables in the Docker container: + +* SPRING_CONFIG_LABEL_ENV +* ACTIVE_PROFILE_ENV +* SPRING_CONFIG_URL_ENV + +This approach gives you the flexibility to run eSignet in a standalone mode or connect it to an external configuration server as your setup requires. + + ## API document eSignet API documentation can be found [here](../docs/esignet-openapi.yaml) diff --git a/esignet-service/src/main/resources/application-default.properties b/esignet-service/src/main/resources/application-default.properties index b6946ea76..021842dff 100644 --- a/esignet-service/src/main/resources/application-default.properties +++ b/esignet-service/src/main/resources/application-default.properties @@ -400,5 +400,5 @@ mosip.esignet.ui.config.key-values={'sbi.env': '${mosip.esignet.authenticator.id ##-------------------------------------------- Default Integrations ----------------------------------------------------- -mosip.esignet.integration.audit-plugin=LoggerAuditService -mosip.esignet.integration.key-binder=NoOpKeyBinder +#mosip.esignet.integration.audit-plugin=LoggerAuditService +#mosip.esignet.integration.key-binder=NoOpKeyBinder diff --git a/esignet-service/src/main/resources/application-local.properties b/esignet-service/src/main/resources/application-local.properties index 6d7bc0c66..31b8dc390 100644 --- a/esignet-service/src/main/resources/application-local.properties +++ b/esignet-service/src/main/resources/application-local.properties @@ -43,5 +43,9 @@ mosip.kernel.keymanager.hsm.keystore-type=PKCS12 mosip.kernel.keymanager.hsm.config-path=esignet_local.p12 mosip.kernel.keymanager.hsm.keystore-pass=localtest +## Overridden plugin configurations +mosip.esignet.integration.audit-plugin=LoggerAuditService +mosip.esignet.integration.key-binder=NoOpKeyBinder + ## Logging configuration logging.level.io.mosip.esignet=DEBUG \ No newline at end of file From b4d66f73e9a80c649b00f85fbf4439401b0b22cc Mon Sep 17 00:00:00 2001 From: Nandhukumar Date: Wed, 6 Nov 2024 17:58:52 +0530 Subject: [PATCH 26/80] MOSIP-37214 Signed-off-by: Nandhukumar --- api-test/pom.xml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/api-test/pom.xml b/api-test/pom.xml index bf9977b36..da2835dfe 100644 --- a/api-test/pom.xml +++ b/api-test/pom.xml @@ -8,7 +8,7 @@ apitest-esignet Parent project of MOSIP Esignet apitests https://github.com/mosip/esignet - 1.2.1-SNAPSHOT + 1.5.0-SNAPSHOT @@ -49,7 +49,7 @@ 2.2.1 3.0.1 - apitest-esignet-1.2.1-SNAPSHOT-jar-with-dependencies + apitest-esignet-1.5.0-SNAPSHOT-jar-with-dependencies From f5d82e83a7e50bf335a5249fcf52124f9551f5a4 Mon Sep 17 00:00:00 2001 From: Nandhukumar Date: Mon, 11 Nov 2024 15:02:37 +0530 Subject: [PATCH 27/80] MOSIP-37214 Signed-off-by: Nandhukumar --- .../testrunner/MosipTestRunner.java | 10 +- .../testscripts/AddIdentity.java | 6 +- .../testscripts/DeleteWithParam.java | 6 +- .../testscripts/EsignetBioAuth.java | 6 +- .../testscripts/GetWithParam.java | 6 +- .../testscripts/GetWithQueryParam.java | 6 +- .../{ => esignet}/testscripts/KycAuth.java | 6 +- .../PatchWithPathParamsAndBody.java | 6 +- .../PostWithAutogenIdWithOtpGenerate.java | 6 +- ...ostWithAutogenIdWithOtpGenerateForWla.java | 6 +- .../PostWithBodyAndPathParams.java | 6 +- ...ostWithBodyAndQueryParamsForAutoGenId.java | 6 +- .../PostWithBodyWithOtpGenerate.java | 6 +- .../testscripts/PostWithOnlyPathParam.java | 6 +- .../testscripts/PutWithPathParamsAndBody.java | 6 +- .../testscripts/SimplePatchForAutoGenId.java | 6 +- .../{ => esignet}/testscripts/SimplePost.java | 6 +- .../testscripts/SimplePostForAutoGenId.java | 6 +- .../SimplePostForAutoGenIdForUrlEncoded.java | 6 +- .../utils/EsignetConfigManager.java | 5 +- .../{ => esignet}/utils/EsignetUtil.java | 6 +- .../AuthenticateUserPassword.hbs | 16 - .../AuthenticateUserPassword.yml | 60 - .../AuthenticateUserPasswordResult.hbs | 5 - .../AuthenticateUserPasswordNegTC.hbs | 16 - .../AuthenticateUserPasswordNegTC.yml | 1147 ----------- ...henticateUserPasswordNegTCEmptyRequest.hbs | 6 - .../AuthenticateUserPasswordNegTCResult.hbs | 5 - ...ticateUserPasswordNegTCWOChallengeList.hbs | 9 - ...AuthenticateUserPasswordNegTCWORequest.hbs | 4 - .../AuthenticateUserV3/AuthenticateUser.hbs | 15 - .../AuthenticateUserV3/AuthenticateUser.yml | 33 - .../AuthenticateUserResult.hbs | 1 - .../AuthorizationCodePassword.hbs | 19 - .../AuthorizationCodePassword.yml | 54 - .../AuthorizationCodePasswordResult.hbs | 1 - .../esignet/ClaimDetails/ClaimDetails.hbs | 4 - .../esignet/ClaimDetails/ClaimDetails.yml | 15 - .../ClaimDetails/ClaimDetailsResult.hbs | 1 - .../GenerateChallengeForResetPassword.hbs | 8 - .../GenerateChallengeForResetPassword.yml | 33 - ...enerateChallengeForResetPasswordLocale.hbs | 8 - ...enerateChallengeForResetPasswordResult.hbs | 6 - ...GenerateChallengeForResetPasswordNegTC.hbs | 8 - ...GenerateChallengeForResetPasswordNegTC.yml | 200 -- ...teChallengeForResetPasswordNegTCResult.hbs | 6 - .../GenerateChallengeNegTC.yml | 797 -------- .../GenerateChallengeWithRegenField.hbs | 9 - .../GenerateChallengeWithTransID.hbs | 10 - .../GenerateTokenPassword.hbs | 8 - .../GenerateTokenPassword.yml | 58 - .../GenerateTokenPasswordResult.hbs | 3 - .../GenerateTokenPassword/GenerateTokenV2.hbs | 9 - .../esignet/GetIdVerifier/GetIdVerifier.hbs | 4 - .../esignet/GetIdVerifier/GetIdVerifier.yml | 15 - .../GetIdVerifier/GetIdVerifierResult.hbs | 1 - .../GetOidcUserInfoPassword.hbs | 3 - .../GetOidcUserInfoPassword.yml | 36 - .../GetOidcUserInfoPasswordResult.hbs | 1 - .../GetRegistrationStatus.hbs | 3 - .../GetRegistrationStatus.yml | 14 - .../GetRegistrationStatusResult.hbs | 5 - .../GetRegistrationStatusForResetPassword.hbs | 3 - .../GetRegistrationStatusForResetPassword.yml | 14 - ...gistrationStatusForResetPasswordResult.hbs | 5 - .../GetRegistrationStatusNegTC.hbs | 3 - .../GetRegistrationStatusNegTC.yml | 69 - .../GetRegistrationStatusNegTCResult.hbs | 5 - .../resources/esignet/GetSlot/GetSlot.hbs | 8 - .../resources/esignet/GetSlot/GetSlot.yml | 17 - .../esignet/GetSlot/GetSlotResult.hbs | 1 - .../IDTAuthentication/IDTAuthentication.hbs | 18 - .../IDTAuthentication/IDTAuthentication.yml | 22 - .../IDTAuthenticationResult.hbs | 1 - .../InitiateIdVerification.hbs | 7 - .../InitiateIdVerification.yml | 16 - .../InitiateIdVerificationResult.hbs | 1 - .../OAuthDetailsRequestPassword.hbs | 33 - .../OAuthDetailsRequestPassword.yml | 74 - .../OAuthDetailsRequestPasswordResult.hbs | 1 - .../OAuthDetailsRequestV2.hbs | 17 - .../OAuthDetailsRequestPasswordNegTC.hbs | 33 - .../OAuthDetailsRequestPasswordNegTC.yml | 72 - ...OAuthDetailsRequestPasswordNegTCResult.hbs | 1 - .../OAuthDetailsRequest.hbs | 40 - .../OAuthDetailsRequest.yml | 24 - .../OAuthDetailsRequestResult.hbs | 1 - .../PrepareSignupRedirect.hbs | 8 - .../PrepareSignupRedirect.yml | 17 - .../PrepareSignupRedirectResult.hbs | 1 - .../PrepareSignupRedirectNeg.hbs | 8 - .../PrepareSignupRedirectNeg.yml | 402 ---- .../PrepareSignupRedirectNegResult.hbs | 1 - .../esignet/RegisterUser/RegisterUser.hbs | 14 - .../esignet/RegisterUser/RegisterUser.yml | 20 - .../RegisterUser/RegisterUserResult.hbs | 5 - .../RegisterUserNegTC/RegisterUserNegTC.hbs | 14 - .../RegisterUserNegTC/RegisterUserNegTC.yml | 1764 ----------------- .../RegisterUserNegTCResult.hbs | 5 - .../esignet/ResetPassword/ResetPassword.hbs | 8 - .../esignet/ResetPassword/ResetPassword.yml | 16 - .../ResetPassword/ResetPasswordResult.hbs | 6 - .../ResetPasswordNegTC/ResetPasswordNegTC.hbs | 8 - .../ResetPasswordNegTC/ResetPasswordNegTC.yml | 594 ------ .../ResetPasswordNegTCResult.hbs | 6 - .../esignet/SignUpSettings/SignUpSettings.hbs | 1 - .../esignet/SignUpSettings/SignUpSettings.yml | 12 - .../SignUpSettings/SignUpSettingsResult.hbs | 1 - .../SignupAuthorize/SignupAuthorize.hbs | 15 - .../SignupAuthorize/SignupAuthorize.yml | 24 - .../SignupAuthorize/SignupAuthorizeResult.hbs | 1 - .../SignupAuthorizeCode.hbs | 16 - .../SignupAuthorizeCode.yml | 19 - .../SignupAuthorizeCodeResult.hbs | 1 - .../VerifyChallenge/VerifyChallenge.hbs | 12 - .../VerifyChallenge/VerifyChallenge.yml | 18 - .../VerifyChallenge/VerifyChallengeResult.hbs | 6 - .../VerifyChallengeForResetPassword.hbs | 19 - .../VerifyChallengeForResetPassword.yml | 21 - .../VerifyChallengeForResetPasswordResult.hbs | 6 - .../VerifyChallengeForResetPasswordNegTC.hbs | 19 - .../VerifyChallengeForResetPasswordNegTC.yml | 625 ------ ...fyChallengeForResetPasswordNegTCResult.hbs | 6 - .../VerifyChallengeNegTC.hbs | 12 - .../VerifyChallengeNegTC.yml | 1531 -------------- ...VerifyChallengeNegTCEmptyChallengeInfo.hbs | 8 - .../VerifyChallengeNegTCEmptyReq.hbs | 6 - .../VerifyChallengeNegTCResult.hbs | 6 - .../VerifyChallengeNegTCWOChallengeInfo.hbs | 7 - .../VerifyChallengeNegTCWOReqBody.hbs | 4 - .../esignetPrerequisiteSuite.xml | 195 ++ api-test/testNgXmlFiles/esignetSuite.xml | 607 +----- 132 files changed, 349 insertions(+), 9017 deletions(-) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testrunner/MosipTestRunner.java (96%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/AddIdentity.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/DeleteWithParam.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/EsignetBioAuth.java (98%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/GetWithParam.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/GetWithQueryParam.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/KycAuth.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/PatchWithPathParamsAndBody.java (96%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/PostWithAutogenIdWithOtpGenerate.java (98%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/PostWithAutogenIdWithOtpGenerateForWla.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/PostWithBodyAndPathParams.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/PostWithBodyAndQueryParamsForAutoGenId.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/PostWithBodyWithOtpGenerate.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/PostWithOnlyPathParam.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/PutWithPathParamsAndBody.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/SimplePatchForAutoGenId.java (96%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/SimplePost.java (98%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/SimplePostForAutoGenId.java (98%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/testscripts/SimplePostForAutoGenIdForUrlEncoded.java (97%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/utils/EsignetConfigManager.java (84%) rename api-test/src/main/java/io/mosip/testrig/apirig/{ => esignet}/utils/EsignetUtil.java (96%) delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPassword.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPassword.yml delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCEmptyRequest.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCResult.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWOChallengeList.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWORequest.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUser.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUser.yml delete mode 100644 api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUserResult.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePassword.hbs delete mode 100644 api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePassword.yml delete mode 100644 api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/ClaimDetails/ClaimDetails.hbs delete mode 100644 api-test/src/main/resources/esignet/ClaimDetails/ClaimDetails.yml delete mode 100644 api-test/src/main/resources/esignet/ClaimDetails/ClaimDetailsResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword.yml delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordLocale.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeWithTransID.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPassword.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPassword.yml delete mode 100644 api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenV2.hbs delete mode 100644 api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifier.hbs delete mode 100644 api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifier.yml delete mode 100644 api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifierResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword.hbs delete mode 100644 api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword.yml delete mode 100644 api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatus.hbs delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatus.yml delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatusResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPassword.hbs delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPassword.yml delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTC.hbs delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTCResult.hbs delete mode 100644 api-test/src/main/resources/esignet/GetSlot/GetSlot.hbs delete mode 100644 api-test/src/main/resources/esignet/GetSlot/GetSlot.yml delete mode 100644 api-test/src/main/resources/esignet/GetSlot/GetSlotResult.hbs delete mode 100644 api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthentication.hbs delete mode 100644 api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthentication.yml delete mode 100644 api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthenticationResult.hbs delete mode 100644 api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerification.hbs delete mode 100644 api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerification.yml delete mode 100644 api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerificationResult.hbs delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword.hbs delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword.yml delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestV2.hbs delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC.hbs delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTCResult.hbs delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequest.hbs delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequest.yml delete mode 100644 api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequestResult.hbs delete mode 100644 api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirect.hbs delete mode 100644 api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirect.yml delete mode 100644 api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirectResult.hbs delete mode 100644 api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNeg.hbs delete mode 100644 api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNeg.yml delete mode 100644 api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNegResult.hbs delete mode 100644 api-test/src/main/resources/esignet/RegisterUser/RegisterUser.hbs delete mode 100644 api-test/src/main/resources/esignet/RegisterUser/RegisterUser.yml delete mode 100644 api-test/src/main/resources/esignet/RegisterUser/RegisterUserResult.hbs delete mode 100644 api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTC.hbs delete mode 100644 api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTCResult.hbs delete mode 100644 api-test/src/main/resources/esignet/ResetPassword/ResetPassword.hbs delete mode 100644 api-test/src/main/resources/esignet/ResetPassword/ResetPassword.yml delete mode 100644 api-test/src/main/resources/esignet/ResetPassword/ResetPasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTC.hbs delete mode 100644 api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTCResult.hbs delete mode 100644 api-test/src/main/resources/esignet/SignUpSettings/SignUpSettings.hbs delete mode 100644 api-test/src/main/resources/esignet/SignUpSettings/SignUpSettings.yml delete mode 100644 api-test/src/main/resources/esignet/SignUpSettings/SignUpSettingsResult.hbs delete mode 100644 api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorize.hbs delete mode 100644 api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorize.yml delete mode 100644 api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorizeResult.hbs delete mode 100644 api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCode.hbs delete mode 100644 api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCode.yml delete mode 100644 api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCodeResult.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallenge.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallenge.yml delete mode 100644 api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallengeResult.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword.yml delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPasswordResult.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTCResult.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTC.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTC.yml delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyChallengeInfo.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyReq.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOChallengeInfo.hbs delete mode 100644 api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOReqBody.hbs create mode 100644 api-test/testNgXmlFiles/esignetPrerequisiteSuite.xml diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testrunner/MosipTestRunner.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testrunner/MosipTestRunner.java similarity index 96% rename from api-test/src/main/java/io/mosip/testrig/apirig/testrunner/MosipTestRunner.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testrunner/MosipTestRunner.java index 8137a736b..f83aff430 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testrunner/MosipTestRunner.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testrunner/MosipTestRunner.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testrunner; +package io.mosip.testrig.apirig.esignet.testrunner; import java.io.File; import java.io.FileInputStream; @@ -24,12 +24,16 @@ import io.mosip.testrig.apirig.dataprovider.BiometricDataProvider; import io.mosip.testrig.apirig.dbaccess.DBManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; +import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.testrunner.ExtractResource; +import io.mosip.testrig.apirig.testrunner.HealthChecker; +import io.mosip.testrig.apirig.testrunner.OTPListener; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthTestsUtil; import io.mosip.testrig.apirig.utils.CertificateGenerationUtil; import io.mosip.testrig.apirig.utils.CertsUtil; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.JWKKeyUtil; import io.mosip.testrig.apirig.utils.KeyCloakUserAndAPIKeyGeneration; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/AddIdentity.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/AddIdentity.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/AddIdentity.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/AddIdentity.java index f69c57653..29a4bf930 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/AddIdentity.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/AddIdentity.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.text.DateFormat; @@ -26,12 +26,12 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.testrunner.JsonPrecondtion; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.GlobalMethods; import io.mosip.testrig.apirig.utils.KernelAuthentication; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/DeleteWithParam.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/DeleteWithParam.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/DeleteWithParam.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/DeleteWithParam.java index 0515dfdc2..05a886dc0 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/DeleteWithParam.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/DeleteWithParam.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.ArrayList; @@ -22,12 +22,12 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/EsignetBioAuth.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/EsignetBioAuth.java similarity index 98% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/EsignetBioAuth.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/EsignetBioAuth.java index de9eb546b..293eab802 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/EsignetBioAuth.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/EsignetBioAuth.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.Base64; @@ -23,14 +23,14 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; import io.mosip.testrig.apirig.utils.BioDataUtility; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/GetWithParam.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/GetWithParam.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/GetWithParam.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/GetWithParam.java index 493a81101..c08997933 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/GetWithParam.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/GetWithParam.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.ArrayList; @@ -23,13 +23,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/GetWithQueryParam.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/GetWithQueryParam.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/GetWithQueryParam.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/GetWithQueryParam.java index e1ed3861d..66758f04f 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/GetWithQueryParam.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/GetWithQueryParam.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.ArrayList; @@ -23,13 +23,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/KycAuth.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/KycAuth.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/KycAuth.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/KycAuth.java index b73ce3fbb..f9c3d682f 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/KycAuth.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/KycAuth.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.HashMap; @@ -23,13 +23,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PatchWithPathParamsAndBody.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PatchWithPathParamsAndBody.java similarity index 96% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PatchWithPathParamsAndBody.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PatchWithPathParamsAndBody.java index ede73dd22..af8366809 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PatchWithPathParamsAndBody.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PatchWithPathParamsAndBody.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.List; @@ -20,13 +20,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithAutogenIdWithOtpGenerate.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithAutogenIdWithOtpGenerate.java similarity index 98% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithAutogenIdWithOtpGenerate.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithAutogenIdWithOtpGenerate.java index 53820d7bb..ef28ca041 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithAutogenIdWithOtpGenerate.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithAutogenIdWithOtpGenerate.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.List; @@ -22,13 +22,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithAutogenIdWithOtpGenerateForWla.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithAutogenIdWithOtpGenerateForWla.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithAutogenIdWithOtpGenerateForWla.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithAutogenIdWithOtpGenerateForWla.java index 5c5172a95..1145b9221 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithAutogenIdWithOtpGenerateForWla.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithAutogenIdWithOtpGenerateForWla.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.List; @@ -22,13 +22,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyAndPathParams.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyAndPathParams.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyAndPathParams.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyAndPathParams.java index 86b27131d..0b49fd791 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyAndPathParams.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyAndPathParams.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.ArrayList; @@ -22,13 +22,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyAndQueryParamsForAutoGenId.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyAndQueryParamsForAutoGenId.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyAndQueryParamsForAutoGenId.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyAndQueryParamsForAutoGenId.java index 170d5bb22..49b6ce88f 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyAndQueryParamsForAutoGenId.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyAndQueryParamsForAutoGenId.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.HashMap; @@ -22,14 +22,14 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.PartnerTypes; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyWithOtpGenerate.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyWithOtpGenerate.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyWithOtpGenerate.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyWithOtpGenerate.java index 1371671dd..07197a545 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithBodyWithOtpGenerate.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithBodyWithOtpGenerate.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.List; @@ -21,13 +21,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithOnlyPathParam.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithOnlyPathParam.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithOnlyPathParam.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithOnlyPathParam.java index a462e3fe1..e91846d03 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PostWithOnlyPathParam.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PostWithOnlyPathParam.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.ArrayList; @@ -23,13 +23,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PutWithPathParamsAndBody.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PutWithPathParamsAndBody.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PutWithPathParamsAndBody.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PutWithPathParamsAndBody.java index 72c2c22a6..745e04a96 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/PutWithPathParamsAndBody.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/PutWithPathParamsAndBody.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.ArrayList; @@ -23,13 +23,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePatchForAutoGenId.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePatchForAutoGenId.java similarity index 96% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePatchForAutoGenId.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePatchForAutoGenId.java index 0d01f908d..ce34b11d3 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePatchForAutoGenId.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePatchForAutoGenId.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.ArrayList; @@ -22,13 +22,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePost.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePost.java similarity index 98% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePost.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePost.java index fa569a938..30e04ab99 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePost.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePost.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.util.ArrayList; @@ -23,13 +23,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePostForAutoGenId.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePostForAutoGenId.java similarity index 98% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePostForAutoGenId.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePostForAutoGenId.java index 529ef78f5..9f1ec5acc 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePostForAutoGenId.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePostForAutoGenId.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.security.NoSuchAlgorithmException; @@ -24,13 +24,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePostForAutoGenIdForUrlEncoded.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePostForAutoGenIdForUrlEncoded.java similarity index 97% rename from api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePostForAutoGenIdForUrlEncoded.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePostForAutoGenIdForUrlEncoded.java index 4409e3eb0..26fba2683 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/testscripts/SimplePostForAutoGenIdForUrlEncoded.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/testscripts/SimplePostForAutoGenIdForUrlEncoded.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.testscripts; +package io.mosip.testrig.apirig.esignet.testscripts; import java.lang.reflect.Field; import java.security.NoSuchAlgorithmException; @@ -23,13 +23,13 @@ import io.mosip.testrig.apirig.dto.OutputValidationDto; import io.mosip.testrig.apirig.dto.TestCaseDTO; +import io.mosip.testrig.apirig.esignet.utils.EsignetConfigManager; +import io.mosip.testrig.apirig.esignet.utils.EsignetUtil; import io.mosip.testrig.apirig.testrunner.BaseTestCase; import io.mosip.testrig.apirig.testrunner.HealthChecker; import io.mosip.testrig.apirig.utils.AdminTestException; import io.mosip.testrig.apirig.utils.AdminTestUtil; import io.mosip.testrig.apirig.utils.AuthenticationTestException; -import io.mosip.testrig.apirig.utils.EsignetConfigManager; -import io.mosip.testrig.apirig.utils.EsignetUtil; import io.mosip.testrig.apirig.utils.GlobalConstants; import io.mosip.testrig.apirig.utils.OutputValidationUtil; import io.mosip.testrig.apirig.utils.ReportUtil; diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/utils/EsignetConfigManager.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/utils/EsignetConfigManager.java similarity index 84% rename from api-test/src/main/java/io/mosip/testrig/apirig/utils/EsignetConfigManager.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/utils/EsignetConfigManager.java index c4a3c9d32..47a6aeee0 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/utils/EsignetConfigManager.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/utils/EsignetConfigManager.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.utils; +package io.mosip.testrig.apirig.esignet.utils; import java.util.HashMap; import java.util.Map; @@ -6,7 +6,8 @@ import org.apache.log4j.Logger; -import io.mosip.testrig.apirig.testrunner.MosipTestRunner; +import io.mosip.testrig.apirig.esignet.testrunner.MosipTestRunner; +import io.mosip.testrig.apirig.utils.ConfigManager; public class EsignetConfigManager extends ConfigManager{ private static final Logger LOGGER = Logger.getLogger(EsignetConfigManager.class); diff --git a/api-test/src/main/java/io/mosip/testrig/apirig/utils/EsignetUtil.java b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/utils/EsignetUtil.java similarity index 96% rename from api-test/src/main/java/io/mosip/testrig/apirig/utils/EsignetUtil.java rename to api-test/src/main/java/io/mosip/testrig/apirig/esignet/utils/EsignetUtil.java index 624c821f2..d0690225b 100644 --- a/api-test/src/main/java/io/mosip/testrig/apirig/utils/EsignetUtil.java +++ b/api-test/src/main/java/io/mosip/testrig/apirig/esignet/utils/EsignetUtil.java @@ -1,4 +1,4 @@ -package io.mosip.testrig.apirig.utils; +package io.mosip.testrig.apirig.esignet.utils; import java.util.Arrays; import java.util.HashMap; @@ -13,6 +13,10 @@ import io.mosip.testrig.apirig.dto.TestCaseDTO; import io.mosip.testrig.apirig.testrunner.BaseTestCase; +import io.mosip.testrig.apirig.utils.AdminTestUtil; +import io.mosip.testrig.apirig.utils.GlobalConstants; +import io.mosip.testrig.apirig.utils.RestClient; +import io.mosip.testrig.apirig.utils.SkipTestCaseHandler; import io.restassured.response.Response; public class EsignetUtil extends AdminTestUtil { diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPassword.hbs b/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPassword.hbs deleted file mode 100644 index 55f03c456..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPassword.hbs +++ /dev/null @@ -1,16 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "request": { - "transactionId": "{{transactionId}}", - "individualId": "{{individualId}}", - "captchaToken": "", - "challengeList" : [ - { - "authFactorType" : "{{authFactorType}}", - "challenge" : "{{challenge}}", - "format": "alpha-numeric" - } - ] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPassword.yml b/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPassword.yml deleted file mode 100644 index c7fe4a0d4..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPassword.yml +++ /dev/null @@ -1,60 +0,0 @@ -AuthenticateUserPassword: - ESignet_AuthenticateUserPassword_Valid_Smoke: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPassword/AuthenticateUserPassword - outputTemplate: esignet/AuthenticateUserPassword/AuthenticateUserPasswordResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_all_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$" - }' - output: '{ - "consentAction": "CAPTURE" -}' - - ESignet_AuthenticateUserPassword_V2_Valid_Smoke: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPassword/AuthenticateUserPassword - outputTemplate: esignet/AuthenticateUserPassword/AuthenticateUserPasswordResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_V2_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_V2_all_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$" - }' - output: '{ - "consentAction": "CAPTURE" -}' - - ESignet_AuthenticateUserPassword_uin_Valid_Smoke: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPassword/AuthenticateUserPassword - outputTemplate: esignet/AuthenticateUserPassword/AuthenticateUserPasswordResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_uin_all_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:AddIdentity_Password_Auth_smoke_Pos_UIN$", - "authFactorType" : "PWD", - "challenge" : "$PASSWORDFORAUTHENTICATION$" - }' - output: '{ - "consentAction": "CAPTURE" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPasswordResult.hbs b/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPasswordResult.hbs deleted file mode 100644 index 72fa0607d..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPassword/AuthenticateUserPasswordResult.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{ - "response": { - "consentAction": "{{consentAction}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC.hbs b/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC.hbs deleted file mode 100644 index 956f0e9e4..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC.hbs +++ /dev/null @@ -1,16 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "request": { - "transactionId": "{{transactionId}}", - "individualId": "{{individualId}}", - "captchaToken": "", - "challengeList" : [ - { - "authFactorType" : "{{authFactorType}}", - "challenge" : "{{challenge}}", - "format": "{{format}}" - } - ] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC.yml b/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC.yml deleted file mode 100644 index fcba4be6b..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC.yml +++ /dev/null @@ -1,1147 +0,0 @@ -AuthenticateUserPasswordNegTC: - ESignet_AuthenticateUserPasswordNegTC_Missing_ReqTime_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$REMOVE$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Empty_ReqTime_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_SpaceVal_ReqTime_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": " ", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Invalid_ReqTime_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "requestinvalid", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Invalid_Num_ReqTime_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "762537232", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Missing_ReqTime_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$REMOVE$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Missing_ChallengeList_Array_and_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_no_of_challenges,invalid_identifier - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWOChallengeList - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$REMOVE$", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_no_of_challenges" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Missing_TransactionId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$REMOVE$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Empty_TransactionId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_SpaceVal_TransactionId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": " ", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Invalid_TransactionId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "sdgbsgljkj", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Expired_TransactionId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "hHdtT70A6ne3r392Qsw3raRQKkksNrSCx-Z1ZzFaSm8", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Missing_ChallengeList_Array_and_TransactionId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWOChallengeList - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$REMOVE$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Missing_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$REMOVE$", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Empty_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_SpaceVal_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": " ", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_UnRegistered_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "+855737289558@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-MLC-018" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Without_CountryCode_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "737289558@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-MLC-009" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_StartsWith_Zero_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "+855000289558@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-MLC-009" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_All_Zero_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "+00000000000@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-MLC-009" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_SpecialChar_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "+855737^8:@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-MLC-009" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_SpaceInVal_IndividualId_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "+ 855 737289558@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-MLC-009" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Without_RequestBody_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWORequest - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-MLC-009" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Without_RequestBody_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCEmptyRequest - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Without_ChallengeList_Array_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWOChallengeList - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_no_of_challenges" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Empty_ChallengeList_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "$REMOVE$", - "challenge" : "$REMOVE$", - "format": "$REMOVE$" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_Empty_ChallengeList_and_format_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$REMOVE$", - "format": "$REMOVE$" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_without_authFactorType_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "$REMOVE$", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_empty_authFactorType_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_empty_string_authFactorType_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : " ", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_invalid_authFactorType_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "abc@s", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "auth_factor_mismatch" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_authFactorType_password_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PASSWORD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "auth_factor_mismatch" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_only_challenge_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "$REMOVE$", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "$REMOVE$" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_without_challenge_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$REMOVE$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_with_empty_challenge_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_with_empty_string_challenge_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : " ", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_unregistered_challenge_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "hghja6757", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-PSD-001" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_invalid_challenge_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "hghja6757", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-PSD-001" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_challenge_doesnot_match_regex_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "11111fdsd$%%VDSF1", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "IDA-PSD-001" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_with_only_format_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "$REMOVE$", - "challenge" : "$REMOVE$", - "format": "alpha-numeric" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_withOUT_format_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "$REMOVE$" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_Empty_format_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_Empty_string_format_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": " " - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_invalid_format_in_challenegelist_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen2_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen2_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge": "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-sfad" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ] -}' - ESignet_AuthenticateUserPasswordNegTC_with_unsupported_format_in_challenegelist_Neg: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge_format,invalid_auth_factor_type,invalid_challenge - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen3_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen3_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge": "$RESETPASSWORDFORAUTHENTICATION$", - "format": "cwt" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ] -}' - - ESignet_AuthenticateUserPasswordNegTC_Valid_Smoke: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTC - outputTemplate: esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$@phone", - "authFactorType" : "PWD", - "challenge" : "$RESETPASSWORDFORAUTHENTICATION$", - "format": "alpha-numeric" - }' - output: '{ - "consentAction": "CAPTURE" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCEmptyRequest.hbs b/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCEmptyRequest.hbs deleted file mode 100644 index 9f9b5d0d6..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCEmptyRequest.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "request": { - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCResult.hbs b/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCResult.hbs deleted file mode 100644 index 72fa0607d..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCResult.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{ - "response": { - "consentAction": "{{consentAction}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWOChallengeList.hbs b/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWOChallengeList.hbs deleted file mode 100644 index 13f8567d0..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWOChallengeList.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "request": { - "transactionId": "{{transactionId}}", - "individualId": "{{individualId}}", - "captchaToken": "" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWORequest.hbs b/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWORequest.hbs deleted file mode 100644 index 7221f1cbc..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserPasswordNegTC/AuthenticateUserPasswordNegTCWORequest.hbs +++ /dev/null @@ -1,4 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUser.hbs b/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUser.hbs deleted file mode 100644 index 43ef2d127..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUser.hbs +++ /dev/null @@ -1,15 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "request": { - "transactionId": "{{transactionId}}", - "individualId": "{{individualId}}", - "challengeList" : [ - { - "authFactorType" : "{{authFactorType}}", - "challenge" : "{{challenge}}", - "format": "alpha-numeric" - } - ] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUser.yml b/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUser.yml deleted file mode 100644 index 0295526dc..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUser.yml +++ /dev/null @@ -1,33 +0,0 @@ -AuthenticateUserV3: - ESignet_AuthenticateUser_V3_AuthToken_Xsrf__uin_Otp_Valid_Smoke: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthenticateUserV3/AuthenticateUser - outputTemplate: esignet/AuthenticateUserV3/AuthenticateUserResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:AddIdentity_L2_Valid_Parameters_smoke_Pos_UIN$", - "authFactorType" : "OTP", - "challenge" : "$ID:AddIdentity_L2_Valid_Parameters_smoke_Pos_EMAIL$", - "sendOtp":{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "individualId": "$ID:AddIdentity_L2_Valid_Parameters_smoke_Pos_UIN$", - "otpChannels": [{channel: "email"},{channel: "phone"}], - "sendOtpReqTemplate": "esignet/SendOtp/SendOtp", - "sendOtpEndPoint": "/v1/esignet/authorization/send-otp" - } - }' - output: '{ - "sendOtpResp":{ - "maskedMobile": "$IGNORE$", - "sendOtpResTemplate":"esignet/SendOtp/SendOtpResult", - "maskedEmail": "$IGNORE$" - } -}' diff --git a/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUserResult.hbs b/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUserResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/AuthenticateUserV3/AuthenticateUserResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePassword.hbs b/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePassword.hbs deleted file mode 100644 index 491dca1ba..000000000 --- a/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePassword.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "request": { - "transactionId": "{{transactionId}}", - "acceptedClaims": [ - {{#each acceptedClaims}} - "{{claim}}" - {{#unless @last}},{{/unless}} - {{/each}} - ], - "permittedAuthorizeScopes": [ - {{#each permittedAuthorizeScopes}} - "{{scope}}" - {{#unless @last}},{{/unless}} - {{/each}} - ] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePassword.yml b/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePassword.yml deleted file mode 100644 index c454ffd51..000000000 --- a/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePassword.yml +++ /dev/null @@ -1,54 +0,0 @@ -AuthorizationCodePassword: - ESignet_AuthorizationCode_Password_All_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/auth-code - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthorizationCodePassword/AuthorizationCodePassword - outputTemplate: esignet/AuthorizationCodePassword/AuthorizationCodePasswordResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_all_Valid_Smoke_sid_transactionId$", - "acceptedClaims": [{claim: "name"},{claim: "gender"},{claim: "email"}] -}' - output: '{ - "redirectUri": "$IGNORE$" -}' - - ESignet_AuthorizationCode_Password_V2_All_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/auth-code - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthorizationCodePassword/AuthorizationCodePassword - outputTemplate: esignet/AuthorizationCodePassword/AuthorizationCodePasswordResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_V2_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_V2_all_Valid_Smoke_sid_transactionId$", - "acceptedClaims": [{claim: "name"},{claim: "gender"},{claim: "email"}] -}' - output: '{ - "redirectUri": "$IGNORE$" -}' - - ESignet_AuthorizationCode_Password_uin_All_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/auth-code - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/AuthorizationCodePassword/AuthorizationCodePassword - outputTemplate: esignet/AuthorizationCodePassword/AuthorizationCodePasswordResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_Password_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_Password_uin_all_Valid_Smoke_sid_transactionId$", - "acceptedClaims": [{claim: "name"},{claim: "gender"},{claim: "email"}] -}' - output: '{ - "redirectUri": "$IGNORE$" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePasswordResult.hbs b/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePasswordResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/AuthorizationCodePassword/AuthorizationCodePasswordResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetails.hbs b/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetails.hbs deleted file mode 100644 index ead77da28..000000000 --- a/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetails.hbs +++ /dev/null @@ -1,4 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "transactionId": "{{transactionId}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetails.yml b/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetails.yml deleted file mode 100644 index 3ea1fb484..000000000 --- a/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetails.yml +++ /dev/null @@ -1,15 +0,0 @@ -ClaimDetails: - ESignet_ClaimDetails_AuthToken_Xsrf_uin_Valid_Smoke: - endPoint: /v1/esignet/authorization/claim-details - role: resident - restMethod: get - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/ClaimDetails/ClaimDetails - outputTemplate: esignet/ClaimDetails/ClaimDetailsResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$" - }' - output: '{ -}' diff --git a/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetailsResult.hbs b/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetailsResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/ClaimDetails/ClaimDetailsResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword.hbs b/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword.hbs deleted file mode 100644 index 8dddad22f..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "captchaToken": "{{captchaToken}}", - "purpose": "{{purpose}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword.yml b/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword.yml deleted file mode 100644 index 7a5a04f6b..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword.yml +++ /dev/null @@ -1,33 +0,0 @@ -GenerateChallengeForResetPassword: - ESignet_GenerateChallengeForResetPassword_STransId_Valid_smoke_Pos: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword - outputTemplate: esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordResult - input: '{ - "identifier": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "status":"SUCCESS" -}' - - ESignet_GenerateChallengeForResetPassword_STransId_With_1stLang_Valid_smoke_Pos: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPassword - outputTemplate: esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordResult - input: '{ - "identifier": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "locale": "$1STLANG$" -}' - output: '{ - "status":"SUCCESS" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordLocale.hbs b/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordLocale.hbs deleted file mode 100644 index e77ff0779..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordLocale.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "captchaToken": "{{captchaToken}}", - "locale": "{{locale}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordResult.hbs b/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordResult.hbs deleted file mode 100644 index 5f16f0c41..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeForResetPassword/GenerateChallengeForResetPasswordResult.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "response": { - "status": "{{status}}" - }, - "errors": [] -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC.hbs b/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC.hbs deleted file mode 100644 index 8dddad22f..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "captchaToken": "{{captchaToken}}", - "purpose": "{{purpose}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC.yml b/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC.yml deleted file mode 100644 index e4cb8a026..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC.yml +++ /dev/null @@ -1,200 +0,0 @@ -GenerateChallengeForResetPasswordNegTC: - ESignet_GenerateChallengeForResetPasswordNegTC_Empty_Purpose_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_SpaceVal_Purpose_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": " ", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_Invalid_Purpose_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESETPASSWORD", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_Invalid_Purpose2_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "reset_password", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_Invalid_Purpose3_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "resetpassword", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_Invalid_Purpose4_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PWD", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_Invalid_Purpose5_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RE_SET_PASSWORD", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_Invalid_Purpose6_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "SET_PASSWORD", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_Invalid_Purpose7_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "SET_PWD", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeForResetPasswordNegTC_Invalid_Purpose8_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "REGISTRATION,RESET_PASSWORD", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult.hbs b/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult.hbs deleted file mode 100644 index 5f16f0c41..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "response": { - "status": "{{status}}" - }, - "errors": [] -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeNegTC.yml b/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeNegTC.yml deleted file mode 100644 index f4c955a87..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeNegTC.yml +++ /dev/null @@ -1,797 +0,0 @@ -GenerateChallengeNegTC: - ESignet_GenerateChallengeNegTC_Missing_CSRF_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - allowedErrorCodes: 403 - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ -}' - - ESignet_GenerateChallengeNegTC_Invalid_Locale_Lang_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallengeWithLocale - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "requestTime": "$TIMESTAMP$", - "purpose": "REGISTRATION", - "locale": "dfghdgh" -}' - output: '{ - "errors": [ - { - "errorCode": "unsupported_language" - } - ] -}' - - ESignet_GenerateChallengeNegTC_without_requestTime: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_without_requestTime: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_without_requestTime_SPACE: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": " " -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_with_INVALID_requestTime: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "requestinvalid" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_with_Number_in_requestTime: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "12636478" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_with_Invalid_requestTime_Format: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "2023/11/03 11:03:29.296Z" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_only_with_requestTime: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_purpose,invalid_identifier - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$REMOVE$", - "captchaToken": "$REMOVE$", - "purpose": "$REMOVE$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_Empty_Request: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_request,invalid_identifier - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$REMOVE$", - "captchaToken": "$REMOVE$", - "purpose": "$REMOVE$", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_Only_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_request,invalid_purpose - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "$REMOVE$", - "purpose": "$REMOVE$", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_empty_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_empty_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_empty_string_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": " ", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_char_numbers_in_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "+85556$%8924", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_char_alphabets_in_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "+85556sig8924", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_all_zeros_in_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "+000000000", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_Without_CountryCode_in_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "56768924", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_space_in_identifier: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "+8555 6898924", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_With_space_in_identifier_field: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "+ 855 56738924", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_for_already_registered_mobile_number: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/GenerateChallenge/GenerateChallengeResult - input: '{ - "identifier": "+85556738924", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "status":"SUCCESS" -}' - ESignet_GenerateChallengeNegTC_with_only_captcha_token: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_identifier,invalid_request - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$REMOVE$", - "captchaToken": "", - "purpose": "$REMOVE$", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_with_Empty_captcha_token: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_request,invalid_identifier - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$REMOVE$", - "captchaToken": " ", - "purpose": "$REMOVE$", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_with_Empty_string_captcha_token: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_request,invalid_identifier - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$REMOVE$", - "captchaToken": " ", - "purpose": "$REMOVE$", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GenerateChallengeNegTC_with_invalid_captcha_token: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_request,invalid_identifier - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$REMOVE$", - "captchaToken": "@3664748hgdh", - "purpose": "$REMOVE$", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - - ESignet_GenerateChallengeNegTC_Invalid_purpose_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "sdfgsd", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeNegTC_Empty_purpose_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeNegTC_Null_purpose_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "null", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeNegTC_Missing_purpose_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "$REMOVE$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_purpose" - } - ] -}' - - ESignet_GenerateChallengeNegTC_SpaceVal_purpose_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallenge/GenerateChallenge - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": " ", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeNegTC_Valid_Regenerate_Field1_Pos: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField - outputTemplate: esignet/GenerateChallenge/GenerateChallengeResult - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "false" -}' - output: '{ - "status":"SUCCESS" -}' - - ESignet_GenerateChallengeNegTC_STransId_Missing_Regenerate_Field_Pos: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField - outputTemplate: esignet/GenerateChallenge/GenerateChallengeResult - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "$REMOVE$" -}' - output: '{ - "status":"SUCCESS" -}' - - ESignet_GenerateChallengeNegTC_True_Regenerate_Field_Immediately_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithTransID - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:GenerateChallengeNegTC_STransId_Missing_Regenerate_Field_Pos_TransactionID$", - "identifier": "$ID:GenerateChallengeNegTC_STransId_Missing_Regenerate_Field_Pos_PHONE$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "true" -}' - output: '{ - "errors": [ - { - "errorCode": "too_early_attempt" - } - ] -}' - - ESignet_GenerateChallengeNegTC_True_Regenerate_Field_With_Expired_TransactionID_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithTransID - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "mifw7MnFkxYidmJ1u4jJKGi0XuJVsS-NQGgILa_8kSM", - "identifier": "$ID:GenerateChallengeNegTC_STransId_Missing_Regenerate_Field_Pos_PHONE$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "true" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_GenerateChallengeNegTC_True_Regenerate_Field_With_Invalid_TransactionID_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithTransID - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "adsfadag", - "identifier": "$ID:GenerateChallengeNegTC_STransId_Missing_Regenerate_Field_Pos_PHONE$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "true" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_GenerateChallengeNegTC_Valid_Regenerate_Field_WO_TransactionID_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "true" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_GenerateChallengeNegTC_Invalid_Regenerate_Field2_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "sjdk" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_GenerateChallengeNegTC_Empty_Regenerate_Field3_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField - outputTemplate: esignet/GenerateChallenge/GenerateChallengeResult - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "" -}' - output: '{ - "status":"SUCCESS" -}' - - ESignet_GenerateChallengeNegTC_Null_Regenerate_Field3_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField - outputTemplate: esignet/GenerateChallenge/GenerateChallengeResult - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": "null" -}' - output: '{ - "status":"SUCCESS" -}' - - ESignet_GenerateChallengeNegTC_SpaceVal_Regenerate_Field3_Neg: - endPoint: /v1/signup/registration/generate-challenge - role: resident - restMethod: post - inputTemplate: esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField - outputTemplate: esignet/error - input: '{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "regenerateChallenge": " " -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField.hbs b/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField.hbs deleted file mode 100644 index 63eb75134..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeWithRegenField.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "captchaToken": "{{captchaToken}}", - "purpose": "{{purpose}}", - "regenerateChallenge": "{{regenerateChallenge}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeWithTransID.hbs b/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeWithTransID.hbs deleted file mode 100644 index a3a0a8835..000000000 --- a/api-test/src/main/resources/esignet/GenerateChallengeNegTC/GenerateChallengeWithTransID.hbs +++ /dev/null @@ -1,10 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "captchaToken": "{{captchaToken}}", - "purpose": "{{purpose}}", - "regenerateChallenge": "{{regenerateChallenge}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPassword.hbs b/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPassword.hbs deleted file mode 100644 index 142c11d62..000000000 --- a/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPassword.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "grant_type": "{{grant_type}}", - "code": "{{code}}", - "client_id": "{{client_id}}", - "client_assertion_type": "{{client_assertion_type}}", - "client_assertion": "{{client_assertion}}", - "redirect_uri": "{{redirect_uri}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPassword.yml b/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPassword.yml deleted file mode 100644 index 5b286f539..000000000 --- a/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPassword.yml +++ /dev/null @@ -1,58 +0,0 @@ -GenerateTokenPassword: - ESignet_GenerateToken_Password_Valid_Smoke_sid: - endPoint: $GETENDPOINTFROMWELLKNOWN$ - role: resident - restMethod: post - validityCheckRequired: true - inputTemplate: esignet/GenerateTokenPassword/GenerateTokenPassword - outputTemplate: esignet/GenerateTokenPassword/GenerateTokenPasswordResult - input: '{ - "grant_type": "authorization_code", - "code": "$ID:AuthorizationCode_Password_All_Valid_Smoke_sid_code$", - "client_id": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", - "client_assertion": "$CLIENT_ASSERTION_JWK$", - "redirect_uri": "$IDPREDIRECTURI$" -}' - output: '{ - "token_type": "Bearer" -}' - - ESignet_GenerateToken_Password_V2_Valid_Smoke_sid: - endPoint: $GETENDPOINTFROMWELLKNOWN$ - role: resident - restMethod: post - validityCheckRequired: true - inputTemplate: esignet/GenerateTokenPassword/GenerateTokenV2 - outputTemplate: esignet/GenerateTokenPassword/GenerateTokenPasswordResult - input: '{ - "grant_type": "authorization_code", - "code": "$ID:AuthorizationCode_Password_V2_All_Valid_Smoke_sid_code$", - "client_id": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", - "client_assertion": "$CLIENT_ASSERTION_JWK$", - "redirect_uri": "$IDPREDIRECTURI$", - "code_verifier": "$CODEVERIFIER$" -}' - output: '{ - "token_type": "Bearer" -}' - - ESignet_GenerateToken_Password_uin_Valid_Smoke_sid: - endPoint: $GETENDPOINTFROMWELLKNOWN$ - role: resident - restMethod: post - validityCheckRequired: true - inputTemplate: esignet/GenerateTokenPassword/GenerateTokenPassword - outputTemplate: esignet/GenerateTokenPassword/GenerateTokenPasswordResult - input: '{ - "grant_type": "authorization_code", - "code": "$ID:AuthorizationCode_Password_uin_All_Valid_Smoke_sid_code$", - "client_id": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "client_assertion_type": "urn:ietf:params:oauth:client-assertion-type:jwt-bearer", - "client_assertion": "$CLIENT_ASSERTION_JWK$", - "redirect_uri": "$IDPREDIRECTURI$" -}' - output: '{ - "token_type": "Bearer" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPasswordResult.hbs b/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPasswordResult.hbs deleted file mode 100644 index c323e20a7..000000000 --- a/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenPasswordResult.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{ - "token_type": "{{token_type}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenV2.hbs b/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenV2.hbs deleted file mode 100644 index c425e6765..000000000 --- a/api-test/src/main/resources/esignet/GenerateTokenPassword/GenerateTokenV2.hbs +++ /dev/null @@ -1,9 +0,0 @@ -{ - "grant_type": "{{grant_type}}", - "code": "{{code}}", - "client_id": "{{client_id}}", - "client_assertion_type": "{{client_assertion_type}}", - "client_assertion": "{{client_assertion}}", - "redirect_uri": "{{redirect_uri}}", - "code_verifier": "{{code_verifier}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifier.hbs b/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifier.hbs deleted file mode 100644 index 5ad3d59f8..000000000 --- a/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifier.hbs +++ /dev/null @@ -1,4 +0,0 @@ -{ - "idvTransactionID": "{{idvTransactionID}}", - "verifierId": "{{verifierId}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifier.yml b/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifier.yml deleted file mode 100644 index 9405ec6a7..000000000 --- a/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifier.yml +++ /dev/null @@ -1,15 +0,0 @@ -GetIdVerifier: - ESignet_GetIdVerifier_STransId_uin_all_Valid_Smoke: - endPoint: /v1/signup/identity-verification/identity-verifier/{verifierId} - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/GetIdVerifier/GetIdVerifier - outputTemplate: esignet/GetIdVerifier/GetIdVerifierResult - input: '{ - "idvTransactionID": "$ID:InitiateIdVerification_STransId_AuthToken_Xsrf_uin_all_Valid_Smoke_Sid_idvTransactionID$", - "verifierId": "$ID:InitiateIdVerification_STransId_AuthToken_Xsrf_uin_all_Valid_Smoke_Sid_id$" -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifierResult.hbs b/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifierResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/GetIdVerifier/GetIdVerifierResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword.hbs b/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword.hbs deleted file mode 100644 index 4adf4e90f..000000000 --- a/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{ - "idpAccessToken": "{{idpAccessToken}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword.yml b/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword.yml deleted file mode 100644 index af3ce7960..000000000 --- a/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword.yml +++ /dev/null @@ -1,36 +0,0 @@ -GetOidcUserInfoPassword: - ESignet_GetOidcUserInfo_IdpAccessToken_StatusCode_Password_Valid_Smoke_sid: - endPoint: /v1/esignet/oidc/userinfo - role: resident - restMethod: get - validityCheckRequired: true - inputTemplate: esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword - outputTemplate: esignet/GetOidcUserInfoPassword/GetOidcUserInfoPasswordResult - input: '{ - "idpAccessToken": "$ID:GenerateToken_Password_Valid_Smoke_sid_access_token$" -}' - output: "200" - - ESignet_GetOidcUserInfo_IdpAccessToken_StatusCode_Password_V2_Valid_Smoke_sid: - endPoint: /v1/esignet/oidc/userinfo - role: resident - restMethod: get - validityCheckRequired: true - inputTemplate: esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword - outputTemplate: esignet/GetOidcUserInfoPassword/GetOidcUserInfoPasswordResult - input: '{ - "idpAccessToken": "$ID:GenerateToken_Password_V2_Valid_Smoke_sid_access_token$" -}' - output: "200" - - ESignet_GetOidcUserInfo_IdpAccessToken_StatusCode_Password_uin_Valid_Smoke_sid: - endPoint: /v1/esignet/oidc/userinfo - role: resident - restMethod: get - validityCheckRequired: true - inputTemplate: esignet/GetOidcUserInfoPassword/GetOidcUserInfoPassword - outputTemplate: esignet/GetOidcUserInfoPassword/GetOidcUserInfoPasswordResult - input: '{ - "idpAccessToken": "$ID:GenerateToken_Password_uin_Valid_Smoke_sid_access_token$" -}' - output: "200" \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPasswordResult.hbs b/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPasswordResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/GetOidcUserInfoPassword/GetOidcUserInfoPasswordResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatus.hbs b/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatus.hbs deleted file mode 100644 index 2786eda62..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatus.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{ - "verifiedTransactionID": "{{verifiedTransactionID}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatus.yml b/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatus.yml deleted file mode 100644 index 9292620e0..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatus.yml +++ /dev/null @@ -1,14 +0,0 @@ -GetRegistrationStatus: - ESignet_GetRegistrationStatus_Valid_smoke_Pos: - endPoint: /v1/signup/registration/status - role: resident - restMethod: post - allowedErrorCodes: PENDING,COMPLETED - inputTemplate: esignet/GetRegistrationStatus/GetRegistrationStatus - outputTemplate: esignet/GetRegistrationStatus/GetRegistrationStatusResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallenge_STransId_smoke_Pos_VTransactionID$" -}' - output: '{ - "status":"PENDING" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatusResult.hbs b/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatusResult.hbs deleted file mode 100644 index ca45b742b..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatus/GetRegistrationStatusResult.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{ - "response": { - "status": "{{status}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPassword.hbs b/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPassword.hbs deleted file mode 100644 index 2786eda62..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPassword.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{ - "verifiedTransactionID": "{{verifiedTransactionID}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPassword.yml b/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPassword.yml deleted file mode 100644 index 977a8013f..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPassword.yml +++ /dev/null @@ -1,14 +0,0 @@ -GetRegistrationStatus: - ESignet_GetRegistrationStatus_Valid_smoke_Pos: - endPoint: /v1/signup/registration/status - role: resident - restMethod: post - allowedErrorCodes: PENDING,COMPLETED - inputTemplate: esignet/GetRegistrationStatus/GetRegistrationStatus - outputTemplate: esignet/GetRegistrationStatus/GetRegistrationStatusResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPassword_STransId_smoke_Pos_VTransactionID$" -}' - output: '{ - "status":"PENDING" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPasswordResult.hbs b/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPasswordResult.hbs deleted file mode 100644 index ca45b742b..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatusForResetPassword/GetRegistrationStatusForResetPasswordResult.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{ - "response": { - "status": "{{status}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTC.hbs b/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTC.hbs deleted file mode 100644 index 2786eda62..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTC.hbs +++ /dev/null @@ -1,3 +0,0 @@ -{ - "verifiedTransactionID": "{{verifiedTransactionID}}" -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTC.yml b/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTC.yml deleted file mode 100644 index 69bb931f2..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTC.yml +++ /dev/null @@ -1,69 +0,0 @@ -GetRegistrationStatusNegTC: - ESignet_GetRegistrationStatusNegTC_without_TransactionID: - endPoint: /v1/signup/registration/status - role: resident - restMethod: post - inputTemplate: esignet/GetRegistrationStatus/GetRegistrationStatus - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GetRegistrationStatusNegTC_with_invalid_TransactionID: - endPoint: /v1/signup/registration/status - role: resident - restMethod: post - inputTemplate: esignet/GetRegistrationStatus/GetRegistrationStatus - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "@363gssh" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GetRegistrationStatusNegTC_with_invalid_TransactionID: - endPoint: /v1/signup/registration/status - role: resident - restMethod: post - inputTemplate: esignet/GetRegistrationStatus/GetRegistrationStatus - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "@363gssh" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_GetRegistrationStatusNegTC_with_expired_TransactionID_wait: - endPoint: /v1/signup/registration/status - role: resident - restMethod: post - inputTemplate: esignet/GetRegistrationStatus/GetRegistrationStatus - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "c6HmSfLCj-GK6VfozWbJA0ox4CrMfQZ9Ln8jkBequCg" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "$IGNORE$" - } - ] -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTCResult.hbs b/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTCResult.hbs deleted file mode 100644 index ca45b742b..000000000 --- a/api-test/src/main/resources/esignet/GetRegistrationStatusNegTC/GetRegistrationStatusNegTCResult.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{ - "response": { - "status": "{{status}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetSlot/GetSlot.hbs b/api-test/src/main/resources/esignet/GetSlot/GetSlot.hbs deleted file mode 100644 index 2ab9b73a1..000000000 --- a/api-test/src/main/resources/esignet/GetSlot/GetSlot.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "idvTransactionID": "{{idvTransactionID}}", - "request": { - "verifierId": "{{verifierId}}", - "consent": "{{consent}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetSlot/GetSlot.yml b/api-test/src/main/resources/esignet/GetSlot/GetSlot.yml deleted file mode 100644 index c4163f924..000000000 --- a/api-test/src/main/resources/esignet/GetSlot/GetSlot.yml +++ /dev/null @@ -1,17 +0,0 @@ -GetSlot: - ESignet_GetSlot_STransId_uin_all_Valid_Smoke: - endPoint: /v1/signup/identity-verification/slot - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/GetSlot/GetSlot - outputTemplate: esignet/GetSlot/GetSlotResult - input: '{ - "requestTime": "$TIMESTAMP$", - "idvTransactionID": "$ID:InitiateIdVerification_STransId_AuthToken_Xsrf_uin_all_Valid_Smoke_Sid_idvTransactionID$", - "verifierId": "$ID:InitiateIdVerification_STransId_AuthToken_Xsrf_uin_all_Valid_Smoke_Sid_id$", - "consent": "AGREE" -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/GetSlot/GetSlotResult.hbs b/api-test/src/main/resources/esignet/GetSlot/GetSlotResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/GetSlot/GetSlotResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthentication.hbs b/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthentication.hbs deleted file mode 100644 index f48997ac5..000000000 --- a/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthentication.hbs +++ /dev/null @@ -1,18 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "pathFragmentCookie": "{{pathFragmentCookie}}", - "pathFragmentCookieTransactionId": "{{pathFragmentCookieTransactionId}}", - "idtToken": "{{idtToken}}", - "request": { - "transactionId": "{{transactionId}}", - "individualId": "{{individualId}}", - "challengeList" : [ - { - "authFactorType" : "{{authFactorType}}", - "challenge" : "{{challenge}}", - "format": "base64url-encoded-json" - } - ] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthentication.yml b/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthentication.yml deleted file mode 100644 index 49c78cc99..000000000 --- a/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthentication.yml +++ /dev/null @@ -1,22 +0,0 @@ -IDTAuthentication: - ESignet_IDTAuthentication_AuthToken_Xsrf_uin_all_Valid_Smoke: - endPoint: /v1/esignet/authorization/v3/authenticate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/IDTAuthentication/IDTAuthentication - outputTemplate: esignet/IDTAuthentication/IDTAuthenticationResult - input: '{ - "encodedHash": "$ID:SignupAuthorize_OAuthDetailsRequest_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "pathFragmentCookie": "$ID:PrepareSignupRedirect_AuthToken_Xsrf_STransId_uin_Otp_Valid_Smoke_sid_pathFragmentCookie$", - "pathFragmentCookieTransactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "idtToken": "$ID:PrepareSignupRedirect_AuthToken_Xsrf_STransId_uin_Otp_Valid_Smoke_sid_idToken$", - "transactionId": "$ID:SignupAuthorize_OAuthDetailsRequest_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "individualId": "$IDTINDIVIUALID$", - "authFactorType" : "IDT", - "challenge" : "$IDTCHALLENGE$" -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthenticationResult.hbs b/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthenticationResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/IDTAuthentication/IDTAuthenticationResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerification.hbs b/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerification.hbs deleted file mode 100644 index 7951f53bd..000000000 --- a/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerification.hbs +++ /dev/null @@ -1,7 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "authorizationCode": "{{authorizationCode}}", - "state": "{{state}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerification.yml b/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerification.yml deleted file mode 100644 index e58c67875..000000000 --- a/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerification.yml +++ /dev/null @@ -1,16 +0,0 @@ -InitiateIdVerification: - ESignet_InitiateIdVerification_STransId_AuthToken_Xsrf_uin_all_Valid_Smoke_Sid: - endPoint: /v1/signup/identity-verification/initiate - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/InitiateIdVerification/InitiateIdVerification - outputTemplate: esignet/InitiateIdVerification/InitiateIdVerificationResult - input: '{ - "requestTime": "$TIMESTAMP$", - "authorizationCode": "$ID:SignupAuthorizeCode_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_code$", - "state": "urlInfo1724138417665" -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerificationResult.hbs b/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerificationResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/InitiateIdVerification/InitiateIdVerificationResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword.hbs b/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword.hbs deleted file mode 100644 index 3fc4bed6a..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword.hbs +++ /dev/null @@ -1,33 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "clientId": "{{clientId}}", - "scope": "{{scope}}", - "responseType": "{{responseType}}", - "redirectUri": "{{redirectUri}}", - "display": "{{display}}", - "prompt": "{{prompt}}", - "acrValues": "{{acrValues}}", - "claims": { - "userinfo": { - "name": { - "essential": true - }, - "phone": null, - "email": { - "essential": true - }, - "picture": { - "essential": false - }, - "gender": { - "essential": false - } - }, - "id_token": {} - }, - "nonce": "{{nonce}}", - "state": "{{state}}", - "claimsLocales": "{{claimsLocales}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword.yml b/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword.yml deleted file mode 100644 index c307a7424..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword.yml +++ /dev/null @@ -1,74 +0,0 @@ -OAuthDetailsRequestPassword: - ESignet_OAuthDetailsRequest_Password_all_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/v2/oauth-details - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword - outputTemplate: esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPasswordResult - input: '{ - "requestTime": "$TIMESTAMP$", - "clientId": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "scope": "openid profile", - "responseType": "code", - "redirectUri": "$IDPREDIRECTURI$", - "display": "popup", - "prompt": "login", - "acrValues": "mosip:idp:acr:password", - "nonce": "973eieljzng", - "state": "eree2311", - "claimsLocales": "en" -}' - output: '{ - -}' - - ESignet_OAuthDetailsRequest_Password_V2_all_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/v2/oauth-details - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestV2 - outputTemplate: esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPasswordResult - input: '{ - "requestTime": "$TIMESTAMP$", - "clientId": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "scope": "openid profile", - "responseType": "code", - "redirectUri": "$IDPREDIRECTURI$", - "display": "popup", - "prompt": "login", - "acrValues": "mosip:idp:acr:password", - "nonce": "973eieljzng", - "state": "eree2311", - "claimsLocales": "en", - "codeChallenge": "$CODECHALLENGE$", - "codeChallengeMethod": "S256" -}' - output: '{ - -}' - - ESignet_OAuthDetailsRequest_Password_uin_all_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/v2/oauth-details - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPassword - outputTemplate: esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPasswordResult - input: '{ - "requestTime": "$TIMESTAMP$", - "clientId": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "scope": "openid profile", - "responseType": "code", - "redirectUri": "$IDPREDIRECTURI$", - "display": "popup", - "prompt": "login", - "acrValues": "mosip:idp:acr:password", - "nonce": "973eieljzng", - "state": "eree2311", - "claimsLocales": "en" -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPasswordResult.hbs b/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPasswordResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestPasswordResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestV2.hbs b/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestV2.hbs deleted file mode 100644 index 6dec068b5..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestPassword/OAuthDetailsRequestV2.hbs +++ /dev/null @@ -1,17 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "clientId": "{{clientId}}", - "scope": "{{scope}}", - "responseType": "{{responseType}}", - "redirectUri": "{{redirectUri}}", - "display": "{{display}}", - "prompt": "{{prompt}}", - "acrValues": "{{acrValues}}", - "nonce" : "{{nonce}}", - "state" : "{{state}}", - "claimsLocales" : "{{claimsLocales}}", - "codeChallenge" : "{{codeChallenge}}", - "codeChallengeMethod" : "{{codeChallengeMethod}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC.hbs b/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC.hbs deleted file mode 100644 index 3fc4bed6a..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC.hbs +++ /dev/null @@ -1,33 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "clientId": "{{clientId}}", - "scope": "{{scope}}", - "responseType": "{{responseType}}", - "redirectUri": "{{redirectUri}}", - "display": "{{display}}", - "prompt": "{{prompt}}", - "acrValues": "{{acrValues}}", - "claims": { - "userinfo": { - "name": { - "essential": true - }, - "phone": null, - "email": { - "essential": true - }, - "picture": { - "essential": false - }, - "gender": { - "essential": false - } - }, - "id_token": {} - }, - "nonce": "{{nonce}}", - "state": "{{state}}", - "claimsLocales": "{{claimsLocales}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC.yml b/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC.yml deleted file mode 100644 index 18d0f30aa..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC.yml +++ /dev/null @@ -1,72 +0,0 @@ -OAuthDetailsRequestPasswordNegTC: - ESignet_OAuthDetailsRequest_Password_NegTC_Scen1_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/v2/oauth-details - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC - outputTemplate: esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTCResult - input: '{ - "requestTime": "$TIMESTAMP$", - "clientId": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "scope": "openid profile", - "responseType": "code", - "redirectUri": "$IDPREDIRECTURI$", - "display": "popup", - "prompt": "login", - "acrValues": "mosip:idp:acr:password", - "nonce": "973eieljzng", - "state": "eree2311", - "claimsLocales": "en" -}' - output: '{ - -}' - - ESignet_OAuthDetailsRequest_Password_NegTC_Scen2_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/v2/oauth-details - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC - outputTemplate: esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTCResult - input: '{ - "requestTime": "$TIMESTAMP$", - "clientId": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "scope": "openid profile", - "responseType": "code", - "redirectUri": "$IDPREDIRECTURI$", - "display": "popup", - "prompt": "login", - "acrValues": "mosip:idp:acr:password", - "nonce": "973eieljzng", - "state": "eree2311", - "claimsLocales": "en" -}' - output: '{ - -}' - - ESignet_OAuthDetailsRequest_Password_NegTC_Scen3_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/v2/oauth-details - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTC - outputTemplate: esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTCResult - input: '{ - "requestTime": "$TIMESTAMP$", - "clientId": "$ID:CreateOIDCClient_all_Valid_Smoke_sid_clientId$", - "scope": "openid profile", - "responseType": "code", - "redirectUri": "$IDPREDIRECTURI$", - "display": "popup", - "prompt": "login", - "acrValues": "mosip:idp:acr:password", - "nonce": "973eieljzng", - "state": "eree2311", - "claimsLocales": "en" -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTCResult.hbs b/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTCResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestPasswordNegTC/OAuthDetailsRequestPasswordNegTCResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequest.hbs b/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequest.hbs deleted file mode 100644 index f0f908d3b..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequest.hbs +++ /dev/null @@ -1,40 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "request": { - "clientId": "{{clientId}}", - "scope": "{{scope}}", - "responseType": "{{responseType}}", - "redirectUri": "{{redirectUri}}", - "display": "{{display}}", - "prompt": "{{prompt}}", - "acrValues": "{{acrValues}}", - "claims": { - "userinfo": { - "name": { - "essential": false - }, - "phone_number": { - "essential": true - }, - "verified_claims": [ - { - "verification": { - "trust_framework": null, - "time": null - }, - "claims": { - "email": { - "essential": true - } - } - } - ] - }, - "id_token": {} - }, - "nonce" : "{{nonce}}", - "state" : "{{state}}", - "claimsLocales" : "{{claimsLocales}}", - "uiLocales" : "{{uiLocales}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequest.yml b/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequest.yml deleted file mode 100644 index 0e385e193..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequest.yml +++ /dev/null @@ -1,24 +0,0 @@ -OAuthDetailsRequestV3: - ESignet_OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/v3/oauth-details - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/OAuthDetailsRequestV3/OAuthDetailsRequest - input: '{ - "requestTime": "$TIMESTAMP$", - "clientId": "0brnxh_duaXqCa-HW4kSeljeMp0qGOmqh4tm_zFKVgY", - "scope": "openid profile", - "responseType": "code", - "redirectUri": "$IDPREDIRECTURI$", - "display": "popup", - "prompt": "login", - "acrValues": "mosip:idp:acr:generated-code", - "nonce": "973eieljzng", - "state": "urlInfo1724138417665", - "claimsLocales": "en", - "uiLocales": "en-US" -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequestResult.hbs b/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequestResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/OAuthDetailsRequestV3/OAuthDetailsRequestResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirect.hbs b/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirect.hbs deleted file mode 100644 index 042e820a0..000000000 --- a/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirect.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "request": { - "transactionId": "{{transactionId}}", - "pathFragment": "{{pathFragment}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirect.yml b/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirect.yml deleted file mode 100644 index 4c0ff8163..000000000 --- a/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirect.yml +++ /dev/null @@ -1,17 +0,0 @@ -PrepareSignupRedirect: - ESignet_PrepareSignupRedirect_AuthToken_Xsrf_STransId_uin_Otp_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirectResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path-fragment" - }' - output: '{ -}' diff --git a/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirectResult.hbs b/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirectResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/PrepareSignupRedirect/PrepareSignupRedirectResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNeg.hbs b/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNeg.hbs deleted file mode 100644 index 042e820a0..000000000 --- a/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNeg.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "request": { - "transactionId": "{{transactionId}}", - "pathFragment": "{{pathFragment}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNeg.yml b/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNeg.yml deleted file mode 100644 index 72029a98c..000000000 --- a/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNeg.yml +++ /dev/null @@ -1,402 +0,0 @@ -PrepareSignupRedirectNeg: - ESignet_PrepareSignupRedirectNeg_without_requestTime_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "invalid_request" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_empty_requestTime_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "invalid_request" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_emptyString_requestTime_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": " ", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "invalid_request" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_invalid_requestTime_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "invalidRequest", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "invalid_request" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_numeric_As_requestTime_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "12345", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "invalid_request" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_invalidTimeFormat_requestTime_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "Jun 09 2023 15:28:14", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "invalid_request" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_without_And_empty_requestObject_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "invalid_request" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_invalid_transactionId_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "1234567890", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction_ID", - "errorMessage": "invalid_transaction_ID" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_without_transactionId_parameter_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "invalid_transaction" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_unAuthenticated_transactionId_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "aTcWUCX2K4Rlx43UEm0bgkB0r0el9_2jWPclsfjebBc", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "invalid_transaction" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_alreadyAuthenticated_transactionId_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "aTcWUCX2K4Rlx43UEm0bgkB0r0el9_2jWPclsfjebRc", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "invalid_transaction" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_null_transactionId_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": null, - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "invalid_transaction" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_transactionIDReceivedOtherAPI_thatOAuthDetail_transactionId_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "bHcqVsIp11X2GBWu2PrKFePQKYYHIuo6eafYnRmHey0", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "invalid_transaction" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_expired_transactionId_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "Lb3c_7al_WOAqbbDyU4aSxxofOcEHLC9Y3qSgSCBB7M", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "invalid_transaction" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_empty_transactionId_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": " ", - "pathFragment": "path-fragment" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "invalid_transaction" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_without_pathFragment_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_path_fragment", - "errorMessage": "invalid_path_fragment" - } - ] -}' - ESignet_PrepareSignupRedirect_with_pathfragment_As_pathFragment_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirectResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "pathfragment" - }' - output: '{ -}' - ESignet_PrepareSignupRedirect_with_path_fragment_As_pathFragment_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirectResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path_fragment" - }' - output: '{ -}' - ESignet_PrepareSignupRedirect_with_path_fragment_As_pathFragment_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - validityCheckRequired: true - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirectResult - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "path fragment" - }' - output: '{ -}' - ESignet_PrepareSignupRedirectNeg_null_pathFragment_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": null - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_path_fragment", - "errorMessage": "invalid_path_fragment" - } - ] -}' - ESignet_PrepareSignupRedirectNeg_empty_pathFragment_Neg: - endPoint: /v1/esignet/authorization/prepare-signup-redirect - role: resident - restMethod: post - inputTemplate: esignet/PrepareSignupRedirect/PrepareSignupRedirect - outputTemplate: esignet/error - input: '{ - "encodedHash": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "transactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "pathFragment": "" - }' - output: '{ - "errors": [ - { - "errorCode": "invalid_path_fragment", - "errorMessage": "invalid_path_fragment" - } - ] -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNegResult.hbs b/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNegResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/PrepareSignupRedirectNeg/PrepareSignupRedirectNegResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/RegisterUser/RegisterUser.hbs b/api-test/src/main/resources/esignet/RegisterUser/RegisterUser.hbs deleted file mode 100644 index cdedce536..000000000 --- a/api-test/src/main/resources/esignet/RegisterUser/RegisterUser.hbs +++ /dev/null @@ -1,14 +0,0 @@ -{ - "verifiedTransactionID": "{{verifiedTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "username": "{{username}}", - "password": "{{password}}", - "consent": "{{consent}}", - "userInfo": { - "fullName": {{fullName}}, - "phone": "{{phone}}", - "preferredLang": "{{preferredLang}}" - } - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/RegisterUser/RegisterUser.yml b/api-test/src/main/resources/esignet/RegisterUser/RegisterUser.yml deleted file mode 100644 index d38c14b1d..000000000 --- a/api-test/src/main/resources/esignet/RegisterUser/RegisterUser.yml +++ /dev/null @@ -1,20 +0,0 @@ -RegisterUser: - ESignet_RegisterUser_SName_Valid_smoke_Pos: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/RegisterUser/RegisterUserResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallenge_STransId_smoke_Pos_VTransactionID$", - "username": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "password": "$PASSWORDTOREGISTERUSER$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "status":"PENDING" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/RegisterUser/RegisterUserResult.hbs b/api-test/src/main/resources/esignet/RegisterUser/RegisterUserResult.hbs deleted file mode 100644 index 0137f52da..000000000 --- a/api-test/src/main/resources/esignet/RegisterUser/RegisterUserResult.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{ - "response": { - "status": "{{status}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTC.hbs b/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTC.hbs deleted file mode 100644 index cdedce536..000000000 --- a/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTC.hbs +++ /dev/null @@ -1,14 +0,0 @@ -{ - "verifiedTransactionID": "{{verifiedTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "username": "{{username}}", - "password": "{{password}}", - "consent": "{{consent}}", - "userInfo": { - "fullName": {{fullName}}, - "phone": "{{phone}}", - "preferredLang": "{{preferredLang}}" - } - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTC.yml b/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTC.yml deleted file mode 100644 index caca27aa2..000000000 --- a/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTC.yml +++ /dev/null @@ -1,1764 +0,0 @@ -RegisterUserNegTC: - ESignet_RegisterUserNegTC_Missing_CSRF_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: 403 - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/RegisterUser/RegisterUserResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "status":"PENDING" -}' - ESignet_RegisterUserNegTC_without_headerTransactionID: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_invalid_headerTransactionID: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "@374tg4grh", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_empty_requestTime: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC__with_empty_string_requestTime: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": " ", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_invalid_requestTime: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "requestInvalid", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_number_as_requestTime: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "2536373738", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_invalid_requestTime_format: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "2023/11/03 11:03:29.296Z", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_without_request_Object: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_fullname,invalid_password,invalid_consent,invalid_username,invalid_phone_number,unsupported_language - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$REMOVE$", - "username": "$REMOVE$", - "password": "$REMOVE$", - "consent": "$REMOVE$", - "fullName": "$REMOVE$", - "requestTime": "$TIMESTAMP$", - "phone": "$REMOVE$", - "preferredLang": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_username: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$REMOVE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_password: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$REMOVE$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_CONSENT: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "$REMOVE$", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_consent", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_userInfo: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_username,invalid_fullname,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$REMOVE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$REMOVE$", - "requestTime": "$TIMESTAMP$", - "phone": "$REMOVE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_fullname", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_EMPTY_username: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_EMPTY_string_username: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": " ", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_different_name_username: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "b@@124and@@a", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_country_code_in_username: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "5005767672", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_spaces_in_username: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "+8550057 67672", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_spaces_in_username_and_after_plus: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "+ 8550057 67672", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_different_country_code: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "+97634567890", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_more_than_9digit_number: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "+855345678909876", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_less_then_8digit_number: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "+855345678", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_all_zero_in_phone: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "+00000000000", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_starting_zero_in_phone: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "+85500567890", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_alphanumeric_in_phone: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "+855@ddd37890", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_special_char_in_phone: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "%^%&&(^$$@&", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_username", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_only_alphabet_in_phone: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "abdgdhdjjs", - "password": "2341234", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_only_alphabet_in_phone: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_spaces_in_password: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": " ", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout__special_character_in_password: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "^%&^%&^^%^&%^%", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_more_then_20_digit_in_password: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "gjgdjjbj$^&^%&*JKHFDHJ(*9897656665gBVbvnbf", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_empty_consent: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_consent,invalid_consent - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_consent", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_empty_string_consent: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_consent,invalid_consent - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": " ", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_disagree_consent: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "DISAGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "consent_required", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_different_alpha_consent: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "HJTDE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_consent", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_ONLY_Special_char_consent: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "&^*&^%&*", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_consent", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_ONLY_number_in_consent: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "887765543", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_consent", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_alpha_numeric_in_consent: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "8877@@assf65543", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_consent", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_agree_in_consent: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "agree", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_consent", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_empty_user_info: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_fullname,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$REMOVE$", - "requestTime": "$TIMESTAMP$", - "phone": "$REMOVE$", - "preferredLang": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_fullName: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$REMOVE$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_fullname", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_phone: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$REMOVE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - - ESignet_RegisterUserNegTC_WITHout_preferredLang: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_preferredlang", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_empty_array_fullName: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$REMOVE$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_fullname", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH__phone_empty: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH__phone_empty_string: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone_number,invalid_phone - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": " ", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITH_different_phone_empty_string: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "+85587437890", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "identifier_mismatch", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_country_code: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "34567890", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_WITHout_plus_country_code: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "85534567890", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_by_different_country_code: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "+98734567890", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_phone_starts_with_zero: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_value,invalid_phone_number,invalid_value - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "+85500567890", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_phone_starts_with_zero: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "+85500567890", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_phone_with_all_zero: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "+00000000000", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_phone_with_special_char: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "^%$&^%&^%&%", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_phone_with_alpha_numeric: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_phone,invalid_phone_number - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "+5767hghjg", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_phone_number", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_empty_preferredLang: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_preferredlang", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_empty_string_preferredLang: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": " " -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_preferredlang", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_invalid_preferredLang: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "hgs" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_preferredlang", - "errorMessage": "$IGNORE$" - } - ] -}' - ESignet_RegisterUserNegTC_with_unsupported_preferredLang: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "ara" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_preferredlang", - "errorMessage": "$IGNORE$" - } - ] -}' - - ESignet_RegisterUserNegTC_Only_Language_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_fullname,invalid_value - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_value" - } - ] -}' - - ESignet_RegisterUserNegTC_Only_Value_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_fullname,invalid_value - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_language" - } - ] -}' - - ESignet_RegisterUserNegTC_Invalid_Value_On_Language_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_fullname,unsupported_language,invalid_firstname - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_language" - } - ] -}' - - ESignet_RegisterUserNegTC_Empty_Value_On_Language_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: unsupported_language,invalid_fullname,invalid_firstname - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_language" - } - ] -}' - - ESignet_RegisterUserNegTC_Empty_Value_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_value,invalid_fullname,invalid_firstname - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_value" - } - ] -}' - - ESignet_RegisterUserNegTC_Space_Value_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - allowedErrorCodes: invalid_fullname,invalid_value - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_fullname" - } - ] -}' - - ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/RegisterUser/RegisterUserResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "status":"PENDING" -}' - - ESignet_RegisterUserNegTC_Valid_smoke_2nd_time_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction", - "errorMessage": "$IGNORE$" - } - ] -}' - - ESignet_RegisterUserNegTC_with_khm_preferredLang: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/RegisterUser/RegisterUserResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_2_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_2_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_2_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "status":"PENDING" -}' - - ESignet_RegisterUserNegTC_Only_1st_Lang_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/RegisterUser/RegisterUserResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_3_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_3_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_3_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "status":"PENDING" -}' - - ESignet_RegisterUserNegTC_Only_SpecialChar_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_4_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_4_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_4_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_fullname" - } - ] -}' - - ESignet_RegisterUserNegTC_Only_Num_Value_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_5_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_5_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_5_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_fullname" - } - ] -}' - - ESignet_RegisterUserNegTC_AlphaNum_Value_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_6_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_6_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_6_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_fullname" - } - ] -}' - - ESignet_RegisterUserNegTC_Exceeding_Limit_Value_On_Name_Field_Neg: - endPoint: /v1/signup/registration/register - role: resident - restMethod: post - inputTemplate: esignet/RegisterUser/RegisterUser - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_7_VTransactionID$", - "username": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_7_PHONE$", - "password": "$PASSWORDFORAUTHENTICATION$", - "consent": "AGREE", - "fullName": "$FULLNAMETOREGISTERUSER$", - "requestTime": "$TIMESTAMP$", - "phone": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_7_PHONE$", - "preferredLang": "khm" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_fullname" - } - ] -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTCResult.hbs b/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTCResult.hbs deleted file mode 100644 index 0137f52da..000000000 --- a/api-test/src/main/resources/esignet/RegisterUserNegTC/RegisterUserNegTCResult.hbs +++ /dev/null @@ -1,5 +0,0 @@ -{ - "response": { - "status": "{{status}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/ResetPassword/ResetPassword.hbs b/api-test/src/main/resources/esignet/ResetPassword/ResetPassword.hbs deleted file mode 100644 index 3ae990137..000000000 --- a/api-test/src/main/resources/esignet/ResetPassword/ResetPassword.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "verifiedTransactionID": "{{verifiedTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "password": "{{password}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/ResetPassword/ResetPassword.yml b/api-test/src/main/resources/esignet/ResetPassword/ResetPassword.yml deleted file mode 100644 index d6d2267de..000000000 --- a/api-test/src/main/resources/esignet/ResetPassword/ResetPassword.yml +++ /dev/null @@ -1,16 +0,0 @@ -ResetPassword: - ESignet_ResetPassword_STransId_Valid_smoke_Pos: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPassword/ResetPassword - outputTemplate: esignet/ResetPassword/ResetPasswordResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPassword_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "status":"PENDING" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/ResetPassword/ResetPasswordResult.hbs b/api-test/src/main/resources/esignet/ResetPassword/ResetPasswordResult.hbs deleted file mode 100644 index 5f16f0c41..000000000 --- a/api-test/src/main/resources/esignet/ResetPassword/ResetPasswordResult.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "response": { - "status": "{{status}}" - }, - "errors": [] -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTC.hbs b/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTC.hbs deleted file mode 100644 index 3ae990137..000000000 --- a/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTC.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "verifiedTransactionID": "{{verifiedTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "password": "{{password}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTC.yml b/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTC.yml deleted file mode 100644 index dafbc318d..000000000 --- a/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTC.yml +++ /dev/null @@ -1,594 +0,0 @@ -ResetPasswordNegTC: - ESignet_ResetPasswordNegTC_Empty_VTransactionId_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_ResetPasswordNegTC_SpaceVal_VTransactionId_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": " ", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_ResetPasswordNegTC_Invalid_VTransactionId_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "adsgadg", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_ResetPasswordNegTC_Expired_VTransactionId_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "7jav8tmW_gxQY-aLrWy01E6LLpkQ14jlBaB63K-wIc4", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_ResetPasswordNegTC_Missing_VTransactionId_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$REMOVE$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ] -}' - - ESignet_ResetPasswordNegTC_Missing_ReqTime_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_ResetPasswordNegTC_Empty_ReqTime_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_ResetPasswordNegTC_SpaceVal_ReqTime_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": " " -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_ResetPasswordNegTC_InvalidVal_ReqTime_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "requestinvalid" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_ResetPasswordNegTC_Invalid_Num_ReqTime_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "762537232" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_ResetPasswordNegTC_Invalid_Format_ReqTime_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "2023/11/03 11:03:29.296Z" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_ResetPasswordNegTC_Empty_ReqObj_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - allowedErrorCodes: invalid_password,invalid_identifier,invalid_request - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$REMOVE$", - "password": "$REMOVE$", - "requestTime": "$REMOVE$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ] -}' - - ESignet_ResetPasswordNegTC_Missing_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$REMOVE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_Empty_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_SpaceVal_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": " ", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_Invalid_SpecChar_Num_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "+85556$%8924", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_With_AlphaNum_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "+85556sig8924", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_All_Zero_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "+00000000000", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_Missing_CountryCode_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "56768924", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_With_Space_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "+8555 6898924", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_LessThan_Limit_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "+855455", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_Exceeding_Limit_Identifier_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "+855556665643247654637863451123123265651223126548687832131356786783676898924", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ] -}' - - ESignet_ResetPasswordNegTC_Missing_Password_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$REMOVE$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password" - } - ] -}' - - ESignet_ResetPasswordNegTC_Empty_Password_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password" - } - ] -}' - - ESignet_ResetPasswordNegTC_SpaceVal_Password_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": " ", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password" - } - ] -}' - - ESignet_ResetPasswordNegTC_Invalid_Password_Matching_Policy_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "gfhdfh", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password" - } - ] -}' - - ESignet_ResetPasswordNegTC_Less_Than_Min_Char_Password_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "aA_2", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password" - } - ] -}' - - ESignet_ResetPasswordNegTC_Exceeding_Limit_Password_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa_12341234_Aa", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_password" - } - ] -}' - - ESignet_ResetPasswordNegTC_Missing_CSRF_Neg: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - allowedErrorCodes: 403 - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - -}' - - ESignet_ResetPasswordNegTC_Valid_smoke_Pos: - endPoint: /v1/signup/reset-password - role: resident - restMethod: post - inputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTC - outputTemplate: esignet/ResetPasswordNegTC/ResetPasswordNegTCResult - input: '{ - "verifiedTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_VTransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "password": "$PASSWORDTORESET$", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "status":"PENDING" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTCResult.hbs b/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTCResult.hbs deleted file mode 100644 index 5f16f0c41..000000000 --- a/api-test/src/main/resources/esignet/ResetPasswordNegTC/ResetPasswordNegTCResult.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "response": { - "status": "{{status}}" - }, - "errors": [] -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettings.hbs b/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettings.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettings.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettings.yml b/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettings.yml deleted file mode 100644 index a9a21389b..000000000 --- a/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettings.yml +++ /dev/null @@ -1,12 +0,0 @@ -SignUpSettings: - ESignet_SignUpSettings_Valid_smoke_Pos: - endPoint: /v1/signup/settings - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/SignUpSettings/SignUpSettings - outputTemplate: esignet/SignUpSettings/SignUpSettingsResult - input: '{ -}' - output: '{ -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettingsResult.hbs b/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettingsResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/SignUpSettings/SignUpSettingsResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorize.hbs b/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorize.hbs deleted file mode 100644 index 95c858e2b..000000000 --- a/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorize.hbs +++ /dev/null @@ -1,15 +0,0 @@ -{ - "requestTime": "{{requestTime}}", - "pathFragmentCookieTransactionId": "{{pathFragmentCookieTransactionId}}", - "pathFragmentCookie": "{{pathFragmentCookie}}", - "request": { - "clientId": "{{clientId}}", - "scope": "{{scope}}", - "responseType": "{{responseType}}", - "redirectUri": "{{redirectUri}}", - "acrValues": "{{acrValues}}", - "state" : "{{state}}", - "uiLocales" : "{{uiLocales}}", - "idTokenHint" : "{{idTokenHint}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorize.yml b/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorize.yml deleted file mode 100644 index cfe033da3..000000000 --- a/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorize.yml +++ /dev/null @@ -1,24 +0,0 @@ -SignupAuthorize: - ESignet_SignupAuthorize_OAuthDetailsRequest_AuthToken_Xsrf_uin_all_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/v3/oauth-details - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/SignupAuthorize/SignupAuthorize - outputTemplate: esignet/SignupAuthorize/SignupAuthorizeResult - input: '{ - "pathFragmentCookie": "$ID:PrepareSignupRedirect_AuthToken_Xsrf_STransId_uin_Otp_Valid_Smoke_sid_pathFragmentCookie$", - "pathFragmentCookieTransactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "requestTime": "$TIMESTAMP$", - "clientId": "mosip-signup-oauth-client", - "scope": "openid", - "responseType": "code", - "redirectUri": "$SIGNUPREDIRECTURI$", - "acrValues": "mosip:idp:acr:id-token", - "state": "urlInfo1724138417665", - "uiLocales": "en", - "idTokenHint": "$ID:PrepareSignupRedirect_AuthToken_Xsrf_STransId_uin_Otp_Valid_Smoke_sid_idToken$" -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorizeResult.hbs b/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorizeResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/SignupAuthorize/SignupAuthorizeResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCode.hbs b/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCode.hbs deleted file mode 100644 index e3704b3ec..000000000 --- a/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCode.hbs +++ /dev/null @@ -1,16 +0,0 @@ -{ - "encodedHash": "{{encodedHash}}", - "requestTime": "{{requestTime}}", - "pathFragmentCookie": "{{pathFragmentCookie}}", - "pathFragmentCookieTransactionId": "{{pathFragmentCookieTransactionId}}", - "request": { - "transactionId": "{{transactionId}}", - "permittedAuthorizeScopes": [], - "acceptedClaims" : [ - {{#each acceptedClaims}} - "{{channel}}" - {{#unless @last}},{{/unless}} - {{/each}} - ] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCode.yml b/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCode.yml deleted file mode 100644 index 753091913..000000000 --- a/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCode.yml +++ /dev/null @@ -1,19 +0,0 @@ -SignupAuthorizeCode: - ESignet_SignupAuthorizeCode_AuthToken_Xsrf_uin_all_Valid_Smoke_sid: - endPoint: /v1/esignet/authorization/auth-code - role: resident - restMethod: post - checkErrorsOnlyInResponse: true - inputTemplate: esignet/SignupAuthorizeCode/SignupAuthorizeCode - outputTemplate: esignet/SignupAuthorizeCode/SignupAuthorizeCodeResult - input: '{ - "encodedHash": "$ID:SignupAuthorize_OAuthDetailsRequest_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_encodedResp$", - "requestTime": "$TIMESTAMP$", - "pathFragmentCookie": "$ID:PrepareSignupRedirect_AuthToken_Xsrf_STransId_uin_Otp_Valid_Smoke_sid_pathFragmentCookie$", - "pathFragmentCookieTransactionId": "$ID:OAuthDetailsRequest_V3_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "transactionId": "$ID:SignupAuthorize_OAuthDetailsRequest_AuthToken_Xsrf_uin_all_Valid_Smoke_sid_transactionId$", - "acceptedClaims": [{channel: "email"},{channel: "phone_number"}] -}' - output: '{ - -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCodeResult.hbs b/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCodeResult.hbs deleted file mode 100644 index 9e26dfeeb..000000000 --- a/api-test/src/main/resources/esignet/SignupAuthorizeCode/SignupAuthorizeCodeResult.hbs +++ /dev/null @@ -1 +0,0 @@ -{} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallenge.hbs b/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallenge.hbs deleted file mode 100644 index b7c099405..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallenge.hbs +++ /dev/null @@ -1,12 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "challengeInfo": [{ - "challenge": "{{challenge}}", - "format": "{{format}}", - "type": "{{type}}" - }] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallenge.yml b/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallenge.yml deleted file mode 100644 index 6c59d5cd9..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallenge.yml +++ /dev/null @@ -1,18 +0,0 @@ -VerifyChallenge: - ESignet_VerifyChallenge_STransId_smoke_Pos: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallenge/VerifyChallenge - outputTemplate: esignet/VerifyChallenge/VerifyChallengeResult - input: '{ - "headerTransactionID": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_TransactionID$", - "identifier": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "status":"SUCCESS" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallengeResult.hbs b/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallengeResult.hbs deleted file mode 100644 index 5f16f0c41..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallenge/VerifyChallengeResult.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "response": { - "status": "{{status}}" - }, - "errors": [] -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword.hbs b/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword.hbs deleted file mode 100644 index b5fc96777..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "challengeInfo": [ - { - "challenge": "{{challenge}}", - "format": "{{format}}", - "type": "{{type}}" - }, - { - "challenge": "{{challenge2}}", - "format": "{{format2}}", - "type": "{{type2}}" - } - ] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword.yml b/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword.yml deleted file mode 100644 index 623a15a1a..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword.yml +++ /dev/null @@ -1,21 +0,0 @@ -VerifyChallengeForResetPassword: - ESignet_VerifyChallengeForResetPassword_STransId_smoke_Pos: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPassword - outputTemplate: esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPasswordResult - input: '{ - "headerTransactionID": "$ID:GenerateChallengeForResetPassword_STransId_Valid_smoke_Pos_TransactionID$", - "identifier": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUser_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "base64url-encoded-json", - "type2": "KBI", - "requestTime": "$TIMESTAMP$" -}' - output: '{ - "status":"SUCCESS" -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPasswordResult.hbs b/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPasswordResult.hbs deleted file mode 100644 index 5f16f0c41..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeForResetPassword/VerifyChallengeForResetPasswordResult.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "response": { - "status": "{{status}}" - }, - "errors": [] -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC.hbs b/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC.hbs deleted file mode 100644 index b5fc96777..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC.hbs +++ /dev/null @@ -1,19 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "challengeInfo": [ - { - "challenge": "{{challenge}}", - "format": "{{format}}", - "type": "{{type}}" - }, - { - "challenge": "{{challenge2}}", - "format": "{{format2}}", - "type": "{{type2}}" - } - ] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC.yml b/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC.yml deleted file mode 100644 index 933da27fd..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC.yml +++ /dev/null @@ -1,625 +0,0 @@ -VerifyChallengeForResetPasswordNegTC: - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Missing_Type2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Missing_Type2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "base64url-encoded-json", - "type2": "$REMOVE$", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_type" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Empty_Type2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Empty_Type2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "base64url-encoded-json", - "type2": "", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_type" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_SpaceVal_Type2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_SpaceVal_Type2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "base64url-encoded-json", - "type2": " ", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_type" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Invalid_Type2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Invalid_Type2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "base64url-encoded-json", - "type2": "fghf", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_type" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Null_Type2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Null_Type2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "base64url-encoded-json", - "type2": "null", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_type" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Null_Format2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Null_Format2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "null", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Empty_Format2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Empty_Format2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_SpaceVal_Format2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_SpaceVal_Format2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": " ", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Invalid_Format2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Invalid_Format2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "dssdgdf", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Missing_Format2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Missing_Format2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "$REMOVE$", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Empty_Challenge2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Empty_Challenge2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "", - "format2": "base64url-encoded-json", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Missing_Challenge2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Missing_Challenge2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "$REMOVE$", - "format2": "base64url-encoded-json", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Invalid_Challenge2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Invalid_Challenge2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "sdfsdz", - "format2": "base64url-encoded-json", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_KBI_challenge" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_SpaceVal_Challenge2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_SpaceVal_Challenge2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": " ", - "format2": "base64url-encoded-json", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Null_Challenge2_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Null_Challenge2_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "null", - "format2": "base64url-encoded-json", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_KBI_challenge" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_Purpose_As_Registration_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_Purpose_As_Registration_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "base64url-encoded-json", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "identifier_already_registered" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' - - ESignet_VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTC - outputTemplate: esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTCResult - input: '{ - "headerTransactionID": "$ID:VerifyChallengeForResetPasswordNegTC_STransId_smoke_Pos_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "challenge2": "ESignet_RegisterUserNegTC_SName_Valid_smoke_Pos_$REGISTEREDUSERFULLNAME$", - "format2": "base64url-encoded-json", - "type2": "KBI", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "RESET_PASSWORD", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTC", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "status":"SUCCESS", - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallengeForResetPasswordNegTC/GenerateChallengeForResetPasswordNegTCResult" - } -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTCResult.hbs b/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTCResult.hbs deleted file mode 100644 index 5f16f0c41..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeForResetPasswordNegTC/VerifyChallengeForResetPasswordNegTCResult.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "response": { - "status": "{{status}}" - }, - "errors": [] -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTC.hbs b/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTC.hbs deleted file mode 100644 index b7c099405..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTC.hbs +++ /dev/null @@ -1,12 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "challengeInfo": [{ - "challenge": "{{challenge}}", - "format": "{{format}}", - "type": "{{type}}" - }] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTC.yml b/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTC.yml deleted file mode 100644 index 81cffef49..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTC.yml +++ /dev/null @@ -1,1531 +0,0 @@ -VerifyChallengeNegTC: - ESignet_VerifyChallengeNegTC_STransId_Missing_CSRF_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - allowedErrorCodes: 403 - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Missing_CSRF_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Missing_CSRF_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Invalid_TransactionId_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "kjsndfjksd", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Invalid_TransactionId_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Missing_TransactionId_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - allowedErrorCodes: 400 - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$REMOVE$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Missing_TransactionId_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Expired_TransactionId_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "38JYeQCqEldh28iZTT2tjuM6HK3qzr-KQzP8G25w5n0", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Expired_TransactionId_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_transaction" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_DiffUser_TransactionId_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Missing_CSRF_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_DiffUser_TransactionId_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "identifier_mismatch" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Empty_RequestTime_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Empty_RequestTime_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Empty_RequestTime_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_SpaceVal_RequestTime_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_SpaceVal_RequestTime_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_SpaceVal_RequestTime_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": " ", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Invalid_RequestTime_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Invalid_RequestTime_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Invalid_RequestTime_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "requestinvalid", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Invalid_Num_RequestTime_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Invalid_Num_RequestTime_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Invalid_Num_RequestTime_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "762537232", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Invalid_Format_RequestTime_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Invalid_Format_RequestTime_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Invalid_Format_RequestTime_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "2023/11/03 11:03:29.296Z", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Empty_Request_Body_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_identifier,invalid_challenge_info - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyReq - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Empty_Request_Body_Neg_TransactionID$", - "identifier": "$REMOVE$", - "challenge": "$REMOVE$", - "format": "$REMOVE$", - "type": "$REMOVE$", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Missing_ReqBody_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOReqBody - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Missing_ReqBody_Neg_TransactionID$", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_request" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Missing_Identifier_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Missing_Identifier_Neg_TransactionID$", - "identifier": "$REMOVE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Missing_ChallengeInfo_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOChallengeInfo - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Missing_ChallengeInfo_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Missing_ChallengeInfo_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_info" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Empty_Identifier_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Empty_Identifier_Neg_TransactionID$", - "identifier": "", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_SpaceVal_Identifier_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_SpaceVal_Identifier_Neg_TransactionID$", - "identifier": " ", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_SpecialChar_Identifier_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_SpecialChar_Identifier_Neg_TransactionID$", - "identifier": "+85556$%8924", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Alphabet_Identifier_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Alphabet_Identifier_Neg_TransactionID$", - "identifier": "+85556sig8924", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_AllZero_Identifier_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_AllZero_Identifier_Neg_TransactionID$", - "identifier": "+00000000000", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_identifier" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_DiffUser_Identifier_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_DiffUser_Identifier_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Missing_CSRF_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "identifier_mismatch" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Registered_User_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Registered_User_Neg_TransactionID$", - "identifier": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$ID:GenerateChallenge_STransId_Valid_smoke_Pos_PHONE$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "identifier_already_registered" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Empty_ChallengeInfo_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - allowedErrorCodes: invalid_challenge,invalid_challenge_format - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyChallengeInfo - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Empty_ChallengeInfo_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Empty_ChallengeInfo_Neg_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_info" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Missing_Format_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Missing_Format_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Missing_Format_Neg_PHONE$", - "challenge": "111111", - "format": "$REMOVE$", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Missing_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Missing_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Missing_Challenge_Neg_PHONE$", - "challenge": "$REMOVE$", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Empty_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Empty_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Empty_Challenge_Neg_PHONE$", - "challenge": "", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_SpaceVal_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_SpaceVal_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_SpaceVal_Challenge_Neg_PHONE$", - "challenge": " ", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_ExtraDigit_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_ExtraDigit_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_ExtraDigit_Challenge_Neg_PHONE$", - "challenge": "11111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "challenge_failed" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_LessDigit_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_LessDigit_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_LessDigit_Challenge_Neg_PHONE$", - "challenge": "11111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "challenge_failed" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Invalid_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Invalid_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Invalid_Challenge_Neg_PHONE$", - "challenge": "682643", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "challenge_failed" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Alphabet_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Alphabet_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Alphabet_Challenge_Neg_PHONE$", - "challenge": "ggfhas", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "challenge_failed" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_AlphaNum_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_AlphaNum_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_AlphaNum_Challenge_Neg_PHONE$", - "challenge": "682ghy", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "challenge_failed" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_SpecialChar_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_SpecialChar_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_SpecialChar_Challenge_Neg_PHONE$", - "challenge": "#$%#%^", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "challenge_failed" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Diff_Challenge_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Diff_Challenge_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Diff_Challenge_Neg_PHONE$", - "challenge": "000000", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "challenge_failed" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Empty_Format_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Empty_Format_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Empty_Format_Neg_PHONE$", - "challenge": "111111", - "format": "", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_SpaceVal_Format_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_SpaceVal_Format_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_SpaceVal_Format_Neg_PHONE$", - "challenge": "111111", - "format": " ", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Invalid_Format_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Invalid_Format_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Invalid_Format_Neg_PHONE$", - "challenge": "111111", - "format": "ghah haag", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Numeric_Format_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Numeric_Format_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Numeric_Format_Neg_PHONE$", - "challenge": "111111", - "format": "numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_RandomVal_Format_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_RandomVal_Format_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_RandomVal_Format_Neg_PHONE$", - "challenge": "111111", - "format": "ahja1897", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_SpecialChar_Format_Neg: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/error - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_SpecialChar_Format_Neg_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_SpecialChar_Format_Neg_PHONE$", - "challenge": "111111", - "format": "^^&*&^&", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "errors": [ - { - "errorCode": "invalid_challenge_format" - } - ], - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_Valid_Smoke_Pos: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_Valid_Smoke_Pos_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "status":"SUCCESS", - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_For_Pos_Sce_2: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_2_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_2_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "status":"SUCCESS", - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_For_Pos_Sce_3: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_3_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_3_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "status":"SUCCESS", - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_For_Pos_Sce_4: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_4_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_4_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "status":"SUCCESS", - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_For_Pos_Sce_5: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_5_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_5_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "status":"SUCCESS", - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_For_Pos_Sce_6: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_6_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_6_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "status":"SUCCESS", - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' - - ESignet_VerifyChallengeNegTC_STransId_For_Pos_Sce_7: - endPoint: /v1/signup/registration/verify-challenge - role: resident - restMethod: post - inputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTC - outputTemplate: esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult - input: '{ - "headerTransactionID": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_7_TransactionID$", - "identifier": "$ID:VerifyChallengeNegTC_STransId_For_Pos_Sce_7_PHONE$", - "challenge": "111111", - "format": "alpha-numeric", - "type": "OTP", - "requestTime": "$TIMESTAMP$", - "sendOtp":{ - "identifier": "$PHONENUMBERFROMREGEXFORSIGNUP$", - "captchaToken": "", - "purpose": "REGISTRATION", - "requestTime": "$TIMESTAMP$", - "sendOtpReqTemplate": "esignet/GenerateChallenge/GenerateChallenge", - "sendOtpEndPoint": "/v1/signup/registration/generate-challenge" - } -}' - output: '{ - "status":"SUCCESS", - "sendOtpResp":{ - "status":"SUCCESS", - "sendOtpResTemplate":"esignet/GenerateChallenge/GenerateChallengeResult" - } -}' \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyChallengeInfo.hbs b/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyChallengeInfo.hbs deleted file mode 100644 index 3756047ac..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyChallengeInfo.hbs +++ /dev/null @@ -1,8 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}", - "challengeInfo": [] - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyReq.hbs b/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyReq.hbs deleted file mode 100644 index e2f0b37ec..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCEmptyReq.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult.hbs b/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult.hbs deleted file mode 100644 index 5f16f0c41..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCResult.hbs +++ /dev/null @@ -1,6 +0,0 @@ -{ - "response": { - "status": "{{status}}" - }, - "errors": [] -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOChallengeInfo.hbs b/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOChallengeInfo.hbs deleted file mode 100644 index 010ef9bc1..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOChallengeInfo.hbs +++ /dev/null @@ -1,7 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}", - "request": { - "identifier": "{{identifier}}" - } -} \ No newline at end of file diff --git a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOReqBody.hbs b/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOReqBody.hbs deleted file mode 100644 index f36a9d501..000000000 --- a/api-test/src/main/resources/esignet/VerifyChallengeNegTC/VerifyChallengeNegTCWOReqBody.hbs +++ /dev/null @@ -1,4 +0,0 @@ -{ - "headerTransactionID": "{{headerTransactionID}}", - "requestTime": "{{requestTime}}" -} \ No newline at end of file diff --git a/api-test/testNgXmlFiles/esignetPrerequisiteSuite.xml b/api-test/testNgXmlFiles/esignetPrerequisiteSuite.xml new file mode 100644 index 000000000..be3a7d4b3 --- /dev/null +++ b/api-test/testNgXmlFiles/esignetPrerequisiteSuite.xml @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/api-test/testNgXmlFiles/esignetSuite.xml b/api-test/testNgXmlFiles/esignetSuite.xml index 0d6a5b0b7..7c357e9f2 100644 --- a/api-test/testNgXmlFiles/esignetSuite.xml +++ b/api-test/testNgXmlFiles/esignetSuite.xml @@ -8,324 +8,26 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + - + - + @@ -333,7 +35,7 @@ value="esignet/LinkedConsent/OAuthDetailsRequestLinkedConsent/OAuthDetailsRequestLinkedConsent.yml" /> - + @@ -341,7 +43,7 @@ value="esignet/LinkedConsent/GenerateLinkCodeConsent/GenerateLinkCodeConsent.yml" /> - + @@ -349,14 +51,14 @@ value="esignet/LinkedConsent/LinkTransactionConsent/LinkTransactionConsent.yml" /> - + - + @@ -364,14 +66,14 @@ value="esignet/LinkedConsent/LinkedAuthenticationConsentWla/LinkedAuthenticationConsentWla.yml" /> - + - + @@ -379,7 +81,7 @@ value="esignet/LinkedConsent/LinkAuthorizationCodeConsent/LinkAuthorizationCodeConsent.yml" /> - + @@ -387,14 +89,14 @@ value="esignet/LinkedConsent/GenerateTokenLinkedConsent/GenerateTokenLinkedConsent.yml" /> - + - + @@ -402,7 +104,7 @@ value="esignet/OAuthDetailsRequestLinked/OAuthDetailsRequest.yml" /> - + @@ -410,7 +112,7 @@ value="esignet/GenerateLinkCode/GenerateLinkCode.yml" /> - + @@ -418,14 +120,14 @@ value="esignet/LinkTransaction/LinkTransaction.yml" /> - + - + @@ -433,14 +135,14 @@ value="esignet/LinkedAuthenticationWla/LinkedAuthenticationWla.yml" /> - + - + @@ -448,7 +150,7 @@ value="esignet/LinkAuthorizationCode/LinkAuthorizationCode.yml" /> - + @@ -456,14 +158,14 @@ value="esignet/GenerateTokenLinked/GenerateTokenLinked.yml" /> - + - + @@ -471,21 +173,21 @@ value="esignet/OAuthDetailsRequest/OAuthDetailsRequestNonAuth.yml" /> - + - + - + @@ -493,14 +195,14 @@ value="esignet/Consent/OAuthDetailsRequestConsent/OAuthDetailsRequestConsent.yml" /> - + - + @@ -508,7 +210,7 @@ value="esignet/Consent/AuthorizationCodeConsent/AuthorizationCodeConsent.yml" /> - + @@ -516,14 +218,14 @@ value="esignet/Consent/GenerateTokenConsent/GenerateTokenConsent.yml" /> - + - + @@ -531,28 +233,28 @@ value="esignet/OAuthDetailsRequest/OAuthDetailsRequest.yml" /> - + - + - + - + @@ -560,7 +262,7 @@ value="esignet/AuthorizationCode/AuthorizationCode.yml" /> - + @@ -568,14 +270,14 @@ value="esignet/GenerateToken/GenerateToken.yml" /> - + - + @@ -583,14 +285,14 @@ value="esignet/VCI/OAuthDetailsRequestVCI/OAuthDetailsRequestVCI.yml" /> - + - + @@ -598,7 +300,7 @@ value="esignet/VCI/AuthorizationCodeVCI/AuthorizationCodeVCI.yml" /> - + @@ -606,14 +308,14 @@ value="esignet/VCI/GenerateTokenVCI/GenerateTokenVCI.yml" /> - + - + @@ -621,14 +323,14 @@ value="esignet/VCIVid/OAuthDetailsRequestVCI/OAuthDetailsRequestVCI.yml" /> - + - + @@ -636,7 +338,7 @@ value="esignet/VCIVid/AuthorizationCodeVCI/AuthorizationCodeVCI.yml" /> - + @@ -644,14 +346,14 @@ value="esignet/VCIVid/GenerateTokenVCI/GenerateTokenVCI.yml" /> - + - + @@ -659,14 +361,14 @@ value="esignet/VCINegTC/OAuthDetailsRequestVCI/OAuthDetailsRequestVCI.yml" /> - + - + @@ -674,7 +376,7 @@ value="esignet/VCINegTC/AuthorizationCodeVCI/AuthorizationCodeVCI.yml" /> - + @@ -682,14 +384,14 @@ value="esignet/VCINegTC/GenerateTokenVCI/GenerateTokenVCI.yml" /> - + - + @@ -697,14 +399,14 @@ value="esignet/VCIVidNegTC/OAuthDetailsRequestVCI/OAuthDetailsRequestVCI.yml" /> - + - + @@ -712,7 +414,7 @@ value="esignet/VCIVidNegTC/AuthorizationCodeVCI/AuthorizationCodeVCI.yml" /> - + @@ -720,74 +422,21 @@ value="esignet/VCIVidNegTC/GenerateTokenVCI/GenerateTokenVCI.yml" /> - + - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + @@ -795,7 +444,7 @@ value="esignet/CreateOIDCClient/CreateOIDCClient.yml" /> - + @@ -803,7 +452,7 @@ value="esignet/UpdateOIDCClient/UpdateOIDCClient.yml" /> - + @@ -811,7 +460,7 @@ value="esignet/CreateOIDCClientV2/CreateOIDCClient.yml" /> - + @@ -819,7 +468,7 @@ value="esignet/UpdateOIDCClientV2/UpdateOIDCClient.yml" /> - + @@ -827,7 +476,7 @@ value="esignet/OAuthDetailsRequestV2/OAuthDetailsRequest.yml" /> - + @@ -836,7 +485,7 @@ - + @@ -844,7 +493,7 @@ value="esignet/SunBirdR/GetPolicySunBirdR/GetPolicySunBirdR.yml" /> - + @@ -852,7 +501,7 @@ value="esignet/SunBirdR/SearchPolicySunBirdR/SearchPolicySunBirdR.yml" /> - + @@ -860,7 +509,7 @@ value="esignet/SunBirdC/CreateOIDCClientV2SunBirdC/CreateOIDCClientV2SunBirdC.yml" /> - + @@ -868,14 +517,14 @@ value="esignet/SunBirdC/OAuthDetailsRequestSunBirdC/OAuthDetailsRequestSunBirdC.yml" /> - + - + @@ -883,7 +532,7 @@ value="esignet/SunBirdC/AuthorizationCodeSunBirdC/AuthorizationCodeSunBirdC.yml" /> - + @@ -891,14 +540,14 @@ value="esignet/SunBirdC/GenerateTokenSunBirdC/GenerateTokenSunBirdC.yml" /> - + - + @@ -906,14 +555,14 @@ value="esignet/SunBirdCNegTC/OAuthDetailsRequestSunBirdCNegTC/OAuthDetailsRequestSunBirdCNegTC.yml" /> - + - + @@ -921,7 +570,7 @@ value="esignet/SunBirdCNegTC/AuthorizationCodeSunBirdCNegTC/AuthorizationCodeSunBirdCNegTC.yml" /> - + @@ -929,14 +578,14 @@ value="esignet/SunBirdCNegTC/GenerateTokenSunBirdCNegTC/GenerateTokenSunBirdCNegTC.yml" /> - + - + @@ -945,7 +594,7 @@ - + @@ -954,142 +603,56 @@ - + - + - + - + - + - + - + - + --> - - - - \ No newline at end of file From ce928f19cf90405ef3775d3cbae526c19a184aad Mon Sep 17 00:00:00 2001 From: Nandhukumar Date: Mon, 11 Nov 2024 15:12:36 +0530 Subject: [PATCH 28/80] MOSIP-37214 Signed-off-by: Nandhukumar --- api-test/pom.xml | 2 +- .../esignet/testrunner/MosipTestRunner.java | 53 +++++++--- .../apirig/esignet/utils/EsignetUtil.java | 99 ++++++++++++++++++- 3 files changed, 137 insertions(+), 17 deletions(-) diff --git a/api-test/pom.xml b/api-test/pom.xml index da2835dfe..bb0744d6b 100644 --- a/api-test/pom.xml +++ b/api-test/pom.xml @@ -163,7 +163,7 @@ - io.mosip.testrig.apirig.testrunner.MosipTestRunner + io.mosip.testrig.apirig.esignet.testrunner.MosipTestRunner