166 lines
5.2 KiB
Go
166 lines
5.2 KiB
Go
package tui
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"fmt"
|
|
"github.com/google/uuid"
|
|
"time"
|
|
"wireguard-ui/component"
|
|
"wireguard-ui/global/client"
|
|
"wireguard-ui/global/constant"
|
|
"wireguard-ui/http/vo"
|
|
"wireguard-ui/service"
|
|
"wireguard-ui/utils"
|
|
)
|
|
|
|
type App struct {
|
|
TokenSecret string // token密钥
|
|
User *vo.User // 登陆用户
|
|
Client *ClientComponent // 客户端组件
|
|
Server *ServerComponent // 服务端组件
|
|
Setting *SettingComponent // 设置组件
|
|
}
|
|
|
|
func NewApp() *App {
|
|
app := &App{}
|
|
if _, err := app.Login(); err != nil {
|
|
fmt.Println("登陆失败: ", err)
|
|
return nil
|
|
}
|
|
err := app.AuthLogin()
|
|
if err != nil {
|
|
fmt.Println("登陆失败: ", err)
|
|
return nil
|
|
}
|
|
fmt.Println("\n=============== 登陆成功 ==============================================================================")
|
|
app.Client = NewClientComponent(app.User)
|
|
app.Server = NewServerComponent(app.User)
|
|
app.Setting = NewSettingComponent(app.User)
|
|
fmt.Println("=============== 欢迎使用wireguard-tui =================================================================")
|
|
fmt.Println("=============== 当前用户: ", app.User.Nickname, " ================================================================")
|
|
fmt.Println("=============== 当前时间: ", time.Now().Format("2006-01-02 15:04:05"), " =======================================================")
|
|
fmt.Println("=============== 注意事项如下: =========================================================================")
|
|
fmt.Println("=============== 1. 请确保服务端已经安装wireguard ======================================================")
|
|
fmt.Println("=============== 2. 请确保服务端和客户端配置文件路径正确 ===============================================")
|
|
fmt.Println("=============== 3. 请确保服务端和客户端配置文件权限正确 ===============================================")
|
|
fmt.Println("=============== 4. 请确保服务端和客户端配置文件内容正确 ===============================================")
|
|
fmt.Println("=============== 5. 请勿泄露配置文件内容 ===============================================================")
|
|
fmt.Println("=============== 6. 每次修改客户端、服务端配置或者全局配置过后,请使用重启功能重启服务端,以保证生效 ===")
|
|
fmt.Println("=============== 7. 当使用重启无效时,请手动执行对应命令 ===============================================")
|
|
fmt.Println("=============== 8. 请勿随意删除客户端,删除后无法恢复 =================================================")
|
|
fmt.Println("=============== 9. 手动命令 ===========================================================================")
|
|
fmt.Println("=============== 10. 启动wireguard服务端: wg-quick up wg0 ==============================================")
|
|
fmt.Println("=============== 11. 停止wireguard服务端: wg-quick down wg0 ============================================")
|
|
|
|
return app
|
|
}
|
|
|
|
func (a *App) Run() {
|
|
if a == nil {
|
|
return
|
|
}
|
|
for {
|
|
|
|
PrintMenu()
|
|
chooseMenu := readInput("请选择菜单: ")
|
|
switch chooseMenu {
|
|
case "1":
|
|
a.Client.ConnectList()
|
|
case "2":
|
|
a.Client.Menus()
|
|
case "3":
|
|
a.Server.Menus()
|
|
case "4":
|
|
a.Setting.Menus()
|
|
case "q":
|
|
return
|
|
}
|
|
}
|
|
}
|
|
|
|
// AuthLogin
|
|
// @description: 登陆认证
|
|
// @receiver a
|
|
// @return string
|
|
func (a *App) AuthLogin() error {
|
|
// 先判断token是否存在
|
|
tokenStr, err := client.Redis.Get(context.Background(), fmt.Sprintf("%s:%s", constant.TUIUserToken, a.User.Id)).Result()
|
|
if err != nil {
|
|
// 不存在,去登陆
|
|
tokenStr, err = a.Login()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
// 存在,不必要再次登陆,解析token
|
|
claims, err := component.JWT().ParseToken("Bearer "+tokenStr, a.TokenSecret, "tui")
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
user, err := service.User().GetUserById(claims.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if user.Status != constant.Enabled {
|
|
return errors.New("用户状态异常,请联系管理员处理")
|
|
}
|
|
|
|
a.User = &vo.User{
|
|
Id: user.Id,
|
|
Account: user.Account,
|
|
Nickname: user.Nickname,
|
|
Avatar: user.Avatar,
|
|
Contact: user.Contact,
|
|
IsAdmin: user.IsAdmin,
|
|
Status: user.Status,
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// Login
|
|
// @description: 登陆
|
|
// @receiver a
|
|
// @return string
|
|
func (a *App) Login() (tokenStr string, err error) {
|
|
fmt.Println("============== 登陆 ==============")
|
|
|
|
username := readInput("请输入用户名: ")
|
|
password := readInput("请输入密码: ")
|
|
// 验证码正确,查询用户信息
|
|
user, err := service.User().GetUserByAccount(username)
|
|
if err != nil {
|
|
return "", fmt.Errorf("用户不存在: %v", err)
|
|
}
|
|
|
|
// 对比密码
|
|
if !utils.Password().ComparePassword(user.Password, password) {
|
|
return "", errors.New("密码错误")
|
|
}
|
|
|
|
secret := component.JWT().GenerateSecret(password, uuid.NewString(), time.Now().Local().String())
|
|
// 生成token
|
|
token, _, err := component.JWT().GenerateToken(user.Id, secret, "tui")
|
|
if err != nil {
|
|
return "", fmt.Errorf("登陆失败: %v", err)
|
|
}
|
|
|
|
a.User = &vo.User{
|
|
Id: user.Id,
|
|
Account: user.Account,
|
|
Nickname: user.Nickname,
|
|
Avatar: user.Avatar,
|
|
Contact: user.Contact,
|
|
IsAdmin: user.IsAdmin,
|
|
Status: user.Status,
|
|
}
|
|
|
|
a.TokenSecret = secret
|
|
|
|
return "Bearer " + token, nil
|
|
}
|