...
1 package authremote
2
3 import (
4 "context"
5 apb "golang.conradwood.net/apis/auth"
6 "golang.conradwood.net/go-easyops/common"
7 "sync"
8 )
9
10 var (
11 cached_user_lock sync.Mutex
12 cached_users []*user_cache_entry
13 )
14
15 type user_cache_entry struct {
16 userid string
17 signed_user *apb.SignedUser
18 user *apb.User
19 }
20
21 func (uc *user_cache_entry) isValid() bool {
22 return true
23 }
24
25 func usercache_GetSignedUserByID(ctx context.Context, userid string) (*apb.SignedUser, error) {
26 for _, uc := range cached_users {
27 if uc.isValid() && uc.userid == userid {
28 return uc.signed_user, nil
29 }
30 }
31
32 managerClient()
33 res, err := authManager.SignedGetUserByID(ctx, &apb.ByIDRequest{UserID: userid})
34 if err != nil {
35 return nil, err
36 }
37 usercache_add(res)
38 return res, nil
39 }
40 func usercache_GetUserByID(ctx context.Context, userid string) (*apb.User, error) {
41 for _, uc := range cached_users {
42 if uc.isValid() && uc.userid == userid {
43 return uc.user, nil
44 }
45 }
46
47 managerClient()
48 res, err := authManager.SignedGetUserByID(ctx, &apb.ByIDRequest{UserID: userid})
49 if err != nil {
50 return nil, err
51 }
52 u := usercache_add(res)
53 return u, nil
54 }
55
56 func usercache_add(u *apb.SignedUser) *apb.User {
57 user := common.VerifySignedUser(u)
58 if user == nil {
59 return nil
60 }
61 userid := user.ID
62 cached_user_lock.Lock()
63 defer cached_user_lock.Unlock()
64 for _, uc := range cached_users {
65 if uc.isValid() && uc.userid == userid {
66 uc.user = user
67 uc.signed_user = u
68 return uc.user
69 }
70 }
71 uc := &user_cache_entry{userid: userid, signed_user: u, user: user}
72 cached_users = append(cached_users, uc)
73 return uc.user
74 }
75
View as plain text