[prev in list] [next in list] [prev in thread] [next in thread]
List: kde-commits
Subject: [ksecrets] src/runtime/ksecrets_store: Adding more classes, introducing internal file structure
From: Valentin Rusu <kde () rusu ! info>
Date: 2015-08-15 14:17:47
Message-ID: E1ZQcHL-0008TQ-98 () scm ! kde ! org
[Download RAW message or body]
Git commit a4b45abb366e52e8a6b148f97e74c5f76c6b98e3 by Valentin Rusu.
Committed on 15/08/2015 at 13:58.
Pushed by vrusu into branch 'master'.
Adding more classes, introducing internal file structure
M +44 -0 src/runtime/ksecrets_store/ksecrets_crypt.cpp
C +34 -36 src/runtime/ksecrets_store/ksecrets_data.cpp [from: \
src/runtime/ksecrets_store/ksecrets_file.h - 053% similarity] C +34 -31 \
src/runtime/ksecrets_store/ksecrets_data.h [from: \
src/runtime/ksecrets_store/ksecrets_file.h - 054% similarity] M +44 -5 \
src/runtime/ksecrets_store/ksecrets_file.cpp M +26 -6 \
src/runtime/ksecrets_store/ksecrets_file.h M +61 -48 \
src/runtime/ksecrets_store/ksecrets_store.cpp M +29 -6 \
src/runtime/ksecrets_store/ksecrets_store.h M +8 -7 \
src/runtime/ksecrets_store/ksecrets_store_p.h
http://commits.kde.org/ksecrets/a4b45abb366e52e8a6b148f97e74c5f76c6b98e3
diff --git a/src/runtime/ksecrets_store/ksecrets_crypt.cpp \
b/src/runtime/ksecrets_store/ksecrets_crypt.cpp index c087cbb..0af3e1f 100644
--- a/src/runtime/ksecrets_store/ksecrets_crypt.cpp
+++ b/src/runtime/ksecrets_store/ksecrets_crypt.cpp
@@ -23,6 +23,7 @@
#include <sys/types.h>
#include <errno.h>
+#include <memory>
extern "C" {
#include <keyutils.h>
@@ -33,6 +34,9 @@ extern "C" {
#define GCRYPT_REQUIRED_VERSION "1.6.0"
+#define KSECRETS_SALTSIZE 56
+#define KSECRETS_KEYSIZE 256
+
const char* get_keyname_encrypting();
const char* get_keyname_mac();
@@ -102,6 +106,17 @@ int kss_store_keys(const char* encryption_key, const char* \
mac_key, size_t keySi return TRUE;
}
+int kss_set_credentials(const std::string &password, const char *salt)
+{
+ // FIXME this should be adjusted on platforms where kernel keyring is not \
available and store the keys elsewhere + char encryption_key[KSECRETS_KEYSIZE];
+ char mac_key[KSECRETS_KEYSIZE];
+ auto res = kss_derive_keys(salt, password.c_str(), encryption_key, mac_key, \
KSECRETS_KEYSIZE); + if (res) return res;
+
+ return kss_store_keys(encryption_key, mac_key, KSECRETS_KEYSIZE);
+}
+
int kss_keys_already_there()
{
key_serial_t key;
@@ -114,3 +129,32 @@ int kss_keys_already_there()
return TRUE;
}
+long kss_read_key(const char *keyName, char* buffer, size_t bufferSize)
+{
+ key_serial_t key;
+ key = request_key("user", keyName, 0, KEY_SPEC_SESSION_KEYRING);
+ if (-1 == key) {
+ syslog(KSS_LOG_DEBUG, "request_key failed with errno %d (%m) when reading \
MAC key %s", errno, keyName); + return -1;
+ }
+ auto bytes = keyctl_read(key, buffer, bufferSize);
+ if (bytes == -1) {
+ syslog(KSS_LOG_ERR, "error reading key %s contents from the keyring", \
keyName); + return -1;
+ }
+ if ((size_t)bytes > bufferSize) {
+ return bytes;
+ }
+ return 0; // key contents correctly transffered into the buffer
+}
+
+long kss_read_mac_key(char *buffer, size_t bufferSize)
+{
+ return kss_read_key(get_keyname_mac(), buffer, bufferSize);
+}
+
+long kss_read_encrypting_key(char *buffer, size_t bufferSize)
+{
+ return kss_read_key(get_keyname_encrypting(), buffer, bufferSize);
+}
+
diff --git a/src/runtime/ksecrets_store/ksecrets_file.h \
b/src/runtime/ksecrets_store/ksecrets_data.cpp similarity index 53%
copy from src/runtime/ksecrets_store/ksecrets_file.h
copy to src/runtime/ksecrets_store/ksecrets_data.cpp
index 1a2212d..4998fcd 100644
--- a/src/runtime/ksecrets_store/ksecrets_file.h
+++ b/src/runtime/ksecrets_store/ksecrets_data.cpp
@@ -18,39 +18,37 @@
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
-#ifndef KSECRETS_FILE_H
-#define KSECRETS_FILE_H
-
-#include <memory>
-
-class KSecretsFile {
-public:
- KSecretsFile();
- ~KSecretsFile();
-
- constexpr static auto IV_SIZE = 32;
- constexpr static auto SALT_SIZE = 56;
- struct FileHeadStruct {
- char magic[9];
- char salt[SALT_SIZE];
- char iv[IV_SIZE];
- };
-
- int create(const std::string &path);
- void setup(const std::string &path, bool readOnly) noexcept;
- bool open() noexcept;
- bool lock() noexcept;
- bool readHeader() noexcept;
- bool checkMagic() noexcept;
- const char *salt() const noexcept { return fileHead_.salt; }
-
-private:
- std::string filePath_;
- int file_;
- bool locked_;
- bool readOnly_;
- FileHeadStruct fileHead_;
-};
-
-#endif
-// vim: tw=220:ts=4
+#include "ksecrets_data.h"
+#include "ksecrets_file.h"
+
+#include <unistd.h>
+
+SecretsEntity::SecretsEntity()
+ : size_(0)
+ , state_(Empty)
+ , encrypted_(nullptr)
+ , unencrypted_(nullptr)
+{
+}
+SecretsEntity::~SecretsEntity()
+{
+ if (encrypted_) {
+ ::free(encrypted_);
+ encrypted_ = nullptr;
+ }
+ if (unencrypted_) {
+ ::free(unencrypted_);
+ unencrypted_ = nullptr;
+ }
+}
+bool SecretsEntity::read(KSecretsFile& file)
+{
+ if (!file.read(size_)) {
+ return false;
+ }
+
+ encrypted_ = ::malloc(res);
+ if (encrypted_ == nullptr) {
+ return false;
+ }
+}
diff --git a/src/runtime/ksecrets_store/ksecrets_file.h \
b/src/runtime/ksecrets_store/ksecrets_data.h similarity index 54%
copy from src/runtime/ksecrets_store/ksecrets_file.h
copy to src/runtime/ksecrets_store/ksecrets_data.h
index 1a2212d..e5b8964 100644
--- a/src/runtime/ksecrets_store/ksecrets_file.h
+++ b/src/runtime/ksecrets_store/ksecrets_data.h
@@ -18,39 +18,42 @@
the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
Boston, MA 02110-1301, USA.
*/
-#ifndef KSECRETS_FILE_H
-#define KSECRETS_FILE_H
-
-#include <memory>
-
-class KSecretsFile {
-public:
- KSecretsFile();
- ~KSecretsFile();
-
- constexpr static auto IV_SIZE = 32;
- constexpr static auto SALT_SIZE = 56;
- struct FileHeadStruct {
- char magic[9];
- char salt[SALT_SIZE];
- char iv[IV_SIZE];
+#ifndef KSECRETS_DATA_H
+#define KSECRETS_DATA_H
+
+#include <cstdint>
+#include <sys/types.h>
+
+class KSecretsFile;
+
+struct SecretsEntity {
+ SecretsEntity();
+ SecretsEntity(const SecretsEntity&) = delete;
+ SecretsEntity(SecretsEntity&&) = delete;
+ virtual ~SecretsEntity();
+
+ enum class State: std::uint8_t {
+ Empty = 0,
+ Encrypted = 0x01,
+ Decrypted = 0x02
};
- int create(const std::string &path);
- void setup(const std::string &path, bool readOnly) noexcept;
- bool open() noexcept;
- bool lock() noexcept;
- bool readHeader() noexcept;
- bool checkMagic() noexcept;
- const char *salt() const noexcept { return fileHead_.salt; }
-
-private:
- std::string filePath_;
- int file_;
- bool locked_;
- bool readOnly_;
- FileHeadStruct fileHead_;
+ size_t size_;
+ State state_;
+ char* encrypted_;
+ char* unencrypted_;
+
+ bool decrypt() noexcept;
+ bool encrypt() noexcept;
+
+ bool read(KSecretsFile&) noexcept;
+ bool write(KSecretsFile&) const noexcept;
+};
+
+struct SecretsCollection : public SecretsEntity {
+};
+
+struct CollectionDirectory : public SecretsEntity {
};
#endif
-// vim: tw=220:ts=4
diff --git a/src/runtime/ksecrets_store/ksecrets_file.cpp \
b/src/runtime/ksecrets_store/ksecrets_file.cpp index dd173a6..7d91de3 100644
--- a/src/runtime/ksecrets_store/ksecrets_file.cpp
+++ b/src/runtime/ksecrets_store/ksecrets_file.cpp
@@ -36,6 +36,7 @@ constexpr auto fileMagicLen = sizeof(fileMagic) / \
sizeof(fileMagic[0]); KSecretsFile::KSecretsFile()
: file_(-1)
, locked_(false)
+ , empty_(true)
{
memset(&fileHead_, 0, sizeof(fileHead_));
}
@@ -63,11 +64,11 @@ int KSecretsFile::create(const std::string& path)
}
FileHeadStruct emptyFileData;
- memcpy(emptyFileData.magic, fileMagic, fileMagicLen);
+ memcpy(emptyFileData.magic_, fileMagic, fileMagicLen);
// FIXME should we put this kind of call in gcrypt-dedicated file?
- gcry_randomize(emptyFileData.salt, SALT_SIZE, GCRY_STRONG_RANDOM);
- gcry_randomize(emptyFileData.iv, IV_SIZE, GCRY_STRONG_RANDOM);
+ gcry_randomize(emptyFileData.salt_, SALT_SIZE, GCRY_STRONG_RANDOM);
+ gcry_randomize(emptyFileData.iv_, IV_SIZE, GCRY_STRONG_RANDOM);
int res = 0;
if (fwrite(&emptyFileData, 1, sizeof(emptyFileData), f) != \
sizeof(emptyFileData)) { @@ -95,13 +96,51 @@ bool KSecretsFile::lock()
locked_ = true;
}
-bool KSecretsFile::readHeader() { return read(file_, &fileHead_, sizeof(fileHead_)) \
== sizeof(fileHead_); } +bool KSecretsFile::readHeader()
+{
+ auto rres = ::read(file_, &fileHead_, sizeof(fileHead_));
+ char dummyBuffer[4];
+ auto bytes = sizeof(dummyBuffer) / sizeof(dummyBuffer[0]);
+ auto eoftest = ::read(file_, dummyBuffer, bytes);
+ if (eoftest == 0) {
+ // we are at EOF already, so file is empty
+ empty_ = true;
+ }
+ else {
+ if (-1 == lseek(file_, -bytes, SEEK_CUR)) {
+ setFailState(errno);
+ return false;
+ }
+ empty_ = false;
+ }
+ return rres == sizeof(fileHead_);
+}
bool KSecretsFile::checkMagic()
{
- if (memcmp(fileHead_.magic, fileMagic, fileMagicLen) != 0) {
+ if (memcmp(fileHead_.magic_, fileMagic, fileMagicLen) != 0) {
return false;
}
return true;
}
+
+int KSecretsFile::checkMAC() const
+{
+ if (empty_)
+ return 0; // MAC of empty files is always OK
+ // const char *macKey = kss_read_mac_key();
+ // gcry_error_t err;
+ // gcry_mac_hd_t hd;
+ // err = gcry_mac_open(&hd, GCRY_MAC_HMAC_SHA512, 0, NULL);
+ // if (!err) return gcry_err_code_to_errno(gcry_err_code(err));
+ //
+ // err = gcry_mac_setkey(hd, );
+ // TODO
+ return -1;
+}
+
+KSecretsFile::DirCollectionResult KSecretsFile::dirCollections() {
+ return DirCollectionResult();
+}
+
// vim: tw=220:ts=4
diff --git a/src/runtime/ksecrets_store/ksecrets_file.h \
b/src/runtime/ksecrets_store/ksecrets_file.h index 1a2212d..a929cca 100644
--- a/src/runtime/ksecrets_store/ksecrets_file.h
+++ b/src/runtime/ksecrets_store/ksecrets_file.h
@@ -21,7 +21,10 @@
#ifndef KSECRETS_FILE_H
#define KSECRETS_FILE_H
+#include "ksecrets_data.h"
+
#include <memory>
+#include <list>
class KSecretsFile {
public:
@@ -31,25 +34,42 @@ public:
constexpr static auto IV_SIZE = 32;
constexpr static auto SALT_SIZE = 56;
struct FileHeadStruct {
- char magic[9];
- char salt[SALT_SIZE];
- char iv[IV_SIZE];
+ char magic_[9];
+ char salt_[SALT_SIZE];
+ char iv_[IV_SIZE];
};
- int create(const std::string &path);
- void setup(const std::string &path, bool readOnly) noexcept;
+ int create(const std::string& path);
+ void setup(const std::string& path, bool readOnly) noexcept;
bool open() noexcept;
bool lock() noexcept;
bool readHeader() noexcept;
bool checkMagic() noexcept;
- const char *salt() const noexcept { return fileHead_.salt; }
+ const char* salt() const noexcept { return fileHead_.salt_; }
+ int checkMAC() const noexcept;
+ bool read(void* buf, size_t count);
+ bool read(size_t&);
+
+ using DirCollectionResult = std::pair<bool, const CollectionDirectory*>;
+ DirCollectionResult dirCollections() noexcept;
private:
+ bool setFailState(int err, bool retval = false)
+ {
+ errno_ = err;
+ return retval; // wo do like this so this function could end other methods \
with an elegant return setFailState(errno); + }
+ using Entities = std::list<SecretsEntity*>;
+
std::string filePath_;
int file_;
bool locked_;
bool readOnly_;
FileHeadStruct fileHead_;
+ bool empty_;
+ char fileMAC_[64];
+ Entities entities_;
+ int errno_;
};
#endif
diff --git a/src/runtime/ksecrets_store/ksecrets_store.cpp \
b/src/runtime/ksecrets_store/ksecrets_store.cpp index 9fcd5b1..9e3967b 100644
--- a/src/runtime/ksecrets_store/ksecrets_store.cpp
+++ b/src/runtime/ksecrets_store/ksecrets_store.cpp
@@ -21,6 +21,8 @@
#include "ksecrets_store.h"
#include "ksecrets_store_p.h"
+#include "ksecrets_file.h"
+#include "ksecrets_data.h"
#include <future>
#include <thread>
@@ -32,16 +34,13 @@
#define GCRPYT_NO_DEPRECATED
#include <gcrypt.h>
-#define KSECRETS_SALTSIZE 56
-#define KSECRETS_KEYSIZE 256
#define KSS_LOG_ERR (LOG_AUTH | LOG_ERR)
const char* keyNameEncrypting = nullptr;
const char* keyNameMac = nullptr;
bool kss_init_gcry();
-bool kss_derive_keys(const char* salt, const char* password, char* encryption_key, \
char* mac_key, size_t);
-bool kss_store_keys(const char* encryption_key, const char* mac_key, size_t \
keySize); +int kss_set_credentials(const std::string& password, const char* salt);
const char* get_keyname_encrypting() { return keyNameEncrypting; }
const char* get_keyname_mac() { return keyNameMac; }
@@ -62,7 +61,7 @@ std::future<KSecretsStore::SetupResult> KSecretsStore::setup(const \
char* path, b {
// sanity checks
if (d->status_ != StoreStatus::JustCreated) {
- return std::async(std::launch::deferred, []() { return SetupResult({ \
StoreStatus::IncorrectState, -1 }); }); + return \
std::async(std::launch::deferred, []() { return SetupResult{ \
StoreStatus::IncorrectState, -1 }; }); }
if (path == nullptr || strlen(path) == 0) {
return std::async(std::launch::deferred, []() { return SetupResult{ \
StoreStatus::NoPathGiven, 0 }; }); @@ -97,7 +96,7 @@ KSecretsStore::SetupResult \
KSecretsStorePrivate::setup(const std::string& path, if (shouldCreateFile) {
auto createres = createFile(path);
if (createres != 0) {
- return setStoreStatus(KSecretsStore::SetupResult({ \
KSecretsStore::StoreStatus::SystemError, createres })); + return \
setStoreStatus(KSecretsStore::SetupResult(KSecretsStore::StoreStatus::SystemError, \
createres)); }
}
secretsFile_.setup(path, readOnly);
@@ -118,25 +117,16 @@ KSecretsStore::CredentialsResult \
KSecretsStorePrivate::setCredentials(const std: {
using Result = KSecretsStore::CredentialsResult;
if (!kss_init_gcry()) {
- return setStoreStatus(Result({ KSecretsStore::StoreStatus::CannotInitGcrypt, \
-1 })); + return \
setStoreStatus(Result(KSecretsStore::StoreStatus::CannotInitGcrypt, -1)); }
- // FIXME this should be adjusted on platforms where kernel keyring is not \
available and store the keys elsewhere
- char encryption_key[KSECRETS_KEYSIZE];
- char mac_key[KSECRETS_KEYSIZE];
- if (!kss_derive_keys(salt(), password.c_str(), encryption_key, mac_key, \
KSECRETS_KEYSIZE)) {
- return setStoreStatus(Result({ KSecretsStore::StoreStatus::CannotDeriveKeys, \
-1 })); + auto res = kss_set_credentials(password, salt());
+ if (-1 == res) {
+ return setStoreStatus(Result(KSecretsStore::StoreStatus::CannotDeriveKeys, \
res)); }
-
- if (!kss_store_keys(encryption_key, mac_key, KSECRETS_KEYSIZE)) {
- return setStoreStatus(Result({ KSecretsStore::StoreStatus::CannotStoreKeys, \
errno }));
- }
- return setStoreStatus(Result({ KSecretsStore::StoreStatus::CredentialsSet, 0 \
})); + return setStoreStatus(Result(KSecretsStore::StoreStatus::CredentialsSet, \
0)); }
-int KSecretsStorePrivate::createFile(const std::string& path)
-{
- return secretsFile_.create(path);
-}
+int KSecretsStorePrivate::createFile(const std::string& path) { return \
secretsFile_.create(path); }
bool KSecretsStore::isGood() const noexcept { return d->status_ == \
StoreStatus::Good; }
@@ -146,28 +136,33 @@ KSecretsStore::SetupResult KSecretsStorePrivate::open(bool \
lockFile) {
using OpenResult = KSecretsStore::SetupResult;
if (!secretsFile_.open()) {
- return setStoreStatus(OpenResult({ \
KSecretsStore::StoreStatus::CannotOpenFile, errno })); + return \
setStoreStatus(OpenResult(KSecretsStore::StoreStatus::CannotOpenFile, errno)); }
if (lockFile) {
if (!secretsFile_.lock()) {
- return setStoreStatus(OpenResult({ \
KSecretsStore::StoreStatus::CannotLockFile, errno })); + return \
setStoreStatus(OpenResult(KSecretsStore::StoreStatus::CannotLockFile, errno)); }
}
if (!secretsFile_.readHeader()) {
- return setStoreStatus(OpenResult({ \
KSecretsStore::StoreStatus::CannotReadFile, errno })); + return \
setStoreStatus(OpenResult(KSecretsStore::StoreStatus::CannotReadFile, errno)); }
if (!secretsFile_.checkMagic()) {
- return setStoreStatus(OpenResult({ KSecretsStore::StoreStatus::InvalidFile, \
-1 })); + return \
setStoreStatus(OpenResult(KSecretsStore::StoreStatus::InvalidFile, -1)); }
// TODO add here MAC integrity check
// decrypting will occur upon collection request
- return setStoreStatus(OpenResult({ KSecretsStore::StoreStatus::Good, 0 }));
+ return setStoreStatus(OpenResult(KSecretsStore::StoreStatus::Good, 0));
}
-KSecretsStore::DirCollectionsResult KSecretsStore::dirCollections() const noexcept
+KSecretsStore::DirCollectionsResult KSecretsStore::dirCollections() const noexcept { \
return d->dirCollections(); } +
+KSecretsStore::DirCollectionsResult KSecretsStorePrivate::dirCollections()
{
- // TODO
- return DirCollectionsResult();
+ KSecretsStore::DirCollectionsResult \
res(KSecretsStore::StoreStatus::InvalidFile); + auto dir = \
secretsFile_.dirCollections(); + if (dir.first) {
+ }
+ return res;
}
KSecretsStore::CreateCollectionResult KSecretsStore::createCollection(const char*) \
noexcept @@ -194,92 +189,110 @@ KSecretsStore::DeleteCollectionResult \
KSecretsStore::deleteCollection(const char return DeleteCollectionResult();
}
-std::time_t KSecretsStore::Collection::createdTime() const {
+std::time_t KSecretsStore::Collection::createdTime() const
+{
// TODO
return std::time_t();
}
-std::time_t KSecretsStore::Collection::modifiedTime() const {
- //TODO
+std::time_t KSecretsStore::Collection::modifiedTime() const
+{
+ // TODO
return std::time_t();
}
-std::string KSecretsStore::Collection::label() const {
+std::string KSecretsStore::Collection::label() const
+{
// TODO
return "";
}
-KSecretsStore::Collection::ItemList KSecretsStore::Collection::dirItems() const {
+KSecretsStore::Collection::ItemList KSecretsStore::Collection::dirItems() const
+{
// TODO
return ItemList();
}
-KSecretsStore::Collection::ItemList KSecretsStore::Collection::searchItems(const \
AttributesMap &) const { +KSecretsStore::Collection::ItemList \
KSecretsStore::Collection::searchItems(const AttributesMap&) const +{
// TODO
return ItemList();
}
-KSecretsStore::Collection::ItemList KSecretsStore::Collection::searchItems(const \
char*, const AttributesMap &) const { +KSecretsStore::Collection::ItemList \
KSecretsStore::Collection::searchItems(const char*, const AttributesMap&) const +{
// TODO
return ItemList();
}
-KSecretsStore::Collection::ItemList KSecretsStore::Collection::searchItems(const \
char*) const { +KSecretsStore::Collection::ItemList \
KSecretsStore::Collection::searchItems(const char*) const +{
// TODO
return ItemList();
}
-KSecretsStore::ItemPtr KSecretsStore::Collection::createItem(const char*, \
AttributesMap, ItemValue) { +KSecretsStore::ItemPtr \
KSecretsStore::Collection::createItem(const char*, AttributesMap, ItemValue) +{
// TODO
return ItemPtr();
}
-bool KSecretsStore::Collection::deleteItem(ItemPtr) {
+bool KSecretsStore::Collection::deleteItem(ItemPtr)
+{
// TODO
return false;
}
-KSecretsStore::ItemPtr KSecretsStore::Collection::createItem(const char*, ItemValue) \
{ +KSecretsStore::ItemPtr KSecretsStore::Collection::createItem(const char*, \
ItemValue) +{
// TODO
return ItemPtr();
}
-std::time_t KSecretsStore::Item::createdTime() const {
+std::time_t KSecretsStore::Item::createdTime() const
+{
// TODO
return std::time_t();
}
-std::time_t KSecretsStore::Item::modifiedTime() const {
+std::time_t KSecretsStore::Item::modifiedTime() const
+{
// TODO
return std::time_t();
}
-std::string KSecretsStore::Item::label() const {
+std::string KSecretsStore::Item::label() const
+{
// TODO
return "";
}
-bool KSecretsStore::Item::setLabel(const char*) {
+bool KSecretsStore::Item::setLabel(const char*)
+{
// TODO
return false;
}
-KSecretsStore::ItemValue KSecretsStore::Item::value() const {
+KSecretsStore::ItemValue KSecretsStore::Item::value() const
+{
// TODO
return ItemValue();
}
-bool KSecretsStore::Item::setValue(ItemValue) {
+bool KSecretsStore::Item::setValue(ItemValue)
+{
// TODO
return false;
}
-KSecretsStore::AttributesMap KSecretsStore::Item::attributes() const {
+KSecretsStore::AttributesMap KSecretsStore::Item::attributes() const
+{
// TODO
return AttributesMap();
}
-bool KSecretsStore::Item::setAttributes(AttributesMap) {
+bool KSecretsStore::Item::setAttributes(AttributesMap)
+{
// TODO
return false;
}
diff --git a/src/runtime/ksecrets_store/ksecrets_store.h \
b/src/runtime/ksecrets_store/ksecrets_store.h index 19b8632..6b899b0 100644
--- a/src/runtime/ksecrets_store/ksecrets_store.h
+++ b/src/runtime/ksecrets_store/ksecrets_store.h
@@ -81,7 +81,7 @@ public:
struct ItemValue {
std::string contentType;
std::vector<char> contents;
- bool operator == (const ItemValue& that) const noexcept { return contentType \
== that.contentType && contents == that.contents; } + bool operator==(const \
ItemValue& that) const noexcept { return contentType == that.contentType && contents \
== that.contents; } };
/* Holds a secret value.
@@ -231,18 +231,37 @@ public:
* issue of the respective API call.
*/
template <StoreStatus G> struct CallResult {
+ CallResult()
+ : status_(StoreStatus::SystemError)
+ , errno_(-1)
+ {
+ }
+ explicit CallResult(StoreStatus s, int err = -1)
+ : status_(s)
+ , errno_(err)
+ {
+ }
StoreStatus status_;
int errno_;
operator bool() const { return status_ == G; }
};
- template <typename T> struct AlwaysGoodPred { bool operator()(const T&) const \
noexcept { return true; }}; + template <typename T> struct AlwaysGoodPred {
+ bool operator()(const T&) const noexcept { return true; }
+ };
/**
* @brief Small structure returned by API calls that create things. It's \
possible to check the returned
* value by giving this template a custom OK_PRED of type equivalent to \
std::function<bool(const R&)>
*/
- template <StoreStatus G, typename R, typename OK_PRED = AlwaysGoodPred<R> >
- struct CallResultWithValue : public CallResult<G> {
+ template <StoreStatus G, typename R, typename OK_PRED = AlwaysGoodPred<R> > \
struct CallResultWithValue : public CallResult<G> { + CallResultWithValue()
+ : CallResult<G>()
+ {
+ }
+ explicit CallResultWithValue(StoreStatus s, int err = -1)
+ : CallResult<G>(s, err)
+ {
+ }
R result_;
operator bool() const noexcept { return CallResult<G>::operator bool() && \
OK_PRED()(result_); } };
@@ -277,7 +296,9 @@ public:
using DirCollectionsResult = CallResultWithValue<StoreStatus::Good, \
CollectionNames>; DirCollectionsResult dirCollections() const noexcept;
- template <typename P> struct IsGoodSmartPtr { bool operator()(const P& p) { \
return p.get() != nullptr; }}; + template <typename P> struct IsGoodSmartPtr {
+ bool operator()(const P& p) { return p.get() != nullptr; }
+ };
using CreateCollectionResult = CallResultWithValue<StoreStatus::Good, \
CollectionPtr, IsGoodSmartPtr<CollectionPtr> >; /**
* @return CollectionPtr which can empty if the call did not succeed
@@ -308,7 +329,9 @@ private:
std::unique_ptr<KSecretsStorePrivate> d;
};
-template <> struct KSecretsStore::AlwaysGoodPred<bool> { bool operator()(const bool& \
b) const noexcept { return b; }}; +template <> struct \
KSecretsStore::AlwaysGoodPred<bool> { + bool operator()(const bool& b) const \
noexcept { return b; } +};
#endif
// vim: tw=220:ts=4
diff --git a/src/runtime/ksecrets_store/ksecrets_store_p.h \
b/src/runtime/ksecrets_store/ksecrets_store_p.h index a7b10fd..8dee77c 100644
--- a/src/runtime/ksecrets_store/ksecrets_store_p.h
+++ b/src/runtime/ksecrets_store/ksecrets_store_p.h
@@ -59,13 +59,14 @@ public:
KSecretsStorePrivate() = delete;
explicit KSecretsStorePrivate(KSecretsStore*);
- KSecretsStore::SetupResult setup(const std::string& path, bool, bool);
- KSecretsStore::CredentialsResult setCredentials(const std::string&);
- KSecretsStore::SetupResult open(bool);
- int createFile(const std::string&);
- const char* salt() const;
-
- template <typename S> S setStoreStatus(S s)
+ KSecretsStore::SetupResult setup(const std::string& path, bool, bool) noexcept;
+ KSecretsStore::CredentialsResult setCredentials(const std::string&) noexcept;
+ KSecretsStore::SetupResult open(bool) noexcept;
+ int createFile(const std::string&) noexcept;
+ const char* salt() const noexcept;
+ KSecretsStore::DirCollectionsResult dirCollections() noexcept;
+
+ template <typename S> S setStoreStatus(S s) noexcept
{
status_ = s.status_;
return s;
[prev in list] [next in list] [prev in thread] [next in thread]
Configure |
About |
News |
Add a list |
Sponsored by KoreLogic