#!/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())