MM-14441: restrict system admin config (#10477)
* tweak utils.Merge docs * move merge_test to utils_test package for easier testing * utils: support MergeConfig and StructFieldFilter * constrain updating certain fields by the restricted system admin
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
3d92af2737
Коммит
8c8b1bbc9c
@@ -1,11 +1,14 @@
|
||||
package utils
|
||||
package utils_test
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"reflect"
|
||||
"testing"
|
||||
|
||||
"github.com/stretchr/testify/assert"
|
||||
"github.com/stretchr/testify/require"
|
||||
|
||||
"github.com/mattermost/mattermost-server/utils"
|
||||
)
|
||||
|
||||
// Test merging maps alone. This isolates the complexity of merging maps from merging maps recursively in
|
||||
@@ -1156,6 +1159,38 @@ func TestMergeWithVeryComplexStruct(t *testing.T) {
|
||||
})
|
||||
}
|
||||
|
||||
func TestMergeWithStructFieldFilter(t *testing.T) {
|
||||
t.Run("filter skips merging from patch", func(t *testing.T) {
|
||||
t1 := evenSimpler{newBool(true), &evenSimpler2{newString("base")}}
|
||||
t2 := evenSimpler{newBool(false), &evenSimpler2{newString("patch")}}
|
||||
expected := evenSimpler{newBool(true), &evenSimpler2{newString("base")}}
|
||||
|
||||
merged, err := mergeEvenSimplerWithConfig(t1, t2, &utils.MergeConfig{
|
||||
StructFieldFilter: func(structField reflect.StructField, base, patch reflect.Value) bool {
|
||||
return false
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, expected, *merged)
|
||||
})
|
||||
|
||||
t.Run("filter skips merging configured fields from patch", func(t *testing.T) {
|
||||
t1 := evenSimpler{newBool(true), &evenSimpler2{newString("base")}}
|
||||
t2 := evenSimpler{newBool(false), &evenSimpler2{newString("patch")}}
|
||||
expected := evenSimpler{newBool(false), &evenSimpler2{newString("base")}}
|
||||
|
||||
merged, err := mergeEvenSimplerWithConfig(t1, t2, &utils.MergeConfig{
|
||||
StructFieldFilter: func(structField reflect.StructField, base, patch reflect.Value) bool {
|
||||
return structField.Name == "B"
|
||||
},
|
||||
})
|
||||
require.NoError(t, err)
|
||||
|
||||
assert.Equal(t, expected, *merged)
|
||||
})
|
||||
}
|
||||
|
||||
type testStruct struct {
|
||||
I int
|
||||
I8 int8
|
||||
@@ -1504,11 +1539,10 @@ func setupStructs(t *testing.T) {
|
||||
map[int]*string{1: newString("Another"), 2: newString("map of"), 3: newString("pointers, wow!")},
|
||||
mergeStructEmbedBaseA, &mergeStructEmbedBaseB,
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
func mergeSimple(base, patch simple) (*simple, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1517,7 +1551,16 @@ func mergeSimple(base, patch simple) (*simple, error) {
|
||||
}
|
||||
|
||||
func mergeEvenSimpler(base, patch evenSimpler) (*evenSimpler, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
retTS := ret.(evenSimpler)
|
||||
return &retTS, nil
|
||||
}
|
||||
|
||||
func mergeEvenSimplerWithConfig(base, patch evenSimpler, mergeConfig *utils.MergeConfig) (*evenSimpler, error) {
|
||||
ret, err := utils.Merge(base, patch, mergeConfig)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1526,7 +1569,7 @@ func mergeEvenSimpler(base, patch evenSimpler) (*evenSimpler, error) {
|
||||
}
|
||||
|
||||
func mergeSliceStruct(base, patch sliceStruct) (*sliceStruct, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1535,7 +1578,7 @@ func mergeSliceStruct(base, patch sliceStruct) (*sliceStruct, error) {
|
||||
}
|
||||
|
||||
func mergeMapPtr(base, patch mapPtr) (*mapPtr, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1544,7 +1587,7 @@ func mergeMapPtr(base, patch mapPtr) (*mapPtr, error) {
|
||||
}
|
||||
|
||||
func mergeMapPtrState(base, patch mapPtrState) (*mapPtrState, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1553,7 +1596,7 @@ func mergeMapPtrState(base, patch mapPtrState) (*mapPtrState, error) {
|
||||
}
|
||||
|
||||
func mergeMapPtrState2(base, patch mapPtrState2) (*mapPtrState2, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1562,7 +1605,7 @@ func mergeMapPtrState2(base, patch mapPtrState2) (*mapPtrState2, error) {
|
||||
}
|
||||
|
||||
func mergeTestStructs(base, patch testStruct) (*testStruct, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1571,7 +1614,7 @@ func mergeTestStructs(base, patch testStruct) (*testStruct, error) {
|
||||
}
|
||||
|
||||
func mergeStringIntMap(base, patch map[string]int) (map[string]int, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1580,7 +1623,7 @@ func mergeStringIntMap(base, patch map[string]int) (map[string]int, error) {
|
||||
}
|
||||
|
||||
func mergeStringPtrIntMap(base, patch map[string]*int) (map[string]*int, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1589,7 +1632,7 @@ func mergeStringPtrIntMap(base, patch map[string]*int) (map[string]*int, error)
|
||||
}
|
||||
|
||||
func mergeStringSliceIntMap(base, patch map[string][]int) (map[string][]int, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1598,7 +1641,7 @@ func mergeStringSliceIntMap(base, patch map[string][]int) (map[string][]int, err
|
||||
}
|
||||
|
||||
func mergeMapOfMap(base, patch map[string]map[string]*int) (map[string]map[string]*int, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1607,7 +1650,7 @@ func mergeMapOfMap(base, patch map[string]map[string]*int) (map[string]map[strin
|
||||
}
|
||||
|
||||
func mergeInterfaceMap(base, patch map[string]interface{}) (map[string]interface{}, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1616,7 +1659,7 @@ func mergeInterfaceMap(base, patch map[string]interface{}) (map[string]interface
|
||||
}
|
||||
|
||||
func mergeStringSlices(base, patch []string) ([]string, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@@ -1625,7 +1668,7 @@ func mergeStringSlices(base, patch []string) ([]string, error) {
|
||||
}
|
||||
|
||||
func mergeTestStructsPtrs(base, patch *testStruct) (*testStruct, error) {
|
||||
ret, err := Merge(base, patch)
|
||||
ret, err := utils.Merge(base, patch, nil)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
Ссылка в новой задаче
Block a user