Skip to content

Commit ceb532e

Browse files
committed
Merge remote-tracking branch 'origin/master' into es
2 parents 1b9ad5e + e64dd8a commit ceb532e

3 files changed

Lines changed: 47 additions & 9 deletions

File tree

libnmap/objects/host.py

Lines changed: 26 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,16 @@ def __init__(self, starttime='', endtime='', address=None, status=None,
4040
self._ipv4_addr = None
4141
self._ipv6_addr = None
4242
self._mac_addr = None
43+
self._vendor = None
4344
for addr in address:
4445
if addr['addrtype'] == "ipv4":
4546
self._ipv4_addr = addr['addr']
4647
elif addr['addrtype'] == 'ipv6':
4748
self._ipv6_addr = addr['addr']
4849
elif addr['addrtype'] == 'mac':
4950
self._mac_addr = addr['addr']
51+
if 'vendor' in addr:
52+
self._vendor = addr['vendor']
5053

5154
self._main_address = self._ipv4_addr or self._ipv6_addr or ''
5255
self._address = address
@@ -147,8 +150,10 @@ def address(self, addrdict):
147150
self._ipv4_addr = addrdict['addr']
148151
elif addrdict['addrtype'] == 'ipv6':
149152
self._ipv6_addr = addrdict['addr']
150-
if addrdict['addrtype'] == 'mac':
153+
elif addrdict['addrtype'] == 'mac':
151154
self._mac_addr = addrdict['addr']
155+
if 'vendor' in addrdict:
156+
self._vendor = addrdict['vendor']
152157

153158
self._main_address = self._ipv4_addr or self._ipv6_addr or ''
154159
self._address = addrdict
@@ -171,6 +176,15 @@ def mac(self):
171176
"""
172177
return self._mac_addr or ''
173178

179+
@property
180+
def vendor(self):
181+
"""
182+
Accessor for the vendor attribute of the scanned host
183+
184+
:return: string (vendor) of empty string if no vendor defined
185+
"""
186+
return self._vendor or ''
187+
174188
@property
175189
def ipv6(self):
176190
"""
@@ -316,7 +330,7 @@ def os_fingerprint(self):
316330
"""
317331
rval = ''
318332
if self.os is not None:
319-
rval = self.os.fingerprints.join("\n")
333+
rval = "\n".join(self.os.fingerprints)
320334
return rval
321335

322336
def os_ports_used(self):
@@ -434,9 +448,13 @@ def extraports_state(self):
434448
dictionnary containing state and amount of extra ports scanned
435449
for which a common state, usually, closed was discovered.
436450
437-
:return: dict with keys 'state' and 'count'
451+
:return: dict with keys 'state' and 'count' or None
438452
"""
439-
_xtrports = self._extras['extraports']
453+
_xtrports = self._extras.get('extraports', None)
454+
455+
if _xtrports is None:
456+
return None
457+
440458
return {'state': _xtrports['state'], 'count': _xtrports['count']}
441459

442460
@property
@@ -445,9 +463,11 @@ def extraports_reasons(self):
445463
dictionnary containing reasons why extra ports scanned
446464
for which a common state, usually, closed was discovered.
447465
448-
:return: array of dict containing keys 'state' and 'count'
466+
:return: array of dict containing keys 'state' and 'count' or None
449467
"""
450-
return self._extras['extraports']['reasons']
468+
r = self._extras.get('extraports', {})
469+
470+
return r.get('reasons', None)
451471

452472
def get_dict(self):
453473
"""

libnmap/objects/service.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ def __init__(self, portid, protocol='tcp', state=None,
6464
if 'servicefp' in self._service:
6565
self._servicefp = self._service['servicefp']
6666
if 'tunnel' in self._service:
67-
self._servicefp = self._service['tunnel']
67+
self._tunnel = self._service['tunnel']
6868

6969
self._service_extras = []
7070
if service_extras is not None:
@@ -177,12 +177,21 @@ def reason_ttl(self):
177177
@property
178178
def service(self):
179179
"""
180-
Accessor for service dictionnary.
180+
Accessor for service name.
181181
182-
:return: dict or None
182+
:return: string or empty
183183
"""
184184
return self._service['name'] if 'name' in self._service else ''
185185

186+
@property
187+
def service_dict(self):
188+
"""
189+
Accessor for service dictionary.
190+
191+
:return: dict or None
192+
"""
193+
return self._service
194+
186195
def open(self):
187196
"""
188197
Tells if the port was open or not

libnmap/test/test_service.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,11 @@
160160
<owner name="edwige"/>
161161
</port>"""
162162

163+
port_tunnel = """
164+
<port protocol="tcp" portid="443">
165+
<state state="open" reason="syn-ack" reason_ttl="64"/>
166+
<service name="https" method="probed" tunnel="ssl" conf="10"/>
167+
</port>"""
163168

164169
class TestNmapService(unittest.TestCase):
165170
def setUp(self):
@@ -243,6 +248,10 @@ def test_owner(self):
243248
serviceowner = NmapParser.parse(port_owner)
244249
self.assertEqual(serviceowner.owner, "edwige")
245250

251+
def test_tunnel(self):
252+
servicetunnel = NmapParser.parse(port_tunnel)
253+
self.assertEqual(servicetunnel.tunnel, "ssl")
254+
246255

247256
if __name__ == '__main__':
248257
test_suite = ['test_port_state_changed', 'test_port_state_unchanged',

0 commit comments

Comments
 (0)