diff --git a/src/certificate.cpp b/src/certificate.cpp index 8909baa5e07982d2824d466e451b86107df4e66d..c53a49b72f9de2c271eeeec6a4684364d8bf63f9 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 7ae7e8f566d6a5a0fe537260ef54aa75a3a0104f..3637232f54c91dfbe85363930aeee8a407dfbd10 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 8f9c05e63113fdf827d238d7a6759bea54e02ded..33a759902352556606e029ffb056500b00b1a628 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 ad29b7d77e6037034153ac41f7d33c05039c1f5b..d0f33887c3529ae6c9f1a47bd44c1b6b6259073b 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 7b8ab240ce6a4fd86b57abdbb3f81bfc13cdd106..ac7f3da61a453995c7277d909b190572afe98405 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>