Skip to content

Commit cbd1733

Browse files
committed
Prevent deleted users from authenticating
Prevent users who've been marked as deleted (but still exist in the DB, for now) from authenticating with auth clients, cookies, `HTTP_X_FORWARDED_USER` headers, or bearer tokens.
1 parent 56d468b commit cbd1733

File tree

9 files changed

+39
-6
lines changed

9 files changed

+39
-6
lines changed

h/security/policy/_basic_http_auth.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ def identity(self, request):
7676
return None
7777

7878
# If you forward a user it must exist and match your authority
79-
if not user or user.authority != auth_client.authority:
79+
if (not user) or user.deleted or (user.authority != auth_client.authority):
8080
return None
8181

8282
return Identity.from_models(auth_client=auth_client, user=user)

h/security/policy/_cookie.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ def identity(self, request):
1717
self._add_vary_by_cookie(request)
1818

1919
user = request.find_service(AuthCookieService).verify_cookie()
20-
if not user:
20+
if (not user) or user.deleted:
2121
return None
2222

2323
return Identity.from_models(user=user)

h/security/policy/_remote_user.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ def identity(self, request):
1616
return None
1717

1818
user = request.find_service(name="user").fetch(user_id)
19-
if user is None:
19+
if user is None or user.deleted:
2020
return None
2121

2222
return Identity.from_models(user=user)

h/security/policy/bearer_token.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -57,7 +57,7 @@ def _load_identity(self, request):
5757
return None
5858

5959
user = request.find_service(name="user").fetch(token.userid)
60-
if user is None:
60+
if user is None or user.deleted:
6161
return None
6262

6363
return Identity.from_models(user=user)

tests/common/fixtures/services.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -138,7 +138,9 @@ def annotation_metadata_service(mock_service):
138138

139139
@pytest.fixture
140140
def auth_cookie_service(mock_service):
141-
return mock_service(AuthCookieService)
141+
auth_cookie_service = mock_service(AuthCookieService)
142+
auth_cookie_service.verify_cookie.return_value.deleted = False
143+
return auth_cookie_service
142144

143145

144146
@pytest.fixture
@@ -279,7 +281,9 @@ def user_password_service(mock_service):
279281

280282
@pytest.fixture
281283
def user_service(mock_service):
282-
return mock_service(UserService, name="user")
284+
user_service = mock_service(UserService, name="user")
285+
user_service.fetch.return_value.deleted = False
286+
return user_service
283287

284288

285289
@pytest.fixture

tests/unit/h/security/policy/_basic_http_auth_test.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,13 @@ def test_identify_returns_None_if_forwarded_user_is_not_found(
101101

102102
assert AuthClientPolicy().identity(pyramid_request) is None
103103

104+
def test_identify_returns_None_if_forwarded_user_is_marked_as_deleted(
105+
self, user_service, pyramid_request
106+
):
107+
user_service.fetch.return_value.deleted = True
108+
109+
assert AuthClientPolicy().identity(pyramid_request) is None
110+
104111
def test_identify_returns_None_if_forwarded_userid_is_invalid(
105112
self, user_service, pyramid_request
106113
):

tests/unit/h/security/policy/_cookie_test.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,13 @@ def test_identity(self, pyramid_request, auth_cookie_service):
1717
user=auth_cookie_service.verify_cookie.return_value
1818
)
1919

20+
def test_identity_when_user_marked_as_deleted(
21+
self, pyramid_request, auth_cookie_service
22+
):
23+
auth_cookie_service.verify_cookie.return_value.deleted = True
24+
25+
assert CookiePolicy().identity(pyramid_request) is None
26+
2027
def test_identity_with_no_cookie(self, pyramid_request, auth_cookie_service):
2128
auth_cookie_service.verify_cookie.return_value = None
2229

tests/unit/h/security/policy/_remote_user_test.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,3 +26,11 @@ def test_identity_returns_None_for_no_user(self, pyramid_request, user_service):
2626
user_service.fetch.return_value = None
2727

2828
assert RemoteUserPolicy().identity(pyramid_request) is None
29+
30+
def test_identity_returns_None_for_user_marked_as_deleted(
31+
self, pyramid_request, user_service
32+
):
33+
pyramid_request.environ["HTTP_X_FORWARDED_USER"] = sentinel.forwarded_user
34+
user_service.fetch.return_value.deleted = True
35+
36+
assert RemoteUserPolicy().identity(pyramid_request) is None

tests/unit/h/security/policy/bearer_token_test.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,3 +57,10 @@ def test_identity_returns_None_for_invalid_users(
5757
user_service.fetch.return_value = None
5858

5959
assert BearerTokenPolicy().identity(pyramid_request) is None
60+
61+
def test_identity_returns_None_for_user_marked_as_deleted(
62+
self, pyramid_request, user_service
63+
):
64+
user_service.fetch.return_value.deleted = True
65+
66+
assert BearerTokenPolicy().identity(pyramid_request) is None

0 commit comments

Comments
 (0)