Passed
Push — master ( 0b7ae5...28ed23 )
by John
01:44
created

TclChecksumMixin.parse_checksum()   A

Complexity

Conditions 1

Size

Total Lines 10
Code Lines 9

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
cc 1
eloc 9
nop 1
dl 0
loc 10
rs 9.4285
c 0
b 0
f 0
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:
0 ignored issues
show
Unused Code introduced by
The variable __class__ seems to be unused.
Loading history...
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