File indexing completed on 2024-12-01 04:36:53
0001 /* 0002 SPDX-FileCopyrightText: 2020-2024 Laurent Montel <montel@kde.org> 0003 0004 SPDX-License-Identifier: LGPL-2.0-or-later 0005 */ 0006 0007 #include "myaccountprofileconfigurewidget.h" 0008 #include "dialogs/asktwoauthenticationpassworddialog.h" 0009 #include "misc/passwordconfirmwidget.h" 0010 #include "myaccountprofileconfigureavatarwidget.h" 0011 #include "rocketchataccount.h" 0012 #include <KAuthorized> 0013 #include <KLineEditEventHandler> 0014 #include <KLocalizedString> 0015 #include <KMessageBox> 0016 #include <KPasswordDialog> 0017 #include <QFormLayout> 0018 #include <QLabel> 0019 #include <QLineEdit> 0020 #include <QPointer> 0021 #include <QPushButton> 0022 0023 MyAccountProfileConfigureWidget::MyAccountProfileConfigureWidget(RocketChatAccount *account, QWidget *parent) 0024 : QWidget(parent) 0025 , mEmail(new QLineEdit(this)) 0026 , mEmailInfo(new QLabel(i18n("Your administrator has disabled the changing of email."), this)) 0027 , mName(new QLineEdit(this)) 0028 , mUserName(new QLineEdit(this)) 0029 , mNickName(new QLineEdit(this)) 0030 , mStatusText(new QLineEdit(this)) 0031 , mDeleteMyAccount(new QPushButton(i18n("Delete my Account"), this)) 0032 , mLogoutFromOtherLocation(new QPushButton(i18n("Logout From Other Logged In Locations"), this)) 0033 , mPasswordConfirmWidget(new PasswordConfirmWidget(this)) 0034 , mConfigureAvatarWidget(new MyAccountProfileConfigureAvatarWidget(account, this)) 0035 , mRocketChatAccount(account) 0036 { 0037 auto topLayout = new QVBoxLayout(this); 0038 topLayout->setObjectName(QStringLiteral("topLayout")); 0039 topLayout->setContentsMargins({}); 0040 0041 mConfigureAvatarWidget->setObjectName(QStringLiteral("mConfigureAvatarWidget")); 0042 topLayout->addWidget(mConfigureAvatarWidget); 0043 0044 auto mainLayout = new QFormLayout; 0045 mainLayout->setObjectName(QStringLiteral("mainLayout")); 0046 topLayout->addLayout(mainLayout); 0047 0048 mName->setObjectName(QStringLiteral("mName")); 0049 KLineEditEventHandler::catchReturnKey(mName); 0050 mainLayout->addRow(i18n("Name:"), mName); 0051 mName->setClearButtonEnabled(true); 0052 0053 mUserName->setObjectName(QStringLiteral("mUserName")); 0054 KLineEditEventHandler::catchReturnKey(mUserName); 0055 mainLayout->addRow(i18n("Username:"), mUserName); 0056 0057 mEmail->setObjectName(QStringLiteral("mEmail")); 0058 KLineEditEventHandler::catchReturnKey(mEmail); 0059 mainLayout->addRow(i18n("Email:"), mEmail); 0060 0061 mEmailInfo->setObjectName(QStringLiteral("mEmailInfo")); 0062 mainLayout->addWidget(mEmailInfo); 0063 0064 mNickName->setObjectName(QStringLiteral("mNickName")); 0065 KLineEditEventHandler::catchReturnKey(mNickName); 0066 mainLayout->addRow(i18n("Nickname:"), mNickName); 0067 mNickName->setClearButtonEnabled(true); 0068 0069 KLineEditEventHandler::catchReturnKey(mStatusText); 0070 mStatusText->setObjectName(QStringLiteral("mStatusText")); 0071 mainLayout->addRow(i18n("Status text:"), mStatusText); 0072 mStatusText->setClearButtonEnabled(true); 0073 0074 mPasswordConfirmWidget->setObjectName(QStringLiteral("mPasswordConfirmWidget")); 0075 mainLayout->addRow(mPasswordConfirmWidget); 0076 0077 mDeleteMyAccount->setObjectName(QStringLiteral("mDeleteMyAccount")); 0078 mainLayout->addWidget(mDeleteMyAccount); 0079 connect(mDeleteMyAccount, &QPushButton::clicked, this, &MyAccountProfileConfigureWidget::slotDeleteMyAccount); 0080 0081 mLogoutFromOtherLocation->setObjectName(QStringLiteral("mLogoutFromOtherLocation")); 0082 mainLayout->addWidget(mLogoutFromOtherLocation); 0083 connect(mLogoutFromOtherLocation, &QPushButton::clicked, this, &MyAccountProfileConfigureWidget::slotLogoutFromOtherLocation); 0084 topLayout->addStretch(); 0085 } 0086 0087 MyAccountProfileConfigureWidget::~MyAccountProfileConfigureWidget() = default; 0088 0089 void MyAccountProfileConfigureWidget::slotLogoutFromOtherLocation() 0090 { 0091 mRocketChatAccount->logoutFromOtherLocation(); 0092 } 0093 0094 void MyAccountProfileConfigureWidget::slotDeleteMyAccount() 0095 { 0096 if (KMessageBox::ButtonCode::PrimaryAction 0097 == KMessageBox::questionTwoActions(this, 0098 i18n("Do you really delete your account ?"), 0099 i18nc("@title", "Delete my Account"), 0100 KStandardGuiItem::del(), 0101 KStandardGuiItem::cancel())) { 0102 QPointer<KPasswordDialog> dlg = new KPasswordDialog(this); 0103 dlg->setRevealPasswordAvailable(KAuthorized::authorize(QStringLiteral("lineedit_reveal_password"))); 0104 dlg->setPrompt(i18n("Current Password")); 0105 if (dlg->exec()) { 0106 mRocketChatAccount->deleteOwnAccount(dlg->password()); 0107 } 0108 delete dlg; 0109 } 0110 } 0111 0112 void MyAccountProfileConfigureWidget::initialize() 0113 { 0114 mUserName->setReadOnly(!mRocketChatAccount->allowUsernameChange()); 0115 mEmail->setReadOnly(!mRocketChatAccount->allowEmailChange()); 0116 mEmailInfo->setVisible(!mRocketChatAccount->allowEmailChange()); 0117 0118 mPasswordConfirmWidget->setVisible(mRocketChatAccount->allowPasswordChange()); 0119 mDeleteMyAccount->setVisible(mRocketChatAccount->allowDeleteOwnAccount()); 0120 mConfigureAvatarWidget->setVisible(mRocketChatAccount->allowAvatarChanged()); 0121 } 0122 0123 void MyAccountProfileConfigureWidget::load() 0124 { 0125 mOwnUser = mRocketChatAccount->ownUser(); 0126 mEmail->setText(mOwnUser.email()); 0127 mName->setText(mOwnUser.name()); 0128 mUserName->setText(mOwnUser.userName()); 0129 mNickName->setText(mOwnUser.nickName()); 0130 mStatusText->setText(mOwnUser.statusText()); 0131 Utils::AvatarInfo info; 0132 info.avatarType = Utils::AvatarType::User; 0133 info.identifier = mOwnUser.userName(); 0134 const QUrl iconUrlStr = QUrl(mRocketChatAccount->avatarUrl(info)); 0135 if (!iconUrlStr.isEmpty()) { 0136 const QString iconPath{QUrl(iconUrlStr).toLocalFile()}; 0137 mConfigureAvatarWidget->setCurrentIconPath(iconPath); 0138 } 0139 } 0140 0141 void MyAccountProfileConfigureWidget::save() 0142 { 0143 RocketChatRestApi::UsersUpdateOwnBasicInfoJob::UpdateOwnBasicInfo updateInfo; 0144 if (!mEmail->isReadOnly() && (mOwnUser.email() != mEmail->text())) { 0145 updateInfo.type |= RocketChatRestApi::UsersUpdateOwnBasicInfoJob::UpdateOwnBasicInfo::BasicInfoType::Email; 0146 updateInfo.email = mEmail->text(); 0147 } 0148 if (!mNickName->isReadOnly() && (mOwnUser.nickName() != mNickName->text())) { 0149 updateInfo.type |= RocketChatRestApi::UsersUpdateOwnBasicInfoJob::UpdateOwnBasicInfo::BasicInfoType::NickName; 0150 updateInfo.nickName = mNickName->text(); 0151 } 0152 if (!mUserName->isReadOnly() && (mOwnUser.userName() != mUserName->text())) { 0153 updateInfo.type |= RocketChatRestApi::UsersUpdateOwnBasicInfoJob::UpdateOwnBasicInfo::BasicInfoType::UserName; 0154 updateInfo.userName = mUserName->text(); 0155 } 0156 if (!mStatusText->isReadOnly() && (mOwnUser.statusText() != mStatusText->text())) { 0157 updateInfo.type |= RocketChatRestApi::UsersUpdateOwnBasicInfoJob::UpdateOwnBasicInfo::BasicInfoType::StatusText; 0158 updateInfo.statusText = mStatusText->text(); 0159 } 0160 if (!mName->isReadOnly() && (mOwnUser.name() != mName->text())) { 0161 updateInfo.type |= RocketChatRestApi::UsersUpdateOwnBasicInfoJob::UpdateOwnBasicInfo::BasicInfoType::Name; 0162 updateInfo.name = mName->text(); 0163 } 0164 if (mPasswordConfirmWidget->isVisible() && mPasswordConfirmWidget->isNewPasswordConfirmed()) { 0165 updateInfo.type |= RocketChatRestApi::UsersUpdateOwnBasicInfoJob::UpdateOwnBasicInfo::BasicInfoType::Password; 0166 updateInfo.newPassword = mPasswordConfirmWidget->password(); // Not encrypt it ???! 0167 QPointer<KPasswordDialog> dlg = new KPasswordDialog(this); 0168 dlg->setPrompt(i18n("Current Password")); 0169 if (dlg->exec()) { 0170 updateInfo.currentPassword = Utils::convertSha256Password(dlg->password()); 0171 } else { 0172 delete dlg; 0173 return; 0174 } 0175 delete dlg; 0176 } 0177 if (mRocketChatAccount->ownUser().servicePassword().email2faEnabled()) { // TODO verify it 0178 QPointer<AskTwoAuthenticationPasswordDialog> dlg = new AskTwoAuthenticationPasswordDialog(this); 0179 dlg->setRocketChatAccount(mRocketChatAccount); 0180 QString code; 0181 if (dlg->exec()) { 0182 code = dlg->code(); 0183 qWarning() << " Code not used yet ! Implement it"; 0184 // TODO use code ! 0185 } 0186 delete dlg; 0187 } 0188 0189 // TODO add more. 0190 if (updateInfo.isValid()) { 0191 mRocketChatAccount->updateOwnBasicInfo(updateInfo); 0192 } 0193 } 0194 0195 #include "moc_myaccountprofileconfigurewidget.cpp"