From e4482e3854b186c071e613a6e37f72add78562c4 Mon Sep 17 00:00:00 2001 From: NavaL Date: Thu, 3 Nov 2016 11:19:12 +0100 Subject: [#792] fix pixelated-register --- service/pixelated/config/arguments.py | 1 + service/pixelated/register.py | 70 ++++++++++++++++++------------- service/test/unit/config/test_register.py | 26 +++++++++++- 3 files changed, 66 insertions(+), 31 deletions(-) (limited to 'service') diff --git a/service/pixelated/config/arguments.py b/service/pixelated/config/arguments.py index b5f2101a..01152a34 100644 --- a/service/pixelated/config/arguments.py +++ b/service/pixelated/config/arguments.py @@ -66,6 +66,7 @@ def parse_register_args(): parser.add_argument('-lc', '--leap-provider-cert', metavar='', default=None, help='use specified file for LEAP provider cert authority certificate (url https:///ca.crt)') parser.add_argument('-lf', '--leap-provider-cert-fingerprint', metavar='', default=None, help='use specified fingerprint to validate connection with LEAP provider', dest='leap_provider_cert_fingerprint') parser.add_argument('--leap-home', help='The folder where the user agent stores its data. Defaults to ~/.leap', dest='leap_home', default=os.path.join(os.path.expanduser("~"), '.leap')) + parser.add_argument('--invite-code', help='invite code to register a user, if required', dest='invite_code', default=None) return parser.parse_args() diff --git a/service/pixelated/register.py b/service/pixelated/register.py index 994842e9..58798476 100644 --- a/service/pixelated/register.py +++ b/service/pixelated/register.py @@ -15,18 +15,16 @@ # along with Pixelated. If not, see . import getpass import re -import sys from collections import namedtuple from leap.bitmask.bonafide.provider import Api from leap.bitmask.bonafide.session import Session -from leap.common.events import server as events_server from pixelated.bitmask_libraries.certs import LeapCertificate from pixelated.bitmask_libraries.provider import LeapProvider from pixelated.config import arguments +from pixelated.config import leap_config from pixelated.config import logger as logger_config -from pixelated.authentication import Authentication -from pixelated.config.sessions import LeapSessionFactory +from twisted.internet import reactor from twisted.internet.defer import inlineCallbacks from twisted.logger import Logger @@ -36,16 +34,14 @@ logger = Logger() def _validate(username, password): - try: - validate_username(username) - validate_password(password) - except ValueError, e: - print(e.message) - sys.exit(1) + validate_username(username) + validate_password(password) -def _set_provider(provider_cert, provider_cert_fingerprint, server_name): - events_server.ensure_server() +def _set_provider(provider_cert, provider_cert_fingerprint, server_name, leap_home=None): + if leap_home: + leap_config.set_leap_home(leap_home) + LeapCertificate.set_cert_and_fingerprint(provider_cert, provider_cert_fingerprint) provider = LeapProvider(server_name) provider.setup_ca() @@ -59,26 +55,25 @@ def _bonafide_session(username, password, provider): return Session(credentials, srp_provider, provider.local_ca_crt) -@inlineCallbacks -def _bootstrap_leap_session(username, password, leap_provider, srp_auth): - auth = Authentication(username, srp_auth.token, srp_auth.uuid, 'session_id', {'is_admin': False}) - yield LeapSessionFactory(leap_provider).create(username, password, auth) +def log_results(created, username, server_name): + if created: + logger.info('User %s@%s successfully registered' % (username, server_name)) + else: + logger.error("Register failed") @inlineCallbacks -def register(server_name, username, password, leap_home, provider_cert, provider_cert_fingerprint): +def register(server_name, username, password, leap_home, provider_cert, provider_cert_fingerprint, invite=None): if not password: password = getpass.getpass('Please enter password for %s: ' % username) _validate(username, password) - leap_provider = _set_provider(provider_cert, provider_cert_fingerprint, server_name) + logger.info('password validated...') + leap_provider = _set_provider(provider_cert, provider_cert_fingerprint, server_name, leap_home) srp_auth = _bonafide_session(username, password, leap_provider) - created, user = yield srp_auth.signup(username, password, invite=None) - if created: - yield _bootstrap_leap_session(username, password, leap_provider, srp_auth) - else: - logger.error("Register failed") + created, user = yield srp_auth.signup(username, password, invite) + log_results(created, username, server_name) def validate_username(username): @@ -89,16 +84,31 @@ def validate_username(username): def validate_password(password): if len(password) < 8: + logger.info('password not validated...') raise ValueError('The password must have at least 8 characters') def initialize(): logger_config.init(debug=False) args = arguments.parse_register_args() - register( - args.provider, - args.username, - args.password, - args.leap_home, - args.leap_provider_cert, - args.leap_provider_cert_fingerprint) + + def show_error(err): + logger.info('error: %s' % err) + + def shut_down(_): + reactor.stop() + + def _register(): + d = register( + args.provider, + args.username, + args.password, + args.leap_home, + args.leap_provider_cert, + args.leap_provider_cert_fingerprint, + args.invite_code) + d.addErrback(show_error) + d.addBoth(shut_down) + + reactor.callWhenRunning(_register) + reactor.run() diff --git a/service/test/unit/config/test_register.py b/service/test/unit/config/test_register.py index 08cf56f0..d3999dfd 100644 --- a/service/test/unit/config/test_register.py +++ b/service/test/unit/config/test_register.py @@ -1,6 +1,8 @@ import unittest -from pixelated.register import validate_username, validate_password +from mock import patch, Mock +from pixelated.register import validate_username, validate_password, _set_provider, register +from twisted.internet.defer import inlineCallbacks class TestRegister(unittest.TestCase): @@ -22,3 +24,25 @@ class TestRegister(unittest.TestCase): validate_username('a.valid_username-123') except: self.fail('Valid username should not raise an exception') + + def test_sets_provider(self): + mock_provider = Mock() + with patch('pixelated.register.LeapProvider', return_value=mock_provider) as mock_instantiate_provider: + provider = _set_provider('mocked_provider_cert', 'mocked_provider_cert_fingerprint', 'mocked_server_name') + mock_instantiate_provider.assert_called_once_with('mocked_server_name') + self.assertEqual(provider, mock_provider) + self.assertTrue(mock_provider.setup_ca.called) + self.assertTrue(mock_provider.download_settings.called) + + @patch('pixelated.register._set_provider') + @inlineCallbacks + def test_register_uses_bonafide_auth(self, mock_set_provider): + mock_provider = Mock() + mock_provider.api_uri = 'https://pro.vi.der' + mock_set_provider.return_value = mock_provider + mock_bonafide_session = Mock() + mock_bonafide_session.signup.return_value = ('created', 'user') + with patch('pixelated.register.Session', return_value=mock_bonafide_session) as mock_instantiate_bonafide_session: + yield register('server_name', 'username', 'password', 'leap_home', 'provider_cert', 'provider_cert_fingerprint', 'invite') + mock_instantiate_bonafide_session.assert_called_once() + mock_bonafide_session.signup.assert_called_once_with('username', 'password', 'invite') -- cgit v1.2.3