From bcc75c7fd19150c3008c7c1fae22cc687fc89628 Mon Sep 17 00:00:00 2001
From: Kateryna Kostiuk <kateryna.kostiuk@savoirfairelinux.com>
Date: Fri, 15 May 2020 14:17:42 -0400
Subject: [PATCH] account: check if password is valid

Change-Id: Ice7459ba421c28f72c05bfda5283b733acef4695
---
 src/client/configurationmanager.cpp        |  6 ++++++
 src/dring/configurationmanager_interface.h |  1 +
 src/jamidht/account_manager.h              |  2 ++
 src/jamidht/archive_account_manager.cpp    | 11 +++++++++++
 src/jamidht/archive_account_manager.h      |  3 ++-
 src/jamidht/jamiaccount.cpp                |  6 ++++++
 src/jamidht/jamiaccount.h                  |  2 ++
 src/manager.cpp                            |  9 +++++++++
 src/manager.h                              |  2 ++
 9 files changed, 41 insertions(+), 1 deletion(-)

diff --git a/src/client/configurationmanager.cpp b/src/client/configurationmanager.cpp
index 7216dde8b2..382ca29465 100644
--- a/src/client/configurationmanager.cpp
+++ b/src/client/configurationmanager.cpp
@@ -251,6 +251,12 @@ sendRegister(const std::string& accountID, bool enable)
     jami::Manager::instance().sendRegister(accountID, enable);
 }
 
+bool
+isPasswordValid(const std::string& accountID, const std::string& password)
+{
+    return jami::Manager::instance().isPasswordValid(accountID, password);
+}
+
 void
 registerAllAccounts()
 {
diff --git a/src/dring/configurationmanager_interface.h b/src/dring/configurationmanager_interface.h
index 1a2000b9ef..7741056024 100644
--- a/src/dring/configurationmanager_interface.h
+++ b/src/dring/configurationmanager_interface.h
@@ -65,6 +65,7 @@ DRING_PUBLIC bool exportToFile(const std::string& accountID, const std::string&
 DRING_PUBLIC bool revokeDevice(const std::string& accountID, const std::string& password, const std::string& deviceID);
 DRING_PUBLIC std::map<std::string, std::string> getKnownRingDevices(const std::string& accountID);
 DRING_PUBLIC bool changeAccountPassword(const std::string& accountID, const std::string& password_old, const std::string& password_new);
+DRING_PUBLIC bool isPasswordValid(const std::string& accountID, const std::string& password);
 
 DRING_PUBLIC bool lookupName(const std::string& account, const std::string& nameserver, const std::string& name);
 DRING_PUBLIC bool lookupAddress(const std::string& account, const std::string& nameserver, const std::string& address);
diff --git a/src/jamidht/account_manager.h b/src/jamidht/account_manager.h
index 0e7baa8260..bc30f8b05a 100644
--- a/src/jamidht/account_manager.h
+++ b/src/jamidht/account_manager.h
@@ -121,6 +121,8 @@ public:
 
     virtual void syncDevices() = 0;
 
+    virtual bool isPasswordValid(const std::string& password) {};
+
     dht::crypto::Identity loadIdentity(const std::string& crt_path, const std::string& key_path, const std::string& key_pwd) const;
 
     const AccountInfo* useIdentity(
diff --git a/src/jamidht/archive_account_manager.cpp b/src/jamidht/archive_account_manager.cpp
index 5e4b0b9144..c5f1202773 100644
--- a/src/jamidht/archive_account_manager.cpp
+++ b/src/jamidht/archive_account_manager.cpp
@@ -673,6 +673,17 @@ ArchiveAccountManager::exportArchive(const std::string& destinationPath, const s
     }
 }
 
+bool
+ArchiveAccountManager::isPasswordValid(const std::string& password)
+{
+    try {
+        readArchive(password);
+        return true;
+    } catch (...) {
+        return false;
+    }
+}
+
 
 #if HAVE_RINGNS
 void
diff --git a/src/jamidht/archive_account_manager.h b/src/jamidht/archive_account_manager.h
index 8c87db3879..ef7778aa1c 100644
--- a/src/jamidht/archive_account_manager.h
+++ b/src/jamidht/archive_account_manager.h
@@ -60,6 +60,7 @@ public:
     void addDevice(const std::string& password, AddDeviceCallback) override;
     bool revokeDevice(const std::string& password, const std::string& device, RevokeDeviceCallback) override;
     bool exportArchive(const std::string& destinationPath, const std::string& password);
+    bool isPasswordValid(const std::string& password) override;
 
 #if HAVE_RINGNS
     /*void lookupName(const std::string& name, LookupCallback cb) override;
@@ -97,4 +98,4 @@ private:
     std::string archivePath_;
 };
 
-}
\ No newline at end of file
+}
diff --git a/src/jamidht/jamiaccount.cpp b/src/jamidht/jamiaccount.cpp
index c11c3c2dfa..a2425203d5 100644
--- a/src/jamidht/jamiaccount.cpp
+++ b/src/jamidht/jamiaccount.cpp
@@ -971,6 +971,12 @@ JamiAccount::changeArchivePassword(const std::string& password_old, const std::s
     return true;
 }
 
+bool
+JamiAccount::isPasswordValid(const std::string& password)
+{
+    return accountManager_->isPasswordValid(password);
+}
+
 void
 JamiAccount::addDevice(const std::string& password)
 {
diff --git a/src/jamidht/jamiaccount.h b/src/jamidht/jamiaccount.h
index 3d7a47d952..5c28f0fb19 100644
--- a/src/jamidht/jamiaccount.h
+++ b/src/jamidht/jamiaccount.h
@@ -331,6 +331,8 @@ public:
     bool revokeDevice(const std::string& password, const std::string& device);
     std::map<std::string, std::string> getKnownDevices() const;
 
+    bool isPasswordValid(const std::string& password);
+
     bool changeArchivePassword(const std::string& password_old, const std::string& password_new);
 
     void connectivityChanged() override;
diff --git a/src/manager.cpp b/src/manager.cpp
index 89cea7d97e..015ff69cf4 100644
--- a/src/manager.cpp
+++ b/src/manager.cpp
@@ -2933,6 +2933,15 @@ Manager::sendRegister(const std::string& accountID, bool enable)
         acc->doUnregister();
 }
 
+bool
+Manager::isPasswordValid(const std::string& accountID, const std::string& password)
+{
+    const auto acc = getAccount<JamiAccount>(accountID);
+    if (!acc)
+        return false;
+    return acc->isPasswordValid(password);
+}
+
 uint64_t
 Manager::sendTextMessage(const std::string& accountID, const std::string& to,
                          const std::map<std::string, std::string>& payloads)
diff --git a/src/manager.h b/src/manager.h
index dd972dfae5..c50b701593 100644
--- a/src/manager.h
+++ b/src/manager.h
@@ -388,6 +388,8 @@ class DRING_TESTABLE Manager {
          */
         void sendRegister(const std::string& accountId, bool enable);
 
+        bool isPasswordValid(const std::string& accountID, const std::string& password);
+
         uint64_t sendTextMessage(const std::string& accountID, const std::string& to,
                              const std::map<std::string, std::string>& payloads);
 
-- 
GitLab