From 234a9e90d07bff49deec85893f46d0297ed57a2f Mon Sep 17 00:00:00 2001 From: Nikolai Rodionov Date: Thu, 7 May 2026 22:29:26 +0200 Subject: [PATCH] Add login Signed-off-by: Nikolai Rodionov --- api/v1/accounts_no_auth.go | 44 ++++++++++++++++++++++++++-- go.mod | 6 ++-- go.sum | 8 ++--- internal/controllers/accounts.go | 22 +++++++++++++- internal/controllers/applications.go | 3 +- 5 files changed, 67 insertions(+), 16 deletions(-) diff --git a/api/v1/accounts_no_auth.go b/api/v1/accounts_no_auth.go index ea2eca8..39b5886 100644 --- a/api/v1/accounts_no_auth.go +++ b/api/v1/accounts_no_auth.go @@ -4,10 +4,11 @@ import ( "context" "gitea.badhouseplants.net/softplayer/softplayer-backend/internal/controllers" - "gitea.badhouseplants.net/softplayer/softplayer-backend/internal/tools/logger" accounts "gitea.badhouseplants.net/softplayer/softplayer-go-proto/pkg/accounts/v1" "github.com/golang/protobuf/ptypes/empty" + "google.golang.org/grpc" "google.golang.org/grpc/codes" + "google.golang.org/grpc/metadata" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/emptypb" ) @@ -24,11 +25,32 @@ type AccountsNoAuthServer struct { } func (a *AccountsNoAuthServer) SignIn(ctx context.Context, in *accounts.SignInRequest) (*empty.Empty, error) { + id, err := a.ctrl.Login(ctx, in.GetEmail(), in.GetPassword()) + if err != nil { + return nil, status.Error(codes.Aborted, "Couldn't create a user") + } + accessToken, err := a.ctrl.GenerateAccessToken(id) + if err != nil { + return nil, status.Error(codes.Aborted, "Couldn't generate an access token") + } + + refreshToken, err := a.ctrl.GenerateRefreshToken(ctx, id) + if err != nil { + return nil, status.Error(codes.Aborted, "Couldn't generate an access token") + } + + header := metadata.New(map[string]string{ + "X-Access-Token": accessToken, + "X-Refresh-Token": refreshToken, + }) + if err := grpc.SetHeader(ctx, header); err != nil { + return nil, status.Error(codes.Aborted, "Couldn't set metadata") + } return &emptypb.Empty{}, nil } +// Create a new account in Softplayer func (a *AccountsNoAuthServer) SignUp(ctx context.Context, in *accounts.SignUpRequest) (*empty.Empty, error) { - log := logger.FromContext(ctx) data := &controllers.AccountData{ Password: in.GetPassword(), Email: in.GetEmail(), @@ -38,6 +60,22 @@ func (a *AccountsNoAuthServer) SignUp(ctx context.Context, in *accounts.SignUpRe return nil, status.Error(codes.Aborted, "Couldn't create a user") } - log.Info(id) + accessToken, err := a.ctrl.GenerateAccessToken(id) + if err != nil { + return nil, status.Error(codes.Aborted, "Couldn't generate an access token") + } + + refreshToken, err := a.ctrl.GenerateRefreshToken(ctx, id) + if err != nil { + return nil, status.Error(codes.Aborted, "Couldn't generate an access token") + } + + header := metadata.New(map[string]string{ + "X-Access-Token": accessToken, + "X-Refresh-Token": refreshToken, + }) + if err := grpc.SetHeader(ctx, header); err != nil { + return nil, status.Error(codes.Aborted, "Couldn't set metadata") + } return &emptypb.Empty{}, nil } diff --git a/go.mod b/go.mod index 412383d..ddf37f1 100644 --- a/go.mod +++ b/go.mod @@ -5,7 +5,6 @@ go 1.25.9 require ( github.com/alecthomas/assert/v2 v2.11.0 github.com/alecthomas/kong v1.15.0 - github.com/coreos/go-oidc/v3 v3.18.0 github.com/go-logr/logr v1.4.3 github.com/go-logr/zapr v1.3.0 github.com/golang-jwt/jwt/v5 v5.2.2 @@ -20,7 +19,6 @@ require ( github.com/sirupsen/logrus v1.9.3 go.uber.org/zap v1.27.0 golang.org/x/crypto v0.47.0 - golang.org/x/oauth2 v0.36.0 gopkg.in/yaml.v2 v2.4.0 helm.sh/helm/v3 v3.20.2 k8s.io/api v0.35.1 @@ -60,7 +58,6 @@ require ( github.com/fxamacker/cbor/v2 v2.9.0 // indirect github.com/go-errors/errors v1.4.2 // indirect github.com/go-gorp/gorp/v3 v3.1.0 // indirect - github.com/go-jose/go-jose/v4 v4.1.4 // indirect github.com/go-openapi/jsonpointer v0.21.0 // indirect github.com/go-openapi/jsonreference v0.21.0 // indirect github.com/go-openapi/swag v0.23.0 // indirect @@ -115,6 +112,7 @@ require ( go.uber.org/multierr v1.11.0 // indirect go.yaml.in/yaml/v2 v2.4.3 // indirect go.yaml.in/yaml/v3 v3.0.4 // indirect + golang.org/x/oauth2 v0.36.0 // indirect golang.org/x/sync v0.19.0 // indirect golang.org/x/term v0.39.0 // indirect golang.org/x/time v0.12.0 // indirect @@ -140,7 +138,7 @@ require ( ) require ( - gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260505200910-6680dffa2e8b + gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260507202441-3d76028a6403 github.com/golang/protobuf v1.5.4 golang.org/x/net v0.49.0 // indirect golang.org/x/sys v0.40.0 // indirect diff --git a/go.sum b/go.sum index 7e27f78..2169ddc 100644 --- a/go.sum +++ b/go.sum @@ -6,8 +6,8 @@ dario.cat/mergo v1.0.1 h1:Ra4+bf83h2ztPIQYNP99R6m+Y7KfnARDfID+a+vLl4s= dario.cat/mergo v1.0.1/go.mod h1:uNxQE+84aUszobStD9th8a29P2fMDhsBdgRYvZOxGmk= filippo.io/edwards25519 v1.1.0 h1:FNf4tywRC1HmFuKW5xopWpigGjJKiJSV0Cqo0cJWDaA= filippo.io/edwards25519 v1.1.0/go.mod h1:BxyFTGdWcka3PhytdK4V28tE5sGfRvvvRV7EaN4VDT4= -gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260505200910-6680dffa2e8b h1:/mhdJ1VEhIWmLd6Wrs6xIs+USjhHcAn8MsK7wZqzi3Y= -gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260505200910-6680dffa2e8b/go.mod h1:AgOh1lkPHyRgBf3/s1btKcAqke/33LbKYarTD13qeAg= +gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260507202441-3d76028a6403 h1:BcXYqXGtUpfpTI/tnqEhFEByAUqbhmW1BnCLezcgfRc= +gitea.badhouseplants.net/softplayer/softplayer-go-proto v0.0.0-20260507202441-3d76028a6403/go.mod h1:AgOh1lkPHyRgBf3/s1btKcAqke/33LbKYarTD13qeAg= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24 h1:bvDV9vkmnHYOMsOr4WLk+Vo07yKIzd94sVoIqshQ4bU= github.com/AdaLogics/go-fuzz-headers v0.0.0-20230811130428-ced1acdcaa24/go.mod h1:8o94RPi1/7XTJvwPpRSzSUedZrtlirdB3r9Z20bi2f8= github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c h1:udKWzYgxTojEKWjV8V+WSxDXJ4NFATAsZjh8iIbsQIg= @@ -66,8 +66,6 @@ github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= github.com/containerd/platforms v0.2.1 h1:zvwtM3rz2YHPQsF2CHYM8+KtB5dvhISiXh5ZpSBQv6A= github.com/containerd/platforms v0.2.1/go.mod h1:XHCb+2/hzowdiut9rkudds9bE5yJ7npe7dG/wG+uFPw= -github.com/coreos/go-oidc/v3 v3.18.0 h1:V9orjXynvu5wiC9SemFTWnG4F45v403aIcjWo0d41+A= -github.com/coreos/go-oidc/v3 v3.18.0/go.mod h1:DYCf24+ncYi+XkIH97GY1+dqoRlbaSI26KVTCI9SrY4= github.com/coreos/go-systemd/v22 v22.5.0 h1:RrqgGjYQKalulkV8NGVIfkXQf6YYmOyiJKk8iXXhfZs= github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man/v2 v2.0.6/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= @@ -129,8 +127,6 @@ github.com/go-errors/errors v1.4.2 h1:J6MZopCL4uSllY1OfXM374weqZFFItUbrImctkmUxI github.com/go-errors/errors v1.4.2/go.mod h1:sIVyrIiJhuEF+Pj9Ebtd6P/rEYROXFi3BopGUQ5a5Og= github.com/go-gorp/gorp/v3 v3.1.0 h1:ItKF/Vbuj31dmV4jxA1qblpSwkl9g1typ24xoe70IGs= github.com/go-gorp/gorp/v3 v3.1.0/go.mod h1:dLEjIyyRNiXvNZ8PSmzpt1GsWAUK8kjVhEpjH8TixEw= -github.com/go-jose/go-jose/v4 v4.1.4 h1:moDMcTHmvE6Groj34emNPLs/qtYXRVcd6S7NHbHz3kA= -github.com/go-jose/go-jose/v4 v4.1.4/go.mod h1:x4oUasVrzR7071A4TnHLGSPpNOm2a21K9Kf04k1rs08= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= github.com/go-logr/logr v1.4.3 h1:CjnDlHq8ikf6E492q6eKboGOC0T8CDaOvkHCIg8idEI= diff --git a/internal/controllers/accounts.go b/internal/controllers/accounts.go index 743c314..31d98da 100644 --- a/internal/controllers/accounts.go +++ b/internal/controllers/accounts.go @@ -47,7 +47,7 @@ func (c *AccountController) Create(ctx context.Context, data *AccountData) (stri return "", nil } - query := "INSERT INTO users (uuid, email, password_hash) VALUES ($1, $2, $3)" + query := "INSERT INTO accounts (uuid, email, password_hash) VALUES ($1, $2, $3)" if _, err := c.DB.Query(query, data.UUID, data.Email, passwordHash); err != nil { log.Error(err, "Couldn't create a user in the database") return "", err @@ -56,6 +56,26 @@ func (c *AccountController) Create(ctx context.Context, data *AccountData) (stri return data.UUID, nil } +func (c *AccountController) Login(ctx context.Context, email, password string) (string, error) { + log := logger.FromContext(ctx) + query := "SELECT uuid, password_hash FROM accounts WHERE email = $1;" + + var passwordHash string + var uuid string + + if err := c.DB.QueryRow(query, email).Scan(&uuid, &passwordHash); err != nil { + log.Error(err, "Couldn't get a user from the database") + return "", err + } + + if err := hash.CheckPasswordHash(password, passwordHash); err != nil { + log.Error(err, "Wrong password") + return "", err + } + + return uuid, nil +} + func (c *AccountController) GenerateAccessToken(userID string) (string, error) { claims := jwt.MapClaims{ "user_id": userID, diff --git a/internal/controllers/applications.go b/internal/controllers/applications.go index 483c61b..623f971 100644 --- a/internal/controllers/applications.go +++ b/internal/controllers/applications.go @@ -68,7 +68,6 @@ func (app *Application) Create(ctx context.Context) error { } controller, err := ctrl.NewManager(conf, ctrl.Options{}) - if err != nil { return err } @@ -90,7 +89,7 @@ func (app *Application) Create(ctx context.Context) error { )[0:20] goPath := os.TempDir() + "/softplayer/" + formattedName - if err := os.MkdirAll(goPath, 0777); err != nil { + if err := os.MkdirAll(goPath, 0o777); err != nil { return err }