import re
import unittest
import wappalyzer
class FakeUrlopenResponse(object):
def __init__(self, url, html, headers):
self.url = url
self.html = html
self.headers = headers
def read(self):
return self.html
def info(self):
_cls = self
class _Info:
@property
def dict(self):
return _cls.headers
return _Info()
class WappalyzerCustomTestCase(unittest.TestCase):
def setUp(self):
self.wappalyzer = wappalyzer.Wappalyzer({'categories':[],'apps':[]})
def get_wappalyzer(self, categories, apps):
return wappalyzer.Wappalyzer({'categories': categories, 'apps': apps})
def test_parse_simple(self):
parsed = self.wappalyzer.parse_patterns('control/userimage\\.html')
self.assertEqual(1, len(parsed))
self.assertTrue(hasattr(parsed[0].regex, 'search'))
def test_parse_confidence_version(self):
parsed = self.wappalyzer.parse_patterns('control/userimage\\.html\\;version:1\\;confidence:80')
self.assertEqual(1, len(parsed))
self.assertEqual('1', getattr(parsed[0], 'version'))
self.assertEqual(80, getattr(parsed[0], 'confidence'))
def _construct_response(self, url=None, headers=None, html=None):
return FakeUrlopenResponse(
url=url or '',
headers=headers or {},
html=html or ''
)
def test_by_url(self):
wappalyzer = self.get_wappalyzer(
{},
{'test1': {'url': 'mysite\d.com'}, 'test2': {'url': 'hissite\d.com'},
'test3': {'url': ['my', 'his']}})
resp = self._construct_response(url='http://mysite2.com')
result = wappalyzer.analyze(response=resp)
self.assertIn('test1', result)
self.assertIn('test3', result)
def test_by_html_with_confidence(self):
wappalyzer = self.get_wappalyzer(
{},
{'test1': {'html': 'body\d\\;confidence:70'}, 'test2': {'html': 'body\w'}})
resp = self._construct_response(html='body123')
result = wappalyzer.analyze(response=resp)
self.assertIn('test1', result)
self.assertEqual(70, result['test1'].get_confidence())
def test_by_headers(self):
wappalyzer = self.get_wappalyzer({},
{
'test1': {
"headers": {"Server": "debut\\/?([\\d\\.]+)?\\;version:\\1"},
}
})
resp = self._construct_response(headers={"Server": 'debut'})
result = wappalyzer.analyze(response=resp)
self.assertIn('test1', result)
resp = self._construct_response(headers={"Server": 'debut/12'})
result = wappalyzer.analyze(response=resp)
self.assertIn('test1', result)
def test_by_meta(self):
wappalyzer = self.get_wappalyzer({},
{
'test1': {
"meta": {"generator": "uCore PHP Framework"},
},
'test2': {
"meta": {"generator2": "0"},
}
})
resp = self._construct_response(html="")
result = wappalyzer.analyze(response=resp)
self.assertIn('test1', result)
self.assertNotIn('test2', result)
resp = self._construct_response(html="")
result = wappalyzer.analyze(response=resp)
self.assertIn('test1', result)
self.assertNotIn('test2', result)
resp = self._construct_response(html="")
result = wappalyzer.analyze(response=resp)
self.assertIn('test1', result)
self.assertNotIn('test2', result)
def test_by_scripts(self):
wappalyzer = self.get_wappalyzer(
{},
{'jquery': {
"script": ["jquery(?:\\-|\\.)([\\d.]*\\d)[^/]*\\.js\\;version:\\1",
"/([\\d.]+)/jquery(\\.min)?\\.js\\;version:\\1", "jquery.*\\.js"],
}})
resp = self._construct_response(
html='')
result = wappalyzer.analyze(response=resp)
self.assertIn('jquery', result)
if __name__ == '__main__':
unittest.main()