The key used in m_requestMap is not unique which may lead to errors when
requests from multiple clients are processed.
Use a separate request counter as the key.
Change-Id: Iffbf0a3c43ea0c091eb3d714ef0a77211f9b3a78
// inter-service communication message base class
struct MsgBase {
// inter-service communication message base class
struct MsgBase {
- explicit MsgBase(int id) : id(id) {}
+ explicit MsgBase(unsigned id) : id(id) {}
};
// key request
struct MsgKeyRequest : public MsgBase {
};
// key request
struct MsgKeyRequest : public MsgBase {
- MsgKeyRequest(int id, const Credentials &cred, const Name &name,
+ MsgKeyRequest(unsigned id, const Credentials &cred, const Name &name,
const Label &label, const Password &password) :
MsgBase(id), cred(cred), name(name), label(label), password(password) {}
const Label &label, const Password &password) :
MsgBase(id), cred(cred), name(name), label(label), password(password) {}
// key response
struct MsgKeyResponse : public MsgBase {
// key response
struct MsgKeyResponse : public MsgBase {
- MsgKeyResponse(int id, const Crypto::GObjShPtr &key,
+ MsgKeyResponse(unsigned id, const Crypto::GObjShPtr &key,
int errorCode = CKM_API_SUCCESS) :
MsgBase(id), key(key), error(errorCode) {}
int errorCode = CKM_API_SUCCESS) :
MsgBase(id), key(key), error(errorCode) {}
m_service.RespondToClient(request, CKM_API_ERROR_INPUT_PARAM);
return;
}
m_service.RespondToClient(request, CKM_API_ERROR_INPUT_PARAM);
return;
}
// store request in the map
// store request in the map
- auto ret = m_requestsMap.insert(std::make_pair(request.msgId, request));
+ auto ret = m_requestsMap.insert(std::make_pair(m_counter, request));
- LogError("Request with id " << request.msgId << " already exists");
- m_service.RespondToClient(request, CKM_API_ERROR_INPUT_PARAM);
+ LogError("Request with id = " << m_counter << " already exists");
+ m_service.RespondToClient(request, CKM_API_ERROR_SERVER_ERROR);
return;
}
// request key
try {
return;
}
// request key
try {
- m_service.RequestKey(request);
+ m_service.RequestKey(m_counter, request);
} catch (...) {
LogError("Key request failed");
} catch (...) {
LogError("Key request failed");
- m_requestsMap.erase(request.msgId);
+ m_requestsMap.erase(m_counter);
m_service.RespondToClient(request, CKM_API_ERROR_SERVER_ERROR);
}
}
m_service.RespondToClient(request, CKM_API_ERROR_SERVER_ERROR);
}
}
+#include <unordered_map>
#include <ckm/ckm-type.h>
#include <generic-socket-manager.h>
#include <protocols.h>
#include <ckm/ckm-type.h>
#include <generic-socket-manager.h>
#include <protocols.h>
class EncryptionLogic {
public:
class EncryptionLogic {
public:
- EncryptionLogic(IEncryptionService &service) : m_service(service) {}
+ EncryptionLogic(IEncryptionService &service) : m_service(service), m_counter(0) {}
virtual ~EncryptionLogic() {}
void Crypt(const CryptoRequest &request);
virtual ~EncryptionLogic() {}
void Crypt(const CryptoRequest &request);
private:
IEncryptionService &m_service;
private:
IEncryptionService &m_service;
- std::map<int, CryptoRequest> m_requestsMap;
+ std::unordered_map<unsigned, CryptoRequest> m_requestsMap;
+ unsigned m_counter;
-void EncryptionService::RequestKey(const CryptoRequest &request)
+void EncryptionService::RequestKey(unsigned id, const CryptoRequest &request)
- MsgKeyRequest kReq(request.msgId, request.cred, request.name, request.label,
- request.password);
+ MsgKeyRequest kReq(id, request.cred, request.name, request.label, request.password);
if (!m_commMgr->SendMessage(kReq))
throw std::runtime_error("No listener found");// TODO
if (!m_commMgr->SendMessage(kReq))
throw std::runtime_error("No listener found");// TODO
virtual void RespondToClient(const CryptoRequest &request,
int retCode,
const RawBuffer &data = RawBuffer());
virtual void RespondToClient(const CryptoRequest &request,
int retCode,
const RawBuffer &data = RawBuffer());
- virtual void RequestKey(const CryptoRequest &request);
+ virtual void RequestKey(unsigned id, const CryptoRequest &request);
EncryptionLogic m_logic;
};
EncryptionLogic m_logic;
};
virtual void RespondToClient(const CryptoRequest &request,
int retCode,
const RawBuffer &data = RawBuffer()) = 0;
virtual void RespondToClient(const CryptoRequest &request,
int retCode,
const RawBuffer &data = RawBuffer()) = 0;
- virtual void RequestKey(const CryptoRequest &request) = 0;
+ virtual void RequestKey(unsigned id, const CryptoRequest &request) = 0;