...

Source file src/golang.conradwood.net/go-easyops/authremote/user_cache.go

Documentation: golang.conradwood.net/go-easyops/authremote

     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 // nothing to do
    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