# Copyright (c) 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Authentication related functions.""" import collections import optparse # Authentication configuration extracted from command line options. # See doc string for 'make_auth_config' for meaning of fields. AuthConfig = collections.namedtuple('AuthConfig', [ 'use_oauth2', # deprecated, will be always True 'save_cookies', # deprecated, will be removed 'use_local_webserver', 'webserver_port', ]) def make_auth_config( use_oauth2=None, save_cookies=None, use_local_webserver=None, webserver_port=None): """Returns new instance of AuthConfig. If some config option is None, it will be set to a reasonable default value. This function also acts as an authoritative place for default values of corresponding command line options. """ default = lambda val, d: val if val is not None else d return AuthConfig( default(use_oauth2, False), default(save_cookies, True), default(use_local_webserver, True), default(webserver_port, 8090)) def add_auth_options(parser): """Appends OAuth related options to OptionParser.""" default_config = make_auth_config() parser.auth_group = optparse.OptionGroup(parser, 'Auth options') parser.auth_group.add_option( '--oauth2', action='store_true', dest='use_oauth2', default=default_config.use_oauth2, help='Use OAuth 2.0 instead of a password.') parser.auth_group.add_option( '--no-oauth2', action='store_false', dest='use_oauth2', default=default_config.use_oauth2, help='Use password instead of OAuth 2.0.') parser.auth_group.add_option( '--no-cookies', action='store_false', dest='save_cookies', default=default_config.save_cookies, help='Do not save authentication cookies to local disk.') parser.auth_group.add_option( '--auth-no-local-webserver', action='store_false', dest='use_local_webserver', default=default_config.use_local_webserver, help='Do not run a local web server when performing OAuth2 login flow.') parser.auth_group.add_option( '--auth-host-port', type=int, default=default_config.webserver_port, help='Port a local web server should listen on. Used only if ' '--auth-no-local-webserver is not set. [default: %default]') parser.add_option_group(parser.auth_group) def extract_auth_config_from_options(options): """Given OptionParser parsed options, extracts AuthConfig from it. OptionParser should be populated with auth options by 'add_auth_options'. """ return make_auth_config( use_oauth2=options.use_oauth2, save_cookies=False if options.use_oauth2 else options.save_cookies, use_local_webserver=options.use_local_webserver, webserver_port=options.auth_host_port) def auth_config_to_command_options(auth_config): """AuthConfig -> list of strings with command line options.""" if not auth_config: return [] opts = ['--oauth2' if auth_config.use_oauth2 else '--no-oauth2'] if not auth_config.save_cookies: opts.append('--no-cookies') if not auth_config.use_local_webserver: opts.append('--auth-no-local-webserver') opts.extend(['--auth-host-port', str(auth_config.webserver_port)]) return opts