1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115
|
""" urlscanner tests - PNG data retured """
import os
import sys
import random
import tempfile
sys.path.insert(0, os.path.abspath('.'))
sys.path.insert(0, os.path.abspath('..'))
import CloudFlare
cf = None
def test_cloudflare(debug=False):
""" test_cloudflare """
global cf
cf = CloudFlare.CloudFlare(debug=debug)
assert isinstance(cf, CloudFlare.CloudFlare)
account_name = None
account_id = None
def test_find_account(find_name=None):
""" test_find_account """
global account_name, account_id
# grab a random account identifier from the first 10 accounts
if find_name:
params = {'per_page':1, 'name':find_name}
else:
params = {'per_page':10}
try:
accounts = cf.accounts.get(params=params)
except CloudFlare.exceptions.CloudFlareAPIError as e:
print('%s: Error %d=%s' % (find_name, int(e), str(e)), file=sys.stderr)
assert False
assert len(accounts) > 0 and len(accounts) <= 10
# n = random.randrange(len(accounts))
# stop using a random account - use the primary account (i.e. the zero'th one)
n = 0
account_name = accounts[n]['name']
account_id = accounts[n]['id']
assert len(account_id) == 32
print('account: %s %s' % (account_id, account_name), file=sys.stderr)
scan_uuid = None
scan_url = None
def test_urlscanner():
""" test_urlscanner """
global scan_uuid, scan_url
scans = cf.accounts.urlscanner.scan.get(account_id, params={'limit':10})
assert isinstance(scans, dict)
assert 'tasks' in scans
assert isinstance(scans['tasks'], list)
tasks = scans['tasks']
for task in tasks:
assert isinstance(task, dict)
assert 'success' in task
assert 'time' in task
assert 'uuid' in task
assert 'url' in task
print('%s: %s %s %s' % (task['uuid'], task['success'], task['time'], task['url']), file=sys.stderr)
n = random.randrange(len(tasks))
scan_uuid = tasks[n]['uuid']
scan_url = tasks[n]['url']
def test_urlscanner_scan():
""" test_urlscanner_scan """
scan = cf.accounts.urlscanner.scan.get(account_id, scan_uuid)
assert isinstance(scan, dict)
assert 'scan' in scan
assert isinstance(scan['scan'], dict)
assert 'task' in scan['scan']
task = scan['scan']['task']
assert 'success' in task
assert 'time' in task
assert 'url' in task
assert 'uuid' in task
assert 'visibility' in task
print('%s: %s %s %s' % (task['uuid'], task['success'], task['time'], task['url']), file=sys.stderr)
# https://www.w3.org/TR/png/#5PNG-file-signature
# PNG signature 89 50 4E 47 0D 0A 1A 0A
def ispng(s):
""" ispng """
if b'\x89PNG\x0d\x0a\x1a\x0a' == s[0:8]:
return True
return False
# we don't write out the image - we have no interest in doing this
def write_png_file(s):
""" write_png_file """
hostname = scan_url.split('/')[2].replace('.', '_')
with tempfile.NamedTemporaryFile(mode='wb', prefix='screenshot-' + hostname + '-', suffix='.png', delete=False) as fp:
fp.write(s)
print('%s' % (fp.name), file=sys.stderr)
def test_urlscanner_scan_screenshot():
""" test_urlscanner_scan_screenshot """
# the real test - returning bytes as this is an image
png_content = cf.accounts.urlscanner.scan.screenshot.get(account_id, scan_uuid)
assert isinstance(png_content, bytes)
print('%s: %s png_content: len=%d sig="%s"' % (scan_uuid, scan_url, len(png_content), png_content[0:8]), file=sys.stderr)
assert ispng(png_content)
# write_png_file(png_content)
if __name__ == '__main__':
test_cloudflare(debug=True)
if len(sys.argv) > 1:
test_find_account(sys.argv[1])
else:
test_find_account()
test_urlscanner()
test_urlscanner_scan()
test_urlscanner_scan_screenshot()
|