配置添加【未认证响应状态】功能

pull/368/head
midoks 2 years ago
parent 2646d0565d
commit b9ca4fc11e
  1. 1
      .gitignore
  2. 41
      class/core/config_api.py
  3. 5
      route/__init__.py
  4. 55
      route/static/app/config.js
  5. 257
      route/templates/default/config.html

1
.gitignore vendored

@ -174,3 +174,4 @@ plugins/file_search
debug.out debug.out
data/unauthorized_status.pl

@ -647,6 +647,20 @@ class config_api:
else: else:
return False, '' return False, ''
def setStatusCodeApi(self):
status_code = request.form.get('status_code', '').strip()
if re.match("^\d+$", status_code):
status_code = int(status_code)
if status_code != 0:
if status_code < 100 or status_code > 999:
return mw.returnJson(False, '状态码范围错误!')
else:
return mw.returnJson(False, '状态码范围错误!')
mw.writeFile('data/unauthorized_status.pl', str(status_code))
mw.writeLog('面板设置', '将未授权响应状态码设置为:{}'.format(status_code))
return mw.returnJson(True, '设置成功!')
def getPanelTokenApi(self): def getPanelTokenApi(self):
api_file = self.__api_addr api_file = self.__api_addr
tmp = mw.readFile(api_file) tmp = mw.readFile(api_file)
@ -713,6 +727,31 @@ class config_api:
mw.writeFile(api_file, json.dumps(data)) mw.writeFile(api_file, json.dumps(data))
return mw.returnJson(True, '保存成功!') return mw.returnJson(True, '保存成功!')
def renderUnauthorizedStatus(self, data):
cfg_unauth_status = 'data/unauthorized_status.pl'
if os.path.exists(cfg_unauth_status):
status_code = mw.readFile(cfg_unauth_status)
data['status_code'] = status_code
data['status_code_msg'] = status_code
if status_code == '0':
data['status_code_msg'] = "默认-安全入口错误提示"
elif status_code == '400':
data['status_code_msg'] = "400-客户端请求错误"
elif status_code == '401':
data['status_code_msg'] = "401-未授权访问"
elif status_code == '403':
data['status_code_msg'] = "403-拒绝访问"
elif status_code == '404':
data['status_code_msg'] = "404-页面不存在"
elif status_code == '408':
data['status_code_msg'] = "408-客户端超时"
elif status_code == '416':
data['status_code_msg'] = "416-无效的请求"
else:
data['status_code'] = '0'
data['status_code_msg'] = "默认-安全入口错误提示"
return data
def get(self): def get(self):
data = {} data = {}
@ -765,6 +804,8 @@ class config_api:
else: else:
data['bind_domain'] = '' data['bind_domain'] = ''
data = self.renderUnauthorizedStatus(data)
api_token = self.__api_addr api_token = self.__api_addr
if os.path.exists(api_token): if os.path.exists(api_token):
bac = mw.readFile(api_token) bac = mw.readFile(api_token)

@ -386,7 +386,10 @@ def get_admin_safe():
def admin_safe_path(path, req, data, pageFile): def admin_safe_path(path, req, data, pageFile):
if path != req and not isLogined(): if path != req and not isLogined():
return render_template('path.html') if data['status_code'] == '0':
return render_template('path.html')
else:
return Response(status=int(data['status_code']))
if not isLogined(): if not isLogined():
return render_template('login.html', data=data) return render_template('login.html', data=data)

@ -550,6 +550,61 @@ function setTempAccessReq(page){
},'json'); },'json');
} }
function setStatusCode(o){
var code = $(o).data('code');
layer.open({
type: 1,
area: ['420px', '220px'],
title: "设置未认证时的响应状态",
closeBtn: 1,
shift: 5,
btn:['提交','关闭'],
shadeClose: false,
content: '<div class="bt-form bt-form pd20">\
<div class="line">\
<span class="tname">相应状态</span>\
<div class="info-r">\
<select class="bt-input-text mr5" name="status_code" style="width: 250px;"></select>\
</div>\
</div>\
<ul class="help-info-text c7"><li style="color: red;">用于未登录且未正确输入安全入口时的响应,用于隐藏面板特征</li></ul>\
</div>',
success:function(){
var msg_list = [
{'code':'0','msg':'默认-安全入口错误提示'},
{'code':'403','msg':'403-拒绝访问'},
{'code':'404','msg':'404-页面不存在'},
{'code':'416','msg':'416-无效的请求'},
{'code':'408','msg':'408-客户端超时'},
{'code':'400','msg':'400-客户端请求错误'},
{'code':'401','msg':'401-未授权访问'},
];
var tbody = '';
for(i in msg_list){
if (msg_list[i]['code'] == code){
tbody += '<option value="'+msg_list[i]['code']+'" selected>'+msg_list[i]['msg']+'</option>';
} else{
tbody += '<option value="'+msg_list[i]['code']+'">'+msg_list[i]['msg']+'</option>';
}
}
$('select[name="status_code"]').append(tbody);
},
yes:function(index){
var loadT = layer.msg("正在设置未认证时的响应状态", { icon: 16, time: 0, shade: [0.3, '#000'] });
var status_code = $('select[name="status_code"]').val();
$.post('/config/set_status_code', { status_code: status_code }, function (rdata) {
showMsg(rdata.msg, function(){
layer.close(index);
layer.close(loadT);
location.reload();
},{ icon: rdata.status ? 1 : 2 }, 2000);
},'json');
}
});
}
function setTempAccess(){ function setTempAccess(){
layer.open({ layer.open({
area: ['700px', '250px'], area: ['700px', '250px'],

@ -1,155 +1,152 @@
{% extends "layout.html" %} {% extends "layout.html" %}
{% block content %} {% block content %}
<div class="main-content"> <div class="main-content">
<div class="container-fluid" style="padding-bottom:54px"> <div class="container-fluid" style="padding-bottom:54px">
<div class="pos-box bgw mtb15"> <div class="pos-box bgw mtb15">
<div class="position f14 c9 pull-left"> <div class="position f14 c9 pull-left"><a class="plr10 c4" href="/">首页</a>/<span class="plr10 c4">面板设置</span></div>
<a class="plr10 c4" href="/">首页</a>/<span class="plr10 c4">面板设置</span> </div>
</div> <div class="clearfix bgw mtb15 pd15">
</div> <div class="safe-port pull-left">
<div class="clearfix bgw mtb15 pd15"> <div class="ss-text pull-left mr50">
<div class="safe-port pull-left"> <em>关闭面板</em>
<div class="ssh-item">
<div class="ss-text pull-left mr50"> <input class="btswitch btswitch-ios" id="closePl" type="checkbox">
<em>关闭面板</em> <label class="btswitch-btn" for="closePl" onclick="closePanel()"></label>
<div class="ssh-item"> </div>
<input class="btswitch btswitch-ios" id="closePl" type="checkbox">
<label class="btswitch-btn" for="closePl" onclick="closePanel()"></label>
</div>
</div>
<div class="ss-text pull-left mr50">
<em>开发模式</em>
<div class="ssh-item">
<input class="btswitch btswitch-ios" id="debugMode" type="checkbox" {{data['debug']}}>
<label class="btswitch-btn" for="debugMode" onclick="debugMode()"></label>
</div>
</div>
<div class="ss-text pull-left mr50">
<em title="开启后允许使用ipv6访问面板">监听IPv6</em>
<div class='ssh-item'>
<input class='btswitch btswitch-ios' id='panelIPv6' type='checkbox' {{data['ipv6']}}>
<label class='btswitch-btn' for='panelIPv6' onclick="setIPv6()"></label>
</div>
</div>
</div>
</div>
<div class="setbox bgw mtb15">
<div class="title c6 plr15">
<h3 class="f16">设置</h3>
</div>
<div class="info-title-tips" style="margin: 20px 30px 0px;">
<p><span class="glyphicon glyphicon-alert" style="color: #f39c12; margin-right: 10px;"></span>为了提高安全,修改面板密码!</p>
</div> </div>
<div class="setting-con pd15"> <div class="ss-text pull-left mr50">
<form id="set_config"> <em>开发模式</em>
<p class="mtb15"> <div class="ssh-item">
<span class="set-tit text-right">别名</span> <input class="btswitch btswitch-ios" id="debugMode" type="checkbox" {{data['debug']}}>
<input id="webname" name="webname" class="inputtxt bt-input-text" type="text" value="{{data['title']}}"> <label class="btswitch-btn" for="debugMode" onclick="debugMode()"></label>
<button type="button" class="btn btn-success btn-sm ml5 btn_webname" disabled>保存</button> </div>
<span class="set-info c7">面板名称</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="服务器IP">服务器IP</span>
<input name="host_ip" class="inputtxt bt-input-text" type="text" value="{{data['ip']}}">
<button type="button" class="btn btn-success btn-sm ml5 btn_host_ip" disabled>保存</button>
<span class="set-info c7">默认为外网IP,若您在本地虚拟机测试,请填写虚拟机内网IP!</span>
</p>
<p class="mtb15">
<span class="set-tit text-right">面板端口</span>
<input id="banport" name="port" class="inputtxt bt-input-text" type="numner" value="{{data['port']}}" maxlength="5">
<button type="button" class="btn btn-success btn-sm ml5 btn_port" disabled>保存</button>
<span class="set-info c7">建议端口范围7200 - 65535</span>
</p>
<p class="mtb15">
<span class="set-tit text-right">安全入口</span>
<input id="admin_path" name="admin_path" class="inputtxt bt-input-text disable" type="text" value="{{data['admin_path']}}">
<button type="button" class="btn btn-success btn-sm ml5" onclick="modifyAuthPath()">设置</button>
<span class="set-info c7">面板管理入口,设置后只能通过指定安全入口登录面板,如: /abc</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="默认建站目录">默认建站目录</span>
<input name="sites_path" class="inputtxt bt-input-text" type="text" value="{{data['site_path']}}">
<button type="button" class="btn btn-success btn-sm ml5 btn_sites_path" disabled>保存</button>
<span class="set-info c7">新创建的站点,默认将保存到该目录的下级目录!</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="默认建站目录">默认备份目录</span>
<input name="backup_path" class="inputtxt bt-input-text" type="text" value="{{data['backup_path']}}">
<button type="button" class="btn btn-success btn-sm ml5 btn_backup_path" disabled>保存</button>
<span class="set-info c7">网站和数据库的备份目录!</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="服务器时间">服务器时间</span>
<input id="systemdate" name="systemdate" class="inputtxt bt-input-text disable" type="text" value="{{data['systemdate']}}">
<button type="button" class="btn btn-success btn-sm ml5" onclick="syncDate()">同步</button>
<span class="set-info c7">同步当前服务器时间</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="面板用户">面板用户</span>
<input name="username_" class="inputtxt bt-input-text disable" type="text" value="{{data['username']}}" disabled>
<button type="button" class="btn btn-success btn-sm ml5" onclick="setUserName()">设置</button>
<span class="set-info c7">设置面板账号</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="面板密码">面板密码</span>
<input name="password_" class="inputtxt bt-input-text disable" type="text" value="******" disabled>
<button type="button" class="btn btn-success btn-sm ml5" onclick="setPassword()">设置</button>
<span class="set-info c7">设置面板密码</span>
</p>
</form>
</div> </div>
<div class="title c6 plr15"> <div class="ss-text pull-left mr50">
<h3 class="f16">安全</h3> <em title="开启后允许使用ipv6访问面板">监听IPv6</em>
</div> <div class='ssh-item'>
<input class='btswitch btswitch-ios' id='panelIPv6' type='checkbox' {{data['ipv6']}}>
<label class='btswitch-btn' for='panelIPv6' onclick="setIPv6()"></label>
</div>
</div>
</div>
</div>
<div class="setbox bgw mtb15">
<div class="title c6 plr15"><h3 class="f16">设置</h3></div>
<div class="info-title-tips" style="margin: 20px 30px 0px;">
<p><span class="glyphicon glyphicon-alert" style="color: #f39c12; margin-right: 10px;"></span>为了提高安全,修改面板密码!</p>
</div>
<div class="setting-con pd15">
<form id="set_config">
<p class="mtb15">
<span class="set-tit text-right">别名</span>
<input id="webname" name="webname" class="inputtxt bt-input-text" type="text" value="{{data['title']}}">
<button type="button" class="btn btn-success btn-sm ml5 btn_webname" disabled>保存</button>
<span class="set-info c7">面板名称</span>
</p>
<div class="setting-con pd15"> <p class="mtb15">
<span class="set-tit text-right" title="服务器IP">服务器IP</span>
<input name="host_ip" class="inputtxt bt-input-text" type="text" value="{{data['ip']}}">
<button type="button" class="btn btn-success btn-sm ml5 btn_host_ip" disabled>保存</button>
<span class="set-info c7">默认为外网IP,若您在本地虚拟机测试,请填写虚拟机内网IP!</span>
</p>
<p class="mtb15"> <p class="mtb15">
<span class="set-tit text-right" title="绑定域名" style="float: left;">绑定域名</span> <span class="set-tit text-right">面板端口</span>
<input name="bind_domain" class="inputtxt bt-input-text" type="text" value="{{data['bind_domain']}}"> <input id="banport" name="port" class="inputtxt bt-input-text" type="numner" value="{{data['port']}}" maxlength="5">
<button type="button" class="btn btn-success btn-sm ml5 btn_bind_domain" disabled>保存</button> <button type="button" class="btn btn-success btn-sm ml5 btn_port" disabled>保存</button>
<span class="set-info c7">为面板绑定一个访问域名,<b style="color: red;">注意:一旦绑定域名,只能通过域名访问面板</b></span> <span class="set-info c7">建议端口范围7200 - 65535</span>
</p> </p>
<p class="mtb15"> <p class="mtb15">
<span class="set-tit text-right" title="面板SSL" style="float: left;">面板SSL</span> <span class="set-tit text-right">安全入口</span>
<input id="cfg_ssl" name="bind_ssl" class="btswitch btswitch-ios" type="checkbox" {{data['ssl']}}> <input id="admin_path" name="admin_path" class="inputtxt bt-input-text disable" type="text" value="{{data['admin_path']}}">
<label class="btswitch-btn ml5" for="cfg_ssl" style="float: left;margin-top:4px;"></label> <button type="button" class="btn btn-success btn-sm ml5" onclick="modifyAuthPath()">设置</button>
<button ype="button" class="btn btn-default btn-xs panel_api_btn" style="vertical-align: middle; margin-left: 10px" onclick="getPanelSSL();">面板SSL配置</button> <span class="set-info c7">面板管理入口,设置后只能通过指定安全入口登录面板,如: /abc</span>
<span class="set-info c7">为面板设置https协议访问,提升面板访问<b style="color: red;">安全性</b></span>
</p> </p>
<p class="mtb15"> <p class="mtb15">
<span class="set-tit text-right" title="BasicAuth认证" style="float: left;">BasicAuth认证</span> <span class="set-tit text-right" title="默认建站目录">默认建站目录</span>
<input class="btswitch btswitch-ios" id="cfg_basic_auth" type="checkbox" {{data['basic_auth']}}/> <input name="sites_path" class="inputtxt bt-input-text" type="text" value="{{data['site_path']}}">
<label class="btswitch-btn ml5" for="cfg_basic_auth" style="float: left;margin-top:4px;" onclick="setBasicAuth()"></label> <button type="button" class="btn btn-success btn-sm ml5 btn_sites_path" disabled>保存</button>
<span class="set-info c7">为面板增加一道基于BasicAuth的认证服务,有效防止面板被扫描</span> <span class="set-info c7">新创建的站点,默认将保存到该目录的下级目录!</span>
</p> </p>
<p class="mtb15"> <p class="mtb15">
<span class="set-tit text-right" title="API接口" style="float: left;">API接口</span> <span class="set-tit text-right" title="默认建站目录">默认备份目录</span>
<input class="btswitch btswitch-ios" id="cfg_panel_api" type="checkbox" {{data['api_token']}}/> <input name="backup_path" class="inputtxt bt-input-text" type="text" value="{{data['backup_path']}}">
<label class="btswitch-btn ml5" for="cfg_panel_api" style="float: left;margin-top:4px;" onclick="setPanelApi()"></label> <button type="button" class="btn btn-success btn-sm ml5 btn_backup_path" disabled>保存</button>
<button ype="button" class="btn btn-default btn-xs panel_api_btn" style="vertical-align: middle; margin-left: 10px" onclick="showPanelApi();">API接口配置</button> <span class="set-info c7">网站和数据库的备份目录!</span>
<span class="set-info c7">提供面板API接口访问的支持</span>
</p> </p>
<p class="mtb15"> <p class="mtb15">
<span class="set-tit text-right" title="临时访问授权">临时访问授权</span> <span class="set-tit text-right" title="服务器时间">服务器时间</span>
<button type="button" class="btn btn-success btn-sm ml5" onclick="setTempAccess()">临时访问授权管理</button> <input id="systemdate" name="systemdate" class="inputtxt bt-input-text disable" type="text" value="{{data['systemdate']}}">
<span class="set-info c7">为非管理员临时提供面板访问权限</span> <button type="button" class="btn btn-success btn-sm ml5" onclick="syncDate()">同步</button>
<span class="set-info c7">同步当前服务器时间</span>
</p> </p>
</div> <p class="mtb15">
<span class="set-tit text-right" title="面板用户">面板用户</span>
<input name="username_" class="inputtxt bt-input-text disable" type="text" value="{{data['username']}}" disabled>
<button type="button" class="btn btn-success btn-sm ml5" onclick="setUserName()">设置</button>
<span class="set-info c7">设置面板账号</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="面板密码">面板密码</span>
<input name="password_" class="inputtxt bt-input-text disable" type="text" value="******" disabled>
<button type="button" class="btn btn-success btn-sm ml5" onclick="setPassword()">设置</button>
<span class="set-info c7">设置面板密码</span>
</p>
</form>
</div>
<div class="title c6 plr15"><h3 class="f16">安全</h3></div>
<div class="setting-con pd15">
<p class="mtb15">
<span class="set-tit text-right" title="绑定域名" style="float: left;">绑定域名</span>
<input name="bind_domain" class="inputtxt bt-input-text" type="text" value="{{data['bind_domain']}}">
<button type="button" class="btn btn-success btn-sm ml5 btn_bind_domain" disabled>保存</button>
<span class="set-info c7">为面板绑定一个访问域名,<b style="color: red;">注意:一旦绑定域名,只能通过域名访问面板</b></span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="面板SSL" style="float: left;">面板SSL</span>
<input id="cfg_ssl" name="bind_ssl" class="btswitch btswitch-ios" type="checkbox" {{data['ssl']}}>
<label class="btswitch-btn ml5" for="cfg_ssl" style="float: left;margin-top:4px;"></label>
<button ype="button" class="btn btn-default btn-xs panel_api_btn" style="vertical-align: middle; margin-left: 10px" onclick="getPanelSSL();">面板SSL配置</button>
<span class="set-info c7">为面板设置https协议访问,提升面板访问<b style="color: red;">安全性</b></span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="BasicAuth认证" style="float: left;">BasicAuth认证</span>
<input class="btswitch btswitch-ios" id="cfg_basic_auth" type="checkbox" {{data['basic_auth']}}/>
<label class="btswitch-btn ml5" for="cfg_basic_auth" style="float: left;margin-top:4px;" onclick="setBasicAuth()"></label>
<span class="set-info c7">为面板增加一道基于BasicAuth的认证服务,有效防止面板被扫描</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="API接口" style="float: left;">API接口</span>
<input class="btswitch btswitch-ios" id="cfg_panel_api" type="checkbox" {{data['api_token']}}/>
<label class="btswitch-btn ml5" for="cfg_panel_api" style="float: left;margin-top:4px;" onclick="setPanelApi()"></label>
<button ype="button" class="btn btn-default btn-xs panel_api_btn" style="vertical-align: middle; margin-left: 10px" onclick="showPanelApi();">API接口配置</button>
<span class="set-info c7">提供面板API接口访问的支持</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="未认证响应状态">未认证响应状态</span>
<input name="status_code" class="inputtxt bt-input-text disable" type="text" value="{{data['status_code_msg']}}" disabled>
<button type="button" class="btn btn-success btn-sm ml5" data-code="{{data['status_code']}}" onclick="setStatusCode(this)">设置</button>
<span class="set-info c7">用于在未登录且未正确输入安全入口时的响应,可用于隐藏面板特征</span>
</p>
<p class="mtb15">
<span class="set-tit text-right" title="临时访问授权">临时访问授权</span>
<button type="button" class="btn btn-success btn-sm ml5" onclick="setTempAccess()">临时访问授权管理</button>
<span class="set-info c7">为非管理员临时提供面板访问权限</span>
</p>
</div> </div>
</div> </div>
</div> </div>

Loading…
Cancel
Save