Skip to main content

koprogo_api/infrastructure/external/
signature_provider_eid.rs

1//! Adaptateur eID belge (FAS — Federal Authentication Service) — Story 4.4.
2//!
3//! Prestataire par défaut v0.1.0, gratuit (ADR-0014 §4). Délègue au contrat
4//! REST commun (`signature_provider_common::RestSignatureProvider`) : rien
5//! ne distingue aujourd'hui son protocole de celui d'itsme ou d'Universign.
6
7use super::signature_provider_common::{RestSignatureProvider, RetryPolicy};
8use crate::application::ports::electronic_signature_provider::{
9    ElectronicSignatureProvider, SignatureProviderError, SignatureRequest, SignatureRequestAck,
10};
11use crate::domain::plateforme::{QualifiedSignature, SignatureProviderKind};
12use async_trait::async_trait;
13
14pub struct EidSignatureProvider(RestSignatureProvider);
15
16impl EidSignatureProvider {
17    pub fn new(base_url: String, hmac_secret: Vec<u8>) -> Self {
18        Self(RestSignatureProvider::new(
19            SignatureProviderKind::Eid,
20            base_url,
21            hmac_secret,
22        ))
23    }
24
25    /// Permet aux tests d'utiliser un délai de réessai quasi nul.
26    pub fn with_retry_policy(self, retry_policy: RetryPolicy) -> Self {
27        Self(self.0.with_retry_policy(retry_policy))
28    }
29
30    /// Permet aux tests de déclencher un vrai `Timeout` réseau.
31    pub fn with_http_timeout(self, timeout: std::time::Duration) -> Self {
32        Self(self.0.with_http_timeout(timeout))
33    }
34}
35
36#[async_trait]
37impl ElectronicSignatureProvider for EidSignatureProvider {
38    fn kind(&self) -> SignatureProviderKind {
39        self.0.kind()
40    }
41
42    async fn request_signature(
43        &self,
44        request: SignatureRequest,
45    ) -> Result<SignatureRequestAck, SignatureProviderError> {
46        self.0.request_signature(request).await
47    }
48
49    async fn fetch_signature(
50        &self,
51        provider_reference: &str,
52        expected_document_hash: &str,
53    ) -> Result<QualifiedSignature, SignatureProviderError> {
54        self.0
55            .fetch_signature(provider_reference, expected_document_hash)
56            .await
57    }
58}