diff options
| -rw-r--r-- | service/pixelated/application.py | 5 | ||||
| -rw-r--r-- | service/pixelated/config/args.py | 5 | ||||
| -rw-r--r-- | service/pixelated/config/credentials.py (renamed from service/pixelated/config/config_ua.py) | 40 | ||||
| -rw-r--r-- | service/pixelated/config/dispatcher.py | 38 | ||||
| -rw-r--r-- | service/pixelated/config/initialize_leap.py | 26 | ||||
| -rw-r--r-- | service/test/unit/config/test_credentials.py | 30 | ||||
| -rw-r--r-- | service/test/unit/config/test_dispatcher.py | 59 | 
7 files changed, 63 insertions, 140 deletions
diff --git a/service/pixelated/application.py b/service/pixelated/application.py index 4d183358..6d49b8bf 100644 --- a/service/pixelated/application.py +++ b/service/pixelated/application.py @@ -76,9 +76,8 @@ def initialize():          lambda: initialize_leap(              args.leap_provider_cert,              args.leap_provider_cert_fingerprint, -            args.config_file, -            args.dispatcher, -            args.dispatcher_stdin, +            args.credentials_file, +            args.organization_mode,              args.leap_home))      deferred.addCallback( diff --git a/service/pixelated/config/args.py b/service/pixelated/config/args.py index dd3b715d..2c7470e2 100644 --- a/service/pixelated/config/args.py +++ b/service/pixelated/config/args.py @@ -49,9 +49,8 @@ def parse_maintenance_args():  def parser_add_default_arguments(parser):      parser.add_argument('--debug', action='store_true', help='DEBUG mode.') -    parser.add_argument('--dispatcher', help='run in organization mode, the credentials will be read from specified file', metavar='file') -    parser.add_argument('--dispatcher-stdin', help='run in organization mode, the credentials will be read from stdin', default=False, action='store_true', dest='dispatcher_stdin') -    parser.add_argument('-c', '--config', dest='config_file', metavar='<configfile>', default=None, help='use specified file for credentials (for test purposes only)') +    parser.add_argument('--organization-mode', help='Runs the user agent in organization mode, the credentials will be received from the stdin', default=False, action='store_true', dest='organization_mode') +    parser.add_argument('-c', '--config', dest='credentials_file', metavar='<credentials_file>', default=None, help='use specified file for credentials (for test purposes only)')      parser.add_argument('--leap-home', help='The folder where the user agent stores its data. Defaults to ~/.leap', dest='leap_home', default=DEFAULT_LEAP_HOME)      parser.add_argument('-lc', '--leap-provider-cert', metavar='<leap-provider.crt>', default=None, help='use specified file for LEAP provider cert authority certificate (url https://<LEAP-provider-domain>/ca.crt)')      parser.add_argument('-lf', '--leap-provider-cert-fingerprint', metavar='<leap provider certificate fingerprint>', default=None, help='use specified fingerprint to validate connection with LEAP provider', dest='leap_provider_cert_fingerprint') diff --git a/service/pixelated/config/config_ua.py b/service/pixelated/config/credentials.py index 5afb501b..ae1bc4f3 100644 --- a/service/pixelated/config/config_ua.py +++ b/service/pixelated/config/credentials.py @@ -1,5 +1,5 @@  # -# Copyright (c) 2014 ThoughtWorks, Inc. +# Copyright (c) 2015 ThoughtWorks, Inc.  #  # Pixelated is free software: you can redistribute it and/or modify  # it under the terms of the GNU Affero General Public License as published by @@ -14,21 +14,20 @@  # You should have received a copy of the GNU Affero General Public License  # along with Pixelated. If not, see <http://www.gnu.org/licenses/>. -import ConfigParser  import os  import getpass +import json +import sys +import ConfigParser -def parse_config_from_file(config_file): -    config_parser = ConfigParser.ConfigParser() -    config_file_path = os.path.abspath(os.path.expanduser(config_file)) -    config_parser.read(config_file_path) -    provider, user, password = \ -        config_parser.get('pixelated', 'leap_server_name'), \ -        config_parser.get('pixelated', 'leap_username'), \ -        config_parser.get('pixelated', 'leap_password') - -    return provider, user, password +def read(organization_mode, credentials_file): +    if organization_mode: +        return read_from_dispatcher() +    else: +        if credentials_file: +            return read_from_file(credentials_file) +        return prompt_for_credentials()  def prompt_for_credentials(): @@ -38,7 +37,18 @@ def prompt_for_credentials():      return provider, username, password -def config_user_agent(config_file): -    provider, user, password = parse_config_from_file(config_file) if config_file else prompt_for_credentials() +def read_from_file(credentials_file): +    config_parser = ConfigParser.ConfigParser() +    credentials_file_path = os.path.abspath(os.path.expanduser(credentials_file)) +    config_parser.read(credentials_file_path) +    provider, user, password = \ +        config_parser.get('pixelated', 'leap_server_name'), \ +        config_parser.get('pixelated', 'leap_username'), \ +        config_parser.get('pixelated', 'leap_password') +    return provider, user, password + + +def read_from_dispatcher(): +    config = json.loads(sys.stdin.read()) -    return (provider, user, password) +    return config['leap_provider_hostname'], config['user'], config['password'] diff --git a/service/pixelated/config/dispatcher.py b/service/pixelated/config/dispatcher.py deleted file mode 100644 index eb5634ab..00000000 --- a/service/pixelated/config/dispatcher.py +++ /dev/null @@ -1,38 +0,0 @@ -# -# Copyright (c) 2014 ThoughtWorks, Inc. -# -# Pixelated is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as published by -# the Free Software Foundation, either version 3 of the License, or -# (at your option) any later version. -# -# Pixelated is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with Pixelated. If not, see <http://www.gnu.org/licenses/>. - -import json -import sys -import os - - -def config_dispatcher(dispatcher): - -    def fetch_credentials_from_dispatcher(filename): -        if not os.path.exists(filename): -            print('The credentials pipe doesn\'t exist') -            sys.exit(1) -        with open(filename, 'r') as fifo: -            return json.loads(fifo.read()) - -    def fetch_credentials_from_dispatcher_stdin(): -        return json.loads(sys.stdin.read()) - -    config = fetch_credentials_from_dispatcher(dispatcher) if dispatcher else fetch_credentials_from_dispatcher_stdin() - -    return (config['leap_provider_hostname'], -            config['user'], -            config['password']) diff --git a/service/pixelated/config/initialize_leap.py b/service/pixelated/config/initialize_leap.py index b693fde6..3ddc3a57 100644 --- a/service/pixelated/config/initialize_leap.py +++ b/service/pixelated/config/initialize_leap.py @@ -1,6 +1,5 @@  from pixelated.config.config import Config -from pixelated.config.config_ua import config_user_agent -from pixelated.config.dispatcher import config_dispatcher +from pixelated.config import credentials  from leap.common.events import server as events_server  import pixelated.bitmask_libraries.certs as certs  from pixelated.bitmask_libraries.session import open_leap_session @@ -8,39 +7,22 @@ from pixelated.bitmask_libraries.session import open_leap_session  def initialize_leap(leap_provider_cert,                      leap_provider_cert_fingerprint, -                    config_file, -                    dispatcher, -                    dispatcher_stdin, +                    credentials_file, +                    organization_mode,                      leap_home): -      init_monkeypatches() - -    provider, user, password = gather_credentials(dispatcher, -                                                  dispatcher_stdin, -                                                  config_file) - +    provider, user, password = credentials.read(organization_mode, credentials_file)      init_leap_cert(leap_provider_cert, leap_provider_cert_fingerprint) -      events_server.ensure_server(port=8090) -      leap_session = create_leap_session(provider, user, password, leap_home) -      return leap_session -def gather_credentials(dispatcher, dispatcher_stdin, config_file): -    if dispatcher or dispatcher_stdin: -        return config_dispatcher(dispatcher) -    else: -        return config_user_agent(config_file) - -  def create_leap_session(provider, username, password, leap_home):      leap_session = open_leap_session(username,                                       password,                                       provider,                                       leap_home) -      leap_session.soledad_session.soledad.sync(defer_decryption=False)      leap_session.nicknym.generate_openpgp_key()      return leap_session diff --git a/service/test/unit/config/test_credentials.py b/service/test/unit/config/test_credentials.py new file mode 100644 index 00000000..61cfac53 --- /dev/null +++ b/service/test/unit/config/test_credentials.py @@ -0,0 +1,30 @@ +import json +import unittest +import sys +from mockito import mock, when +from pixelated.config.args import parse_user_agent_args +from pixelated.config import credentials + + +class TestReadCredentials(unittest.TestCase): + +    def setUp(self): +        self.test_data = {'leap_provider_hostname': 'test_provider', 'user': 'test_user', 'password': 'test_password'} + +    def test_organization_mode_reads_credentials_from_stdin(self): +        data = json.dumps({'leap_provider_hostname': 'test_provider', 'user': 'test_user', 'password': 'test_password'}) +        orig_stdin = sys.stdin +        sys.stdin = mock() +        when(sys.stdin).read().thenReturn(data) + +        try: +            sys.argv = ['tmp/does_not_exist', '--organization-mode'] +            args = parse_user_agent_args() + +            provider, user, password = credentials.read(args.organization_mode, 'not_used') + +            self.assertEquals('test_provider', provider) +            self.assertEquals('test_user', user) +            self.assertEquals('test_password', password) +        finally: +            sys.stdin = orig_stdin diff --git a/service/test/unit/config/test_dispatcher.py b/service/test/unit/config/test_dispatcher.py deleted file mode 100644 index e154ac22..00000000 --- a/service/test/unit/config/test_dispatcher.py +++ /dev/null @@ -1,59 +0,0 @@ -import json -import unittest -import thread -import sys -from mockito import mock, when -import os -from pixelated.config.config import Config -from pixelated.config.args import parse_user_agent_args - -from pixelated.config.dispatcher import config_dispatcher - - -class TestConfigDispatcher(unittest.TestCase): - -    def setUp(self): -        self.config = Config() -        self.test_data = {'leap_provider_hostname': 'test_provider', 'user': 'test_user', 'password': 'test_password'} - -    def test_that_organization_switch_reads_the_credentials_from_pipe(self): -        fifo_path = '/tmp/credentials-pipe' - -        sys.argv = ['tmp/does_not_exist', '--dispatcher', fifo_path] -        args = parse_user_agent_args() - -        self._mkfifo(fifo_path) - -        provider, user, password = config_dispatcher(args.dispatcher) - -        self.assertEquals('test_provider', provider) -        self.assertEquals('test_user', user) -        self.assertEquals('test_password', password) - -    def test_that_organization_switch_reads_the_credentials_from_stdin(self): -        data = json.dumps({'leap_provider_hostname': 'test_provider', 'user': 'test_user', 'password': 'test_password'}) -        orig_stdin = sys.stdin -        sys.stdin = mock() -        when(sys.stdin).read().thenReturn(data) - -        try: -            sys.argv = ['tmp/does_not_exist', '--dispatcher-stdin'] -            args = parse_user_agent_args() - -            provider, user, password = config_dispatcher(args.dispatcher) - -            self.assertEquals('test_provider', provider) -            self.assertEquals('test_user', user) -            self.assertEquals('test_password', password) -        finally: -            sys.stdin = orig_stdin - -    def _spin_up_fifo(self, test_fifo): -        with open(test_fifo, 'w') as fifo: -            fifo.write(json.dumps(self.test_data)) - -    def _mkfifo(self, fifo_path): -        if os.path.exists(fifo_path): -            os.remove(fifo_path) -        os.mkfifo('/tmp/credentials-pipe') -        thread.start_new_thread(self._spin_up_fifo, (fifo_path,))  | 
