@@ -44,11 +44,24 @@ class BannerHandler(ContentHandler):
4444 def __init__ (self , banner ):
4545 self .__banner = sanitizeStr (banner )
4646
47- self .__regexp = None
48- self .__match = None
49- self .__position = None
47+ self .__regexp = None
48+ self .__match = None
49+ self .__version = None
5050
51- self .info = {}
51+
52+ def __feedInfo (self , key , value ):
53+ value = sanitizeStr (value )
54+
55+ if value in ( None , "None" ):
56+ return
57+
58+ if key == "version" :
59+ kb .bannerFp [key ] = value
60+ else :
61+ if key not in kb .bannerFp .keys ():
62+ kb .bannerFp [key ] = set ()
63+
64+ kb .bannerFp [key ].add (value )
5265
5366
5467 def startElement (self , name , attrs ):
@@ -57,22 +70,23 @@ def startElement(self, name, attrs):
5770 self .__match = re .search (self .__regexp , self .__banner , re .I | re .M )
5871
5972 if name == "info" and self .__match :
60- self .__position = sanitizeStr (attrs .get ("version" ))
61- self .__sp = sanitizeStr (attrs .get ("sp" ))
73+ self .__feedInfo ("type" , attrs .get ("type" ))
74+ self .__feedInfo ("distrib" , attrs .get ("distrib" ))
75+ self .__feedInfo ("release" , attrs .get ("release" ))
76+ self .__feedInfo ("codename" , attrs .get ("codename" ))
6277
63- self .info ['type' ] = sanitizeStr (attrs .get ("type" ))
64- self .info ['distrib' ] = sanitizeStr (attrs .get ("distrib" ))
65- self .info ['release' ] = sanitizeStr (attrs .get ("release" ))
66- self .info ['codename' ] = sanitizeStr (attrs .get ("codename" ))
78+ self .__version = sanitizeStr (attrs .get ("version" ))
79+ self .__sp = sanitizeStr (attrs .get ("sp" ))
6780
68- if self .__position .isdigit ():
69- self .info [ ' version' ] = self .__match .group (int (self .__position ))
81+ if self .__version .isdigit ():
82+ self .__feedInfo ( " version" , self .__match .group (int (self .__version ) ))
7083
7184 if self .__sp .isdigit ():
72- self .info [ 'sp' ] = "Service Pack %s" % self .__match .group (int (self .__sp ))
85+ self .__feedInfo ( "sp" , "Service Pack %s" % self .__match .group (int (self .__sp ) ))
7386
74- self .__match = None
75- self .__position = None
87+ self .__regexp = None
88+ self .__match = None
89+ self .__version = None
7690
7791
7892class MSSQLBannerHandler (ContentHandler ):
@@ -90,7 +104,14 @@ def __init__(self, banner):
90104 self .__version = ""
91105 self .__servicePack = ""
92106
93- self .info = {}
107+
108+ def __feedInfo (self , key , value ):
109+ value = sanitizeStr (value )
110+
111+ if value in ( None , "None" ):
112+ return
113+
114+ kb .bannerFp [key ] = value
94115
95116
96117 def startElement (self , name , attrs ):
@@ -114,9 +135,9 @@ def characters(self, data):
114135 def endElement (self , name ):
115136 if name == "signature" :
116137 if re .search (" %s[\.\ ]+" % self .__version , self .__banner ):
117- self .info [ ' dbmsRelease' ] = self .__release
118- self .info [ ' dbmsVersion' ] = self .__version
119- self .info [ ' dbmsServicePack' ] = self .__servicePack
138+ self .__feedInfo ( " dbmsRelease" , self .__release )
139+ self .__feedInfo ( " dbmsVersion" , self .__version )
140+ self .__feedInfo ( " dbmsServicePack" , self .__servicePack )
120141
121142 self .__version = ""
122143 self .__servicePack = ""
@@ -137,9 +158,6 @@ def bannerParser(banner):
137158 DBMS banner based upon the data in XML file
138159 """
139160
140- banner = sanitizeStr (banner )
141- info = {}
142-
143161 if kb .dbms == "Microsoft SQL Server" :
144162 xmlfile = paths .MSSQL_XML
145163 elif kb .dbms == "MySQL" :
@@ -154,24 +172,9 @@ def bannerParser(banner):
154172 if kb .dbms == "Microsoft SQL Server" :
155173 handler = MSSQLBannerHandler (banner )
156174 parse (xmlfile , handler )
157- info = handler .info
158-
159175 handler = BannerHandler (banner )
160176 parse (paths .GENERIC_XML , handler )
161-
162- for title , value in handler .info .items ():
163- info [title ] = value
164177 else :
165178 handler = BannerHandler (banner )
166179 parse (xmlfile , handler )
167- info = handler .info
168-
169- if "type" not in info or info ["type" ] == "None" :
170- parse (paths .GENERIC_XML , handler )
171- info ["type" ] = handler .info ["type" ]
172-
173- if "distrib" not in info or info ["distrib" ] == "None" :
174- parse (paths .GENERIC_XML , handler )
175- info ["distrib" ] = handler .info ["distrib" ]
176-
177- return info
180+ parse (paths .GENERIC_XML , handler )
0 commit comments