Skip to content

Commit a1dd66f

Browse files
authored
Add optional parameter to reset API key functions (#923)
1 parent a35e2e2 commit a1dd66f

File tree

3 files changed

+30
-3
lines changed

3 files changed

+30
-3
lines changed

core/schemas/user.py

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import re
12
import secrets
23
from typing import ClassVar
34

@@ -28,8 +29,13 @@ class User(BaseModel, database_arango.ArangoYetiConnector):
2829
def load(cls, object: dict) -> "User":
2930
return cls(**object)
3031

31-
def reset_api_key(self) -> None:
32-
self.api_key = secrets.token_hex(32)
32+
def reset_api_key(self, api_key=None) -> None:
33+
if api_key:
34+
if not re.match(r"^[a-f0-9]{64}$", api_key):
35+
raise ValueError("Invalid API key: must match ^[a-f0-9]{64}$")
36+
self.api_key = api_key
37+
else:
38+
self.api_key = secrets.token_hex(32)
3339

3440

3541
class UserSensitive(User):

tests/schemas/user.py

+18
Original file line numberDiff line numberDiff line change
@@ -27,3 +27,21 @@ def test_set_user_password(self) -> None:
2727
self.assertEqual(user.username, "tomchop")
2828
self.assertTrue(user.verify_password("test"))
2929
self.assertFalse(user.verify_password("password"))
30+
31+
def test_reset_api_key(self) -> None:
32+
old_api_key = self.user1.api_key
33+
self.user1.reset_api_key()
34+
self.user1.save()
35+
36+
user = UserSensitive.find(username="tomchop")
37+
assert user is not None
38+
self.assertNotEqual(old_api_key, self.user1.api_key)
39+
self.assertRegex(user.api_key, r"[a-f0-9]{64}")
40+
41+
def test_reset_api_key_with_param(self) -> None:
42+
self.user1.reset_api_key(api_key="1234123412341234123412341234123412341234123412341234123412341234")
43+
self.user1.save()
44+
45+
user = UserSensitive.find(username="tomchop")
46+
assert user is not None
47+
self.assertEqual(self.user1.api_key, "1234123412341234123412341234123412341234123412341234123412341234")

yetictl/cli.py

+4-1
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,17 @@ def list_users():
2121
@click.argument("username")
2222
@click.argument("password")
2323
@click.option("--admin", is_flag=True, default=False)
24-
def create_user(username: str, password: str, admin: bool = False) -> None:
24+
@click.option("--api_key")
25+
def create_user(username: str, password: str, admin: bool = False, api_key: str | None = None) -> None:
2526
"""Creates a new user in the system."""
2627
user = UserSensitive.find(username=username)
2728
if user:
2829
raise RuntimeError(f"User with username {username} already exists")
2930
user = UserSensitive(username=username, admin=admin)
3031
user.set_password(password)
3132
user.save()
33+
if api_key:
34+
user.reset_api_key(api_key=api_key)
3235
click.echo(
3336
f"User {username} succesfully created! API key: {username}:{user.api_key}"
3437
)

0 commit comments

Comments
 (0)