github.com/cs3org/reva/v2@v2.27.7/pkg/user/manager/demo/demo.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 demo 20 21 import ( 22 "context" 23 "errors" 24 "strconv" 25 "strings" 26 27 userpb "github.com/cs3org/go-cs3apis/cs3/identity/user/v1beta1" 28 "github.com/cs3org/reva/v2/pkg/errtypes" 29 "github.com/cs3org/reva/v2/pkg/user" 30 "github.com/cs3org/reva/v2/pkg/user/manager/registry" 31 "google.golang.org/protobuf/proto" 32 ) 33 34 func init() { 35 registry.Register("demo", New) 36 } 37 38 type manager struct { 39 catalog map[string]*userpb.User 40 } 41 42 // New returns a new user manager. 43 func New(m map[string]interface{}) (user.Manager, error) { 44 mgr := &manager{} 45 err := mgr.Configure(m) 46 if err != nil { 47 return nil, err 48 } 49 return mgr, err 50 } 51 52 func (m *manager) Configure(ml map[string]interface{}) error { 53 cat := getUsers() 54 m.catalog = cat 55 return nil 56 } 57 58 func (m *manager) GetUser(ctx context.Context, uid *userpb.UserId, skipFetchingGroups bool) (*userpb.User, error) { 59 if user, ok := m.catalog[uid.OpaqueId]; ok { 60 if uid.Idp == "" || user.Id.Idp == uid.Idp { 61 u := proto.Clone(user).(*userpb.User) 62 if skipFetchingGroups { 63 u.Groups = nil 64 } 65 return u, nil 66 } 67 } 68 return nil, errtypes.NotFound(uid.OpaqueId) 69 } 70 71 func (m *manager) GetUserByClaim(ctx context.Context, claim, value string, skipFetchingGroups bool) (*userpb.User, error) { 72 for _, u := range m.catalog { 73 if userClaim, err := extractClaim(u, claim); err == nil && value == userClaim { 74 user := proto.Clone(u).(*userpb.User) 75 if skipFetchingGroups { 76 user.Groups = nil 77 } 78 return user, nil 79 } 80 } 81 return nil, errtypes.NotFound(value) 82 } 83 84 func extractClaim(u *userpb.User, claim string) (string, error) { 85 switch claim { 86 case "mail": 87 return u.Mail, nil 88 case "username": 89 return u.Username, nil 90 case "userid": 91 return u.Id.OpaqueId, nil 92 case "uid": 93 if u.UidNumber != 0 { 94 return strconv.FormatInt(u.UidNumber, 10), nil 95 } 96 } 97 return "", errors.New("demo: invalid field") 98 } 99 100 // TODO(jfd) compare sub? 101 func userContains(u *userpb.User, query string) bool { 102 return strings.Contains(u.Username, query) || strings.Contains(u.DisplayName, query) || strings.Contains(u.Mail, query) || strings.Contains(u.Id.OpaqueId, query) 103 } 104 105 func (m *manager) FindUsers(ctx context.Context, query string, skipFetchingGroups bool) ([]*userpb.User, error) { 106 users := []*userpb.User{} 107 for _, u := range m.catalog { 108 if userContains(u, query) { 109 user := proto.Clone(u).(*userpb.User) 110 if skipFetchingGroups { 111 user.Groups = nil 112 } 113 users = append(users, user) 114 } 115 } 116 return users, nil 117 } 118 119 func (m *manager) GetUserGroups(ctx context.Context, uid *userpb.UserId) ([]string, error) { 120 user, err := m.GetUser(ctx, uid, false) 121 if err != nil { 122 return nil, err 123 } 124 return user.Groups, nil 125 } 126 127 func getUsers() map[string]*userpb.User { 128 return map[string]*userpb.User{ 129 "4c510ada-c86b-4815-8820-42cdf82c3d51": { 130 Id: &userpb.UserId{ 131 Idp: "http://localhost:9998", 132 OpaqueId: "4c510ada-c86b-4815-8820-42cdf82c3d51", 133 Type: userpb.UserType_USER_TYPE_PRIMARY, 134 }, 135 Username: "einstein", 136 Groups: []string{"sailing-lovers", "violin-haters", "physics-lovers"}, 137 Mail: "einstein@example.org", 138 DisplayName: "Albert Einstein", 139 UidNumber: 123, 140 GidNumber: 987, 141 }, 142 "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c": { 143 Id: &userpb.UserId{ 144 Idp: "http://localhost:9998", 145 OpaqueId: "f7fbf8c8-139b-4376-b307-cf0a8c2d0d9c", 146 Type: userpb.UserType_USER_TYPE_PRIMARY, 147 }, 148 Username: "marie", 149 Groups: []string{"radium-lovers", "polonium-lovers", "physics-lovers"}, 150 Mail: "marie@example.org", 151 DisplayName: "Marie Curie", 152 UidNumber: 456, 153 GidNumber: 987, 154 }, 155 "932b4540-8d16-481e-8ef4-588e4b6b151c": { 156 Id: &userpb.UserId{ 157 Idp: "http://localhost:9998", 158 OpaqueId: "932b4540-8d16-481e-8ef4-588e4b6b151c", 159 Type: userpb.UserType_USER_TYPE_PRIMARY, 160 }, 161 Username: "richard", 162 Groups: []string{"quantum-lovers", "philosophy-haters", "physics-lovers"}, 163 Mail: "richard@example.org", 164 DisplayName: "Richard Feynman", 165 }, 166 } 167 }