Skip to content

Commit 0615b56

Browse files
committed
make login optional on public metadata obbject query
1 parent 3f174cf commit 0615b56

File tree

2 files changed

+42
-17
lines changed

2 files changed

+42
-17
lines changed

lib/pbench/server/api/resources/metadata_api.py

Lines changed: 33 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,15 @@ def __init__(self, config, logger):
154154
def verify_metadata(self, metadata):
155155
current_user = Auth.token_auth.current_user()
156156
metadata_user_id = metadata.user_id
157+
if current_user is None:
158+
# The request is not from a logged-in user
159+
if metadata_user_id is None:
160+
return True
161+
self.logger.warning(
162+
"Metadata user verification: Public user is trying to access private metadata object for user {}",
163+
metadata_user_id,
164+
)
165+
return False
157166
if current_user.id != metadata_user_id and not current_user.is_admin():
158167
self.logger.warning(
159168
"Metadata user verification: Logged in user_id {} is different than the one provided in the URI {}",
@@ -163,15 +172,16 @@ def verify_metadata(self, metadata):
163172
return False
164173
return True
165174

166-
@Auth.token_auth.login_required()
175+
@Auth.token_auth.login_required(optional=True)
167176
def get(self, id=None):
168177
"""
169178
Get request for querying a metadata object of a user given a metadata id.
170-
This requires a Pbench auth token in the header field
179+
This requires a Pbench auth token in the header field if the metadata object is private to a user
180+
171181
172182
The url requires a metadata object id such as /user/metadata/<int:id>
173183
174-
Required headers include
184+
Optional headers include
175185
Authorization: Bearer <Pbench authentication token (user received upon login)>
176186
177187
:return: JSON Payload
@@ -191,14 +201,19 @@ def get(self, id=None):
191201

192202
try:
193203
# Fetch the metadata object
194-
metadata_object = Metadata.query(id=id)[0]
204+
metadata_objects = Metadata.query(id=id)
195205
except Exception:
196206
self.logger.exception(
197207
"Exception occurred in the GET request while querying the Metadata model, id: {}",
198208
id,
199209
)
200210
abort(500, message="INTERNAL ERROR")
201211

212+
if metadata_objects:
213+
metadata_object = metadata_objects[0]
214+
else:
215+
abort(404, message="Not found")
216+
202217
# Verify if the metadata object id in the url belongs to the logged in user
203218
if not self.verify_metadata(metadata_object):
204219
abort(403, message="Not authorized to perform the GET request")
@@ -210,7 +225,7 @@ def get(self, id=None):
210225
}
211226
return make_response(jsonify(response_object), 200)
212227

213-
@Auth.token_auth.login_required()
228+
@Auth.token_auth.login_required(optional=True)
214229
def put(self, id=None):
215230
"""
216231
Put request for updating a metadata object of a user given a metadata id.
@@ -248,14 +263,19 @@ def put(self, id=None):
248263
abort(400, message="Invalid json object in request")
249264

250265
try:
251-
metadata_object = Metadata.query(id=id)[0]
266+
metadata_objects = Metadata.query(id=id)
252267
except Exception:
253268
self.logger.exception(
254269
"Exception occurred in the PUT request while querying the Metadata model, id: {}",
255270
id,
256271
)
257272
abort(500, message="INTERNAL ERROR")
258273

274+
if metadata_objects:
275+
metadata_object = metadata_objects[0]
276+
else:
277+
abort(404, message="Not found")
278+
259279
# Verify if the metadata object id in the url belongs to the logged in user
260280
if not self.verify_metadata(metadata_object):
261281
abort(403, message="Not authorized to perform the PUT request")
@@ -293,7 +313,7 @@ def put(self, id=None):
293313
}
294314
return make_response(jsonify(response_object), 200)
295315

296-
@Auth.token_auth.login_required()
316+
@Auth.token_auth.login_required(optional=True)
297317
def delete(self, id=None):
298318
"""
299319
Delete request for deleting a metadata object of a user given a metadata id.
@@ -315,14 +335,19 @@ def delete(self, id=None):
315335

316336
try:
317337
# Fetch the metadata object
318-
metadata_object = Metadata.query(id=id)[0]
338+
metadata_objects = Metadata.query(id=id)
319339
except Exception:
320340
self.logger.exception(
321341
"Exception occurred in the Delete request while querying the Metadata model, id: {}",
322342
id,
323343
)
324344
abort(500, message="INTERNAL ERROR")
325345

346+
if metadata_objects:
347+
metadata_object = metadata_objects[0]
348+
else:
349+
abort(404, message="Not found")
350+
326351
# Verify if the metadata object id in the url belongs to the logged in user
327352
if not self.verify_metadata(metadata_object):
328353
abort(403, message="Not authorized to perform the DELETE request")

lib/pbench/test/unit/server/test_metadata_sessions.py renamed to lib/pbench/test/unit/server/test_metadata_objects.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ def user_register_login(client, server_config):
2222
return data_login
2323

2424

25-
class TestMetadataSession:
25+
class TestMetadataObjects:
2626
@staticmethod
2727
def test_metadata_creation_with_authorization(client, server_config):
2828
data_login = user_register_login(client, server_config)
@@ -65,7 +65,7 @@ def test_metadata_creation_with_authorization(client, server_config):
6565
== '{"config": "config1", "description": "description1"}'
6666
)
6767

68-
# Get all the saved sessions of logged in user
68+
# Get all the saved metadata objects of logged in user
6969
response = client.get(
7070
f"{server_config.rest_uri}/metadata/saved",
7171
headers=dict(Authorization="Bearer " + data_login["auth_token"]),
@@ -77,7 +77,7 @@ def test_metadata_creation_with_authorization(client, server_config):
7777
@staticmethod
7878
def test_unauthorized_metadata_creation(client, server_config):
7979
with client:
80-
# Create a saved session
80+
# Create a saved object
8181
response = client.post(
8282
f"{server_config.rest_uri}/metadata",
8383
json={
@@ -89,7 +89,7 @@ def test_unauthorized_metadata_creation(client, server_config):
8989
assert data
9090
assert response.status_code == 201
9191

92-
# Create a favorite session
92+
# Create a favorite metadata object
9393
response = client.post(
9494
f"{server_config.rest_uri}/metadata",
9595
json={
@@ -101,7 +101,7 @@ def test_unauthorized_metadata_creation(client, server_config):
101101
data = response.json
102102
assert data["data"]["key"] == "favorite"
103103

104-
# Get all the favorite sessions of non-logged in user
104+
# Get all the favorite metadata objects of non-logged in user
105105
response = client.get(f"{server_config.rest_uri}/metadata/favorite")
106106
assert response.status_code == 200
107107
data = response.json
@@ -110,7 +110,7 @@ def test_unauthorized_metadata_creation(client, server_config):
110110
== '{"config": "config2", "description": "description2"}'
111111
)
112112

113-
# Get all the saved sessions of non-logged in user
113+
# Get all the saved metadata objects of non-logged in user
114114
response = client.get(f"{server_config.rest_uri}/metadata/saved",)
115115
assert response.status_code == 200
116116
data = response.json
@@ -158,7 +158,7 @@ def test_unauthorized_metadata_query1(client, server_config):
158158

159159
metadata_id = data["data"]["id"]
160160
response = client.get(f"{server_config.rest_uri}/metadata/{metadata_id}",)
161-
assert response.status_code == 401
161+
assert response.status_code == 403
162162

163163
@staticmethod
164164
def test_unauthorized_metadata_query2(client, server_config):
@@ -193,7 +193,7 @@ def test_unauthorized_metadata_query2(client, server_config):
193193
data_login_2 = response.json
194194
assert data_login_2["auth_token"]
195195

196-
# Create metadata session for 2nd user
196+
# Create metadata objects for 2nd user
197197
response = client.post(
198198
f"{server_config.rest_uri}/metadata",
199199
json={
@@ -205,7 +205,7 @@ def test_unauthorized_metadata_query2(client, server_config):
205205
data_2 = response.json
206206
assert data_2["data"]["id"]
207207

208-
# Query the metadata session id of the 1st user with an auth token of 2nd user
208+
# Query the metadata object id of the 1st user with an auth token of 2nd user
209209
metadata_id = data_1["data"]["id"]
210210
response = client.get(
211211
f"{server_config.rest_uri}/metadata/{metadata_id}",

0 commit comments

Comments
 (0)