mirror of
https://github.com/yhl452493373/frps-panel.git
synced 2026-04-04 14:27:00 +08:00
Compare commits
8 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e4d1caa4b9 | ||
|
|
1fdc0fc63a | ||
|
|
d09fc2fe91 | ||
|
|
70915e6e0e | ||
|
|
012a18ceb2 | ||
|
|
6ca0044dc3 | ||
|
|
9096585a34 | ||
|
|
11855f0917 |
2
Makefile
2
Makefile
@@ -5,4 +5,4 @@ build: frps-multiuser
|
|||||||
cp -r ./assets/ ./bin/assets/
|
cp -r ./assets/ ./bin/assets/
|
||||||
|
|
||||||
frps-multiuser:
|
frps-multiuser:
|
||||||
go build -o ./bin/frps-multiuser ./cmd/fp-multiuser
|
go build -o ./bin/frps-multiuser ./cmd/frps-multiuser
|
||||||
|
|||||||
@@ -9,16 +9,16 @@ copy: build
|
|||||||
cp -r ./assets/ ./release/assets/
|
cp -r ./assets/ ./release/assets/
|
||||||
|
|
||||||
build:
|
build:
|
||||||
env CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-darwin-amd64 ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=darwin GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-darwin-amd64 ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-freebsd-386 ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=freebsd GOARCH=386 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-freebsd-386 ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-freebsd-amd64 ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=freebsd GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-freebsd-amd64 ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-386 ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=linux GOARCH=386 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-386 ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-amd64 ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-amd64 ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-arm ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=linux GOARCH=arm go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-arm ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-arm64 ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=linux GOARCH=arm64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-arm64 ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-windows-386.exe ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=windows GOARCH=386 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-windows-386.exe ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-windows-amd64.exe ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=windows GOARCH=amd64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-windows-amd64.exe ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-mips64 ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=linux GOARCH=mips64 go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-mips64 ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-mips64le ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=linux GOARCH=mips64le go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-mips64le ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=linux GOARCH=mips GOMIPS=softfloat go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-mips ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=linux GOARCH=mips GOMIPS=softfloat go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-mips ./cmd/frps-multiuser
|
||||||
env CGO_ENABLED=0 GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-mipsle ./cmd/fp-multiuser
|
env CGO_ENABLED=0 GOOS=linux GOARCH=mipsle GOMIPS=softfloat go build -ldflags "$(LDFLAGS)" -o ./release/frps-multiuser-linux-mipsle ./cmd/frps-multiuser
|
||||||
@@ -28,6 +28,8 @@ frps-multiuser will run as one single process and accept HTTP requests from frps
|
|||||||
### Features
|
### Features
|
||||||
|
|
||||||
* Support multiple user authentication by tokens saved in file.
|
* Support multiple user authentication by tokens saved in file.
|
||||||
|
* Support dynamic `add`,`remove`,`disable` or `enable` user
|
||||||
|
* Limit `ports`,`domains` and `subdomains` for each user
|
||||||
|
|
||||||
### Download
|
### Download
|
||||||
|
|
||||||
@@ -136,4 +138,5 @@ If you have any issues or ideas, put it on [issues](https://github.com/yhl452493
|
|||||||
|
|
||||||
+ [frp](https://github.com/fatedier/frp)
|
+ [frp](https://github.com/fatedier/frp)
|
||||||
+ [fp-multiuser](https://github.com/gofrp/fp-multiuser)
|
+ [fp-multiuser](https://github.com/gofrp/fp-multiuser)
|
||||||
+ [layui](https://github.com/layui/layui)
|
+ [layui](https://github.com/layui/layui)
|
||||||
|
+ [layui-theme-dark](https://github.com/Sight-wcg/layui-theme-dark)
|
||||||
@@ -28,6 +28,8 @@ frps-multiuser 会以一个单独的进程运行,并接收 frps 发送过来
|
|||||||
### 功能
|
### 功能
|
||||||
|
|
||||||
* 通过配置文件配置所有支持的用户名和 Token,只允许匹配的 frpc 客户端登录。
|
* 通过配置文件配置所有支持的用户名和 Token,只允许匹配的 frpc 客户端登录。
|
||||||
|
* 动态`添加`、`删除`、`禁用`、`启用`用户
|
||||||
|
* 对每个用户进行`端口`、`域名`、`二级域名`限制
|
||||||
|
|
||||||
### 下载
|
### 下载
|
||||||
|
|
||||||
@@ -136,4 +138,5 @@ remote_port = 6000
|
|||||||
|
|
||||||
+ [frp](https://github.com/fatedier/frp)
|
+ [frp](https://github.com/fatedier/frp)
|
||||||
+ [fp-multiuser](https://github.com/gofrp/fp-multiuser)
|
+ [fp-multiuser](https://github.com/gofrp/fp-multiuser)
|
||||||
+ [layui](https://github.com/layui/layui)
|
+ [layui](https://github.com/layui/layui)
|
||||||
|
+ [layui-theme-dark](https://github.com/Sight-wcg/layui-theme-dark)
|
||||||
@@ -29,7 +29,8 @@
|
|||||||
"Other error": "Other error",
|
"Other error": "Other error",
|
||||||
"Param error": "Param error",
|
"Param error": "Param error",
|
||||||
"User exist": "User exist",
|
"User exist": "User exist",
|
||||||
"Token cannot be empty": "Token cannot be empty",
|
"User format error": "User cannot be empty or include space char. It only allowed alphanumeric and underline.",
|
||||||
|
"Token format error": "Token cannot be empty or include space char. It allow include those special char: _!@#$%^&*()",
|
||||||
"Please check at least one user": "Please Check at least one user",
|
"Please check at least one user": "Please Check at least one user",
|
||||||
"Operation confirm": "Operation confirm",
|
"Operation confirm": "Operation confirm",
|
||||||
"Empty data": "Empty data",
|
"Empty data": "Empty data",
|
||||||
|
|||||||
@@ -29,7 +29,8 @@
|
|||||||
"Other error": "其他异常",
|
"Other error": "其他异常",
|
||||||
"Param error": "参数异常",
|
"Param error": "参数异常",
|
||||||
"User exist": "用户已经存在",
|
"User exist": "用户已经存在",
|
||||||
"Token cannot be empty": "Token 不能为空",
|
"User format error": "用户不能为空或包含空格。只允许英文数字、字母、下划线",
|
||||||
|
"Token format error": "Token不能为空或包含空格。允许的特殊符号:_!@#$%^&*()",
|
||||||
"Please check at least one user": "请选中需要操作的用户",
|
"Please check at least one user": "请选中需要操作的用户",
|
||||||
"Operation confirm": "操作确认",
|
"Operation confirm": "操作确认",
|
||||||
"Empty data": "无数据",
|
"Empty data": "无数据",
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -6,6 +6,36 @@ $(function () {
|
|||||||
Disable: 3
|
Disable: 3
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* verify user value
|
||||||
|
* @param username
|
||||||
|
*/
|
||||||
|
function verifyUser(username) {
|
||||||
|
var valid = true;
|
||||||
|
if (username.trim() === '' || !/^\w+$/.test(username)) {
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
valid: valid,
|
||||||
|
trim: username
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* verify token value
|
||||||
|
* @param token
|
||||||
|
*/
|
||||||
|
function verifyToken(token) {
|
||||||
|
var valid = true;
|
||||||
|
if (token.trim() === '' || !/^[\w!@#$%^&*()]+$/.test(token)) {
|
||||||
|
valid = false;
|
||||||
|
}
|
||||||
|
return {
|
||||||
|
valid: valid,
|
||||||
|
trim: token.trim()
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* verify comment is valid
|
* verify comment is valid
|
||||||
* @param comment
|
* @param comment
|
||||||
@@ -120,15 +150,43 @@ $(function () {
|
|||||||
function langLoaded(lang) {
|
function langLoaded(lang) {
|
||||||
//set verify rules
|
//set verify rules
|
||||||
var verifyRules = {
|
var verifyRules = {
|
||||||
|
user: function (value, item) {
|
||||||
|
var result = verifyUser(value);
|
||||||
|
if (!result.valid) {
|
||||||
|
return lang['UserFormatError'];
|
||||||
|
}
|
||||||
|
if (item != null) {
|
||||||
|
if (typeof item === "function") {
|
||||||
|
item && item(result.trim);
|
||||||
|
} else {
|
||||||
|
$(item).val(result.trim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
token: function (value, item) {
|
||||||
|
var result = verifyToken(value);
|
||||||
|
if (!result.valid) {
|
||||||
|
return lang['TokenFormatError'];
|
||||||
|
}
|
||||||
|
if (item != null) {
|
||||||
|
if (typeof item === "function") {
|
||||||
|
item && item(result.trim);
|
||||||
|
} else {
|
||||||
|
$(item).val(result.trim);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
comment: function (value, item) {
|
comment: function (value, item) {
|
||||||
var result = verifyComment(value);
|
var result = verifyComment(value);
|
||||||
if (!result.valid) {
|
if (!result.valid) {
|
||||||
return lang['CommentInvalid'];
|
return lang['CommentInvalid'];
|
||||||
}
|
}
|
||||||
if (typeof item === "function") {
|
if (item != null) {
|
||||||
item && item(result.trim);
|
if (typeof item === "function") {
|
||||||
} else {
|
item && item(result.trim);
|
||||||
$(item).val(result.trim);
|
} else {
|
||||||
|
$(item).val(result.trim);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
ports: function (value, item) {
|
ports: function (value, item) {
|
||||||
@@ -136,10 +194,12 @@ $(function () {
|
|||||||
if (!result.valid) {
|
if (!result.valid) {
|
||||||
return lang['PortsInvalid'];
|
return lang['PortsInvalid'];
|
||||||
}
|
}
|
||||||
if (typeof item === "function") {
|
if (item != null) {
|
||||||
item && item(result.trim);
|
if (typeof item === "function") {
|
||||||
} else {
|
item && item(result.trim);
|
||||||
$(item).val(result.trim);
|
} else {
|
||||||
|
$(item).val(result.trim);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
domains: function (value, item) {
|
domains: function (value, item) {
|
||||||
@@ -147,10 +207,12 @@ $(function () {
|
|||||||
if (!result.valid) {
|
if (!result.valid) {
|
||||||
return lang['DomainsInvalid'];
|
return lang['DomainsInvalid'];
|
||||||
}
|
}
|
||||||
if (typeof item === "function") {
|
if (item != null) {
|
||||||
item && item(result.trim);
|
if (typeof item === "function") {
|
||||||
} else {
|
item && item(result.trim);
|
||||||
$(item).val(result.trim);
|
} else {
|
||||||
|
$(item).val(result.trim);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
subdomains: function (value, item) {
|
subdomains: function (value, item) {
|
||||||
@@ -158,14 +220,20 @@ $(function () {
|
|||||||
if (!result.valid) {
|
if (!result.valid) {
|
||||||
return lang['SubdomainsInvalid'];
|
return lang['SubdomainsInvalid'];
|
||||||
}
|
}
|
||||||
if (typeof item === "function") {
|
if (item != null) {
|
||||||
item && item(result.trim);
|
if (typeof item === "function") {
|
||||||
} else {
|
item && item(result.trim);
|
||||||
$(item).val(result.trim);
|
} else {
|
||||||
|
$(item).val(result.trim);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
layui.form.verify(verifyRules);
|
|
||||||
|
layui.form.set({
|
||||||
|
verIncludeRequired: true,
|
||||||
|
verify: verifyRules
|
||||||
|
});
|
||||||
|
|
||||||
layui.table.render({
|
layui.table.render({
|
||||||
elem: '#tokenTable',
|
elem: '#tokenTable',
|
||||||
@@ -217,8 +285,11 @@ $(function () {
|
|||||||
var after = $.extend(true, {}, obj.data);
|
var after = $.extend(true, {}, obj.data);
|
||||||
var verifyMsg = false;
|
var verifyMsg = false;
|
||||||
if (field === 'token') {
|
if (field === 'token') {
|
||||||
if (value.trim() === '') {
|
verifyMsg = verifyRules.token(value, function (trim) {
|
||||||
layui.layer.msg(lang['TokenEmpty'])
|
updateTableField(obj, field, trim)
|
||||||
|
});
|
||||||
|
if (verifyMsg) {
|
||||||
|
layui.layer.msg(verifyMsg);
|
||||||
return obj.reedit();
|
return obj.reedit();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -318,7 +389,7 @@ $(function () {
|
|||||||
btn: [lang['Confirm'], lang['Cancel']],
|
btn: [lang['Confirm'], lang['Cancel']],
|
||||||
btn1: function (index) {
|
btn1: function (index) {
|
||||||
if (layui.form.validate('#addUserForm')) {
|
if (layui.form.validate('#addUserForm')) {
|
||||||
add(layui.form.val('addUserForm'), index)
|
add(layui.form.val('addUserForm'), index);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
btn2: function (index) {
|
btn2: function (index) {
|
||||||
@@ -540,6 +611,12 @@ $(function () {
|
|||||||
reason = lang['ParamError'];
|
reason = lang['ParamError'];
|
||||||
else if (result.code === 2)
|
else if (result.code === 2)
|
||||||
reason = lang['UserExist'];
|
reason = lang['UserExist'];
|
||||||
|
else if (result.code === 3)
|
||||||
|
reason = lang['ParamError'];
|
||||||
|
else if (result.code === 4)
|
||||||
|
reason = lang['UserFormatError'];
|
||||||
|
else if (result.code === 5)
|
||||||
|
reason = lang['TokenFormatError'];
|
||||||
layui.layer.msg(lang['OperateFailed'] + ',' + reason)
|
layui.layer.msg(lang['OperateFailed'] + ',' + reason)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -24,7 +24,7 @@
|
|||||||
<div class="layui-input-prefix">
|
<div class="layui-input-prefix">
|
||||||
<i class="layui-icon layui-icon-username"></i>
|
<i class="layui-icon layui-icon-username"></i>
|
||||||
</div>
|
</div>
|
||||||
<input type="text" name="user" value="" placeholder="${ .User }" class="layui-input" autocomplete="off"
|
<input type="text" name="user" placeholder="${ .User }" class="layui-input" autocomplete="off"
|
||||||
lay-affix="clear">
|
lay-affix="clear">
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@@ -73,21 +73,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</script>
|
</script>
|
||||||
<script type="text/html" id="addTemplate">
|
<script type="text/html" id="addTemplate">
|
||||||
<div class="layui-form" id="addUserForm" lay-filter="addUserForm">
|
<form class="layui-form" id="addUserForm" lay-filter="addUserForm">
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">${ .User }</label>
|
<label class="layui-form-label">${ .User }</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="text" name="user" placeholder="${ .PleaseInputUserAccount }" autocomplete="off"
|
<input type="text" name="user" lay-verify="user" placeholder="${ .PleaseInputUserAccount }"
|
||||||
class="layui-input"
|
autocomplete="off" class="layui-input"/>
|
||||||
lay-verify="required">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item">
|
<div class="layui-form-item">
|
||||||
<label class="layui-form-label">${ .Token }</label>
|
<label class="layui-form-label">${ .Token }</label>
|
||||||
<div class="layui-input-block">
|
<div class="layui-input-block">
|
||||||
<input type="text" name="token" lay-verify="required" placeholder="${ .PleaseInputUserToken }"
|
<input type="text" name="token" lay-verify="token" placeholder="${ .PleaseInputUserToken }"
|
||||||
class="layui-input"
|
autocomplete="off" class="layui-input"/>
|
||||||
autocomplete="off">
|
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="layui-form-item layui-form-text">
|
<div class="layui-form-item layui-form-text">
|
||||||
@@ -118,7 +116,7 @@
|
|||||||
autocomplete="off" class="layui-textarea"></textarea>
|
autocomplete="off" class="layui-textarea"></textarea>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</form>
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
@@ -15,12 +15,16 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
const (
|
const (
|
||||||
Success = 0
|
Success = 0
|
||||||
ParamError = 1
|
ParamError = 1
|
||||||
UserExist = 2
|
UserExist = 2
|
||||||
SaveError = 3
|
SaveError = 3
|
||||||
|
UserFormatError = 4
|
||||||
|
TokenFormatError = 5
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var UserFormatReg = regexp.MustCompile("^\\w$")
|
||||||
|
var TokenFormatReg = regexp.MustCompile("^[\\w!@#$%^&*()]+$")
|
||||||
var TrimAllSpaceReg = regexp.MustCompile("[\\n\\t\\r\\s]")
|
var TrimAllSpaceReg = regexp.MustCompile("[\\n\\t\\r\\s]")
|
||||||
var TrimBreakLineReg = regexp.MustCompile("[\\n\\t\\r]")
|
var TrimBreakLineReg = regexp.MustCompile("[\\n\\t\\r]")
|
||||||
|
|
||||||
@@ -210,7 +214,8 @@ func (c *HandleController) MakeLangFunc() func(context *gin.Context) {
|
|||||||
"OperateError": ginI18n.MustGetMessage(context, "Operate error"),
|
"OperateError": ginI18n.MustGetMessage(context, "Operate error"),
|
||||||
"OperateFailed": ginI18n.MustGetMessage(context, "Operate failed"),
|
"OperateFailed": ginI18n.MustGetMessage(context, "Operate failed"),
|
||||||
"UserExist": ginI18n.MustGetMessage(context, "User exist"),
|
"UserExist": ginI18n.MustGetMessage(context, "User exist"),
|
||||||
"TokenEmpty": ginI18n.MustGetMessage(context, "Token cannot be empty"),
|
"UserFormatError": ginI18n.MustGetMessage(context, "User format error"),
|
||||||
|
"TokenFormatError": ginI18n.MustGetMessage(context, "Token format error"),
|
||||||
"ShouldCheckUser": ginI18n.MustGetMessage(context, "Please check at least one user"),
|
"ShouldCheckUser": ginI18n.MustGetMessage(context, "Please check at least one user"),
|
||||||
"OperationConfirm": ginI18n.MustGetMessage(context, "Operation confirm"),
|
"OperationConfirm": ginI18n.MustGetMessage(context, "Operation confirm"),
|
||||||
"EmptyData": ginI18n.MustGetMessage(context, "Empty data"),
|
"EmptyData": ginI18n.MustGetMessage(context, "Empty data"),
|
||||||
@@ -221,6 +226,7 @@ func (c *HandleController) MakeLangFunc() func(context *gin.Context) {
|
|||||||
"DomainsInvalid": ginI18n.MustGetMessage(context, "Domains is invalid"),
|
"DomainsInvalid": ginI18n.MustGetMessage(context, "Domains is invalid"),
|
||||||
"SubdomainsInvalid": ginI18n.MustGetMessage(context, "Subdomains is invalid"),
|
"SubdomainsInvalid": ginI18n.MustGetMessage(context, "Subdomains is invalid"),
|
||||||
"CommentInvalid": ginI18n.MustGetMessage(context, "Comment is invalid"),
|
"CommentInvalid": ginI18n.MustGetMessage(context, "Comment is invalid"),
|
||||||
|
"ParamError": ginI18n.MustGetMessage(context, "Param error"),
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -313,6 +319,14 @@ func (c *HandleController) MakeAddTokenFunc() func(context *gin.Context) {
|
|||||||
context.JSON(http.StatusOK, &response)
|
context.JSON(http.StatusOK, &response)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if !UserFormatReg.MatchString(info.User) {
|
||||||
|
log.Printf("user add failed, user format error")
|
||||||
|
response.Success = false
|
||||||
|
response.Code = UserFormatError
|
||||||
|
response.Message = fmt.Sprintf("user add failed, user format error")
|
||||||
|
context.JSON(http.StatusOK, &response)
|
||||||
|
return
|
||||||
|
}
|
||||||
if _, exist := c.Tokens[info.User]; exist {
|
if _, exist := c.Tokens[info.User]; exist {
|
||||||
log.Printf("user add failed, user [%v] exist", info.User)
|
log.Printf("user add failed, user [%v] exist", info.User)
|
||||||
response.Success = false
|
response.Success = false
|
||||||
@@ -321,6 +335,16 @@ func (c *HandleController) MakeAddTokenFunc() func(context *gin.Context) {
|
|||||||
context.JSON(http.StatusOK, &response)
|
context.JSON(http.StatusOK, &response)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
if !TokenFormatReg.MatchString(info.Token) {
|
||||||
|
log.Printf("user add failed, token format error")
|
||||||
|
response.Success = false
|
||||||
|
response.Code = TokenFormatError
|
||||||
|
response.Message = fmt.Sprintf("user add failed, token format error")
|
||||||
|
context.JSON(http.StatusOK, &response)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
replaceSpaceToken := TrimAllSpaceReg.ReplaceAllString(info.Token, "")
|
||||||
|
info.Token = replaceSpaceToken
|
||||||
c.Tokens[info.User] = info
|
c.Tokens[info.User] = info
|
||||||
|
|
||||||
usersSection, _ := c.IniFile.GetSection("users")
|
usersSection, _ := c.IniFile.GetSection("users")
|
||||||
@@ -388,7 +412,18 @@ func (c *HandleController) MakeUpdateTokensFunc() func(context *gin.Context) {
|
|||||||
comment := TrimBreakLineReg.ReplaceAllString(after.Comment, "")
|
comment := TrimBreakLineReg.ReplaceAllString(after.Comment, "")
|
||||||
after.Comment = comment
|
after.Comment = comment
|
||||||
key.Comment = comment
|
key.Comment = comment
|
||||||
key.SetValue(after.Token)
|
|
||||||
|
if !TokenFormatReg.MatchString(after.Token) {
|
||||||
|
log.Printf("update failed, token format error")
|
||||||
|
response.Success = false
|
||||||
|
response.Code = TokenFormatError
|
||||||
|
response.Message = "user update failed, token format error "
|
||||||
|
context.JSON(http.StatusOK, &response)
|
||||||
|
return
|
||||||
|
}
|
||||||
|
replaceSpaceToken := TrimAllSpaceReg.ReplaceAllString(after.Token, "")
|
||||||
|
after.Token = replaceSpaceToken
|
||||||
|
key.SetValue(replaceSpaceToken)
|
||||||
|
|
||||||
if before.Ports != after.Ports {
|
if before.Ports != after.Ports {
|
||||||
portsSection, _ := c.IniFile.GetSection("ports")
|
portsSection, _ := c.IniFile.GetSection("ports")
|
||||||
|
|||||||
Reference in New Issue
Block a user