lib9p

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

commit d507d3f9701dbb10056af28925f4d1a580fcea44
parent aae2d2d3ae271f61c7523dc19ab336e084639355
Author: Matsuda Kenji <info@mtkn.jp>
Date:   Tue, 19 Dec 2023 16:53:56 +0900

add GidFS

Diffstat:
Mfs.go | 6++++++
Mserver.go | 10++++++++--
2 files changed, 14 insertions(+), 2 deletions(-)

diff --git a/fs.go b/fs.go @@ -23,6 +23,12 @@ type RemoverFS interface { Remove(name string) error } +type GidFS interface { + FS + IsGroupLeader(group, uid string) bool + IsGroupMember(group, uid string) bool +} + func FSModeToQidType(fm fs.FileMode) QidType { var qt QidType if fm&fs.ModeDir != 0 { diff --git a/server.go b/server.go @@ -883,11 +883,17 @@ func sWStat(ctx context.Context, s *Server, r *Req) { // TODO: check group membership // for now, group member == group leader == gid if wstat.Gid != "" && wstat.Gid != newStat.Gid { + fsys, ok := s.fs.(GidFS) + if !ok { + Respond(ctx, r, ErrOperation) + return + } // by the owner if also a member of the new group; // or by the group leader of the file's current group if // also the leader of the new group. - if r.Fid.Uid == newStat.Uid && r.Fid.Uid == wstat.Gid || - r.Fid.Uid == newStat.Gid && r.Fid.Uid == wstat.Gid { + if r.Fid.Uid == newStat.Uid && fsys.IsGroupMember(wstat.Gid, r.Fid.Uid) || + fsys.IsGroupLeader(newStat.Gid, r.Fid.Uid) && + fsys.IsGroupLeader(wstat.Gid, r.Fid.Uid) { newStat.Gid = wstat.Gid } else { Respond(ctx, r, ErrPerm)