3434class PasswordAuth (base .Auth ):
3535 """Password-based authentication method."""
3636
37- def __init__ (self , password : str = "" , version = None ) -> None :
37+ def __init__ (self , password : str = "" , version = None , lifetime = 60 ) -> None :
3838 """Initialize a new PasswordAuth instance.
3939
4040 Args:
@@ -49,10 +49,14 @@ def __init__(self, password: str = "", version=None) -> None:
4949
5050 - "v1": supported by OBShell version 4.2.2.0.
5151 - "v2": supported by OBShell version 4.2.3.0 or later.
52+ lifetime (int, optional):
53+ lifetime of the authentication information in reqeust header.
54+ Defalut to 60 second.
5255 """
5356 super ().__init__ (base .AuthType .PASSWORD ,
5457 [base .AuthVersion .V1 , base .AuthVersion .V2 ])
5558 self .password = password
59+ self .lifetime = lifetime
5660 if version is not None :
5761 if version not in _AUTHS_VERSION :
5862 raise ValueError ("Version not supported" )
@@ -63,15 +67,16 @@ def auth(self, request) -> None:
6367 version = self .get_version ()
6468 if version not in _AUTHS :
6569 raise base .AuthError (f"Unsupported auth version: { version } " )
66- self ._method = _AUTHS [version ](self .password )
70+ self ._method = _AUTHS [version ](self .password , self . lifetime )
6771 self ._method .auth (request )
6872
6973
7074class PasswordAuthMethod :
7175
72- def __init__ (self , password : str ) -> None :
76+ def __init__ (self , password : str , lifetime : int ) -> None :
7377 self .password = password
7478 self .pk = None
79+ self .lifetime = lifetime
7580 self .check_identity = False
7681
7782 def reset (self ) -> None :
@@ -99,7 +104,7 @@ def auth(self, req: requests.Request) -> None:
99104 self ._check (req .server )
100105 self ._init_pk (req .server )
101106 auth_json = json .dumps (
102- {'password' : self .password , 'ts' : int (time .time ()) + 5 })
107+ {'password' : self .password , 'ts' : int (time .time () + self . lifetime ) })
103108 key = RSA .import_key (base64 .b64decode (self .pk ))
104109 cipher = PKCS1_cipher .new (key )
105110 req .headers ['X-OCS-Auth' ] = base64 .b64encode (
@@ -132,22 +137,13 @@ def encrypt_header(self, headers: str) -> str:
132137 def auth (self , req : requests .Request ) -> None :
133138 self ._check (req .server )
134139 self ._init_pk (req .server )
140+
141+ # encrypt body before build header.
135142 aes_key = get_random_bytes (16 )
136143 aes_iv = get_random_bytes (16 )
137- uri = urlparse (req .url ).path if not urlparse (
138- req .url ).query else urlparse (req .url ).path + "?" + urlparse (req .url ).query
139- headers = {
140- 'auth' : self .password ,
141- 'ts' : str (int (time .time ()) + 5 ),
142- 'uri' : uri ,
143- 'keys' : base64 .b64encode (aes_key + aes_iv ).decode ('utf-8' )
144- }
145- req .headers ['X-OCS-Header' ] = self .encrypt_header (headers )
146-
147144 cipher = AES .new (aes_key , AES .MODE_CBC , aes_iv )
148145 if not req .original_data :
149146 req .original_data = req .data
150-
151147 if req .original_data :
152148 body = None
153149 if isinstance (req .original_data , dict ):
@@ -162,6 +158,16 @@ def auth(self, req: requests.Request) -> None:
162158 req .data = base64 .b64encode (
163159 cipher .encrypt (pad (bytes (body ), AES .block_size ))
164160 ).decode ('utf8' )
161+
162+ uri = urlparse (req .url ).path if not urlparse (
163+ req .url ).query else urlparse (req .url ).path + "?" + urlparse (req .url ).query
164+ headers = {
165+ 'auth' : self .password ,
166+ 'ts' : str (int (time .time ()) + self .lifetime ),
167+ 'uri' : uri ,
168+ 'keys' : base64 .b64encode (aes_key + aes_iv ).decode ('utf-8' )
169+ }
170+ req .headers ['X-OCS-Header' ] = self .encrypt_header (headers )
165171 return
166172
167173
0 commit comments