load/save security and SMTP settings of system configuration page.

pull/105/head
ApexLiu 2017-11-05 00:20:43 +08:00
parent 37f8fc8b6f
commit e686a583de
6 changed files with 272 additions and 102 deletions

View File

@ -171,17 +171,21 @@ $app.create_config_smtp = function () {
return;
_smtp.dom.btn_save.attr('disabled', 'disabled');
$tp.ajax_post_json('/system/save-cfg-smtp',
$tp.ajax_post_json('/system/save-cfg',
{
server: _server,
port: _port,
ssl: _ssl,
sender: _sender,
password: _password
smtp: {
server: _server,
port: _port,
ssl: _ssl,
sender: _sender,
password: _password
}
},
function (ret) {
_smtp.dom.btn_save.removeAttr('disabled');
if (ret.code === TPE_OK) {
$tp.notify_success('SMTP设置更新成功');
_smtp.dom.input_password.val('');
// 更新一下界面上显示的配置信息
$app.options.sys_cfg.smtp.server = _server;
@ -191,13 +195,14 @@ $app.create_config_smtp = function () {
_smtp.update_dom($app.options.sys_cfg.smtp);
_smtp.dom.dlg_edit.modal('hide');
} else {
$tp.notify_error(tp_error_msg(ret.code, ret.message));
$tp.notify_error('SMTP设置更新失败' + tp_error_msg(ret.code, ret.message));
}
},
function () {
_smtp.dom.btn_save.removeAttr('disabled');
$tp.notify_error('网路故障,无法连接到服务器');
$tp.notify_error('网路故障,SMTP设置更新失败');
}
);
};
@ -270,8 +275,87 @@ $app.create_config_sec = function () {
_sec.dom.btn_auth_username_password_oath.addClass('tp-selected');
};
_sec.on_btn_save = function() {
_sec.on_btn_save = function () {
var _password_allow_reset = _sec.dom.btn_password_allow_reset.hasClass('tp-selected');
var _password_force_strong = _sec.dom.btn_password_force_strong.hasClass('tp-selected');
var _password_timeout = parseInt(_sec.dom.input_password_timeout.val());
var _login_session_timeout = parseInt(_sec.dom.input_session_timeout.val());
var _login_retry = parseInt(_sec.dom.input_login_retry.val());
var _login_lock_timeout = parseInt(_sec.dom.input_lock_timeout.val());
var _login_auth = 0;
if (_sec.dom.btn_auth_username_password.hasClass('tp-selected'))
_login_auth |= TP_LOGIN_AUTH_USERNAME_PASSWORD;
if (_sec.dom.btn_auth_username_password_captcha.hasClass('tp-selected'))
_login_auth |= TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA;
if (_sec.dom.btn_auth_username_oath.hasClass('tp-selected'))
_login_auth |= TP_LOGIN_AUTH_USERNAME_OATH;
if (_sec.dom.btn_auth_username_password_oath.hasClass('tp-selected'))
_login_auth |= TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH;
if (_.isNaN(_password_timeout) || _password_timeout < 0 || _password_timeout > 180) {
$tp.notify_error('密码有效期超出范围!');
_sec.dom.input_password_timeout.focus();
return;
}
if (_.isNaN(_login_session_timeout) || _login_session_timeout < 5 || _login_session_timeout > 1440) {
$tp.notify_error('WEB会话超时超出范围');
_sec.dom.input_session_timeout.focus();
return;
}
if (_.isNaN(_login_retry) || _login_retry < 0 || _login_retry > 10) {
$tp.notify_error('密码尝试次数超出范围!');
_sec.dom.input_login_retry.focus();
return;
}
if (_.isNaN(_login_lock_timeout) || _login_lock_timeout < 0 || _login_lock_timeout > 9999) {
$tp.notify_error('临时锁定时长超出范围!');
_sec.dom.input_lock_timeout.focus();
return;
}
_sec.dom.btn_save.attr('disabled', 'disabled');
$tp.ajax_post_json('/system/save-cfg',
{
password: {
allow_reset: _password_allow_reset,
force_strong: _password_force_strong,
timeout: _password_timeout
},
login: {
session_timeout: _login_session_timeout,
retry: _login_retry,
lock_timeout: _login_lock_timeout,
auth: _login_auth
}
},
function (ret) {
_sec.dom.btn_save.removeAttr('disabled');
if (ret.code === TPE_OK) {
$tp.notify_success('安全设置更新成功!');
// 更新一下界面上显示的配置信息
$app.options.sys_cfg.password.allow_reset = _password_allow_reset;
$app.options.sys_cfg.password.force_strong = _password_force_strong;
$app.options.sys_cfg.password.timeout = _password_timeout;
$app.options.sys_cfg.login.session_timeout = _login_session_timeout;
$app.options.sys_cfg.login.retry = _login_retry;
$app.options.sys_cfg.login.lock_timeout = _login_lock_timeout;
$app.options.sys_cfg.login.auth = _login_auth;
_sec.update_dom_password($app.options.sys_cfg.password);
_sec.update_dom_login($app.options.sys_cfg.login);
} else {
$tp.notify_error('安全设置更新失败:' + tp_error_msg(ret.code, ret.message));
}
},
function () {
_sec.dom.btn_save.removeAttr('disabled');
$tp.notify_error('网路故障,安全设置更新失败!');
}
);
};

View File

@ -20,7 +20,7 @@
<li class="active"><a href="#tab-security" data-toggle="tab">安全</a></li>
<li><a href="#tab-smtp" data-toggle="tab">邮件系统</a></li>
<li><a href="#tab-storage" data-toggle="tab">存储</a></li>
<li><a href="#tab-backup" data-toggle="tab">备份</a></li>
## <li><a href="#tab-backup" data-toggle="tab">备份</a></li>
</ul>
<div class="tab-content">
@ -107,7 +107,7 @@
</tr>
</table>
<hr/>
<button id="btn-save-secure-config" class="btn btn-sm btn-primary"><i class="fa fa-edit fa-fw"></i> 保存安全设置</button>
<button id="btn-save-secure-config" class="btn btn-sm btn-primary"><i class="fa fa-check-circle fa-fw"></i> 保存安全设置</button>
</div>
@ -132,7 +132,7 @@
</tr>
</table>
<hr/>
<button id="btn-edit-mail-config" class="btn btn-sm btn-primary"><i class="fa fa-edit fa-fw"></i> 设置发件服务器</button>
<button id="btn-edit-mail-config" class="btn btn-sm btn-primary"><i class="fa fa-cog fa-fw"></i> 设置发件服务器</button>
</div>
<!-- panel for storage config -->
@ -145,7 +145,7 @@
<tr>
<td class="key">保留时间</td>
<td class="value">
<input type="text" value="0"/><span class="unit">天</span><span class="desc">30~180。仅保留指定天数的系统日志为0则永久保留。默认为0。</span>
<input id="storage-keep-log" type="text" value="0"/><span class="unit">天</span><span class="desc">30~180。仅保留指定天数的系统日志为0则永久保留。默认为0。</span>
</td>
</tr>
@ -158,55 +158,24 @@
<tr>
<td class="key">保留时间</td>
<td class="value">
<input type="text" value="0"/><span class="unit">天</span><span class="desc">30~180。仅保留指定天数的会话录像为0则永久保留。默认为0。</span>
<input id="storage-keep-record" type="text" value="0"/><span class="unit">天</span><span class="desc">30~180。仅保留指定天数的会话录像(以会话开始时间为准)为0则永久保留。默认为0。</span>
</td>
</tr>
</table>
<hr/>
<button id="btn-save-storage-config" class="btn btn-sm btn-primary"><i class="fa fa-edit fa-fw"></i> 保存存储设置</button>
<button id="btn-save-storage-config" class="btn btn-sm btn-danger"><i class="fa fa-edit fa-fw"></i> 立即清理</button>
</div>
<!-- panel for backup config -->
<div class="tab-pane" id="tab-backup">
<div class="alert alert-danger">备份功能尚未实现</div>
<table class="table table-config-list">
<tr>
<td colspan="2" class="title">数据库备份</td>
</tr>
<tr>
<td class="key">备份范围</td>
<td class="value">
<div id="sec-allow-reset-password" class="tp-checkbox tp-editable">包括系统日志</div>
<td colspan="2" class="title">
<hr class="hr-sm"/>
自动清理
</td>
</tr>
<tr>
<td class="key"></td>
<td class="key">时间点</td>
<td class="value">
<div id="sec-allow-reset-password" class="tp-checkbox tp-editable">包括报警日志</div>
</td>
</tr>
<tr>
<td class="key"></td>
<td class="value">
<div id="sec-allow-reset-password" class="tp-checkbox tp-editable">包括运维记录</div>
</td>
</tr>
<tr>
<td class="key">自动备份</td>
<td class="value">
<div id="sec-allow-reset-password" class="tp-checkbox tp-editable tp-selected">在指定时间点自动备份数据库</div>
</td>
</tr>
<tr>
<td class="key">备份时间点</td>
<td class="value">
<select>
<select id="select-backup-hour">
<option>00</option>
<option>01</option>
<option>02</option>
<option selected="selected">03</option>
<option selected="selected">04</option>
<option>04</option>
<option>05</option>
<option>06</option>
@ -229,7 +198,7 @@
<option>23</option>
</select>
<select>
<select id="select-backup-min">
<option selected="selected">00</option>
<option>05</option>
<option>10</option>
@ -244,28 +213,120 @@
<option>55</option>
</select>
<span class="desc">每天在指定时间点备份数据库。</span>
</td>
</tr>
<tr>
<td class="key">备份保留时长</td>
<td class="value">
<input type="text" value="7"/><span class="unit">天</span><span class="desc">1~7。超过设定时间的备份将自动删除默认为7天。</span>
<span class="desc">每天在指定时间点清理存储。</span>
</td>
</tr>
<tr>
<td class="key"></td>
<td class="value">
<a href="javascript:;"><i class="fa fa-download"></i> 下载自动备份文件</a>
<button id="btn-clear-storage" class="btn btn-sm btn-success"><i class="fa fa-leaf fa-fw"></i> 现在立即清理</button>
</td>
</tr>
</table>
<hr/>
<button id="btn-save-storage-config" class="btn btn-sm btn-primary"><i class="fa fa-edit fa-fw"></i> 保存存储设置</button>
<button id="btn-save-storage-config" class="btn btn-sm btn-success"><i class="fa fa-edit fa-fw"></i> 立即备份</button>
<button id="btn-save-storage-config" class="btn btn-sm btn-danger"><i class="fa fa-edit fa-fw"></i> 导入备份</button>
<button id="btn-save-storage-config" class="btn btn-sm btn-primary"><i class="fa fa-check-circle fa-fw"></i> 保存存储设置</button>
## <button id="btn-clear-storage" class="btn btn-sm btn-danger"><i class="fa fa-edit fa-fw"></i> 立即清理</button>
</div>
<!-- panel for backup config -->
## <div class="tab-pane" id="tab-backup">
## <div class="alert alert-danger">备份功能尚未实现</div>
##
## <table class="table table-config-list">
## <tr>
## <td colspan="2" class="title">数据库备份</td>
## </tr>
## <tr>
## <td class="key">备份范围</td>
## <td class="value">
## <div id="btn-bak-syslog" class="tp-checkbox tp-editable">包括系统日志</div>
## </td>
## </tr>
## <tr>
## <td class="key"></td>
## <td class="value">
## <div id="btn-backup-alert" class="tp-checkbox tp-editable">包括报警日志</div>
## </td>
## </tr>
## <tr>
## <td class="key"></td>
## <td class="value">
## <div id="btn-backup-ops" class="tp-checkbox tp-editable">包括运维记录</div>
## </td>
## </tr>
## <tr>
## <td class="key">自动备份</td>
## <td class="value">
## <div id="btn-auto-backup" class="tp-checkbox tp-editable tp-selected">在指定时间点自动备份数据库</div>
## </td>
## </tr>
## <tr>
## <td class="key">备份时间点</td>
## <td class="value">
## <select id="select-backup-hour">
## <option>00</option>
## <option>01</option>
## <option>02</option>
## <option selected="selected">03</option>
## <option>04</option>
## <option>05</option>
## <option>06</option>
## <option>07</option>
## <option>08</option>
## <option>09</option>
## <option>10</option>
## <option>11</option>
## <option>12</option>
## <option>13</option>
## <option>14</option>
## <option>15</option>
## <option>16</option>
## <option>17</option>
## <option>18</option>
## <option>19</option>
## <option>20</option>
## <option>21</option>
## <option>22</option>
## <option>23</option>
## </select>
## 时
## <select id="select-backup-min">
## <option selected="selected">00</option>
## <option>05</option>
## <option>10</option>
## <option>15</option>
## <option>20</option>
## <option>25</option>
## <option>30</option>
## <option>35</option>
## <option>40</option>
## <option>45</option>
## <option>50</option>
## <option>55</option>
## </select>
## 分
## <span class="desc">每天在指定时间点备份数据库。</span>
## </td>
## </tr>
## <tr>
## <td class="key">备份保留时长</td>
## <td class="value">
## <input id="backup-keep-timeout" type="text" value="7"/><span class="unit">天</span><span class="desc">1~7。超过设定时间的备份将自动删除默认为7天。</span>
## </td>
## </tr>
## <tr>
## <td class="key"></td>
## <td class="value">
## <a href="javascript:;"><i class="fa fa-download"></i> 下载自动备份文件</a>
## </td>
## </tr>
##
## </table>
## <hr/>
## <button id="btn-save-storage-config" class="btn btn-sm btn-primary"><i class="fa fa-edit fa-fw"></i> 保存存储设置</button>
## <button id="btn-do-backup" class="btn btn-sm btn-success"><i class="fa fa-edit fa-fw"></i> 立即备份</button>
## <button id="btn-import-backup" class="btn btn-sm btn-danger"><i class="fa fa-edit fa-fw"></i> 导入备份</button>
## </div>
</div>
</div>
</div>

View File

@ -492,7 +492,7 @@ class AppConfig(BaseAppConfig):
if not self.sys.login.is_exists('lock_timeout'):
self.sys.login.lock_timeout = 30 # 30 min
if not self.sys.login.is_exists('auth'):
self.sys.login.auth = TP_LOGIN_AUTH_USERNAME_PASSWORD | TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA | TP_LOGIN_AUTH_USERNAME_OATH | TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH
self.sys.login.auth = TP_LOGIN_AUTH_USERNAME_PASSWORD_CAPTCHA | TP_LOGIN_AUTH_USERNAME_OATH | TP_LOGIN_AUTH_USERNAME_PASSWORD_OATH
# print('==login==', json.dumps(self.sys.login, separators=(',', ':')))
# =====================================

View File

@ -219,8 +219,8 @@ controllers = [
(r'/system/config', system.ConfigHandler),
# - [json] 系统配置-发送测试邮件
(r'/system/send-test-mail', system.DoSendTestMailHandler),
# - [json] 系统配置-保存邮件系统配置
(r'/system/save-cfg-smtp', system.DoSaveCfgSmtpHandler),
# - [json] 系统配置-保存配置
(r'/system/save-cfg', system.DoSaveCfgHandler),
# - [json] 获取服务器时间
(r'/system/get-time', system.DoGetTimeHandler),

View File

@ -222,7 +222,7 @@ class DoSendTestMailHandler(TPBaseJsonHandler):
self.write_json(code, message=msg)
class DoSaveCfgSmtpHandler(TPBaseJsonHandler):
class DoSaveCfgHandler(TPBaseJsonHandler):
def post(self):
ret = self.check_privilege(TP_PRIVILEGE_SYS_CONFIG)
if ret != TPE_OK:
@ -237,22 +237,55 @@ class DoSaveCfgSmtpHandler(TPBaseJsonHandler):
return self.write_json(TPE_JSON_FORMAT)
try:
_server = args['server']
_port = int(args['port'])
_ssl = args['ssl']
_sender = args['sender']
_password = args['password']
if 'smtp' in args:
_cfg = args['smtp']
_server = _cfg['server']
_port = _cfg['port']
_ssl = _cfg['ssl']
_sender = _cfg['sender']
_password = _cfg['password']
err = system_model.save_config(self, '更新SMTP设置', 'smtp', _cfg)
if err == TPE_OK:
# 同时更新内存缓存
get_cfg().sys.smtp.server = _server
get_cfg().sys.smtp.port = _port
get_cfg().sys.smtp.ssl = _ssl
get_cfg().sys.smtp.sender = _sender
# 特殊处理,防止前端拿到密码
get_cfg().sys_smtp_password = _password
else:
return self.write_json(err)
if 'password' in args:
_cfg = args['password']
_allow_reset = _cfg['allow_reset']
_force_strong = _cfg['force_strong']
_timeout = _cfg['timeout']
err = system_model.save_config(self, '更新密码策略设置', 'password', _cfg)
if err == TPE_OK:
get_cfg().sys.password.allow_reset = _allow_reset
get_cfg().sys.password.force_strong = _force_strong
get_cfg().sys.password.timeout = _timeout
else:
return self.write_json(err)
if 'login' in args:
_cfg = args['login']
_session_timeout = _cfg['session_timeout']
_retry = _cfg['retry']
_lock_timeout = _cfg['lock_timeout']
_auth = _cfg['auth']
err = system_model.save_config(self, '更新登录策略设置', 'login', _cfg)
if err == TPE_OK:
get_cfg().sys.login.session_timeout = _session_timeout
get_cfg().sys.login.retry = _retry
get_cfg().sys.login.lock_timeout = _lock_timeout
get_cfg().sys.login.auth = _auth
else:
return self.write_json(err)
return self.write_json(TPE_OK)
except:
return self.write_json(TPE_PARAM)
# 调用Model模块来操作数据库
err = system_model.save_smtp_config(self, _server, _port, _ssl, _sender, _password)
if err == TPE_OK:
# 同时更新内存缓存
get_cfg().sys.smtp.server = _server
get_cfg().sys.smtp.port = _port
get_cfg().sys.smtp.ssl = _ssl
get_cfg().sys.smtp.sender = _sender
get_cfg().sys_smtp_password = _password
self.write_json(err)
log.e('\n')
self.write_json(TPE_FAILED)

View File

@ -8,33 +8,25 @@ from app.base.utils import tp_timestamp_utc_now
from . import syslog
def save_smtp_config(handler, _server, _port, _ssl, _sender, _password):
def save_config(handler, msg, name, value):
db = get_db()
_smtp = {
'server': _server,
'port': _port,
'ssl': _ssl,
'sender': _sender,
'password': _password
}
str_val = json.dumps(value, separators=(',', ':'))
str_smtp = json.dumps(_smtp, separators=(',', ':'))
sql = 'SELECT name FROM `{dbtp}config` WHERE name="smtp";'.format(dbtp=db.table_prefix)
sql = 'SELECT name FROM `{dbtp}config` WHERE name="{name}";'.format(dbtp=db.table_prefix, name=name)
db_ret = db.query(sql)
if db_ret is not None and len(db_ret) > 0:
sql = 'UPDATE `{dbtp}config` SET value={dbph} WHERE name="smtp";'.format(dbtp=db.table_prefix, dbph=db.place_holder)
db_ret = db.exec(sql, (str_smtp,))
sql = 'UPDATE `{dbtp}config` SET value={dbph} WHERE name="{name}";'.format(dbtp=db.table_prefix, dbph=db.place_holder, name=name)
db_ret = db.exec(sql, (str_val,))
else:
sql = 'INSERT INTO `{dbtp}config` (name, value) VALUES ("smtp", {dbph});'.format(dbtp=db.table_prefix, dbph=db.place_holder)
db_ret = db.exec(sql, (str_smtp,))
sql = 'INSERT INTO `{dbtp}config` (name, value) VALUES ("{name}", {dbph});'.format(dbtp=db.table_prefix, dbph=db.place_holder, name=name)
db_ret = db.exec(sql, (str_val,))
if not db_ret:
return TPE_DATABASE
operator = handler.get_current_user()
syslog.sys_log(operator, handler.request.remote_ip, TPE_OK, "更新SMTP设置")
syslog.sys_log(operator, handler.request.remote_ip, TPE_OK, msg)
return TPE_OK