diff --git a/package.json b/package.json index aaf4d60e91eb8dd95b2b30730adadf9e3ebe8bd4..8c73d8b319d803f5d4134e0bb7f306cbc1548fb8 100644 --- a/package.json +++ b/package.json @@ -70,7 +70,8 @@ "stylus-loader": "^3.0.2", "tslint": "~6.1.0", "typescript": "4.0.5", - "typescript-tools": "^0.3.1" + "typescript-tools": "^0.3.1", + "@peculiar/fortify-webcomponents": "0.15.1" }, "repository": {} } diff --git a/src/frontend/app/app.module.ts b/src/frontend/app/app.module.ts index c20b7f5ca745a3ad50e75cb59a0936ee904f8b87..82d9e6e5740909caf62cbead664e5a7278d626b9 100755 --- a/src/frontend/app/app.module.ts +++ b/src/frontend/app/app.module.ts @@ -2,7 +2,7 @@ import { BrowserModule, HammerModule } from '@angular/platform-browser'; import { BrowserAnimationsModule } from '@angular/platform-browser/animations'; import { FormsModule, ReactiveFormsModule } from '@angular/forms'; import { HttpClientModule, HttpClient, HTTP_INTERCEPTORS } from '@angular/common/http'; -import { NgModule } from '@angular/core'; +import {CUSTOM_ELEMENTS_SCHEMA, NgModule} from '@angular/core'; import { RouteReuseStrategy } from '@angular/router'; import { IonicModule, IonicRouteStrategy } from '@ionic/angular'; @@ -184,7 +184,8 @@ import { SortPipe } from './plugins/sorting.pipe'; CookieService, LatinisePipe ], - bootstrap: [AppComponent] + bootstrap: [AppComponent], + schemas: [ CUSTOM_ELEMENTS_SCHEMA ] }) export class AppModule { } diff --git a/src/frontend/app/service/signature-method/signature-method-modal.component.html b/src/frontend/app/service/signature-method/signature-method-modal.component.html index b97c32d8b2cbeab494c99d18c1062947c109547b..c2b36d2483c59983cff192cd0522e1da9ff7af37 100644 --- a/src/frontend/app/service/signature-method/signature-method-modal.component.html +++ b/src/frontend/app/service/signature-method/signature-method-modal.component.html @@ -1,10 +1,11 @@ <ion-content> <div class="content"> - <i *ngIf="status==='SUCCESS'" class="fas fa-check success"></i> - <i *ngIf="status==='WAITING'" class="fas fa-plug bounce"></i> - <i *ngIf="status==='ERROR'" class="fas fa-times danger"></i> - <ion-label *ngIf="status==='WAITING'" style="padding: 10px;">En attente d'identification ...</ion-label> - <ion-label *ngIf="status==='SUCCESS'" style="padding: 10px;">Identification réussie !</ion-label> - <ion-label *ngIf="status==='ERROR'" style="padding: 10px;">Identification échouée !</ion-label> +<!-- <i *ngIf="status==='SUCCESS'" class="fas fa-check success"></i>--> +<!-- <i *ngIf="status==='WAITING'" class="fas fa-plug bounce"></i>--> +<!-- <i *ngIf="status==='ERROR'" class="fas fa-times danger"></i>--> +<!-- <ion-label *ngIf="status==='WAITING'" style="padding: 10px;">En attente d'identification ...</ion-label>--> +<!-- <ion-label *ngIf="status==='SUCCESS'" style="padding: 10px;">Identification réussie !</ion-label>--> +<!-- <ion-label *ngIf="status==='ERROR'" style="padding: 10px;">Identification échouée !</ion-label>--> + <peculiar-fortify-certificates style="height: 100%" language="fr" [filters]="filters" (continue)="continueSignature($event)" (cancel)="cancelSign($event)"></peculiar-fortify-certificates> </div> -</ion-content> \ No newline at end of file +</ion-content> diff --git a/src/frontend/app/service/signature-method/signature-method-modal.component.ts b/src/frontend/app/service/signature-method/signature-method-modal.component.ts index fbf4de9a695ca3cc853785fc72056f9df8d31fb8..e6f28d2e52a34f531168009ceb2f29127574b297 100644 --- a/src/frontend/app/service/signature-method/signature-method-modal.component.ts +++ b/src/frontend/app/service/signature-method/signature-method-modal.component.ts @@ -1,5 +1,9 @@ import { Component, Input, OnInit } from '@angular/core'; import { ModalController } from '@ionic/angular'; +import {catchError, tap} from 'rxjs/operators'; +import {of} from 'rxjs'; +import {HttpClient} from '@angular/common/http'; +import {NotificationService} from '../notification.service'; @Component({ selector: 'signature-method-modal', @@ -13,38 +17,102 @@ export class SignatureMethodModalComponent implements OnInit { nbTry = 10; interval: any; + filters: any = { + // onlySmartcards: false, + expired: false, + // subjectDNMatch: 'apple', + // subjectDNMatch: new RegExp(/apple/), + // issuerDNMatch: 'demo', + // issuerDNMatch: new RegExp(/demo/), + // keyUsage: ['digitalSignature'], + onlyWithPrivateKey: true + }; + constructor( - public modalController: ModalController + public modalController: ModalController, + public http: HttpClient, + public notificationService: NotificationService, ) { } ngOnInit(): void { - this.interval = setInterval(async () => { - console.log('attempt', this.attempt); - const res = await this.checkCertificate(); - if (res) { - this.status = 'SUCCESS'; - clearInterval(this.interval); - setTimeout(() => { - this.modalController.dismiss(true); - }, 1000); - } else if (this.attempt === this.nbTry) { - this.status = 'ERROR'; - clearInterval(this.interval); - setTimeout(() => { - this.modalController.dismiss(false); - }, 1000); - } - this.attempt++; - }, 1000); + // this.interval = setInterval(async () => { + // console.log('attempt', this.attempt); + // const res = await this.checkCertificate(); + // if (res) { + // this.status = 'SUCCESS'; + // clearInterval(this.interval); + // setTimeout(() => { + // this.modalController.dismiss(true); + // }, 1000); + // } else if (this.attempt === this.nbTry) { + // this.status = 'ERROR'; + // clearInterval(this.interval); + // setTimeout(() => { + // this.modalController.dismiss(false); + // }, 1000); + // } + // this.attempt++; + // }, 1000); } checkCertificate() { - return new Promise((resolve) => { - setTimeout(() => { - console.log('end request'); - resolve(false); - }, 800); - }); + // return new Promise((resolve) => { + // setTimeout(() => { + // console.log('end request'); + // resolve(false); + // }, 800); + // }); } + async continueSignature(certData: any) { + console.log(certData); + + const provider = await certData.detail.server.getCrypto(certData.detail.providerId); + + const cert = await provider.certStorage.getItem(certData.detail.certificateId); + const certPem = await provider.certStorage.exportCert('pem', cert); + const privateKey = await provider.keyStorage.getItem(certData.detail.privateKeyId); + + console.log('cert = '); + console.log(cert); + console.log('certPem = '); + console.log(certPem); + console.log('privateKey = '); + console.log(privateKey); + + this.http.post('../rest/testFortify?action=start', {certificate: certPem}).pipe( + tap(async (dataToSign: any) => { + const message = this.fromHex(dataToSign.dataToSign); + const alg = { + name: privateKey.algorithm.name, + hash: 'SHA-256', + }; + const signature = await provider.subtle.sign(alg, privateKey, message); + + return this.http.post('../rest/testFortify?action=complete', {signature: signature}); + }), + tap(() => { + console.log('signature ok'); + this.modalController.dismiss(true); + }), + catchError(err => { + this.notificationService.handleErrors(err); + return of(false); + }) + ).subscribe(); + } + + cancelSign(data: any) { + console.log(data); + this.modalController.dismiss(false); + } + + fromHex(hexString) { + const res = new Uint8Array(hexString.length / 2); + for (let i = 0; i < hexString.length; i = i + 2) { + const c = hexString.slice(i, i + 2); + res[i / 2] = parseInt(c, 16); + } + return res.buffer; + } } diff --git a/src/frontend/core/index.html b/src/frontend/core/index.html index d96c2609a2bfc1d723744dca5256a511ff47ef27..518f839e6fa2a21ebbd0c49daca99fcd6fdbf4e4 100644 --- a/src/frontend/core/index.html +++ b/src/frontend/core/index.html @@ -23,8 +23,11 @@ <link rel="icon" type="image/x-icon" href="frontend/core/favicon.ico"> <link rel="apple-touch-icon" href="frontend/assets/apple-touch-icon.png"> <link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500&display=swap" rel="stylesheet"> + <script type="module" src="https://unpkg.com/@peculiar/fortify-webcomponents@latest/dist/peculiar/peculiar.esm.js"></script> + <script nomodule src="https://unpkg.com/@peculiar/fortify-webcomponents@latest/dist/peculiar/peculiar.js"></script> + <link rel="stylesheet" href="https://unpkg.com/@peculiar/fortify-webcomponents@latest/dist/peculiar/peculiar.css"> </head> <body> <app-root></app-root> </body> -</html> \ No newline at end of file +</html>