summaryrefslogtreecommitdiffstats
path: root/pylock.py
blob: 2ef6419792143e12396f8366b108c60e05bd59fe (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
#!/usr/bin/env python3

import signal
import sys
import os
import pwd
import locale
import argparse

from gi.repository import Gtk, Gdk, Gio

from DBus import DBus
from Locker import Locker
from LockWindow import LockWindow
import pam


_ = locale.gettext


def get_username():
    return pwd.getpwuid(os.getuid())[0]


theme = 'UzL-login'


parser = argparse.ArgumentParser(prog='pylock', description=_('GTK-based screen locker.'))
parser.add_argument('-t', '--timeout', type=int, default=0, help=_('Start in daemon mode that will automatically activate after a given time of inactivity.'))
parser.add_argument('-l', '--logout', type=int, default=0, help=_('Allow to logout the current user after a given time.'))
parser.add_argument('-c', '--logout-command', help=_('Specifies the command to be called to log out a user.'))
parser.add_argument('-u', '--username', default=get_username(), help=_('Set the name of the user that is able to unlock the screen.'))

args = parser.parse_args()


def handler(signum, frame):
    Gtk.main_quit()


signal.signal(signal.SIGINT, handler)
signal.signal(signal.SIGTERM, handler)
signal.signal(signal.SIGQUIT, handler)


locale.setlocale(locale.LC_ALL, '')
locale.textdomain('pylock')

Gtk.Settings.get_default().set_property('gtk-theme-name', theme)


window = LockWindow()


def lock(timeLeft):
    window.updateLockMessage(args.username, timeLeft)
    window.lock()

def logout():
    try:
        os.system(args.logout_command)
    except:
        pass

    window.reset()

def updateTimeout(timeLeft):
    window.updateLockMessage(args.username, timeLeft)

if args.logout_command is None:
    locker = Locker(args.timeout, lock, window.unlock)
else:
    locker = Locker(args.timeout, lock, window.unlock, args.logout, logout, updateTimeout)


if args.timeout != 0:
    dbus = DBus(locker)


pamAuth = pam.pam()

def tryUnlock(w, password):
    if pamAuth.authenticate(args.username, password):
        locker.unlock()

        if args.timeout == 0:
            Gtk.main_quit()
    else:
        window.reset()
        window.setAuthMessage(pamAuth.reason)

    return True

window.connect('logout', lambda w: locker.logout())
window.connect('tryUnlock', tryUnlock)

Gtk.main()