0
0
Fork 0
mirror of https://github.com/boltgolt/howdy.git synced 2024-10-17 10:06:53 +02:00
howdy/src/pam.py

74 lines
2.6 KiB
Python
Raw Normal View History

2018-02-10 12:40:26 +01:00
# PAM interface in python, launches compare.py
2018-01-05 16:37:00 +01:00
# Import required modules
2018-01-05 01:59:44 +01:00
import subprocess
import sys
import os
# pam-python is running python 2, so we use the old module here
import ConfigParser
# Read config from disk
config = ConfigParser.ConfigParser()
config.read(os.path.dirname(os.path.abspath(__file__)) + "/config.ini")
2018-01-05 02:41:56 +01:00
def doAuth(pamh):
"""Starts authentication in a seperate process"""
2018-01-05 16:37:00 +01:00
2018-04-13 21:19:28 +02:00
# Abort is Howdy is disabled
2018-11-18 07:46:20 +01:00
if config.getboolean("core", "disabled"):
2018-04-13 21:19:28 +02:00
sys.exit(0)
# Abort if we're in a remote SSH env
2018-11-18 07:46:20 +01:00
if config.getboolean("core", "ignore_ssh"):
if "SSH_CONNECTION" in os.environ or "SSH_CLIENT" in os.environ or "SSHD_OPTS" in os.environ:
sys.exit(0)
2018-02-10 12:40:26 +01:00
# Run compare as python3 subprocess to circumvent python version and import issues
status = subprocess.call(["/usr/bin/python3", os.path.dirname(os.path.abspath(__file__)) + "/compare.py", pamh.get_user()])
2018-01-05 01:59:44 +01:00
2018-01-05 16:37:00 +01:00
# Status 10 means we couldn't find any face models
2018-01-05 02:41:56 +01:00
if status == 10:
2018-11-18 07:46:20 +01:00
if not config.getboolean("core", "suppress_unknown"):
pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "No face model known"))
return pamh.PAM_USER_UNKNOWN
2018-01-05 16:37:00 +01:00
# Status 11 means we exceded the maximum retry count
2018-12-13 20:10:08 +01:00
elif status == 11:
pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "Face detection timeout reached"))
return pamh.PAM_AUTH_ERR
2018-12-13 20:10:08 +01:00
# Status 12 means we aborted
elif status == 12:
return pamh.PAM_AUTH_ERR
2018-01-05 16:37:00 +01:00
# Status 0 is a successful exit
2018-12-13 20:10:08 +01:00
elif status == 0:
# Show the success message if it isn't suppressed
2018-11-18 07:46:20 +01:00
if not config.getboolean("core", "no_confirmation"):
pamh.conversation(pamh.Message(pamh.PAM_TEXT_INFO, "Identified face as " + pamh.get_user()))
# Try to dismiss the lock screen if enabled
2018-11-18 07:46:20 +01:00
if config.get("core", "dismiss_lockscreen"):
# Run it as root with a timeout of 1s, and never ask for a password through the UI
subprocess.Popen(["sudo", "timeout", "1", "loginctl", "unlock-sessions", "--no-ask-password"])
2018-01-05 01:59:44 +01:00
return pamh.PAM_SUCCESS
2018-01-05 16:37:00 +01:00
# Otherwise, we can't discribe what happend but it wasn't successful
pamh.conversation(pamh.Message(pamh.PAM_ERROR_MSG, "Unknown error: " + str(status)))
2018-01-05 01:59:44 +01:00
return pamh.PAM_SYSTEM_ERR
2018-01-05 02:41:56 +01:00
def pam_sm_authenticate(pamh, flags, args):
2018-01-05 16:37:00 +01:00
"""Called by PAM when the user wants to authenticate, in sudo for example"""
2018-01-05 02:41:56 +01:00
return doAuth(pamh)
def pam_sm_open_session(pamh, flags, args):
2018-01-05 16:37:00 +01:00
"""Called when starting a session, such as su"""
2018-01-05 02:41:56 +01:00
return doAuth(pamh)
def pam_sm_close_session(pamh, flags, argv):
"""We don't need to clean anyting up at the end of a session, so returns true"""
2018-01-05 02:41:56 +01:00
return pamh.PAM_SUCCESS
def pam_sm_setcred(pamh, flags, argv):
"""We don't need set any credentials, so returns true"""
2018-01-05 02:41:56 +01:00
return pamh.PAM_SUCCESS