1515import json
1616import logging
1717import os
18- from typing import Optional
18+ from typing import Optional , Union
1919
2020# Third-Party
2121from argon2 .low_level import hash_secret_raw , Type
@@ -45,7 +45,7 @@ class EncryptionService:
4545 False
4646 """
4747
48- def __init__ (self , encryption_secret : SecretStr , time_cost : Optional [int ] = None , memory_cost : Optional [int ] = None , parallelism : Optional [int ] = None , hash_len : int = 32 , salt_len : int = 16 ):
48+ def __init__ (self , encryption_secret : Union [ SecretStr , str ] , time_cost : Optional [int ] = None , memory_cost : Optional [int ] = None , parallelism : Optional [int ] = None , hash_len : int = 32 , salt_len : int = 16 ):
4949 """Initialize the encryption handler.
5050
5151 Args:
@@ -56,7 +56,12 @@ def __init__(self, encryption_secret: SecretStr, time_cost: Optional[int] = None
5656 hash_len: Length of the derived key
5757 salt_len: Length of the salt
5858 """
59- self .encryption_secret = encryption_secret .get_secret_value ().encode ()
59+ # Handle both SecretStr and plain string for backwards compatibility
60+ if isinstance (encryption_secret , SecretStr ):
61+ self .encryption_secret = encryption_secret .get_secret_value ().encode ()
62+ else :
63+ # If a plain string is passed, use it directly (for testing/legacy code)
64+ self .encryption_secret = str (encryption_secret ).encode ()
6065 self .time_cost = time_cost or getattr (settings , "argon2id_time_cost" , 3 )
6166 self .memory_cost = memory_cost or getattr (settings , "argon2id_memory_cost" , 65536 )
6267 self .parallelism = parallelism or getattr (settings , "argon2id_parallelism" , 1 )
@@ -156,11 +161,11 @@ def is_encrypted(self, text: str) -> bool:
156161 return False
157162
158163
159- def get_encryption_service (encryption_secret : SecretStr ) -> EncryptionService :
164+ def get_encryption_service (encryption_secret : Union [ SecretStr , str ] ) -> EncryptionService :
160165 """Get an EncryptionService instance.
161166
162167 Args:
163- encryption_secret: Secret key for encryption/decryption
168+ encryption_secret: Secret key for encryption/decryption (SecretStr or plain string)
164169
165170 Returns:
166171 EncryptionService instance
@@ -169,5 +174,8 @@ def get_encryption_service(encryption_secret: SecretStr) -> EncryptionService:
169174 >>> enc = get_encryption_service(SecretStr('k'))
170175 >>> isinstance(enc, EncryptionService)
171176 True
177+ >>> enc2 = get_encryption_service('plain-key')
178+ >>> isinstance(enc2, EncryptionService)
179+ True
172180 """
173181 return EncryptionService (encryption_secret )
0 commit comments