diff --git a/osc/conf.py b/osc/conf.py index da79da3b..24df71ca 100644 --- a/osc/conf.py +++ b/osc/conf.py @@ -44,7 +44,6 @@ import sys import getpass from io import StringIO -from urllib.error import URLError from urllib.parse import urlsplit from . import OscConfigParser @@ -404,7 +403,7 @@ Make sure that it has a [general] section. """ config_missing_apiurl_text = """ -the apiurl \'%s\' does not exist in the config file. Please enter +The apiurl \'%s\' does not exist in the config file. Please enter your credentials for this apiurl. """ @@ -415,8 +414,7 @@ def parse_apisrv_url(scheme, apisrv): elif scheme != None: url = scheme + apisrv else: - msg = 'invalid apiurl \'%s\' (specify the protocol (http:// or https://))' % apisrv - raise URLError(msg) + url = "https://" + apisrv scheme, url, path = urlsplit(url)[0:3] return scheme, url, path.rstrip('/') @@ -647,7 +645,7 @@ def write_initial_config(conffile, entries, custom_template='', creds_mgr_descri write_config(conffile, cp) -def add_section(filename, url, user, passwd, creds_mgr_descriptor=None): +def add_section(filename, url, user, passwd, creds_mgr_descriptor=None, allow_http=None): """ Add a section to config file for new api url. """ @@ -664,6 +662,8 @@ def add_section(filename, url, user, passwd, creds_mgr_descriptor=None): else: creds_mgr = _get_credentials_manager(url, cp) creds_mgr.set_password(url, user, passwd) + if allow_http: + cp.set(url, 'allow_http', "1") write_config(filename, cp) @@ -810,10 +810,10 @@ def get_config(override_conffile=None, 'http_headers': http_headers} api_host_options[apiurl] = APIHostOptionsEntry(entry) - optional = ('realname', 'email', 'sslcertck', 'cafile', 'capath', 'sshkey') + optional = ('realname', 'email', 'sslcertck', 'cafile', 'capath', 'sshkey', 'allow_http') for key in optional: if cp.has_option(url, key): - if key == 'sslcertck': + if key in ('sslcertck', 'allow_http'): api_host_options[apiurl][key] = cp.getboolean(url, key) else: api_host_options[apiurl][key] = cp.get(url, key) @@ -823,8 +823,8 @@ def get_config(override_conffile=None, if not 'sslcertck' in api_host_options[apiurl]: api_host_options[apiurl]['sslcertck'] = True - if scheme == 'http': - api_host_options[apiurl]['sslcertck'] = False + if 'allow_http' not in api_host_options[apiurl]: + api_host_options[apiurl]['allow_http'] = False if cp.has_option(url, 'trusted_prj'): api_host_options[apiurl]['trusted_prj'] = cp.get(url, 'trusted_prj').split(' ') @@ -896,6 +896,13 @@ def get_config(override_conffile=None, e.file = conffile raise e + scheme = urlsplit(apiurl)[0] + if scheme == "http" and not api_host_options[apiurl]['allow_http']: + msg = "The apiurl '{apiurl}' uses HTTP protocol without any encryption.\n" + msg += "All communication incl. sending your password IS NOT ENCRYPTED!\n" + msg += "Add 'allow_http=1' to the [{apiurl}] config file section to mute this message.\n" + print(msg.format(apiurl=apiurl), file=sys.stderr) + # enable connection debugging after all config options are set from .connection import enable_http_debug enable_http_debug(config) @@ -916,6 +923,18 @@ def identify_conf(): return conffile def interactive_config_setup(conffile, apiurl, initial=True): + scheme = urlsplit(apiurl)[0] + http = scheme == "http" + if http: + msg = "The apiurl '{apiurl}' uses HTTP protocol without any encryption.\n" + msg += "All communication incl. sending your password WILL NOT BE ENCRYPTED!\n" + msg += "Do you really want to continue with no encryption?\n" + print(msg.format(apiurl=apiurl), file=sys.stderr) + yes = raw_input("Type 'YES' to continue: ") + if yes != "YES": + raise oscerr.UserAbort() + print() + user = raw_input('Username: ') passwd = getpass.getpass() creds_mgr_descr = select_credentials_manager_descr() @@ -923,9 +942,11 @@ def interactive_config_setup(conffile, apiurl, initial=True): config = {'user': user, 'pass': passwd} if apiurl: config['apiurl'] = apiurl + if http: + config['allow_http'] = 1 write_initial_config(conffile, config, creds_mgr_descriptor=creds_mgr_descr) else: - add_section(conffile, apiurl, user, passwd, creds_mgr_descriptor=creds_mgr_descr) + add_section(conffile, apiurl, user, passwd, creds_mgr_descriptor=creds_mgr_descr, allow_http=http) def select_credentials_manager_descr(): if not credentials.has_keyring_support(): diff --git a/tests/test_repairwc.py b/tests/test_repairwc.py index 0a4d506a..a037b602 100644 --- a/tests/test_repairwc.py +++ b/tests/test_repairwc.py @@ -206,17 +206,6 @@ class TestRepairWC(OscTestCase): self.assertEqual(open(os.path.join('.osc', '_apiurl')).read(), 'http://localhost\n') self.assertEqual(p.apiurl, 'http://localhost') - def test_invalidapiurl_param(self): - """pass an invalid apiurl to wc_repair""" - try: - from urllib.error import URLError - except ImportError: - from urllib2 import URLError - self._change_to_pkg('invalid_apiurl') - p = osc.core.Package('.', wc_check=False) - self.assertRaises(URLError, p.wc_repair, 'http:/localhost') - self.assertRaises(URLError, p.wc_repair, 'invalid') - def test_noapiurlNotExistingApiurl(self): """the package wc has no _apiurl file and no apiurl is passed to repairwc""" self._change_to_pkg('noapiurl') @@ -238,33 +227,6 @@ class TestRepairWC(OscTestCase): self.assertTrue(os.path.exists(os.path.join(storedir, '_apiurl'))) self.assertEqual(open(os.path.join(storedir, '_apiurl'), 'r').read(), 'http://localhost\n') - def test_project_invalidapiurl(self): - """the project wc has an invalid _apiurl file (invalid url format)""" - import shutil - prj_dir = os.path.join(self.tmpdir, 'prj_invalidapiurl') - shutil.copytree(os.path.join(self._get_fixtures_dir(), 'prj_invalidapiurl'), prj_dir) - storedir = os.path.join(prj_dir, osc.core.store) - self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Project, prj_dir, getPackageList=False) - prj = osc.core.Project(prj_dir, wc_check=False, getPackageList=False) - prj.wc_repair('http://localhost') - self.assertTrue(os.path.exists(os.path.join(storedir, '_apiurl'))) - self.assertTrue(os.path.exists(os.path.join(storedir, '_apiurl'))) - self.assertEqual(open(os.path.join(storedir, '_apiurl'), 'r').read(), 'http://localhost\n') - - def test_project_invalidapiurl_param(self): - """pass an invalid apiurl to wc_repair""" - import shutil - try: - from urllib.error import URLError - except ImportError: - from urllib2 import URLError - prj_dir = os.path.join(self.tmpdir, 'prj_invalidapiurl') - shutil.copytree(os.path.join(self._get_fixtures_dir(), 'prj_invalidapiurl'), prj_dir) - storedir = os.path.join(prj_dir, osc.core.store) - self.assertRaises(osc.oscerr.WorkingCopyInconsistent, osc.core.Project, prj_dir, getPackageList=False) - prj = osc.core.Project(prj_dir, wc_check=False, getPackageList=False) - self.assertRaises(URLError, prj.wc_repair, 'http:/localhost') - self.assertRaises(URLError, prj.wc_repair, 'invalid') if __name__ == '__main__': import unittest