Total Complexity | 12 |
Total Lines | 103 |
Duplicated Lines | 0 % |
Changes | 0 |
1 | # -*- coding: utf-8 -*- |
||
|
|||
2 | |||
3 | import binascii |
||
4 | import hashlib |
||
5 | import random |
||
6 | import time |
||
7 | from math import floor |
||
8 | import zlib |
||
9 | from collections import OrderedDict |
||
10 | from defusedxml import ElementTree |
||
11 | |||
12 | ''' |
||
13 | private HashMap<String, String> buildDownloadUrisParams(UpdatePackageInfo updatePackageInfo) { |
||
1 ignored issue
–
show
|
|||
14 | FotaLog.m28v(TAG, "doAfterCheck"); |
||
15 | String salt = FotaUtil.salt(); |
||
16 | HashMap linkedHashMap = new LinkedHashMap(); |
||
17 | linkedHashMap.put("id", this.internalBuilder.getParam("id")); |
||
18 | linkedHashMap.put("salt", salt); |
||
19 | linkedHashMap.put("curef", updatePackageInfo.mCuref); |
||
20 | linkedHashMap.put("fv", updatePackageInfo.mFv); |
||
21 | linkedHashMap.put("tv", updatePackageInfo.mTv); |
||
22 | linkedHashMap.put("type", "Firmware"); |
||
23 | linkedHashMap.put("fw_id", updatePackageInfo.mFirmwareId); |
||
24 | linkedHashMap.put("mode", "2"); |
||
25 | linkedHashMap.put("vk", generateVk2((LinkedHashMap) linkedHashMap.clone())); |
||
1 ignored issue
–
show
|
|||
26 | linkedHashMap.put("cltp", "10"); |
||
27 | linkedHashMap.put("cktp", this.internalBuilder.getParam("cktp")); |
||
28 | linkedHashMap.put("rtd", this.internalBuilder.getParam("rtd")); |
||
29 | linkedHashMap.put("chnl", this.internalBuilder.getParam("chnl")); |
||
30 | return linkedHashMap; |
||
31 | } |
||
32 | ''' |
||
33 | |||
34 | class TclRequestMixin: |
||
35 | @staticmethod |
||
36 | def get_salt(): |
||
37 | millis = floor(time.time() * 1000) |
||
38 | tail = "{:06d}".format(random.randint(0, 999999)) |
||
39 | return "{}{}".format(str(millis), tail) |
||
40 | |||
41 | def get_vk2(self, params_dict, cltp): |
||
42 | params_dict["cltp"] = cltp |
||
43 | query = "" |
||
44 | for k, v in params_dict.items(): |
||
45 | if len(query) > 0: |
||
46 | query += "&" |
||
47 | query += k + "=" + str(v) |
||
48 | vdk = zlib.decompress(binascii.a2b_base64(self.VDKEY)) |
||
49 | query += vdk.decode("utf-8") |
||
50 | engine = hashlib.sha1() |
||
51 | engine.update(bytes(query, "utf-8")) |
||
52 | hexhash = engine.hexdigest() |
||
53 | return hexhash |
||
54 | |||
55 | def do_request(self, curef, fv, tv, fw_id): |
||
56 | url = "https://" + self.g2master + "/download_request.php" |
||
57 | params = OrderedDict() |
||
58 | params["id"] = self.serid |
||
59 | params["salt"] = self.get_salt() |
||
60 | params["curef"] = curef |
||
61 | params["fv"] = fv |
||
62 | params["tv"] = tv |
||
63 | params["type"] = self.ftype |
||
64 | params["fw_id"] = fw_id |
||
65 | params["mode"] = self.mode.value |
||
66 | params["vk"] = self.get_vk2(params, self.cltp.value) |
||
67 | params["cltp"] = self.cltp.value |
||
68 | params["cktp"] = self.cktp.value |
||
69 | params["rtd"] = self.rtd.value |
||
70 | if self.mode == self.MODE.FULL: |
||
71 | params["foot"] = 1 |
||
72 | params["chnl"] = self.chnl.value |
||
73 | |||
74 | #print(repr(dict(params))) |
||
75 | req = self.sess.post(url, data=params) |
||
76 | if req.status_code == 200: |
||
77 | req.encoding = "utf-8" # Force encoding as server doesn't give one |
||
1 ignored issue
–
show
|
|||
78 | self.write_dump(req.text) |
||
79 | return req.text |
||
80 | else: |
||
81 | print("REQUEST: " + repr(req)) |
||
82 | print(repr(req.headers)) |
||
83 | print(repr(req.text)) |
||
84 | raise SystemExit |
||
85 | |||
86 | @staticmethod |
||
87 | def parse_request(xmlstr): |
||
88 | root = ElementTree.fromstring(xmlstr) |
||
89 | file = root.find("FILE_LIST").find("FILE") |
||
90 | fileid = file.find("FILE_ID").text |
||
91 | fileurl = file.find("DOWNLOAD_URL").text |
||
92 | s3_fileurl_node = file.find("S3_DOWNLOAD_URL") |
||
93 | s3_fileurl = "" |
||
94 | if s3_fileurl_node: |
||
95 | s3_fileurl = s3_fileurl_node.text |
||
96 | slave_list = root.find("SLAVE_LIST").findall("SLAVE") |
||
97 | enc_list = root.find("SLAVE_LIST").findall("ENCRYPT_SLAVE") |
||
98 | s3_slave_list = root.find("SLAVE_LIST").findall("S3_SLAVE") |
||
99 | slaves = [s.text for s in slave_list] |
||
100 | encslaves = [s.text for s in enc_list] |
||
101 | s3_slaves = [s.text for s in s3_slave_list] |
||
102 | return fileid, fileurl, slaves, encslaves, s3_fileurl, s3_slaves |
||
103 |
The coding style of this project requires that you add a docstring to this code element. Below, you find an example for methods:
If you would like to know more about docstrings, we recommend to read PEP-257: Docstring Conventions.