Files
MirageServer/controller/console.go

70 lines
1.9 KiB
Go

package controller
import (
_ "embed"
"fmt"
"net/http"
"time"
"tailscale.com/version"
)
type selfData struct {
ControllerVer string `json:"ctrlver"`
Basedomain string `json:"basedomain"`
UserName string `json:"username"`
UserNameHead string `json:"usernamehead"`
UserAccount string `json:"useraccount"`
OrgName string `json:"orgname"`
}
// 提供获取用户信息的API
func (h *Mirage) ConsoleSelfAPI(
writer http.ResponseWriter,
req *http.Request,
) {
user, err := h.verifyTokenIDandGetUser(writer, req)
if err != nil || user.CheckEmpty() {
h.doAPIResponse(writer, "用户信息核对失败:"+err.Error(), nil)
return
}
userName := user.Name
userDisName := user.Display_Name
userNameHead := string([]rune(userDisName)[0])
userOrgName := user.Organization.Name
// 用户所属组织将存于数据库,合并实现前,不设置配置文件中该项,均按个人用户处理
resData := selfData{
ControllerVer: version.Long(),
Basedomain: user.Organization.MagicDnsDomain,
UserNameHead: userNameHead,
UserName: userDisName,
UserAccount: userName,
OrgName: userOrgName,
}
h.doAPIResponse(writer, "", resData)
}
// 验证Token并获取用户信息
func (h *Mirage) verifyTokenIDandGetUser(
writer http.ResponseWriter,
req *http.Request,
) (*User, error) {
controlCodeCookie, err := req.Cookie("miragecontrol")
if err == http.ErrNoCookie {
return nil, fmt.Errorf("Token不存在")
}
controlCode := controlCodeCookie.Value
controlCodeC, concontrolCodeExpiration, ok := h.controlCodeCache.GetWithExpiration(controlCode)
if !ok || concontrolCodeExpiration.Compare(time.Now()) != 1 {
return nil, fmt.Errorf("验证Token失败")
}
controlCodeItem := controlCodeC.(ControlCacheItem)
user, err := h.GetUserByID(controlCodeItem.uid)
if err != nil {
return nil, fmt.Errorf("提取用户信息失败")
}
return user, nil
}