Current Path : /usr/share/pyshared/keyring/backends/ |
Current File : //usr/share/pyshared/keyring/backends/osx_keychain.py |
#!/usr/bin/python import sys import subprocess import re import binascii if sys.platform != 'darwin': raise ImportError('Mac OS X only module') def password_set(realmstring, username, password): if username is None: username = '' try: # set up the call for security. call = subprocess.Popen([ 'security', 'add-generic-password', '-a', username, '-s', realmstring, '-w', password, '-U' ], stderr = subprocess.PIPE, stdout = subprocess.PIPE, ) code = call.wait() # check return code. if code is not 0: raise OSError('Can\'t store password in keychain') except: raise OSError("Can't store password in keychain") def password_get(realmstring, username): if username is None: username = '' try: # set up the call to security. call = subprocess.Popen([ 'security', 'find-generic-password', '-g', '-a', username, '-s', realmstring ], stderr = subprocess.PIPE, stdout = subprocess.PIPE, ) code = call.wait() if code is not 0: raise OSError("Can't fetch password from system") output = call.stderr.readlines()[0] # check for empty password. if output == 'password: \n': return '' # search for special password pattern. matches = re.search('password:(?P<hex>.*?)"(?P<pw>.*)"', output) if matches: hex = matches.group('hex').strip() pw = matches.group('pw') if hex: # it's a weird hex password, decode it. return binascii.unhexlify(hex[2:]) else: # it's a normal password, send it back. return pw # nothing was found, it doesn't exist. return None except: raise OSError("Can't fetch password from system")