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  })