From c5d1fa66cb80a6aee627b1e5aa08ee7663779656 Mon Sep 17 00:00:00 2001
From: Emmanuel Lepage Vallee <emmanuel.lepage@savoirfairelinux.com>
Date: Thu, 23 Apr 2015 18:18:23 -0400
Subject: [PATCH] api: Bump Daemon API

Refs #68196
---
 src/call.cpp                              |  17 +-
 src/qtwrapper/configurationmanager_wrap.h | 104 ++++++++---
 xml/configurationmanager-introspec.xml    | 216 +++++++++++++++++++++-
 3 files changed, 299 insertions(+), 38 deletions(-)

diff --git a/src/call.cpp b/src/call.cpp
index d131ca30..09d977ae 100644
--- a/src/call.cpp
+++ b/src/call.cpp
@@ -30,6 +30,7 @@
 
 //DRing
 #include <account_const.h>
+#include <security_const.h>
 #include <call_const.h>
 
 //Ring library
@@ -345,8 +346,8 @@ Call* CallPrivate::buildExistingCall(const QString& callId)
    }
 
    //Load the certificate if it's now available
-   if (!call->certificate() && !details[DRing::Call::Details::TLS_PEER_CERT].isEmpty()) {
-      call->d_ptr->m_pCertificate = CertificateModel::instance()->getCertificateFromContent(details[DRing::Call::Details::TLS_PEER_CERT].toLatin1(),call->account());
+   if (!call->certificate() && !details[DRing::TlsTransport::TLS_PEER_CERT].isEmpty()) {
+      call->d_ptr->m_pCertificate = CertificateModel::instance()->getCertificateFromContent(details[DRing::TlsTransport::TLS_PEER_CERT].toLatin1(),call->account());
    }
 
    return call;
@@ -390,8 +391,8 @@ Call* CallPrivate::buildIncomingCall(const QString& callId)
    }
 
    //Load the certificate if it's now available
-   if (!call->certificate() && !details[DRing::Call::Details::TLS_PEER_CERT].isEmpty()) {
-      call->d_ptr->m_pCertificate = CertificateModel::instance()->getCertificateFromContent(details[DRing::Call::Details::TLS_PEER_CERT].toLatin1(),call->account());
+   if (!call->certificate() && !details[DRing::TlsTransport::TLS_PEER_CERT].isEmpty()) {
+      call->d_ptr->m_pCertificate = CertificateModel::instance()->getCertificateFromContent(details[DRing::TlsTransport::TLS_PEER_CERT].toLatin1(),call->account());
    }
 
    return call;
@@ -424,8 +425,8 @@ Call* CallPrivate::buildRingingCall(const QString & callId)
    }
 
    //Load the certificate if it's now available
-   if (!call->certificate() && !details[DRing::Call::Details::TLS_PEER_CERT].isEmpty()) {
-      call->d_ptr->m_pCertificate = CertificateModel::instance()->getCertificateFromContent(details[DRing::Call::Details::TLS_PEER_CERT].toLatin1(),call->account());
+   if (!call->certificate() && !details[DRing::TlsTransport::TLS_PEER_CERT].isEmpty()) {
+      call->d_ptr->m_pCertificate = CertificateModel::instance()->getCertificateFromContent(details[DRing::TlsTransport::TLS_PEER_CERT].toLatin1(),call->account());
    }
 
    return call;
@@ -1003,8 +1004,8 @@ Call::State CallPrivate::stateChanged(const QString& newStateName)
          m_PeerName = details[CallPrivate::DetailsMapFields::PEER_NAME];
 
       //Load the certificate if it's now available
-      if (!q_ptr->certificate() && !details[DRing::Call::Details::TLS_PEER_CERT].isEmpty()) {
-         m_pCertificate = CertificateModel::instance()->getCertificateFromContent(details[DRing::Call::Details::TLS_PEER_CERT].toLatin1(),q_ptr->account());
+      if (!q_ptr->certificate() && !details[DRing::TlsTransport::TLS_PEER_CERT].isEmpty()) {
+         m_pCertificate = CertificateModel::instance()->getCertificateFromContent(details[DRing::TlsTransport::TLS_PEER_CERT].toLatin1(),q_ptr->account());
       }
 
       try {
diff --git a/src/qtwrapper/configurationmanager_wrap.h b/src/qtwrapper/configurationmanager_wrap.h
index 8cf416f9..d74a3db8 100644
--- a/src/qtwrapper/configurationmanager_wrap.h
+++ b/src/qtwrapper/configurationmanager_wrap.h
@@ -97,18 +97,33 @@ public:
                         Q_EMIT this->errorAlert(code);
                      });
          }),
-         exportable_callback<ConfigurationSignal::CertificateAdded>(
+         exportable_callback<ConfigurationSignal::CertificateExpired>(
                [this] (const std::string &certId) {
                      QTimer::singleShot(0, [this, certId] {
-                           Q_EMIT this->certificateAdded(QString(certId.c_str()));
+                           Q_EMIT this->certificateExpired(QString(certId.c_str()));
                      });
          }),
-         exportable_callback<ConfigurationSignal::CertificateExpired>(
+
+         exportable_callback<ConfigurationSignal::CertificatePinned>(
                [this] (const std::string &certId) {
                      QTimer::singleShot(0, [this, certId] {
-                           Q_EMIT this->certificateExpired(QString(certId.c_str()));
+                           Q_EMIT this->certificatePinned(QString(certId.c_str()));
+                     });
+         }),
+
+         exportable_callback<ConfigurationSignal::CertificatePathPinned>(
+               [this] (const std::string &certPath, const std::vector<std::string>& list) {
+                     QTimer::singleShot(0, [this, certPath, list] {
+                           Q_EMIT this->certificatePathPinned(QString(certPath.c_str()),convertStringList(list));
+                     });
+         }),
+
+         exportable_callback<ConfigurationSignal::IncomingTrustRequest>(
+               [this] (const std::string &accountId, const std::string &certId, time_t timestamp) {
+                     QTimer::singleShot(0, [this, certId,accountId,timestamp] {
+                           Q_EMIT this->incomingTrustRequest(QString(accountId.c_str()), QString(certId.c_str()), timestamp);
                      });
-         })
+         }),
       };
    }
 
@@ -301,13 +316,6 @@ public Q_SLOTS: // METHODS
       return temp;
    }
 
-   MapStringString getTlsSettings()
-   {
-      MapStringString temp =
-         convertMap(DRing::getTlsSettings());
-      return temp;
-   }
-
    MapStringString validateCertificate(const QString& unused, const QString certificate, const QString& privateKey)
    {
       MapStringString temp =
@@ -501,11 +509,6 @@ public Q_SLOTS: // METHODS
       DRing::setShortcuts(convertMap(shortcutsMap));
    }
 
-   void setTlsSettings(MapStringString details)
-   {
-      DRing::setTlsSettings(convertMap(details));
-   }
-
    void setVolume(const QString &device, double value)
    {
       DRing::setVolume(device.toStdString(), value);
@@ -517,27 +520,70 @@ public Q_SLOTS: // METHODS
       return temp;
    }
 
-   QStringList getCertificateList()
+   QStringList getPinnedCertificates()
+   {
+      QStringList temp =
+         convertStringList(DRing::getPinnedCertificates());
+      return temp;
+   }
+
+   QString pinCertificate(const QByteArray& content, bool local)
+   {
+      std::vector<unsigned char> raw(content.begin(), content.end());
+      return QString(DRing::pinCertificate(raw,local).c_str());
+   }
+
+   bool unpinCertificate(const QString& certId)
+   {
+      return DRing::unpinCertificate(certId.toStdString());
+   }
+
+   void pinCertificatePath(const QString& certPath)
+   {
+      DRing::pinCertificatePath(certPath.toStdString());
+   }
+
+   uint unpinCertificatePath(const QString& certPath)
+   {
+      return DRing::unpinCertificatePath(certPath.toStdString());
+   }
+
+   bool pinRemoteCertificate(const QString& accountId, const QString& certPath)
+   {
+      return DRing::pinRemoteCertificate(accountId.toStdString(), certPath.toStdString());
+   }
+
+   bool setCertificateStatus(const QString& accountId, const QString& certPath, const QString& status)
+   {
+      return DRing::setCertificateStatus(accountId.toStdString(), certPath.toStdString(), status.toStdString());
+   }
+
+   QStringList getCertificatesByStatus(const QString& accountId, const QString& certPath)
+   {
+      return convertStringList(DRing::getCertificatesByStatus(accountId.toStdString(), certPath.toStdString()));
+   }
+
+   MapStringString getTrustRequests(const QString& accountId)
    {
-      return convertStringList(DRing::getCertificateList());
+      return convertMap(DRing::getTrustRequests(accountId.toStdString()));
    }
 
-   QString addCertificate(const QByteArray& raw)
+   bool acceptTrustRequest(const QString& accountId, const QString& from)
    {
-      const std::vector<unsigned char> r(raw.begin(), raw.end());
-      return DRing::addCertificate(r).c_str();
+      return DRing::acceptTrustRequest(accountId.toStdString(), from.toStdString());
    }
 
-   bool addCertificateRemote(const QString& accountId, const QString& certificateId)
+   bool discardTrustRequest(const QString& accountId, const QString& from)
    {
-      return DRing::addCertificateRemote(accountId.toStdString(), certificateId.toStdString());
+      return DRing::discardTrustRequest(accountId.toStdString(), from.toStdString());
    }
 
-   bool banCertificate(const QString& id)
+   void sendTrustRequest(const QString& accountId, const QString& from)
    {
-      return DRing::banCertificate(id.toStdString());
+      DRing::sendTrustRequest(accountId.toStdString(), from.toStdString());
    }
 
+
 Q_SIGNALS: // SIGNALS
    void volumeChanged(const QString &device, double value);
    void accountsChanged();
@@ -547,8 +593,10 @@ Q_SIGNALS: // SIGNALS
    void stunStatusSuccess(const QString &message);
    void errorAlert(int code);
    void volatileAccountDetailsChanged(const QString &accountID, MapStringString details);
-   void certificateAdded(const QString& cert);
-   void certificateExpired(const QString& cert);
+   void certificatePinned(const QString& certId);
+   void certificatePathPinned(const QString& path, const QStringList& certIds);
+   void certificateExpired(const QString& certId);
+   void incomingTrustRequest(const QString& accountId, const QString& from, qulonglong timeStamp);
 
 };
 
diff --git a/xml/configurationmanager-introspec.xml b/xml/configurationmanager-introspec.xml
index 4b6cd1b9..daaf25e1 100644
--- a/xml/configurationmanager-introspec.xml
+++ b/xml/configurationmanager-introspec.xml
@@ -237,7 +237,6 @@
        </method>
 
       <method name="sendTextMessage" tp:name-for-bindings="sendTextMessage">
-          <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/>
           <arg type="s" name="accountID" direction="in">
           </arg>
           <arg type="s" name="to" direction="in">
@@ -256,7 +255,7 @@
            </arg>
            <arg type="s" name="message">
            </arg>
-       </signal>
+      </signal>
 
        <method name="setVolume" tp:name-for-bindings="setVolume">
            <tp:docstring>
@@ -702,6 +701,219 @@
            </arg>
        </method>
 
+       <method name="getPinnedCertificates" tp:name-for-bindings="getPinnedCertificates">
+           <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/>
+           <arg type="as" name="certIds" direction="out">
+              <tp:docstring>
+               <p>A list of all known certificate IDs</p>
+              </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="pinCertificate" tp:name-for-bindings="pinCertificate">
+           <arg type="ay" name="certificateRaw" direction="in">
+              <tp:docstring>
+               <p>A raw certificate (PEM or DER encoded) to be pinned.</p>
+              </tp:docstring>
+           </arg>
+           <arg type="b" name="local" direction="in">
+              <tp:docstring>
+               <p>True to save the certificate in the daemon local store.</p>
+              </tp:docstring>
+           </arg>
+           <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="String"/>
+           <arg type="s" name="certId" direction="out">
+              <tp:docstring>
+               <p>ID of the pinned certificate or empty string on failure.</p>
+              </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="unpinCertificate" tp:name-for-bindings="unpinCertificate">
+           <arg type="s" name="certId" direction="in">
+              <tp:docstring>
+               <p>A certificate ID to unpin.</p>
+              </tp:docstring>
+           </arg>
+           <arg type="b" name="success" direction="out">
+              <tp:docstring>
+               <p>True if a certificate was unpinned.</p>
+              </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="pinCertificatePath" tp:name-for-bindings="pinCertificatePath">
+           <arg type="s" name="certPath" direction="in">
+              <tp:docstring>
+               <p>A certificate path to be pinned (assumed non-local).</p>
+              </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="unpinCertificatePath" tp:name-for-bindings="unpinCertificatePath">
+           <arg type="s" name="certPath" direction="in">
+              <tp:docstring>
+               <p>Certificates path.</p>
+              </tp:docstring>
+           </arg>
+           <arg type="u" name="unpinned" direction="out">
+              <tp:docstring>
+               <p>Number of unpinned certificates.</p>
+              </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="pinRemoteCertificate" tp:name-for-bindings="pinRemoteCertificate">
+           <arg type="s" name="accountId" direction="in">
+              <tp:docstring>
+               <p>An account ID</p>
+              </tp:docstring>
+           </arg>
+           <arg type="s" name="certId" direction="in">
+              <tp:docstring>
+               <p>A certificate public key ID</p>
+              </tp:docstring>
+           </arg>
+           <arg type="b" name="success" direction="out">
+              <tp:docstring>
+               <p>True if the search started</p>
+              </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="setCertificateStatus" tp:name-for-bindings="setCertificateStatus">
+           <arg type="s" name="accountId" direction="in">
+              <tp:docstring>
+               <p>An account ID</p>
+              </tp:docstring>
+           </arg>
+           <arg type="s" name="certId" direction="in">
+              <tp:docstring>
+               <p>A certificate ID</p>
+              </tp:docstring>
+           </arg>
+           <arg type="s" name="status" direction="in">
+              <tp:docstring>
+                The new status of the certificate for the specified account.
+                  UNDEFINED : forget any previous certificate state for this account.
+                  ALLOWED   : consider the certificate as trusted for this account.
+                  BANNED    : consider the certificate as banned for this account.
+              </tp:docstring>
+           </arg>
+           <arg type="b" name="success" direction="out">
+              <tp:docstring>
+               <p>True if the certificate state was succesfully set.</p>
+              </tp:docstring>
+           </arg>
+       </method>
+
+       <method name="getCertificatesByStatus" tp:name-for-bindings="getCertificatesByStatus">
+           <arg type="s" name="accountId" direction="in">
+              <tp:docstring>
+               <p>An account ID</p>
+              </tp:docstring>
+           </arg>
+           <arg type="s" name="status" direction="in">
+              <tp:docstring>
+                The queried certificate status.
+                  ALLOWED : trusted certificate for this account.
+                  BANNED  : banned certificate for this account.
+              </tp:docstring>
+           </arg>
+          <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="VectorString"/>
+          <arg type="as" name="list" direction="out">
+              <tp:docstring>
+                  A list of certificate ids with the provided status
+              </tp:docstring>
+          </arg>
+       </method>
+
+       <signal name="certificatePinned" tp:name-for-bindings="certificatePinned">
+            <tp:docstring>
+                Notify clients that a certificate have been added to the store.
+            </tp:docstring>
+           <arg type="s" name="certId">
+           </arg>
+       </signal>
+       <signal name="certificatePathPinned" tp:name-for-bindings="certificatePathPinned">
+            <tp:docstring>
+                Notify clients that a certificate path have been added to the store.
+            </tp:docstring>
+           <arg type="s" name="path">
+              <tp:docstring>
+                  Pinned path.
+              </tp:docstring>
+           </arg>
+           <arg type="as" name="certIds">
+              <tp:docstring>
+                  A list of certificate ids.
+              </tp:docstring>
+           </arg>
+       </signal>
+       <signal name="certificateExpired" tp:name-for-bindings="certificateExpired">
+            <tp:docstring>
+                Notify clients that a certificate expired.
+            </tp:docstring>
+           <arg type="s" name="certId">
+              <tp:docstring>
+                  A certificate id.
+              </tp:docstring>
+           </arg>
+       </signal>
+
+      <method name="getTrustRequests" tp:name-for-bindings="getTrustRequests">
+          <annotation name="org.qtproject.QtDBus.QtTypeName.Out0" value="MapStringString"/>
+          <arg type="s" name="accountID" direction="in">
+          </arg>
+          <arg type="a{ss}" name="details" direction="out" tp:type="String_String_Map">
+              <tp:docstring>
+                  A list of contact request details.
+              </tp:docstring>
+          </arg>
+      </method>
+
+      <method name="acceptTrustRequest" tp:name-for-bindings="acceptTrustRequest">
+          <arg type="s" name="accountID" direction="in">
+          </arg>
+          <arg type="s" name="from" direction="in">
+          </arg>
+          <arg type="b" name="success" direction="out" tp:type="Boolean">
+              <tp:docstring>
+                  True if the operation succeeded.
+              </tp:docstring>
+          </arg>
+      </method>
+      <method name="discardTrustRequest" tp:name-for-bindings="discardTrustRequest">
+          <arg type="s" name="accountID" direction="in">
+          </arg>
+          <arg type="s" name="from" direction="in">
+          </arg>
+          <arg type="b" name="success" direction="out" tp:type="Boolean">
+              <tp:docstring>
+                  True if the operation succeeded.
+              </tp:docstring>
+          </arg>
+      </method>
+
+      <signal name="incomingTrustRequest" tp:name-for-bindings="incomingTrustRequest">
+            <tp:docstring>
+                Notify clients that a new contact request has been received.
+            </tp:docstring>
+           <arg type="s" name="accountID">
+           </arg>
+           <arg type="s" name="from">
+           </arg>
+           <arg type="t" name="receiveTime">
+           </arg>
+      </signal>
+
+      <method name="sendTrustRequest" tp:name-for-bindings="sendTrustRequest">
+          <arg type="s" name="accountID" direction="in">
+          </arg>
+          <arg type="s" name="to" direction="in">
+          </arg>
+      </method>
+
        <method name="getAddrFromInterfaceName" tp:name-for-bindings="getAddrFromInterfaceName">
            <arg type="s" name="interface" direction="in">
            </arg>
-- 
GitLab