From 7834dfe99a5ab2637321c5d644c50b69dcc70b85 Mon Sep 17 00:00:00 2001
From: Hamza HRAMCHI <hamza.hramchi@xelians.fr>
Date: Tue, 14 Feb 2023 11:37:12 +0100
Subject: [PATCH] FIX #20284 TIME 0:20 set subscriber id

---
 .../controllers/ExternalSignatoryBookController.php    | 10 +++++-----
 src/app/workflow/controllers/FastOTPController.php     |  7 +++----
 src/frontend/app/administration/otp/otp.component.html |  9 +++++++--
 src/frontend/app/administration/otp/otp.component.ts   |  4 ++++
 4 files changed, 19 insertions(+), 11 deletions(-)

diff --git a/src/app/externalSignatoryBook/controllers/ExternalSignatoryBookController.php b/src/app/externalSignatoryBook/controllers/ExternalSignatoryBookController.php
index c3e232fda2..d24974e3de 100755
--- a/src/app/externalSignatoryBook/controllers/ExternalSignatoryBookController.php
+++ b/src/app/externalSignatoryBook/controllers/ExternalSignatoryBookController.php
@@ -69,7 +69,7 @@ class ExternalSignatoryBookController
 
             } elseif ($connector['type'] == 'fast') {
                 $connector['apiUri'] = $connectionData['apiUri'];
-                $connector['apiKey'] = $connectionData['apiKey'];
+                $connector['subscriberId'] = $connectionData['subscriberId'];
                 $connector['certPath'] = $connectionData['certPath'];
                 $connector['certPass'] = AuthenticationModel::decrypt(['cryptedPassword' => $connectionData['certPass']]);
                 $connector['certType'] = $connectionData['certType'];
@@ -100,7 +100,7 @@ class ExternalSignatoryBookController
         } elseif ($body['type'] == 'fast') {
             $connectionData = [
                 'apiUri' => $body['apiUri'],
-                'apiKey' => $body['apiKey'],
+                'subscriberId' => $body['subscriberId'],
                 'certPath' => $body['certPath'],
                 'certPass' => AuthenticationModel::encrypt(['password' => $body['certPass']]),
                 'certType' => $body['certType']
@@ -149,7 +149,7 @@ class ExternalSignatoryBookController
         } elseif ($body['type'] == 'fast') {
             $connectionData = [
                 'apiUri' => $body['apiUri'],
-                'apiKey' => $body['apiKey'],
+                'subscriberId' => $body['subscriberId'],
                 'certPath' => $body['certPath'],
                 'certPass' => AuthenticationModel::encrypt(['password' => $body['certPass']]),
                 'certType' => $body['certType']
@@ -201,8 +201,8 @@ class ExternalSignatoryBookController
         }        
 
         if ($args['body']['type'] == 'fast') {
-            if (!Validator::stringType()->notEmpty()->validate($args['body']['apiKey'])) {
-                return ['errors' => "Body 'apiKey' is empty or not a string"];
+            if (!Validator::stringType()->notEmpty()->validate($args['body']['subscriberId'])) {
+                return ['errors' => "Body 'subscriberId' is empty or not a string"];
             } elseif (!Validator::stringType()->notEmpty()->validate($args['body']['apiUri'])) {
                 return ['errors' => "Body 'apiUri' is empty or not a string"];
             } elseif (!Validator::stringType()->notEmpty()->validate($args['body']['certPath'])) {
diff --git a/src/app/workflow/controllers/FastOTPController.php b/src/app/workflow/controllers/FastOTPController.php
index a449933e73..793b12aacf 100644
--- a/src/app/workflow/controllers/FastOTPController.php
+++ b/src/app/workflow/controllers/FastOTPController.php
@@ -318,8 +318,8 @@ class FastOTPController
     {
         if (!Validator::arrayType()->notEmpty()->validate($args['connection_data'])) {
             return ['errors' => "External signatory book configuration 'connection_data' is empty or not a array"];
-        } elseif (!Validator::stringType()->notEmpty()->validate($args['connection_data']['apiKey'])) {
-            return ['errors' => "External signatory book configuration 'apiKey' is empty or not a string"];
+        } elseif (!Validator::stringType()->notEmpty()->validate($args['connection_data']['subscriberId'])) {
+            return ['errors' => "External signatory book configuration 'subscriberId' is empty or not a string"];
         } elseif (!Validator::stringType()->notEmpty()->validate($args['connection_data']['apiUri'])) {
             return ['errors' => "External signatory book configuration 'apiUri' is empty or not a string"];
         } elseif (!Validator::stringType()->notEmpty()->validate($args['connection_data']['certPath'])) {
@@ -355,10 +355,9 @@ class FastOTPController
     {
         ValidatorModel::notEmpty($args, ['connection_data', 'multipartBody']);
         ValidatorModel::arrayType($args, ['connection_data', 'multipartBody']);
-
         $curlReturn = CurlModel::exec([
             'method'    => 'POST',
-            'url'       => $args['connection_data']['apiUri'] . "/documents/v2/otp/{$args['connection_data']['apiKey']}/signature-otp/upload",
+            'url'       => $args['connection_data']['apiUri'] . "/documents/v2/otp/{$args['connection_data']['subscriberId']}/signature-otp/upload",
             'options'   => [
                 CURLOPT_SSLCERT         => $args['connection_data']['certPath'],
                 CURLOPT_SSLCERTPASSWD   => AuthenticationModel::decrypt(['cryptedPassword' => $args['connection_data']['certPass']]),
diff --git a/src/frontend/app/administration/otp/otp.component.html b/src/frontend/app/administration/otp/otp.component.html
index a6fcd858c1..1355aafe80 100644
--- a/src/frontend/app/administration/otp/otp.component.html
+++ b/src/frontend/app/administration/otp/otp.component.html
@@ -36,12 +36,17 @@
             <ion-input name="apiUri" [maxlength]="128" [(ngModel)]="connector.apiUri" required>
             </ion-input>
         </ion-item>
-        <ion-item>
-            <ion-label color="secondary" position="floating">{{(connector.type === 'yousign' ? 'lang.apiKey' : 'lang.subscriberId') | translate}} *</ion-label>
+        <ion-item *ngIf="connector.type === 'yousign'">
+            <ion-label color="secondary" position="floating">{{'lang.apiKey' | translate}} *</ion-label>
             <ion-input name="apiKey" [maxlength]="128" [(ngModel)]="connector.apiKey" required>
             </ion-input>
         </ion-item>
         <ng-container *ngIf="connector.type === 'fast'">
+            <ion-item>
+                <ion-label color="secondary" position="floating">{{'lang.subscriberId' | translate}} *</ion-label>
+                <ion-input name="subscriberId" [maxlength]="128" [(ngModel)]="connector.subscriberId" required>
+                </ion-input>
+            </ion-item>
             <ion-item>
                 <ion-label color="secondary" position="floating">{{'lang.certPath' | translate}} *</ion-label>
                 <ion-input name="certPath" [maxlength]="128" [(ngModel)]="connector.certPath" required>
diff --git a/src/frontend/app/administration/otp/otp.component.ts b/src/frontend/app/administration/otp/otp.component.ts
index 0f8c3a16d4..10a789227d 100644
--- a/src/frontend/app/administration/otp/otp.component.ts
+++ b/src/frontend/app/administration/otp/otp.component.ts
@@ -20,6 +20,7 @@ export interface Connector {
     label: string;
     apiUri: string;
     apiKey: string;
+    subscriberId: string;
     certPath?: string;
     certPass?: string;
     certType?: string;
@@ -79,6 +80,7 @@ export class OtpComponent implements OnInit, OnDestroy {
             label: '',
             apiUri: this.apiDefaultUri[this.connectorTypes[0]],
             apiKey: '',
+            subscriberId: '',
             securityModes: ['sms'],
             message : {
                 otp_sms : '',
@@ -232,10 +234,12 @@ export class OtpComponent implements OnInit, OnDestroy {
 
         if (!error) {
             if (this.connector.type === 'yousign') {
+                delete this.connector.subscriberId;
                 delete this.connector.certPass;
                 delete this.connector.certPath;
                 delete this.connector.certType;
             } else if (this.connector.type === 'fast') {
+                delete this.connector.apiKey;
                 delete this.connector.securityModes;
                 delete this.connector.message;
             }
-- 
GitLab