D7net Mini Sh3LL v1
Current File : //lib/python3/dist-packages/secretstorage/../aptsources/../keyring/../keyring/tests/../cli.py |
#!/usr/bin/env python
"""Simple command line interface to get/set password from a keyring"""
from __future__ import print_function
import getpass
from optparse import OptionParser
import sys
from . import core
from . import backend
from . import set_keyring, get_password, set_password, delete_password
__metaclass__ = type
class CommandLineTool:
def __init__(self):
self.parser = OptionParser(
usage="%prog [get|set|del] SERVICE USERNAME",
)
self.parser.add_option("-p", "--keyring-path",
dest="keyring_path", default=None,
help="Path to the keyring backend")
self.parser.add_option("-b", "--keyring-backend",
dest="keyring_backend", default=None,
help="Name of the keyring backend")
self.parser.add_option("--list-backends",
action="store_true",
help="List keyring backends and exit")
self.parser.add_option("--disable",
action="store_true",
help="Disable keyring and exit")
def run(self, argv):
opts, args = self.parser.parse_args(argv)
if opts.list_backends:
for k in backend.get_all_keyring():
print(k)
return
if opts.disable:
core.disable()
return
try:
kind, service, username = args
except ValueError:
if len(args) == 0:
# Be nice with the user if he just tries to launch the tool
self.parser.print_help()
return 1
else:
self.parser.error("Wrong number of arguments")
if opts.keyring_backend is not None:
try:
if opts.keyring_path:
sys.path.insert(0, opts.keyring_path)
set_keyring(core.load_keyring(opts.keyring_backend))
except (Exception,):
# Tons of things can go wrong here:
# ImportError when using "fjkljfljkl"
# AttributeError when using "os.path.bar"
# TypeError when using "__builtins__.str"
# So, we play on the safe side, and catch everything.
e = sys.exc_info()[1]
self.parser.error("Unable to load specified keyring: %s" % e)
if kind == 'get':
password = get_password(service, username)
if password is None:
return 1
self.output_password(password)
return 0
elif kind == 'set':
password = self.input_password("Password for '%s' in '%s': " %
(username, service))
set_password(service, username, password)
return 0
elif kind == 'del':
password = self.input_password(
"Deleting password for '%s' in '%s': " %
(username, service),
)
delete_password(service, username)
return 0
else:
self.parser.error("You can only 'get', 'del' or 'set' a password.")
pass
def input_password(self, prompt):
"""Retrieve password from input.
"""
return self.pass_from_pipe() or getpass.getpass(prompt)
@classmethod
def pass_from_pipe(cls):
"""Return password from pipe if not on TTY, else False.
"""
is_pipe = not sys.stdin.isatty()
return is_pipe and cls.strip_last_newline(sys.stdin.read())
@staticmethod
def strip_last_newline(str):
"""Strip one last newline, if present."""
return str[:-str.endswith('\n')]
def output_password(self, password):
"""Output the password to the user.
This mostly exists to ease the testing process.
"""
print(password, file=sys.stdout)
def main(argv=None):
"""Main command line interface."""
if argv is None:
argv = sys.argv[1:]
cli = CommandLineTool()
return cli.run(argv)
if __name__ == '__main__':
sys.exit(main())
AnonSec - 2021 | Recode By D7net