diff --git a/0001-auth-single-add-show-password-button.patch b/0001-auth-single-add-show-password-button.patch new file mode 100644 index 0000000000000000000000000000000000000000..bea55695a2f84da243c69d64fe4d8f17e79e079d --- /dev/null +++ b/0001-auth-single-add-show-password-button.patch @@ -0,0 +1,108 @@ +From d56561ef18c866580930a2c8f392229e79eef3be Mon Sep 17 00:00:00 2001 +From: Hailiang +Date: Fri, 26 Dec 2025 17:59:35 +0800 +Subject: [PATCH] auth single add show password button + +--- + src/session-widgets/auth_single.cpp | 46 +++++++++++++++++++++++++++-- + src/session-widgets/auth_single.h | 1 + + 2 files changed, 44 insertions(+), 3 deletions(-) + +diff --git a/src/session-widgets/auth_single.cpp b/src/session-widgets/auth_single.cpp +index d81d5ab..2b997a5 100644 +--- a/src/session-widgets/auth_single.cpp ++++ b/src/session-widgets/auth_single.cpp +@@ -25,10 +25,14 @@ + + using namespace AuthCommon; + ++const QString PASSWORD_HIDE = QStringLiteral(":/misc/images/password-hide.svg"); ++const QString PASSWORD_SHOWN = QStringLiteral(":/misc/images/password-shown.svg"); ++ + AuthSingle::AuthSingle(QWidget *parent) + : AuthModule(AT_PAM, parent) + , m_capsLock(new DLabel(this)) + , m_lineEdit(new DLineEditEx(this)) ++ , m_passwordShowBtn(new DIconButton(this)) + , m_keyboardBtn(new DPushButton(this)) + , m_passwordHintBtn(new DIconButton(this)) + , m_resetPasswordMessageVisible(false) +@@ -74,6 +78,19 @@ void AuthSingle::initUI() + passwordLayout->addWidget(m_keyboardBtn, 0, Qt::AlignLeft | Qt::AlignVCenter); + /* 缩放因子 */ + passwordLayout->addStretch(1); ++ ++ /*显示密码*/ ++ m_passwordShowBtn->setAccessibleName(QStringLiteral("PasswordShow")); ++ m_passwordShowBtn->setContentsMargins(0,0,0,0); ++ m_passwordShowBtn->setFocusPolicy(Qt::NoFocus); ++ m_passwordShowBtn->setCursor(Qt::ArrowCursor); ++ m_passwordShowBtn->setFlat(true); ++ m_passwordShowBtn->setIcon(QIcon(PASSWORD_SHOWN)); ++ m_passwordShowBtn->setIconSize(QSize(16, 16)); ++ m_passwordShowBtn->setVisible(true); ++ passwordLayout->addWidget(m_passwordShowBtn, 0, Qt::AlignRight | Qt::AlignVCenter); ++ ++ + /* 大小写状态 */ + QPixmap pixmap = DHiDPIHelper::loadNxPixmap(":/misc/images/caps_lock.svg"); + pixmap.setDevicePixelRatio(devicePixelRatioF()); +@@ -126,6 +143,18 @@ void AuthSingle::initConnections() + emit requestAuthenticate(); + } + }); ++ ++ connect(m_passwordShowBtn, &DSuggestButton::clicked, this, [this] { ++ if (m_lineEdit->echoMode() == QLineEdit::EchoMode::Password) { ++ m_passwordShowBtn->setIcon(QIcon(PASSWORD_HIDE)); ++ m_lineEdit->lineEdit()->setEchoMode(QLineEdit::Normal); ++ updatePasswordTextMargins(); ++ } else { ++ m_passwordShowBtn->setIcon(QIcon(PASSWORD_SHOWN)); ++ m_lineEdit->lineEdit()->setEchoMode(QLineEdit::Password); ++ updatePasswordTextMargins(); ++ } ++ }); + } + + /** +@@ -575,10 +604,21 @@ bool AuthSingle::isUserAccountBinded() + + void AuthSingle::updatePasswordTextMargins() + { +- // 根据大小写提示是否显示,设置密码框左边距,根据密码提示和显示密码设置密码杠右边距 + QMargins textMargins = m_lineEdit->lineEdit()->textMargins(); +- textMargins.setLeft(m_capsLock->isVisible() ? m_capsLock->width() : 0); +- textMargins.setRight(m_passwordHintBtn->isVisible() ? m_passwordHintBtn->width() : 0); ++ // 右边控件宽度+控件间距 ++ const int rightWidth = (m_passwordShowBtn->isVisible() ? m_passwordShowBtn->width() + 5 : 0) + ++ (m_passwordHintBtn->isVisible() ? m_passwordHintBtn->width() + 5: 0); ++ // 左侧控件宽度 ++ const int leftWidth = (m_capsLock->isVisible() ? m_capsLock->width() + 5: 0); ++ textMargins.setRight(rightWidth); ++ const int displayTextWidth = m_lineEdit->lineEdit()->fontMetrics().width(m_lineEdit->lineEdit()->displayText()); ++ // 计算当前文字长度+图标+间距所需长度 和 编辑框长度的差值,如果空间不足,则缩减左边的margin,但是不小于左侧控件的宽度 ++ const int diff = m_lineEdit->lineEdit()->width() - 10 /*borer padding等宽度*/ - (displayTextWidth + 15 /*content margin*/ + textMargins.right() * 2); ++ textMargins.setLeft(qMax(leftWidth, rightWidth + (diff < 0 ? diff : 0))); ++ if (textMargins == m_lineEdit->lineEdit()->textMargins()) { ++ return; ++ } ++ + m_lineEdit->lineEdit()->setTextMargins(textMargins); + } + +diff --git a/src/session-widgets/auth_single.h b/src/session-widgets/auth_single.h +index ab83cb3..ecb5d0e 100644 +--- a/src/session-widgets/auth_single.h ++++ b/src/session-widgets/auth_single.h +@@ -64,6 +64,7 @@ private: + bool m_passwordLineEditEnabled; + DLabel *m_capsLock; // 大小写状态 + DLineEditEx *m_lineEdit; // 输入框 ++ DIconButton *m_passwordShowBtn; // 密码显示按钮 + DPushButton *m_keyboardBtn; // 键盘布局按钮 + DIconButton *m_passwordHintBtn; // 密码提示按钮 + QString m_passwordHint; // 密码提示 +-- +2.20.1 + diff --git a/0001-feat-add-QpainterPath-include.patch b/0001-feat-add-QpainterPath-include.patch new file mode 100644 index 0000000000000000000000000000000000000000..44738e22873acf2094d9af14893cca6361bf030c --- /dev/null +++ b/0001-feat-add-QpainterPath-include.patch @@ -0,0 +1,24 @@ +From 9f0ebf49ee3d7eeb01ab9e62bd47c48d30e5c810 Mon Sep 17 00:00:00 2001 +From: leeffo +Date: Mon, 9 Oct 2023 16:36:38 +0800 +Subject: [PATCH] feat: add QpainterPath include + +--- + src/session-widgets/buttonbox.cpp | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/src/session-widgets/buttonbox.cpp b/src/session-widgets/buttonbox.cpp +index aa8f20dc..ca903259 100644 +--- a/src/session-widgets/buttonbox.cpp ++++ b/src/session-widgets/buttonbox.cpp +@@ -8,6 +8,7 @@ + #include + + #include ++#include + #include + #include + +-- +2.20.1 + diff --git a/0001-use-lightdm-autologin.pam-replace-deepin-lightdm-aut.patch b/0001-use-lightdm-autologin.pam-replace-deepin-lightdm-aut.patch new file mode 100644 index 0000000000000000000000000000000000000000..ea1f1a8a635546ccd2c8e8adf2bdf1682e17d55f --- /dev/null +++ b/0001-use-lightdm-autologin.pam-replace-deepin-lightdm-aut.patch @@ -0,0 +1,38 @@ +From 5555e12310e6c745829ba5a710db4d405c943a73 Mon Sep 17 00:00:00 2001 +From: Hailiang +Date: Fri, 14 Mar 2025 10:28:20 +0800 +Subject: [PATCH] use lightdm-autologin.pam replace deepin-lightdm-autologin + +--- + files/pam.d/deepin-lightdm-autologin | 20 ++++++++++++++++++-- + 1 file changed, 18 insertions(+), 2 deletions(-) + +diff --git a/files/pam.d/deepin-lightdm-autologin b/files/pam.d/deepin-lightdm-autologin +index 2edcbe7..d5a44e3 100644 +--- a/files/pam.d/deepin-lightdm-autologin ++++ b/files/pam.d/deepin-lightdm-autologin +@@ -1,2 +1,18 @@ +-auth requisite pam_inhibit_autologin.so +-@include lightdm-autologin +\ No newline at end of file ++#%PAM-1.0 ++auth [success=done ignore=ignore default=bad] pam_selinux_permit.so ++auth required pam_env.so ++auth required pam_permit.so ++auth include postlogin ++account required pam_nologin.so ++account include system-auth ++password include system-auth ++session required pam_selinux.so close ++session required pam_loginuid.so ++session required pam_limits.so ++-session optional pam_ck_connector.so ++session required pam_selinux.so open ++session optional pam_keyinit.so force revoke ++session required pam_namespace.so ++session include system-auth ++session include postlogin ++ +-- +2.20.1 + diff --git a/0002-fix-dde-lock-prompt-message.patch b/0002-fix-dde-lock-prompt-message.patch new file mode 100644 index 0000000000000000000000000000000000000000..9c8491909cd93ba4aba2eea7a593f9140c6be4d3 --- /dev/null +++ b/0002-fix-dde-lock-prompt-message.patch @@ -0,0 +1,50 @@ +diff -Naur a/src/libdde-auth/deepinauthframework.cpp b/src/libdde-auth/deepinauthframework.cpp +--- a/src/libdde-auth/deepinauthframework.cpp 2023-10-09 14:52:49.000000000 +0800 ++++ b/src/libdde-auth/deepinauthframework.cpp 2024-03-04 15:45:26.110492602 +0800 +@@ -129,13 +129,15 @@ + } else { + qDebug() << "PAM start..."; + } +- ++ ++ m_message = ""; + int rc = pam_authenticate(m_pamHandle, 0); + if (rc != PAM_SUCCESS) { + qWarning() << "PAM authenticate failed:" << pam_strerror(m_pamHandle, rc) << rc; + if (m_message.isEmpty()) m_message = pam_strerror(m_pamHandle, rc); + } else { + qDebug() << "PAM authenticate finished."; ++ m_message = ""; + } + + int re = pam_end(m_pamHandle, rc); +@@ -185,8 +187,9 @@ + qWarning() << "PAM_BUF_ERR"; + return PAM_BUF_ERR; + } +- const QString message = QString::fromLocal8Bit(PAM_MSG_MEMBER(msg, idx, msg)); ++ //const QString message = QString::fromLocal8Bit(PAM_MSG_MEMBER(msg, idx, msg)); + for (idx = 0; idx < num_msg; ++idx) { ++ const QString message = QString::fromLocal8Bit(PAM_MSG_MEMBER(msg, idx, msg)); + switch (PAM_MSG_MEMBER(msg, idx, msg_style)) { + case PAM_PROMPT_ECHO_ON: + case PAM_PROMPT_ECHO_OFF: { +@@ -219,15 +222,15 @@ + } + case PAM_ERROR_MSG: { + qDebug() << "pam auth error: " << message; +- app_ptr->m_message = message; ++ //app_ptr->m_message = message; + app_ptr->UpdateAuthState(AS_Failure, message); + aresp[idx].resp_retcode = PAM_SUCCESS; + break; + } + case PAM_TEXT_INFO: { + qDebug() << "pam auth info: " << message; +- app_ptr->m_message = message; +- app_ptr->UpdateAuthState(AS_Prompt, message); ++ //app_ptr->m_message = message; ++ app_ptr->UpdateAuthState(AS_Failure, message); + aresp[idx].resp_retcode = PAM_SUCCESS; + break; + } diff --git a/0004-dde-session-shel-uos-make-expired-warning-days-same-as-pam.patch b/0004-dde-session-shel-uos-make-expired-warning-days-same-as-pam.patch new file mode 100644 index 0000000000000000000000000000000000000000..1017644b8169b4e9cbb57f64c7f2e34f9d663684 --- /dev/null +++ b/0004-dde-session-shel-uos-make-expired-warning-days-same-as-pam.patch @@ -0,0 +1,25 @@ +From 6fbac213147046d6e1297231ee7a5c68c1d33095 Mon Sep 17 00:00:00 2001 +From: songmingliang +Date: Tue, 20 May 2025 14:23:34 +0800 +Subject: [PATCH] make expired warning days same as pam + +--- + src/session-widgets/userinfo.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/session-widgets/userinfo.h b/src/session-widgets/userinfo.h +index 8b3d69d..ce6e7e3 100644 +--- a/src/session-widgets/userinfo.h ++++ b/src/session-widgets/userinfo.h +@@ -76,7 +76,7 @@ public: + virtual inline bool isUserValid() const { return false; } + inline bool isUse24HourFormat() const { return m_isUse24HourFormat; } + +- inline int expiredDayLeft() const { return m_expiredDayLeft; } ++ inline int expiredDayLeft() const { return m_expiredDayLeft-1; } + inline int expiredState() const { return m_expiredState; } + inline AuthCommon::AuthType lastAuthType() const { return m_lastAuthType; } + inline int shortDateFormat() const { return m_shortDateFormat; } +-- +2.27.0 + diff --git a/README.md b/README.md new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/dde-session-shell-5.5.90.tar.gz b/dde-session-shell-5.5.90.tar.gz deleted file mode 100644 index 0dbe3c0bf8fbe701dc3b585ce6d9204947cf6b1a..0000000000000000000000000000000000000000 Binary files a/dde-session-shell-5.5.90.tar.gz and /dev/null differ diff --git a/dde-session-shell-adapt-for-mfa.patch b/dde-session-shell-adapt-for-mfa.patch new file mode 100644 index 0000000000000000000000000000000000000000..192c8db903f016143dd24768f06ea26e0f240417 --- /dev/null +++ b/dde-session-shell-adapt-for-mfa.patch @@ -0,0 +1,206 @@ +diff --git a/files/pam.d/dde-lock b/files/pam.d/dde-lock +index b404e34..98707ef 100644 +--- a/files/pam.d/dde-lock ++++ b/files/pam.d/dde-lock +@@ -1,4 +1,4 @@ + #%PAM-1.0 +-auth include common-auth +-account include common-auth +-session include common-auth ++auth include system-auth ++account include system-auth ++session include system-auth +diff --git a/src/global_util/public_func.cpp b/src/global_util/public_func.cpp +index 3f75d41..df2d73c 100644 +--- a/src/global_util/public_func.cpp ++++ b/src/global_util/public_func.cpp +@@ -196,6 +196,7 @@ bool checkPictureCanRead(const QString &fileName) + */ + bool isDeepinAuth() + { ++#if 0 + const char* controlId = "com.deepin.dde.auth.control"; + if (QGSettings::isSchemaInstalled(controlId)) { + const char *controlPath = "/com/deepin/dde/auth/control/"; +@@ -207,6 +208,7 @@ bool isDeepinAuth() + #endif + return useDeepinAuth; + } ++#endif + return true; + } + +diff --git a/src/session-widgets/mfa_widget.cpp b/src/session-widgets/mfa_widget.cpp +index 64527a4..41b63a4 100644 +--- a/src/session-widgets/mfa_widget.cpp ++++ b/src/session-widgets/mfa_widget.cpp +@@ -59,13 +59,14 @@ void MFAWidget::setModel(const SessionBaseModel *model) + initUI(); + initConnections(); + +- setAuthType(model->getAuthProperty().AuthType); + setUser(model->currentUser()); ++ setAuthType(model->getAuthProperty().AuthType); + } + + void MFAWidget::setAuthType(const AuthFlags type) + { + m_index = 0; ++ + /* 面容 */ + if (type & AT_Face) { + initFaceAuth(); +@@ -90,14 +91,6 @@ void MFAWidget::setAuthType(const AuthFlags type) + m_fingerprintAuth->deleteLater(); + m_fingerprintAuth = nullptr; + } +- /* Ukey */ +- if (type & AT_Ukey) { +- initUKeyAuth(); +- m_index++; +- } else if (m_ukeyAuth) { +- m_ukeyAuth->deleteLater(); +- m_ukeyAuth = nullptr; +- } + /* 密码 */ + if (type & AT_Password) { + initPasswdAuth(); +@@ -106,42 +99,56 @@ void MFAWidget::setAuthType(const AuthFlags type) + m_passwordAuth->deleteLater(); + m_passwordAuth = nullptr; + } ++ /* Ukey */ ++ if (type & AT_Ukey) { ++ initUKeyAuth(); ++ m_index++; ++ } else if (m_ukeyAuth) { ++ m_ukeyAuth->deleteLater(); ++ m_ukeyAuth = nullptr; ++ } ++ + /* 账户 */ +- if (type == AT_None) { ++ //if (type == AT_None) { + if (m_model->currentUser()->isNoPasswordLogin()) { + m_lockButton->setEnabled(true); +- m_accountEdit->hide(); +- m_userNameWidget->show(); ++ } ++ ++ QString info; ++ if (m_model->currentUser() == nullptr) { ++ info = QString("m_model->currentUser()=nullptr"); ++ } else if (m_model->currentUser()->name().isEmpty()) { ++ info = QString("m_model->currentUser()!=nullptr, m_model->currentUser()->name().isEmpty"); + } else { ++ info = QString("m_model->currentUser()->name()=%1").arg(m_model->currentUser()->name()); ++ } ++ //QMessageBox::information(this, "信息", info); ++ ++ if (m_model->currentUser() == nullptr || m_model->currentUser()->name().isEmpty() || m_model->currentUser()->name()=="...") { + m_accountEdit->clear(); + m_accountEdit->show(); + m_userNameWidget->hide(); ++ } else { ++ m_accountEdit->hide(); ++ m_userNameWidget->show(); + } +- } else { +- const bool visible = m_model->isServerModel() && m_model->appType() == Login; +- m_accountEdit->setVisible(visible); +- m_userNameWidget->setVisible(!visible); +- } ++ //} else { ++ // const bool visible = m_model->isServerModel() && m_model->appType() == Login; ++ // m_accountEdit->setVisible(!visible); ++ // m_userNameWidget->setVisible(visible); ++ //} + + updatePasswordExpiredState(); + updateGeometry(); + +- if (m_lockButton->isVisible() && m_lockButton->isEnabled()) { +- setFocusProxy(m_lockButton); +- } +- if (m_passwordAuth) { +- setFocusProxy(m_passwordAuth); +- } +- if (m_ukeyAuth) { +- setFocusProxy(m_ukeyAuth); +- } +- if (m_accountEdit->isVisible()) { +- setFocusProxy(m_accountEdit); +- } +- + m_widgetList.clear(); +- m_widgetList << m_accountEdit << m_ukeyAuth << m_passwordAuth << m_lockButton; ++ m_widgetList << m_accountEdit << m_passwordAuth << m_ukeyAuth << m_lockButton; + ++ //设置tab order ++ //如果显示用户名编辑框,则用户名编辑框处于tab跳转第一顺序 ++ if (m_accountEdit->isVisible()) { ++ setTabOrder(m_accountEdit->focusProxy(), m_accountEdit->focusProxy()); ++ } + for (int i = 0; i < m_widgetList.size(); i++) { + if (m_widgetList[i]) { + for (int j = i + 1; j < m_widgetList.size(); j++) { +@@ -153,6 +160,21 @@ void MFAWidget::setAuthType(const AuthFlags type) + } + } + } ++ ++ //设置focus ++ if (m_lockButton->isVisible() && m_lockButton->isEnabled()) { ++ setFocusProxy(m_lockButton); ++ } ++ if (m_passwordAuth) { ++ setFocusProxy(m_passwordAuth); ++ } ++ if (m_ukeyAuth) { ++ setFocusProxy(m_ukeyAuth); ++ } ++ if (m_accountEdit->isVisible()) { ++ setFocusProxy(m_accountEdit); ++ } ++ + setFocus(); + } + +@@ -391,6 +413,7 @@ void MFAWidget::checkAuthResult(const AuthType type, const AuthState state) + void MFAWidget::updateFocusPosition() + { + AuthModule *module = static_cast(sender()); ++ + if (module == m_passwordAuth) { + if (m_ukeyAuth && m_ukeyAuth->authState() == AS_Prompt) { + setFocusProxy(m_ukeyAuth); +@@ -398,7 +421,8 @@ void MFAWidget::updateFocusPosition() + setFocusProxy(m_lockButton); + } + } else { +- if (m_passwordAuth && m_passwordAuth->isEnabled()) { ++ //if (m_passwordAuth && m_passwordAuth->isEnabled()) { ++ if (m_passwordAuth && m_passwordAuth->authState() == AS_Prompt) { + setFocusProxy(m_passwordAuth); + } else { + setFocusProxy(m_lockButton); +diff --git a/src/session-widgets/sessionbasemodel.cpp b/src/session-widgets/sessionbasemodel.cpp +index 1073c3c..8df1daf 100644 +--- a/src/session-widgets/sessionbasemodel.cpp ++++ b/src/session-widgets/sessionbasemodel.cpp +@@ -518,7 +518,7 @@ void SessionBaseModel::updateFrameworkState(const int state) + if (state == m_authProperty.FrameworkState) { + return; + } +- m_authProperty.FrameworkState = state; ++ m_authProperty.FrameworkState = Unavailable; + } + + /** +@@ -685,4 +685,4 @@ void SessionBaseModel::setUserlistVisible(bool visible) + void SessionBaseModel::setQuickLoginProcess(bool val) + { + m_isQuickLoginProcess = val; +-} +\ No newline at end of file ++} diff --git a/dde-session-shell.patch b/dde-session-shell.patch new file mode 100644 index 0000000000000000000000000000000000000000..ed3f1073aa1259f2b88071f014f2a7f358ba1838 --- /dev/null +++ b/dde-session-shell.patch @@ -0,0 +1,14 @@ +diff --git a/src/session-widgets/lockcontent.cpp b/src/session-widgets/lockcontent.cpp +index d6f731d9..81bb7db0 100644 +--- a/src/session-widgets/lockcontent.cpp ++++ b/src/session-widgets/lockcontent.cpp +@@ -728,7 +728,7 @@ void LockContent::onUserListChanged(QList > list) + } + + bool enable = (alwaysShowUserSwitchButton || (allowShowUserSwitchButton && (userList > (m_model->isServerModel() ? 0 : 1)))) && haveLoginedUser; +- ++ enable = enable || (m_model->isServerModel() && m_model->currentUser()->name() != "..."); + bool controlEnable = enable && (m_model->userlistVisible() || m_model->currentUser()->name() != "..."); + m_controlWidget->setUserSwitchEnable(controlEnable); + m_shutdownFrame->setUserSwitchEnable(enable); + diff --git a/dde-session-shell.spec b/dde-session-shell.spec index 71163f561be7a43cd00e8754d52e00f7daa7c3cc..f4d3b0138171ba8268e57270d813f77bc78ebfc7 100644 --- a/dde-session-shell.spec +++ b/dde-session-shell.spec @@ -1,94 +1,119 @@ -%define anolis_release 3 -%{!?_vpath_builddir:%global _vpath_builddir %{_target_platform}} -%global debug_package %{nil} -%debug_package %{nil} - - Name: dde-session-shell -Version: 5.5.90 -Release: 1.%{anolis_release}%{?dist} +Version: 5.7.30.2 +Release: 2%{?dist}.02 Summary: deepin-session-shell - Deepin desktop-environment - session-shell module -License: GPLv3+ -URL: https://github.com/linuxdeepin/dde-session-shell/ -Source0: %{url}/archive/%{version}/%{name}-%{version}.tar.gz +License: GPL-3.0-or-later +URL: https://github.com/linuxdeepin/dde-session-shell +Source0: dde-session-shell_5.7.30.2.orig.tar.xz +Patch0: 0001-feat-add-QpainterPath-include.patch +Patch1: to-disable-cancel-after-clicking-logout.patch +Patch2: 0001-use-lightdm-autologin.pam-replace-deepin-lightdm-aut.patch +Patch3: dde-session-shell.patch +Patch4: 0004-dde-session-shel-uos-make-expired-warning-days-same-as-pam.patch +Patch5: tips-widget-workaround.patch +Patch6: fix-alert-msg-while-PAM-fail-lock.patch +Patch7: 0001-auth-single-add-show-password-button.patch +Patch9000: dde-session-shell-adapt-for-mfa.patch BuildRequires: cmake +BuildRequires: qt5-qtbase-devel +BuildRequires: lightdm-qt5-devel +BuildRequires: xcb-util-wm xcb-util-wm-devel +BuildRequires: qt5-qtx11extras-devel +BuildRequires: gsettings-qt +BuildRequires: gsettings-qt-devel +BuildRequires: qt5-qtsvg-devel BuildRequires: glib2-devel -BuildRequires: libarchive +BuildRequires: dtkwidget-devel >= 5.5 BuildRequires: dtkcore-devel >= 5.5 -BuildRequires: dtkcommon-devel -BuildRequires: gsettings-qt -BuildRequires: qt5-qttools-devel BuildRequires: qt5-qtdeclarative-devel -BuildRequires: qt5-linguist -BuildRequires: dtkwidget-devel >= 5.5 -BuildRequires: qt5-qtx11extras-devel -BuildRequires: qt5-qtmultimedia-devel -BuildRequires: qt5-qtsvg-devel +BuildRequires: qt5-qttools-devel +BuildRequires: pam-devel +BuildRequires: systemd-devel +BuildRequires: dde-qt-dbus-factory-devel +BuildRequires: deepin-gettext-tools +BuildRequires: libXtst-devel BuildRequires: libXcursor-devel BuildRequires: libXrandr-devel -BuildRequires: libXtst-devel -BuildRequires: libXi-devel -BuildRequires: deepin-gettext-tools -BuildRequires: xcb-util-wm xcb-util-wm-devel -BuildRequires: dde-qt-dbus-factory-devel -BuildRequires: gsettings-qt-devel -BuildRequires: lightdm-qt5-devel -BuildRequires: pam-devel -BuildRequires: openssl-devel +BuildRequires: gmock BuildRequires: gtest-devel -BuildRequires: dtkgui-devel -BuildRequires: gcc-c++ +BuildRequires: libX11-devel +BuildRequires: openssl-devel BuildRequires: kf5-kwayland-devel - +BuildRequires: dde-api-devel >= 5.6.3 + +Requires: dde-common >= 2026 +Requires: deepin-desktop-schemas >= 5.9.14 +Requires: dde-qt-dbus-factory >= 5.4.10 +Requires: dde-daemon >= 5.13.12 +Requires: startdde >= 5.10.24 +Requires: xorg-x11-server-utils +Requires: dbus-x11 +Requires: deepin-authenticate >= 1.2.27 +Requires: openssl-devel +Requires: libX11 +Requires: dde-dconfig-daemon Requires: lightdm -Requires: google-noto-cjk-fonts-common +Requires: google-noto-cjk-fonts Requires: libqtxdg-devel -Requires: deepin-desktop-schemas -Requires: dde-daemon -Requires: startdde +Recommends: onboard +Recommends: dde-network-core Requires(post): sed +Provides: deepin-greeter-wayland = %{version}-%{release} Provides: lightdm-deepin-greeter = %{version}-%{release} Provides: lightdm-greeter = 1.2 %description -deepin-session-shell - Deepin desktop-environment - session-shell module. +deepin desktop-environment - dde-session-shell module +Deepin desktop environment 2015 - dde-session-shell module. +lightdm-deepin-greeter - login,the entry to the desktop +dde-lock - lock screen, to protect privacy +deepin-greeter - actual call the lightdm-deepin-greeter %package devel Summary: Development package for %{name} Requires: %{name}%{?_isa} = %{version}-%{release} %description devel -Header files for %{name}. +deepin desktop-environment - dde-session-shell module development files + DDE Session Shell module development files of deepin desktop-environment %prep -%setup -q +%autosetup -p1 %build export PATH=$PATH:%{_qt5_bindir} cmake_version=$(cmake --version | head -1 | awk '{print $3}') sed -i "s|VERSION 3.13.4|VERSION $cmake_version|g" CMakeLists.txt %cmake -DCMAKE_INSTALL_SYSCONFDIR=/etc -%make_build -C %{_vpath_builddir} +%make_build %install -%make_install -C %{_vpath_builddir} +%make_install %files %{_bindir}/dde-lock +%{_bindir}/greeter-display-setting %{_bindir}/lightdm-deepin-greeter +%{_bindir}/lightdm-deepin-greeter-lighter %attr(755,root,root) %{_bindir}/deepin-greeter -%{_sysconfdir}/deepin/ +%{_sysconfdir}/pam.d/dde-lock %{_sysconfdir}/lightdm/deepin/ %{_sysconfdir}/xdg/autostart/dde-lock.desktop %{_datadir}/dde-session-shell/ %{_datadir}/deepin-authentication/ %{_datadir}/applications/dde-lock.desktop %{_datadir}/xgreeters/lightdm-deepin-greeter.desktop +%{_datadir}/xgreeters/lightdm-deepin-greeter-wayland.desktop %{_datadir}/dbus-1/services/com.deepin.dde.lockFront.service %{_datadir}/dbus-1/services/com.deepin.dde.shutdownFront.service %{_datadir}/glib-2.0/schemas/com.deepin.dde.session-shell.gschema.xml %{_datadir}/dsg/ +%{_datadir}/lightdm/lightdm.conf.d/50-deepin.conf +%{_libdir}/security/pam_inhibit_autologin.so +%{_sysconfdir}/pam.d/deepin-lightdm-autologin +%{_datadir}/deepin-debug-config/deepin-debug-config.d/org.deepin.dde.session-shell.json +%{_datadir}/deepin-log-viewer/deepin-log.conf.d/org.deepin.dde.session-shell.json %files devel %{_includedir}/%{name} @@ -96,14 +121,69 @@ sed -i "s|VERSION 3.13.4|VERSION $cmake_version|g" CMakeLists.txt %{_libdir}/cmake/DdeSessionShell/DdeSessionShellConfig.cmake %changelog -* Thu Apr 11 2024 yangxianzhao - 5.5.90-1.3 -- Update Requires +* Wed Jan 07 2026 zhaoshuang - 5.7.30.2-2.02 +- feat: adapt for multi-factor authentication + +* Mon Dec 29 2025 liweigang - 5.7.30.2-2.01 +- spec: roll back the del requires + +* Fri Dec 26 2025 mahailiang - 5.7.30.2-2 +- feat: auth single add show password button + +* Mon Dec 15 2025 liweigang - 5.7.30.2-1 +- update: update to version 5.7.30.2 +- spec: modify license + +* Tue Aug 19 2025 maqi - 5.7.23.2-1.10 +- spec: update license + +* Tue Jul 15 2025 zhaoshuang - 5.7.23.2-1.09 +- fix: fix alert msg while PAM fail lock(bugid:323139) + +* Thu Jun 12 2025 lvgenggneng - 5.7.23.2-1.08 +- rebuild: rebuild without gcc_secure + +* Thu May 29 2025 zhaoshuang - 5.7.23.2-1.07 +- fix: rework for tips-widget workaround(bugid:296029) + +* Tue May 27 2025 zhaoshuang - 5.7.23.2-1.06 +- fix: workaround for tips-widget(bugid:296029) + +* Tue May 20 2025 songmingliang - 5.7.23.2-1.05 +- fix: make warning expired days same as pam(bugid:283241) + +* Wed Apr 09 2025 maqi - 5.7.23.2-1.04 +- fix: the issue of no account switching entry on the login interface(bugid:310175) + +* Fri Mar 14 2025 mahailiang - 5.7.23.2-1.03 +- fix: use lightdm-autologin.pam replace deepin-lightdm-autologin(bugid:283429) + +* Mon Jan 06 2025 zhaoshuang - 5.7.23.2-1.02 +- fix: rework to disable cancel after clicking logout(bugid:287937) + +* Mon Jan 06 2025 zhaoshuang - 5.7.23.2-1.01 +- fix: to disable cancel after clicking logout(bugid:287937) + +* Mon Oct 14 2024 liweigang - 5.7.23.2-1 +- update: update to version 5.7.23.2 + +* Mon Mar 04 2024 yangfei - 5.6.21-2.01 +- fix: fix dde-lock prompt message(bugid:241641) + +* Tue Dec 12 2023 mahailiang - 5.6.21-2 +- fix: Solve the user switching login problem(bugid:194591) + +* Mon Oct 09 2023 liweigang - 5.6.21-1 +- update: update to version 5.6.21 + +* Fri Sep 08 2023 liuzhilin - 5.6.12.5-1.01 +- spec: add buildrequires gmock to sw_64 -* Tue Sep 26 2023 yangxianzhao - 5.5.90-1.2 -- fix build error on a23 +* Thu Aug 17 2023 liuzhilin - 5.6.12.5-1 +- update: update to 5.6.12.5 -* Mon Aug 28 2023 yangxianzhao - 5.5.90-1.01.1 -- Specification spec file +* Wed Jul 05 2023 yuxiaojun - 5.5.90-1.03 +- fix: When root is disabled after creating an administrator account, the problem of being unable to enter the system through the graphical interface(bugid:203337) * Tue Jan 17 2023 liweiganga - 5.5.90-1.01 - spec: fix greeters path diff --git a/dde-session-shell_5.7.30.2.orig.tar.xz b/dde-session-shell_5.7.30.2.orig.tar.xz new file mode 100644 index 0000000000000000000000000000000000000000..ab4e723b22fab797f85a33e27c336539fb6ac4e6 Binary files /dev/null and b/dde-session-shell_5.7.30.2.orig.tar.xz differ diff --git a/fix-alert-msg-while-PAM-fail-lock.patch b/fix-alert-msg-while-PAM-fail-lock.patch new file mode 100644 index 0000000000000000000000000000000000000000..430a9b271f2ac816bf63de7fc0720ff30253a86d --- /dev/null +++ b/fix-alert-msg-while-PAM-fail-lock.patch @@ -0,0 +1,33 @@ +From 0ed53e7cc023af7ec5bfd557feea6a3ef3c8c2ed Mon Sep 17 00:00:00 2001 +From: Super User +Date: Mon, 14 Jul 2025 19:28:43 +0800 +Subject: [PATCH] show lock msg with correct lock times + +--- + src/libdde-auth/deepinauthframework.cpp | 3 ++- + 1 file changed, 2 insertions(+), 1 deletion(-) + +diff --git a/src/libdde-auth/deepinauthframework.cpp b/src/libdde-auth/deepinauthframework.cpp +index f789b2a..9965f20 100644 +--- a/src/libdde-auth/deepinauthframework.cpp ++++ b/src/libdde-auth/deepinauthframework.cpp +@@ -136,6 +136,7 @@ void DeepinAuthFramework::PAMAuthentication(const QString &account) + qCDebug(DDE_SHELL) << "PAM start..."; + } + ++ m_message = ""; + int rc = pam_authenticate(m_pamHandle, 0); + if (rc != PAM_SUCCESS) { + qCWarning(DDE_SHELL) << "PAM authenticate failed, error: " << pam_strerror(m_pamHandle, rc) << ", PAM authenticate: " << rc; +@@ -233,7 +234,7 @@ int DeepinAuthFramework::PAMConversation(int num_msg, const pam_message **msg, p + case PAM_TEXT_INFO: { + qCDebug(DDE_SHELL) << "PAM auth info: " << message; + app_ptr->m_message = message; +- app_ptr->UpdateAuthState(AS_Prompt, message); ++ app_ptr->UpdateAuthState(AS_Failure, message); + aresp[idx].resp_retcode = PAM_SUCCESS; + break; + } +-- +2.43.0 + diff --git a/tips-widget-workaround.patch b/tips-widget-workaround.patch new file mode 100644 index 0000000000000000000000000000000000000000..02caeb165a6ba24888dffef082c8a9ab514bbc83 --- /dev/null +++ b/tips-widget-workaround.patch @@ -0,0 +1,206 @@ +diff --git a/src/app/dde-lock.cpp b/src/app/dde-lock.cpp +index 002f03e..4460199 100644 +--- a/src/app/dde-lock.cpp ++++ b/src/app/dde-lock.cpp +@@ -182,7 +182,7 @@ int main(int argc, char *argv[]) + return 0; + } + +- LockContent::instance()->init(model); ++ LockContent::instance()->init(model, DArrowRectangle::FloatWindow); + WarningContent::instance()->setModel(model); + + QObject::connect(LockContent::instance(), &LockContent::requestSwitchToUser, worker, &LockWorker::switchToUser); +diff --git a/src/lightdm-deepin-greeter/logincontent.cpp b/src/lightdm-deepin-greeter/logincontent.cpp +index 7c18726..7d638d1 100644 +--- a/src/lightdm-deepin-greeter/logincontent.cpp ++++ b/src/lightdm-deepin-greeter/logincontent.cpp +@@ -31,7 +31,7 @@ void LoginContent::init(SessionBaseModel *model) + } + initialized = true; + +- LockContent::init(model); ++ LockContent::init(model, DArrowRectangle::FloatWidget); + setAccessibleName("LoginContent"); + + m_sessionFrame = new SessionWidget; +diff --git a/src/session-widgets/lockcontent.cpp b/src/session-widgets/lockcontent.cpp +index 81bb7db..ae0207f 100644 +--- a/src/session-widgets/lockcontent.cpp ++++ b/src/session-widgets/lockcontent.cpp +@@ -71,7 +71,7 @@ LockContent* LockContent::instance() + return lockContent; + } + +-void LockContent::init(SessionBaseModel *model) ++void LockContent::init(SessionBaseModel *model, DArrowRectangle::FloatMode floatMode) + { + if (m_initialized) { + qCWarning(DDE_SHELL) << "Has been initialized, don't do it again"; +@@ -84,7 +84,7 @@ void LockContent::init(SessionBaseModel *model) + m_model->setCurrentModeState(SessionBaseModel::ModeStatus::PasswordMode); + } + +- initUI(); ++ initUI(floatMode); + initConnections(); + + if (model->appType() == AuthCommon::Lock) { +@@ -108,7 +108,7 @@ void LockContent::init(SessionBaseModel *model) + } + } + +-void LockContent::initUI() ++void LockContent::initUI(DArrowRectangle::FloatMode floatMode) + { + m_centerTopWidget = new CenterTopWidget(this); + setCenterTopWidget(m_centerTopWidget); +@@ -121,7 +121,7 @@ void LockContent::initUI() + m_logoWidget->setAccessibleName("LogoWidget"); + setLeftBottomWidget(m_logoWidget); + +- m_controlWidget = new ControlWidget(m_model); ++ m_controlWidget = new ControlWidget(m_model, floatMode); + m_controlWidget->setAccessibleName("ControlWidget"); + setRightBottomWidget(m_controlWidget); + +diff --git a/src/session-widgets/lockcontent.h b/src/session-widgets/lockcontent.h +index e8a9861..32beae3 100644 +--- a/src/session-widgets/lockcontent.h ++++ b/src/session-widgets/lockcontent.h +@@ -38,7 +38,7 @@ class LockContent : public SessionBaseWindow + public: + explicit LockContent(QWidget *parent = nullptr); + static LockContent *instance(); +- void init(SessionBaseModel *model); ++ void init(SessionBaseModel *model, DArrowRectangle::FloatMode floatMode); + virtual void onCurrentUserChanged(std::shared_ptr user); + virtual void onStatusChanged(SessionBaseModel::ModeStatus status); + virtual void restoreMode(); +@@ -91,7 +91,7 @@ protected: + void refreshBackground(SessionBaseModel::ModeStatus status); + void refreshLayout(SessionBaseModel::ModeStatus status); + +- void initUI(); ++ void initUI(DArrowRectangle::FloatMode floatMode); + void initConnections(); + void initMFAWidget(); + void initSFAWidget(); +diff --git a/src/widgets/controlwidget.cpp b/src/widgets/controlwidget.cpp +index d6a6787..d7c377d 100644 +--- a/src/widgets/controlwidget.cpp ++++ b/src/widgets/controlwidget.cpp +@@ -2,11 +2,11 @@ + // + // SPDX-License-Identifier: GPL-3.0-or-later + ++#include "tipswidget.h" + #include "controlwidget.h" + #include "sessionbasemodel.h" + #include "kblayoutlistview.h" + #include "modules_loader.h" +-#include "tipswidget.h" + #include "public_func.h" + #include "plugin_manager.h" + #include "dconfig_helper.h" +@@ -85,10 +85,10 @@ void FloatingButton::paintEvent(QPaintEvent *event) + p.drawControl(DStyle::CE_IconButton, opt); + } + +-ControlWidget::ControlWidget(const SessionBaseModel *model, QWidget *parent) ++ControlWidget::ControlWidget(const SessionBaseModel *model, DArrowRectangle::FloatMode floatMode, QWidget *parent) + : QWidget(parent) + , m_contextMenu(new QMenu(this)) +- , m_tipsWidget(new TipsWidget()) ++ , m_tipsWidget(new TipsWidget(floatMode)) + , m_arrowRectWidget(new DArrowRectangle(DArrowRectangle::ArrowBottom, this)) + , m_kbLayoutListView(nullptr) + , m_keyboardBtn(nullptr) +diff --git a/src/widgets/controlwidget.h b/src/widgets/controlwidget.h +index 7420d85..0c9a217 100644 +--- a/src/widgets/controlwidget.h ++++ b/src/widgets/controlwidget.h +@@ -89,7 +89,7 @@ class ControlWidget : public QWidget + { + Q_OBJECT + public: +- explicit ControlWidget(const SessionBaseModel *model, QWidget *parent = nullptr); ++ explicit ControlWidget(const SessionBaseModel *model, DArrowRectangle::FloatMode floatMode, QWidget *parent = nullptr); + ~ControlWidget() override; + + void setModel(const SessionBaseModel *model); +diff --git a/src/widgets/tipswidget.cpp b/src/widgets/tipswidget.cpp +index 32d7bbc..de441af 100644 +--- a/src/widgets/tipswidget.cpp ++++ b/src/widgets/tipswidget.cpp +@@ -25,6 +25,24 @@ TipsWidget::TipsWidget(QWidget *parent) + setArrowHeight(10); + } + ++TipsWidget::TipsWidget(DArrowRectangle::FloatMode floatMode, QWidget *parent) ++ : DArrowRectangle(DArrowRectangle::ArrowBottom, floatMode, parent) ++{ ++ if (DWindowManagerHelper::instance()->hasComposite()) { ++ setRadiusArrowStyleEnable(true); ++ setProperty("_d_radius_force", true); ++ setRadius(6); ++ } else { ++ setProperty("_d_radius_force", false); ++ } ++ ++ setShadowXOffset(0); ++ setShadowYOffset(0); ++ setArrowHeight(0); ++ setMargin(0); ++ setShadowBlurRadius(0); ++} ++ + void TipsWidget::setContent(QWidget *content) + { + QWidget *lastWidget = getContent(); +diff --git a/src/widgets/tipswidget.h b/src/widgets/tipswidget.h +index a534bab..7ee9191 100644 +--- a/src/widgets/tipswidget.h ++++ b/src/widgets/tipswidget.h +@@ -11,6 +11,7 @@ class TipsWidget : public Dtk::Widget::DArrowRectangle + { + public: + explicit TipsWidget(QWidget *parent = nullptr); ++ explicit TipsWidget(DArrowRectangle::FloatMode, QWidget *parent = nullptr); + void setContent(QWidget *content); + + public slots: +diff --git a/tests/dde-lock/ut_controlwidget.cpp b/tests/dde-lock/ut_controlwidget.cpp +index f791bd5..f0d9f25 100644 +--- a/tests/dde-lock/ut_controlwidget.cpp ++++ b/tests/dde-lock/ut_controlwidget.cpp +@@ -2,6 +2,7 @@ + // + // SPDX-License-Identifier: GPL-3.0-or-later + ++#include "tipswidget.h" + #include "controlwidget.h" + #include "sessionbasemodel.h" + #include +@@ -26,7 +27,7 @@ void UT_ControlWidget::SetUp() + m_model->setAppType(Lock); + std::shared_ptr user_ptr(new User); + m_model->updateCurrentUser(user_ptr); +- m_controlWidget = new ControlWidget(m_model); ++ m_controlWidget = new ControlWidget(m_model, DArrowRectangle::FloatWidget); + } + + void UT_ControlWidget::TearDown() +diff --git a/tests/dde-lock/ut_lockcontent.cpp b/tests/dde-lock/ut_lockcontent.cpp +index 63693eb..1c64f86 100644 +--- a/tests/dde-lock/ut_lockcontent.cpp ++++ b/tests/dde-lock/ut_lockcontent.cpp +@@ -24,7 +24,7 @@ void UT_LockContent::SetUp() + m_model = new SessionBaseModel(); + std::shared_ptr user_ptr(new User); + m_model->updateCurrentUser(user_ptr); +- LockContent::instance()->init(m_model); ++ LockContent::instance()->init(m_model, DArrowRectangle::FloatWidget); + m_content = LockContent::instance(); + } + diff --git a/to-disable-cancel-after-clicking-logout.patch b/to-disable-cancel-after-clicking-logout.patch new file mode 100644 index 0000000000000000000000000000000000000000..d41a452fc16b685e14ba7954cb5c7256d728d18b --- /dev/null +++ b/to-disable-cancel-after-clicking-logout.patch @@ -0,0 +1,75 @@ +From 3260f6331fd16b101ceb1fee71a4be08f37f035c Mon Sep 17 00:00:00 2001 +From: kkz +Date: Mon, 6 Jan 2025 21:20:27 +0800 +Subject: [PATCH] to disable cancel after clicking logout + +--- + src/widgets/inhibitwarnview.cpp | 5 +++++ + src/widgets/warningcontent.cpp | 8 ++++++++ + src/widgets/warningcontent.h | 1 + + 3 files changed, 14 insertions(+) + +diff --git a/src/widgets/inhibitwarnview.cpp b/src/widgets/inhibitwarnview.cpp +index 66e8926..44c329b 100644 +--- a/src/widgets/inhibitwarnview.cpp ++++ b/src/widgets/inhibitwarnview.cpp +@@ -282,6 +282,11 @@ void InhibitWarnView::initConnection() + + void InhibitWarnView::onAccept() + { ++ m_cancelBtn->setEnabled(false); ++ m_cancelBtn->hide(); ++ m_acceptBtn->setEnabled(false); ++ setInhibitConfirmMessage(""); ++ + if (!m_inhibitorPtrList.isEmpty() && m_waitForAppPreparing) { + int height = m_bottomWidget->height(); + m_cancelBtn->hide(); +diff --git a/src/widgets/warningcontent.cpp b/src/widgets/warningcontent.cpp +index 56bc4b3..57ec3b3 100644 +--- a/src/widgets/warningcontent.cpp ++++ b/src/widgets/warningcontent.cpp +@@ -149,6 +149,9 @@ QList WarningContent::listInhibitors(const Sessi + + void WarningContent::doCancelShutdownInhibit() + { ++ if (true == m_acting) ++ return; ++ + InhibitWarnView *view = qobject_cast(m_warningView); + if (view && view->delayView()) + return; +@@ -168,6 +171,9 @@ void WarningContent::doAcceptShutdownInhibit() + { + qCInfo(DDE_SHELL) << "Accept shutdown inhibit, power action: " << m_powerAction + << ", current mode: " << m_model->currentModeState(); ++ ++ m_acting = true; ++ + InhibitWarnView *view = qobject_cast(sender()); + if (view) { + view->setDelayView(false); +@@ -209,6 +215,8 @@ void WarningContent::beforeInvokeAction(bool needConfirm) + const QList inhibitors = listInhibitors(m_powerAction); + const QList> &loginUsers = m_model->loginedUserList(); + ++ m_acting = false; ++ + if (m_warningView != nullptr) { + qCInfo(DDE_SHELL) << "Before invoke action, delete warning view: " << m_warningView; + m_warningView->deleteLater(); +diff --git a/src/widgets/warningcontent.h b/src/widgets/warningcontent.h +index bb70562..ec8ae1f 100644 +--- a/src/widgets/warningcontent.h ++++ b/src/widgets/warningcontent.h +@@ -50,6 +50,7 @@ private: + QStringList m_inhibitorBlacklists; + SessionBaseModel::PowerAction m_powerAction; + int m_failures; ++ bool m_acting; + }; + + class InhibitHint +-- +2.43.0 +