mirror of
https://github.com/fleetdm/fleet
synced 2026-05-24 09:28:54 +00:00
58 lines
1.7 KiB
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
|
|
}
|