Skip to content
Open
Show file tree
Hide file tree
Changes from 2 commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 20 additions & 3 deletions chord_metadata_service/chord/api_views.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
P_CREATE_DATASET,
P_EDIT_DATASET,
P_DELETE_DATASET,
P_VIEW_PROJECTS,
P_VIEW_DATASETS,
)
from bento_lib.auth.resources import RESOURCE_EVERYTHING, build_resource
from bento_lib.responses import errors
Expand All @@ -25,6 +27,7 @@
from chord_metadata_service.authz.middleware import authz_middleware as authz
from chord_metadata_service.authz.permissions import BentoAllowAnyReadOnly, BentoDeferToHandler
from chord_metadata_service.cleanup.run_all import run_all_cleanup
from chord_metadata_service.metadata.settings import KATSU_DATASETS_LIST_AUTHZ, KATSU_PROJECTS_LIST_AUTHZ
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use from django.conf import settings and access all Django settings thru that interface

from chord_metadata_service.resources.serializers import ResourceSerializer
from chord_metadata_service.restapi.api_renderers import PhenopacketsRenderer, JSONLDDatasetRenderer, RDFDatasetRenderer
from chord_metadata_service.restapi.pagination import LargeResultsSetPagination
Expand Down Expand Up @@ -117,6 +120,15 @@
authz.mark_authz_done(request)
return await sync_to_async(super().destroy)(request, *args, **kwargs)

@async_to_sync
async def list(self, request, *args, **kwargs):
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

there are a few more endpoints for viewing project/dataset metadata (a bunch of public endpoints + maybe some old CHORD endpoints too), I think. Also, how will this interface with Beacon?

if KATSU_PROJECTS_LIST_AUTHZ and not (
await authz.async_evaluate_one(request, RESOURCE_EVERYTHING, P_VIEW_PROJECTS)
):
return forbidden(request)

Check warning on line 128 in chord_metadata_service/chord/api_views.py

View check run for this annotation

Codecov / codecov/patch

chord_metadata_service/chord/api_views.py#L128

Added line #L128 was not covered by tests
authz.mark_authz_done(request)
return await sync_to_async(super().list)(request, *args, **kwargs)


class DatasetViewSet(CHORDPublicModelViewSet):
"""
Expand Down Expand Up @@ -164,10 +176,15 @@
authz.mark_authz_done(request)
return Response(ResourceSerializer(dataset.resources.all(), many=True).data)

def list(self, request, *args, **kwargs):
# For now, we don't have a view:dataset type permission - we can always view
@async_to_sync
async def list(self, request, *args, **kwargs):

if KATSU_DATASETS_LIST_AUTHZ and not (
await authz.async_evaluate_one(request, RESOURCE_EVERYTHING, P_VIEW_DATASETS, require_token=True)
):
return forbidden(request)

Check warning on line 185 in chord_metadata_service/chord/api_views.py

View check run for this annotation

Codecov / codecov/patch

chord_metadata_service/chord/api_views.py#L185

Added line #L185 was not covered by tests
authz.mark_authz_done(request)
return super().list(request, *args, **kwargs)
return await sync_to_async(super().list)(request, *args, **kwargs)

@async_to_sync
async def destroy(self, request, *args, **kwargs):
Expand Down
6 changes: 6 additions & 0 deletions chord_metadata_service/metadata/settings.py
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,12 @@
BENTO_AUTHZ_SERVICE_URL: str = (
os.environ.get("BENTO_AUTHZ_SERVICE_URL", "http://authz.local").strip().rstrip("/") if BENTO_AUTHZ_ENABLED else ""
)

# Users querying /projects must have P_VIEW_PROJECTS at the node level
KATSU_PROJECTS_LIST_AUTHZ: bool = os.environ.get("KATSU_PROJECTS_LIST_AUTHZ", "false").strip().lower() == "true"
# Users querying /datasets must have P_VIEW_DATASETS at the node level
KATSU_DATASETS_LIST_AUTHZ: bool = os.environ.get("KATSU_DATASETS_LIST_AUTHZ", "false").strip().lower() == "true"

if len(sys.argv) > 1 and sys.argv[1] == "test":
# Override BENTO_AUTHZ_SERVICE_URL for testing purposes inside container - this is a bit hacky
BENTO_AUTHZ_SERVICE_URL = "http://authz.local"
Expand Down
Loading