Пример #1
0
        private static void DeleteExistingDirectory(string destinationFolder)
        {
            foreach (var dir in Directory.GetDirectories(destinationFolder))
            {
                DeleteExistingDirectory(dir);
            }

            //By Bloom convention, thumbnails that were created by hand are marked "read only" so that the
            //thumbnail generator never overwrites them. However now that we're trying to clear out this
            //folder, we need to remove that readonly flag so we can delete it.
            foreach (var f in Directory.GetFiles(destinationFolder))
            {
                var attributes = RobustFile.GetAttributes(f);
                if ((attributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly)
                {
                    RobustFile.SetAttributes(f, attributes & ~FileAttributes.ReadOnly);
                }
            }
            SIL.IO.RobustIO.DeleteDirectory(destinationFolder, true);
        }
Пример #2
0
        public static string CollectFilePermissionInformation(string filePath)
        {
            var bldr = new StringBuilder();

            try
            {
                if (Platform.IsWindows)
                {
                    var currentUser = WindowsIdentity.GetCurrent();
                    bldr.AppendLine($"current user is {currentUser.Name}");
                    var              principal          = new WindowsPrincipal(currentUser);
                    bool             isInRoleWithAccess = false;
                    bool             accessDenied       = false;
                    bool             accessAllowed      = false;
                    FileSystemRights accessRights       = FileSystemRights.Write;
                    var              acl   = File.GetAccessControl(filePath);
                    var              rules = acl.GetAccessRules(true, true, typeof(NTAccount));
                    var              sid   = acl.GetOwner(typeof(SecurityIdentifier));
                    var              acct  = sid.Translate(typeof(NTAccount)) as NTAccount;
                    if (acct != null)
                    {
                        bldr.AppendLine($"owner of \"{filePath}\" is {acct.Value}");
                    }
                    var fileAttributes = RobustFile.GetAttributes(filePath);
                    bldr.AppendLine($"{filePath} current ReadOnly attribute of {filePath} is {(fileAttributes & FileAttributes.ReadOnly) == FileAttributes.ReadOnly}");
                    foreach (AuthorizationRule rule in rules)
                    {
                        var fsAccessRule = rule as FileSystemAccessRule;
                        if (fsAccessRule == null)
                        {
                            continue;
                        }
                        if ((fsAccessRule.FileSystemRights & accessRights) > 0)
                        {
                            var ntAccount = rule.IdentityReference as NTAccount;
                            if (ntAccount == null)
                            {
                                continue;
                            }
                            if (principal.IsInRole(ntAccount.Value))
                            {
                                if (fsAccessRule.AccessControlType == AccessControlType.Deny)
                                {
                                    bldr.AppendLine($"current user is denied write access to {filePath} by {ntAccount.Value}{(rule.IsInherited ? " (inherited)":"")}");
                                    accessDenied = true;
                                }
                                if (fsAccessRule.AccessControlType == AccessControlType.Allow)
                                {
                                    bldr.AppendLine($"current user is allowed write access to {filePath} by {ntAccount.Value}{(rule.IsInherited ? " (inherited)":"")}");
                                    accessAllowed = true;
                                }
                                isInRoleWithAccess = true;
                            }
                        }
                    }
                    if (isInRoleWithAccess)
                    {
                        if (!accessAllowed)
                        {
                            bldr.AppendLine($"current user is not explicitly allowed write access to {filePath}");
                        }
                        if (!accessDenied)
                        {
                            bldr.AppendLine($"current user is not explicitly denied write access to {filePath}");
                        }
                    }
                    else
                    {
                        bldr.AppendLine($"current user is not explicitly given access to {filePath}");
                    }
                }
                else
                {
                    var folder   = Path.GetDirectoryName(filePath);
                    var fileInfo = new UnixFileInfo(filePath);
                    var dirInfo  = new UnixDirectoryInfo(folder);
                    var userInfo = UnixUserInfo.GetRealUser();
                    bldr.AppendLine($"current user is {userInfo.UserName}");
                    bldr.AppendLine($"owner of \"{filePath}\" is {fileInfo.OwnerUser.UserName}");
                    bldr.AppendLine($"permissions of \"{filePath}\" = {fileInfo.FileAccessPermissions.ToString()}");
                    bldr.AppendLine($"owner of \"{folder}\" is {dirInfo.OwnerUser.UserName}");
                    bldr.AppendLine($"permissions of \"{folder}\" = {dirInfo.FileAccessPermissions.ToString()}");
                }
            }
            catch (Exception e)
            {
                bldr.AppendLine($"Caught exception {e} while trying to collect information about {filePath}");
            }
            return(bldr.ToString());
        }