commit d507d3f9701dbb10056af28925f4d1a580fcea44
parent aae2d2d3ae271f61c7523dc19ab336e084639355
Author: Matsuda Kenji <info@mtkn.jp>
Date: Tue, 19 Dec 2023 16:53:56 +0900
add GidFS
Diffstat:
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)