diff --git a/src/pages/accounts/accountspage.cpp b/src/pages/accounts/accountspage.cpp index cd32923..36768bd 100644 --- a/src/pages/accounts/accountspage.cpp +++ b/src/pages/accounts/accountspage.cpp @@ -8,6 +8,7 @@ #include "base/event_loop.h" #include "base/paths.h" #include "pages/accounts/password.h" +#include "pages/accounts/passwordchanger.h" #include "pages/accounts/usercard.h" #include "pages/accounts/userdialogs.h" #include "ui/dialog_window.h" @@ -102,7 +103,11 @@ private: m_chooser->open(); }; card->onChangePassword = [this, account] { - m_changePassword = std::make_unique(settingsWindow(), account->userName()); + // The user's own goes through PAM, which asks for the current + // password and updates the login keyring with it. + const bool own = account->userId() == int64_t(getuid()); + m_changePassword = std::make_unique( + settingsWindow(), account->userName(), own ? std::make_unique() : nullptr); m_changePassword->onPasswordSubmitted = [account](const std::string& password) { account->setPassword(cryptPassword(password)); }; diff --git a/src/pages/accounts/userdialogs.cpp b/src/pages/accounts/userdialogs.cpp index 7e6d078..a1ecad7 100644 --- a/src/pages/accounts/userdialogs.cpp +++ b/src/pages/accounts/userdialogs.cpp @@ -54,37 +54,101 @@ protected: } }; -ChangePasswordDialog::ChangePasswordDialog(SettingsWindow& parent, const std::string& userName) +ChangePasswordDialog::ChangePasswordDialog(SettingsWindow& parent, const std::string& userName, + std::unique_ptr changer) : FormDialog(parent, "Change password", kWidth) + , m_changer(std::move(changer)) { Label* name = content()->addChild(userName); name->setWrap(true); name->setLayoutHints({.fillWidth = true}); - GridLayout* grid = addForm(content()); - m_password = addField(grid, "Password", true); - m_verify = addField(grid, "Verify password", true); + m_form = addForm(content()); + if (m_changer) { + m_current = addField(m_form, "Current password", true); + m_password = addField(m_form, "New password", true); + } else { + m_password = addField(m_form, "Password", true); + } + m_verify = addField(m_form, "Verify password", true); + + if (m_changer) { + m_error = content()->addChild