From f8f066b182ef2a82e6f35b4ac7f5e5a56ca652ee Mon Sep 17 00:00:00 2001 From: Luther Monson Date: Fri, 25 Aug 2023 23:04:37 -0700 Subject: [PATCH] adding users and tokens --- access.go | 27 +++++++++++++++ access_test.go | 20 +++++++++++ tests/mocks/pve7x/access.go | 67 +++++++++++++++++++++++++++++++++++++ types.go | 26 ++++++++++++++ 4 files changed, 140 insertions(+) diff --git a/access.go b/access.go index fcb02f7..917e271 100644 --- a/access.go +++ b/access.go @@ -133,3 +133,30 @@ func (g *Group) Update() error { func (g *Group) Delete() error { return g.client.Delete(fmt.Sprintf("/access/groups/%s", g.GroupID), nil) } + +func (c *Client) User(userid string) (user *User, err error) { + err = c.Get(fmt.Sprintf("/access/users/%s", userid), &user) + if nil == err { + user.UserID = userid + user.client = c + } + return +} + +func (c *Client) Users() (users Users, err error) { + err = c.Get("/access/users", &users) + if nil == err { + for _, g := range users { + g.client = c + } + } + return +} + +func (u *User) Update() error { + return u.client.Put(fmt.Sprintf("/access/users/%s", u.UserID), u, nil) +} + +func (u *User) Delete() error { + return u.client.Delete(fmt.Sprintf("/access/users/%s", u.UserID), nil) +} diff --git a/access_test.go b/access_test.go index 5594cd2..e3d1632 100644 --- a/access_test.go +++ b/access_test.go @@ -110,3 +110,23 @@ func TestGroups(t *testing.T) { assert.NotEmpty(t, g.Users) } } + +func TestUser(t *testing.T) { + mocks.On(mockConfig) + defer mocks.Off() + client := mockClient() + + u, err := client.User("root@pam") + assert.Nil(t, err) + assert.Equal(t, u.UserID, "root@pam") +} + +func TestUsers(t *testing.T) { + mocks.On(mockConfig) + defer mocks.Off() + client := mockClient() + + users, err := client.Users() + assert.Nil(t, err) + assert.Len(t, users, 4) +} diff --git a/tests/mocks/pve7x/access.go b/tests/mocks/pve7x/access.go index 5f0112c..77e31a3 100644 --- a/tests/mocks/pve7x/access.go +++ b/tests/mocks/pve7x/access.go @@ -606,5 +606,72 @@ func access() { ] } }`) + gock.New(config.C.URI). + Get("^/access/users$"). + Reply(200). + JSON(`{ + "data": [ + { + "expire": 0, + "lastname": "pamlast", + "enable": 1, + "firstname": "pamfirst", + "userid": "pam@pam", + "realm-type": "pam" + }, + { + "expire": 0, + "realm-type": "pam", + "email": "root@email.com", + "userid": "root@pam", + "enable": 1 + }, + { + "expire": 0, + "lastname": "last1", + "email": "first1.last1@email.com", + "enable": 1, + "firstname": "first1", + "realm-type": "pve", + "userid": "user1@pve" + }, + { + "userid": "user2@pve", + "realm-type": "pve", + "firstname": "first2", + "email": "first2.last2@email.com", + "enable": 1, + "lastname": "last2", + "expire": 0 + } + ] +}`) + + gock.New(config.C.URI). + Get("^/access/users/root@pam$"). + Reply(200). + JSON(`{ + "data": { + "groups": [ + "cloud-init", + "test" + ], + "expire": 0, + "email": "root@email.com", + "enable": 1, + "firstname": "firstname", + "lastname": "lastname", + "tokens": { + "token1": { + "privsep": 0, + "expire": 1000 + }, + "token2": { + "expire": 2000, + "privsep": 1 + } + } + } +}`) } diff --git a/types.go b/types.go index 2981b5d..cefdb32 100644 --- a/types.go +++ b/types.go @@ -1004,3 +1004,29 @@ type Group struct { Users string `json:"users,omitempty"` // only populated via Groups lister Members []string `json:"members,omitempty"` // only populated via Group read } + +type Users []*User +type User struct { + client *Client + UserID string `json:"userid,omitempty"` + Comment string `json:"comment,omitempty"` + Email string `json:"email,omitempty"` + Enable IntOrBool `json:"enable,omitempty"` + Expire int `json:"expire,omitempty"` + Firstname string `json:"firstname,omitempty"` + Lastname string `json:"lastname,omitempty"` + Groups []string `json:"groups,omitempty"` + Keys string `json:"keys,omitempty"` + Tokens map[string]Token `json:"tokens,omitempty"` + RealmType string `json:"realm-type,omitempty"` + TFALockedUntil string `json:"tfa-locked-until,omitempty"` + TOTPLocked IntOrBool `json:"totp-locked,omitempty"` +} + +type Tokens []*Token +type Token struct { + TokenID string `json:"tokenid,omitempty"` + Comment string `json:"comment,omitempty"` + Expire int `json:"expire,omitempty"` + Privsep IntOrBool `json:"privsep,omitempty"` +}