Changes
1 changed files (+59/-6)
-
-
@@ -22,6 +22,11 @@ func (s *Service) Login(ctx context.Context, req *connect.Request[workspaceV2.LoginRequest], ) (*connect.Response[workspaceV2.LoginResponse], error) { logger := s.core.Logger.With( "service", "yamori.workspace.v2.WorkspaceService", "method", "Login", ) name := req.Msg.GetName() if name == "" { return connect.NewResponse(&workspaceV2.LoginResponse{
-
@@ -46,22 +51,50 @@ }tx, err := s.core.DB.Begin() if err != nil { return nil, err logger.Error("Failed to begin transaction", "error", err) return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_SystemError{ SystemError: &errorV1.SystemError{ Message: proto.String("Database error"), }, }, }), nil } defer tx.Rollback() users, err := projection.GetUsers(tx) if err != nil { return nil, err logger.Error("Failed to read users projection", "error", err) return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_SystemError{ SystemError: &errorV1.SystemError{ Message: proto.String("Database error"), }, }, }), nil } secret, err := projection.GetLoginJwtSecret(tx) if err != nil { return nil, err logger.Error("Failed to read login_jwt_secret projection", "error", err) return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_SystemError{ SystemError: &errorV1.SystemError{ Message: proto.String("Database error"), }, }, }), nil } if err := event.UpdateProjections(tx, users, secret); err != nil { return nil, err logger.Error("Failed to update projections", "error", err) return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_SystemError{ SystemError: &errorV1.SystemError{ Message: proto.String("Database error"), }, }, }), nil } for _, u := range users.Projection.Users {
-
@@ -69,7 +102,10 @@ if u.GetName() != name {continue } logger := logger.With("id", u.GetId()) if u.PasswordLogin == nil { logger.Warn("Attempt to login to a user account without password login") return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_AuthenticationError{ AuthenticationError: &errorV1.AuthenticationError{},
-
@@ -79,6 +115,7 @@ }hash := crypto.HashPassword([]byte(password), u.PasswordLogin.Salt) if !bytes.Equal(hash, u.PasswordLogin.Hash) { logger.Warn("Login password mismatch") return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_AuthenticationError{ AuthenticationError: &errorV1.AuthenticationError{},
-
@@ -104,18 +141,34 @@ })token, err := s.core.IssueToken(secret, u) if err != nil { return nil, err logger.Error("Failed to generate a token", "error", err) return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_SystemError{ SystemError: &errorV1.SystemError{ Message: proto.String("Unable to generate a token"), }, }, }), nil } header := res.Header() token.SaveToCookie(&header) if err := tx.Commit(); err != nil { return nil, err logger.Error("Failed to commit transaction", "error", err) return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_SystemError{ SystemError: &errorV1.SystemError{ Message: proto.String("Database error"), }, }, }), nil } return res, nil } logger.Warn("Attempt to login to a non-existent user account", "name", name) return connect.NewResponse(&workspaceV2.LoginResponse{ Result: &workspaceV2.LoginResponse_AuthenticationError{
-