diff --git a/changes/33502-longer-vars-not-processed-in-right-order b/changes/33502-longer-vars-not-processed-in-right-order new file mode 100644 index 0000000000..66ecb887fe --- /dev/null +++ b/changes/33502-longer-vars-not-processed-in-right-order @@ -0,0 +1 @@ +* Fixed an issue where longer variable names ($FLEET_VAR_HOST_END_USER_IDP_USERNAME_LOCAL_PART) with the same base ($FLEET_VAR_HOST_END_USER_IDP_USERNAME) was not processed in the right order. \ No newline at end of file diff --git a/server/variables/variables.go b/server/variables/variables.go index aaad7508b7..3757330cc0 100644 --- a/server/variables/variables.go +++ b/server/variables/variables.go @@ -5,6 +5,7 @@ package variables import ( "regexp" + "sort" "strings" ) @@ -59,7 +60,14 @@ func FindKeepDuplicates(contents string) []string { } } } - return result + + // sort result array by length descending, to ensure longer variables are processed first + sortedResults := make([]string, len(result)) + copy(sortedResults, result) + sort.Slice(sortedResults, func(i, j int) bool { + return len(sortedResults[i]) > len(sortedResults[j]) + }) + return sortedResults } // dedupe removes duplicates from the slice and returns a map for O(1) lookups. diff --git a/server/variables/variables_test.go b/server/variables/variables_test.go index 2940485092..f83e621d81 100644 --- a/server/variables/variables_test.go +++ b/server/variables/variables_test.go @@ -102,7 +102,16 @@ func TestFindKeepDuplicates(t *testing.T) { { name: "mixed variables with duplicates", content: "$FLEET_VAR_HOST_UUID, $FLEET_VAR_HOST_EMAIL, ${FLEET_VAR_HOST_UUID}", - expected: []string{"HOST_UUID", "HOST_EMAIL", "HOST_UUID"}, + expected: []string{"HOST_EMAIL", "HOST_UUID", "HOST_UUID"}, + }, + { + name: "sorted by length", + content: "$FLEET_VAR_HOST_END_USER_IDP_USERNAME, $FLEET_VAR_HOST_END_USER_IDP_USERNAME_LOCAL_PART, $FLEET_VAR_HOST_UUID", + expected: []string{ + "HOST_END_USER_IDP_USERNAME_LOCAL_PART", + "HOST_END_USER_IDP_USERNAME", + "HOST_UUID", + }, }, }