Skip to content

Commit 3b937ee

Browse files
committed
feat: add ip whitelist
1 parent 7a9aa3a commit 3b937ee

File tree

17 files changed

+1026
-927
lines changed

17 files changed

+1026
-927
lines changed

api/user/auth.go

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -2,45 +2,64 @@ package user
22

33
import (
44
"github.com/0xJacky/Nginx-UI/api"
5-
"github.com/0xJacky/Nginx-UI/model"
5+
"github.com/0xJacky/Nginx-UI/internal/logger"
6+
"github.com/0xJacky/Nginx-UI/internal/user"
7+
"github.com/gin-gonic/gin"
8+
"github.com/pkg/errors"
69
"net/http"
710
"time"
8-
9-
"github.com/gin-gonic/gin"
10-
"golang.org/x/crypto/bcrypt"
1111
)
1212

1313
type LoginUser struct {
1414
Name string `json:"name" binding:"required,max=255"`
1515
Password string `json:"password" binding:"required,max=255"`
1616
}
1717

18+
const (
19+
ErrPasswordIncorrect = 4031
20+
ErrMaxAttempts = 4291
21+
ErrUserBanned = 4033
22+
)
23+
1824
type LoginResponse struct {
1925
Message string `json:"message"`
20-
Token string `json:"token"`
26+
Error string `json:"error,omitempty"`
27+
Code int `json:"code"`
28+
Token string `json:"token,omitempty"`
2129
}
2230

2331
func Login(c *gin.Context) {
24-
var user LoginUser
25-
ok := api.BindAndValid(c, &user)
32+
var json LoginUser
33+
ok := api.BindAndValid(c, &json)
2634
if !ok {
2735
return
2836
}
2937

30-
u, _ := model.GetUser(user.Name)
31-
32-
if err := bcrypt.CompareHashAndPassword([]byte(u.Password), []byte(user.Password)); err != nil {
38+
u, err := user.Login(json.Name, json.Password)
39+
if err != nil {
3340
time.Sleep(5 * time.Second)
34-
c.JSON(http.StatusForbidden, gin.H{
35-
"message": "The username or password is incorrect",
36-
})
41+
switch {
42+
case errors.Is(err, user.ErrPasswordIncorrect):
43+
c.JSON(http.StatusForbidden, LoginResponse{
44+
Message: "Password incorrect",
45+
Code: ErrPasswordIncorrect,
46+
})
47+
case errors.Is(err, user.ErrUserBanned):
48+
c.JSON(http.StatusForbidden, LoginResponse{
49+
Message: "The user is banned",
50+
Code: ErrUserBanned,
51+
})
52+
default:
53+
api.ErrHandler(c, err)
54+
}
3755
return
3856
}
3957

40-
token, err := model.GenerateJWT(u.Name)
58+
logger.Info("[User Login]", u.Name)
59+
token, err := user.GenerateJWT(u.Name)
4160
if err != nil {
42-
c.JSON(http.StatusInternalServerError, gin.H{
43-
"message": err.Error(),
61+
c.JSON(http.StatusInternalServerError, LoginResponse{
62+
Message: err.Error(),
4463
})
4564
return
4665
}
@@ -54,7 +73,7 @@ func Login(c *gin.Context) {
5473
func Logout(c *gin.Context) {
5574
token := c.GetHeader("Authorization")
5675
if token != "" {
57-
err := model.DeleteToken(token)
76+
err := user.DeleteToken(token)
5877
if err != nil {
5978
c.JSON(http.StatusInternalServerError, gin.H{
6079
"message": err.Error(),

api/user/casdoor.go

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@ package user
33
import (
44
"fmt"
55
"github.com/0xJacky/Nginx-UI/api"
6-
"github.com/0xJacky/Nginx-UI/model"
6+
"github.com/0xJacky/Nginx-UI/internal/user"
77
"github.com/0xJacky/Nginx-UI/settings"
88
"github.com/casdoor/casdoor-go-sdk/casdoorsdk"
99
"github.com/gin-gonic/gin"
@@ -53,7 +53,7 @@ func CasdoorCallback(c *gin.Context) {
5353
return
5454
}
5555

56-
u, err := model.GetUser(claims.Name)
56+
u, err := user.GetUser(claims.Name)
5757
if err != nil {
5858
if errors.Is(err, gorm.ErrRecordNotFound) {
5959
c.JSON(http.StatusForbidden, gin.H{
@@ -65,7 +65,7 @@ func CasdoorCallback(c *gin.Context) {
6565
return
6666
}
6767

68-
userToken, err := model.GenerateJWT(u.Name)
68+
userToken, err := user.GenerateJWT(u.Name)
6969
if err != nil {
7070
api.ErrHandler(c, err)
7171
return

app/.eslintrc.cjs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ module.exports = {
88
'plugin:vue/vue3-recommended',
99
'plugin:import/recommended',
1010
'plugin:import/typescript',
11-
'plugin:promise/recommended',
1211
'plugin:sonarjs/recommended',
1312
'plugin:@typescript-eslint/recommended',
1413

app/package.json

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
"version": "2.0.0-beta.25",
44
"type": "module",
55
"scripts": {
6-
"dev": "vite",
6+
"dev": "vite --host",
77
"typecheck": "vue-tsc --noEmit",
88
"lint": "eslint . -c .eslintrc.cjs --fix --ext .ts,.vue,.tsx,.d.ts",
99
"build": "vite build",
@@ -13,17 +13,17 @@
1313
"dependencies": {
1414
"@ant-design/icons-vue": "^7.0.1",
1515
"@formkit/auto-animate": "^0.8.2",
16-
"@vue/reactivity": "^3.4.29",
17-
"@vue/shared": "^3.4.29",
16+
"@vue/reactivity": "^3.4.33",
17+
"@vue/shared": "^3.4.33",
1818
"@vueuse/core": "^10.11.0",
1919
"@xterm/addon-attach": "^0.11.0",
2020
"@xterm/addon-fit": "^0.10.0",
2121
"@xterm/xterm": "^5.5.0",
2222
"ant-design-vue": "^4.2.3",
23-
"apexcharts": "^3.49.1",
23+
"apexcharts": "^3.50.0",
2424
"axios": "^1.7.2",
25-
"dayjs": "^1.11.11",
26-
"highlight.js": "^11.9.0",
25+
"dayjs": "^1.11.12",
26+
"highlight.js": "^11.10.0",
2727
"lodash": "^4.17.21",
2828
"marked": "^10.0.0",
2929
"nprogress": "^0.2.0",
@@ -32,42 +32,42 @@
3232
"reconnecting-websocket": "^4.4.0",
3333
"sortablejs": "^1.15.2",
3434
"vite-plugin-build-id": "^0.2.9",
35-
"vue": "^3.4.29",
35+
"vue": "^3.4.33",
3636
"vue-github-button": "github:0xJacky/vue-github-button",
37-
"vue-router": "^4.3.3",
37+
"vue-router": "^4.4.0",
3838
"vue3-ace-editor": "2.2.4",
3939
"vue3-apexcharts": "1.4.4",
4040
"vue3-gettext": "3.0.0-beta.4",
4141
"vuedraggable": "^4.1.0"
4242
},
4343
"devDependencies": {
4444
"@antfu/eslint-config-vue": "^0.43.1",
45-
"@types/lodash": "^4.17.5",
45+
"@types/lodash": "^4.17.7",
4646
"@types/nprogress": "^0.2.3",
4747
"@types/sortablejs": "^1.15.8",
4848
"@typescript-eslint/eslint-plugin": "^6.21.0",
4949
"@typescript-eslint/parser": "^6.21.0",
5050
"@vitejs/plugin-vue": "^5.0.5",
5151
"@vitejs/plugin-vue-jsx": "^3.1.0",
52-
"@vue/compiler-sfc": "^3.4.29",
52+
"@vue/compiler-sfc": "^3.4.33",
5353
"@vue/tsconfig": "^0.5.1",
54-
"ace-builds": "^1.35.0",
54+
"ace-builds": "^1.35.3",
5555
"autoprefixer": "^10.4.19",
5656
"eslint": "^8.57.0",
5757
"eslint-import-resolver-alias": "^1.1.2",
5858
"eslint-import-resolver-typescript": "^3.6.1",
5959
"eslint-plugin-import": "^2.29.1",
6060
"eslint-plugin-regex": "^1.10.0",
6161
"eslint-plugin-sonarjs": "^0.23.0",
62-
"eslint-plugin-vue": "^9.26.0",
62+
"eslint-plugin-vue": "^9.27.0",
6363
"less": "^4.2.0",
64-
"postcss": "^8.4.38",
65-
"tailwindcss": "^3.4.4",
64+
"postcss": "^8.4.39",
65+
"tailwindcss": "^3.4.6",
6666
"typescript": "5.3.3",
67-
"unplugin-auto-import": "^0.17.6",
67+
"unplugin-auto-import": "^0.17.8",
6868
"unplugin-vue-components": "^0.26.0",
6969
"unplugin-vue-define-options": "^1.4.5",
70-
"vite": "^5.3.1",
70+
"vite": "^5.3.4",
7171
"vite-svg-loader": "^5.1.0",
7272
"vue-tsc": "^1.8.27"
7373
},

0 commit comments

Comments
 (0)