Code optimization

This commit is contained in:
刘河
2019-03-29 10:41:57 +08:00
parent 4b0aebd6a5
commit cc6d053b6d
32 changed files with 357 additions and 289 deletions

View File

@@ -5,6 +5,7 @@ import (
"github.com/cnlh/nps/lib/file"
"github.com/cnlh/nps/lib/rate"
"github.com/cnlh/nps/server"
"github.com/cnlh/nps/vender/github.com/astaxie/beego"
)
type ClientController struct {
@@ -26,7 +27,7 @@ func (s *ClientController) List() {
} else {
clientId = clientIdSession.(int)
}
list, cnt := server.GetClientList(start, length, s.GetString("search"), clientId)
list, cnt := server.GetClientList(start, length, s.GetString("search"), s.GetString("sort"), s.GetString("order"), clientId)
s.AjaxTable(list, cnt, cnt)
}
@@ -51,6 +52,8 @@ func (s *ClientController) Add() {
ConfigConnAllow: s.GetBoolNoErr("config_conn_allow"),
RateLimit: s.GetIntNoErr("rate_limit"),
MaxConn: s.GetIntNoErr("max_conn"),
WebUserName: s.GetString("web_username"),
WebPassword: s.GetString("web_password"),
Flow: &file.Flow{
ExportFlow: 0,
InletFlow: 0,
@@ -98,20 +101,29 @@ func (s *ClientController) Edit() {
if c, err := file.GetCsvDb().GetClient(id); err != nil {
s.error()
} else {
if !file.GetCsvDb().VerifyVkey(s.GetString("vkey"), c.Id) {
s.AjaxErr("Vkey duplicate, please reset")
if s.GetString("web_username") != "" {
if s.GetString("web_username") == beego.AppConfig.String("web_username") || !file.GetCsvDb().VerifyUserName(s.GetString("web_username"), c.Id) {
s.AjaxErr("web login username duplicate, please reset")
return
}
}
if s.GetSession("isAdmin").(bool) {
if !file.GetCsvDb().VerifyVkey(s.GetString("vkey"), c.Id) {
s.AjaxErr("Vkey duplicate, please reset")
return
}
c.VerifyKey = s.GetString("vkey")
c.Flow.FlowLimit = int64(s.GetIntNoErr("flow_limit"))
c.RateLimit = s.GetIntNoErr("rate_limit")
c.MaxConn = s.GetIntNoErr("max_conn")
}
c.VerifyKey = s.GetString("vkey")
c.Remark = s.GetString("remark")
c.Cnf.U = s.GetString("u")
c.Cnf.P = s.GetString("p")
c.Cnf.Compress = common.GetBoolByStr(s.GetString("compress"))
c.Cnf.Crypt = s.GetBoolNoErr("crypt")
if s.GetSession("isAdmin").(bool) {
c.Flow.FlowLimit = int64(s.GetIntNoErr("flow_limit"))
c.RateLimit = s.GetIntNoErr("rate_limit")
c.MaxConn = s.GetIntNoErr("max_conn")
}
c.WebUserName = s.GetString("web_username")
c.WebPassword = s.GetString("web_password")
c.ConfigConnAllow = s.GetBoolNoErr("config_conn_allow")
if c.Rate != nil {
c.Rate.Stop()
@@ -148,7 +160,7 @@ func (s *ClientController) Del() {
if err := file.GetCsvDb().DelClient(id); err != nil {
s.AjaxErr("delete error")
}
server.DelTunnelAndHostByClientId(id)
server.DelTunnelAndHostByClientId(id, false)
server.DelClientConnect(id)
s.AjaxOk("delete success")
}

View File

@@ -93,7 +93,7 @@ func (s *IndexController) Add() {
Port: s.GetIntNoErr("port"),
ServerIp: s.GetString("server_ip"),
Mode: s.GetString("type"),
Target: s.GetString("target"),
Target: &file.Target{TargetStr: s.GetString("target")},
Id: int(file.GetCsvDb().GetTaskId()),
Status: true,
Remark: s.GetString("remark"),
@@ -145,29 +145,30 @@ func (s *IndexController) Edit() {
if t, err := file.GetCsvDb().GetTask(id); err != nil {
s.error()
} else {
var portChange bool
if client, err := file.GetCsvDb().GetClient(s.GetIntNoErr("client_id")); err != nil {
s.AjaxErr("modified error,the client is not exist")
return
} else {
t.Client = client
}
if s.GetIntNoErr("port") != t.Port {
portChange = true
if !tool.TestServerPort(s.GetIntNoErr("port"), t.Mode) {
s.AjaxErr("The port cannot be opened because it may has been occupied or is no longer allowed.")
return
}
t.Port = s.GetIntNoErr("port")
}
t.ServerIp = s.GetString("server_ip")
t.Mode = s.GetString("type")
t.Target = s.GetString("target")
t.Target = &file.Target{TargetStr: s.GetString("target")}
t.Password = s.GetString("password")
t.Id = id
t.LocalPath = s.GetString("local_path")
t.StripPre = s.GetString("strip_pre")
t.Remark = s.GetString("remark")
if portChange && !tool.TestServerPort(t.Port, t.Mode) {
s.AjaxErr("The port cannot be opened because it may has been occupied or is no longer allowed.")
}
if t.Client, err = file.GetCsvDb().GetClient(s.GetIntNoErr("client_id")); err != nil {
s.AjaxErr("modified error")
}
file.GetCsvDb().UpdateTask(t)
server.StopServer(t.Id)
server.StartTask(t.Id)
t.TargetArr = nil
}
s.AjaxOk("modified success")
}
@@ -243,7 +244,7 @@ func (s *IndexController) AddHost() {
h := &file.Host{
Id: int(file.GetCsvDb().GetHostId()),
Host: s.GetString("host"),
Target: s.GetString("target"),
Target: &file.Target{TargetStr: s.GetString("target")},
HeaderChange: s.GetString("header"),
HostChange: s.GetString("hostchange"),
Remark: s.GetString("remark"),
@@ -277,20 +278,29 @@ func (s *IndexController) EditHost() {
if h, err := file.GetCsvDb().GetHostById(id); err != nil {
s.error()
} else {
if h.Host != s.GetString("host") {
tmpHost := new(file.Host)
tmpHost.Host = s.GetString("host")
tmpHost.Location = s.GetString("location")
tmpHost.Scheme = s.GetString("scheme")
if file.GetCsvDb().IsHostExist(tmpHost) {
s.AjaxErr("host has exist")
return
}
}
if client, err := file.GetCsvDb().GetClient(s.GetIntNoErr("client_id")); err != nil {
s.AjaxErr("modified error,the client is not exist")
} else {
h.Client = client
}
h.Host = s.GetString("host")
h.Target = s.GetString("target")
h.Target = &file.Target{TargetStr: s.GetString("target")}
h.HeaderChange = s.GetString("header")
h.HostChange = s.GetString("hostchange")
h.Remark = s.GetString("remark")
h.TargetArr = nil
h.Location = s.GetString("location")
h.Scheme = s.GetString("scheme")
file.GetCsvDb().StoreHostToCsv()
var err error
if h.Client, err = file.GetCsvDb().GetClient(s.GetIntNoErr("client_id")); err != nil {
s.AjaxErr("modified error")
}
h.TargetArr = nil
}
s.AjaxOk("modified success")
}

View File

@@ -23,13 +23,25 @@ func (self *LoginController) Verify() {
server.Bridge.Register.Store(common.GetIpByAddr(self.Ctx.Request.RemoteAddr), time.Now().Add(time.Hour*time.Duration(2)))
}
b, err := beego.AppConfig.Bool("allow_user_login")
if err == nil && b && self.GetString("username") == "user" && !auth {
if err == nil && b && !auth {
file.GetCsvDb().Clients.Range(func(key, value interface{}) bool {
v := value.(*file.Client)
if v.VerifyKey == self.GetString("password") && v.Status {
if !v.Status || v.NoDisplay {
return true
}
if v.WebUserName == "" && v.WebPassword == "" {
if self.GetString("username") != "user" || v.VerifyKey != self.GetString("password") {
return true
} else {
auth = true
}
}
if !auth && v.WebPassword == self.GetString("password") && self.GetString("username") == v.WebUserName {
auth = true
}
if auth {
self.SetSession("isAdmin", false)
self.SetSession("clientId", v.Id)
auth = true
return false
}
return true

View File

@@ -60,6 +60,20 @@
<span class="help-block m-b-none">unique, non-filling will be generated automatically</span>
</div>
</div>
<div class="form-group" id="web_username">
<label class="control-label col-sm-2" langtag="info-client-web-username">web登陆用户名</label>
<div class="col-sm-10">
<input class="form-control" type="text" name="web_username"
placeholder="empty means to be unrestricted">
</div>
</div>
<div class="form-group" id="web_password">
<label class="control-label col-sm-2" langtag="info-client-web-password">web登陆密码</label>
<div class="col-sm-10">
<input class="form-control" type="text" name="web_password"
placeholder="empty means to be unrestricted">
</div>
</div>
<div class="form-group" id="config_conn_allow">
<label class="control-label col-sm-2" langtag="info-config-conn-allow">是否允许客户端以配置文件模式连接</label>
<div class="col-sm-10">

View File

@@ -54,6 +54,7 @@
<span class="help-block m-b-none">only socks5 , web, HTTP forward proxy </span>
</div>
</div>
{{if eq true .isAdmin}}
<div class="form-group" id="vkey">
<label class="control-label col-sm-2" langtag="info-client-vkey">客户端验证密钥</label>
<div class="col-sm-10">
@@ -62,6 +63,21 @@
<span class="help-block m-b-none">unique, non-filling will be generated automatically</span>
</div>
</div>
{{end}}
<div class="form-group" id="web_username">
<label class="control-label col-sm-2" langtag="info-client-web-username">web登陆用户名</label>
<div class="col-sm-10">
<input class="form-control" value="{{.c.WebUserName}}" type="text" name="web_username"
placeholder="empty means to be unrestricted">
</div>
</div>
<div class="form-group" id="web_password">
<label class="control-label col-sm-2" langtag="info-client-web-password">web登陆密码</label>
<div class="col-sm-10">
<input class="form-control" value="{{.c.WebPassword}}" type="text" name="web_password"
placeholder="empty means to be unrestricted">
</div>
</div>
<div class="form-group" id="config_conn_allow">
<label class="control-label col-sm-2" langtag="info-config-conn-allow">是否允许客户端以配置文件模式连接</label>
<div class="col-sm-10">
@@ -93,7 +109,7 @@
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-success" href="#" id="add"><i
class="fa fa-fw fa-lg fa-eye"></i>新增
class="fa fa-fw fa-lg fa-eye"></i><span langtag="info-save">保存</span>
</button>
</div>
</div>

View File

@@ -127,6 +127,8 @@
+ '<b langtag="info-now-conn-num">当前连接数</b>' + row.NowConn + `&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp`
+ '<b langtag="info-flow-limit">流量限制</b>' + row.Flow.FlowLimit + `m&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp`
+ '<b langtag="info-rate-limit">带宽限制</b>' + row.RateLimit + `kb/s&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp`
+ '<b langtag="info-client-web-username">web登陆用户名</b>' + row.WebUserName + `&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp`
+ '<b langtag="info-client-web-password">web登陆密码</b>' + row.WebPassword + `&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp`
+ `&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp` + "<br/><br>"
+ '<b langtag="info-crypt">加密</b>' + row.Cnf.Crypt + `&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp`
+ '<b langtag="info-compress">压缩</b>' + row.Cnf.Compress + `&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp&nbsp`
@@ -141,19 +143,16 @@
field: 'Id',//域值
title: 'id',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Remark',//域值
title: 'remark',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'VerifyKey',//域值
title: 'vkey',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
if (!row.NoStore) {
return value
@@ -166,10 +165,9 @@
field: 'Addr',//域值
title: 'client addr',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Addr',//域值
field: 'InletFlow',//域值
title: 'in flow',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
@@ -178,7 +176,7 @@
}
},
{
field: 'Addr',//域值
field: 'ExportFlow',//域值
title: 'out flow',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
@@ -190,7 +188,6 @@
field: 'IsConnect',//域值
title: 'speed',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
return change(row.Rate.NowRate) + "/S"
}
@@ -199,7 +196,6 @@
field: 'Status',//域值
title: 'run',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
if (value) {
return '<span class="badge badge-primary">open</span>'
@@ -212,7 +208,6 @@
field: 'IsConnect',//域值
title: 'status',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
if (value) {
return '<span class="badge badge-primary">online</span>'
@@ -225,7 +220,6 @@
field: 'option',//域值
title: 'option',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
btn_group = '<div class="btn-group">'
btn = `{{if eq true .isAdmin}}<button onclick="del(` + row.Id + `)" class="btn-danger"><i class="fa fa-trash"></i></button>{{end}}<button onclick="edit(` + row.Id + `)" class="btn-primary"><i class="fa fa-edit"></i></button></div>`
@@ -241,7 +235,6 @@
field: 'show',//域值
title: 'show',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
return `<button onclick="tunnel(` + row.Id + `)" class="btn-info">tunnel</button><button onclick="host(` + row.Id + `)" class="btn-primary">host</button>`
}

View File

@@ -46,7 +46,7 @@
<label class="col-sm-2 control-label" langtag="info-target">内网目标(ip:端口)</label>
<div class="col-sm-10">
<textarea class="form-control" name="target" rows="4" placeholder="10.1.50.203:22
10.1.50.202:22">{{.t.Target}}</textarea>
10.1.50.202:22">{{.t.Target.TargetStr}}</textarea>
<span class="help-block m-b-none">can only fill in ports if it is local machine proxy, only tcp supports load balancing
</span></div>
@@ -89,7 +89,7 @@
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
<button class="btn btn-success" href="#" id="add"><i
class="fa fa-fw fa-lg fa-eye"></i>新增
class="fa fa-fw fa-lg fa-eye"></i><span langtag="info-save">保存</span>
</button>
</div>
</div>

View File

@@ -49,7 +49,7 @@
<textarea class="form-control" rows="4" type="text" name="target"
placeholder="such as
10.1.50.203:80
10.1.50.202:80">{{.h.Target}}</textarea>
10.1.50.202:80">{{.h.Target.TargetStr}}</textarea>
<span class="help-block m-b-none">Line break if load balancing</span>
</div>
@@ -74,7 +74,7 @@
<div class="form-group">
<div class="col-sm-4 col-sm-offset-2">
&nbsp;<button class="btn btn-success" href="#" id="add"><i
class="fa fa-fw fa-lg fa-eye"></i>新增
class="fa fa-fw fa-lg fa-eye"></i><span langtag="info-save">保存</span>
</button>
</div>
</div>

View File

@@ -77,13 +77,13 @@
field: 'Id',//域值
title: 'id',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Id',//域值
title: 'client id',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
return row.Client.Id
}
@@ -92,37 +92,40 @@
field: 'Remark',//域值
title: 'remark',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Host',//域值
title: 'host',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Scheme',//域值
title: 'scheme',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Target',//域值
title: 'target',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
return row.Target.TargetStr
}
},
{
field: 'Location',//域值
title: 'location',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: '',//域值
title: 'client status',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
if (row.Client.IsConnect) {
return '<span class="badge badge-primary">online</span>'
@@ -135,7 +138,7 @@
field: 'option',//域值
title: 'option',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
btn_group = '<div class="btn-group">'
btn = `<button onclick="del(` + row.Id + `)" class="btn-danger"><i class="fa fa-trash"></i></button><button onclick="edit(` + row.Id + `)" class="btn-primary"><i class="fa fa-edit"></i></button></div>`

View File

@@ -76,13 +76,11 @@
field: 'Id',//域值
title: 'id',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Id',//域值
title: 'client id',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
return row.Client.Id
}
@@ -91,37 +89,36 @@
field: 'Remark',//域值
title: 'remark',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Mode',//域值
title: 'mode',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Port',//域值
title: 'port',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Target',//域值
title: 'target',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
return row.Target.TargetStr
}
},
{
field: 'Password',//域值
title: 'secret',//标题
visible: true,//false表示不显示
sortable: true,//启用排序
},
{
field: 'Status',//域值
title: 'setting',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
if (value) {
return '<span class="badge badge-primary">open</span>'
@@ -134,7 +131,7 @@
field: 'RunStatus',//域值
title: 'run',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
if (value) {
return '<span class="badge badge-primary">open</span>'
@@ -147,7 +144,7 @@
field: '',//域值
title: 'client',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
if (row.Client.IsConnect) {
return '<span class="badge badge-primary">online</span>'
@@ -160,7 +157,7 @@
field: 'option',//域值
title: 'option',//内容
visible: true,//false表示不显示
sortable: true,//启用排序
formatter: function (value, row, index) {
btn_group = '<div class="btn-group">'
btn = `<button onclick="del(` + row.Id + `)" class="btn-danger"><i class="fa fa-trash"></i></button><button onclick="edit(` + row.Id + `)" class="btn-primary"><i class="fa fa-edit"></i></button></div>`