diff --git a/common/request.py b/common/request.py index d1cfef0..c12c446 100644 --- a/common/request.py +++ b/common/request.py @@ -190,13 +190,6 @@ def get_connector(): limit_per_host=setting.limit_per_host) -def get_header(): - header = None - if setting.fake_header: - header = utils.gen_fake_header() - return header - - async def bulk_request(data, port): ports = get_ports(port) no_req_data = utils.get_filtered_data(data) @@ -205,7 +198,7 @@ async def bulk_request(data, port): logger.log('INFOR', f'Use {method} method to request') logger.log('INFOR', f'Async subdomains request in progress') connector = get_connector() - header = get_header() + header = utils.get_random_header() async with ClientSession(connector=connector, headers=header) as session: tasks = [] for i, data in enumerate(to_req_data): diff --git a/common/utils.py b/common/utils.py index 87195bf..483f2b6 100644 --- a/common/utils.py +++ b/common/utils.py @@ -66,6 +66,16 @@ def gen_fake_header(): return headers +def get_random_header(): + """ + Get random proxy + """ + header = None + if setting.fake_header: + header = gen_fake_header() + return header + + def get_random_proxy(): """ Get random proxy @@ -76,6 +86,15 @@ def get_random_proxy(): return None +def get_proxy(): + """ + Get proxy + """ + if setting.enable_proxy: + return get_random_proxy() + return None + + def split_list(ls, size): """ Split list @@ -503,7 +522,7 @@ def check_net(): raise tenacity.TryAgain if rsp.status_code != 200: logger.log('ALERT', f'{rsp.request.method} {rsp.request.url} ' - f'{rsp.status_code} {rsp.reason}') + f'{rsp.status_code} {rsp.reason}') logger.log('ALERT', 'Can not access Internet normally, retrying') raise tenacity.TryAgain logger.log('INFOR', 'Access to Internet OK') @@ -542,18 +561,27 @@ def check_env(): check_pre() -def check_version(version): - from distutils.version import LooseVersion +def check_version(local): + logger.log('INFOR', 'Checking for the latest version') + api = 'https://api.github.com/repos/shmilylty/OneForAll/releases/latest' + header = get_random_header() + proxy = get_proxy() + timeout = setting.request_timeout + verify = setting.request_verify try: - resp = requests.get('https://api.github.com/repos/shmilylty/OneForAll/releases/latest') - latest_version = resp.json()['tag_name'] - if LooseVersion(latest_version) > LooseVersion(version): - logger.log('ALERT', f'The current OneForAll version is {version}, and the latest version is {latest_version}.') - logger.log('ALERT', f'{resp.json()["body"]}') - else: - return + resp = requests.get(url=api, headers=header, proxies=proxy, + timeout=timeout, verify=verify) except Exception as e: - logger.log('FATAL', e.args) + logger.log('ERROR', 'An error occurred while checking the latest version') + logger.log('ERROR', e.args) + return + latest = resp.json()['tag_name'] + if latest > local: + change = resp.json()["body"] + logger.log('ALERT', f'The current version is {local} but the latest version is {latest}') + logger.log('ALERT', f'The {latest} version mainly has the following changes\n{change}') + else: + logger.log('INFOR', f'The current version {local} is already the latest version') def get_maindomain(domain): diff --git a/config/setting.py b/config/setting.py index 95b606b..db638ac 100644 --- a/config/setting.py +++ b/config/setting.py @@ -15,6 +15,7 @@ result_save_dir = relative_directory.joinpath('results') # 结果保存目录 # OneForAll入口参数设置 +enable_check_version = True # 开启最新版本检查 enable_dns_resolve = True # 使用DNS解析子域(默认True) enable_http_request = True # 使用HTTP请求子域(默认True) enable_takeover_check = False # 开启子域接管风险检查(默认False) diff --git a/oneforall.py b/oneforall.py index b7345cd..2aa5f36 100644 --- a/oneforall.py +++ b/oneforall.py @@ -28,8 +28,8 @@ blue = '\033[01;34m' red = '\033[1;31m' end = '\033[0m' -version = 'v0.3.0#dev' -message = white + '{' + red + version + white + '}' +version = 'v0.3.0' +message = white + '{' + red + version + ' #dev' + white + '}' banner = f""" OneForAll is a powerful subdomain integration tool{yellow} @@ -50,6 +50,7 @@ class OneForAll(object): Example: python3 oneforall.py version + python3 oneforall.py check python3 oneforall.py --target example.com run python3 oneforall.py --target ./domains.txt run python3 oneforall.py --target example.com --alive False run @@ -232,6 +233,8 @@ class OneForAll(object): dt = datetime.now().strftime('%Y-%m-%d %H:%M:%S') print(f'[*] Starting OneForAll @ {dt}\n') utils.check_env() + if setting.enable_check_version: + utils.check_version(version) logger.log('DEBUG', 'Python ' + utils.python_version()) logger.log('DEBUG', 'OneForAll ' + version) logger.log('INFOR', f'Start running OneForAll') @@ -247,12 +250,22 @@ class OneForAll(object): @staticmethod def version(): + """ + Print version information and exit + """ print(banner) exit(0) + @staticmethod + def check(): + """ + Check if there is a new version and exit + """ + utils.check_version(version) + exit(0) + if __name__ == '__main__': - utils.check_version(version) fire.Fire(OneForAll) # OneForAll('example.com').run() # OneForAll('./domains.txt').run()