Projet

Général

Profil

0001-passerelle-use-shared_secret-for-ApiUser.key-fixes-8.patch

Frédéric Péters, 18 décembre 2015 10:14

Télécharger (7,4 ko)

Voir les différences:

Subject: [PATCH] passerelle: use shared_secret for ApiUser.key (fixes #8580)

 .../passerelle/management/commands/hobo_deploy.py  | 14 +++++-
 jenkins.sh                                         |  2 +-
 tests_passerelle/conftest.py                       | 15 ++++++
 tests_passerelle/settings.py                       | 25 ++++++++++
 tests_passerelle/test_deploy.py                    | 57 ++++++++++++++++++++++
 tox.ini                                            | 30 ++++++++++++
 6 files changed, 140 insertions(+), 3 deletions(-)
 create mode 100644 tests_passerelle/conftest.py
 create mode 100644 tests_passerelle/settings.py
 create mode 100644 tests_passerelle/test_deploy.py
hobo/agent/passerelle/management/commands/hobo_deploy.py
2 2

  
3 3
from tenant_schemas.utils import tenant_context
4 4
from hobo.agent.common.management.commands import hobo_deploy
5
from hobo.multitenant.settings_loaders import KnownServices
5 6

  
6 7
from passerelle.base.models import ApiUser
7 8

  
......
12 13
    def deploy_specifics(self, hobo_environment, tenant):
13 14
        super(Command, self).deploy_specifics(hobo_environment, tenant)
14 15
        with tenant_context(tenant):
15
            for service in hobo_environment.get('services'):
16
            services = hobo_environment.get('services')
17
            for service in services:
18
                if service.get('this'):
19
                    this = service
20
                    break
21
            else:
22
                raise RuntimeError('unable to find this service')
23
            our_key = this['secret_key']
24
            for service in services:
16 25
                if service.get('this') or not service.get('secret_key'):
17 26
                    continue
18 27
                domain = urlparse.urlparse(service.get('base_url')).netloc.split(':')[0]
19 28
                obj, created = ApiUser.objects.get_or_create(username=domain,
20 29
                                                             keytype='SIGN')
21 30
                obj.fullname = service.get('title')
22
                obj.key = service.get('secret_key')
31
                their_key = service.get('secret_key')
32
                obj.key = KnownServices.shared_secret(our_key, their_key)
23 33
                obj.save()
jenkins.sh
10 10

  
11 11
tox
12 12

  
13
./merge-junit-results.py hobo_server_test_results.xml multitenant_test_results.xml authentic2_agent_test_results.xml >test_results.xml
13
./merge-junit-results.py hobo_server_test_results.xml multitenant_test_results.xml authentic2_agent_test_results.xml passerelle_agent_test_results.xml >test_results.xml
14 14
./merge-coverage.py -o coverage.xml *_coverage.xml
15 15

  
16 16

  
tests_passerelle/conftest.py
1
import os
2
import tempfile
3
import shutil
4
import json
5

  
6
import pytest
7

  
8
@pytest.fixture
9
def tenant_base(request, settings):
10
    base = tempfile.mkdtemp('passerelle-tenant-base')
11
    settings.TENANT_BASE = base
12
    def fin():
13
        shutil.rmtree(base)
14
    request.addfinalizer(fin)
15
    return tenant_base
tests_passerelle/settings.py
1
import os.path
2
import __builtin__ as builtin
3
from mock import mock_open, patch
4
import os
5

  
6
# Debian defaults
7
DEBUG = False
8

  
9
PROJECT_NAME = 'passerelle'
10

  
11
#
12
# hobotization (multitenant)
13
#
14
with patch.object(builtin, 'file', mock_open(read_data='xxx')):
15
    execfile(os.environ['DEBIAN_CONFIG_COMMON'])
16

  
17
# suds logs are buggy
18
LOGGING['loggers']['suds'] = {
19
        'level': 'ERROR',
20
        'handlers': ['mail_admins', 'sentry'],
21
        'propagate': True,
22
}
23

  
24
# Add passerelle hobo agent
25
INSTALLED_APPS = ('hobo.agent.passerelle',) + INSTALLED_APPS
tests_passerelle/test_deploy.py
1
import json
2
import sys
3
import time
4

  
5
from tenant_schemas.utils import tenant_context
6
from hobo.multitenant.middleware import TenantMiddleware
7
from django.core.management import call_command
8
import StringIO
9

  
10

  
11
def test_deploy_specifics(db, tenant_base):
12
    from django.conf import settings
13
    from passerelle.base.models import ApiUser
14

  
15
    hobo_json = {
16
        'variables': {
17
            'hobo_test_variable': True,
18
            'other_variable': 'foo',
19
        },
20
        'services': [
21
            {
22
                'slug': 'test',
23
                'title': 'Test',
24
                'service-id': 'welco',
25
                'this': True,
26
                'secret_key': '12345',
27
                'base_url': 'http://passerelle.example.net',
28
                'saml-sp-metadata-url': 'http://passerelle.example.net/saml/metadata',
29
                'variables': {
30
                    'other_variable': 'bar',
31
                }
32
            },
33
            {
34
                'slug': 'other',
35
                'title': 'Other',
36
                'secret_key': 'abcde',
37
                'service-id': 'wcs',
38
                'base_url': 'http://wcs.example.net'
39
            },
40
        ]
41
    }
42
    old_stdin = sys.stdin
43
    sys.stdin = StringIO.StringIO(json.dumps(hobo_json))
44
    try:
45
        call_command('hobo_deploy', 'http://passerelle.example.net', '-')
46
    finally:
47
        sys.stdin = old_stdin
48

  
49
    assert len(list(TenantMiddleware.get_tenants())) == 1
50
    tenant = next(TenantMiddleware.get_tenants())
51
    with tenant_context(tenant):
52
        # There is a 3 seconds cache now, hobo.json could be outdated
53
        settings.clear_tenants_settings()
54
        other = settings.KNOWN_SERVICES['wcs']['other']
55
        secret = other['secret']
56
        assert ApiUser.objects.filter(username=other['verif_orig'], keytype='SIGN',
57
                                      key=secret).count() == 1
tox.ini
79 79
  pylint==1.4.0
80 80
  astroid==1.3.2
81 81
  WebTest
82

  
83

  
84
[testenv:hobo-agent-passerelle]
85
# django.contrib.auth is not tested it does not work with our templates
86
whitelist_externals =
87
    /bin/mv
88
    pip
89
setenv =
90
    DEBIAN_CONFIG_COMMON=debian/debian_config_common.py
91
    DJANGO_SETTINGS_MODULE=passerelle.settings
92
    PASSERELLE_SETTINGS_FILE=tests_passerelle/settings.py
93
commands =
94
    ./getlasso.sh
95
    pip install http://git.entrouvert.org/passerelle.git/snapshot/passerelle-master.tar.gz
96

  
97
    py.test --junitxml=passerelle_agent_test_results.xml --cov-report xml --cov=hobo/ --cov-config .coveragerc --nomigration tests_passerelle/
98
    mv coverage.xml passerelle_agent_coverage.xml
99
usedevelop = True
100
deps = django>1.7,<1.8
101
  coverage
102
  pytest
103
  pytest-cov
104
  pytest-django
105
  pytest-mock
106
  mock
107
  raven
108
  cssselect
109
  pylint==1.4.0
110
  astroid==1.3.2
111
  WebTest
82
-