1154 lines
32 KiB
Diff
1154 lines
32 KiB
Diff
From 9234037bda8171712106b3dd920c1040aaf4b678 Mon Sep 17 00:00:00 2001
|
||
From: huayadong <huayadong@kylinos.cn>
|
||
Date: Thu, 9 Dec 2021 17:44:44 +0800
|
||
Subject: [PATCH] sssss
|
||
|
||
---
|
||
data/org.ukui.screensaver.gschema.xml | 2 +-
|
||
data/ukui-screensaver-qt | 15 +-
|
||
debian/changelog | 18 --
|
||
debian/control | 5 +-
|
||
debian/copyright | 1 +
|
||
debian/source/format | 2 +-
|
||
screensaver/language/screensaver-zh_CN.ini | 4 +-
|
||
screensaver/screensaver.cpp | 2 +-
|
||
screensaver/sleeptime.cpp | 6 +-
|
||
screensaver/sleeptime.h | 1 +
|
||
src/CMakeLists.txt | 14 +-
|
||
src/authdialog.cpp | 7 +-
|
||
src/authdialog.h | 3 +-
|
||
src/configuration.cpp | 4 -
|
||
src/fullbackgroundwidget.cpp | 21 +-
|
||
src/interface.cpp | 99 +------
|
||
src/interface.h | 9 -
|
||
src/lockwidget.cpp | 14 +-
|
||
src/lockwidget.h | 1 -
|
||
src/org.ukui.ScreenSaver.xml | 2 -
|
||
src/pam-tally.c | 323 +++++++++++++++++++++
|
||
src/pam-tally.h | 54 ++--
|
||
src/screensaver.cpp | 1 -
|
||
src/screensaverwidget.cpp | 11 +-
|
||
src/ukui-screensaver-backend.cpp | 19 ++
|
||
src/ukui-screensaver-dialog.cpp | 6 +-
|
||
26 files changed, 423 insertions(+), 221 deletions(-)
|
||
create mode 100644 src/pam-tally.c
|
||
|
||
diff --git a/data/org.ukui.screensaver.gschema.xml b/data/org.ukui.screensaver.gschema.xml
|
||
index daf72b7..1fd0c86 100755
|
||
--- a/data/org.ukui.screensaver.gschema.xml
|
||
+++ b/data/org.ukui.screensaver.gschema.xml
|
||
@@ -99,7 +99,7 @@
|
||
<description>Allow the session status message to be displayed when the screen is locked.</description>
|
||
</key>
|
||
<key name="background" type="s">
|
||
- <default>'/usr/share/backgrounds/warty-final-ubuntukylin.jpg'</default>
|
||
+ <default>''</default>
|
||
<summary>the background iamge of lockscreen</summary>
|
||
<description>Allow the user to set the background iamge of lockscreen.</description>
|
||
</key>
|
||
diff --git a/data/ukui-screensaver-qt b/data/ukui-screensaver-qt
|
||
index ae19643..6af045a 100755
|
||
--- a/data/ukui-screensaver-qt
|
||
+++ b/data/ukui-screensaver-qt
|
||
@@ -1,4 +1,11 @@
|
||
-auth include system-auth
|
||
-account include system-auth
|
||
-password include system-auth
|
||
-session include system-auth
|
||
\ No newline at end of file
|
||
+@include common-auth
|
||
+auth optional pam_gnome_keyring.so
|
||
+
|
||
+
|
||
+#If you are using Arch,comment out the
|
||
+#above and use the following.
|
||
+
|
||
+#auth include system-auth
|
||
+#account include system-auth
|
||
+#password include system-auth
|
||
+#session include system-auth
|
||
diff --git a/debian/changelog b/debian/changelog
|
||
index 843e20c..60f2269 100755
|
||
--- a/debian/changelog
|
||
+++ b/debian/changelog
|
||
@@ -1,21 +1,3 @@
|
||
-ukui-screensaver (3.0.2-1~0804) unstable; urgency=medium
|
||
-
|
||
- * New upstream release.
|
||
-
|
||
- -- handsome_feng <jianfengli@ubuntukylin.com> Thu, 05 Aug 2021 14:22:40+0800
|
||
-
|
||
-ukui-screensaver (3.0.1-1) unstable; urgency=medium
|
||
-
|
||
- * New upstream bugfix release.
|
||
-
|
||
- -- handsome_feng <jianfengli@ubuntukylin.com> Sun, 27 Sep 2020 14:47:09 +0800
|
||
-
|
||
-ukui-screensaver (3.0.0-1+1031) focal; urgency=medium
|
||
-
|
||
- * Daily build.
|
||
-
|
||
- -- liuliang <liuliang@ubuntukylin.com> Mon, 27 May 2019 15:48:18 +0800
|
||
-
|
||
ukui-screensaver (3.0.0-1) unstable; urgency=medium
|
||
|
||
* New upstream release.
|
||
diff --git a/debian/control b/debian/control
|
||
index d5fcc83..cdfa10f 100755
|
||
--- a/debian/control
|
||
+++ b/debian/control
|
||
@@ -12,12 +12,9 @@ Build-Depends: debhelper-compat (= 12),
|
||
qttools5-dev,
|
||
qttools5-dev-tools,
|
||
libglib2.0-dev,
|
||
- libopencv-dev,
|
||
libx11-dev,
|
||
libxtst-dev,
|
||
- libgsettings-qt-dev,
|
||
- libkf5windowsystem-dev,
|
||
- libmatemixer-dev
|
||
+ libgsettings-qt-dev
|
||
Standards-Version: 4.5.0
|
||
Rules-Requires-Root: no
|
||
Homepage: https://www.github.com/ukui/ukui-screensaver
|
||
diff --git a/debian/copyright b/debian/copyright
|
||
index a79795b..9920bbb 100755
|
||
--- a/debian/copyright
|
||
+++ b/debian/copyright
|
||
@@ -10,6 +10,7 @@ Files: CMakeLists.txt
|
||
debian/*
|
||
screensaver/*
|
||
Common/*
|
||
+ .gitmodules
|
||
Copyright: 2018, Tianjin KYLIN Information Technology Co., Ltd.
|
||
License: GPL-3+
|
||
|
||
diff --git a/debian/source/format b/debian/source/format
|
||
index 89ae9db..163aaf8 100755
|
||
--- a/debian/source/format
|
||
+++ b/debian/source/format
|
||
@@ -1 +1 @@
|
||
-3.0 (native)
|
||
+3.0 (quilt)
|
||
diff --git a/screensaver/language/screensaver-zh_CN.ini b/screensaver/language/screensaver-zh_CN.ini
|
||
index 0b1b594..aefa4d5 100755
|
||
--- a/screensaver/language/screensaver-zh_CN.ini
|
||
+++ b/screensaver/language/screensaver-zh_CN.ini
|
||
@@ -136,13 +136,13 @@ OL=我将永远忠于自己,披星戴月的奔向理想与自由。
|
||
author=佚名
|
||
[41]
|
||
OL=有一天,我看了43次日落!
|
||
-author=《小王子》
|
||
+author=佚名
|
||
[42]
|
||
OL=当太阳升到最高点的时候,影子就不见了。
|
||
author=佚名
|
||
[43]
|
||
OL=拯救地球好累,虽然有些疲惫但我还是会。
|
||
-author=《超人不会飞》
|
||
+author=佚名
|
||
[44]
|
||
OL=陌上花开,可缓缓归矣
|
||
author=佚名
|
||
diff --git a/screensaver/screensaver.cpp b/screensaver/screensaver.cpp
|
||
index 1739afd..5a7deaa 100755
|
||
--- a/screensaver/screensaver.cpp
|
||
+++ b/screensaver/screensaver.cpp
|
||
@@ -57,7 +57,6 @@ Screensaver::Screensaver(QWidget *parent):
|
||
m_timer(nullptr)
|
||
{
|
||
installEventFilter(this);
|
||
- setWindowFlags(Qt::X11BypassWindowManagerHint);
|
||
setUpdateCenterWidget();
|
||
initUI();
|
||
m_background = new MBackground();
|
||
@@ -408,6 +407,7 @@ void Screensaver::setSleeptime()
|
||
{
|
||
sleepTime = new SleepTime(this);
|
||
sleepTime->adjustSize();
|
||
+ sleepTime->setInitTime(QDateTime::currentDateTime());
|
||
updateDate();
|
||
}
|
||
|
||
diff --git a/screensaver/sleeptime.cpp b/screensaver/sleeptime.cpp
|
||
index cc92fa4..2cf1f63 100755
|
||
--- a/screensaver/sleeptime.cpp
|
||
+++ b/screensaver/sleeptime.cpp
|
||
@@ -74,7 +74,11 @@ void SleepTime::init()
|
||
|
||
layout->addWidget(restTime);
|
||
|
||
- initTime = QDateTime::currentDateTime();
|
||
+}
|
||
+
|
||
+int SleepTime::setInitTime(QDateTime time)
|
||
+{
|
||
+ initTime = time;
|
||
}
|
||
|
||
int SleepTime::setTime(QDateTime time)
|
||
diff --git a/screensaver/sleeptime.h b/screensaver/sleeptime.h
|
||
index 7ed618a..5bc6d7a 100755
|
||
--- a/screensaver/sleeptime.h
|
||
+++ b/screensaver/sleeptime.h
|
||
@@ -33,6 +33,7 @@ public:
|
||
explicit SleepTime(QWidget *parent = nullptr);
|
||
~SleepTime();
|
||
int setTime(QDateTime time);
|
||
+ int setInitTime(QDateTime time);
|
||
|
||
private:
|
||
QLabel *restTime;
|
||
diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
|
||
index 5f2e32c..62bb23e 100755
|
||
--- a/src/CMakeLists.txt
|
||
+++ b/src/CMakeLists.txt
|
||
@@ -37,6 +37,7 @@ qt5_add_resources(dialog_SRC
|
||
|
||
# 头文件中包含了Xlib.h,需要单独拿出来处理,不知道原因
|
||
qt5_wrap_cpp(dialog_SRC
|
||
+ pam-tally.h
|
||
fullbackgroundwidget.h
|
||
lockwidget.h
|
||
authdialog.h
|
||
@@ -47,16 +48,16 @@ qt5_wrap_cpp(dialog_SRC
|
||
xeventmonitor.h
|
||
monitorwatcher.h
|
||
configuration.h
|
||
- users.h
|
||
- displaymanager.h
|
||
+ users.h
|
||
+ displaymanager.h
|
||
iconedit.h
|
||
powermanager.h
|
||
- logind.h
|
||
- pam-tally.h
|
||
+ logind.h
|
||
)
|
||
|
||
set(dialog_SRC
|
||
${dialog_SRC}
|
||
+ pam-tally.c
|
||
ukui-screensaver-dialog.cpp
|
||
fullbackgroundwidget.cpp
|
||
lockwidget.cpp
|
||
@@ -72,8 +73,7 @@ set(dialog_SRC
|
||
users.cpp
|
||
displaymanager.cpp
|
||
iconedit.cpp
|
||
- logind.cpp
|
||
- pam-tally.cpp
|
||
+ logind.cpp
|
||
)
|
||
add_executable(ukui-screensaver-dialog ${dialog_SRC})
|
||
|
||
@@ -83,7 +83,7 @@ target_link_libraries(ukui-screensaver-dialog
|
||
Qt5::DBus
|
||
Qt5::X11Extras
|
||
${EXTRA_LIBS}
|
||
- BiometricAuth
|
||
+ BiometricAuth
|
||
VirtualKeyboard
|
||
Common
|
||
)
|
||
diff --git a/src/authdialog.cpp b/src/authdialog.cpp
|
||
index d94f775..bf25009 100755
|
||
--- a/src/authdialog.cpp
|
||
+++ b/src/authdialog.cpp
|
||
@@ -31,7 +31,6 @@
|
||
#include "biometricproxy.h"
|
||
#include "biometricauthwidget.h"
|
||
#include "biometricdeviceswidget.h"
|
||
-#include "pam-tally.h"
|
||
|
||
AuthDialog::AuthDialog(const UserItem &user, QWidget *parent) :
|
||
QWidget(parent),
|
||
@@ -42,11 +41,12 @@ AuthDialog::AuthDialog(const UserItem &user, QWidget *parent) :
|
||
m_biometricProxy(nullptr),
|
||
m_biometricAuthWidget(nullptr),
|
||
m_biometricDevicesWidget(nullptr),
|
||
- pamTally(PamTally::instance(this)),
|
||
m_buttonsWidget(nullptr)
|
||
{
|
||
initUI();
|
||
|
||
+ pam_tally_init();
|
||
+
|
||
connect(auth, &Auth::showMessage, this, &AuthDialog::onShowMessage);
|
||
connect(auth, &Auth::showPrompt, this, &AuthDialog::onShowPrompt);
|
||
connect(auth, &Auth::authenticateComplete, this, &AuthDialog::onAuthComplete);
|
||
@@ -251,8 +251,7 @@ void AuthDialog::onAuthComplete()
|
||
}
|
||
else
|
||
{
|
||
- if(pamTally->getDeny() == 0)
|
||
- onShowMessage(tr("Password Incorrect, Please try again"),
|
||
+ onShowMessage(tr("Password Incorrect, Please try again"),
|
||
Auth::MessageTypeError);
|
||
//认证失败,重新认证
|
||
|
||
diff --git a/src/authdialog.h b/src/authdialog.h
|
||
index 6572152..837c6dd 100755
|
||
--- a/src/authdialog.h
|
||
+++ b/src/authdialog.h
|
||
@@ -27,6 +27,7 @@
|
||
#include "types.h"
|
||
#include "users.h"
|
||
#include "biometricdeviceinfo.h"
|
||
+#include "pam-tally.h"
|
||
|
||
|
||
namespace Ui {
|
||
@@ -40,7 +41,6 @@ class Auth;
|
||
class BiometricProxy;
|
||
class BiometricAuthWidget;
|
||
class BiometricDevicesWidget;
|
||
-class PamTally;
|
||
|
||
extern float scale;
|
||
class AuthDialog : public QWidget
|
||
@@ -129,7 +129,6 @@ private:
|
||
QWidget *m_passwdWidget; //放置密码输入框和信息列表
|
||
IconEdit *m_passwordEdit; //密码输入框
|
||
QLabel *m_messageLabel; //PAM消息显示
|
||
- PamTally *pamTally;
|
||
};
|
||
|
||
#endif // AUTHDIALOG_H
|
||
diff --git a/src/configuration.cpp b/src/configuration.cpp
|
||
index f67f844..6590172 100755
|
||
--- a/src/configuration.cpp
|
||
+++ b/src/configuration.cpp
|
||
@@ -141,10 +141,6 @@ ScreenSaver *Configuration::getScreensaver()
|
||
break;
|
||
}
|
||
case SAVER_SINGLE:
|
||
- if(themes.count()==0){
|
||
- saver->path = "/usr/lib/ukui-screensaver/ukui-screensaver-default";
|
||
- break;
|
||
- }
|
||
saver->path = getXScreensaverPath(themes[0]);
|
||
break;
|
||
case SAVER_IMAGE:
|
||
diff --git a/src/fullbackgroundwidget.cpp b/src/fullbackgroundwidget.cpp
|
||
index d7bccb5..46795d0 100755
|
||
--- a/src/fullbackgroundwidget.cpp
|
||
+++ b/src/fullbackgroundwidget.cpp
|
||
@@ -165,7 +165,7 @@ FullBackgroundWidget::FullBackgroundWidget(QWidget *parent)
|
||
|
||
init();
|
||
qApp->installNativeEventFilter(this);
|
||
- installEventFilter(this);
|
||
+
|
||
QTimer::singleShot(500,this,SLOT(switchToLinux()));
|
||
}
|
||
|
||
@@ -213,7 +213,7 @@ bool FullBackgroundWidget::eventFilter(QObject *obj, QEvent *event)
|
||
if(event->type() == QEvent::WindowDeactivate){
|
||
QTimer::singleShot(50,this,SLOT(laterActivate()));
|
||
}else if(event->type() == QEvent::WindowActivate){
|
||
- QTimer::singleShot(200,this,SLOT(setLockState()));
|
||
+ QTimer::singleShot(500,this,SLOT(setLockState()));
|
||
}
|
||
return false;
|
||
}
|
||
@@ -516,10 +516,7 @@ void FullBackgroundWidget::onGlobalButtonDrag(int xPos, int yPos)
|
||
ScreenSaver *saver = configuration->getScreensaver();
|
||
if(saver->path == "/usr/lib/ukui-screensaver/ukui-screensaver-default")
|
||
return ;
|
||
- if(screenStatus & SCREEN_SAVER)
|
||
- {
|
||
- clearScreensavers();
|
||
- }
|
||
+ clearScreensavers();
|
||
}
|
||
}
|
||
|
||
@@ -529,11 +526,8 @@ void FullBackgroundWidget::onScreenCountChanged(int)
|
||
QSize newSize = monitorWatcher->getVirtualSize();
|
||
setGeometry(0, 0, newSize.width(), newSize.height());
|
||
//repaint();
|
||
- if(screenStatus & SCREEN_SAVER)
|
||
- {
|
||
- clearScreensavers();
|
||
- }
|
||
update();
|
||
+ clearScreensavers();
|
||
}
|
||
|
||
void FullBackgroundWidget::onDesktopResized()
|
||
@@ -542,11 +536,8 @@ void FullBackgroundWidget::onDesktopResized()
|
||
setGeometry(desktop->geometry());
|
||
if(lockWidget)
|
||
onCursorMoved(cursor().pos());
|
||
- if(screenStatus & SCREEN_SAVER)
|
||
- {
|
||
- clearScreensavers();
|
||
- }
|
||
- //repaint();
|
||
+// clearScreensavers();
|
||
+ //repaint();
|
||
update();
|
||
|
||
}
|
||
diff --git a/src/interface.cpp b/src/interface.cpp
|
||
index 37de99b..5801ec9 100755
|
||
--- a/src/interface.cpp
|
||
+++ b/src/interface.cpp
|
||
@@ -19,16 +19,11 @@
|
||
#include <QDebug>
|
||
#include <QDBusConnection>
|
||
#include <QDBusMessage>
|
||
-#include <QDBusInterface>
|
||
-#include <QTimer>
|
||
#include <unistd.h>
|
||
-#include <QDBusPendingReply>
|
||
#include <signal.h>
|
||
|
||
Interface::Interface(QObject *parent)
|
||
- : QObject(parent),
|
||
- m_timerCount(0),
|
||
- m_timer(nullptr)
|
||
+ : QObject(parent)
|
||
{
|
||
lockState = false;
|
||
m_logind = new LogindIntegration(this);
|
||
@@ -43,13 +38,6 @@ Interface::Interface(QObject *parent)
|
||
}
|
||
);
|
||
|
||
- QDBusInterface *iface = new QDBusInterface("org.freedesktop.login1",
|
||
- "/org/freedesktop/login1",
|
||
- "org.freedesktop.login1.Manager",
|
||
- QDBusConnection::systemBus(),
|
||
- this);
|
||
- connect(iface, SIGNAL(PrepareForSleep(bool)), this, SLOT(onPrepareForSleep(bool)));
|
||
- inhibit();
|
||
}
|
||
|
||
bool Interface::GetLockState()
|
||
@@ -62,52 +50,37 @@ void Interface::SetLockState()
|
||
lockState = true;
|
||
}
|
||
|
||
-void Interface::emitLockState()
|
||
-{
|
||
- QDBusMessage message = QDBusMessage::createSignal(SS_DBUS_PATH,
|
||
- SS_DBUS_INTERFACE,
|
||
- "lock");
|
||
- QDBusConnection::sessionBus().send(message);
|
||
-}
|
||
-
|
||
void Interface::Lock()
|
||
{
|
||
- if(process.state() != QProcess::NotRunning)
|
||
- return ;
|
||
qDebug() << "Lock requested";
|
||
lockState = false;
|
||
QString cmd = QString("/usr/bin/ukui-screensaver-dialog --lock");
|
||
qDebug() << cmd;
|
||
|
||
process.start(cmd);
|
||
- emitLockState();
|
||
+
|
||
}
|
||
|
||
void Interface::onSessionIdleReceived()
|
||
{
|
||
- if(process.state() != QProcess::NotRunning)
|
||
- return ;
|
||
-
|
||
qDebug() << "emit SessionIdle";
|
||
lockState = false;
|
||
QString cmd = QString("/usr/bin/ukui-screensaver-dialog --session-idle");
|
||
qDebug() << cmd;
|
||
+
|
||
process.start(cmd);
|
||
- emitLockState();
|
||
+
|
||
}
|
||
|
||
void Interface::onShowScreensaver()
|
||
{
|
||
- if(process.state() != QProcess::NotRunning)
|
||
- return ;
|
||
-
|
||
qDebug() << "lock and show screensaver";
|
||
lockState = false;
|
||
QString cmd = QString("/usr/bin/ukui-screensaver-dialog --screensaver");
|
||
qDebug() << cmd;
|
||
|
||
process.start(cmd);
|
||
- emitLockState();
|
||
+
|
||
}
|
||
|
||
bool Interface::checkExistChild()
|
||
@@ -136,65 +109,3 @@ void Interface::onNameLost(const QString &serviceName)
|
||
if(serviceName == "cn.kylinos.ScreenSaver")
|
||
exit(0);
|
||
}
|
||
-
|
||
-void Interface::onPrepareForSleep(bool sleep)
|
||
-{
|
||
-
|
||
- if(sleep)
|
||
- {
|
||
- if(GetLockState()){
|
||
- uninhibit();
|
||
- return;
|
||
- }
|
||
-
|
||
- this->Lock();
|
||
-
|
||
- if(!m_timer){
|
||
- m_timer = new QTimer(this);
|
||
- connect(m_timer, &QTimer::timeout, this, [&]{
|
||
- m_timerCount+=1;
|
||
-
|
||
- if(GetLockState() || m_timerCount>20){
|
||
- m_timer->stop();
|
||
- m_timerCount = 0;
|
||
- uninhibit();
|
||
- }
|
||
- });
|
||
- }
|
||
- m_timer->start(100);
|
||
- }
|
||
- else
|
||
- {
|
||
- inhibit();
|
||
- }
|
||
-}
|
||
-
|
||
-void Interface::inhibit()
|
||
-{
|
||
- if (m_inhibitFileDescriptor.isValid()) {
|
||
- return;
|
||
- }
|
||
-
|
||
- QDBusMessage message = QDBusMessage::createMethodCall("org.freedesktop.login1",
|
||
- "/org/freedesktop/login1",
|
||
- "org.freedesktop.login1.Manager",
|
||
- QStringLiteral("Inhibit"));
|
||
- message.setArguments(QVariantList({QStringLiteral("sleep"),
|
||
- "Screen Locker Backend",
|
||
- "Ensuring that the screen gets locked before going to sleep",
|
||
- QStringLiteral("delay")}));
|
||
- QDBusPendingReply<QDBusUnixFileDescriptor> reply = QDBusConnection::systemBus().call(message);
|
||
- if (!reply.isValid()) {
|
||
- return;
|
||
- }
|
||
- reply.value().swap(m_inhibitFileDescriptor);
|
||
-}
|
||
-
|
||
-void Interface::uninhibit()
|
||
-{
|
||
- if (!m_inhibitFileDescriptor.isValid()) {
|
||
- return;
|
||
- }
|
||
-
|
||
- m_inhibitFileDescriptor = QDBusUnixFileDescriptor();
|
||
-}
|
||
diff --git a/src/interface.h b/src/interface.h
|
||
index 38209c8..f6889d9 100755
|
||
--- a/src/interface.h
|
||
+++ b/src/interface.h
|
||
@@ -21,8 +21,6 @@
|
||
#include <QObject>
|
||
#include <QDBusContext>
|
||
#include <QProcess>
|
||
-#include <QTimer>
|
||
-#include <QDBusUnixFileDescriptor>
|
||
#include "types.h"
|
||
#include "logind.h"
|
||
|
||
@@ -48,17 +46,10 @@ public Q_SLOTS:
|
||
void onSessionIdleReceived();
|
||
void onShowScreensaver();
|
||
void onNameLost(const QString&);
|
||
- void onPrepareForSleep(bool sleep);
|
||
|
||
private:
|
||
bool checkExistChild();
|
||
- void inhibit();
|
||
- void uninhibit();
|
||
bool lockState;
|
||
- void emitLockState();
|
||
- int m_timerCount;
|
||
- QTimer *m_timer;
|
||
- QDBusUnixFileDescriptor m_inhibitFileDescriptor;
|
||
|
||
private:
|
||
QProcess process;
|
||
diff --git a/src/lockwidget.cpp b/src/lockwidget.cpp
|
||
index 0b75b6d..3ab66a5 100755
|
||
--- a/src/lockwidget.cpp
|
||
+++ b/src/lockwidget.cpp
|
||
@@ -52,10 +52,6 @@ LockWidget::LockWidget(QWidget *parent)
|
||
authDialog, &AuthDialog::onCapsLockChanged);
|
||
this->installEventFilter(this);
|
||
initUI();
|
||
-
|
||
- if(users->getUsers().count() < 2){
|
||
- ui->btnSwitchUser->hide();
|
||
- }
|
||
}
|
||
|
||
LockWidget::~LockWidget()
|
||
@@ -191,7 +187,7 @@ void LockWidget::showPowerManager()
|
||
authDialog->show();
|
||
powermanager->hide();
|
||
}
|
||
- else{
|
||
+ else{
|
||
authDialog->hide();
|
||
powermanager->show();
|
||
powermanager->setGeometry((width()-ITEM_WIDTH*5)/2,
|
||
@@ -282,14 +278,6 @@ void LockWidget::initUserMenu()
|
||
}
|
||
}
|
||
|
||
-void LockWidget::keyReleaseEvent(QKeyEvent *e)
|
||
-{
|
||
- if(e->key() == Qt::Key_K){
|
||
- if(e->modifiers() & Qt::ControlModifier)
|
||
- showVirtualKeyboard();
|
||
- }
|
||
-}
|
||
-
|
||
/* lockscreen follows cursor */
|
||
void LockWidget::resizeEvent(QResizeEvent *event)
|
||
{
|
||
diff --git a/src/lockwidget.h b/src/lockwidget.h
|
||
index 0e8d586..311b872 100755
|
||
--- a/src/lockwidget.h
|
||
+++ b/src/lockwidget.h
|
||
@@ -69,7 +69,6 @@ private Q_SLOTS:
|
||
protected:
|
||
bool eventFilter(QObject *obj, QEvent *event);
|
||
void resizeEvent(QResizeEvent *event);
|
||
- void keyReleaseEvent(QKeyEvent *e);
|
||
|
||
private:
|
||
Ui::LockWidget *ui;
|
||
diff --git a/src/org.ukui.ScreenSaver.xml b/src/org.ukui.ScreenSaver.xml
|
||
index 85d08c2..cd4fa9e 100755
|
||
--- a/src/org.ukui.ScreenSaver.xml
|
||
+++ b/src/org.ukui.ScreenSaver.xml
|
||
@@ -3,8 +3,6 @@
|
||
<interface name="org.ukui.ScreenSaver">
|
||
<signal name="SessionIdle">
|
||
</signal>
|
||
- <signal name="lock">
|
||
- </signal>
|
||
<method name="Lock">
|
||
</method>
|
||
<method name="SetLockState">
|
||
diff --git a/src/pam-tally.c b/src/pam-tally.c
|
||
new file mode 100644
|
||
index 0000000..53bd377
|
||
--- /dev/null
|
||
+++ b/src/pam-tally.c
|
||
@@ -0,0 +1,323 @@
|
||
+/*
|
||
+ * Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd.
|
||
+ *
|
||
+ * This program is free software; you can redistribute it and/or modify
|
||
+ * it under the terms of the GNU General Public License as published by
|
||
+ * the Free Software Foundation; either version 3, or (at your option)
|
||
+ * any later version.
|
||
+ *
|
||
+ * This program is distributed in the hope that it will be useful,
|
||
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
+ * GNU General Public License for more details.
|
||
+ *
|
||
+ * You should have received a copy of the GNU General Public License
|
||
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||
+ *
|
||
+**/
|
||
+
|
||
+#include "pam-tally.h"
|
||
+
|
||
+#include <sys/types.h>
|
||
+#include <errno.h>
|
||
+#include <string.h>
|
||
+#include <sys/mman.h>
|
||
+#include <unistd.h>
|
||
+#include <sys/stat.h>
|
||
+#include <fcntl.h>
|
||
+#include <stdio.h>
|
||
+
|
||
+//#include "gs-debug.h"
|
||
+
|
||
+char shm_tally_real[128];
|
||
+
|
||
+#define FILE_MODE (S_IRUSR | S_IWUSR)
|
||
+
|
||
+#define CONFIG_FILE "/usr/share/lightdm/lightdm.conf.d/96-kylin-setting.conf"
|
||
+
|
||
+
|
||
+
|
||
+static
|
||
+int get_is_open_other_authentication()
|
||
+{
|
||
+ char buf[128];
|
||
+ FILE *config_file;
|
||
+
|
||
+ if( (config_file = fopen(CONFIG_FILE, "r")) == NULL)
|
||
+ {
|
||
+ //gs_debug("open %s failed", CONFIG_FILE);
|
||
+ return 0;
|
||
+ }
|
||
+
|
||
+ int open_other_authentication = 0;
|
||
+ while(fgets(buf, sizeof(buf), config_file)) {
|
||
+ if(strlen(buf) == 0 || buf[0] == '#')
|
||
+ {
|
||
+ memset(buf, sizeof(buf), 0);
|
||
+ continue;
|
||
+ }
|
||
+ if(buf[strlen(buf)-1] == '\n')
|
||
+ buf[strlen(buf)-1] = '\0';
|
||
+
|
||
+ char *p = strchr(buf, '=');
|
||
+ if(!p)
|
||
+ continue;
|
||
+ *p = '\0';
|
||
+
|
||
+ size_t len = strlen(buf);
|
||
+ if(len == 0)
|
||
+ continue;
|
||
+ //去掉=之前的空格
|
||
+ while(len--)
|
||
+ if(buf[len] == ' ' || buf[len] == '\t')
|
||
+ buf[len] = '\0';
|
||
+ if(strcmp(buf, "open-other-authentication") != 0)
|
||
+ continue;
|
||
+
|
||
+ p++;
|
||
+ len = strlen(p);
|
||
+ if(len == 0)
|
||
+ break;
|
||
+ //去掉等号之后的空格
|
||
+ while(*p == ' ' || *p == '\t')
|
||
+ {
|
||
+ p++;
|
||
+ len--;
|
||
+ }
|
||
+ //去掉尾部空格
|
||
+ while(len--)
|
||
+ if(*(p+len) == ' ' || *(p+len) == '\t')
|
||
+ *(p+len) = '\0';
|
||
+
|
||
+ if(*p == '0')
|
||
+ break;
|
||
+ if(*p == '1')
|
||
+ {
|
||
+ open_other_authentication = 1;
|
||
+ break;
|
||
+ }
|
||
+ }
|
||
+ fclose(config_file);
|
||
+ //gs_debug("--------------------------%d", open_other_authentication);
|
||
+ return open_other_authentication;
|
||
+}
|
||
+
|
||
+static
|
||
+int get_pam_tally(int *deny, int *unlock_time)
|
||
+{
|
||
+ char buf[128];
|
||
+ FILE *auth_file;
|
||
+
|
||
+ if( (auth_file = fopen("/etc/pam.d/common-auth", "r")) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ while(fgets(buf, sizeof(buf), auth_file)) {
|
||
+ if(strlen(buf) == 0 || buf[0] == '#')
|
||
+ continue;
|
||
+ if(!strstr(buf, "deny"))
|
||
+ continue;
|
||
+
|
||
+ char *ptr = strtok(buf, " \t");
|
||
+ while(ptr) {
|
||
+ if(strncmp(ptr, "deny=", 5)==0){
|
||
+ sscanf(ptr, "deny=%d", deny);
|
||
+ //gs_debug("-------------------- deny=%d", *deny);
|
||
+ }
|
||
+ if(strncmp(ptr, "unlock_time=", 12)==0){
|
||
+ sscanf(ptr, "unlock_time=%d", unlock_time);
|
||
+ //gs_debug("-------------------- unlock_time=%d", *unlock_time);
|
||
+ }
|
||
+ ptr = strtok(NULL, " \t");
|
||
+ }
|
||
+ return 1;
|
||
+ }
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+static
|
||
+void set_shm_tally_real()
|
||
+{
|
||
+ sprintf(shm_tally_real, "%s_%d", SHM_TALLY, getuid());
|
||
+}
|
||
+
|
||
+int pam_tally_init()
|
||
+{
|
||
+ int fd;
|
||
+ int deny = 0, unlock_time = 0;
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ set_shm_tally_real();
|
||
+
|
||
+ printf("shm path =========== : %s\n", shm_tally_real);
|
||
+
|
||
+ shm_unlink(shm_tally_real);
|
||
+
|
||
+ if(get_is_open_other_authentication())
|
||
+ {
|
||
+ //gs_debug("open other authentication, disable pam_tally.");
|
||
+ return 0;
|
||
+ }
|
||
+ if(!get_pam_tally(&deny, &unlock_time))
|
||
+ {
|
||
+ //gs_debug("get pam_tally configuration failed, disable pam_tally.");
|
||
+ return 0;
|
||
+ }
|
||
+
|
||
+ /* if(deny <= 0)
|
||
+ deny = 3;
|
||
+ if(unlock_time <= 0)
|
||
+ unlock_time = 1800;
|
||
+*/
|
||
+ if( (fd = shm_open(shm_tally_real, O_RDWR | O_CREAT, FILE_MODE)) == -1)
|
||
+ {
|
||
+ printf("shm_open error: %s\n", strerror(errno));
|
||
+ return -1;
|
||
+ }
|
||
+
|
||
+ ftruncate(fd, sizeof(pam_tally));
|
||
+
|
||
+ if( (tally_ptr = mmap(NULL, sizeof(pam_tally),
|
||
+ PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED)
|
||
+ {
|
||
+ //gs_debug("mmap error: %s", strerror(errno));
|
||
+ close(fd);
|
||
+ return -1;
|
||
+ }
|
||
+ close(fd);
|
||
+
|
||
+ tally_ptr->deny = deny;
|
||
+ tally_ptr->unlock_time = unlock_time;
|
||
+ tally_ptr->failed = 0;
|
||
+ tally_ptr->lock_start_time = 0;
|
||
+
|
||
+ return 1;
|
||
+}
|
||
+
|
||
+static
|
||
+pam_tally* pam_tally_memory()
|
||
+{
|
||
+ int fd;
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ set_shm_tally_real();
|
||
+
|
||
+ if( (fd = shm_open(shm_tally_real, O_RDWR, FILE_MODE)) == -1)
|
||
+ {
|
||
+ //gs_debug("shm_open error: %s", strerror(errno));
|
||
+ return NULL;
|
||
+ }
|
||
+
|
||
+ if( (tally_ptr = mmap(NULL, sizeof(pam_tally),
|
||
+ PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0)) == MAP_FAILED)
|
||
+ {
|
||
+ //gs_debug("mmap error: %s", strerror(errno));
|
||
+ close(fd);
|
||
+ return NULL;
|
||
+ }
|
||
+ close(fd);
|
||
+ return tally_ptr;
|
||
+}
|
||
+
|
||
+int pam_tally_is_enbled()
|
||
+{
|
||
+ int fd;
|
||
+
|
||
+ set_shm_tally_real();
|
||
+
|
||
+ if( (fd = shm_open(shm_tally_real, O_RDONLY, FILE_MODE)) == -1)
|
||
+ {
|
||
+ printf("shm_open error: %s\n", strerror(errno));
|
||
+ return 0;
|
||
+ }
|
||
+
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ if((tally_ptr = pam_tally_memory()) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ if(tally_ptr->deny == 0 || tally_ptr->unlock_time == 0)
|
||
+ return 0;
|
||
+ return 1;
|
||
+}
|
||
+
|
||
+int pam_tally_add_failed()
|
||
+{
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ if((tally_ptr = pam_tally_memory()) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ tally_ptr->failed++;
|
||
+
|
||
+ //如果失败次数达到上限,开始计时
|
||
+ if(tally_ptr->failed >= tally_ptr->deny)
|
||
+ tally_ptr->lock_start_time = time(NULL);
|
||
+
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+int pam_tally_clear_failed()
|
||
+{
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ if((tally_ptr = pam_tally_memory()) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ tally_ptr->failed = 0;
|
||
+ tally_ptr->lock_start_time = 0;
|
||
+ return 0;
|
||
+}
|
||
+
|
||
+int pam_tally_failure_is_out()
|
||
+{
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ if((tally_ptr = pam_tally_memory()) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ return (tally_ptr->failed >= tally_ptr->deny ? 1 : 0);
|
||
+}
|
||
+
|
||
+int pam_tally_deny()
|
||
+{
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ if((tally_ptr = pam_tally_memory()) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ return tally_ptr->deny;
|
||
+}
|
||
+
|
||
+int pam_tally_failed_count()
|
||
+{
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ if((tally_ptr = pam_tally_memory()) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ return tally_ptr->failed;
|
||
+}
|
||
+
|
||
+int pam_tally_unlock_time()
|
||
+{
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ if((tally_ptr = pam_tally_memory()) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ printf("########################### unlock time = %d\n", tally_ptr->unlock_time);
|
||
+ return tally_ptr->unlock_time;
|
||
+}
|
||
+
|
||
+int pam_tally_is_canUnlock()
|
||
+{
|
||
+ pam_tally *tally_ptr;
|
||
+
|
||
+ if((tally_ptr = pam_tally_memory()) == NULL)
|
||
+ return -1;
|
||
+
|
||
+ if(tally_ptr->failed >= tally_ptr->deny &&
|
||
+ time(NULL) - tally_ptr->lock_start_time < tally_ptr->unlock_time)
|
||
+ return 0;
|
||
+ return 1;
|
||
+}
|
||
diff --git a/src/pam-tally.h b/src/pam-tally.h
|
||
index 07708c5..19c52d6 100755
|
||
--- a/src/pam-tally.h
|
||
+++ b/src/pam-tally.h
|
||
@@ -1,9 +1,9 @@
|
||
-/* configuration.h
|
||
+/*
|
||
* Copyright (C) 2018 Tianjin KYLIN Information Technology Co., Ltd.
|
||
*
|
||
* This program is free software; you can redistribute it and/or modify
|
||
* it under the terms of the GNU General Public License as published by
|
||
- * the Free Software Foundation; either version 2, or (at your option)
|
||
+ * the Free Software Foundation; either version 3, or (at your option)
|
||
* any later version.
|
||
*
|
||
* This program is distributed in the hope that it will be useful,
|
||
@@ -12,34 +12,38 @@
|
||
* GNU General Public License for more details.
|
||
*
|
||
* You should have received a copy of the GNU General Public License
|
||
- * along with this program; if not, write to the Free Software
|
||
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA
|
||
- * 02110-1301, USA.
|
||
+ * along with this program; if not, see <http://www.gnu.org/licenses/>.
|
||
+ *
|
||
**/
|
||
#ifndef PAM_TALLY_H
|
||
#define PAM_TALLY_H
|
||
|
||
-#include <QObject>
|
||
-
|
||
-class PamTally : public QObject
|
||
-{
|
||
- Q_OBJECT
|
||
-private:
|
||
- explicit PamTally(QObject *parent = nullptr);
|
||
+#include <time.h>
|
||
|
||
-public:
|
||
- static PamTally *instance(QObject *parent = nullptr);
|
||
- int getDeny();
|
||
- unsigned long long getUnlockTime();
|
||
- unsigned long long getRootUnlockTime();
|
||
+#ifdef __cplusplus
|
||
+extern "C" {
|
||
+#endif
|
||
|
||
-private:
|
||
- int deny;
|
||
- unsigned long long unlock_time;
|
||
- unsigned long long root_unlock_time;
|
||
- static PamTally *instance_;
|
||
-
|
||
- int parsePamConfig();
|
||
+#define SHM_TALLY "/shm_tally"
|
||
+struct _pam_tally {
|
||
+ int deny; //失败次数上限
|
||
+ int unlock_time; //失败次数达到上限后,多少秒之后才能解锁
|
||
+ int failed; //当前失败的次数
|
||
+ time_t lock_start_time; //失败次数达到上限后,开始计时
|
||
};
|
||
+typedef struct _pam_tally pam_tally;
|
||
+
|
||
+int pam_tally_init();
|
||
+int pam_tally_add_failed();
|
||
+int pam_tally_clear_failed();
|
||
+int pam_tally_falure_is_out();
|
||
+int pam_tally_deny();
|
||
+int pam_tally_failed_count();
|
||
+int pam_tally_unlock_time();
|
||
+int pam_tally_is_enbled();
|
||
+int pam_tally_is_canUnlock();
|
||
+#ifdef __cplusplus
|
||
+}
|
||
+#endif
|
||
|
||
-#endif // CONFIGURATION_H
|
||
+#endif // PAM_TALLY_H
|
||
diff --git a/src/screensaver.cpp b/src/screensaver.cpp
|
||
index 8e35ab1..601b325 100755
|
||
--- a/src/screensaver.cpp
|
||
+++ b/src/screensaver.cpp
|
||
@@ -63,7 +63,6 @@ bool ScreenSaver::exists()
|
||
case SAVER_IMAGE:
|
||
return QDir(path).exists();
|
||
}
|
||
- return false;
|
||
}
|
||
|
||
void ScreenSaver::startSwitchImages()
|
||
diff --git a/src/screensaverwidget.cpp b/src/screensaverwidget.cpp
|
||
index d691786..8f9efd3 100755
|
||
--- a/src/screensaverwidget.cpp
|
||
+++ b/src/screensaverwidget.cpp
|
||
@@ -37,15 +37,10 @@ ScreenSaverWidget::ScreenSaverWidget(ScreenSaver *screensaver, QWidget *parent)
|
||
setFocus();
|
||
this->installEventFilter(this);
|
||
|
||
- //QPalette plt;
|
||
- //plt.setBrush(QPalette::Window, Qt::black);
|
||
- //setPalette(plt);
|
||
- QPalette pal(palette());
|
||
- pal.setColor(QPalette::Background, Qt::black); //设置背景黑色
|
||
-
|
||
+ QPalette plt;
|
||
+ plt.setBrush(QPalette::Window, Qt::black);
|
||
+ setPalette(plt);
|
||
setAutoFillBackground(true);
|
||
- setPalette(pal);
|
||
-
|
||
switch(screensaver->mode) {
|
||
case SAVER_RANDOM:
|
||
case SAVER_SINGLE:
|
||
diff --git a/src/ukui-screensaver-backend.cpp b/src/ukui-screensaver-backend.cpp
|
||
index ccf4e3a..b333fd4 100755
|
||
--- a/src/ukui-screensaver-backend.cpp
|
||
+++ b/src/ukui-screensaver-backend.cpp
|
||
@@ -60,7 +60,25 @@ int main(int argc, char *argv[])
|
||
exit(EXIT_FAILURE);
|
||
}
|
||
|
||
+ // 如果已经有实例在运行则kill, 主要是针对注销后重新登录时之前的实例没有被kill掉
|
||
+ char cmd[128] = {0};
|
||
+ char str[16];
|
||
FILE *fp;
|
||
+ int pid;
|
||
+
|
||
+ int n = sprintf(cmd, "ps aux | grep ukui-screensaver-backend | grep %s | grep -v grep | awk '{print $2}'", getenv("USER"));
|
||
+ Q_UNUSED(n)
|
||
+
|
||
+ fp = popen(cmd, "r");
|
||
+ while(fgets(str, sizeof(str)-1, fp)) {
|
||
+ pid = atoi(str);
|
||
+
|
||
+ if(pid > 0 && pid != getpid()) {
|
||
+ qDebug() << "existing instance pid: " << pid;
|
||
+ kill(pid, SIGKILL);
|
||
+ }
|
||
+ }
|
||
+ pclose(fp);
|
||
|
||
// for PowerManager
|
||
fp = popen("xset s 0 0", "r");
|
||
@@ -101,5 +119,6 @@ int main(int argc, char *argv[])
|
||
QObject::connect(checkInterface, SIGNAL(NameLost(QString)),
|
||
interface, SLOT(onNameLost(QString)));
|
||
|
||
+
|
||
return a.exec();
|
||
}
|
||
diff --git a/src/ukui-screensaver-dialog.cpp b/src/ukui-screensaver-dialog.cpp
|
||
index 237b377..d78dafb 100755
|
||
--- a/src/ukui-screensaver-dialog.cpp
|
||
+++ b/src/ukui-screensaver-dialog.cpp
|
||
@@ -78,8 +78,7 @@ void checkIsRunning()
|
||
struct flock lock;
|
||
|
||
const QString PID_DIR = QString("/var/run/user/%1").arg(QString::number(getuid()));
|
||
- QString env = qgetenv("DISPLAY");
|
||
- const QString PID_FILE = PID_DIR + QString("/ukui-screensaver%1.pid").arg(env);
|
||
+ const QString PID_FILE = PID_DIR + "/ukui-screensaver.pid";
|
||
|
||
qDebug() << PID_DIR;
|
||
QDir dir(PID_DIR);
|
||
@@ -174,8 +173,7 @@ int main(int argc, char *argv[])
|
||
|
||
if(parser.isSet(lockOption))
|
||
{
|
||
- // window->lock();
|
||
- window->onScreensaver();
|
||
+ window->onScreensaver();
|
||
}
|
||
|
||
if(parser.isSet(sessionIdleOption))
|
||
--
|
||
2.30.0
|
||
|