KamusmRootCertificateService.java

package io.mersel.dss.signer.api.services;

import eu.europa.esig.dss.model.x509.CertificateToken;
import eu.europa.esig.dss.spi.x509.CommonTrustedCertificateSource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.security.cert.X509Certificate;
import java.util.List;

/**
 * Güvenilir kök sertifika servisi (wrapper)
 * Üç farklı resolver'ı destekler:
 * - KamuSMXmlDepoOnlineResolver: İnternet üzerinden KamuSM XML deposunu yükler
 * - KamuSMXmlDepoOfflineResolver: Yerel dosyadan KamuSM XML deposunu yükler
 * - CertificateFolderResolver: Klasördeki tüm .crt/.cer dosyalarını yükler
 */
@Service
public class KamusmRootCertificateService {

    private static final Logger LOGGER = LoggerFactory.getLogger(KamusmRootCertificateService.class);
    
    private final TrustedRootCertificateResolver resolver;

    @Autowired
    public KamusmRootCertificateService(
            @Value("${trusted.root.resolver.type:kamusm-online}") String resolverType,
            @Qualifier("kamuSMXmlDepoOnlineResolver") TrustedRootCertificateResolver onlineResolver,
            @Qualifier("kamuSMXmlDepoOfflineResolver") TrustedRootCertificateResolver offlineResolver,
            @Qualifier("certificateFolderResolver") TrustedRootCertificateResolver folderResolver) {
        
        switch (resolverType.toLowerCase()) {
            case "kamusm-online":
                LOGGER.info("Using KamuSM XML Depo Online Resolver");
                this.resolver = onlineResolver;
                break;
            case "kamusm-offline":
                LOGGER.info("Using KamuSM XML Depo Offline Resolver");
                this.resolver = offlineResolver;
                break;
            case "certificate-folder":
            case "folder":
                LOGGER.info("Using Certificate Folder Resolver");
                this.resolver = folderResolver;
                break;
            default:
                LOGGER.warn("Unknown resolver type: {}, defaulting to kamusm-online", resolverType);
                this.resolver = onlineResolver;
        }
    }

    @PostConstruct
    public void init() {
        refreshTrustedRoots();
    }

    @Scheduled(cron = "${trusted.root.refresh-cron:0 15 3 * * *}")
    public void refreshTrustedRoots() {
        resolver.refreshTrustedRoots();
    }

    public List<X509Certificate> getTrustedRoots() {
        return resolver.getTrustedRoots();
    }

    public List<CertificateToken> getTrustedRootTokens() {
        return resolver.getTrustedRootTokens();
    }

    public CommonTrustedCertificateSource getTrustedCertificateSource() {
        return resolver.getTrustedCertificateSource();
    }

    public void addTrustedCertificate(CertificateToken certificate) {
        resolver.addTrustedCertificate(certificate);
    }

    public void addTrustedCertificate(X509Certificate certificate) {
        resolver.addTrustedCertificate(certificate);
    }

    public boolean isTrusted(CertificateToken certificate) {
        return resolver.isTrusted(certificate);
    }
}