173 lines
3 KiB
Go
173 lines
3 KiB
Go
|
package goidentity
|
||
|
|
||
|
import (
|
||
|
"bytes"
|
||
|
"encoding/gob"
|
||
|
"github.com/hashicorp/go-uuid"
|
||
|
"time"
|
||
|
)
|
||
|
|
||
|
type User struct {
|
||
|
authenticated bool
|
||
|
domain string
|
||
|
userName string
|
||
|
displayName string
|
||
|
email string
|
||
|
human bool
|
||
|
groupMembership map[string]bool
|
||
|
authTime time.Time
|
||
|
sessionID string
|
||
|
expiry time.Time
|
||
|
attributes map[string]interface{}
|
||
|
}
|
||
|
|
||
|
func NewUser(username string) User {
|
||
|
uuid, err := uuid.GenerateUUID()
|
||
|
if err != nil {
|
||
|
uuid = "00unique-sess-ions-uuid-unavailable0"
|
||
|
}
|
||
|
return User{
|
||
|
userName: username,
|
||
|
groupMembership: make(map[string]bool),
|
||
|
sessionID: uuid,
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (u *User) UserName() string {
|
||
|
return u.userName
|
||
|
}
|
||
|
|
||
|
func (u *User) SetUserName(s string) {
|
||
|
u.userName = s
|
||
|
}
|
||
|
|
||
|
func (u *User) Domain() string {
|
||
|
return u.domain
|
||
|
}
|
||
|
|
||
|
func (u *User) SetDomain(s string) {
|
||
|
u.domain = s
|
||
|
}
|
||
|
|
||
|
func (u *User) DisplayName() string {
|
||
|
if u.displayName == "" {
|
||
|
return u.userName
|
||
|
}
|
||
|
return u.displayName
|
||
|
}
|
||
|
|
||
|
func (u *User) SetDisplayName(s string) {
|
||
|
u.displayName = s
|
||
|
}
|
||
|
|
||
|
func (u *User) Human() bool {
|
||
|
return u.human
|
||
|
}
|
||
|
|
||
|
func (u *User) SetHuman(b bool) {
|
||
|
u.human = b
|
||
|
}
|
||
|
|
||
|
func (u *User) AuthTime() time.Time {
|
||
|
return u.authTime
|
||
|
}
|
||
|
|
||
|
func (u *User) SetAuthTime(t time.Time) {
|
||
|
u.authTime = t
|
||
|
}
|
||
|
|
||
|
func (u *User) AuthzAttributes() []string {
|
||
|
s := make([]string, len(u.groupMembership))
|
||
|
i := 0
|
||
|
for a := range u.groupMembership {
|
||
|
s[i] = a
|
||
|
i++
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
func (u *User) Authenticated() bool {
|
||
|
return u.authenticated
|
||
|
}
|
||
|
|
||
|
func (u *User) SetAuthenticated(b bool) {
|
||
|
u.authenticated = b
|
||
|
}
|
||
|
|
||
|
func (u *User) AddAuthzAttribute(a string) {
|
||
|
u.groupMembership[a] = true
|
||
|
}
|
||
|
|
||
|
func (u *User) RemoveAuthzAttribute(a string) {
|
||
|
if _, ok := u.groupMembership[a]; !ok {
|
||
|
return
|
||
|
}
|
||
|
delete(u.groupMembership, a)
|
||
|
}
|
||
|
|
||
|
func (u *User) EnableAuthzAttribute(a string) {
|
||
|
if enabled, ok := u.groupMembership[a]; ok && !enabled {
|
||
|
u.groupMembership[a] = true
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (u *User) DisableAuthzAttribute(a string) {
|
||
|
if enabled, ok := u.groupMembership[a]; ok && enabled {
|
||
|
u.groupMembership[a] = false
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func (u *User) Authorized(a string) bool {
|
||
|
if enabled, ok := u.groupMembership[a]; ok && enabled {
|
||
|
return true
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (u *User) SessionID() string {
|
||
|
return u.sessionID
|
||
|
}
|
||
|
|
||
|
func (u *User) SetExpiry(t time.Time) {
|
||
|
u.expiry = t
|
||
|
}
|
||
|
|
||
|
func (u *User) Expired() bool {
|
||
|
if !u.expiry.IsZero() && time.Now().UTC().After(u.expiry) {
|
||
|
return true
|
||
|
}
|
||
|
return false
|
||
|
}
|
||
|
|
||
|
func (u *User) Attributes() map[string]interface{} {
|
||
|
return u.attributes
|
||
|
}
|
||
|
|
||
|
func (u *User) SetAttribute(k string, v interface{}) {
|
||
|
u.attributes[k] = v
|
||
|
}
|
||
|
|
||
|
func (u *User) SetAttributes(a map[string]interface{}) {
|
||
|
u.attributes = a
|
||
|
}
|
||
|
|
||
|
func (u *User) RemoveAttribute(k string) {
|
||
|
delete(u.attributes, k)
|
||
|
}
|
||
|
|
||
|
func (u *User) Marshal() ([]byte, error) {
|
||
|
buf := new(bytes.Buffer)
|
||
|
enc := gob.NewEncoder(buf)
|
||
|
err := enc.Encode(u)
|
||
|
if err != nil {
|
||
|
return []byte{}, err
|
||
|
}
|
||
|
return buf.Bytes(), nil
|
||
|
}
|
||
|
|
||
|
func (u *User) Unmarshal(b []byte) error {
|
||
|
buf := bytes.NewBuffer(b)
|
||
|
dec := gob.NewDecoder(buf)
|
||
|
return dec.Decode(u)
|
||
|
}
|