github.com/cs3org/reva/v2@v2.27.7/tests/integration/grpc/userprovider_test.go (about) 1 // Copyright 2018-2021 CERN 2 // 3 // Licensed under the Apache License, Version 2.0 (the "License"); 4 // you may not use this file except in compliance with the License. 5 // You may obtain a copy of the License at 6 // 7 // http://www.apache.org/licenses/LICENSE-2.0 8 // 9 // Unless required by applicable law or agreed to in writing, software 10 // distributed under the License is distributed on an "AS IS" BASIS, 11 // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 // See the License for the specific language governing permissions and 13 // limitations under the License. 14 // 15 // In applying this license, CERN does not waive the privileges and immunities 16 // granted to it by virtue of its status as an Intergovernmental Organization 17 // or submit itself to any jurisdiction. 18 19 package grpc_test 20 21 import ( 22 "context" 23 "os" 24 25 userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" 26 rpc "github.com/cs3org/go-cs3apis/cs3/rpc/v1beta1" 27 "github.com/cs3org/reva/v2/pkg/auth/scope" 28 ctxpkg "github.com/cs3org/reva/v2/pkg/ctx" 29 "github.com/cs3org/reva/v2/pkg/rgrpc/todo/pool" 30 jwt "github.com/cs3org/reva/v2/pkg/token/manager/jwt" 31 "google.golang.org/grpc/metadata" 32 33 . "github.com/onsi/ginkgo/v2" 34 . "github.com/onsi/gomega" 35 ) 36 37 var _ = Describe("user providers", func() { 38 var ( 39 dependencies []RevadConfig 40 revads map[string]*Revad 41 42 existingIdp string 43 44 ctx context.Context 45 serviceClient userpb.UserAPIClient 46 ) 47 48 JustBeforeEach(func() { 49 var err error 50 ctx = context.Background() 51 52 // Add auth token 53 user := &userpb.User{ 54 Id: &userpb.UserId{ 55 Idp: existingIdp, 56 OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", 57 Type: userpb.UserType_USER_TYPE_PRIMARY, 58 }, 59 } 60 tokenManager, err := jwt.New(map[string]interface{}{"secret": "changemeplease"}) 61 Expect(err).ToNot(HaveOccurred()) 62 scope, err := scope.AddOwnerScope(nil) 63 Expect(err).ToNot(HaveOccurred()) 64 t, err := tokenManager.MintToken(ctx, user, scope) 65 Expect(err).ToNot(HaveOccurred()) 66 ctx = ctxpkg.ContextSetToken(ctx, t) 67 ctx = metadata.AppendToOutgoingContext(ctx, ctxpkg.TokenHeader, t) 68 ctx = ctxpkg.ContextSetUser(ctx, user) 69 70 revads, err = startRevads(dependencies, map[string]string{}) 71 Expect(err).ToNot(HaveOccurred()) 72 serviceClient, err = pool.GetUserProviderServiceClient(revads["users"].GrpcAddress) 73 Expect(err).ToNot(HaveOccurred()) 74 }) 75 76 AfterEach(func() { 77 for _, r := range revads { 78 Expect(r.Cleanup(CurrentSpecReport().Failed())).To(Succeed()) 79 } 80 }) 81 82 var assertGetUserByClaimResponses = func() { 83 It("gets users as expected", func() { 84 tests := map[string]string{ 85 "mail": "einstein@example.org", 86 "username": "einstein", 87 "uid": "123", 88 } 89 90 for claim, value := range tests { 91 user, err := serviceClient.GetUserByClaim(ctx, &userpb.GetUserByClaimRequest{Claim: claim, Value: value}) 92 Expect(err).ToNot(HaveOccurred()) 93 Expect(user.User).ToNot(BeNil()) 94 Expect(user.User.Mail).To(Equal("einstein@example.org")) 95 } 96 }) 97 } 98 99 var assertGetUserResponses = func() { 100 It("gets users as expected", func() { 101 tests := []struct { 102 name string 103 userID *userpb.UserId 104 want *userpb.GetUserResponse 105 }{ 106 { 107 name: "simple", 108 userID: &userpb.UserId{ 109 Idp: existingIdp, 110 OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", 111 Type: userpb.UserType_USER_TYPE_PRIMARY, 112 }, 113 want: &userpb.GetUserResponse{ 114 Status: &rpc.Status{ 115 Code: 1, 116 }, 117 User: &userpb.User{ 118 Username: "marie", 119 Mail: "marie@example.org", 120 DisplayName: "Marie Curie", 121 Groups: []string{ 122 "radium-lovers", 123 "polonium-lovers", 124 "physics-lovers", 125 }, 126 }, 127 }, 128 }, 129 { 130 name: "not-existing opaqueId", 131 userID: &userpb.UserId{ 132 Idp: existingIdp, 133 OpaqueId: "doesnote-xist-4376-b307-cf0a8c2d0d9c", 134 Type: userpb.UserType_USER_TYPE_PRIMARY, 135 }, 136 want: &userpb.GetUserResponse{ 137 Status: &rpc.Status{ 138 Code: 6, 139 }, 140 }, 141 }, 142 { 143 name: "no opaqueId", 144 userID: &userpb.UserId{ 145 Idp: existingIdp, 146 OpaqueId: "", 147 Type: userpb.UserType_USER_TYPE_PRIMARY, 148 }, 149 want: &userpb.GetUserResponse{ 150 Status: &rpc.Status{ 151 Code: 6, 152 }, 153 }, 154 }, 155 { 156 name: "not-existing idp", 157 userID: &userpb.UserId{ 158 Idp: "http://does-not-exist:12345", 159 OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", 160 Type: userpb.UserType_USER_TYPE_PRIMARY, 161 }, 162 want: &userpb.GetUserResponse{ 163 Status: &rpc.Status{ 164 Code: 6, 165 }, 166 }, 167 }, 168 { 169 name: "no idp", 170 userID: &userpb.UserId{ 171 OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", 172 }, 173 want: &userpb.GetUserResponse{ 174 Status: &rpc.Status{ 175 Code: 1, 176 }, 177 User: &userpb.User{ 178 Username: "marie", 179 Mail: "marie@example.org", 180 DisplayName: "Marie Curie", 181 Groups: []string{ 182 "radium-lovers", 183 "polonium-lovers", 184 "physics-lovers", 185 }, 186 }, 187 }, 188 }, 189 } 190 191 for _, t := range tests { 192 userResp, err := serviceClient.GetUser(ctx, &userpb.GetUserRequest{ 193 UserId: t.userID, 194 }) 195 Expect(err).ToNot(HaveOccurred()) 196 Expect(t.want.Status.Code).To(Equal(userResp.Status.Code)) 197 if t.want.User == nil { 198 Expect(userResp.User).To(BeNil()) 199 } else { 200 // make sure not to run into a nil pointer error 201 Expect(userResp.User).ToNot(BeNil()) 202 Expect(t.want.User.Username).To(Equal(userResp.User.Username)) 203 Expect(t.want.User.Mail).To(Equal(userResp.User.Mail)) 204 Expect(t.want.User.DisplayName).To(Equal(userResp.User.DisplayName)) 205 Expect(t.want.User.Groups).To(Equal(userResp.User.Groups)) 206 } 207 } 208 }) 209 } 210 211 var assertFindUsersResponses = func() { 212 It("finds users by email", func() { 213 res, err := serviceClient.FindUsers(ctx, &userpb.FindUsersRequest{Filter: "marie@example.org"}) 214 Expect(err).ToNot(HaveOccurred()) 215 Expect(len(res.Users)).To(Equal(1)) 216 user := res.Users[0] 217 Expect(user.DisplayName).To(Equal("Marie Curie")) 218 }) 219 220 It("finds users by displayname", func() { 221 res, err := serviceClient.FindUsers(ctx, &userpb.FindUsersRequest{Filter: "Marie Curie"}) 222 Expect(err).ToNot(HaveOccurred()) 223 Expect(len(res.Users)).To(Equal(1)) 224 user := res.Users[0] 225 Expect(user.Mail).To(Equal("marie@example.org")) 226 }) 227 228 It("finds users by username", func() { 229 res, err := serviceClient.FindUsers(ctx, &userpb.FindUsersRequest{Filter: "marie"}) 230 Expect(err).ToNot(HaveOccurred()) 231 Expect(len(res.Users)).To(Equal(1)) 232 user := res.Users[0] 233 Expect(user.Mail).To(Equal("marie@example.org")) 234 }) 235 236 It("finds users by id", func() { 237 res, err := serviceClient.FindUsers(ctx, &userpb.FindUsersRequest{Filter: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c"}) 238 Expect(err).ToNot(HaveOccurred()) 239 Expect(len(res.Users)).To(Equal(1)) 240 user := res.Users[0] 241 Expect(user.Mail).To(Equal("marie@example.org")) 242 }) 243 } 244 245 Describe("the json userprovider", func() { 246 BeforeEach(func() { 247 dependencies = []RevadConfig{ 248 { 249 Name: "users", 250 Config: "userprovider-json.toml", 251 }, 252 } 253 existingIdp = "http://localhost:20080" 254 }) 255 256 assertFindUsersResponses() 257 assertGetUserResponses() 258 assertGetUserByClaimResponses() 259 }) 260 261 Describe("the demo userprovider", func() { 262 BeforeEach(func() { 263 dependencies = []RevadConfig{ 264 { 265 Name: "users", 266 Config: "userprovider-demo.toml", 267 }, 268 } 269 existingIdp = "http://localhost:9998" 270 }) 271 272 assertGetUserResponses() 273 assertFindUsersResponses() 274 assertGetUserByClaimResponses() 275 }) 276 277 Describe("the ldap userprovider", func() { 278 runldap := os.Getenv("RUN_LDAP_TESTS") 279 BeforeEach(func() { 280 if runldap == "" { 281 Skip("Skipping LDAP tests") 282 } 283 dependencies = []RevadConfig{ 284 { 285 Name: "users", 286 Config: "userprovider-ldap.toml", 287 }, 288 } 289 existingIdp = "http://localhost:20080" 290 }) 291 292 assertGetUserResponses() 293 assertFindUsersResponses() 294 assertGetUserByClaimResponses() 295 }) 296 })