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/runt= ime/ksecrets_store/ksecrets_file.h - 053% similarity] C +34 -31 src/runtime/ksecrets_store/ksecrets_data.h [from: src/runtim= e/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/ks= ecrets_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 #include +#include = extern "C" { #include @@ -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 c= har* 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 =3D kss_derive_keys(salt, password.c_str(), encryption_key, m= ac_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 =3D request_key("user", keyName, 0, KEY_SPEC_SESSION_KEYRING); + if (-1 =3D=3D key) { + syslog(KSS_LOG_DEBUG, "request_key failed with errno %d (%m) when = reading MAC key %s", errno, keyName); + return -1; + } + auto bytes =3D keyctl_read(key, buffer, bufferSize); + if (bytes =3D=3D -1) { + syslog(KSS_LOG_ERR, "error reading key %s contents from the keyrin= g", 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/ksecr= ets_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 - -class KSecretsFile { -public: - KSecretsFile(); - ~KSecretsFile(); - - constexpr static auto IV_SIZE =3D 32; - constexpr static auto SALT_SIZE =3D 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=3D220:ts=3D4 +#include "ksecrets_data.h" +#include "ksecrets_file.h" + +#include + +SecretsEntity::SecretsEntity() + : size_(0) + , state_(Empty) + , encrypted_(nullptr) + , unencrypted_(nullptr) +{ +} +SecretsEntity::~SecretsEntity() +{ + if (encrypted_) { + ::free(encrypted_); + encrypted_ =3D nullptr; + } + if (unencrypted_) { + ::free(unencrypted_); + unencrypted_ =3D nullptr; + } +} +bool SecretsEntity::read(KSecretsFile& file) +{ + if (!file.read(size_)) { + return false; + } + + encrypted_ =3D ::malloc(res); + if (encrypted_ =3D=3D nullptr) { + return false; + } +} diff --git a/src/runtime/ksecrets_store/ksecrets_file.h b/src/runtime/ksecr= ets_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 - -class KSecretsFile { -public: - KSecretsFile(); - ~KSecretsFile(); - - constexpr static auto IV_SIZE =3D 32; - constexpr static auto SALT_SIZE =3D 56; - struct FileHeadStruct { - char magic[9]; - char salt[SALT_SIZE]; - char iv[IV_SIZE]; +#ifndef KSECRETS_DATA_H +#define KSECRETS_DATA_H + +#include +#include + +class KSecretsFile; + +struct SecretsEntity { + SecretsEntity(); + SecretsEntity(const SecretsEntity&) =3D delete; + SecretsEntity(SecretsEntity&&) =3D delete; + virtual ~SecretsEntity(); + + enum class State: std::uint8_t { + Empty =3D 0, + Encrypted =3D 0x01, + Decrypted =3D 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=3D220:ts=3D4 diff --git a/src/runtime/ksecrets_store/ksecrets_file.cpp b/src/runtime/kse= crets_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 =3D sizeof(fileMagic) / sizeo= f(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 =3D 0; if (fwrite(&emptyFileData, 1, sizeof(emptyFileData), f) !=3D sizeof(em= ptyFileData)) { @@ -95,13 +96,51 @@ bool KSecretsFile::lock() locked_ =3D true; } = -bool KSecretsFile::readHeader() { return read(file_, &fileHead_, sizeof(fi= leHead_)) =3D=3D sizeof(fileHead_); } +bool KSecretsFile::readHeader() +{ + auto rres =3D ::read(file_, &fileHead_, sizeof(fileHead_)); + char dummyBuffer[4]; + auto bytes =3D sizeof(dummyBuffer) / sizeof(dummyBuffer[0]); + auto eoftest =3D ::read(file_, dummyBuffer, bytes); + if (eoftest =3D=3D 0) { + // we are at EOF already, so file is empty + empty_ =3D true; + } + else { + if (-1 =3D=3D lseek(file_, -bytes, SEEK_CUR)) { + setFailState(errno); + return false; + } + empty_ =3D false; + } + return rres =3D=3D sizeof(fileHead_); +} = bool KSecretsFile::checkMagic() { - if (memcmp(fileHead_.magic, fileMagic, fileMagicLen) !=3D 0) { + if (memcmp(fileHead_.magic_, fileMagic, fileMagicLen) !=3D 0) { return false; } return true; } + +int KSecretsFile::checkMAC() const +{ + if (empty_) + return 0; // MAC of empty files is always OK + // const char *macKey =3D kss_read_mac_key(); + // gcry_error_t err; + // gcry_mac_hd_t hd; + // err =3D gcry_mac_open(&hd, GCRY_MAC_HMAC_SHA512, 0, NULL); + // if (!err) return gcry_err_code_to_errno(gcry_err_code(err)); + // + // err =3D gcry_mac_setkey(hd, ); + // TODO + return -1; +} + +KSecretsFile::DirCollectionResult KSecretsFile::dirCollections() { + return DirCollectionResult(); +} + // vim: tw=3D220:ts=3D4 diff --git a/src/runtime/ksecrets_store/ksecrets_file.h b/src/runtime/ksecr= ets_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 +#include = class KSecretsFile { public: @@ -31,25 +34,42 @@ public: constexpr static auto IV_SIZE =3D 32; constexpr static auto SALT_SIZE =3D 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 =3D std::pair; + DirCollectionResult dirCollections() noexcept; = private: + bool setFailState(int err, bool retval =3D false) + { + errno_ =3D err; + return retval; // wo do like this so this function could end other= methods with an elegant return setFailState(errno); + } + using Entities =3D std::list; + 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/ks= ecrets_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 #include @@ -32,16 +34,13 @@ #define GCRPYT_NO_DEPRECATED #include = -#define KSECRETS_SALTSIZE 56 -#define KSECRETS_KEYSIZE 256 #define KSS_LOG_ERR (LOG_AUTH | LOG_ERR) = const char* keyNameEncrypting =3D nullptr; const char* keyNameMac =3D nullptr; = bool kss_init_gcry(); -bool kss_derive_keys(const char* salt, const char* password, char* encrypt= ion_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::se= tup(const char* path, b { // sanity checks if (d->status_ !=3D 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 =3D=3D nullptr || strlen(path) =3D=3D 0) { return std::async(std::launch::deferred, []() { return SetupResult= { StoreStatus::NoPathGiven, 0 }; }); @@ -97,7 +96,7 @@ KSecretsStore::SetupResult KSecretsStorePrivate::setup(co= nst std::string& path, if (shouldCreateFile) { auto createres =3D createFile(path); if (createres !=3D 0) { - return setStoreStatus(KSecretsStore::SetupResult({ KSecretsSto= re::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 =3D KSecretsStore::CredentialsResult; if (!kss_init_gcry()) { - return setStoreStatus(Result({ KSecretsStore::StoreStatus::CannotI= nitGcrypt, -1 })); + return setStoreStatus(Result(KSecretsStore::StoreStatus::CannotIni= tGcrypt, -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::CannotD= eriveKeys, -1 })); + auto res =3D kss_set_credentials(password, salt()); + if (-1 =3D=3D res) { + return setStoreStatus(Result(KSecretsStore::StoreStatus::CannotDer= iveKeys, res)); } - - if (!kss_store_keys(encryption_key, mac_key, KSECRETS_KEYSIZE)) { - return setStoreStatus(Result({ KSecretsStore::StoreStatus::CannotS= toreKeys, errno })); - } - return setStoreStatus(Result({ KSecretsStore::StoreStatus::Credentials= Set, 0 })); + return setStoreStatus(Result(KSecretsStore::StoreStatus::CredentialsSe= t, 0)); } = -int KSecretsStorePrivate::createFile(const std::string& path) -{ - return secretsFile_.create(path); -} +int KSecretsStorePrivate::createFile(const std::string& path) { return sec= retsFile_.create(path); } = bool KSecretsStore::isGood() const noexcept { return d->status_ =3D=3D Sto= reStatus::Good; } = @@ -146,28 +136,33 @@ KSecretsStore::SetupResult KSecretsStorePrivate::open= (bool lockFile) { using OpenResult =3D KSecretsStore::SetupResult; if (!secretsFile_.open()) { - return setStoreStatus(OpenResult({ KSecretsStore::StoreStatus::Can= notOpenFile, errno })); + return setStoreStatus(OpenResult(KSecretsStore::StoreStatus::Canno= tOpenFile, errno)); } if (lockFile) { if (!secretsFile_.lock()) { - return setStoreStatus(OpenResult({ KSecretsStore::StoreStatus:= :CannotLockFile, errno })); + return setStoreStatus(OpenResult(KSecretsStore::StoreStatus::C= annotLockFile, errno)); } } if (!secretsFile_.readHeader()) { - return setStoreStatus(OpenResult({ KSecretsStore::StoreStatus::Can= notReadFile, errno })); + return setStoreStatus(OpenResult(KSecretsStore::StoreStatus::Canno= tReadFile, errno)); } if (!secretsFile_.checkMagic()) { - return setStoreStatus(OpenResult({ KSecretsStore::StoreStatus::Inv= alidFile, -1 })); + return setStoreStatus(OpenResult(KSecretsStore::StoreStatus::Inval= idFile, -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::In= validFile); + auto dir =3D secretsFile_.dirCollections(); + if (dir.first) { + } + return res; } = KSecretsStore::CreateCollectionResult KSecretsStore::createCollection(cons= t 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/ksec= rets_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 contents; - bool operator =3D=3D (const ItemValue& that) const noexcept { retu= rn contentType =3D=3D that.contentType && contents =3D=3D that.contents; } + bool operator=3D=3D(const ItemValue& that) const noexcept { return= contentType =3D=3D that.contentType && contents =3D=3D that.contents; } }; = /* Holds a secret value. @@ -231,18 +231,37 @@ public: * issue of the respective API call. */ template struct CallResult { + CallResult() + : status_(StoreStatus::SystemError) + , errno_(-1) + { + } + explicit CallResult(StoreStatus s, int err =3D -1) + : status_(s) + , errno_(err) + { + } StoreStatus status_; int errno_; operator bool() const { return status_ =3D=3D G; } }; = - template struct AlwaysGoodPred { bool operator()(const T&= ) const noexcept { return true; }}; + template 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 equiv= alent to std::function */ - template > - struct CallResultWithValue : public CallResult { + template > struct CallResultWithValue : public CallResult { + CallResultWithValue() + : CallResult() + { + } + explicit CallResultWithValue(StoreStatus s, int err =3D -1) + : CallResult(s, err) + { + } R result_; operator bool() const noexcept { return CallResult::operator bo= ol() && OK_PRED()(result_); } }; @@ -277,7 +296,9 @@ public: using DirCollectionsResult =3D CallResultWithValue; DirCollectionsResult dirCollections() const noexcept; = - template struct IsGoodSmartPtr { bool operator()(const P&= p) { return p.get() !=3D nullptr; }}; + template struct IsGoodSmartPtr { + bool operator()(const P& p) { return p.get() !=3D nullptr; } + }; using CreateCollectionResult =3D CallResultWithValue >; /** * @return CollectionPtr which can empty if the call did not succeed @@ -308,7 +329,9 @@ private: std::unique_ptr d; }; = -template <> struct KSecretsStore::AlwaysGoodPred { bool operator()(c= onst bool& b) const noexcept { return b; }}; +template <> struct KSecretsStore::AlwaysGoodPred { + bool operator()(const bool& b) const noexcept { return b; } +}; = #endif // vim: tw=3D220:ts=3D4 diff --git a/src/runtime/ksecrets_store/ksecrets_store_p.h b/src/runtime/ks= ecrets_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() =3D 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 S setStoreStatus(S s) + KSecretsStore::SetupResult setup(const std::string& path, bool, bool) = noexcept; + KSecretsStore::CredentialsResult setCredentials(const std::string&) no= except; + KSecretsStore::SetupResult open(bool) noexcept; + int createFile(const std::string&) noexcept; + const char* salt() const noexcept; + KSecretsStore::DirCollectionsResult dirCollections() noexcept; + + template S setStoreStatus(S s) noexcept { status_ =3D s.status_; return s;