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
|
|||
|
|
|