[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