diff --git a/lemur/sources/service.py b/lemur/sources/service.py index 5980c6f5..711c6452 100644 --- a/lemur/sources/service.py +++ b/lemur/sources/service.py @@ -17,6 +17,8 @@ from lemur.certificates import service as cert_service from lemur.endpoints import service as endpoint_service from lemur.destinations import service as destination_service +from lemur.certificates.schemas import CertificateUploadInputSchema + from lemur.plugins.base import plugins @@ -62,11 +64,17 @@ def _disassociate_endpoints_from_source(endpoints, source): def certificate_create(certificate, source): - cert = cert_service.import_certificate(**certificate) + data, errors = CertificateUploadInputSchema().load(certificate) + + if errors: + raise Exception("Unable to import certificate: {reasons}".format(reasons=errors)) + + cert = cert_service.import_certificate(**data) cert.description = "This certificate was automatically discovered by Lemur" cert.sources.append(source) sync_update_destination(cert, source) database.update(cert) + return cert def certificate_update(certificate, source): diff --git a/lemur/tests/conftest.py b/lemur/tests/conftest.py index 834b50d9..98ffb438 100644 --- a/lemur/tests/conftest.py +++ b/lemur/tests/conftest.py @@ -10,7 +10,7 @@ from lemur.database import db as _db from lemur.auth.service import create_token from .factories import AuthorityFactory, NotificationFactory, DestinationFactory, \ - CertificateFactory, UserFactory, RoleFactory + CertificateFactory, UserFactory, RoleFactory, SourceFactory def pytest_runtest_setup(item): @@ -91,6 +91,13 @@ def destination(session): return d +@pytest.fixture +def source(session): + s = SourceFactory() + session.commit() + return s + + @pytest.fixture def notification(session): n = NotificationFactory() diff --git a/lemur/tests/factories.py b/lemur/tests/factories.py index c39aef9e..eeedab88 100644 --- a/lemur/tests/factories.py +++ b/lemur/tests/factories.py @@ -10,6 +10,7 @@ from lemur.database import db from lemur.authorities.models import Authority from lemur.certificates.models import Certificate from lemur.destinations.models import Destination +from lemur.sources.models import Source from lemur.notifications.models import Notification from lemur.users.models import User from lemur.roles.models import Role @@ -145,6 +146,16 @@ class DestinationFactory(BaseFactory): model = Destination +class SourceFactory(BaseFactory): + """Source factory.""" + plugin_name = 'test-source' + label = Sequence(lambda n: 'source{0}'.format(n)) + + class Meta: + """Factory Configuration.""" + model = Source + + class NotificationFactory(BaseFactory): """Notification factory.""" plugin_name = 'test-notification' diff --git a/lemur/tests/test_sources.py b/lemur/tests/test_sources.py index 1dd7bf9b..c3dd613c 100644 --- a/lemur/tests/test_sources.py +++ b/lemur/tests/test_sources.py @@ -2,7 +2,7 @@ import pytest from lemur.sources.views import * # noqa -from .vectors import VALID_ADMIN_HEADER_TOKEN, VALID_USER_HEADER_TOKEN +from .vectors import VALID_ADMIN_HEADER_TOKEN, VALID_USER_HEADER_TOKEN, INTERNAL_PRIVATE_KEY_A_STR, INTERNAL_VALID_WILDCARD_STR def validate_source_schema(client): @@ -18,6 +18,22 @@ def validate_source_schema(client): assert not errors +def test_create_certificate(source): + from lemur.sources.service import certificate_create + + with pytest.raises(Exception): + certificate_create({}, source) + + data = { + 'body': INTERNAL_VALID_WILDCARD_STR, + 'private_key': INTERNAL_PRIVATE_KEY_A_STR, + 'owner': 'bob@example.com' + } + + cert = certificate_create(data, source) + assert cert.notifications + + @pytest.mark.parametrize("token,status", [ (VALID_USER_HEADER_TOKEN, 404), (VALID_ADMIN_HEADER_TOKEN, 404),