@@ -378,3 +378,56 @@ def test_oauth_proxy2(db_session, client, test_app):
378
378
json = {"email" : "shahar" , "role" : "admin" },
379
379
)
380
380
assert response .status_code == 403
381
+
382
+
383
+ @pytest .mark .parametrize (
384
+ "test_app" , ["SINGLE_TENANT" , "MULTI_TENANT" , "NO_AUTH" ], indirect = True
385
+ )
386
+ def test_deleted_api_key_authentication (db_session , client , test_app ):
387
+ """Tests that deleted API keys cannot be used for authentication"""
388
+ import hashlib
389
+ from keep .api .core .dependencies import SINGLE_TENANT_UUID
390
+ from keep .api .models .db .tenant import TenantApiKey
391
+ from keep .api .core .db import get_api_key
392
+
393
+ auth_type = os .getenv ("AUTH_TYPE" )
394
+ valid_api_key = "test_deleted_key"
395
+
396
+ # Create API key in database directly
397
+ hash_api_key = hashlib .sha256 (valid_api_key .encode ()).hexdigest ()
398
+ api_key_entry = TenantApiKey (
399
+ tenant_id = SINGLE_TENANT_UUID ,
400
+ reference_id = "test_deleted" ,
401
+ key_hash = hash_api_key ,
402
+
403
+ role = "admin" ,
404
+ is_deleted = False
405
+ )
406
+ db_session .add (api_key_entry )
407
+ db_session .commit ()
408
+
409
+ # Test that non-deleted API key works
410
+ response = client .get ("/providers" , headers = {"x-api-key" : valid_api_key })
411
+ assert response .status_code == 200
412
+
413
+ # Test get_api_key function directly - should find non-deleted key
414
+ found_key = get_api_key (valid_api_key )
415
+ assert found_key is not None
416
+ assert found_key .is_deleted == False
417
+
418
+ # Mark API key as deleted
419
+ api_key_entry .is_deleted = True
420
+ db_session .commit ()
421
+
422
+ # Test that deleted API key is rejected
423
+ response = client .get ("/providers" , headers = {"x-api-key" : valid_api_key })
424
+ assert response .status_code == 401 if auth_type != "NO_AUTH" else 200
425
+
426
+ # Test get_api_key function directly - should NOT find deleted key by default
427
+ found_key = get_api_key (valid_api_key )
428
+ assert found_key is None
429
+
430
+ # Test get_api_key function with include_deleted=True - should find deleted key
431
+ found_key = get_api_key (valid_api_key , include_deleted = True )
432
+ assert found_key is not None
433
+ assert found_key .is_deleted == True
0 commit comments