You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
67 lines
1.6 KiB
67 lines
1.6 KiB
import os
|
|
import re
|
|
|
|
|
|
class PAM(object):
|
|
files = [
|
|
'/etc/pam.d/system-auth',
|
|
'/etc/pam.d/smartcard-auth',
|
|
'/etc/pam.d/password-auth',
|
|
'/etc/pam.d/fingerprint-auth',
|
|
'/etc/pam.d/postlogin'
|
|
]
|
|
"""
|
|
List of system PAM configuration files.
|
|
"""
|
|
|
|
def __init__(self, config):
|
|
self.modules = self.parse(config)
|
|
|
|
def parse(self, config):
|
|
"""
|
|
Parse configuration and return list of modules that are present in the
|
|
configuration.
|
|
"""
|
|
result = re.findall(
|
|
r"^[ \t]*[^#\s]+.*(pam_\S+)\.so.*$",
|
|
config,
|
|
re.MULTILINE
|
|
)
|
|
|
|
return result
|
|
|
|
def has(self, module):
|
|
"""
|
|
Return True if the module exist in the configuration, False otherwise.
|
|
"""
|
|
return module in self.modules
|
|
|
|
def has_unknown_module(self, known_modules):
|
|
"""
|
|
Return True if the configuration has any module which is not known to
|
|
the caller, False otherwise.
|
|
"""
|
|
for module in self.modules:
|
|
if module not in known_modules:
|
|
return True
|
|
|
|
return False
|
|
|
|
@staticmethod
|
|
def read_file(config):
|
|
"""
|
|
Read file contents. Return empty string if the file does not exist.
|
|
"""
|
|
if not os.path.isfile(config):
|
|
return ""
|
|
with open(config) as f:
|
|
return f.read()
|
|
|
|
@staticmethod
|
|
def from_system_configuration():
|
|
config = ""
|
|
for f in PAM.files:
|
|
config += PAM.read_file(f)
|
|
|
|
return PAM(config)
|