#!/usr/bin/python3
# -*- coding: utf-8 -*-
# This is a part of CMSeeK, check the LICENSE file for more information
# Copyright (c) 2018 - 2020 Tuhinshubhra

# Detect cms using robots.txt
# Rev 1
import re
import cmseekdb.basic as cmseek
def check(url, ua):
    robots = url + '/robots.txt'
    robots_source = cmseek.getsource(robots, ua)
    # print(robots_source[1])
    if robots_source[0] == '1' and robots_source[1] != '':
        # Check begins here
        robots_txt_content = robots_source[1]
        #### START DETECTION FROM HERE
        ## || <- if either of it matches cms detected
        ## :::: <- all the strings has to match (implemented to decrease false positives)
        robots_txt_detection_keys = [
        'If the Joomla site is installed::::Disallow: /administrator/:-joom',
        'Allow: /core/*.css$||Disallow: /index.php/user/login/||Disallow: /web.config:-dru',
        'Disallow: /wp-admin/||Allow: /wp-admin/admin-ajax.php:-wp',
        'Disallow: /kernel/::::Disallow: /language/::::Disallow: /templates_c/:-xoops',
        'Disallow: /textpattern:-tpc',
        'Disallow: /sitecore||Disallow: /sitecore_files||Disallow: /sitecore modules:-score',
        'Disallow: /phpcms||robots.txt for PHPCMS:-phpc',
        'Disallow: /*mt-content*||Disallow: /mt-includes/:-moto',
        'Disallow: /jcmsplugin/:-jcms',
        'Disallow: /ip_cms/||ip_backend_frames.php||ip_backend_worker.php:-impage',
        'Disallow: /flex/tmp/||flex/Logs/:-flex',
        'Disallow: /e107_admin/||e107_handlers||e107_files/cache:-e107',
        'Disallow: /plus/ad_js.php||Disallow: /plus/erraddsave.php||Disallow: /plus/posttocar.php||Disallow: /plus/disdls.php||Disallow: /plus/mytag_js.php||Disallow: /plus/stow.php:-dede',
        'modules/contentbox/themes/:-cbox',
        'Disallow: /contao/:-contao',
        'Disallow: /concrete:-con5',
        'Disallow: /auth/cas::::Disallow: /auth/cas/callback:-dscrs',
        'uc_client::::uc_server::::forum.php?mod=redirect*:-discuz',
        'Disallow: /AfterbuySrcProxy.aspx||Disallow: /afterbuy.asmx||Disallow: /afterbuySrc.asmx:-abuy',
        'Disallow: /craft/:-craft',    # Chances of it being a falsepositive are higher than the chances of me doing something good with my life ;__;
        'Disallow: /app/::::Disallow: /store_closed.html:-csc',
        'Disallow: /*?cartcmd=*:-dweb',
        'Disallow: /epages/Site.admin/||Disallow: /epages/*:-epgs',
        'Disallow: /Mediatheque/:-ezpub',
        'robots.txt automaticaly generated by PrestaShop:-presta',
        'demandware.store||demandware.static||demandware.net:-sfcc',
        'robots.txt for Umbraco||Disallow: /umbraco||Disallow: /umbraco_client:-umbraco',
        'we use Shopify:-shopify',
        'diskuse::::wysiwyg::::dotaz::::hodnoceni:-shoptet',
        'Disallow: /broker::::Disallow: /broker/orders:-smartstore',
        'gestion_e_commerce:-solusquare',
        'spree/products/:-spree',
        '/admin::::/_admin::::offset=0::::_print_version:-amiro',
        'Disallow: /ajax::::Disallow: /apps:-weebly',
        'Disallow: /_backup/::::Disallow: /_mygallery/::::Disallow: /_temp/::::Disallow: /_tempalbums/::::Disallow: /_tmpfileop/::::Disallow: /dbboon/:-godaddywb',
        'Disallow: /harming/humans::::Disallow: /ignoring/human/orders::::Disallow: /harm/to/self:-opennemas',
        'Zen Cart doesn\'t require any||Zen Cart installation||pzen_:-zencart',
        'Disallow: /*action=personalDataProcessing*:-ipo'
        ]
        for detection_key in robots_txt_detection_keys:
            if ':-' in detection_key:
                detection_array = detection_key.split(':-')
                if '||' in detection_array[0]:
                    detection_strings = detection_array[0].split('||')
                    for detection_string in detection_strings:
                        if detection_string in robots_txt_content and detection_array[1] not in cmseek.ignore_cms:
                            if cmseek.strict_cms == [] or detection_array[1] in cmseek.strict_cms:
                                return ['1', detection_array[1]]
                elif '::::' in detection_array[0]:
                    match_status = '0' # 0 = neutral, 1 = passed, 2 = failed
                    match_strings = detection_array[0].split('::::')
                    for match_string in match_strings:
                        if match_status == '0' or match_status == '1':
                            if match_string in robots_txt_content:
                                match_status = '1'
                            else:
                                match_status = '2'
                        else:
                            match_status = '2'
                    if match_status == '1' and detection_array[1] not in cmseek.ignore_cms:
                        if cmseek.strict_cms == [] or detection_array[1] in cmseek.strict_cms:
                            return ['1', detection_array[1]]
                else:
                    if detection_array[0] in robots_txt_content and detection_array[1] not in cmseek.ignore_cms:
                        if cmseek.strict_cms == [] or detection_array[1] in cmseek.strict_cms:
                            return ['1', detection_array[1]]

        t3_regex = re.search(r'Sitemap: http(.*?)\?type=', robots_txt_content)
        if t3_regex != None and 'tp3' not in cmseek.ignore_cms:
            if cmseek.strict_cms == [] or 'tp3' in cmseek.strict_cms:
                return ['1', 'tp3']

        return ['0','']
    else:
        cmseek.error('robots.txt not found or empty!')
        return ['0','']
