lib9p

Go 9P library.
Log | Files | Refs | LICENSE

commit 63ac8a1fbeaf116d9d3bcf114186b4d430b0bf82
parent d507d3f9701dbb10056af28925f4d1a580fcea44
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 19 Dec 2023 18:33:21 +0900

add group functions

Diffstat:
Mdiskfs/fs.go | 9+++++++++
Adiskfs/uid_unix.go | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Adiskfs/uid_unix_test.go | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
3 files changed, 147 insertions(+), 0 deletions(-)

diff --git a/diskfs/fs.go b/diskfs/fs.go @@ -113,3 +113,11 @@ func (fsys *FS) Remove(name string) error { ospath := filepath.Join(paths...) return os.Remove(ospath) } + +func (fsys *FS) IsGroupLeader(group, uid string) bool { + return isGroupLeader(group, uid) +} + +func (fsys *FS) IsGroupMember(group, uid string) bool { + return isGroupMember(group, uid) +} +\ No newline at end of file diff --git a/diskfs/uid_unix.go b/diskfs/uid_unix.go @@ -0,0 +1,52 @@ +//go:build unix +package diskfs + +import ( + "os/user" +) + +// assume that the group leader has the same name as uid +func isGroupLeader(group, uid string) bool { + if group != uid { + return false + } + usr, err := user.Lookup(uid) + if err != nil { + return false + } + gids, err := usr.GroupIds() + if err != nil { + return false + } + grp, err := user.LookupGroup(group) + if err != nil { + return false + } + for _, gid := range gids { + if grp.Gid == gid { + return true + } + } + return false +} + +func isGroupMember(group, uid string) bool { + usr, err := user.Lookup(uid) + if err != nil { + return false + } + gids, err := usr.GroupIds() + if err != nil { + return false + } + grp, err := user.LookupGroup(group) + if err != nil { + return false + } + for _, gid := range gids { + if grp.Gid == gid { + return true + } + } + return false +} +\ No newline at end of file diff --git a/diskfs/uid_unix_test.go b/diskfs/uid_unix_test.go @@ -0,0 +1,85 @@ +//go:build unix + +package diskfs + +import ( + "os/user" + "strconv" + "testing" +) + +func TestIsGroupLeader(t *testing.T) { + usr, err := user.Current() + if err != nil { + t.Fatalf("get current user: %v", err) + } + grpids, err := usr.GroupIds() + if err != nil { + t.Fatalf("get groups: %v", err) + } + tests := []struct { + name string + uid string + group string + want bool + }{ + {"0", "root", "root", true}, + } + for _, id := range grpids { + grp, err := user.LookupGroupId(id) + if err != nil { + t.Fatalf("lookupgroupid: %v", err) + } + tests = append(tests, struct { + name string + uid string + group string + want bool + }{strconv.Itoa(len(tests)), usr.Username, grp.Name, usr.Username == grp.Name}) + } + for _, test := range tests { + got := isGroupLeader(test.group, test.uid) + if got != test.want { + t.Errorf("%s: isGroupLeader(%s, %s) = %t, want: %t", + test.name, test.group, test.uid, got, test.want) + } + } +} + +func TestIsGroupMember(t *testing.T) { + usr, err := user.Current() + if err != nil { + t.Fatalf("get current user: %v", err) + } + grpids, err := usr.GroupIds() + if err != nil { + t.Fatalf("get groups: %v", err) + } + tests := []struct { + name string + uid string + group string + want bool + }{ + {"0", "root", "root", true}, + } + for _, id := range grpids { + grp, err := user.LookupGroupId(id) + if err != nil { + t.Fatalf("lookupgroupid: %v", err) + } + tests = append(tests, struct { + name string + uid string + group string + want bool + }{strconv.Itoa(len(tests)), usr.Username, grp.Name, true}) + } + for _, test := range tests { + got := isGroupMember(test.group, test.uid) + if got != test.want { + t.Errorf("%s: isGroupMember(%s, %s) = %t, want: %t", + test.name, test.group, test.uid, got, test.want) + } + } +}