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  }