Fix: vendor login record backend

pull/44/head
zijiren233 3 years ago
parent 2d90978c4b
commit b6ea5a52ca

@ -52,7 +52,6 @@ func (a *AlistVendor) BeforeSave(tx *gorm.DB) error {
if a.Username, err = utils.CryptoToBase64([]byte(a.Username), key); err != nil { if a.Username, err = utils.CryptoToBase64([]byte(a.Username), key); err != nil {
return err return err
} }
if a.HashedPassword, err = utils.Crypto(a.HashedPassword, key); err != nil { if a.HashedPassword, err = utils.Crypto(a.HashedPassword, key); err != nil {
return err return err
} }

@ -2,6 +2,8 @@ package vendorAlist
import ( import (
"context" "context"
"crypto/sha256"
"encoding/hex"
"errors" "errors"
"net/http" "net/http"
@ -19,6 +21,7 @@ import (
type LoginReq struct { type LoginReq struct {
Host string `json:"host"` Host string `json:"host"`
Username string `json:"username"` Username string `json:"username"`
Password string `json:"password"`
HashedPassword string `json:"hashedPassword"` HashedPassword string `json:"hashedPassword"`
} }
@ -26,6 +29,9 @@ func (r *LoginReq) Validate() error {
if r.Host == "" { if r.Host == "" {
return errors.New("host is required") return errors.New("host is required")
} }
if r.Password != "" && r.HashedPassword != "" {
return errors.New("password and hashedPassword can't be both set")
}
return nil return nil
} }
@ -42,7 +48,14 @@ func Login(ctx *gin.Context) {
return return
} }
cli := vendor.LoadAlistClient("") if req.Password != "" {
h := sha256.New()
h.Write([]byte(req.Password + `-https://github.com/alist-org/alist`))
req.HashedPassword = hex.EncodeToString(h.Sum(nil))
}
backend := ctx.Query("backend")
cli := vendor.LoadAlistClient(backend)
if req.Username == "" { if req.Username == "" {
_, err := cli.Me(ctx, &alist.MeReq{ _, err := cli.Me(ctx, &alist.MeReq{
@ -54,7 +67,8 @@ func Login(ctx *gin.Context) {
} }
_, err = user.AlistCache().Data().Refresh(ctx, func(ctx context.Context, args ...struct{}) (*cache.AlistUserCacheData, error) { _, err = user.AlistCache().Data().Refresh(ctx, func(ctx context.Context, args ...struct{}) (*cache.AlistUserCacheData, error) {
return &cache.AlistUserCacheData{ return &cache.AlistUserCacheData{
Host: req.Host, Host: req.Host,
Backend: backend,
}, nil }, nil
}) })
if err != nil { if err != nil {
@ -69,14 +83,15 @@ func Login(ctx *gin.Context) {
Hashed: true, Hashed: true,
}) })
if err != nil { if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return return
} }
_, err = user.AlistCache().Data().Refresh(ctx, func(ctx context.Context, args ...struct{}) (*cache.AlistUserCacheData, error) { _, err = user.AlistCache().Data().Refresh(ctx, func(ctx context.Context, args ...struct{}) (*cache.AlistUserCacheData, error) {
return &cache.AlistUserCacheData{ return &cache.AlistUserCacheData{
Host: req.Host, Host: req.Host,
Token: resp.Token, Token: resp.Token,
Backend: backend,
}, nil }, nil
}) })
if err != nil { if err != nil {
@ -86,6 +101,7 @@ func Login(ctx *gin.Context) {
} }
_, err := db.CreateOrSaveAlistVendor(user.ID, &dbModel.AlistVendor{ _, err := db.CreateOrSaveAlistVendor(user.ID, &dbModel.AlistVendor{
Backend: backend,
Host: req.Host, Host: req.Host,
Username: req.Username, Username: req.Username,
HashedPassword: []byte(req.HashedPassword), HashedPassword: []byte(req.HashedPassword),

@ -1,16 +1,19 @@
package vendorBilibili package vendorBilibili
import ( import (
"context"
"errors" "errors"
"net/http" "net/http"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
json "github.com/json-iterator/go" json "github.com/json-iterator/go"
"github.com/synctv-org/synctv/internal/cache"
"github.com/synctv-org/synctv/internal/db" "github.com/synctv-org/synctv/internal/db"
dbModel "github.com/synctv-org/synctv/internal/model" dbModel "github.com/synctv-org/synctv/internal/model"
"github.com/synctv-org/synctv/internal/op" "github.com/synctv-org/synctv/internal/op"
"github.com/synctv-org/synctv/internal/vendor" "github.com/synctv-org/synctv/internal/vendor"
"github.com/synctv-org/synctv/server/model" "github.com/synctv-org/synctv/server/model"
"github.com/synctv-org/synctv/utils"
"github.com/synctv-org/vendors/api/bilibili" "github.com/synctv-org/vendors/api/bilibili"
) )
@ -47,7 +50,8 @@ func LoginWithQR(ctx *gin.Context) {
return return
} }
resp, err := vendor.LoadBilibiliClient("").LoginWithQRCode(ctx, &bilibili.LoginWithQRCodeReq{ backend := ctx.Query("backend")
resp, err := vendor.LoadBilibiliClient(backend).LoginWithQRCode(ctx, &bilibili.LoginWithQRCodeReq{
Key: req.Key, Key: req.Key,
}) })
if err != nil { if err != nil {
@ -74,6 +78,17 @@ func LoginWithQR(ctx *gin.Context) {
case bilibili.QRCodeStatus_SUCCESS: case bilibili.QRCodeStatus_SUCCESS:
_, err = db.CreateOrSaveBilibiliVendor(user.ID, &dbModel.BilibiliVendor{ _, err = db.CreateOrSaveBilibiliVendor(user.ID, &dbModel.BilibiliVendor{
Cookies: resp.Cookies, Cookies: resp.Cookies,
Backend: backend,
})
if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return
}
_, err = user.BilibiliCache().Data().Refresh(ctx, func(ctx context.Context, args ...struct{}) (*cache.BilibiliUserCacheData, error) {
return &cache.BilibiliUserCacheData{
Backend: backend,
Cookies: utils.MapToHttpCookie(resp.Cookies),
}, nil
}) })
if err != nil { if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
@ -170,13 +185,16 @@ func (r *SMSLoginReq) Decode(ctx *gin.Context) error {
} }
func LoginWithSMS(ctx *gin.Context) { func LoginWithSMS(ctx *gin.Context) {
user := ctx.MustGet("user").(*op.User)
var req SMSLoginReq var req SMSLoginReq
if err := model.Decode(ctx, &req); err != nil { if err := model.Decode(ctx, &req); err != nil {
ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err)) ctx.AbortWithStatusJSON(http.StatusBadRequest, model.NewApiErrorResp(err))
return return
} }
c, err := vendor.LoadBilibiliClient("").LoginWithSMS(ctx, &bilibili.LoginWithSMSReq{ backend := ctx.Query("backend")
c, err := vendor.LoadBilibiliClient(backend).LoginWithSMS(ctx, &bilibili.LoginWithSMSReq{
Phone: req.Telephone, Phone: req.Telephone,
CaptchaKey: req.CaptchaKey, CaptchaKey: req.CaptchaKey,
Code: req.Code, Code: req.Code,
@ -185,14 +203,24 @@ func LoginWithSMS(ctx *gin.Context) {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return return
} }
user := ctx.MustGet("user").(*op.User)
_, err = db.CreateOrSaveBilibiliVendor(user.ID, &dbModel.BilibiliVendor{ _, err = db.CreateOrSaveBilibiliVendor(user.ID, &dbModel.BilibiliVendor{
Backend: backend,
Cookies: c.Cookies, Cookies: c.Cookies,
}) })
if err != nil { if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err)) ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return return
} }
_, err = user.BilibiliCache().Data().Refresh(ctx, func(ctx context.Context, args ...struct{}) (*cache.BilibiliUserCacheData, error) {
return &cache.BilibiliUserCacheData{
Backend: backend,
Cookies: utils.MapToHttpCookie(c.Cookies),
}, nil
})
if err != nil {
ctx.AbortWithStatusJSON(http.StatusInternalServerError, model.NewApiErrorResp(err))
return
}
ctx.Status(http.StatusNoContent) ctx.Status(http.StatusNoContent)
} }

Loading…
Cancel
Save