示例#1
0
    def _get_keyring_backend(self) -> KeyringBackend:
        """
        Returns the keyring backend currently used. If none is used because we are not
        yet linked, use the backend specified in the config file (if valid) or choose
        the most secure of the available and supported keyring backends.
        """

        import keyring.backends

        keyring_class: str = self._conf.get("app", "keyring").strip()

        if self._account_id and keyring_class != "automatic":
            # We are already linked and have a keyring set. Insist on using
            # the recorded backend.

            try:
                ring = load_keyring(keyring_class)
            except Exception as exc:
                # Bomb out with an exception.

                title = f"Cannot load keyring {keyring_class}"
                message = "Please relink Maestral to get a new access token."
                new_exc = KeyringAccessError(title, message).with_traceback(
                    exc.__traceback__)
                self._logger.error(title, exc_info=exc_info_tuple(new_exc))
                raise new_exc

            return ring

        else:

            # We are not yet linked. Try loading the preset or the preferred keyring
            # backend for the platform.

            try:
                ring = load_keyring(keyring_class)
            except Exception:

                # get preferred keyring backends for platform
                available_rings = keyring.backend.get_all_keyring()
                supported_rings = [
                    k for k in available_rings
                    if isinstance(k, supported_keyring_backends)
                ]

                ring = max(supported_rings, key=lambda x: x.priority)

            self._conf.set(
                "app",
                "keyring",
                f"{ring.__class__.__module__}.{ring.__class__.__name__}",
            )

            return ring
def main():
    parser = \
        argparse.ArgumentParser(description='Store a secret in local keychain')

    parser.add_argument('--backend',
                        type=str,
                        nargs='?',
                        help='Keyring backend to use')
    parser.add_argument('service',
                        type=str,
                        help='service to log into (e.g., URL)')
    parser.add_argument('username', type=str, help='Username to use')

    args = parser.parse_args()
    service: str = args.service
    username: str = args.username
    backend: str = args.backend

    if sys.stdin.isatty():
        password: str = input('Password: ')
    else:
        password = input()

    if backend is not None:
        keyring.set_keyring(core.load_keyring(backend))
    keyring.set_password(service, username, password)
def main():
    parser: ArgumentParser =\
        ArgumentParser(description='Retrieve a secret in local keychain')

    parser.add_argument('--backend',
                        type=str,
                        nargs='?',
                        help='Keyring backend to use')
    parser.add_argument('service',
                        type=str,
                        help='service to log into (e.g., URL)')
    parser.add_argument('username', type=str, help='Username to use')

    args: Namespace = parser.parse_args()
    service: str = args.service
    username: str = args.username
    backend: str = args.backend

    if backend is not None:
        keyring.set_keyring(core.load_keyring(backend))
    password: str = keyring.get_password(service, username)
    if password is None:
        exit(1)
    else:
        print(password)
示例#4
0
def get_keyring_backend(config_name):
    """
    Choose the most secure of the available and supported keyring backends or
    use the backend specified in the config file (if valid).

    :param str config_name: The config name.
    """

    import keyring.backends

    conf = MaestralConfig(config_name)
    keyring_name = conf.get('app', 'keyring').strip()

    if IS_MACOS_BUNDLE:
        ring = keyring.backends.OS_X.Keyring()
    else:
        try:
            ring = load_keyring(keyring_name)
        except Exception:
            # get preferred keyring backends for platform
            available_rings = keyring.backend.get_all_keyring()
            supported_rings = [
                k for k in available_rings
                if isinstance(k, _supported_keyring_backends)
            ]

            ring = max(supported_rings, key=lambda x: x.priority)

    return ring
示例#5
0
    def _keyring_from_config(self) -> KeyringBackend | None:
        """Initialise keyring specified in config."""

        keyring_class: str = self._conf.get("auth", "keyring").strip()

        if keyring_class == "automatic":
            return None

        try:
            return load_keyring(keyring_class)
        except Exception as exc:
            # Bomb out with an exception.

            title = f"Cannot load keyring {keyring_class}"
            message = "Please relink Maestral to get a new access token."
            new_exc = KeyringAccessError(title, message).with_traceback(
                exc.__traceback__)
            raise new_exc
def main() -> None:
    desc = 'Remove a secret in local keychain'
    parser = argparse.ArgumentParser(description=desc)

    parser.add_argument('--backend', type=str, nargs='?',
                        help='Keyring backend to use')
    parser.add_argument('service', type=str,
                        help='service to log into (e.g., URL)')
    parser.add_argument('username', type=str,
                        help='Username to use')

    args: argparse.Namespace = parser.parse_args()
    service: str = args.service
    username: str = args.username
    backend: str = args.backend

    if backend is not None:
        keyring.set_keyring(core.load_keyring(backend))
    keyring.delete_password(service, username)
示例#7
0
    from flask_assets import Environment
    assets = Environment(app)
    os.environ['PATH'] = \
        '{}/.bin:{}'.format(app.config['GMP_NODE_MODULES_DIR'],
                            os.environ['PATH'])
else:
    assets = None

if app.config['GMP_OFFLINE_MODE']:
    music = None
else:
    from gmusicapi import Mobileclient
    from keyring.core import get_password, load_keyring, set_keyring
    keyring_backend = app.config.get('KEYRING_BACKEND')
    if keyring_backend:
        set_keyring(load_keyring(keyring_backend))
    music = Mobileclient()
    email = app.config['GACCOUNT_EMAIL']
    password = get_password('gmusicprocurator', email)
    if password is None:
        music = None
    else:
        music.login(email, password, app.config.get('GACCOUNT_DEVICE_ID'))

if app.debug and app.config['GMP_MEMORY_PROFILER']:
    from guppy import hpy
    heapy = hpy()
else:
    heapy = None

__all__ = ('app', 'assets', 'heapy', 'music')