mirror of
https://github.com/empayre/fleet.git
synced 2024-11-06 08:55:24 +00:00
9b4976ef8f
A user should have a global role or roles on some teams, but not both. This ensures that is set properly and does validation.
92 lines
2.8 KiB
Go
92 lines
2.8 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
|
|
"github.com/fleetdm/fleet/server/kolide"
|
|
"github.com/go-kit/kit/endpoint"
|
|
"github.com/pkg/errors"
|
|
)
|
|
|
|
type setupRequest struct {
|
|
Admin *kolide.UserPayload `json:"admin"`
|
|
OrgInfo *kolide.OrgInfo `json:"org_info"`
|
|
KolideServerURL *string `json:"kolide_server_url,omitempty"`
|
|
EnrollSecret *string `json:"osquery_enroll_secret,omitempty"`
|
|
}
|
|
|
|
type setupResponse struct {
|
|
Admin *kolide.User `json:"admin,omitempty"`
|
|
OrgInfo *kolide.OrgInfo `json:"org_info,omitempty"`
|
|
KolideServerURL *string `json:"kolide_server_url"`
|
|
EnrollSecret *string `json:"osquery_enroll_secret"`
|
|
Token *string `json:"token,omitempty"`
|
|
Err error `json:"error,omitempty"`
|
|
}
|
|
|
|
func (r setupResponse) error() error { return r.Err }
|
|
|
|
func makeSetupEndpoint(svc kolide.Service) endpoint.Endpoint {
|
|
return func(ctx context.Context, request interface{}) (interface{}, error) {
|
|
var (
|
|
admin *kolide.User
|
|
config *kolide.AppConfig
|
|
configPayload kolide.AppConfigPayload
|
|
err error
|
|
)
|
|
req := request.(setupRequest)
|
|
if req.OrgInfo != nil {
|
|
configPayload.OrgInfo = req.OrgInfo
|
|
}
|
|
configPayload.ServerSettings = &kolide.ServerSettings{}
|
|
if req.KolideServerURL != nil {
|
|
configPayload.ServerSettings.KolideServerURL = req.KolideServerURL
|
|
}
|
|
config, err = svc.NewAppConfig(ctx, configPayload)
|
|
if err != nil {
|
|
return setupResponse{Err: err}, nil
|
|
}
|
|
|
|
if req.Admin == nil {
|
|
return setupResponse{Err: errors.New("setup request must provide admin")}, nil
|
|
}
|
|
|
|
// creating the user should be the last action. If there's a user
|
|
// present and other errors occur, the setup endpoint closes.
|
|
adminPayload := *req.Admin
|
|
if adminPayload.Email == nil || *adminPayload.Email == "" {
|
|
err := errors.Errorf("admin email cannot be empty")
|
|
return setupResponse{Err: err}, nil
|
|
}
|
|
if adminPayload.Password == nil || *adminPayload.Password == "" {
|
|
err := errors.Errorf("admin password cannot be empty")
|
|
return setupResponse{Err: err}, nil
|
|
}
|
|
// Make the user an admin
|
|
adminStr := "admin"
|
|
adminPayload.GlobalRole = &adminStr
|
|
admin, err = svc.CreateUser(ctx, adminPayload)
|
|
if err != nil {
|
|
return setupResponse{Err: err}, nil
|
|
}
|
|
|
|
// If everything works to this point, log the user in and return token. If
|
|
// the login fails for some reason, ignore the error and don't return
|
|
// a token, forcing the user to log in manually
|
|
token := new(string)
|
|
_, *token, err = svc.Login(ctx, *req.Admin.Username, *req.Admin.Password)
|
|
if err != nil {
|
|
token = nil
|
|
}
|
|
return setupResponse{
|
|
Admin: admin,
|
|
OrgInfo: &kolide.OrgInfo{
|
|
OrgName: &config.OrgName,
|
|
OrgLogoURL: &config.OrgLogoURL,
|
|
},
|
|
KolideServerURL: &config.KolideServerURL,
|
|
Token: token,
|
|
}, nil
|
|
}
|
|
}
|