diff options
-rw-r--r-- | .gitignore | 2 | ||||
-rw-r--r-- | MANIFEST.in | 2 | ||||
-rw-r--r-- | data/TODO | 1 | ||||
-rw-r--r-- | data/branding/cacert.pem | 24 | ||||
-rw-r--r-- | pkg/branding/__init__.py | 15 | ||||
-rw-r--r-- | pkg/branding/config.py | 11 | ||||
-rwxr-xr-x | setup.py | 149 | ||||
-rw-r--r-- | src/leap/__init__.py | 5 | ||||
-rw-r--r-- | src/leap/app.py | 2 | ||||
-rw-r--r-- | src/leap/base/config.py | 2 | ||||
-rw-r--r-- | src/leap/base/constants.py | 15 | ||||
-rw-r--r-- | src/leap/base/tests/test_config.py | 2 | ||||
-rw-r--r-- | src/leap/baseapp/eip.py | 19 | ||||
-rw-r--r-- | src/leap/certs/__init__.py | 7 | ||||
-rw-r--r-- | src/leap/eip/checks.py | 14 | ||||
-rw-r--r-- | src/leap/eip/eipconnection.py | 4 | ||||
-rw-r--r-- | src/leap/eip/openvpnconnection.py | 7 | ||||
-rw-r--r-- | src/leap/eip/specs.py | 10 |
18 files changed, 253 insertions, 38 deletions
@@ -16,4 +16,6 @@ man/ share/ src/leap.egg-info/ src/leap_client.egg-info +src/leap/_branding.py +src/leap/certs/*.pem MANIFEST diff --git a/MANIFEST.in b/MANIFEST.in index d67d3142..685cee16 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,3 +1,5 @@ include pkg/* +include pkg/branding/* include docs/* include versioneer.py +include src/leap/certs/*.pem diff --git a/data/TODO b/data/TODO deleted file mode 100644 index 580227ac..00000000 --- a/data/TODO +++ /dev/null @@ -1 +0,0 @@ -icons file and stuff should be moved here at some point! diff --git a/data/branding/cacert.pem b/data/branding/cacert.pem new file mode 100644 index 00000000..ed12e159 --- /dev/null +++ b/data/branding/cacert.pem @@ -0,0 +1,24 @@ +-----BEGIN CERTIFICATE----- +MIIECzCCAl2gAwIBAgIEUFDp9TANBgkqhkiG9w0BAQsFADAPMQ0wCwYDVQQDEwRU +RVNUMB4XDTEyMDkxMjIwMDA1M1oXDTEzMDkxMjIwMDA1M1owDzENMAsGA1UEAxME +VEVTVDCCAbgwDQYJKoZIhvcNAQEBBQADggGlADCCAaACggGXANsoS1m9wj9iv+UV +BXfeq14SR94gSot96eJu7PZVRrcGlGe/PRfbmfxF3j/gXM9B8sIkyM2L46OMtOKw +1iOTKtYYdMhtnUSd3FRshWGtYeuy+OCe9umU0jfZDBZ2pXlUmSqCNqfD0OPkksYL +GDjQUKjaEd1oURwpCG8uEU+3tjBNCMuEwhcMEoUYmI8t4vss2hdFb+LKefVMPTzz +oiNM/o8Z/ANzWCC0qSW5FsB4wGhUS5HKLDOr4tACgdxaJSWtAqFFAnyMeG9g8aqe +PTM+URlqVnzzGckrJwBbd4y0zEpv/R7SAiSAP725cnB1GKptwdrcNIIHnQjOdAOl +uNg6JlRXrv6fV1gApka4INfJAf1yMf+fA0WdZ22UJQ9Up7tdzi8lL+3HsEpEx4Pz +NyzuqzEw9LJ6SUmMcE/VP00t4RjTOVoncwcLjvURY8jt2DQ9E36JEPwUoyALq/De +bGBjeK2KGzBZcOu1HZAwWLLWR2++WKuCEXbRbahwSIlbMfmAe8xGx4bbHol0D1A+ +wmu0uxjAze6FvUkCAwEAAaNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNVHQ8BAf8E +BQMDBwQAMB0GA1UdDgQWBBT/PX8XZ0Y2jDkppz6PHs23IgzQEDANBgkqhkiG9w0B +AQsFAAOCAZcAMfi+HLbcFaB0/Mv8/GkIdjpThUBVEeFrIiDy9GmGWUDOXgP1Skld +5H4eY5inE5lFfB69yacHIGS4OiZIBuBKfKNl5d6XO+ztJEJpG3yrbF4MtGV/aHEp +OlbJCncnk3fspBk6tFGrv4Inak4gza6SQPfBEZj29ciwfwrqrtuWZ7km+og0Clcd +pIB0g+DK0K//NtaDZDK0havQw2AFJKyXlNfI8XZ2jsNmQYR1wtiMci+UfGQr7bjn +Kw9yyVCf0ohXvnSK4ortz/bDQbcMWkK0m/VCCEK8PSldk+XFzPWFWn5ndKCczcvd +1BQc392n12ZstEuzm6+d9A0D3kCxralJUXUC+4kThq4Rtjey/gBjyZQnZ+5tIxMF +5ZFAStEglNxqm6HB17q7owJqTvIg9Cf9GATsvoFFQDJrBXewRX7cWVeSr0zNSQB4 +ydIlSUOkyE3AyfLN+lx8NVS/I7gp4fWDuHrh27NKKDtMxalxPL5pTGO7l4uTybLY +4aVzQYGvzA5HVS++VAtcTQ6TP9p4HURL2cllEU9u9A== +-----END CERTIFICATE----- diff --git a/pkg/branding/__init__.py b/pkg/branding/__init__.py new file mode 100644 index 00000000..0bd6befb --- /dev/null +++ b/pkg/branding/__init__.py @@ -0,0 +1,15 @@ +from .config import APP_BASE_NAME, APP_PREFIX, BRANDED_BUILD, BRANDED_OPTS + + +def get_name(): + if BRANDED_BUILD is True: + return APP_PREFIX + BRANDED_OPTS.get('short_name', 'name_unknown') + else: + return APP_BASE_NAME + + +def get_shortname(): + if BRANDED_BUILD is True: + return BRANDED_OPTS.get('short_name', 'name_unknown') + +__all__ = ['get_name'] diff --git a/pkg/branding/config.py b/pkg/branding/config.py new file mode 100644 index 00000000..665cfbda --- /dev/null +++ b/pkg/branding/config.py @@ -0,0 +1,11 @@ +# Configuration file for branding + +BRANDED_BUILD = True + +APP_BASE_NAME = "leap-client" +APP_PREFIX = "%s-" % APP_BASE_NAME + +BRANDED_OPTS = { + 'short_name': "springbok", + 'provider_domain': "springbok", + 'provider_ca_path': "data/branding/cacert.pem"} @@ -12,11 +12,17 @@ except ImportError: import os from pkg import utils +from pkg import branding import versioneer versioneer.versionfile_source = 'src/leap/_version.py' versioneer.versionfile_build = 'leap/_version.py' versioneer.tag_prefix = '' # tags are like 1.2.0 -versioneer.parentdir_prefix = 'leap_client-' +#versioneer.parentdir_prefix = 'leap_client-' +versioneer.parentdir_prefix = branding.APP_PREFIX + +branding.brandingfile = 'src/leap/_branding.py' +branding.brandingfile_build = 'leap/_branding.py' +branding.cert_path = 'src/leap/certs' setup_root = os.path.dirname(__file__) sys.path.insert(0, os.path.join(setup_root, "src")) @@ -37,11 +43,139 @@ trove_classifiers = [ "Topic :: Utilities" ] +BRANDING_OPTS = """ +# Do NOT manually edit this file! +# This file has been written from pkg/branding/config.py data by leap setup.py +# script. + +BRANDING = { + 'short_name': "%(short_name)s", + 'provider_domain': "%(provider_domain)s", + 'provider_ca_file': "%(provider_ca_file)s"} +""" + + +def write_to_branding_file(filename, branding_dict): + f = open(filename, "w") + f.write(BRANDING_OPTS % branding_dict) + f.close() + + +def copy_pemfile_to_certdir(frompath, topath): + with open(frompath, "r") as cert_f: + cert_s = cert_f.read() + with open(topath, "w") as f: + f.write(cert_s) + + +def do_branding(targetfile=branding.brandingfile): + if branding.BRANDED_BUILD: + opts = branding.BRANDED_OPTS + print("DOING BRANDING FOR LEAP") + certpath = opts['provider_ca_path'] + shortname = opts['short_name'] + tocertfile = shortname + '-cacert.pem' + topath = os.path.join( + branding.cert_path, + tocertfile) + copy_pemfile_to_certdir( + certpath, + topath) + opts['provider_ca_file'] = tocertfile + write_to_branding_file( + targetfile, + opts) + else: + print('not running branding because BRANDED_BUILD set to False') + + +from setuptools import Command + + +class DoBranding(Command): + description = "copy the branding info the the top level package" + user_options = [] + + def initialize_options(self): + pass + + def finalize_options(self): + pass + + def run(self): + do_branding() + +from distutils.command.build import build as _build +from distutils.command.sdist import sdist as _sdist + + +class cmd_build(_build): + def run(self): + #versioneer.cmd_build(self) + _build.run(self) + + # versioneer + versions = versioneer.get_versions(verbose=True) + # now locate _version.py in the new build/ directory and replace it + # with an updated value + target_versionfile = os.path.join( + self.build_lib, + versioneer.versionfile_build) + print("UPDATING %s" % target_versionfile) + os.unlink(target_versionfile) + f = open(target_versionfile, "w") + f.write(versioneer.SHORT_VERSION_PY % versions) + f.close() + + # branding + target_brandingfile = os.path.join( + self.build_lib, + branding.brandingfile_build) + do_branding(targetfile=target_brandingfile) + + +class cmd_sdist(_sdist): + def run(self): + # versioneer: + versions = versioneer.get_versions(verbose=True) + self._versioneer_generated_versions = versions + # unless we update this, the command will keep using the old version + self.distribution.metadata.version = versions["version"] + + # branding: + do_branding() + return _sdist.run(self) + + def make_release_tree(self, base_dir, files): + _sdist.make_release_tree(self, base_dir, files) + # now locate _version.py in the new base_dir directory (remembering + # that it may be a hardlink) and replace it with an updated value + target_versionfile = os.path.join( + base_dir, versioneer.versionfile_source) + print("UPDATING %s" % target_versionfile) + os.unlink(target_versionfile) + f = open(target_versionfile, "w") + f.write( + versioneer.SHORT_VERSION_PY % self._versioneer_generated_versions) + f.close() + + +cmdclass = versioneer.get_cmdclass() +cmdclass["branding"] = DoBranding +cmdclass["build"] = cmd_build +cmdclass["sdist"] = cmd_sdist + +launcher_name = branding.get_shortname() +if launcher_name: + leap_launcher = 'leap-%s-client=leap.app:main' % launcher_name +else: + leap_launcher = 'leap=leap.app:main' + setup( - name='leap-client', + name=branding.get_name(), package_dir={"": "src"}, version=versioneer.get_version(), - cmdclass=versioneer.get_cmdclass(), + cmdclass=cmdclass, description="the internet encryption toolkit", long_description=( "Desktop Client for the LEAP Platform." @@ -79,8 +213,11 @@ setup( ["pkg/linux/polkit/net.openvpn.gui.leap.policy"]) ], platforms="all", - scripts=["pkg/scripts/leap"], - entry_points=""" + #scripts=["pkg/scripts/leap"], + entry_points = { + 'console_scripts': [leap_launcher] + }, + #entry_points=""" # -*- Entry points: -*- - """, + #""", ) diff --git a/src/leap/__init__.py b/src/leap/__init__.py index 75bddd6d..5e003931 100644 --- a/src/leap/__init__.py +++ b/src/leap/__init__.py @@ -28,3 +28,8 @@ except ImportError: pass __full_version__ = __appname__ + '/' + str(__version__) + +try: + from leap._branding import BRANDING as __branding +except ImportError: + __branding = {} diff --git a/src/leap/app.py b/src/leap/app.py index b721468f..1aebfca2 100644 --- a/src/leap/app.py +++ b/src/leap/app.py @@ -44,7 +44,7 @@ def main(): fileh.setFormatter(formatter) logger.addHandler(fileh) - logger.debug('args: %s' % opts) + #logger.debug('args: %s' % opts) logger.info('Starting app') logger.info('Running client version %s', VERSION) diff --git a/src/leap/base/config.py b/src/leap/base/config.py index 5a52637c..e896ffd2 100644 --- a/src/leap/base/config.py +++ b/src/leap/base/config.py @@ -239,7 +239,7 @@ def get_config_file(filename, folder=None): def get_default_provider_path(): default_subpath = os.path.join("providers", - constants.DEFAULT_TEST_PROVIDER) + constants.DEFAULT_PROVIDER) default_provider_path = get_config_file( '', folder=default_subpath) diff --git a/src/leap/base/constants.py b/src/leap/base/constants.py index 6266c693..f3e24715 100644 --- a/src/leap/base/constants.py +++ b/src/leap/base/constants.py @@ -1,23 +1,26 @@ """constants to be used in base module""" -APP_NAME = "leap" +from leap import __branding +APP_NAME = __branding.get("short_name", "leap") # default provider placeholder # using `example.org` we make sure that this # is not going to be resolved during the tests phases # (we expect testers to add it to their /etc/hosts -DEFAULT_TEST_PROVIDER = "testprovider.example.org" +DEFAULT_PROVIDER = __branding.get( + "provider_domain", + "testprovider.example.org") -DEFINITION_EXPECTED_PATH = "provider-definition.json" +DEFINITION_EXPECTED_PATH = "definition.json" DEFAULT_PROVIDER_DEFINITION = { - u'api_uri': u'https://api.testprovider.example.org/', + u'api_uri': u'https://api.%s/' % DEFAULT_PROVIDER, u'api_version': u'0.1.0', u'ca_cert': u'8aab80ae4326fd30721689db813733783fe0bd7e', - u'ca_cert_uri': u'https://testprovider.example.org/cacert.pem', + u'ca_cert_uri': u'https://%s/cacert.pem' % DEFAULT_PROVIDER, u'description': {u'en': u'This is a test provider'}, u'display_name': {u'en': u'Test Provider'}, - u'domain': u'testprovider.example.org', + u'domain': u'%s' % DEFAULT_PROVIDER, u'enrollment_policy': u'open', u'public_key': u'cb7dbd679f911e85bc2e51bd44afd7308ee19c21', u'serial': 1, diff --git a/src/leap/base/tests/test_config.py b/src/leap/base/tests/test_config.py index 40461b99..74b06119 100644 --- a/src/leap/base/tests/test_config.py +++ b/src/leap/base/tests/test_config.py @@ -218,7 +218,7 @@ class ConfigHelperFunctions(BaseLeapTest): config.get_default_provider_path(), os.path.expanduser( '~/.config/leap/providers/%s/' % - constants.DEFAULT_TEST_PROVIDER) + constants.DEFAULT_PROVIDER) ) # validate ip diff --git a/src/leap/baseapp/eip.py b/src/leap/baseapp/eip.py index 515ae58d..ff6a79ac 100644 --- a/src/leap/baseapp/eip.py +++ b/src/leap/baseapp/eip.py @@ -1,5 +1,7 @@ +from __future__ import print_function import logging import time +import sys from PyQt4 import QtCore @@ -38,8 +40,9 @@ class EIPConductorAppMixin(object): debug=self.debugmode, ovpn_verbosity=opts.openvpn_verb) - # XXX remove skip download when sample service is ready - self.conductor.run_checks(skip_download=True) + # XXX get skip_download from cli flag + skip_download = False + self.conductor.run_checks(skip_download=skip_download) self.error_check() # XXX should receive "ready" signal @@ -58,13 +61,11 @@ class EIPConductorAppMixin(object): """ logger.debug('error check') - ##################################### - # XXX refactor in progress (by #504) - errq = self.conductor.error_queue while errq.qsize() != 0: logger.debug('%s errors left in conductor queue', errq.qsize()) - error = errq.get() + # we get exception and original traceback from queue + error, tb = errq.get() # redundant log, debugging the loop. logger.error('%s: %s', error.__class__.__name__, error.message) @@ -73,10 +74,8 @@ class EIPConductorAppMixin(object): self.handle_eip_error(error) else: - # This is not quite working. FIXME - import traceback - traceback.print_exc() - raise error + # deprecated form of raising exception. + raise error, None, tb if error.failfirst is True: break diff --git a/src/leap/certs/__init__.py b/src/leap/certs/__init__.py new file mode 100644 index 00000000..c4d009b1 --- /dev/null +++ b/src/leap/certs/__init__.py @@ -0,0 +1,7 @@ +import os + +_where = os.path.split(__file__)[0] + + +def where(filename): + return os.path.join(_where, filename) diff --git a/src/leap/eip/checks.py b/src/leap/eip/checks.py index f368c551..aea5a5d7 100644 --- a/src/leap/eip/checks.py +++ b/src/leap/eip/checks.py @@ -257,7 +257,7 @@ class ProviderCertChecker(object): return True def _get_client_cert_uri(self): - return "https://%s/cert/get" % (baseconstants.DEFAULT_TEST_PROVIDER) + return "https://%s/cert/get" % (baseconstants.DEFAULT_PROVIDER) def _get_client_cert_path(self): # MVS+ : get provider path @@ -414,14 +414,18 @@ class EIPConfigChecker(object): def _get_provider_definition_uri(self, domain=None, path=None): if domain is None: - domain = baseconstants.DEFAULT_TEST_PROVIDER + domain = baseconstants.DEFAULT_PROVIDER if path is None: path = baseconstants.DEFINITION_EXPECTED_PATH - return "https://%s/%s" % (domain, path) + uri = u"https://%s/%s" % (domain, path) + logger.debug('getting provider definition from %s' % uri) + return uri def _get_eip_service_uri(self, domain=None, path=None): if domain is None: - domain = baseconstants.DEFAULT_TEST_PROVIDER + domain = baseconstants.DEFAULT_PROVIDER if path is None: path = eipconstants.EIP_SERVICE_EXPECTED_PATH - return "https://%s/%s" % (domain, path) + uri = "https://%s/%s" % (domain, path) + logger.debug('getting eip service file from %s', uri) + return uri diff --git a/src/leap/eip/eipconnection.py b/src/leap/eip/eipconnection.py index 3a879f01..d1c84b2a 100644 --- a/src/leap/eip/eipconnection.py +++ b/src/leap/eip/eipconnection.py @@ -4,6 +4,7 @@ EIP Connection Class from __future__ import (absolute_import,) import logging import Queue +import sys from leap.eip.checks import EIPConfigChecker from leap.eip import config as eipconfig @@ -48,7 +49,8 @@ class EIPConnection(OpenVPNConnection): self.config_checker.run_all(skip_download=skip_download) self.run_openvpn_checks() except Exception as exc: - self.error_queue.put(exc) + exc_traceback = sys.exc_info()[2] + self.error_queue.put((exc, exc_traceback)) def connect(self): """ diff --git a/src/leap/eip/openvpnconnection.py b/src/leap/eip/openvpnconnection.py index c280f70d..65683485 100644 --- a/src/leap/eip/openvpnconnection.py +++ b/src/leap/eip/openvpnconnection.py @@ -117,11 +117,10 @@ to be triggered for each one of them. """ try: eip_config.check_vpn_keys() - except eip_exceptions.EIPInitNoKeyFileError: - self.missing_vpn_keyfile = True except eip_exceptions.EIPInitBadKeyFilePermError: - logger.error('error while checking vpn keys') - self.bad_keyfile_perms = True + logger.error('Bad VPN Keys permission!') + # do nothing now + # and raise the rest ... def _launch_openvpn(self): """ diff --git a/src/leap/eip/specs.py b/src/leap/eip/specs.py index e617574c..05aef590 100644 --- a/src/leap/eip/specs.py +++ b/src/leap/eip/specs.py @@ -1,15 +1,21 @@ from __future__ import (unicode_literals) import os +from leap import __branding from leap.base import config as baseconfig +PROVIDER_CA_CERT = __branding.get( + 'provider_ca_file', + 'testprovider-ca-cert.pem') provider_ca_path = lambda: unicode(os.path.join( baseconfig.get_default_provider_path(), 'keys', 'ca', - 'testprovider-ca-cert.pem' + PROVIDER_CA_CERT )) +PROVIDER_DOMAIN = __branding.get('provider_domain', 'testprovider.example.org') + client_cert_path = lambda: unicode(os.path.join( baseconfig.get_default_provider_path(), @@ -20,7 +26,7 @@ client_cert_path = lambda: unicode(os.path.join( eipconfig_spec = { 'provider': { 'type': unicode, - 'default': u"testprovider.example.org", + 'default': u"%s" % PROVIDER_DOMAIN, 'required': True, }, 'transport': { |