diff --git a/lib/extensions.py b/lib/extensions.py index 8ceb452..278f191 100644 --- a/lib/extensions.py +++ b/lib/extensions.py @@ -32,13 +32,13 @@ def copy(): settings.in_queue.put(extension) # Searching installed extensions -# Check on version if we get 200 or 403. +# Check version if getting 200 or 403. def check_extension(): while True: extension = settings.in_queue.get() for path in settings.EXTENSION_PATHS: try: - req = urllib2.Request('http://' + settings.DOMAIN + path + extension + '/', None, settings.user_agent) + req = urllib2.Request(settings.DOMAIN + path + extension + '/', None, settings.user_agent) connection = urllib2.urlopen(req, timeout = settings.TIMEOUT) connection.close() check_extension_version(path, extension) @@ -52,7 +52,7 @@ def check_extension(): except urllib2.URLError, e: pass #retry = raw_input('Error on checking ' + extension + ': ' + str(e.reason) + '\nRetrying? (y/n) ') - #if retry: + #if retry is 'y': # settings.in_queue.put(extension) # if extension is not in any given path, it's not installed if settings.verbose: @@ -69,7 +69,7 @@ def check_extension_version(path, extension): settings.out_queue.put(extension.ljust(32) + Fore.GREEN + 'installed' + Fore.RESET) else: try: - request = urllib2.Request('http://' + settings.DOMAIN + path + extension +'/ChangeLog', None, settings.user_agent) + request = urllib2.Request(settings.DOMAIN + path + extension +'/ChangeLog', None, settings.user_agent) response = urllib2.urlopen(request, timeout = settings.TIMEOUT) changelog = response.read(1500) response.close() diff --git a/lib/login.py b/lib/login.py index 60248f4..00e5b6b 100644 --- a/lib/login.py +++ b/lib/login.py @@ -12,26 +12,24 @@ from colorama import Fore from lib import settings # Searching Typo3 login page -def search_login(domain): +def search_login(): try: - r = requests.get('http://' + domain + '/typo3/index.php', allow_redirects=False, timeout=settings.TIMEOUT, headers=settings.user_agent) + 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'] - if ("http://") in location: - locsplit = location.split("//") - new_location = locsplit[1].split("/") - search_login(new_location[0]) - elif ("https://") in location: - r = requests.get(location, timeout=settings.TIMEOUT, headers=settings.user_agent, verify=False) - statusCode = r.status_code - httpResponse = r.text + redirect = raw_input('Got redirect to: ' + str(location) + '\nFollow? (y/n) ') + if redirect is 'y': + locsplit = location.split('/') + settings.DOMAIN = locsplit[0] + '//' + locsplit[2] + return "redirect" + else: return check_title(httpResponse, r.url) elif statusCode == 404: - return check_main_page() + return False else: print "Oops! Got unhandled code:".ljust(32) + str(statusCode) + ": " + str(r.raise_for_status()) except requests.exceptions.Timeout: @@ -52,11 +50,11 @@ def check_title(response, url): return True except: pass - return check_main_page() + return False # Searching for Typo3 references in HTML comments def check_main_page(): - req = urllib2.Request('http://' + settings.DOMAIN, None, settings.user_agent) + 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) @@ -66,6 +64,9 @@ def check_main_page(): cookie = connection.info().getheader('Set-Cookie') if 'fe_typo_user' in cookie: return bad_url() + except KeyboardInterrupt: + print Fore.RED + "\nReceived keyboard interrupt.\nQuitting..." + Fore.RESET + exit(-1) except: try: regex = re.compile("TYPO3(.*)", re.IGNORECASE) @@ -85,16 +86,15 @@ def check_main_page(): if "404" in str(e): print Fore.RED + str(e) + "\nPlease ensure you entered the right url" + Fore.RESET else: - print Fore.RED + "Got \"" + str(e) + "\" on testing main page." + Fore.RESET - return False - print "Typo3 Login:".ljust(32) + Fore.RED + "Typo3 is not used on this domain" + Fore.RESET + print Fore.RED + str(e) + Fore.RESET + return "skip" return False def bad_url(): print "Typo3 Login:".ljust(32) + Fore.GREEN + "Typo3 is used, but could not find login" + Fore.RESET - print "".ljust(32) + "This will mostly result in \"no extensions are installed\"." + print "".ljust(32) + "This could result in \"no extensions are installed\"." print "".ljust(32) + "Seems like something is wrong with the given url." var = raw_input("".ljust(32) + "Try anyway (y/n)? ") if var is 'y': return True - return False \ No newline at end of file + return "skip" \ No newline at end of file diff --git a/lib/settings.py b/lib/settings.py index 70060ca..1655dd9 100644 --- a/lib/settings.py +++ b/lib/settings.py @@ -44,7 +44,6 @@ verbose = False #Input and output queues in_queue = "" -in_queue2 = "" out_queue = "" # Seconds to wait before timeout connection. @@ -68,7 +67,7 @@ EXTENSION_PATHS = ('/typo3conf/ext/', '/typo3/sysext/') # Possible version info file EXTENSION_VERSION_INFO = ('ChangeLog', 'README.txt') -EXTENSIONS_FOUND = {} +EXTENSIONS_FOUND = 0 diff --git a/lib/start.py b/lib/start.py index 12e1f4b..368d6c0 100644 --- a/lib/start.py +++ b/lib/start.py @@ -16,49 +16,61 @@ from lib import output from lib import extensions # Startmethod -def start(domain): - settings.in_queue = Queue() - settings.out_queue = Queue() +def check_typo_installation(domain): settings.DOMAIN = domain print '\n\n' + Fore.CYAN + '[ Checking ' + domain + ' ]' + '\n' + "-"* 70 + Fore.RESET - if login.search_login(domain) is True: - versioninfo.search_version_info() - versioninfo.output() + check = login.search_login() + if check is "redirect": + check_typo_installation(settings.DOMAIN) - if not settings.EXTENSION_LIST: - extensions.generate_list() + elif check is True: + init_extension_search() + else: + mainpage = login.check_main_page() + if mainpage is True: + init_extension_search() + elif mainpage is not "skip": + print "Typo3 Login:".ljust(32) + Fore.RED + "Typo3 is not used on this domain" + Fore.RESET - extensions.copy() - extensions_to_check = settings.in_queue.qsize() +def init_extension_search(): + settings.in_queue = Queue() + settings.out_queue = Queue() + versioninfo.search_version_info() + versioninfo.output() - if extensions_to_check is not 0: - print '\nChecking', extensions_to_check, 'extension(s)...' - # Thanks to 'RedSparrow': http://stackoverflow.com/questions/17991033/python-cant-kill-main-thread-with-keyboardinterrupt - try: - while True: - if settings.in_queue.empty() == False: - time.sleep(0.1) - for i in xrange(0, settings.THREADS): - t = Thread(target=extensions.check_extension, args=()) - t.daemon = True - t.start() - else: - break - settings.in_queue.join() - except KeyboardInterrupt: - print Fore.RED + "\nReceived keyboard interrupt.\nQuitting..." + Fore.RESET - exit(-1) + if not settings.EXTENSION_LIST: + extensions.generate_list() - installed_ext = settings.out_queue.qsize() - if installed_ext is 0: - print Fore.RED + "No extensions installed" + Fore.RESET - else: - t = Thread(target=output.thread, args=()) - t.daemon = True - t.start() - settings.out_queue.join() - print Fore.GREEN + '\n', str(installed_ext) + '/' + str(extensions_to_check),'extension(s) installed' + Fore.RESET + extensions.copy() + extensions_to_check = settings.in_queue.qsize() + if extensions_to_check is not 0: + print '\nChecking', extensions_to_check, 'extension(s)...' + # Thanks to 'RedSparrow': http://stackoverflow.com/questions/17991033/python-cant-kill-main-thread-with-keyboardinterrupt + try: + while True: + if settings.in_queue.empty() == False: + time.sleep(0.5) + for i in xrange(0, settings.THREADS): + t = Thread(target=extensions.check_extension, args=()) + t.daemon = True + t.start() + else: + break + except KeyboardInterrupt: + print Fore.RED + "\nReceived keyboard interrupt.\nQuitting..." + Fore.RESET + exit(-1) + settings.in_queue.join() + + installed_ext = settings.out_queue.qsize() + if installed_ext is 0: + print Fore.RED + "No extensions installed" + Fore.RESET else: - print '\nSkipping check for extensions...' \ No newline at end of file + t = Thread(target=output.thread, args=()) + t.daemon = True + t.start() + settings.out_queue.join() + print Fore.GREEN + '\n', str(settings.EXTENSIONS_FOUND) + '/' + str(extensions_to_check),'extension(s) installed' + Fore.RESET + else: + print '\nSkipping check for extensions...' diff --git a/lib/versioninfo.py b/lib/versioninfo.py index 8d16ab5..47a2c98 100644 --- a/lib/versioninfo.py +++ b/lib/versioninfo.py @@ -13,7 +13,7 @@ from lib import settings def search_version_info(): for path, regex in settings.TYPO3_VERSION_INFO.iteritems(): try: - request = urllib2.Request('http://' + settings.DOMAIN + path, None, settings.user_agent) + request = urllib2.Request(settings.DOMAIN + path, None, settings.user_agent) response = urllib2.urlopen(request, timeout = settings.TIMEOUT) news = response.read(700) response.close()