Пример #1
0
        public override bool IsValidFolderPermissionMask(string mask)
        {
            try
            {
                var permissions = NativeConvert.FromOctalPermissionString(mask);

                if ((permissions & ~FilePermissions.ACCESSPERMS) != 0)
                {
                    // Only allow access permissions
                    return(false);
                }

                if ((permissions & FilePermissions.S_IRWXU) != FilePermissions.S_IRWXU)
                {
                    // We expect at least full owner permissions (700)
                    return(false);
                }

                return(true);
            }
            catch (FormatException)
            {
                return(false);
            }
        }
Пример #2
0
        protected override Errno OnGetPathStatus(string path, out Stat stbuf)
        {
            var pathSegments = path.Split('/', StringSplitOptions.RemoveEmptyEntries).AsMemory();
            var parentDir    = pathSegments.Length < 2 ? Trie : Trie.TryFindDirectory(pathSegments.Slice(0, pathSegments.Length - 1));
            var file         = pathSegments.Length > 0
                            ? parentDir?.TryFindFile(pathSegments.Span[pathSegments.Length - 1])
                            : null;
            var dir = pathSegments.Length > 0
                            ? parentDir?.TryFindDirectory(pathSegments.Span[pathSegments.Length - 1])
                            : parentDir;

            if (dir != null)
            {
                stbuf = new Stat
                {
                    st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0755"),
                    st_nlink = 2
                };
                return(0);
            }

            if (file != null)
            {
                stbuf = new Stat
                {
                    st_mode  = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink = 1,
                    st_size  = file.Length
                };
                return(0);
            }

            stbuf = new Stat();
            return(Errno.ENOENT);
        }
Пример #3
0
        public override bool IsValidFilePermissionMask(string mask)
        {
            try
            {
                var permissions = NativeConvert.FromOctalPermissionString(mask);

                if ((permissions & (FilePermissions.S_ISUID | FilePermissions.S_ISGID | FilePermissions.S_ISVTX)) != 0)
                {
                    return(false);
                }

                if ((permissions & (FilePermissions.S_IXUSR | FilePermissions.S_IXGRP | FilePermissions.S_IXOTH)) != 0)
                {
                    return(false);
                }

                if ((permissions & (FilePermissions.S_IRUSR | FilePermissions.S_IWUSR)) != (FilePermissions.S_IRUSR | FilePermissions.S_IWUSR))
                {
                    return(false);
                }

                return(true);
            }
            catch (FormatException)
            {
                return(false);
            }
        }
Пример #4
0
        protected override Errno OnGetPathStatus(string path, out Stat stat)
        {
            stat = new Stat();
            if (path == "/")
            {
                DirectoryInfo di = new DirectoryInfo(Source);
                stat.st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0666");
                stat.st_size  = (4096 * (long)Math.Ceiling(walker.RootNode.Nodes.Count * 0.1));
                stat.st_mtime = NativeConvert.FromDateTime(di.LastWriteTime);
                stat.st_nlink = 2 + (ulong)Helpers.GetEntriesCount(walker.RootNode, new EntryKind[] { EntryKind.Directory, EntryKind.ZipFile, EntryKind.ZipDirectoryEntry });
            }

            else
            {
                try
                {
                    Entry fsEntry = walker.SearchEntry(path.Substring(1));
                    if (fsEntry == null)
                    {
                        return(Errno.ENOENT);
                    }
                    Helpers.SetStatInfo(fsEntry, ref stat);
                }
                catch (DirectoryNotFoundException)
                {
                    return(Errno.ENOTDIR);
                }
                catch (IOException)
                {
                    return(Errno.EIO);
                }
            }
            return(0);
        }
Пример #5
0
        static internal void SetStatInfo(Entry entry, ref Stat stat)
        {
            stat.st_mode = NativeConvert.FromOctalPermissionString("0444");
            switch (entry.Kind)
            {
            case EntryKind.Directory:
            case EntryKind.ZipDirectoryEntry:
            case EntryKind.ZipFile:
                stat.st_mode |= FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0222");
                stat.st_nlink = 2 + ((entry.Node != null) ? (ulong)GetEntriesCount(entry.Node, new EntryKind[] { EntryKind.Directory, EntryKind.ZipFile, EntryKind.ZipDirectoryEntry }) : 0);
                break;

            case EntryKind.File:
                stat.st_mode |= FilePermissions.S_IFLNK | NativeConvert.FromOctalPermissionString("0777");
                stat.st_nlink = 1;
                break;

            case EntryKind.ZipFileEntry:
                stat.st_mode |= FilePermissions.S_IFREG;
                stat.st_nlink = 1;
                break;
            }
            stat.st_size  = entry.Size;
            stat.st_mtime = NativeConvert.FromDateTime(entry.LastWriteTime);
        }
Пример #6
0
        protected override Errno OnGetPathStatus(string path, out Stat stbuf)
        {
            Trace.WriteLine("(OnGetPathStatus {0})", path);

            stbuf = new Stat();
            switch (path)
            {
            case "/":
                stbuf.st_mode = FilePermissions.S_IFDIR |
                                NativeConvert.FromOctalPermissionString("0755");
                stbuf.st_nlink = 2;
                return(0);

            case hello_path:
            case data_path:
            case data_im_path:
                stbuf.st_mode = FilePermissions.S_IFREG |
                                NativeConvert.FromOctalPermissionString("0444");
                stbuf.st_nlink = 1;
                int size = 0;
                switch (path)
                {
                case hello_path:   size = hello_str.Length; break;

                case data_path:
                case data_im_path: size = data_size; break;
                }
                stbuf.st_size = size;
                return(0);

            default:
                return(Errno.ENOENT);
            }
        }
        internal DirectoryEntry MakeDirectoryEntry(string name, DateTime writeTime, long size)
        {
            DirectoryEntry dirEntry = new DirectoryEntry(name);

            dirEntry.Stat.st_mode  = NativeConvert.FromOctalPermissionString("0666") | FilePermissions.S_IFDIR;
            dirEntry.Stat.st_size  = size;
            dirEntry.Stat.st_mtime = NativeConvert.FromDateTime(writeTime);
            return(dirEntry);
        }
Пример #8
0
        public override void SetPermissions(string path, string mask, string group)
        {
            var permissions = NativeConvert.FromOctalPermissionString(mask);

            if (_fileSystem.File.Exists(path))
            {
                permissions = GetFilePermissions(permissions);
            }

            SetPermissions(path, mask, group, permissions);
        }
Пример #9
0
        public override void SetPermissions(string path, string mask, string user, string group)
        {
            Logger.Debug("Setting permissions: {0} on {1}", mask, path);

            var filePermissions = NativeConvert.FromOctalPermissionString(mask);

            if (Syscall.chmod(path, filePermissions) < 0)
            {
                var error = Stdlib.GetLastError();

                throw new LinuxPermissionsException("Error setting file permissions: " + error);
            }

            if (string.IsNullOrWhiteSpace(user) || string.IsNullOrWhiteSpace(group))
            {
                Logger.Debug("User or Group for chown not configured, skipping chown.");
                return;
            }

            uint userId;
            uint groupId;

            if (!uint.TryParse(user, out userId))
            {
                var u = Syscall.getpwnam(user);

                if (u == null)
                {
                    throw new LinuxPermissionsException("Unknown user: {0}", user);
                }

                userId = u.pw_uid;
            }

            if (!uint.TryParse(group, out groupId))
            {
                var g = Syscall.getgrnam(group);

                if (g == null)
                {
                    throw new LinuxPermissionsException("Unknown group: {0}", group);
                }

                groupId = g.gr_gid;
            }

            if (Syscall.chown(path, userId, groupId) < 0)
            {
                var error = Stdlib.GetLastError();

                throw new LinuxPermissionsException("Error setting file owner and/or group: " + error);
            }
        }
Пример #10
0
        private void SetPermissions(string path, string mask)
        {
            Logger.Debug("Setting permissions: {0} on {1}", mask, path);

            var filePermissions = NativeConvert.FromOctalPermissionString(mask);

            if (Syscall.chmod(path, filePermissions) < 0)
            {
                var error = Stdlib.GetLastError();

                throw new LinuxPermissionsException("Error setting file permissions: " + error);
            }
        }
Пример #11
0
 public static void Main(string[] args)
 {
     using (FileSystem fs = new MainClass(args))
     {
         // fs.EnableFuseDebugOutput = true;
         fs.AllowAccessToOthers            = true;
         fs.EnableKernelCache              = true;
         fs.EnableKernelPermissionChecking = true;
         fs.DefaultUmask = NativeConvert.FromOctalPermissionString("222");
         fs.Name         = "Zip browsing File system.";
         fs.Start();
     }
 }
Пример #12
0
        public override void SetPermissions(string path, string mask)
        {
            Logger.Debug("Setting permissions: {0} on {1}", mask, path);

            var permissions = NativeConvert.FromOctalPermissionString(mask);

            if (Directory.Exists(path))
            {
                permissions = GetFolderPermissions(permissions);
            }

            if (Syscall.chmod(path, permissions) < 0)
            {
                var error = Stdlib.GetLastError();

                throw new LinuxPermissionsException("Error setting permissions: " + error);
            }
        }
Пример #13
0
 void CopyStat(FileProperty x, ref Stat s)
 {
     s.st_uid   = uid;
     s.st_gid   = gid;
     s.st_ctime = (long)(x.CreationTime - EpochBase).TotalSeconds;
     s.st_mtime = s.st_ctime;
     //s.st_mtime = (long)(x.LastWriteTime - EpochBase).TotalSeconds;
     if (x.IsFile)
     {
         s.st_mode  = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444");
         s.st_nlink = 1;
         s.st_size  = x.Size;
     }
     else
     {
         s.st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0755");
         s.st_nlink = 2;
     }
 }
Пример #14
0
        protected override Errno OnGetPathStatus(string path, out Stat stat)
        {
            logger.DebugFormat("OnGetPathStatus: {0}", path);
            PathStatusDto status;

            stat = new Stat();
            try {
                status = _fileService.GetPathStatus(path);

                if (status.PathType == PathStatusDto.PathTypeEnum.Directory)
                {
                    stat.st_mode = FilePermissions.S_IFDIR |
                                   // Readonly directory
                                   NativeConvert.FromOctalPermissionString("0555");
                    stat.st_nlink = 2;
                }
                else if (status.PathType == PathStatusDto.PathTypeEnum.File)
                {
                    stat.st_mode = FilePermissions.S_IFREG |
                                   // Readonly file.
                                   NativeConvert.FromOctalPermissionString("0444");
                    stat.st_nlink = 2;
                    stat.st_size  = status.FileSize;
                }
                return(0);
            } catch (FileNotFoundInServiceException) {
                logger.DebugFormat("File not found in service.");
                return(Errno.ENOENT);
            } catch (WebException ex) {
                logger.ErrorFormat("Caught WebException: {0} : {1}", ex.Status, ex);
                return(Errno.ENONET);
            } catch (Exception ex) {
                logger.ErrorFormat("Exception caught while interacting with File Service : {0}", ex);
                // TODO: Other error more appropriate?
                return(Errno.ENONET);
            }
        }
Пример #15
0
        protected override Errno OnGetPathStatus(string path, out Stat stat)
        {
            stat = new Stat();

            string[] pieces = _vfs.SplitPath(path);

            if (pieces.Length == 0)
            {
                stat.st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0555");
                stat.st_nlink = 2;

                return(0);
            }

            long romSetId = _vfs.GetRomSetId(pieces[0]);

            if (romSetId <= 0)
            {
                if (pieces[0] != ".fuse_umount" ||
                    _umountToken == null)
                {
                    return(Errno.ENOENT);
                }

                stat = new Stat
                {
                    st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink   = 1,
                    st_ctime   = NativeConvert.ToTimeT(DateTime.UtcNow),
                    st_mtime   = NativeConvert.ToTimeT(DateTime.UtcNow),
                    st_blksize = 0,
                    st_blocks  = 0,
                    st_ino     = 0,
                    st_size    = 0
                };

                return(0);
            }

            RomSet romSet = _vfs.GetRomSet(romSetId);

            if (romSet == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length == 1)
            {
                stat.st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0555");
                stat.st_nlink = 2;
                stat.st_ctime = NativeConvert.ToTimeT(romSet.CreatedOn.ToUniversalTime());
                stat.st_mtime = NativeConvert.ToTimeT(romSet.UpdatedOn.ToUniversalTime());

                return(0);
            }

            CachedMachine machine = _vfs.GetMachine(romSetId, pieces[1]);

            if (machine == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length == 2)
            {
                stat = new Stat
                {
                    st_mode  = FilePermissions.S_IFDIR | NativeConvert.FromOctalPermissionString("0555"),
                    st_nlink = 2,
                    st_ctime = NativeConvert.ToTimeT(machine.CreationDate.ToUniversalTime()),
                    st_mtime = NativeConvert.ToTimeT(machine.ModificationDate.ToUniversalTime())
                };

                return(0);
            }

            CachedFile file = _vfs.GetFile(machine.Id, pieces[2]);

            if (file != null)
            {
                if (pieces.Length != 3)
                {
                    return(Errno.ENOSYS);
                }

                stat = new Stat
                {
                    st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink   = 1,
                    st_ctime   = NativeConvert.ToTimeT(file.CreatedOn.ToUniversalTime()),
                    st_mtime   = NativeConvert.ToTimeT(file.FileLastModification?.ToUniversalTime() ?? file.UpdatedOn.ToUniversalTime()),
                    st_blksize = 512,
                    st_blocks  = (long)(file.Size / 512),
                    st_ino     = file.Id,
                    st_size    = (long)file.Size
                };

                return(0);
            }

            CachedDisk disk = _vfs.GetDisk(machine.Id, pieces[2]);

            if (disk != null)
            {
                if (pieces.Length != 3)
                {
                    return(Errno.ENOSYS);
                }

                stat = new Stat
                {
                    st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink   = 1,
                    st_ctime   = NativeConvert.ToTimeT(disk.CreatedOn.ToUniversalTime()),
                    st_mtime   = NativeConvert.ToTimeT(disk.UpdatedOn.ToUniversalTime()),
                    st_blksize = 512,
                    st_blocks  = (long)(disk.Size / 512),
                    st_ino     = disk.Id,
                    st_size    = (long)disk.Size
                };

                return(0);
            }

            CachedMedia media = _vfs.GetMedia(machine.Id, pieces[2]);

            if (media == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length != 3)
            {
                return(Errno.ENOSYS);
            }

            stat = new Stat
            {
                st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                st_nlink   = 1,
                st_ctime   = NativeConvert.ToTimeT(media.CreatedOn.ToUniversalTime()),
                st_mtime   = NativeConvert.ToTimeT(media.UpdatedOn.ToUniversalTime()),
                st_blksize = 512,
                st_blocks  = (long)(media.Size / 512),
                st_ino     = media.Id,
                st_size    = (long)media.Size
            };

            return(0);
        }
Пример #16
0
        protected override Errno OnOpenHandle(string path, OpenedPathInfo info)
        {
            string[] pieces = _vfs.SplitPath(path);

            if (pieces.Length == 0)
            {
                return(Errno.EISDIR);
            }

            long romSetId = _vfs.GetRomSetId(pieces[0]);

            if (romSetId <= 0)
            {
                return(Errno.ENOENT);
            }

            RomSet romSet = _vfs.GetRomSet(romSetId);

            if (romSet == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length == 1)
            {
                return(Errno.EISDIR);
            }

            CachedMachine machine = _vfs.GetMachine(romSetId, pieces[1]);

            if (machine == null)
            {
                return(Errno.ENOENT);
            }

            if (pieces.Length == 2)
            {
                return(Errno.EISDIR);
            }

            long handle = 0;
            Stat stat;

            CachedFile file = _vfs.GetFile(machine.Id, pieces[2]);

            if (file != null)
            {
                if (pieces.Length > 3)
                {
                    return(Errno.ENOSYS);
                }

                if (file.Sha384 == null)
                {
                    return(Errno.ENOENT);
                }

                if (info.OpenAccess.HasFlag(OpenFlags.O_APPEND) ||
                    info.OpenAccess.HasFlag(OpenFlags.O_CREAT) ||
                    info.OpenAccess.HasFlag(OpenFlags.O_EXCL) ||
                    info.OpenAccess.HasFlag(OpenFlags.O_TRUNC))
                {
                    return(Errno.EROFS);
                }

                handle = _vfs.Open(file.Sha384, (long)file.Size);

                stat = new Stat
                {
                    st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                    st_nlink   = 1,
                    st_ctime   = NativeConvert.ToTimeT(file.CreatedOn.ToUniversalTime()),
                    st_mtime   = NativeConvert.ToTimeT(file.FileLastModification?.ToUniversalTime() ?? file.UpdatedOn.ToUniversalTime()),
                    st_blksize = 512,
                    st_blocks  = (long)(file.Size / 512),
                    st_ino     = file.Id,
                    st_size    = (long)file.Size
                };
            }
            else
            {
                CachedDisk disk = _vfs.GetDisk(machine.Id, pieces[2]);

                if (disk != null)
                {
                    if (pieces.Length > 3)
                    {
                        return(Errno.ENOSYS);
                    }

                    if (disk.Sha1 == null &&
                        disk.Md5 == null)
                    {
                        return(Errno.ENOENT);
                    }

                    if (info.OpenAccess.HasFlag(OpenFlags.O_APPEND) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_CREAT) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_EXCL) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_TRUNC))
                    {
                        return(Errno.EROFS);
                    }

                    handle = _vfs.OpenDisk(disk.Sha1, disk.Md5);

                    stat = new Stat
                    {
                        st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                        st_nlink   = 1,
                        st_ctime   = NativeConvert.ToTimeT(disk.CreatedOn.ToUniversalTime()),
                        st_mtime   = NativeConvert.ToTimeT(disk.UpdatedOn.ToUniversalTime()),
                        st_blksize = 512,
                        st_blocks  = (long)(disk.Size / 512),
                        st_ino     = disk.Id,
                        st_size    = (long)disk.Size
                    };
                }
                else
                {
                    CachedMedia media = _vfs.GetMedia(machine.Id, pieces[2]);

                    if (media == null)
                    {
                        return(Errno.ENOENT);
                    }

                    if (pieces.Length > 3)
                    {
                        return(Errno.ENOSYS);
                    }

                    if (media.Sha256 == null &&
                        media.Sha1 == null &&
                        media.Md5 == null)
                    {
                        return(Errno.ENOENT);
                    }

                    if (info.OpenAccess.HasFlag(OpenFlags.O_APPEND) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_CREAT) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_EXCL) ||
                        info.OpenAccess.HasFlag(OpenFlags.O_TRUNC))
                    {
                        return(Errno.EROFS);
                    }

                    handle = _vfs.OpenMedia(media.Sha256, media.Sha1, media.Md5);

                    stat = new Stat
                    {
                        st_mode    = FilePermissions.S_IFREG | NativeConvert.FromOctalPermissionString("0444"),
                        st_nlink   = 1,
                        st_ctime   = NativeConvert.ToTimeT(media.CreatedOn.ToUniversalTime()),
                        st_mtime   = NativeConvert.ToTimeT(media.UpdatedOn.ToUniversalTime()),
                        st_blksize = 512,
                        st_blocks  = (long)(media.Size / 512),
                        st_ino     = media.Id,
                        st_size    = (long)media.Size
                    };
                }
            }

            if (handle <= 0)
            {
                return(Errno.ENOENT);
            }

            info.Handle = new IntPtr(handle);

            _fileStatHandleCache[handle] = stat;

            return(0);
        }
Пример #17
0
        public override void SetFilePermissions(string path, string mask, string group)
        {
            var permissions = NativeConvert.FromOctalPermissionString(mask);

            SetPermissions(path, mask, group, permissions);
        }