This commit is contained in:
2026-03-04 18:23:00 +03:00
parent b81df5866b
commit 205d9cf8b0
15 changed files with 439 additions and 165 deletions

View File

@@ -1,12 +1,17 @@
package app
import (
"database/sql"
"encoding/base64"
"encoding/json"
"errors"
"fmt"
"io"
"log"
"net/http"
"strconv"
"github.com/go-chi/chi/v5"
)
type AddUserReq struct {
@@ -31,22 +36,8 @@ func AddUser(w http.ResponseWriter, r *http.Request) {
return
}
provider, err := LoadProvider()
if err != nil {
WriteError(w, err)
return
}
err = provider.AddUser(req.Username, req.Password)
if err != nil {
WriteError(w, err)
return
}
err = provider.Save()
if err != nil {
WriteError(w, err)
}
user, err := provider.GetUser(req.Password)
rep := NewUserRepository(db)
user, err := rep.AddUser(req.Username, req.Password)
if err != nil {
WriteError(w, err)
return
@@ -69,17 +60,8 @@ func DeleteUser(w http.ResponseWriter, r *http.Request) {
return
}
provider, err := LoadProvider()
if err != nil {
WriteError(w, err)
return
}
err = provider.DeleteUser(req.ID)
if err != nil {
WriteError(w, err)
return
}
err = provider.Save()
rep := NewUserRepository(db)
err = rep.DeleteUser(req.ID)
if err != nil {
WriteError(w, err)
return
@@ -94,12 +76,13 @@ func AllUsers(w http.ResponseWriter, r *http.Request) {
return
}
provider, err := LoadProvider()
rep := NewUserRepository(db)
users, err := rep.GetUsers()
if err != nil {
WriteError(w, err)
return
}
WriteResponse(w, provider)
WriteResponse(w, users)
}
type GetConnectURLReq struct {
@@ -114,25 +97,58 @@ func GetUserURL(w http.ResponseWriter, r *http.Request) {
return
}
provider, err := LoadProvider()
rep := NewUserRepository(db)
user, err := rep.GetById(req.ID)
if err != nil {
WriteError(w, err)
return
}
user, err := provider.GetById(req.ID)
//if user.Password != req.Pass {
// WriteError(w, errors.New("invalid password"))
// return
//}
urlTemplate := "hysteria2://%s@%s%s?obfs=salamander&obfs-password=%s&type=hysteria&mport&security=tls&sni=%s&alpn=h3&fp=chrome&allowInsecure=0#%s"
authString := encodeURL(user)
u := fmt.Sprintf(
urlTemplate,
authString,
cfg.Host,
hysteriaCfg.Listen,
hysteriaCfg.Obfs.Salamander.Password,
cfg.SNI,
formatConfigName(cfg.NameFormat, user),
)
WriteResponse(w, u)
}
func Sub(w http.ResponseWriter, r *http.Request) {
idS := chi.URLParam(r, "id")
id, err := strconv.Atoi(idS)
if err != nil {
WriteError(w, err)
return
}
if user.Password != req.Pass {
WriteError(w, errors.New("invalid password"))
return
}
urlTemplate := "hysteria2://%s@%s:%s?obfs=salamander&obfs-password=%s&type=hysteria&mport&security=tls&sni=%s&alpn=h3&fp=chrome&allowInsecure=0#%s"
rep := NewUserRepository(db)
user, err := rep.GetById(id)
if err != nil {
WriteError(w, err)
return
}
urlTemplate := "hysteria2://%s@%s%s?obfs=salamander&obfs-password=%s&type=hysteria&mport&security=tls&sni=%s&alpn=h3&fp=chrome&allowInsecure=0#%s"
authString := encodeURL(user)
u := fmt.Sprintf(urlTemplate, authString, cfg.Host, cfg.Port, cfg.ObfsPassword, cfg.SNI, formatConfigName(cfg.NameFormat, user))
WriteResponse(w, u)
u := fmt.Sprintf(
urlTemplate,
authString,
cfg.Host,
hysteriaCfg.Listen,
hysteriaCfg.Obfs.Salamander.Password,
cfg.SNI,
formatConfigName(cfg.NameFormat, user),
)
w.Write([]byte(base64.StdEncoding.EncodeToString([]byte(u))))
}
type AuthReq struct {
@@ -154,7 +170,7 @@ func DoAuth(w http.ResponseWriter, r *http.Request) {
}
req := new(AuthReq)
if err := json.Unmarshal(data, req); err != nil {
if err = json.Unmarshal(data, req); err != nil {
w.WriteHeader(http.StatusBadRequest)
log.Println(err)
return
@@ -164,20 +180,21 @@ func DoAuth(w http.ResponseWriter, r *http.Request) {
reqUser, err := decodeURL(req.Auth)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
log.Println(err)
return
}
provider, err := LoadProvider()
rep := NewUserRepository(db)
user, err := rep.GetById(reqUser.ID)
if err != nil {
if errors.Is(err, sql.ErrNoRows) {
w.WriteHeader(http.StatusNotFound)
return
}
log.Println(err)
w.WriteHeader(http.StatusBadRequest)
return
}
user, err := provider.GetUser(reqUser.Password)
if err != nil {
w.WriteHeader(http.StatusBadRequest)
return
}
res := &AuthRsp{true, user.Username}
err = json.NewEncoder(w).Encode(res)