Skip to content

Commit 60313e8

Browse files
committed
Remove TOTP seed of a user
+ tests related to descope/etc#9344
1 parent 528411f commit 60313e8

File tree

4 files changed

+62
-1
lines changed

4 files changed

+62
-1
lines changed

.vscode/settings.json

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,10 @@
44
"flake8.importStrategy": "fromEnvironment",
55
"mypy-type-checker.importStrategy": "fromEnvironment",
66
"isort.importStrategy": "fromEnvironment",
7-
"black-formatter.importStrategy": "fromEnvironment"
7+
"black-formatter.importStrategy": "fromEnvironment",
8+
"workbench.colorCustomizations": {
9+
"activityBar.background": "#4D1C3B",
10+
"titleBar.activeBackground": "#6B2752",
11+
"titleBar.activeForeground": "#FDF8FB"
12+
}
813
}

descope/management/common.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@ class MgmtV1:
5050
user_set_active_password_path = "/v1/mgmt/user/password/set/active"
5151
user_expire_password_path = "/v1/mgmt/user/password/expire"
5252
user_remove_all_passkeys_path = "/v1/mgmt/user/passkeys/delete"
53+
user_remove_totp_seed_path = "/v1/mgmt/user/totp/delete"
5354
user_add_tenant_path = "/v1/mgmt/user/update/tenant/add"
5455
user_remove_tenant_path = "/v1/mgmt/user/update/tenant/remove"
5556
user_generate_otp_for_test_path = "/v1/mgmt/tests/generate/otp"

descope/management/user.py

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1472,6 +1472,28 @@ def remove_all_passkeys(
14721472
)
14731473
return
14741474

1475+
def remove_totp_seed(
1476+
self,
1477+
login_id: str,
1478+
) -> None:
1479+
"""
1480+
Removes TOTP seed for the user with the given login ID.
1481+
Note: The user might not be able to login anymore if they have no other authentication
1482+
methods or a verified email/phone.
1483+
1484+
Args:
1485+
login_id (str): The login ID of the user to remove totp seed for.
1486+
1487+
Raise:
1488+
AuthException: raised if the operation fails
1489+
"""
1490+
self._auth.do_post(
1491+
MgmtV1.user_remove_totp_seed_path,
1492+
{"loginId": login_id},
1493+
pswd=self._auth.management_key,
1494+
)
1495+
return
1496+
14751497
def generate_otp_for_test_user(
14761498
self,
14771499
method: DeliveryMethod,

tests/management/test_user.py

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2094,6 +2094,39 @@ def test_user_remove_all_passkeys(self):
20942094
timeout=DEFAULT_TIMEOUT_SECONDS,
20952095
)
20962096

2097+
def test_user_remove_totp_seed(self):
2098+
# Test failed flows
2099+
with patch("requests.post") as mock_post:
2100+
mock_post.return_value.ok = False
2101+
self.assertRaises(
2102+
AuthException,
2103+
self.client.mgmt.user.remove_totp_seed,
2104+
"login-id",
2105+
)
2106+
2107+
# Test success flow
2108+
with patch("requests.post") as mock_post:
2109+
network_resp = mock.Mock()
2110+
network_resp.ok = True
2111+
mock_post.return_value = network_resp
2112+
self.client.mgmt.user.remove_totp_seed(
2113+
"login-id",
2114+
)
2115+
mock_post.assert_called_with(
2116+
f"{common.DEFAULT_BASE_URL}{MgmtV1.user_remove_totp_seed_path}",
2117+
headers={
2118+
**common.default_headers,
2119+
"Authorization": f"Bearer {self.dummy_project_id}:{self.dummy_management_key}",
2120+
},
2121+
params=None,
2122+
json={
2123+
"loginId": "login-id",
2124+
},
2125+
allow_redirects=False,
2126+
verify=True,
2127+
timeout=DEFAULT_TIMEOUT_SECONDS,
2128+
)
2129+
20972130
def test_generate_magic_link_for_test_user(self):
20982131
# Test failed flows
20992132
with patch("requests.post") as mock_post:

0 commit comments

Comments
 (0)