102 lines
3.0 KiB
Python
Executable File
102 lines
3.0 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
|
|
import os
|
|
import pwd
|
|
import sys
|
|
import hashlib
|
|
|
|
from PyQt5.QtWidgets import QApplication
|
|
from PyQt5.QtWidgets import QMainWindow
|
|
from PyQt5.QtWidgets import QLineEdit
|
|
from PyQt5.QtWidgets import QLabel
|
|
from PyQt5.QtWidgets import QVBoxLayout
|
|
from PyQt5.QtWidgets import QWidget
|
|
from PyQt5.QtWidgets import QDesktopWidget
|
|
from PyQt5.QtCore import Qt
|
|
from PyQt5.QtCore import QTimer
|
|
from PyQt5.QtGui import QCursor
|
|
|
|
|
|
CORRECT_PASSWORD_HASH = '1d2e2b10cf9a5474612138ac00bc8b1e8fe895822ddc1e77e0edd023fcff4565'
|
|
|
|
class LockScreen(QMainWindow):
|
|
def __init__(self):
|
|
super().__init__()
|
|
self.title = 'plock'
|
|
self.initUI()
|
|
|
|
def initUI(self):
|
|
self.setWindowTitle(self.title)
|
|
|
|
self.setWindowFlags(Qt.FramelessWindowHint)
|
|
|
|
self.central_widget = QWidget()
|
|
self.central_widget.setFixedSize(300, 100)
|
|
self.setCentralWidget(self.central_widget)
|
|
|
|
layout = QVBoxLayout()
|
|
|
|
current_user = pwd.getpwuid(os.getuid())[0]
|
|
self.password_label = QLabel(f"{current_user}'s password:")
|
|
self.password_label.setAlignment(Qt.AlignCenter)
|
|
|
|
layout.addWidget(self.password_label)
|
|
|
|
self.password_field = QLineEdit()
|
|
self.password_field.setEchoMode(QLineEdit.Password)
|
|
self.password_field.returnPressed.connect(self.check_password)
|
|
self.password_field.setFixedWidth(200)
|
|
|
|
layout.addWidget(self.password_field, 0, Qt.AlignCenter)
|
|
layout.setContentsMargins(50, 20, 50, 20)
|
|
|
|
self.central_widget.setLayout(layout)
|
|
|
|
self.show()
|
|
QTimer.singleShot(100, self.centerOnScreen)
|
|
# self.showFullScreen()
|
|
|
|
def centerOnScreen(self):
|
|
screen_center = QDesktopWidget().availableGeometry().center()
|
|
frame_geometry = self.frameGeometry()
|
|
screen_center.setY(screen_center.y() - 100)
|
|
frame_geometry.moveCenter(screen_center)
|
|
self.move(frame_geometry.topLeft())
|
|
|
|
def check_password(self):
|
|
entered_password_hash = hashlib.sha256(self.password_field.text().encode('utf-8')).hexdigest()
|
|
if entered_password_hash == CORRECT_PASSWORD_HASH:
|
|
self.close()
|
|
|
|
def showEvent(self, event):
|
|
super().showEvent(event)
|
|
QTimer.singleShot(100, self.grabKeyboardAndMouse)
|
|
|
|
def grabKeyboardAndMouse(self):
|
|
self.grabMouse()
|
|
self.grabKeyboard()
|
|
# self.setCursor(QCursor(Qt.BlankCursor))
|
|
self.password_field.setFocus()
|
|
|
|
def keyPressEvent(self, event):
|
|
self.grabMouse()
|
|
self.grabKeyboard()
|
|
# Secret bypass (currently inactive)
|
|
if (
|
|
False
|
|
and event.key() == Qt.Key_Escape
|
|
and event.modifiers() & Qt.ControlModifier
|
|
):
|
|
print("Secure exit requested")
|
|
self.close()
|
|
else:
|
|
self.password_field.keyPressEvent(event)
|
|
|
|
def main() -> int:
|
|
app = QApplication(sys.argv)
|
|
ex = LockScreen()
|
|
return app.exec_()
|
|
|
|
if __name__ == '__main__':
|
|
raise SystemExit(main())
|