summaryrefslogtreecommitdiffstats
path: root/utils/checkpackagelib/lib_hash.py
blob: c4d055ee2292a7f5710efe297dd01c26007e617d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
# See utils/checkpackagelib/readme.txt before editing this file.
# The validity of the hashes itself is checked when building, so below check
# functions don't need to check for things already checked by running
# "make package-dirclean package-source".

import re

from base import _CheckFunction
# Notice: ignore 'imported but unused' from pyflakes for check functions.
from lib import ConsecutiveEmptyLines
from lib import EmptyLastLine
from lib import NewlineAtEof
from lib import TrailingSpace


def _empty_line_or_comment(text):
    return text.strip() == "" or text.startswith("#")


class HashNumberOfFields(_CheckFunction):
    def check_line(self, lineno, text):
        if _empty_line_or_comment(text):
            return

        fields = text.split()
        if len(fields) != 3:
            return ["{}:{}: expected three fields ({}#adding-packages-hash)"
                    .format(self.filename, lineno, self.url_to_manual),
                    text]


class HashType(_CheckFunction):
    len_of_hash = {"md5": 32, "sha1": 40, "sha224": 56, "sha256": 64,
                   "sha384": 96, "sha512": 128}

    def check_line(self, lineno, text):
        if _empty_line_or_comment(text):
            return

        fields = text.split()
        if len(fields) < 2:
            return

        htype, hexa = fields[:2]
        if htype == "none":
            return
        if htype not in self.len_of_hash.keys():
            return ["{}:{}: unexpected type of hash ({}#adding-packages-hash)"
                    .format(self.filename, lineno, self.url_to_manual),
                    text]
        if not re.match("^[0-9A-Fa-f]{%s}$" % self.len_of_hash[htype], hexa):
            return ["{}:{}: hash size does not match type "
                    "({}#adding-packages-hash)"
                    .format(self.filename, lineno, self.url_to_manual),
                    text,
                    "expected {} hex digits".format(self.len_of_hash[htype])]
OpenPOWER on IntegriCloud