blob: ff992b76c74bf7bfece9b2f19e247dcb65e87ea4 [file] [log] [blame]
Asim Shankar0c73fbf2014-10-31 15:34:02 -07001package ipc
2
3import (
4 "testing"
5
Jiri Simsa764efb72014-12-25 20:57:03 -08006 vsecurity "v.io/core/veyron/security"
7 "v.io/core/veyron2/security"
Asim Shankar0c73fbf2014-10-31 15:34:02 -07008)
9
10func TestDefaultAuthorizer(t *testing.T) {
11 var (
12 pali, _ = vsecurity.NewPrincipal()
13 pbob, _ = vsecurity.NewPrincipal()
14 pche, _ = vsecurity.NewPrincipal()
15
16 che, _ = pche.BlessSelf("che")
17 ali, _ = pali.BlessSelf("ali")
18 bob, _ = pbob.BlessSelf("bob")
19
20 // bless(ali, bob, "friend") will generate a blessing for ali, calling him "bob/friend".
21 bless = func(target, extend security.Blessings, extension string) security.Blessings {
22 var p security.Principal
23 switch extend {
24 case ali:
25 p = pali
26 case bob:
27 p = pbob
28 case che:
29 p = pche
30 default:
31 panic(extend)
32 }
33 ret, err := p.Bless(target.PublicKey(), extend, extension, security.UnconstrainedUse())
34 if err != nil {
35 panic(err)
36 }
37 return ret
38 }
39
40 U = func(blessings ...security.Blessings) security.Blessings {
41 u, err := security.UnionOfBlessings(blessings...)
42 if err != nil {
43 panic(err)
44 }
45 return u
46 }
47
48 // Shorthands for getting blessings for Ali and Bob.
49 A = func(as security.Blessings, extension string) security.Blessings { return bless(ali, as, extension) }
50 B = func(as security.Blessings, extension string) security.Blessings { return bless(bob, as, extension) }
51
52 authorizer defaultAuthorizer
53 )
54 // Make ali, bob (the two ends) recognize all three blessings
55 for ip, p := range []security.Principal{pali, pbob} {
56 for _, b := range []security.Blessings{ali, bob, che} {
57 if err := p.AddToRoots(b); err != nil {
58 t.Fatalf("%d: %v - %v", ip, b, err)
59 }
60 }
61 }
62 // All tests are run as if "ali" is the local end and "bob" is the remote.
63 tests := []struct {
64 local, remote security.Blessings
65 authorized bool
66 }{
67 {ali, ali, true},
68 {ali, bob, false},
69 {ali, B(ali, "friend"), true}, // ali talking to ali/friend
70 {A(bob, "friend"), bob, true}, // bob/friend talking to bob
71 {A(che, "friend"), B(che, "family"), false}, // che/friend talking to che/family
72 {U(ali, A(bob, "friend"), A(che, "friend")),
73 U(bob, B(che, "family")),
74 true}, // {ali, bob/friend, che/friend} talking to {bob, che/family}
75 }
76 for _, test := range tests {
77 err := authorizer.Authorize(&mockSecurityContext{
78 p: pali,
79 l: test.local,
80 r: test.remote,
81 })
82 if (err == nil) != test.authorized {
83 t.Errorf("Local:%v Remote:%v. Got %v", test.local, test.remote, err)
84 }
85 }
86}
87
88type mockSecurityContext struct {
89 security.Context
90 p security.Principal
91 l, r security.Blessings
92}
93
94func (c *mockSecurityContext) LocalPrincipal() security.Principal { return c.p }
95func (c *mockSecurityContext) LocalBlessings() security.Blessings { return c.l }
96func (c *mockSecurityContext) RemoteBlessings() security.Blessings { return c.r }