1
|
|
|
#!/usr/bin/env python3 |
2
|
|
|
# -*- coding: utf-8 -*- |
3
|
|
|
|
4
|
|
|
# pylint: disable=C0111,C0326,C0103 |
5
|
|
|
|
6
|
|
|
"""Tools to interface with TCL's checksum API.""" |
7
|
|
|
|
8
|
|
|
import json |
9
|
|
|
|
10
|
|
|
from defusedxml import ElementTree |
11
|
|
|
|
12
|
|
|
from . import credentials |
13
|
|
|
|
14
|
|
|
|
15
|
|
|
class TclChecksumMixin: |
|
|
|
|
16
|
|
|
"""A mixin component for TCL's checksum API.""" |
17
|
|
|
|
18
|
|
|
@staticmethod |
19
|
|
|
def prep_checksum(encslave, address, uri): |
20
|
|
|
"""Prepare URL and parameters for checksum request.""" |
21
|
|
|
url = "http://" + encslave + "/checksum.php" |
22
|
|
|
params = credentials.get_creds2() |
23
|
|
|
payload = {address: uri} |
24
|
|
|
payload_json = json.dumps(payload) |
25
|
|
|
params[b"address"] = bytes(payload_json, "utf-8") |
26
|
|
|
return url, params |
27
|
|
|
|
28
|
|
|
def do_checksum(self, encslave, address, uri): |
29
|
|
|
"""Perform checksum request with given parameters.""" |
30
|
|
|
url, params = self.prep_checksum(encslave, address, uri) |
31
|
|
|
# print(repr(dict(params))) |
32
|
|
|
req = self.sess.post(url, data=params) |
33
|
|
|
if req.status_code == 200: |
34
|
|
|
req.encoding = "utf-8" # Force encoding as server doesn't give one |
35
|
|
|
self.write_dump(req.text) |
36
|
|
|
# <ENCRYPT_FOOTER>2abfa6f6507044fec995efede5d818e62a0b19b5</ENCRYPT_FOOTER> means ERROR (invalid ADDRESS!) |
37
|
|
|
if "<ENCRYPT_FOOTER>2abfa6f6507044fec995efede5d818e62a0b19b5</ENCRYPT_FOOTER>" in req.text: |
38
|
|
|
print("INVALID URI: {}".format(uri)) |
39
|
|
|
raise SystemExit |
40
|
|
|
return req.text |
41
|
|
|
else: |
42
|
|
|
print("CHECKSUM: " + repr(req)) |
43
|
|
|
print(repr(req.headers)) |
44
|
|
|
print(repr(req.text)) |
45
|
|
|
raise SystemExit |
46
|
|
|
|
47
|
|
|
@staticmethod |
48
|
|
|
def parse_checksum(xmlstr): |
49
|
|
|
"""Parse output of ``do_checksum``.""" |
50
|
|
|
root = ElementTree.fromstring(xmlstr) |
51
|
|
|
file = root.find("FILE_CHECKSUM_LIST").find("FILE") |
52
|
|
|
file_addr = file.find("ADDRESS").text |
53
|
|
|
sha1_enc_footer = file.find("ENCRYPT_FOOTER").text |
54
|
|
|
sha1_footer = file.find("FOOTER").text |
55
|
|
|
sha1_body = file.find("BODY").text |
56
|
|
|
return file_addr, sha1_body, sha1_enc_footer, sha1_footer |
57
|
|
|
|