def test_page_returns_on_get(self):
        # set up some initial data
        iot = InformatieObjectTypeFactory.create()
        Autorisatie.objects.create(
            applicatie=self.applicatie,
            component=ComponentTypes.drc,
            scopes=["documenten.lezen"],
            max_vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.
            openbaar,
            informatieobjecttype=build_absolute_url(
                iot.get_absolute_api_url()),
        )
        AutorisatieSpecFactory.create(
            applicatie=self.applicatie,
            component=ComponentTypes.brc,
            scopes=["besluiten.lezen"],
        )
        Autorisatie.objects.create(
            applicatie=self.applicatie,
            component=ComponentTypes.nrc,
            scopes=["notificaties.consumeren"],
        )

        response = self.client.get(self.url)

        self.assertEqual(response.status_code, 200)
示例#2
0
    def test_autorisaties_are_deleted(self):
        applicatie = ApplicatieFactory.create()
        zaaktype = ZaakTypeFactory.create()
        AutorisatieFactory.create(
            applicatie=applicatie,
            component=ComponentTypes.zrc,
            zaaktype=build_absolute_url(zaaktype.get_absolute_api_url()),
            max_vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.
            openbaar,
        )
        # Different max_vertrouwelijkheidaanduiding compared to the Autorisatie
        autorisatie_spec = AutorisatieSpecFactory.create(
            applicatie=applicatie,
            component=ComponentTypes.zrc,
            max_vertrouwelijkheidaanduiding=VertrouwelijkheidsAanduiding.
            geheim,
        )

        self.assertEqual(Autorisatie.objects.all().count(), 1)
        autorisatie = Autorisatie.objects.get()
        self.assertEqual(
            autorisatie.max_vertrouwelijkheidaanduiding,
            VertrouwelijkheidsAanduiding.openbaar,
        )

        autorisatie_spec.sync()

        # Check that the autorisatie that doesn't match the AutorisatieSpec is deleted and replaced with a correct one
        self.assertEqual(Autorisatie.objects.all().count(), 1)
        autorisatie = Autorisatie.objects.get()
        self.assertEqual(
            autorisatie.max_vertrouwelijkheidaanduiding,
            VertrouwelijkheidsAanduiding.geheim,
        )
示例#3
0
def sync_autorisaties(sender: ModelBase, signal: ModelSignal,
                      instance: Union[ZaakType, InformatieObjectType,
                                      BesluitType], **kwargs) -> None:
    logger.debug("Received signal %r, from sender %r", signal, sender)

    instance_path = instance.get_absolute_api_url()
    instance_url = build_absolute_url(instance_path)
    Autorisatie.objects.filter(zaaktype=instance_url).delete()
示例#4
0
def get_absolute_url(url_name: str, uuid: str) -> str:
    path = reverse(
        url_name,
        kwargs={
            "version": settings.REST_FRAMEWORK["DEFAULT_VERSION"],
            "uuid": uuid
        },
    )
    return build_absolute_url(path)
 def _add_autorisatie(self, obj, **kwargs):
     url = build_absolute_url(obj.get_absolute_api_url())
     field = obj._meta.model_name
     Autorisatie.objects.create(
         applicatie=self.applicatie,
         **{
             field: url,
             **kwargs
         },
     )
示例#6
0
    def sync(cls):
        """
        Synchronize the Autorisaties for all Applicaties.

        Invoke this method whenever a ZaakType/InformatieObjectType/BesluitType
        is created to set up the appropriate Autorisatie objects. This is best
        called as part of `transaction.on_commit`.
        """
        from .utils import send_applicatie_changed_notification

        qs = cls.objects.select_related("applicatie").prefetch_related(
            "applicatie__autorisaties")

        to_delete = []
        to_keep = []
        to_add = []

        for spec in qs:
            existing_autorisaties = [
                autorisatie
                for autorisatie in spec.applicatie.autorisaties.all()
                if autorisatie.component == spec.component
            ]

            for autorisatie in existing_autorisaties:
                # schedule for deletion if existing objects differ from the spec
                if (autorisatie.max_vertrouwelijkheidaanduiding !=
                        spec.max_vertrouwelijkheidaanduiding):
                    to_delete.append(autorisatie)
                    continue

                if set(autorisatie.scopes) != set(spec.scopes):
                    to_delete.append(autorisatie)
                    continue

                to_keep.append(autorisatie)

            TypeModel = apps.get_model(COMPONENT_TO_MODEL[spec.component])
            field = COMPONENT_TO_FIELD[spec.component]

            for obj in TypeModel.objects.all():
                url = build_absolute_url(obj.get_absolute_api_url())

                autorisatie = Autorisatie(applicatie=spec.applicatie,
                                          component=spec.component,
                                          scopes=spec.scopes,
                                          max_vertrouwelijkheidaanduiding=spec.
                                          max_vertrouwelijkheidaanduiding,
                                          **{field: url})
                to_add.append(autorisatie)

        Autorisatie.objects.filter(
            pk__in=[autorisatie.pk for autorisatie in to_delete])

        # de-duplicate - whatever is in to_keep should not be added again
        existing_urls = defaultdict(list)
        for autorisatie in to_keep:
            if autorisatie.component not in COMPONENT_TO_FIELD:
                continue
            url = getattr(autorisatie,
                          COMPONENT_TO_FIELD[autorisatie.component])
            existing_urls[autorisatie.component].append(url)

        _to_add = []
        for autorisatie in to_add:
            if autorisatie.component not in COMPONENT_TO_FIELD:
                continue
            url = getattr(autorisatie,
                          COMPONENT_TO_FIELD[autorisatie.component])
            if url in existing_urls[autorisatie.component]:
                continue
            _to_add.append(autorisatie)

        # created the de-duplicated, missing autorisaties
        Autorisatie.objects.bulk_create(_to_add)

        # determine which notifications to send
        changed = {
            autorisatie.applicatie
            for autorisatie in (to_delete + _to_add)
        }
        for applicatie in changed:
            send_applicatie_changed_notification(applicatie)