fix ca storage cannot repeat REVOKE and optimize ca-memory with index
Change-Id: I3c254e1cd93d5ff562c501c0296ef7bd84634cb2
diff --git a/src/ca-storage-detail/ca-memory.cpp b/src/ca-storage-detail/ca-memory.cpp
index 827f36c..5adaa21 100644
--- a/src/ca-storage-detail/ca-memory.cpp
+++ b/src/ca-storage-detail/ca-memory.cpp
@@ -43,24 +43,23 @@
void
CaMemory::addRequest(const CaState& request)
{
- for (auto& entry : m_requests) {
- const auto& existingRequest = entry.second;
- if (existingRequest.m_cert.getKeyName() == request.m_cert.getKeyName()) {
- BOOST_THROW_EXCEPTION(Error("Request for " + request.m_cert.getKeyName().toUri() + " already exists"));
- return;
+ auto keyNameTLV = request.m_cert.getKeyName();
+ if (request.m_requestType == RequestType::NEW) {
+ if (m_requestKeyIndex.find(keyNameTLV) != m_requestKeyIndex.end()
+ && !m_requestKeyIndex.find(keyNameTLV)->second.empty()){
+ BOOST_THROW_EXCEPTION(Error("Request for " + keyNameTLV.toUri() + " already exists"));
+ return;
+ }
+ if (m_certsKeyIndex.find(keyNameTLV) != m_certsKeyIndex.end()) {
+ BOOST_THROW_EXCEPTION(Error("Cert for " + keyNameTLV.toUri() + " already exists"));
+ return;
+ }
}
- }
- for (auto& entry : m_issuedCerts) {
- const auto& cert = entry.second;
- if (cert.getKeyName() == request.m_cert.getKeyName()) {
- BOOST_THROW_EXCEPTION(Error("Cert for " + request.m_cert.getKeyName().toUri() + " already exists"));
- return;
- }
- }
auto search = m_requests.find(request.m_requestId);
if (search == m_requests.end()) {
m_requests[request.m_requestId] = request;
+ m_requestKeyIndex[keyNameTLV].insert(request.m_requestId);
}
else {
BOOST_THROW_EXCEPTION(Error("Request " + request.m_requestId + " already exists"));
@@ -70,14 +69,18 @@
void
CaMemory::updateRequest(const CaState& request)
{
- m_requests[request.m_requestId] = request;
+ m_requests[request.m_requestId].m_status = request.m_status;
+ m_requests[request.m_requestId].m_challengeState = request.m_challengeState;
}
void
CaMemory::deleteRequest(const std::string& requestId)
{
auto search = m_requests.find(requestId);
+ auto keyName = search->second.m_cert.getKeyName();
if (search != m_requests.end()) {
+ m_requestKeyIndex.find(keyName)->second.erase(requestId);
+ if (m_requestKeyIndex.find(keyName)->second.empty()) m_requestKeyIndex.erase(keyName);
m_requests.erase(search);
}
}
@@ -121,6 +124,7 @@
auto search = m_issuedCerts.find(certId);
if (search == m_issuedCerts.end()) {
m_issuedCerts[certId] = cert;
+ m_certsKeyIndex[cert.getKeyName()] = certId;
}
else {
BOOST_THROW_EXCEPTION(Error("Certificate " + cert.getName().toUri() + " already exists"));
@@ -138,6 +142,7 @@
{
auto search = m_issuedCerts.find(certId);
if (search != m_issuedCerts.end()) {
+ m_certsKeyIndex.erase(search->second.getKeyName());
m_issuedCerts.erase(search);
}
}