From 0f1b98721b48ba27e6cb216a904a049819eadbc9 Mon Sep 17 00:00:00 2001 From: Mr Chen Date: Tue, 26 Nov 2024 23:50:17 +0800 Subject: [PATCH] up --- web/admin/__init__.py | 4 +++ web/admin/setting/panel_ssl.py | 11 +++++++ web/core/mw.py | 52 ++++++++++++++++++++++++++++++ web/templates/default/setting.html | 2 +- web/utils/config.py | 2 ++ web/utils/setting.py | 20 +++++++++++- 6 files changed, 89 insertions(+), 2 deletions(-) diff --git a/web/admin/__init__.py b/web/admin/__init__.py index 6bb30f1a0..738fe5cfe 100644 --- a/web/admin/__init__.py +++ b/web/admin/__init__.py @@ -117,6 +117,10 @@ def requestCheck(): basic_pwd = mw.md5(auth.password.strip() + salt) if basic_user != basic_auth['basic_user'] or basic_pwd != basic_auth['basic_pwd']: return sendAuthenticated() + + domain_check = mw.checkDomainPanel() + if domain_check: + return domain_check diff --git a/web/admin/setting/panel_ssl.py b/web/admin/setting/panel_ssl.py index d6823c0f7..19f904dcd 100644 --- a/web/admin/setting/panel_ssl.py +++ b/web/admin/setting/panel_ssl.py @@ -57,11 +57,22 @@ def set_panel_local_ssl(): cert_type = request.form.get('cert_type', '').strip() return MwSetting.instance().setPanelLocalSsl(cert_type) +# 关闭面板证书 @blueprint.route('/close_panel_ssl', endpoint='close_panel_ssl', methods=['POST']) @panel_login_required def close_panel_ssl(): return MwSetting.instance().closePanelSsl() +# 设置面板域名 +@blueprint.route('/set_panel_domain', endpoint='set_panel_domain', methods=['POST']) +@panel_login_required +def set_panel_domain(): + domain = request.form.get('domain', '').strip() + return MwSetting.instance().setPanelDomain(domain) + + + + diff --git a/web/core/mw.py b/web/core/mw.py index 55c527e44..89db9b6dc 100644 --- a/web/core/mw.py +++ b/web/core/mw.py @@ -420,10 +420,62 @@ def getFileMd5(filename): return myhash.hexdigest() +def getHost(port=False): + from flask import request + host_tmp = request.headers.get('host') + if not host_tmp: + if request.url_root: + tmp = re.findall(r"(https|http)://([\w:\.-]+)", request.url_root) + if tmp: + host_tmp = tmp[0][1] + if not host_tmp: + host_tmp = getLocalIp() + ':' + readFile('data/port.pl').strip() + try: + if host_tmp.find(':') == -1: + host_tmp += ':80' + except: + host_tmp = "127.0.0.1:8888" + h = host_tmp.split(':') + if port: + return h[-1] + return ':'.join(h[0:-1]) + def getClientIp(): from flask import request return request.remote_addr.replace('::ffff:', '') +def checkDomainPanel(): + import thisdb + from flask import Flask, redirect, request, url_for + current_host = getHost() + + domain = thisdb.getOption('panel_domain', default='') + port = getPanelPort() + scheme = 'http' + + panel_ssl_data = thisdb.getOptionByJson('panel_ssl', default={'open':False}) + if panel_ssl_data['open']: + choose = panel_ssl_data['choose'] + if not inArray(['local','nginx'], choose): + return False + scheme = 'https' + + client_ip = getClientIp() + if client_ip in ['127.0.0.1', 'localhost', '::1']: + return False + + ip = getHostAddr() + if domain == '': + if current_host.strip().lower() != ip.strip().lower(): + to = scheme + "://" + ip + ":" + str(port) + return redirect(to, code=302) + return False + else: + if current_host.strip().lower() != domain.strip().lower(): + to = scheme + "://" + domain + ":" + str(port) + return redirect(to, code=302) + return False + def getLocalIp(): filename = getPanelDir()+'/data/iplist.txt' try: diff --git a/web/templates/default/setting.html b/web/templates/default/setting.html index 3d1d068fc..1c5edea6c 100755 --- a/web/templates/default/setting.html +++ b/web/templates/default/setting.html @@ -106,7 +106,7 @@

绑定域名 - + 为面板绑定一个访问域名,注意:一旦绑定域名,只能通过域名访问面板

diff --git a/web/utils/config.py b/web/utils/config.py index b6112ddc7..cbc0ecc90 100644 --- a/web/utils/config.py +++ b/web/utils/config.py @@ -85,5 +85,7 @@ def getGlobalVar(): data['notify_tgbot'] = thisdb.getOptionByJson('notify_tgbot', default={'open':False}, type='notify') data['panel_ssl'] = thisdb.getOptionByJson('panel_ssl', default={'open':False}) + data['panel_domain'] = thisdb.getOption('panel_domain', default='') + return data \ No newline at end of file diff --git a/web/utils/setting.py b/web/utils/setting.py index 5ce5f1fcf..cdeb67e0c 100644 --- a/web/utils/setting.py +++ b/web/utils/setting.py @@ -270,4 +270,22 @@ class setting(object): # if is_already_apply: # return mw.returnJson(True, '重复申请!', data) - # return mw.returnJson(True, '申请成功!', data) \ No newline at end of file + # return mw.returnJson(True, '申请成功!', data) + + def setPanelDomain(self, domain): + port = mw.getPanelPort() + ip = mw.getLocalIp() + + panel_domain = thisdb.getOption('panel_domain', default='') + if domain == '': + to_panel_url = 'http://'+ip+":"+str(port)+'/setting/index' + thisdb.setOption('panel_domain', '') + mw.restartMw() + return mw.returnData(True, '清空域名成功!', to_panel_url) + + thisdb.setOption('panel_domain', domain) + to_panel_url = 'http://'+domain+":"+str(port)+'/setting/index' + mw.restartMw() + return mw.returnData(True, '设置域名成功!',to_panel_url) + +