mirror of
https://github.com/minio/minio.git
synced 2025-11-07 04:42:56 -05:00
policy: Do not return an error for invalid value during parsing (#9442)
s3:HardwareInfo was removed recently. Users having that admin action stored in the backend will have an issue starting the server. To fix this, we need to avoid returning an error in Marshal/Unmarshal when they encounter an invalid action and validate only in specific location. Currently the validation is done and in ParseConfig().
This commit is contained in:
@@ -16,10 +16,6 @@
|
||||
|
||||
package policy
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
)
|
||||
|
||||
// Effect - policy statement effect Allow or Deny.
|
||||
type Effect string
|
||||
|
||||
@@ -49,29 +45,3 @@ func (effect Effect) IsValid() bool {
|
||||
|
||||
return false
|
||||
}
|
||||
|
||||
// MarshalJSON - encodes Effect to JSON data.
|
||||
func (effect Effect) MarshalJSON() ([]byte, error) {
|
||||
if !effect.IsValid() {
|
||||
return nil, Errorf("invalid effect '%v'", effect)
|
||||
}
|
||||
|
||||
return json.Marshal(string(effect))
|
||||
}
|
||||
|
||||
// UnmarshalJSON - decodes JSON data to Effect.
|
||||
func (effect *Effect) UnmarshalJSON(data []byte) error {
|
||||
var s string
|
||||
if err := json.Unmarshal(data, &s); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
e := Effect(s)
|
||||
if !e.IsValid() {
|
||||
return Errorf("invalid effect '%v'", s)
|
||||
}
|
||||
|
||||
*effect = e
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
package policy
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -63,60 +61,3 @@ func TestEffectIsValid(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestEffectMarshalJSON(t *testing.T) {
|
||||
testCases := []struct {
|
||||
effect Effect
|
||||
expectedResult []byte
|
||||
expectErr bool
|
||||
}{
|
||||
{Allow, []byte(`"Allow"`), false},
|
||||
{Deny, []byte(`"Deny"`), false},
|
||||
{Effect(""), nil, true},
|
||||
{Effect("foo"), nil, true},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
result, err := json.Marshal(testCase.effect)
|
||||
expectErr := (err != nil)
|
||||
|
||||
if expectErr != testCase.expectErr {
|
||||
t.Fatalf("case %v: error: expected: %v, got: %v\n", i+1, testCase.expectErr, expectErr)
|
||||
}
|
||||
|
||||
if !testCase.expectErr {
|
||||
if !reflect.DeepEqual(result, testCase.expectedResult) {
|
||||
t.Fatalf("case %v: result: expected: %v, got: %v\n", i+1, string(testCase.expectedResult), string(result))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestEffectUnmarshalJSON(t *testing.T) {
|
||||
testCases := []struct {
|
||||
data []byte
|
||||
expectedResult Effect
|
||||
expectErr bool
|
||||
}{
|
||||
{[]byte(`"Allow"`), Allow, false},
|
||||
{[]byte(`"Deny"`), Deny, false},
|
||||
{[]byte(`""`), Effect(""), true},
|
||||
{[]byte(`"foo"`), Effect(""), true},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
var result Effect
|
||||
err := json.Unmarshal(testCase.data, &result)
|
||||
expectErr := (err != nil)
|
||||
|
||||
if expectErr != testCase.expectErr {
|
||||
t.Fatalf("case %v: error: expected: %v, got: %v\n", i+1, testCase.expectErr, expectErr)
|
||||
}
|
||||
|
||||
if !testCase.expectErr {
|
||||
if result != testCase.expectedResult {
|
||||
t.Fatalf("case %v: result: expected: %v, got: %v\n", i+1, testCase.expectedResult, result)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -17,7 +17,6 @@
|
||||
package policy
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"unicode/utf8"
|
||||
)
|
||||
|
||||
@@ -28,29 +27,3 @@ type ID string
|
||||
func (id ID) IsValid() bool {
|
||||
return utf8.ValidString(string(id))
|
||||
}
|
||||
|
||||
// MarshalJSON - encodes ID to JSON data.
|
||||
func (id ID) MarshalJSON() ([]byte, error) {
|
||||
if !id.IsValid() {
|
||||
return nil, Errorf("invalid ID %v", id)
|
||||
}
|
||||
|
||||
return json.Marshal(string(id))
|
||||
}
|
||||
|
||||
// UnmarshalJSON - decodes JSON data to ID.
|
||||
func (id *ID) UnmarshalJSON(data []byte) error {
|
||||
var s string
|
||||
if err := json.Unmarshal(data, &s); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
i := ID(s)
|
||||
if !i.IsValid() {
|
||||
return Errorf("invalid ID %v", s)
|
||||
}
|
||||
|
||||
*id = i
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
@@ -17,8 +17,6 @@
|
||||
package policy
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"reflect"
|
||||
"testing"
|
||||
)
|
||||
|
||||
@@ -40,58 +38,3 @@ func TestIDIsValid(t *testing.T) {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIDMarshalJSON(t *testing.T) {
|
||||
testCases := []struct {
|
||||
id ID
|
||||
expectedResult []byte
|
||||
expectErr bool
|
||||
}{
|
||||
{ID("DenyEncryptionSt1"), []byte(`"DenyEncryptionSt1"`), false},
|
||||
{ID(""), []byte(`""`), false},
|
||||
{ID("aa\xe2"), nil, true}, // invalid utf-8
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
result, err := json.Marshal(testCase.id)
|
||||
expectErr := (err != nil)
|
||||
|
||||
if expectErr != testCase.expectErr {
|
||||
t.Fatalf("case %v: error: expected: %v, got: %v\n", i+1, testCase.expectErr, expectErr)
|
||||
}
|
||||
|
||||
if !testCase.expectErr {
|
||||
if !reflect.DeepEqual(result, testCase.expectedResult) {
|
||||
t.Fatalf("case %v: result: expected: %v, got: %v\n", i+1, string(testCase.expectedResult), string(result))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestIDUnmarshalJSON(t *testing.T) {
|
||||
testCases := []struct {
|
||||
data []byte
|
||||
expectedResult ID
|
||||
expectErr bool
|
||||
}{
|
||||
{[]byte(`"DenyEncryptionSt1"`), ID("DenyEncryptionSt1"), false},
|
||||
{[]byte(`""`), ID(""), false},
|
||||
{[]byte(`"aa\xe2"`), ID(""), true},
|
||||
}
|
||||
|
||||
for i, testCase := range testCases {
|
||||
var result ID
|
||||
err := json.Unmarshal(testCase.data, &result)
|
||||
expectErr := (err != nil)
|
||||
|
||||
if expectErr != testCase.expectErr {
|
||||
t.Fatalf("case %v: error: expected: %v, got: %v\n", i+1, testCase.expectErr, expectErr)
|
||||
}
|
||||
|
||||
if !testCase.expectErr {
|
||||
if result != testCase.expectedResult {
|
||||
t.Fatalf("case %v: result: expected: %v, got: %v\n", i+1, testCase.expectedResult, result)
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user