annotate farolluz/parsers/cpe.py @ 48:3826f2701ff2

CPE: Add the possibility to add ourself integrally to the product tree
author Benoît Allard <benoit.allard@greenbone.net>
date Tue, 30 Dec 2014 12:30:19 +0100
parents bb1dd2a55643
children
rev   line source
41
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
1 # -*- coding: utf-8 -*-
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
2 # Description:
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
3 # Methods for parsing CPEs
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
4 #
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
5 # Authors:
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
6 # BenoƮt Allard <benoit.allard@greenbone.net>
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
7 #
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
8 # Copyright:
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
9 # Copyright (C) 2014 Greenbone Networks GmbH
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
10 #
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
11 # This program is free software; you can redistribute it and/or
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
12 # modify it under the terms of the GNU General Public License
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
13 # as published by the Free Software Foundation; either version 2
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
14 # of the License, or (at your option) any later version.
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
15 #
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
16 # This program is distributed in the hope that it will be useful,
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
17 # but WITHOUT ANY WARRANTY; without even the implied warranty of
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
18 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
19 # GNU General Public License for more details.
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
20 #
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
21 # You should have received a copy of the GNU General Public License
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
22 # along with this program; if not, write to the Free Software
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
23 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
24
40
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
25 """\
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
26 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
27
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
28 This is based on:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
29
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
30 NIST Interagency Report 7695
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
31 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
32
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
33 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
34
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
35 """
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
36
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
37 import re
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
38
48
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
39 from ..producttree import CVRFFullProductName, CVRFRelationship
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
40
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
41 def capitalize(s):
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
42 """ A custom version of string.capwords that split on _, and join on ' '
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
43 """
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
44 s = s.replace('\\', '')
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
45 return ' '.join(c.capitalize() for c in s.split('_'))
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
46
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
47
40
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
48 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
49 "'": "%27", '(': "%28", ')': "%29", '*': "%2a", '+': "%2b", ',': "%2c",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
50 '/': "%2f", ':': "%3a", ';': "%3b", '<': "%3c", "=": "%3d", '>': "%3e",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
51 '?': "%3f", '@': "%40", '[': "%5b", '\\': "%5c","]": "%5d", '^': "%5e",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
52 '`': "%60", '{': "%7b", '|': "%7c", '}': "%7d", "~": "%7e"}
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
53
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
54 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
55
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
56 def pct_encode(c):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
57 """ Returns the right percent-encoding of c """
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
58 if c in "-.":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
59 return c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
60 return PCT_MAP[c]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
61 return {'!': "%21", '"': "%22", '#': "%23", '$': "%24", '%': "%25", '&': "%26",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
62 "'": "%27", '(': "%28", ')': "%29", '*': "%2a", '+': "%2b", ',': "%2c",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
63 "-": c, '.': c, '/': "%2f", ':': "%3a", ';': "%3b", '<': "%3c",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
64 "=": "%3d", '>': "%3e", '?': "%3f", '@': "%40", '[': "%5b", '\\': "%5c",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
65 "]": "%5d", '^': "%5e", '`': "%60", '{': "%7b", '|': "%7c", '}': "%7d",
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
66 "~": "%7e"}[c]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
67
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
68 def decode(s):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
69 if s == '':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
70 return ANY
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
71 if s == '-':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
72 return NA
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
73 s = s.lower()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
74 res = ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
75 idx = 0
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
76 embedded = False
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
77 while idx < len(s):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
78 c = s[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
79 if c in ".-~":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
80 res += "\\" + c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
81 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
82 elif c != '%':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
83 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
84 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
85 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
86 form = s[idx:idx+3]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
87 if form == "%01":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
88 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
89 ( 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
90 (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
91 res += '?'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
92 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
93 raise ValueError
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
94 elif form == "%02":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
95 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
96 res += '*'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
97 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
98 raise ValueError
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
99 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
100 res += '\\' + PCT_MAP_i[form]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
101 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
102 idx += 2
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
103 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
104 return CPEAttribute(res)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
105
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
106 def unbind_value_fs(s):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
107 if s == '*':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
108 return ANY
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
109 if s == '-':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
110 return NA
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
111 res = ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
112 idx = 0
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
113 embedded = False
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
114 while idx < len(s):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
115 c = s[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
116 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
117 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
118 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
119 elif c == "\\":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
120 res += s[idx:idx+2]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
121 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
122 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
123 elif c == "*":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
124 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
125 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
126 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
127 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
128 raise ValueError
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
129 elif c == "?":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
130 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
131 (not embedded and (s[idx - 1] == "?")) or
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
132 (embedded and (s[idx + 1] == "?"))):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
133 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
134 embedded = False
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
135 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
136 raise ValueError
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
137 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
138 res += "\\" + c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
139 embedded = True
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
140 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
141 return CPEAttribute(res)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
142
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
143 class CPEAttribute(object):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
144 """ 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
145
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
146 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
147 self.any = any
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
148 self.na = na
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
149 self.value = value
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 bind_for_URI(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
152 # print self.any, self.na, self.value
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
153 if self.any:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
154 return ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
155 if self.na:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
156 return '-'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
157 return self.transform_for_uri()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
158
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
159 def transform_for_uri(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
160 res = ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
161 idx = 0
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
162 while idx < len(self.value):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
163 c = self.value[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
164 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
165 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
166 elif c == '\\':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
167 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
168 c = self.value[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
169 res += pct_encode(c)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
170 elif c == '?':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
171 res += "%01"
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
172 elif c == '*':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
173 res += "%02"
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
174 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
175 return res
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
176
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
177 def bind_for_fs(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
178 if self.any:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
179 return "*"
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
180 if self.na:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
181 return "-"
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
182 return self.process_quoted_chars()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
183
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
184 def process_quoted_chars(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
185 res = ""
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
186 idx = 0
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
187 while idx < len(self.value):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
188 c = self.value[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
189 if c != '\\':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
190 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
191 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
192 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
193 c = self.value[idx]
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
194 if c in ".-_":
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
195 res += c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
196 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
197 res += '\\' + c
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
198 idx += 1
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
199 return res
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
200
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
201 ANY = CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
202 NA = CPEAttribute(na=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
203
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
204 class CPE(object):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
205
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
206 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
207 self.part = part or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
208 self.vendor = vendor or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
209 self.product = product or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
210 self.version = version or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
211 self.update = update or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
212 self.edition = edition or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
213 self.language = language or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
214 # Extended attributes:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
215 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
216 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
217 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
218 self.other = other or CPEAttribute(any=True)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
219
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
220 def bind_to_URI(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
221 uri = 'cpe:/'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
222 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
223 # Special handling for edition
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
224 ed = self.edition.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
225 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
226 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
227 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
228 oth = self.other.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
229 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
230 uri += ":" + ed
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
231 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
232 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
233 uri += ':' + self.language.bind_for_URI()
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
234 return uri.rstrip(':')
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
235
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
236 def unbind_URI(self, uri):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
237 for idx, comp in enumerate(uri.split(':')):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
238 if idx == 0:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
239 continue
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
240 elif idx == 1:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
241 self.part = decode(comp[1:])
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
242 elif idx == 2:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
243 self.vendor = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
244 elif idx == 3:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
245 self.product = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
246 elif idx == 4:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
247 self.version = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
248 elif idx == 5:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
249 self.update = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
250 elif idx == 6:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
251 if comp == "" or comp[0] != '~':
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
252 self.edition = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
253 else:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
254 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
255 self.edition = decode(ed)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
256 self.sw_edition = decode(sw_ed)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
257 self.target_sw = decode(t_sw)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
258 self.target_hw = decode(t_hw)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
259 self.other = decode(oth)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
260 elif idx == 7:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
261 self.language = decode(comp)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
262
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
263 def bind_to_fs(self):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
264 fs = 'cpe:2.3:'
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
265 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
266 return fs
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
267
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
268 def unbind_fs(self, fs):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
269 for idx, v in enumerate(fs.split(':')):
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
270 v = unbind_value_fs(v)
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
271 if idx == 2:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
272 self.part = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
273 elif idx == 3:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
274 self.vendor = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
275 elif idx == 4:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
276 self.product = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
277 elif idx == 5:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
278 self.version = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
279 elif idx == 6:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
280 self.update = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
281 elif idx == 7:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
282 self.edition = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
283 elif idx == 8:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
284 self.language = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
285 elif idx == 9:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
286 self.sw_edition = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
287 elif idx == 10:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
288 self.target_sw = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
289 elif idx == 11:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
290 self.target_hw = v
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
291 elif idx == 12:
1d9b2b06067e Add a CPE parser (and tests)
Benoît Allard <benoit.allard@greenbone.net>
parents:
diff changeset
292 self.other = v
41
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
293
48
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
294 def addToDoc(self, document, finalProduct=True):
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
295 """ Add the CPE value as full producttree in the document
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
296 If finalProduct is false, only the elements leading to the product
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
297 will be added.
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
298 """
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
299 ptree = document._producttree
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
300 if ptree is None:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
301 ptree = document.createProductTree()
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
302
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
303 def next_prodid():
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
304 """ A handy function to generate the next available productid """
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
305 prods = document._producttree._products
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
306 if len(prods) > 0:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
307 last_prodid = prods[-1]._productid
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
308 numlen = 0
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
309 while last_prodid[- (numlen + 1)] in "0123456789":
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
310 numlen += 1
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
311 if numlen != 0:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
312 return last_prodid[:-numlen] + str(int(last_prodid[-numlen:]) + 1)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
313 return document.getDocId() + '-P0'
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
314
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
315 # Create the main product tree
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
316 tree = []
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
317 for value, valtype in [(self.vendor, 'Vendor'),
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
318 (self.product, 'Product Name'),
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
319 (self.version, 'Product Version'),
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
320 (self.update, 'Patch Level'),
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
321 (self.language, 'Language'),
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
322 (self.target_hw, 'Architecture')]:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
323 if value.value is not None:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
324 tree.append((valtype, capitalize(value.value)))
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
325
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
326 # Import it
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
327 last_branch = ptree.importTree(tree)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
328 # Add a product there
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
329 if self.target_sw.value is None:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
330 if not finalProduct:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
331 return last_branch
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
332 product = CVRFFullProductName(next_prodid(), str(self), last_branch, self.bind_to_fs())
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
333 ptree.addProduct(product)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
334 return product
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
335 else:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
336 product = CVRFFullProductName(next_prodid(), str(self), last_branch)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
337 ptree.addProduct(product)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
338
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
339 # We do have a target software, we need to create a relationship !
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
340 os = CVRFFullProductName(next_prodid(), self.target_sw.value, ptree)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
341 ptree.addProduct(os)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
342
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
343 rel = CVRFRelationship(product._productid, 'Installed On', os._productid)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
344 ptree.addRelationship(rel)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
345 if not finalProduct:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
346 return rel
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
347
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
348 final_prod = CVRFFullProductName(next_prodid(), ptree.getNameOfRelationship(rel), rel, self.bind_to_fs())
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
349 ptree.addProduct(final_prod)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
350 return final_prod
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
351
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
352 def __str__(self):
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
353 res = []
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
354 if self.product.value:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
355 res.append(capitalize(self.product.value))
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
356 if self.version.value:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
357 res.append(capitalize(self.version.value))
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
358 if not res:
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
359 return capitalize(self.vendor.value)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
360 return ' '.join(res)
3826f2701ff2 CPE: Add the possibility to add ourself integrally to the product tree
Benoît Allard <benoit.allard@greenbone.net>
parents: 41
diff changeset
361
41
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
362 def parse(s):
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
363 cpe = CPE()
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
364 if s[:5] == 'cpe:/':
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
365 cpe.unbind_URI(s)
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
366 elif s[:8] == 'cpe:2.3:':
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
367 cpe.unbind_fs(s)
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
368 else:
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
369 raise ValueError(s)
bb1dd2a55643 CPE: Add a generic 'parse' method
Benoît Allard <benoit.allard@greenbone.net>
parents: 40
diff changeset
370 return cpe
This site is hosted by Intevation GmbH (Datenschutzerklärung und Impressum | Privacy Policy and Imprint)