Beispiel #1
0
        internal override StorageSecurity GetSecurity(string absolutePath)
        {
            if (0 != Syscall.stat(absolutePath, out var stat))
            {
                throw new LinuxIOException(Syscall.GetLastError());
            }
            var uid               = stat.st_uid;
            var uname             = LinuxHelpers.GetUserName(uid);
            var gid               = stat.st_gid;
            var gname             = LinuxHelpers.GetGroupName(gid);
            var publicPermissions = LinuxHelpers.GetOtherPermissions(stat.st_mode);
            var userPermissions   = LinuxHelpers.GetOwnerPermissions(stat.st_mode);
            var groupPermissions  = LinuxHelpers.GetGroupPermissions(stat.st_mode);
            var builder           = ImmutableDictionary.CreateBuilder <StorageActor, StoragePermissions>();

            builder.Add(StorageActor.Public, publicPermissions);
            builder.Add(StorageActor.User(uname), userPermissions);
            builder.Add(StorageActor.Group(gname), groupPermissions);
            return(new StorageSecurity(builder.ToImmutable()));
        }
Beispiel #2
0
        internal override void SetSecurity(string absolutePath, IStorageSecurity security)
        {
            if (0 != Syscall.stat(absolutePath, out var stat))
            {
                throw new LinuxIOException(Syscall.GetLastError());
            }
            var uid   = stat.st_uid;
            var uname = LinuxHelpers.GetUserName(uid);
            var gid   = stat.st_gid;
            var gname = LinuxHelpers.GetGroupName(gid);
            var ps    = default(FilePermissions);

            // FIXME: emit warnings
            foreach (var kv in security)
            {
                var actor = kv.Key;
                var sp    = kv.Value;
                switch (actor.ActorType)
                {
                case StorageActorType.Public:
                    ps |= LinuxHelpers.FromOtherPermissions(sp);
                    break;

                case StorageActorType.User when actor.Id == uname:
                    ps |= LinuxHelpers.FromOwnerPermissions(sp);
                    break;

                case StorageActorType.Group when actor.Id == gname:
                    ps |= LinuxHelpers.FromGroupPermissions(sp);
                    break;

                default:
                    // warn
                    break;
                }
            }
            if (0 != Syscall.chmod(absolutePath, ps))
            {
                throw new LinuxIOException(Syscall.GetLastError());
            }
        }