sss_obfuscate revision 11496692da75a330de01d5f15b7183d2439efd3c
1308N/A#!/usr/bin/python
1308N/A
1308N/Afrom __future__ import print_function
1308N/A
1308N/Aimport sys
1308N/Afrom optparse import OptionParser
1308N/A
1308N/Aimport pysss
1308N/Aimport SSSDConfig
1308N/Aimport getpass
1308N/A
1308N/Adef parse_options():
1308N/A parser = OptionParser()
1308N/A parser.set_description("sss_obfuscate converts a given password into \
1308N/A human-unreadable format and places it into \
1308N/A appropriate domain section of the SSSD config \
1308N/A file. The password can be passed in by stdin, \
1308N/A specified on the command-line or entered \
1308N/A interactively")
1308N/A parser.add_option("-s", "--stdin", action="store_true",
1308N/A dest="stdin", default=False,
1308N/A help="Read the password from stdin.")
2781N/A parser.add_option("-d", "--domain",
1308N/A dest="domain", default=None,
1308N/A help="The domain to use the password in (mandatory)",
1308N/A metavar="DOMNAME")
1308N/A parser.add_option("-f", "--file",
1308N/A dest="filename", default=None,
2781N/A help="Set input file to FILE (default: Use system default, usually /etc/sssd/sssd.conf)",
1308N/A metavar="FILE")
1308N/A (options, args) = parser.parse_args()
1308N/A
1308N/A return options, args
2781N/A
1308N/Adef main():
1308N/A options, args = parse_options()
1308N/A if not options:
1308N/A print("Cannot parse options", file=sys.stderr)
1308N/A return 1
1308N/A
1308N/A if not options.domain:
1308N/A print("No domain specified", file=sys.stderr)
1308N/A return 1
1308N/A
1326N/A if not options.stdin:
1326N/A try:
1326N/A pprompt = lambda: (getpass.getpass("Enter password: "), getpass.getpass("Re-enter password: "))
1308N/A p1, p2 = pprompt()
1308N/A
2781N/A #Work around bug in Python 2.6
2781N/A if '\x03' in p1 or '\x03' in p2:
1475N/A raise KeyboardInterrupt
1475N/A
1308N/A while p1 != p2:
1308N/A print('Passwords do not match. Try again')
1308N/A p1, p2 = pprompt()
1308N/A
1308N/A #Work around bug in Python 2.6
2781N/A if '\x03' in p1 or '\x03' in p2:
1308N/A raise KeyboardInterrupt
1308N/A password = p1
1308N/A
1308N/A except EOFError:
print('\nUnexpected end-of-file. Password change aborted',
file=sys.stderr)
return 1
except KeyboardInterrupt:
return 1
else:
try:
password = sys.stdin.read()
except KeyboardInterrupt:
return 1
# Obfuscate the password
obfobj = pysss.password()
obfpwd = obfobj.encrypt(password, obfobj.AES_256)
# Save the obfuscated password into the domain
try:
sssdconfig = SSSDConfig.SSSDConfig()
except IOError:
print("Cannot read internal configuration files.")
return 1
try:
sssdconfig.import_config(options.filename)
except IOError:
print("Permissions error reading config file")
return 1
try:
domain = sssdconfig.get_domain(options.domain)
except SSSDConfig.NoDomainError:
print("No such domain %s" % options.domain)
return 1
try:
domain.set_option('ldap_default_authtok_type', 'obfuscated_password')
domain.set_option('ldap_default_authtok', obfpwd)
except SSSDConfig.NoOptionError:
print("The domain %s does not seem to support the required options"
% options.domain)
return 1
sssdconfig.save_domain(domain)
try:
sssdconfig.write()
except IOError:
# File could not be written
print("Could not write to config file. Check that you have the "
"appropriate permissions to edit this file.", file=sys.stderr)
return 1
return 0
if __name__ == "__main__":
ret = main()
sys.exit(ret)