mirror of
https://github.com/versia-pub/versia-go.git
synced 2026-03-13 04:29:15 +01:00
refactor!: working WD-4 user discovery
This commit is contained in:
parent
cf0053312d
commit
61891d891a
91 changed files with 12768 additions and 5562 deletions
|
|
@ -2,8 +2,10 @@ package val_impls
|
|||
|
||||
import (
|
||||
"errors"
|
||||
"github.com/lysand-org/versia-go/ent/schema"
|
||||
"github.com/lysand-org/versia-go/internal/validators"
|
||||
"reflect"
|
||||
"regexp"
|
||||
"strings"
|
||||
|
||||
"github.com/go-logr/logr"
|
||||
|
|
@ -11,11 +13,20 @@ import (
|
|||
universal_translator "github.com/go-playground/universal-translator"
|
||||
"github.com/go-playground/validator/v10"
|
||||
en_translations "github.com/go-playground/validator/v10/translations/en"
|
||||
"github.com/lysand-org/versia-go/ent/schema"
|
||||
"github.com/lysand-org/versia-go/internal/api_schema"
|
||||
)
|
||||
|
||||
var _ validators.BodyValidator = (*BodyValidatorImpl)(nil)
|
||||
type bodyValidator struct {
|
||||
Translated string
|
||||
Validate func(fl validator.FieldLevel) bool
|
||||
}
|
||||
|
||||
var (
|
||||
_ validators.BodyValidator = (*BodyValidatorImpl)(nil)
|
||||
|
||||
fullUserRegex = regexp.MustCompile("^@([a-z0-9_-]+)(?:@([a-zA-Z0-1-_.]+\\.[a-zA-Z0-9-z]+(?::[0-9]+)?))?$")
|
||||
domainRegex = regexp.MustCompile("^[a-zA-Z0-9-_.]+.[a-zA-Z0-9-z]+(?::[0-9]+)?$")
|
||||
)
|
||||
|
||||
type BodyValidatorImpl struct {
|
||||
validator *validator.Validate
|
||||
|
|
@ -28,13 +39,13 @@ type BodyValidatorImpl struct {
|
|||
func NewBodyValidator(log logr.Logger) *BodyValidatorImpl {
|
||||
en := en_locale.New()
|
||||
translator := universal_translator.New(en, en)
|
||||
trans, ok := translator.GetTranslator("en")
|
||||
enTranslator, ok := translator.GetTranslator("en")
|
||||
if !ok {
|
||||
panic("failed to get \"en\" translator")
|
||||
}
|
||||
|
||||
validate := validator.New(validator.WithRequiredStructEnabled())
|
||||
if err := en_translations.RegisterDefaultTranslations(validate, trans); err != nil {
|
||||
if err := en_translations.RegisterDefaultTranslations(validate, enTranslator); err != nil {
|
||||
panic("failed to register default translations")
|
||||
}
|
||||
|
||||
|
|
@ -46,25 +57,65 @@ func NewBodyValidator(log logr.Logger) *BodyValidatorImpl {
|
|||
return name
|
||||
})
|
||||
|
||||
if err := validate.RegisterValidation("username_regex", func(fl validator.FieldLevel) bool {
|
||||
return schema.ValidateUsername(fl.Field().String()) == nil
|
||||
}); err != nil {
|
||||
panic("failed to register username_regex validator")
|
||||
bodyValidators := map[string]bodyValidator{
|
||||
"username_regex": {
|
||||
Translated: "{0} must match '^[a-z0-9_-]+$'!",
|
||||
Validate: func(fl validator.FieldLevel) bool {
|
||||
return schema.ValidateUsername(fl.Field().String()) == nil
|
||||
},
|
||||
},
|
||||
"full_user_regex": {
|
||||
Translated: "{0} must match '^@[a-z0-9_-]+$' or '^@[a-z0-9_-]+@[a-zA-Z0-1-_.]+\\.[a-zA-Z0-9-z]+(?::[0-9]+)?))?$'",
|
||||
Validate: func(fl validator.FieldLevel) bool {
|
||||
f := fl.Field()
|
||||
if f.Type().String() == "string" {
|
||||
return fullUserRegex.Match([]byte(f.String()))
|
||||
}
|
||||
|
||||
return false
|
||||
},
|
||||
},
|
||||
"domain_regex": {
|
||||
Translated: "{0} must match '^[a-zA-Z0-9-_.]+.[a-zA-Z0-9-z]+(?::[0-9]+)?$'",
|
||||
Validate: func(fl validator.FieldLevel) bool {
|
||||
f := fl.Field()
|
||||
t := f.Type().String()
|
||||
if t == "string" {
|
||||
return domainRegex.Match([]byte(f.String()))
|
||||
}
|
||||
|
||||
log.V(-1).Info("got wrong type: %s\n", t)
|
||||
|
||||
return false
|
||||
},
|
||||
},
|
||||
}
|
||||
|
||||
if err := validate.RegisterTranslation("username_regex", trans, func(ut universal_translator.Translator) error {
|
||||
return trans.Add("user_regex", "{0} must match '^[a-z0-9_-]+$'!", true)
|
||||
}, func(ut universal_translator.Translator, fe validator.FieldError) string {
|
||||
t, _ := ut.T("user_regex", fe.Field())
|
||||
return t
|
||||
}); err != nil {
|
||||
panic("failed to register user_regex translation")
|
||||
for identifier, v := range bodyValidators {
|
||||
if err := validate.RegisterValidation(identifier, v.Validate); err != nil {
|
||||
log.Error(err, "failed to register validator", "identifier", identifier)
|
||||
}
|
||||
|
||||
register := func(ut universal_translator.Translator) error {
|
||||
return enTranslator.Add(identifier, v.Translated, true)
|
||||
}
|
||||
|
||||
translate := func(ut universal_translator.Translator, fe validator.FieldError) string {
|
||||
t, _ := ut.T(identifier, fe.Field())
|
||||
return t
|
||||
}
|
||||
|
||||
if err := validate.RegisterTranslation(identifier, enTranslator, register, translate); err != nil {
|
||||
log.Error(err, "failed to register validator translator", "identifier", identifier)
|
||||
}
|
||||
}
|
||||
|
||||
return &BodyValidatorImpl{
|
||||
validator: validate,
|
||||
translator: translator,
|
||||
enTranslator: trans,
|
||||
enTranslator: enTranslator,
|
||||
|
||||
log: log,
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -1,17 +1,15 @@
|
|||
package val_impls
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"context"
|
||||
"errors"
|
||||
"git.devminer.xyz/devminer/unitel"
|
||||
"github.com/go-logr/logr"
|
||||
"github.com/gofiber/fiber/v2"
|
||||
"github.com/lysand-org/versia-go/internal/repository"
|
||||
"github.com/lysand-org/versia-go/internal/utils"
|
||||
"github.com/lysand-org/versia-go/internal/validators"
|
||||
"github.com/lysand-org/versia-go/pkg/lysand"
|
||||
"github.com/valyala/fasthttp/fasthttpadaptor"
|
||||
"io"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
|
|
@ -38,7 +36,7 @@ func NewRequestValidator(repositories repository.Manager, telemetry *unitel.Tele
|
|||
}
|
||||
|
||||
func (i RequestValidatorImpl) Validate(ctx context.Context, r *http.Request) error {
|
||||
s := i.telemetry.StartSpan(ctx, "function", "validator/val_impls.RequestValidatorImpl.Validate")
|
||||
s := i.telemetry.StartSpan(ctx, "function", "val_impls/RequestValidatorImpl.Validate")
|
||||
defer s.End()
|
||||
ctx = s.Context()
|
||||
|
||||
|
|
@ -55,13 +53,13 @@ func (i RequestValidatorImpl) Validate(ctx context.Context, r *http.Request) err
|
|||
return err
|
||||
}
|
||||
|
||||
body, err := copyBody(r)
|
||||
body, err := utils.CopyBody(r)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !(lysand.Verifier{PublicKey: user.PublicKey}).Verify(r.Method, r.URL, body, fedHeaders) {
|
||||
i.log.Info("signature verification failed", "user", user.URI, "url", r.URL.Path)
|
||||
if !(lysand.Verifier{PublicKey: user.PublicKey.Key}).Verify(r.Method, r.URL, body, fedHeaders) {
|
||||
i.log.WithCallDepth(1).Info("signature verification failed", "user", user.URI, "url", r.URL.Path)
|
||||
s.CaptureError(ErrInvalidSignature)
|
||||
|
||||
return ErrInvalidSignature
|
||||
|
|
@ -73,37 +71,14 @@ func (i RequestValidatorImpl) Validate(ctx context.Context, r *http.Request) err
|
|||
}
|
||||
|
||||
func (i RequestValidatorImpl) ValidateFiberCtx(ctx context.Context, c *fiber.Ctx) error {
|
||||
s := i.telemetry.StartSpan(ctx, "function", "validator/val_impls.RequestValidatorImpl.ValidateFiberCtx")
|
||||
s := i.telemetry.StartSpan(ctx, "function", "val_impls/RequestValidatorImpl.ValidateFiberCtx")
|
||||
defer s.End()
|
||||
ctx = s.Context()
|
||||
|
||||
r, err := convertToStdRequest(c)
|
||||
r, err := utils.ConvertToStdRequest(c)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return i.Validate(ctx, r)
|
||||
}
|
||||
|
||||
func convertToStdRequest(c *fiber.Ctx) (*http.Request, error) {
|
||||
stdReq := &http.Request{}
|
||||
if err := fasthttpadaptor.ConvertRequest(c.Context(), stdReq, true); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return stdReq, nil
|
||||
}
|
||||
|
||||
func copyBody(req *http.Request) ([]byte, error) {
|
||||
body, err := io.ReadAll(req.Body)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := req.Body.Close(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
req.Body = io.NopCloser(bytes.NewBuffer(body))
|
||||
return body, nil
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue