quorum/core/types/permissions_cache.go

102 lines
1.9 KiB
Go
Raw Normal View History

package types
import (
"github.com/ethereum/go-ethereum/common"
"github.com/hashicorp/golang-lru"
2018-11-12 00:16:56 -08:00
"sync"
)
type AccessType uint8
const (
FullAccess AccessType = iota
ReadOnly
Transact
ContractDeploy
)
type PermStruct struct {
AcctId common.Address
AcctAccess AccessType
}
2018-09-27 04:24:38 -07:00
type OrgStruct struct {
OrgId string
Keys []string
2018-09-27 04:24:38 -07:00
}
2018-11-14 02:24:28 -08:00
2018-11-13 00:15:28 -08:00
var DefaultAccess = FullAccess
2018-11-12 00:16:56 -08:00
const acctMapLimit = 100
const orgKeyMapLimit = 100
2018-09-27 04:24:38 -07:00
2018-11-12 00:16:56 -08:00
var AcctMap, _ = lru.New(acctMapLimit)
var OrgKeyMap, _ = lru.New(orgKeyMapLimit)
var orgKeyLock sync.Mutex
2018-11-13 00:15:28 -08:00
func SetDefaultAccess() {
DefaultAccess = ReadOnly
}
func AddAccountAccess(acctId common.Address, access uint8) {
AcctMap.Add(acctId, &PermStruct{AcctId: acctId, AcctAccess: AccessType(access)})
}
func GetAcctAccess(acctId common.Address) AccessType {
if AcctMap.Len() != 0 {
if val, ok := AcctMap.Get(acctId); ok {
vo := val.(*PermStruct)
return vo.AcctAccess
}
}
// return DefaultAccess
if AcctMap.Len() == 0 {
return FullAccess
} else {
return ReadOnly
}
}
2018-09-27 04:24:38 -07:00
func AddOrgKey(orgId string, key string) {
if OrgKeyMap.Len() != 0 {
if val, ok := OrgKeyMap.Get(orgId); ok {
2018-11-12 00:16:56 -08:00
orgKeyLock.Lock()
2018-10-02 01:28:55 -07:00
// Org record exists. Append the key only
vo := val.(*OrgStruct)
vo.Keys = append(vo.Keys, key)
orgKeyLock.Unlock()
2018-10-02 01:28:55 -07:00
return
}
}
OrgKeyMap.Add(orgId, &OrgStruct{OrgId: orgId, Keys: []string{key}})
2018-10-02 01:28:55 -07:00
}
func DeleteOrgKey(orgId string, key string) {
2018-11-12 00:16:56 -08:00
defer orgKeyLock.Unlock()
if val, ok := OrgKeyMap.Get(orgId); ok {
2018-11-12 00:16:56 -08:00
orgKeyLock.Lock()
vo := val.(*OrgStruct)
for i, keyVal := range vo.Keys {
if keyVal == key {
vo.Keys = append(vo.Keys[:i], vo.Keys[i+1:]...)
break
2018-10-02 01:28:55 -07:00
}
}
}
2018-09-27 04:24:38 -07:00
}
func ResolvePrivateForKeys(orgId string) []string {
2018-09-27 04:24:38 -07:00
var keys []string
if val, ok := OrgKeyMap.Get(orgId); ok {
vo := val.(*OrgStruct)
if len(vo.Keys) > 0 {
keys = vo.Keys
} else {
keys = append(keys, orgId)
2018-09-27 04:24:38 -07:00
}
return keys
2018-09-27 04:24:38 -07:00
}
keys = append(keys, orgId)
return keys
}