fix: send user and login in registration response

This commit is contained in:
Johan Siebens
2022-12-21 06:12:41 +01:00
parent b2dbe3b9c5
commit a8e8d1aa49
8 changed files with 78 additions and 5 deletions
@@ -0,0 +1,23 @@
package migration
import (
"github.com/go-gormigrate/gormigrate/v2"
"gorm.io/gorm"
)
func m202212201300_add_user_id_column() *gormigrate.Migration {
return &gormigrate.Migration{
ID: "202212201300",
Migrate: func(db *gorm.DB) error {
type RegistrationRequest struct {
Key string `gorm:"type:varchar(64);uniqueIndex"`
UserID uint64
}
return db.AutoMigrate(
&RegistrationRequest{},
)
},
Rollback: nil,
}
}
@@ -14,6 +14,7 @@ func Migrations() []*gormigrate.Migration {
m202210070814_add_filesharing_and_servicecollection_columns(), m202210070814_add_filesharing_and_servicecollection_columns(),
m202210080700_ssh_action_request(), m202210080700_ssh_action_request(),
m202211031100_add_authorized_column(), m202211031100_add_authorized_column(),
m202212201300_add_user_id_column(),
} }
return migrations return migrations
} }
+1
View File
@@ -19,6 +19,7 @@ type RegistrationRequest struct {
CreatedAt time.Time CreatedAt time.Time
Authenticated bool Authenticated bool
Error string Error string
UserID uint64
} }
func (r *RegistrationRequest) IsFinished() bool { func (r *RegistrationRequest) IsFinished() bool {
+1 -1
View File
@@ -100,7 +100,7 @@ func (r *repository) GetOrCreateUserWithAccount(ctx context.Context, tailnet *Ta
func (r *repository) GetUser(ctx context.Context, userID uint64) (*User, error) { func (r *repository) GetUser(ctx context.Context, userID uint64) (*User, error) {
var m User var m User
tx := r.withContext(ctx).Preload("Tailnet").Preload("Account").First(&m, "id = ? and user_type = ?", userID, UserTypePerson) tx := r.withContext(ctx).Preload("Tailnet").Preload("Account").First(&m, "id = ?", userID)
if errors.Is(tx.Error, gorm.ErrRecordNotFound) { if errors.Is(tx.Error, gorm.ErrRecordNotFound) {
return nil, nil return nil, nil
+1
View File
@@ -515,6 +515,7 @@ func (h *AuthenticationHandlers) endMachineRegistrationFlow(c echo.Context, regi
err = h.repository.Transaction(func(rp domain.Repository) error { err = h.repository.Transaction(func(rp domain.Repository) error {
registrationRequest.Authenticated = true registrationRequest.Authenticated = true
registrationRequest.Error = "" registrationRequest.Error = ""
registrationRequest.UserID = user.ID
if err := rp.SaveMachine(ctx, m); err != nil { if err := rp.SaveMachine(ctx, m); err != nil {
return err return err
+29 -3
View File
@@ -8,6 +8,7 @@ import (
"github.com/jsiebens/ionscale/internal/config" "github.com/jsiebens/ionscale/internal/config"
"github.com/jsiebens/ionscale/internal/domain" "github.com/jsiebens/ionscale/internal/domain"
"github.com/jsiebens/ionscale/internal/errors" "github.com/jsiebens/ionscale/internal/errors"
"github.com/jsiebens/ionscale/internal/mapping"
"github.com/jsiebens/ionscale/internal/util" "github.com/jsiebens/ionscale/internal/util"
"github.com/labstack/echo/v4" "github.com/labstack/echo/v4"
"net/http" "net/http"
@@ -103,7 +104,14 @@ func (h *RegistrationHandlers) Register(c echo.Context) error {
return errors.Wrap(err, 0) return errors.Wrap(err, 0)
} }
response := tailcfg.RegisterResponse{MachineAuthorized: true} tUser, tLogin := mapping.ToUser(m.User)
response := tailcfg.RegisterResponse{
MachineAuthorized: m.Authorized,
User: tUser,
Login: tLogin,
}
return binder.WriteResponse(c, http.StatusOK, response) return binder.WriteResponse(c, http.StatusOK, response)
} }
@@ -240,7 +248,13 @@ func (h *RegistrationHandlers) authenticateMachineWithAuthKey(c echo.Context, bi
return errors.Wrap(err, 0) return errors.Wrap(err, 0)
} }
response := tailcfg.RegisterResponse{MachineAuthorized: true} tUser, tLogin := mapping.ToUser(m.User)
response := tailcfg.RegisterResponse{
MachineAuthorized: true,
User: tUser,
Login: tLogin,
}
return binder.WriteResponse(c, http.StatusOK, response) return binder.WriteResponse(c, http.StatusOK, response)
} }
@@ -265,7 +279,19 @@ func (h *RegistrationHandlers) followup(c echo.Context, binder bind.Binder, req
} }
if m != nil && m.IsFinished() { if m != nil && m.IsFinished() {
response := tailcfg.RegisterResponse{MachineAuthorized: len(m.Error) != 0, Error: m.Error} user, err := h.repository.GetUser(ctx, m.UserID)
if err != nil {
return err
}
u, l := mapping.ToUser(*user)
response := tailcfg.RegisterResponse{
MachineAuthorized: len(m.Error) != 0,
Error: m.Error,
User: u,
Login: l,
}
return binder.WriteResponse(c, http.StatusOK, response) return binder.WriteResponse(c, http.StatusOK, response)
} }
case <-notify: case <-notify:
+17
View File
@@ -226,6 +226,23 @@ func ToUserProfile(u domain.User) tailcfg.UserProfile {
return profile return profile
} }
func ToUser(u domain.User) (tailcfg.User, tailcfg.Login) {
user := tailcfg.User{
ID: tailcfg.UserID(u.ID),
LoginName: u.Name,
DisplayName: u.Name,
Logins: []tailcfg.LoginID{tailcfg.LoginID(u.ID)},
Domain: u.Tailnet.Name,
}
login := tailcfg.Login{
ID: tailcfg.LoginID(u.ID),
LoginName: u.Name,
DisplayName: u.Name,
Domain: u.Tailnet.Name,
}
return user, login
}
func filterServices(services []tailcfg.Service) []tailcfg.Service { func filterServices(services []tailcfg.Service) []tailcfg.Service {
result := []tailcfg.Service{} result := []tailcfg.Service{}
for _, s := range services { for _, s := range services {
+5 -1
View File
@@ -47,7 +47,7 @@ func (s *Service) DeleteUser(ctx context.Context, req *connect.Request[api.Delet
principal := CurrentPrincipal(ctx) principal := CurrentPrincipal(ctx)
if !principal.IsSystemAdmin() && principal.UserMatches(req.Msg.UserId) { if !principal.IsSystemAdmin() && principal.UserMatches(req.Msg.UserId) {
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("unable delete yourself")) return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("unable to delete yourself"))
} }
user, err := s.repository.GetUser(ctx, req.Msg.UserId) user, err := s.repository.GetUser(ctx, req.Msg.UserId)
@@ -63,6 +63,10 @@ func (s *Service) DeleteUser(ctx context.Context, req *connect.Request[api.Delet
return nil, connect.NewError(connect.CodePermissionDenied, fmt.Errorf("permission denied")) return nil, connect.NewError(connect.CodePermissionDenied, fmt.Errorf("permission denied"))
} }
if user.UserType == domain.UserTypeService {
return nil, connect.NewError(connect.CodeInvalidArgument, fmt.Errorf("unable delete service account"))
}
err = s.repository.Transaction(func(tx domain.Repository) error { err = s.repository.Transaction(func(tx domain.Repository) error {
if err := tx.DeleteMachineByUser(ctx, req.Msg.UserId); err != nil { if err := tx.DeleteMachineByUser(ctx, req.Msg.UserId); err != nil {
return err return err