import json from urllib.parse import urlparse from colorama import init, Fore, Style init() def help(): print('''Output explanation: {b}{g}[+]{reset} Good headers. Already used in your website. Good job! {b}{y}[+]{reset} Good headers. We recommend applying it {b}{r}[-]{reset} Bad headers. We recommend remove it\n'''.format(b=Style.BRIGHT, g=Fore.GREEN, y=Fore.YELLOW, r=Fore.RED, reset=Style.RESET_ALL)) def banner(b): print(Style.BRIGHT, end='') print(b) print('https://github.com/gildasio/h2t') print(Style.RESET_ALL) def print_bright(message, end='\n'): print(Style.BRIGHT + message + Style.RESET_ALL, end=end) def print_color(message, color): if color == 'red': color = Fore.RED print(color + message + Fore.RESET) def get_status(category, status): if category == 'good' and status: return 'applied' elif category == 'good' and not status: return 'touse' elif category == 'bad': return 'toremove' def print_line(message, level=1, category = None, title = None, status=False): sts = get_status(category, status) if sts == 'applied': color = Fore.GREEN pre = '[+] ' elif sts == 'touse': color = Fore.YELLOW pre = '[+] ' elif sts == 'toremove': color = Fore.RED pre = '[-] ' else: color = '' pre = '' if title: print(' '*4*level + Style.BRIGHT + title + ': ' + Style.RESET_ALL + message) else: print(' '*4*level + color + Style.BRIGHT + pre + Fore.RESET + message) def print_header(url, fields, output): if output == 'normal': print_bright(url) elif output == 'csv': csv_header(fields) elif output =='json': print('[\n\t{\'url\': '' + url + '',') print('\t\'headers\': [') def print_footer(output): if output == 'json': print('\t]}\n]') def csv_header(fields, delimiter=';'): print('url' + delimiter + 'status' + delimiter + 'title', end='') if isinstance(fields, list): for field in fields: print(delimiter + field, end='') print() def show(content, fields, category, status=False, output='normal', url=''): if output == 'normal': show_normal(content, fields, category, status) elif output == 'csv': show_csv(content, fields, category, status, url) elif output == 'json': show_json(content, fields, category, status) def show_json(content, fields, category, status): sts = get_status(category, status) result = { 'title': content['title'], 'status': sts } if isinstance(fields, list): if 'description' in fields: result['description'] = content['description'] if 'refs' in fields: result['refs'] = content['refs'] print('\t\t' + json.dumps(result) + ',') def show_csv(content, fields, category, status, url, delimiter=';'): sts = get_status(category, status) if sts == 'applied': status = 'applied' elif sts == 'touse': status = 'recommended to use' elif sts == 'toremove': status = 'recommended to remove' print(url, end=delimiter) print(status, end=delimiter) print(content['title'], end='') if isinstance(fields, list): if 'description' in fields: print(delimiter + content['description'], end='') if 'refs' in fields: print(delimiter, end='') for item in content['refs']: print(item + ' ', end='') print() def show_normal(content, fields, category, status): print_line(content['title'], category=category, status=status) if isinstance(fields, list): if 'description' in fields: print_line(content['description'], level=2, title='Description') if 'refs' in fields: print_line('', level=2, title='Refs') for item in content['refs']: print_line(Style.RESET_ALL + item, level=3) print(Style.RESET_ALL, end='') def results(result, catalog, category, fields=0, status=False, output='normal', url=''): for header in result: if header not in catalog: print_bright(header, end='') print_color(" isn't an option. See available option to -H using 'list -a'", 'red') exit() if isinstance(result, dict) and isinstance(result[header], list): for i in result[header]: show(catalog[header][i], fields, category, status=status, output=output, url=url) elif isinstance(catalog[header], list): for item in catalog[header]: show(item, fields, category, status=status, output=output) else: show(catalog[header], fields, category, status=status, output=output, url=url) def verbose(response, verbose): req = response.request if verbose >= 2: print_line(req.method + ' ' + req.path_url + ' HTTP/1.1') print_line('Host: ' + urlparse(response.url).netloc) for header in req.headers: print_line(req.headers[header], title=header) print() if verbose >= 1: print_line('HTTP/1.1 ' + str(response.status_code) + ' ' + response.reason) for header in response.headers: print_line(response.headers[header], title=header) print()