sss_obfuscate revision 0a0d272844108fe3650a206c39dd4047f10003f2
4e5b757fbcf21077677360be274461dcd9064106kupfer#!/usr/bin/python
4e5b757fbcf21077677360be274461dcd9064106kupfer
4e5b757fbcf21077677360be274461dcd9064106kupferimport sys
4e5b757fbcf21077677360be274461dcd9064106kupferfrom optparse import OptionParser
4e5b757fbcf21077677360be274461dcd9064106kupfer
4e5b757fbcf21077677360be274461dcd9064106kupferimport pysss
4e5b757fbcf21077677360be274461dcd9064106kupferimport SSSDConfig
4e5b757fbcf21077677360be274461dcd9064106kupferimport getpass
4e5b757fbcf21077677360be274461dcd9064106kupfer
4e5b757fbcf21077677360be274461dcd9064106kupferdef parse_options():
4e5b757fbcf21077677360be274461dcd9064106kupfer parser = OptionParser()
4e5b757fbcf21077677360be274461dcd9064106kupfer parser.set_description("sss_obfuscate converts a given password into \
4e5b757fbcf21077677360be274461dcd9064106kupfer human-unreadable format and places it into \
4e5b757fbcf21077677360be274461dcd9064106kupfer appropriate domain section of the SSSD config \
4e5b757fbcf21077677360be274461dcd9064106kupfer file. The password can be passed in by stdin, \
4e5b757fbcf21077677360be274461dcd9064106kupfer specified on the command-line or entered \
4e5b757fbcf21077677360be274461dcd9064106kupfer interactively")
4e5b757fbcf21077677360be274461dcd9064106kupfer parser.add_option("-s", "--stdin", action="store_true",
4e5b757fbcf21077677360be274461dcd9064106kupfer dest="stdin", default=False,
4e5b757fbcf21077677360be274461dcd9064106kupfer help="Read the password from stdin.")
4e5b757fbcf21077677360be274461dcd9064106kupfer parser.add_option("-d", "--domain",
4e5b757fbcf21077677360be274461dcd9064106kupfer dest="domain", default=None,
4e5b757fbcf21077677360be274461dcd9064106kupfer help="The domain to use the password in (mandatory)",
4e5b757fbcf21077677360be274461dcd9064106kupfer metavar="DOMNAME")
4e5b757fbcf21077677360be274461dcd9064106kupfer parser.add_option("-f", "--file",
4e5b757fbcf21077677360be274461dcd9064106kupfer dest="filename", default=None,
4e5b757fbcf21077677360be274461dcd9064106kupfer help="Set input file to FILE (default: Use system default, usually /etc/sssd/sssd.conf)",
4e5b757fbcf21077677360be274461dcd9064106kupfer metavar="FILE")
4e5b757fbcf21077677360be274461dcd9064106kupfer (options, args) = parser.parse_args()
4e5b757fbcf21077677360be274461dcd9064106kupfer
4e5b757fbcf21077677360be274461dcd9064106kupfer return options, args
4e5b757fbcf21077677360be274461dcd9064106kupfer
def main():
options, args = parse_options()
if not options:
print >> sys.stderr, "Cannot parse options"
return 1
if not options.domain:
print >> sys.stderr, "No domain specified"
return 1
if not options.stdin:
pprompt = lambda: (getpass.getpass("Enter password: "), getpass.getpass("Re-enter password: "))
p1, p2 = pprompt()
while p1 != p2:
print('Passwords do not match. Try again')
p1, p2 = pprompt()
password = p1
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 >> sys.stderr, "Could not write to config file. Check that " \
"you have the appropriate permissions to edit " \
"this file."
return 1
return 0
if __name__ == "__main__":
ret = main()
sys.exit(ret)