291 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			291 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
package rules
 | 
						|
 | 
						|
import (
 | 
						|
	"testing"
 | 
						|
 | 
						|
	"github.com/micro/go-micro/v2/auth"
 | 
						|
)
 | 
						|
 | 
						|
func TestVerify(t *testing.T) {
 | 
						|
	srvResource := &auth.Resource{
 | 
						|
		Type:     "service",
 | 
						|
		Name:     "go.micro.service.foo",
 | 
						|
		Endpoint: "Foo.Bar",
 | 
						|
	}
 | 
						|
 | 
						|
	webResource := &auth.Resource{
 | 
						|
		Type:     "service",
 | 
						|
		Name:     "go.micro.web.foo",
 | 
						|
		Endpoint: "/foo/bar",
 | 
						|
	}
 | 
						|
 | 
						|
	catchallResource := &auth.Resource{
 | 
						|
		Type:     "*",
 | 
						|
		Name:     "*",
 | 
						|
		Endpoint: "*",
 | 
						|
	}
 | 
						|
 | 
						|
	tt := []struct {
 | 
						|
		Name     string
 | 
						|
		Rules    []*auth.Rule
 | 
						|
		Account  *auth.Account
 | 
						|
		Resource *auth.Resource
 | 
						|
		Error    error
 | 
						|
	}{
 | 
						|
		{
 | 
						|
			Name:     "NoRules",
 | 
						|
			Rules:    []*auth.Rule{},
 | 
						|
			Account:  nil,
 | 
						|
			Resource: srvResource,
 | 
						|
			Error:    auth.ErrForbidden,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "CatchallPublicAccount",
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Resource: srvResource,
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "",
 | 
						|
					Resource: catchallResource,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "CatchallPublicNoAccount",
 | 
						|
			Resource: srvResource,
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "",
 | 
						|
					Resource: catchallResource,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "CatchallPrivateAccount",
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Resource: srvResource,
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: catchallResource,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "CatchallPrivateNoAccount",
 | 
						|
			Resource: srvResource,
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: catchallResource,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Error: auth.ErrForbidden,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "CatchallServiceRuleMatch",
 | 
						|
			Resource: srvResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope: "*",
 | 
						|
					Resource: &auth.Resource{
 | 
						|
						Type:     srvResource.Type,
 | 
						|
						Name:     srvResource.Name,
 | 
						|
						Endpoint: "*",
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "CatchallServiceRuleNoMatch",
 | 
						|
			Resource: srvResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope: "*",
 | 
						|
					Resource: &auth.Resource{
 | 
						|
						Type:     srvResource.Type,
 | 
						|
						Name:     "wrongname",
 | 
						|
						Endpoint: "*",
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Error: auth.ErrForbidden,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "ExactRuleValidScope",
 | 
						|
			Resource: srvResource,
 | 
						|
			Account: &auth.Account{
 | 
						|
				Scopes: []string{"neededscope"},
 | 
						|
			},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "neededscope",
 | 
						|
					Resource: srvResource,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "ExactRuleInvalidScope",
 | 
						|
			Resource: srvResource,
 | 
						|
			Account: &auth.Account{
 | 
						|
				Scopes: []string{"neededscope"},
 | 
						|
			},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "invalidscope",
 | 
						|
					Resource: srvResource,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Error: auth.ErrForbidden,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "CatchallDenyWithAccount",
 | 
						|
			Resource: srvResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: catchallResource,
 | 
						|
					Access:   auth.AccessDenied,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Error: auth.ErrForbidden,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "CatchallDenyWithNoAccount",
 | 
						|
			Resource: srvResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: catchallResource,
 | 
						|
					Access:   auth.AccessDenied,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Error: auth.ErrForbidden,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "RulePriorityGrantFirst",
 | 
						|
			Resource: srvResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: catchallResource,
 | 
						|
					Access:   auth.AccessGranted,
 | 
						|
					Priority: 1,
 | 
						|
				},
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: catchallResource,
 | 
						|
					Access:   auth.AccessDenied,
 | 
						|
					Priority: 0,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "RulePriorityDenyFirst",
 | 
						|
			Resource: srvResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: catchallResource,
 | 
						|
					Access:   auth.AccessGranted,
 | 
						|
					Priority: 0,
 | 
						|
				},
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: catchallResource,
 | 
						|
					Access:   auth.AccessDenied,
 | 
						|
					Priority: 1,
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Error: auth.ErrForbidden,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "WebExactEndpointValid",
 | 
						|
			Resource: webResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope:    "*",
 | 
						|
					Resource: webResource,
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "WebExactEndpointInalid",
 | 
						|
			Resource: webResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope: "*",
 | 
						|
					Resource: &auth.Resource{
 | 
						|
						Type:     webResource.Type,
 | 
						|
						Name:     webResource.Name,
 | 
						|
						Endpoint: "invalidendpoint",
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Error: auth.ErrForbidden,
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "WebWildcardEndpoint",
 | 
						|
			Resource: webResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope: "*",
 | 
						|
					Resource: &auth.Resource{
 | 
						|
						Type:     webResource.Type,
 | 
						|
						Name:     webResource.Name,
 | 
						|
						Endpoint: "*",
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "WebWildcardPathEndpointValid",
 | 
						|
			Resource: webResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope: "*",
 | 
						|
					Resource: &auth.Resource{
 | 
						|
						Type:     webResource.Type,
 | 
						|
						Name:     webResource.Name,
 | 
						|
						Endpoint: "/foo/*",
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
		},
 | 
						|
		{
 | 
						|
			Name:     "WebWildcardPathEndpointInvalid",
 | 
						|
			Resource: webResource,
 | 
						|
			Account:  &auth.Account{},
 | 
						|
			Rules: []*auth.Rule{
 | 
						|
				&auth.Rule{
 | 
						|
					Scope: "*",
 | 
						|
					Resource: &auth.Resource{
 | 
						|
						Type:     webResource.Type,
 | 
						|
						Name:     webResource.Name,
 | 
						|
						Endpoint: "/bar/*",
 | 
						|
					},
 | 
						|
				},
 | 
						|
			},
 | 
						|
			Error: auth.ErrForbidden,
 | 
						|
		},
 | 
						|
	}
 | 
						|
 | 
						|
	for _, tc := range tt {
 | 
						|
		t.Run(tc.Name, func(t *testing.T) {
 | 
						|
			if err := Verify(tc.Rules, tc.Account, tc.Resource); err != tc.Error {
 | 
						|
				t.Errorf("Expected %v but got %v", tc.Error, err)
 | 
						|
			}
 | 
						|
		})
 | 
						|
	}
 | 
						|
}
 |