42_scripts/plock

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