Skip to content

Commit e42d6a0

Browse files
committed
PullRequest: 46 fix: set a longer validity period for the authentication information of the method upload_pkg.
Merge branch fix_upload_pkd of git@code.alipay.com:oceanbase/OBShell-SDK-Python.git into master https://code.alipay.com/oceanbase/OBShell-SDK-Python/pull_requests/46?tab=comment Signed-off-by: 玉楼 <rongfeng.frf@alibaba-inc.com> * fix: set a longer validity period for the authentication information of
1 parent 3c460ba commit e42d6a0

File tree

2 files changed

+39
-25
lines changed

2 files changed

+39
-25
lines changed

obshell/auth/password.py

Lines changed: 21 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@
3434
class 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

7074
class 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

obshell/service/client_v1.py

Lines changed: 18 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -664,11 +664,19 @@ def upload_pkg(self, pkg_path: str) -> UpgradePkgInfo:
664664
Raises:
665665
OBShellHandleError: error message return by OBShell server.
666666
"""
667-
req = self.create_request("/api/v1/upgrade/package", "POST")
668667
data, headers = self._parse_pkg(pkg_path)
669-
req.data = data
670-
req.headers = headers
671-
return self._handle_ret_request(req, UpgradePkgInfo)
668+
auth = self._get_auth()
669+
try:
670+
if auth.type == AuthType.PASSWORD:
671+
copied_auth = copy.deepcopy(auth)
672+
copied_auth.lifetime = 600
673+
self._set_auth(copied_auth)
674+
req = self.create_request("/api/v1/upgrade/package", "POST")
675+
req.data = data
676+
req.headers = headers
677+
self._handle_ret_request(req, UpgradePkgInfo)
678+
finally:
679+
self._set_auth(auth)
672680

673681
def upgrade_agent_check(
674682
self, version: str, release: str, upgrade_dir=None) -> task.DagDetailDTO:
@@ -2309,21 +2317,21 @@ def get_tenant_restore_overview(self, tenant_name: str) -> ob.RestoreOverview:
23092317
return self._handle_ret_request(req, ob.RestoreOverview)
23102318

23112319
def get_restore_windows(
2312-
self,
2313-
data_backup_uri: str,
2320+
self,
2321+
data_backup_uri: str,
23142322
archive_log_uri: str = None,
2315-
):
2323+
):
23162324
"""Get windows during which the tenant can be restored.
2317-
2325+
23182326
Args:
23192327
data_backup_uri (str): Complete destination path for data backups.
23202328
archive_log_uri (str, optional): Destination path for log archives.
23212329
"""
2322-
2330+
23232331
data = {
23242332
'data_backup_uri': data_backup_uri,
23252333
}
23262334
if archive_log_uri is not None:
23272335
data['archive_log_uri'] = archive_log_uri
23282336
req = self.create_request("/api/v1/restore/windows", "GET", data)
2329-
return self._handle_ret_request(req, ob.RestoreWindows)
2337+
return self._handle_ret_request(req, ob.RestoreWindows)

0 commit comments

Comments
 (0)