#!/usr/bin/env python """ Copyright (c) 2014 Jan Rude """ import re import sys import requests import urllib2 from colorama import Fore from lib import settings if sys.platform.startswith('win32') or sys.platform.startswith('cygwin'): import msvcrt # Searching Typo3 login page def search_login(): try: r = requests.get(settings.DOMAIN + '/typo3/index.php', allow_redirects=False, timeout=settings.TIMEOUT, headers=settings.user_agent, verify=False) statusCode = r.status_code httpResponse = r.text if statusCode == 200: return check_title(httpResponse, r.url) elif (statusCode == 301) or (statusCode == 302): location = r.headers['location'] answer = '' if sys.platform.startswith('win32') or sys.platform.startswith('cygwin'): print 'Got redirect to: ' + str(location) + '\nFollow? (y/n) ' answer = msvcrt.getche() elif sys.platform.startswith('linux'): answer = raw_input('Got redirect to: ' + str(location) + '\nFollow? (y/n) ') if answer is 'y': locsplit = location.split('/') settings.DOMAIN = locsplit[0] + '//' + locsplit[2] return 'redirect' else: return check_title(httpResponse, r.url) elif statusCode == 404: return False else: print 'Oops! Got unhandled code:'.ljust(32) + str(statusCode) + ': ' + str(r.raise_for_status()) except requests.exceptions.Timeout: output('Connection timed out') except requests.exceptions.TooManyRedirects: output('Too many redirects') except requests.exceptions.RequestException as e: output(str(e)) # Searching for Typo3 references in title def check_title(response, url): try: regex = re.compile('(.*)', re.IGNORECASE) searchTitle = regex.search(response) title = searchTitle.groups()[0] if 'TYPO3' in title or 'TYPO3 SVN ID:' in response: print 'Typo3 Login:'.ljust(32) + Fore.GREEN + url + Fore.RESET return True except: pass return False # Searching for Typo3 references in HTML comments def check_main_page(): req = urllib2.Request(settings.DOMAIN, None, settings.user_agent) req.add_header('Accept', 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8') try: connection = urllib2.urlopen(req, timeout = settings.TIMEOUT) response = connection.read() connection.close() try: cookie = connection.info().getheader('Set-Cookie') if 'fe_typo_user' in cookie: return bad_url() except KeyboardInterrupt: output('\nReceived keyboard interrupt.\nQuitting...') exit(-1) except: try: regex = re.compile('TYPO3(.*)', re.IGNORECASE) searchHTML = regex.search(response) searchHTML.groups()[0] try: regex = re.compile('[Tt][Yy][Pp][Oo]3 (\d{1,2}\.\d{1,2}\.[0-9][0-9]?[' '\n])') searchVersion = regex.search(response) version = searchVersion.groups() settings.TYPO_VERSION = 'Typo3 ' + version[0].split()[0] except: pass return bad_url() except: pass except Exception, e: if '404' in str(e): output(str(e) + '\nPlease ensure you entered the right url') else: output(str(e)) return 'skip' return False def bad_url(): print 'Typo3 Login:'.ljust(32) + 'Typo3 is used, but could not find login' print ''.ljust(32) + 'This could result in \'no extensions are installed\'.' print ''.ljust(32) + 'Seems like something is wrong with the given url.' answer = '' if sys.platform.startswith('win32') or sys.platform.startswith('cygwin'): print ''.ljust(32) + 'Try anyway (y/n)? ' answer = msvcrt.getch() elif sys.platform.startswith('linux'): answer = raw_input(''.ljust(32) + 'Try anyway (y/n)? ') if answer is 'y': return True return 'skip' # printing error messages def output(message): if settings.COLORAMA: print Fore.RED print message if settings.COLORAMA: print Fore.RESET