annotate farolluz/parsers/cpe.py @ 40:1d9b2b06067e

Add a CPE parser (and tests)
author Benoît Allard <benoit.allard@greenbone.net>
date Mon, 29 Dec 2014 14:30:39 +0100
parents
children bb1dd2a55643
rev   line source
40
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
1 """\
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
2 a cpe class to ease the creation of a producttree based on cpe
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
3
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
4 This is based on:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
5
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
6 NIST Interagency Report 7695
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
7 Common Platform Enumeration: Naming Specification Version 2.3
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
8
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
9 CPE is a trademark of The MITRE Corporation.
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
10
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
11 """
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
12
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
13 import re
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
14
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
15 PCT_MAP ={'!': "%21", '"': "%22", '#': "%23", '$': "%24", '%': "%25", '&': "%26",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
16 "'": "%27", '(': "%28", ')': "%29", '*': "%2a", '+': "%2b", ',': "%2c",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
17 '/': "%2f", ':': "%3a", ';': "%3b", '<': "%3c", "=": "%3d", '>': "%3e",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
18 '?': "%3f", '@': "%40", '[': "%5b", '\\': "%5c","]": "%5d", '^': "%5e",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
19 '`': "%60", '{': "%7b", '|': "%7c", '}': "%7d", "~": "%7e"}
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
20
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
21 PCT_MAP_i = dict((v, k) for k, v in PCT_MAP.iteritems())
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
22
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
23 def pct_encode(c):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
24 """ Returns the right percent-encoding of c """
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
25 if c in "-.":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
26 return c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
27 return PCT_MAP[c]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
28 return {'!': "%21", '"': "%22", '#': "%23", '$': "%24", '%': "%25", '&': "%26",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
29 "'": "%27", '(': "%28", ')': "%29", '*': "%2a", '+': "%2b", ',': "%2c",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
30 "-": c, '.': c, '/': "%2f", ':': "%3a", ';': "%3b", '<': "%3c",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
31 "=": "%3d", '>': "%3e", '?': "%3f", '@': "%40", '[': "%5b", '\\': "%5c",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
32 "]": "%5d", '^': "%5e", '`': "%60", '{': "%7b", '|': "%7c", '}': "%7d",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
33 "~": "%7e"}[c]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
34
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
35 def decode(s):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
36 if s == '':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
37 return ANY
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
38 if s == '-':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
39 return NA
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
40 s = s.lower()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
41 res = ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
42 idx = 0
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
43 embedded = False
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
44 while idx < len(s):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
45 c = s[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
46 if c in ".-~":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
47 res += "\\" + c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
48 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
49 elif c != '%':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
50 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
51 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
52 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
53 form = s[idx:idx+3]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
54 if form == "%01":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
55 if (((idx == 0) or (idx == (len(s) - 3))) or
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
56 ( not embedded and (s[idx-4:idx-1] == "%01")) or
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
57 (embedded and (len(s) > idx + 6) and (s[idx+3:idx+6] == "%01"))):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
58 res += '?'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
59 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
60 raise ValueError
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
61 elif form == "%02":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
62 if (idx == 0) or (idx == len(s) - 3):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
63 res += '*'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
64 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
65 raise ValueError
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
66 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
67 res += '\\' + PCT_MAP_i[form]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
68 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
69 idx += 2
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
70 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
71 return CPEAttribute(res)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
72
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
73 def unbind_value_fs(s):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
74 if s == '*':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
75 return ANY
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
76 if s == '-':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
77 return NA
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
78 res = ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
79 idx = 0
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
80 embedded = False
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
81 while idx < len(s):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
82 c = s[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
83 if re.match("[a-zA-Z0-9_]", c) is not None:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
84 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
85 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
86 elif c == "\\":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
87 res += s[idx:idx+2]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
88 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
89 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
90 elif c == "*":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
91 if (idx == 0) or (idx == (len(s) - 1)):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
92 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
93 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
94 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
95 raise ValueError
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
96 elif c == "?":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
97 if (((idx == 0) or (idx == (len(s) - 1))) or
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
98 (not embedded and (s[idx - 1] == "?")) or
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
99 (embedded and (s[idx + 1] == "?"))):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
100 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
101 embedded = False
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
102 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
103 raise ValueError
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
104 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
105 res += "\\" + c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
106 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
107 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
108 return CPEAttribute(res)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
109
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
110 class CPEAttribute(object):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
111 """ We need a special class to deal with ANY / NA / "string" """
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
112
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
113 def __init__(self, value=None, any=False, na=False):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
114 self.any = any
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
115 self.na = na
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
116 self.value = value
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
117
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
118 def bind_for_URI(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
119 # print self.any, self.na, self.value
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
120 if self.any:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
121 return ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
122 if self.na:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
123 return '-'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
124 return self.transform_for_uri()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
125
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
126 def transform_for_uri(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
127 res = ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
128 idx = 0
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
129 while idx < len(self.value):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
130 c = self.value[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
131 if re.match("[a-zA-Z0-9_]", c) is not None:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
132 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
133 elif c == '\\':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
134 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
135 c = self.value[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
136 res += pct_encode(c)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
137 elif c == '?':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
138 res += "%01"
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
139 elif c == '*':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
140 res += "%02"
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
141 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
142 return res
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
143
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
144 def bind_for_fs(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
145 if self.any:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
146 return "*"
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
147 if self.na:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
148 return "-"
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
149 return self.process_quoted_chars()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
150
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
151 def process_quoted_chars(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
152 res = ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
153 idx = 0
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
154 while idx < len(self.value):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
155 c = self.value[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
156 if c != '\\':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
157 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
158 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
159 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
160 c = self.value[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
161 if c in ".-_":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
162 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
163 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
164 res += '\\' + c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
165 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
166 return res
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
167
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
168 ANY = CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
169 NA = CPEAttribute(na=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
170
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
171 class CPE(object):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
172
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
173 def __init__(self, part=None, vendor=None, product=None, version=None, update=None, edition=None, language=None, sw_edition=None, target_sw=None, target_hw=None, other=None):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
174 self.part = part or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
175 self.vendor = vendor or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
176 self.product = product or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
177 self.version = version or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
178 self.update = update or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
179 self.edition = edition or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
180 self.language = language or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
181 # Extended attributes:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
182 self.sw_edition = sw_edition or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
183 self.target_sw = target_sw or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
184 self.target_hw = target_hw or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
185 self.other = other or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
186
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
187 def bind_to_URI(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
188 uri = 'cpe:/'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
189 uri += ':'.join(a.bind_for_URI() for a in (self.part, self.vendor, self.product, self.version, self.update))
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
190 # Special handling for edition
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
191 ed = self.edition.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
192 sw_ed = self.sw_edition.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
193 t_sw = self.target_sw.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
194 t_hw = self.target_hw.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
195 oth = self.other.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
196 if sw_ed == "" and t_sw == "" and t_hw == "" and oth == "":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
197 uri += ":" + ed
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
198 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
199 uri += ":~" + '~'.join([ed, sw_ed, t_sw, t_hw, oth])
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
200 uri += ':' + self.language.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
201 return uri.rstrip(':')
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
202
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
203 def unbind_URI(self, uri):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
204 for idx, comp in enumerate(uri.split(':')):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
205 if idx == 0:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
206 continue
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
207 elif idx == 1:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
208 self.part = decode(comp[1:])
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
209 elif idx == 2:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
210 self.vendor = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
211 elif idx == 3:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
212 self.product = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
213 elif idx == 4:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
214 self.version = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
215 elif idx == 5:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
216 self.update = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
217 elif idx == 6:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
218 if comp == "" or comp[0] != '~':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
219 self.edition = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
220 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
221 ed, sw_ed, t_sw, t_hw, oth = comp[1:].split('~')
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
222 self.edition = decode(ed)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
223 self.sw_edition = decode(sw_ed)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
224 self.target_sw = decode(t_sw)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
225 self.target_hw = decode(t_hw)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
226 self.other = decode(oth)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
227 elif idx == 7:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
228 self.language = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
229
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
230 def bind_to_fs(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
231 fs = 'cpe:2.3:'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
232 fs += ':'.join(a.bind_for_fs() for a in (self.part, self.vendor, self.product, self.version, self.update, self.edition, self.language, self.sw_edition, self.target_sw, self.target_hw, self.other))
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
233 return fs
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
234
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
235 def unbind_fs(self, fs):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
236 for idx, v in enumerate(fs.split(':')):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
237 v = unbind_value_fs(v)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
238 if idx == 2:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
239 self.part = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
240 elif idx == 3:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
241 self.vendor = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
242 elif idx == 4:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
243 self.product = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
244 elif idx == 5:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
245 self.version = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
246 elif idx == 6:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
247 self.update = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
248 elif idx == 7:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
249 self.edition = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
250 elif idx == 8:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
251 self.language = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
252 elif idx == 9:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
253 self.sw_edition = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
254 elif idx == 10:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
255 self.target_sw = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
256 elif idx == 11:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
257 self.target_hw = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
258 elif idx == 12:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
259 self.other = v
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)