From 297957be0028342c6b767d8ed4ee87d7d5513034 Mon Sep 17 00:00:00 2001
From: Malte Bauch <malte.bauch@h-da.de>
Date: Wed, 23 Oct 2024 12:25:23 +0000
Subject: [PATCH] Allow to reset key store through qkdn-manager api

See merge request danet/quant!229
---
 goKMS/kms/peers/danetQuantummodule.go  |  4 ++++
 goKMS/kms/peers/etsi14Quantummodule.go |  4 ++++
 goKMS/kms/peers/kmsPeer.go             | 18 ++++++++++++++++++
 goKMS/kms/peers/quantummodule.go       |  1 +
 goKMS/qkdnManager/server.go            |  6 ++++++
 5 files changed, 33 insertions(+)

diff --git a/goKMS/kms/peers/danetQuantummodule.go b/goKMS/kms/peers/danetQuantummodule.go
index fa1487c1..fd967f6b 100644
--- a/goKMS/kms/peers/danetQuantummodule.go
+++ b/goKMS/kms/peers/danetQuantummodule.go
@@ -75,6 +75,10 @@ func (qm *DanetQuantumModule) Address() string {
 	return qm.addr
 }
 
+func (qm *DanetQuantumModule) SetActive(active bool) {
+	qm.active = active
+}
+
 func (qm *DanetQuantumModule) IsActive() bool {
 	return qm.active
 }
diff --git a/goKMS/kms/peers/etsi14Quantummodule.go b/goKMS/kms/peers/etsi14Quantummodule.go
index 41119283..b65f3780 100644
--- a/goKMS/kms/peers/etsi14Quantummodule.go
+++ b/goKMS/kms/peers/etsi14Quantummodule.go
@@ -151,6 +151,10 @@ func (qm *ETSI014HTTPQuantumModule) MaxKeyFillLevel() uint64 {
 	return qm.maxKeyFillLevel
 }
 
+func (qm *ETSI014HTTPQuantumModule) SetActive(active bool) {
+	qm.active = active
+}
+
 func (qm *ETSI014HTTPQuantumModule) IsActive() bool {
 	return qm.active
 }
diff --git a/goKMS/kms/peers/kmsPeer.go b/goKMS/kms/peers/kmsPeer.go
index caf14e1f..3f7e48b5 100644
--- a/goKMS/kms/peers/kmsPeer.go
+++ b/goKMS/kms/peers/kmsPeer.go
@@ -219,3 +219,21 @@ func (kp *KmsPeer) SetStatus(updateStatus KmsPeerStatus) {
 func (kp *KmsPeer) GetKmsPeerId() uuid.UUID {
 	return kp.peerKmsId
 }
+
+func (kp *KmsPeer) ResetKeyStore(kmsId string) error {
+	switch client := kp.peerClient; {
+	case client.KmsTalkerClient != nil:
+		_, err := client.InterComCapabilities(context.Background(), &pbIC.InterComCapabilitiesRequest{
+			Timestamp:     time.Now().Unix(),
+			KmsId:         kmsId,
+			ResetKeyStore: true,
+		})
+		if err != nil {
+			return err
+		}
+	default:
+		return fmt.Errorf("No active peer client found")
+	}
+
+	return nil
+}
diff --git a/goKMS/kms/peers/quantummodule.go b/goKMS/kms/peers/quantummodule.go
index 16629363..50147997 100644
--- a/goKMS/kms/peers/quantummodule.go
+++ b/goKMS/kms/peers/quantummodule.go
@@ -23,5 +23,6 @@ type QuantumModule interface {
 	Sync() error
 	Address() string
 	IsActive() bool
+	SetActive(bool)
 	Reset()
 }
diff --git a/goKMS/qkdnManager/server.go b/goKMS/qkdnManager/server.go
index ea3235f2..405f1a7c 100644
--- a/goKMS/qkdnManager/server.go
+++ b/goKMS/qkdnManager/server.go
@@ -220,6 +220,12 @@ func (qs *QkdnManagerServer) handleSetKeyStore(w http.ResponseWriter, r *http.Re
 				return
 			}
 		} else if fetch == "false" {
+			eqm.SetActive(false)
+			if err := peer.ResetKeyStore(qs.kms.GetID().String()); err != nil {
+				eqm.SetActive(true)
+				http.Error(w, fmt.Sprintf("Failed to reset keystore for quantum module of peer: %s", peerID), http.StatusBadRequest)
+				return
+			}
 			eqm.Reset()
 		}
 	}
-- 
GitLab