2323 blacklist_token ,
2424 create_access_token ,
2525 create_refresh_token ,
26+ generate_ed25519_key_pair ,
2627 hash_password ,
2728 verify_password ,
2829 verify_token ,
2930)
3031from syfthub .schemas .auth import (
31- AuthResponse ,
32+ Ed25519KeyPair ,
33+ KeyRegenerationResponse ,
3234 PasswordChange ,
3335 RefreshTokenRequest ,
36+ RegistrationResponse ,
3437 Token ,
3538 UserRegister ,
3639 UserRole ,
4447
4548
4649@router .post (
47- "/register" , response_model = AuthResponse , status_code = status .HTTP_201_CREATED
50+ "/register" ,
51+ response_model = RegistrationResponse ,
52+ status_code = status .HTTP_201_CREATED ,
4853)
49- async def register_user (user_data : UserRegister ) -> AuthResponse :
54+ async def register_user (user_data : UserRegister ) -> RegistrationResponse :
5055 """Register a new user."""
5156 global user_id_counter
5257
@@ -67,6 +72,9 @@ async def register_user(user_data: UserRegister) -> AuthResponse:
6772 # Create new user
6873 password_hash = hash_password (user_data .password )
6974
75+ # Generate Ed25519 key pair for the user
76+ key_pair = generate_ed25519_key_pair ()
77+
7078 user = User (
7179 id = user_id_counter ,
7280 username = user_data .username ,
@@ -75,9 +83,11 @@ async def register_user(user_data: UserRegister) -> AuthResponse:
7583 age = user_data .age ,
7684 role = UserRole .USER , # Default role for new users
7785 password_hash = password_hash ,
86+ public_key = key_pair .public_key ,
7887 is_active = True ,
7988 created_at = datetime .now (timezone .utc ),
8089 updated_at = datetime .now (timezone .utc ),
90+ key_created_at = datetime .now (timezone .utc ),
8191 )
8292
8393 # Store user in database
@@ -103,11 +113,18 @@ async def register_user(user_data: UserRegister) -> AuthResponse:
103113 "is_active" : user .is_active ,
104114 }
105115
106- return AuthResponse (
116+ # Create key pair response
117+ keys = Ed25519KeyPair (
118+ private_key = key_pair .private_key ,
119+ public_key = key_pair .public_key ,
120+ )
121+
122+ return RegistrationResponse (
107123 user = user_dict ,
108124 access_token = access_token ,
109125 refresh_token = refresh_token ,
110126 token_type = "bearer" ,
127+ keys = keys ,
111128 )
112129
113130
@@ -225,6 +242,31 @@ async def change_password(
225242 fake_users_db [current_user .id ] = current_user
226243
227244
245+ @router .post ("/regenerate-keys" , response_model = KeyRegenerationResponse )
246+ async def regenerate_user_keys (
247+ current_user : Annotated [User , Depends (get_current_active_user )],
248+ ) -> KeyRegenerationResponse :
249+ """Regenerate Ed25519 key pair for the current user."""
250+ # Generate new key pair
251+ key_pair = generate_ed25519_key_pair ()
252+
253+ # Update user's public key in database
254+ current_user .public_key = key_pair .public_key
255+ current_user .key_created_at = datetime .now (timezone .utc )
256+ current_user .updated_at = datetime .now (timezone .utc )
257+
258+ # Save to database
259+ fake_users_db [current_user .id ] = current_user
260+
261+ # Create key pair response
262+ keys = Ed25519KeyPair (
263+ private_key = key_pair .private_key ,
264+ public_key = key_pair .public_key ,
265+ )
266+
267+ return KeyRegenerationResponse (keys = keys )
268+
269+
228270def authenticate_user (username : str , password : str ) -> User | None :
229271 """Authenticate a user by username/email and password."""
230272 # Try to find user by username or email
0 commit comments