From b0356a5f657d272ad48f5565d0a83b4f831cd1bd Mon Sep 17 00:00:00 2001 From: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com> Date: Thu, 16 Apr 2015 17:40:02 -0400 Subject: [PATCH] certificate: Listen to the new daemon certificate store Please note that the API will break again before the next release Refs #70829 --- src/certificate.cpp | 53 ++++++++++++++++++++++++++++- src/certificate.h | 10 ++++++ src/certificatemodel.cpp | 20 +++++++++-- src/certificatemodel.h | 2 ++ src/daemoncertificatecollection.cpp | 47 ++++++++++++++++++++----- 5 files changed, 120 insertions(+), 12 deletions(-) diff --git a/src/certificate.cpp b/src/certificate.cpp index 8909baa5..c53a49b7 100644 --- a/src/certificate.cpp +++ b/src/certificate.cpp @@ -87,7 +87,8 @@ public: */ enum class LoadingType { FROM_PATH, - FROM_CONTENT + FROM_CONTENT, + FROM_ID }; class CertificatePrivate @@ -105,6 +106,7 @@ public: Certificate::Type m_Type ; QByteArray m_Content ; LoadingType m_LoadingType; + QByteArray m_Id ; mutable DetailsCache* m_pDetailsCache; mutable ChecksCache* m_pCheckCache ; @@ -293,6 +295,9 @@ void CertificatePrivate::loadDetails() case LoadingType::FROM_CONTENT: d = DBus::ConfigurationManager::instance().getCertificateDetailsRaw(m_Content); break; + case LoadingType::FROM_ID: + d = DBus::ConfigurationManager::instance().getCertificateDetails(m_Id); + break; } m_pDetailsCache = new DetailsCache(d); } @@ -309,6 +314,9 @@ void CertificatePrivate::loadChecks() case LoadingType::FROM_CONTENT: checks = DBus::ConfigurationManager::instance().validateCertificateRaw(QString(),m_Content); break; + case LoadingType::FROM_ID: + checks = DBus::ConfigurationManager::instance().validateCertificate(QString(),m_Id,QString()); + break; } m_pCheckCache = new ChecksCache(checks); } @@ -321,6 +329,11 @@ Certificate::Certificate(const QUrl& path, Type type, const QUrl& privateKey) : d_ptr->m_Type = type; } +Certificate::Certificate(const QString& id) : ItemBase<QObject>(CertificateModel::instance()),d_ptr(new CertificatePrivate(LoadingType::FROM_ID)) +{ + d_ptr->m_Id = id.toLatin1(); +} + Certificate::Certificate(const QByteArray& content, Type type): ItemBase<QObject>(CertificateModel::instance()),d_ptr(new CertificatePrivate(LoadingType::FROM_CONTENT)) { d_ptr->m_Content = content; @@ -332,6 +345,44 @@ Certificate::~Certificate() } +bool Certificate::hasRemote() const +{ + return ! d_ptr->m_Id.isEmpty(); +} + +QByteArray Certificate::remoteId() const +{ + return d_ptr->m_Id; +} + +/** + * Register this certificate in the daemon + */ +bool Certificate::pin() +{ + if (hasRemote()) + return true; + + switch(d_ptr->m_LoadingType) { + case LoadingType::FROM_PATH: + DBus::ConfigurationManager::instance().addCertificate(d_ptr->m_Id); //FIXME wrong function, wait for daemon implementation + break; + case LoadingType::FROM_CONTENT: + DBus::ConfigurationManager::instance().addCertificate(d_ptr->m_Path.toString().toLatin1()); + break; + case LoadingType::FROM_ID: +// return DBus::ConfigurationManager::instance().addCertificateRemote(d_ptr->m_Id); //FIXME + break; + } + //TODO use the new pinning API + return false; +} + +bool Certificate::unpin() const +{ + return false;//TODO +} + QString Certificate::getName(Certificate::Checks check) { return CertificatePrivate::m_slChecksName[check]; diff --git a/src/certificate.h b/src/certificate.h index 7ae7e8f5..3637232f 100644 --- a/src/certificate.h +++ b/src/certificate.h @@ -60,6 +60,9 @@ public: Q_PROPERTY(CheckValues authorityMatch READ authorityMatch ) Q_PROPERTY(CheckValues hasExpectedOwner READ hasExpectedOwner ) Q_PROPERTY(bool isActivated READ isActivated ) + Q_PROPERTY(bool hasRemote READ hasRemote ) + Q_PROPERTY(QByteArray remoteId READ remoteId ) + Q_PROPERTY(QUrl path READ path WRITE setPath ) Q_PROPERTY(QDateTime expirationDate READ expirationDate ) Q_PROPERTY(QDateTime activationDate READ activationDate ) @@ -204,6 +207,8 @@ public: QVariant detailResult ( Certificate::Details detail ) const; QAbstractItemModel* model ( ) const; QAbstractItemModel* checksModel ( ) const; + bool hasRemote ( ) const; + QByteArray remoteId ( ) const; static QString getName (Certificate::Checks check ); static QString getName (Certificate::Details details ); @@ -257,8 +262,13 @@ public: //Setter void setPath(const QUrl& path); + //Mutator + Q_INVOKABLE bool pin(); + Q_INVOKABLE bool unpin() const; + private: explicit Certificate(const QUrl& path, Type type = Type::NONE, const QUrl& privateKey = QUrl()); + Certificate(const QString& id); Certificate(const QByteArray& content, Type type = Type::CALL); virtual ~Certificate(); CertificatePrivate* d_ptr; diff --git a/src/certificatemodel.cpp b/src/certificatemodel.cpp index 8f9c05e6..33a75990 100644 --- a/src/certificatemodel.cpp +++ b/src/certificatemodel.cpp @@ -468,9 +468,9 @@ Certificate* CertificateModel::getCertificate(const QUrl& path, Account* a) Certificate* CertificateModel::getCertificate(const QUrl& path, Certificate::Type type) { Q_UNUSED(type) - const QString p = path.path(); + const QString id = path.path(); - Certificate* cert = d_ptr->m_hCertificates[p]; + Certificate* cert = d_ptr->m_hCertificates[id]; //The certificate is not loaded yet if (!cert) { @@ -484,6 +484,22 @@ Certificate* CertificateModel::getCertificate(const QUrl& path, Certificate::Typ return cert; } +Certificate* CertificateModel::getCertificateFromId(const QString& id) +{ + Certificate* cert = d_ptr->m_hCertificates[id]; + + //The certificate is not loaded yet + if (!cert) { + cert = new Certificate(id); + d_ptr->m_hCertificates[id.toLatin1()] = cert; + + //Add it to the model + d_ptr->addToTree(cert); + } + + return cert; +} + //TODO Make this private Certificate* CertificateModel::getCertificateFromContent(const QByteArray& rawContent, Account* a, bool save, const QString& category) { diff --git a/src/certificatemodel.h b/src/certificatemodel.h index ad29b7d7..d0f33887 100644 --- a/src/certificatemodel.h +++ b/src/certificatemodel.h @@ -32,6 +32,7 @@ class LIB_EXPORT CertificateModel : public QAbstractItemModel, public Collection public: friend class CertificateProxyModel; friend class CertificateNode; + friend class DaemonCertificateCollectionPrivate; enum class Role { NodeType = 100, @@ -85,6 +86,7 @@ public: static CertificateModel* instance(); private: + Certificate* getCertificateFromId(const QString& id); //Backend interface virtual void collectionAddedCallback(CollectionInterface* collection) override; diff --git a/src/daemoncertificatecollection.cpp b/src/daemoncertificatecollection.cpp index 7b8ab240..ac7f3da6 100644 --- a/src/daemoncertificatecollection.cpp +++ b/src/daemoncertificatecollection.cpp @@ -19,6 +19,7 @@ //Ring #include "certificate.h" +#include "certificatemodel.h" //Dring #include "dbus/configurationmanager.h" @@ -41,15 +42,31 @@ private: virtual QVector<Certificate*> items() const override; }; -class DaemonCertificateCollectionPrivate +class DaemonCertificateCollectionPrivate : public QObject { + Q_OBJECT public: + DaemonCertificateCollectionPrivate(DaemonCertificateCollection* parent); + + //Attributes + DaemonCertificateCollection* q_ptr; + +public Q_SLOTS: + void slotCertificateAdded(const QString& id); + void slotCertificateExpired(const QString& id); }; +DaemonCertificateCollectionPrivate::DaemonCertificateCollectionPrivate(DaemonCertificateCollection* parent) : QObject(), q_ptr(parent) +{ + ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance(); + connect(&configurationManager,&ConfigurationManagerInterface::certificateAdded ,this,&DaemonCertificateCollectionPrivate::slotCertificateAdded ); + connect(&configurationManager,&ConfigurationManagerInterface::certificateExpired,this,&DaemonCertificateCollectionPrivate::slotCertificateExpired); +} + DaemonCertificateCollection::DaemonCertificateCollection(CollectionMediator<Certificate>* mediator, const QString& path) : -CollectionInterface(new DaemonCertificateEditor(mediator,path),nullptr),d_ptr(new DaemonCertificateCollectionPrivate()) +CollectionInterface(new DaemonCertificateEditor(mediator,path),nullptr),d_ptr(new DaemonCertificateCollectionPrivate(this)) { - + } DaemonCertificateCollection::~DaemonCertificateCollection() @@ -57,6 +74,18 @@ DaemonCertificateCollection::~DaemonCertificateCollection() delete d_ptr; } +void DaemonCertificateCollectionPrivate::slotCertificateAdded(const QString& id) +{ + qDebug() << "\n\nCERTIFICATE ADDED" << id; + Certificate* cert = CertificateModel::instance()->getCertificateFromId(id); + q_ptr->editor<Certificate>()->addExisting(cert); +} + +void DaemonCertificateCollectionPrivate::slotCertificateExpired(const QString& id) +{ + qDebug() << "\n\nCERTIFICATE EXPIRED" << id; +} + bool DaemonCertificateCollection::load() { ConfigurationManagerInterface& configurationManager = DBus::ConfigurationManager::instance(); @@ -76,7 +105,7 @@ bool DaemonCertificateCollection::clear() QString DaemonCertificateCollection::name() const { - return QObject::tr("Local certificate store"); + return QObject::tr("Ring certificate store"); } QString DaemonCertificateCollection::category() const @@ -104,10 +133,8 @@ FlagPack<CollectionInterface::SupportedFeatures> DaemonCertificateCollection::su return CollectionInterface::SupportedFeatures::NONE | CollectionInterface::SupportedFeatures::LOAD | - CollectionInterface::SupportedFeatures::CLEAR | CollectionInterface::SupportedFeatures::REMOVE | - CollectionInterface::SupportedFeatures::LISTABLE | - CollectionInterface::SupportedFeatures::ADD ; + CollectionInterface::SupportedFeatures::LISTABLE ; } @@ -130,8 +157,7 @@ bool DaemonCertificateEditor::save( const Certificate* item) bool DaemonCertificateEditor::remove( const Certificate* item) { - Q_UNUSED(item) - return false; + return item->unpin(); } bool DaemonCertificateEditor::edit( Certificate* item) @@ -149,6 +175,7 @@ bool DaemonCertificateEditor::addNew( const Certificate* item) bool DaemonCertificateEditor::addExisting( const Certificate* item) { Q_UNUSED(item) + m_lItems << const_cast<Certificate*>(item); return false; } @@ -156,3 +183,5 @@ QVector<Certificate*> DaemonCertificateEditor::items() const { return m_lItems; } + +#include <daemoncertificatecollection.moc> -- GitLab