commit 63ac8a1fbeaf116d9d3bcf114186b4d430b0bf82
parent d507d3f9701dbb10056af28925f4d1a580fcea44
Author: Matsuda Kenji <info@mtkn.jp>
Date: Tue, 19 Dec 2023 18:33:21 +0900
add group functions
Diffstat:
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)
+ }
+ }
+}