fleet/server/service/labels_util.go

58 lines
1.7 KiB
Go

package service
import (
"context"
"github.com/fleetdm/fleet/v4/server/contexts/ctxerr"
"github.com/fleetdm/fleet/v4/server/fleet"
"github.com/fleetdm/fleet/v4/server/ptr"
)
func loadLabelsFromNames(ctx context.Context, ds fleet.Datastore, labelNames []string, filter fleet.TeamFilter) (map[string]*fleet.Label, error) {
labelsMap, err := ds.LabelsByName(ctx, labelNames, filter)
if err != nil {
return nil, ctxerr.Wrap(ctx, err, "get labels by name")
}
// Make sure that all labels were found
for _, labelName := range labelNames {
if _, ok := labelsMap[labelName]; !ok {
return nil, ctxerr.Wrap(ctx, badRequestf("label %q not found", labelName))
}
}
return labelsMap, nil
}
func verifyLabelsToAssociate(ctx context.Context, ds fleet.Datastore, entityTeamID *uint, labelNames []string, user *fleet.User) error {
if len(labelNames) == 0 {
return nil
}
if user == nil {
return ctxerr.New(ctx, "Authentication required")
}
// Remove duplicate names.
seen := make(map[string]struct{})
uniqueLabelNames := make([]string, 0, len(labelNames))
for _, s := range labelNames {
if _, ok := seen[s]; ok {
continue
}
seen[s] = struct{}{}
uniqueLabelNames = append(uniqueLabelNames, s)
}
if entityTeamID == nil { // no-team/all-teams entities can only access global labels
entityTeamID = ptr.Uint(0)
}
labels, err := loadLabelsFromNames(ctx, ds, uniqueLabelNames, fleet.TeamFilter{User: user, TeamID: entityTeamID})
if err != nil {
return ctxerr.Wrap(ctx, err, "labels by name")
}
if len(labels) != len(uniqueLabelNames) {
return ctxerr.Wrap(ctx, badRequest("one or more labels specified do not exist, or cannot be applied to this entity"))
}
return nil
}