Newer
Older
import { Component, Input, OnInit } from '@angular/core';
import { LoadingController, ModalController } from '@ionic/angular';
import { of } from 'rxjs';
import { HttpClient } from '@angular/common/http';
import { NotificationService } from '../notification.service';
import { TranslateService } from '@ngx-translate/core';
import { ActionsService } from '../actions.service';
import { SignaturesContentService } from '../signatures.service';

Florian Azizian
committed
import { AuthService } from '../auth.service';
import { FunctionsService } from '../functions.service';
@Component({
selector: 'signature-method-modal',
templateUrl: 'signature-method-modal.component.html',
styleUrls: ['./signature-method-modal.component.scss']
})
export class SignatureMethodModalComponent implements OnInit {
filters: any = {
// onlySmartcards: false,
expired: false,
// subjectDNMatch: 'apple',
// subjectDNMatch: new RegExp(/apple/),
// issuerDNMatch: 'demo',
// issuerDNMatch: new RegExp(/demo/),
// keyUsage: ['digitalSignature'],
onlyWithPrivateKey: true
};
provider: any = null;
cert: any = null;
certPem: any = null;
privateKey: any = null;
certificate: any;
signatureLength: any = null;

Florian Azizian
committed
@Input() signatureMode: string;
public modalController: ModalController,
public http: HttpClient,
public translate: TranslateService,
public notificationService: NotificationService,
public loadingController: LoadingController,
public signaturesService: SignaturesContentService,
public actionsService: ActionsService,

Florian Azizian
committed
private functionsService: FunctionsService,
public authService: AuthService

Florian Azizian
committed
ngOnInit(): void {
const signatureModeData = this.authService.signatureRoles.filter((mode: any) => mode.id === this.signatureMode)[0];
if (!this.functionsService.empty(signatureModeData.issuer)) {
this.filters.issuerDNMatch = new RegExp(signatureModeData.issuer, 'i');
}
}
async continueSignature(certData: any) {
this.loadingController.create({
message: this.translate.instant('lang.processing'),
spinner: 'dots'
}).then(async (load: HTMLIonLoadingElement) => {
load.present();
this.provider = await certData.detail.server.getCrypto(certData.detail.providerId);
this.cert = await this.provider.certStorage.getItem(certData.detail.certificateId);
this.certPem = await this.provider.certStorage.exportCert('pem', this.cert);
this.privateKey = await this.provider.keyStorage.getItem(certData.detail.privateKeyId);
this.certificate = {
const result = await this.sendAndSign();
this.modalController.dismiss(result);

Florian Azizian
committed
signDocument(hashDocument: any, eSignatureLength: any, signatureFieldName: any) {
console.log(hashDocument);
console.log(eSignatureLength);
return new Promise(async (resolve) => {
const alg = {
name: this.privateKey.algorithm.name,
hash: 'SHA-256',
};
const hashDocumentHex = this.fromHex(hashDocument);
console.log('hashDocumentHex', hashDocumentHex);
const hashSignature = await this.provider.subtle.sign(alg, this.privateKey, hashDocumentHex);
console.log('hashSignature', hashSignature);
const objEsign = {
certificate: this.certPem,
hashSignature: this.toHex(hashSignature),

Florian Azizian
committed
signatureContentLength: eSignatureLength,
signatureFieldName: signatureFieldName,
this.http.put('../rest/documents/' + this.signaturesService.mainDocumentId + '/actions/' + this.signaturesService.currentAction, objEsign)
.pipe(
tap(() => {
resolve(true);
}),
catchError((err: any) => {
if (err.error.newSignatureLength !== undefined) {
this.signatureLength = err.error.newSignatureLength;
resolve(false);
} else {
this.notificationService.handleErrors(err);
resolve(null);
}
return of(false);
})
).subscribe();
});
}
async sendAndSign() {
let success: any = false;
while (success === false) {
const res: any = await this.actionsService.sendDocument(this.note, this.certificate, this.signatureLength);
if (res === null) {
return false;
} else if (res !== false) {
success = await this.signDocument(res.hashDocument, res.signatureContentLength, res.signatureFieldName);
}
}
return success !== null;
}
cancelSign() {
this.modalController.dismiss(false);
}
const buf = new Uint8Array(buffer),
splitter = '',
res = [],
len = buf.length;
for (let i = 0; i < len; i++) {
const char = buf[i].toString(16);
}
return res.join(splitter);
}
fromHex(hexString: any) {
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;
}