From d25f162bf152d4e73a2c669119ec4e9baa0dc53a Mon Sep 17 00:00:00 2001
From: Christian Boettcher <c.boettcher@fz-juelich.de>
Date: Thu, 4 Nov 2021 10:22:01 +0100
Subject: [PATCH] finish the api side of secrets integration
---
 apiserver/main.py                           | 49 +++++++++++++++++++++
 apiserver/storage/JsonFileStorageAdapter.py |  6 +++
 apiserver/storage/LocationStorage.py        |  4 ++
 3 files changed, 59 insertions(+)
diff --git a/apiserver/main.py b/apiserver/main.py
index dc5cbfb..d916892 100644
--- a/apiserver/main.py
+++ b/apiserver/main.py
@@ -146,6 +146,55 @@ async def delete_specific_dataset(location_data_type: LocationDataType,
     log.debug("Authenticed User: '%s' deleted /%s/%s", user.username, location_data_type.value, dataset_id)
     return adapter.delete(location_data_type, str(dataset_id), user.username)
 
+@app.get("/{location_data_type}/{dataset_id}/secrets")
+async def list_dataset_secrets(location_data_type: LocationDataType,
+                                  dataset_id: UUID4,
+                                  user: str = Depends(my_user)):
+    """list the secrets of a specific dataset"""
+    # TODO log
+    if userdb.get(user).has_secrets_access:
+        return adapter.list_secrets(location_data_type, dataset_id, user)
+    else:
+        raise HTTPException(403)
+
+@app.get("/{location_data_type}/{dataset_id}/secrets/{key}")
+async def get_dataset_secret(location_data_type: LocationDataType,
+                                  dataset_id: UUID4,
+                                  key: str,
+                                  user: str = Depends(my_user)):
+    """get the secrets of a specific dataset"""
+    # TODO log
+    if userdb.get(user).has_secrets_access:
+        return adapter.get_secret(location_data_type, dataset_id, key, user)
+    else:
+        raise HTTPException(403)
+
+@app.put("/{location_data_type}/{dataset_id}/secrets/{key}")
+async def add_update_dataset_secret(location_data_type: LocationDataType,
+                                  dataset_id: UUID4,
+                                  key: str,
+                                  value: str,
+                                  user: str = Depends(my_user)):
+    """get the secrets of a specific dataset"""
+    # TODO log
+    if userdb.get(user).has_secrets_access:
+        return adapter.add_update_secret(location_data_type, dataset_id, key, value, user)
+    else:
+        raise HTTPException(403)
+
+@app.delete("/{location_data_type}/{dataset_id}/secrets/{key}")
+async def get_dataset_secrets(location_data_type: LocationDataType,
+                                  dataset_id: UUID4,
+                                  key: str,
+                                  user: str = Depends(my_user)):
+    """delete a secret of a specific dataset"""
+    # TODO log
+    if userdb.get(user).has_secrets_access:
+        return adapter.delete_secret(location_data_type, dataset_id, key, user)
+    else:
+        raise HTTPException(403)
+
+
 
 @app.exception_handler(FileNotFoundError)
 async def not_found_handler(request: Request, ex: FileNotFoundError):
diff --git a/apiserver/storage/JsonFileStorageAdapter.py b/apiserver/storage/JsonFileStorageAdapter.py
index 9e1cbf7..94e1ccd 100644
--- a/apiserver/storage/JsonFileStorageAdapter.py
+++ b/apiserver/storage/JsonFileStorageAdapter.py
@@ -134,6 +134,12 @@ class JsonFileStorageAdapter(AbstractLocationDataStorageAdapter):
         full_path = self.__get_object_path(value=n_type.value, oid=oid)
         log.debug("Deleted object %s by user '%s'.", oid, usr)
         os.remove(full_path)
+        
+    def list_secrets(self, n_type: LocationDataType, oid:str, usr: str):
+        """ list all available secrets for this object"""
+        secrets_path = self.__get_secrets_path(value=n_type.value, oid=oid)
+        secrets = self.__load_secrets(secrets_path)
+        return secrets.keys()
 
     def add_update_secret(self, n_type: LocationDataType, oid:str, key: str, value: str, usr: str):
         """ add new secrets to an existing object"""
diff --git a/apiserver/storage/LocationStorage.py b/apiserver/storage/LocationStorage.py
index 0aeb26d..2916979 100644
--- a/apiserver/storage/LocationStorage.py
+++ b/apiserver/storage/LocationStorage.py
@@ -61,6 +61,10 @@ class AbstractLocationDataStorageAdapter:
     def delete(self, n_type: LocationDataType, oid: str, usr: str):
         """ deletes given resource"""
         raise NotImplementedError()
+
+    def list_secrets(self, n_type: LocationDataType, oid:str, usr: str):
+        """ list all available secrets for this object"""
+        raise NotImplementedError()
     
     def add_update_secret(self, n_type: LocationDataType, oid:str, key: str, value: str, usr: str):
         """ add new secrets to an existing object"""
-- 
GitLab