diff --git a/AssemblyVersion.cs b/AssemblyVersion.cs index 9431da0..9ee87f0 100644 --- a/AssemblyVersion.cs +++ b/AssemblyVersion.cs @@ -16,5 +16,5 @@ using System.Reflection; // // You can specify all the values or you can default the Revision and Build Numbers // by using the '*' as shown below: -[assembly: AssemblyVersion("3.0.1.456")] -[assembly: AssemblyFileVersion("3.0.1.456")] +[assembly: AssemblyVersion("3.0.1.457")] +[assembly: AssemblyFileVersion("3.0.1.457")] diff --git a/Core/Users.cs b/Core/Users.cs index 029a00b..2216b7d 100644 --- a/Core/Users.cs +++ b/Core/Users.cs @@ -228,6 +228,8 @@ namespace ScrewTurn.Wiki { public static bool RemoveUser(UserInfo user) { if(user.Provider.UserAccountsReadOnly) return false; + RemovePermissions(user); + bool done = user.Provider.RemoveUser(user); if(done) { Log.LogEntry("User " + user.Username + " removed", EntryType.General, Log.SystemUsername); @@ -240,6 +242,85 @@ namespace ScrewTurn.Wiki { } } + /// + /// Lists all directories in a provider, including the root. + /// + /// The provider. + /// The directories. + private static List ListDirectories(IFilesStorageProviderV30 provider) { + List directories = new List(50); + directories.Add("/"); + + ListDirectoriesRecursive(provider, "/", directories); + + return directories; + } + + private static void ListDirectoriesRecursive(IFilesStorageProviderV30 provider, string current, List output) { + foreach(string dir in provider.ListDirectories(current)) { + output.Add(dir); + ListDirectoriesRecursive(provider, dir, output); + } + } + + /// + /// Removes all permissions for a user. + /// + /// The user. + private static void RemovePermissions(UserInfo user) { + foreach(IFilesStorageProviderV30 prov in Collectors.FilesProviderCollector.AllProviders) { + foreach(string dir in ListDirectories(prov)) { + AuthWriter.RemoveEntriesForDirectory(user, prov, dir); + } + } + + AuthWriter.RemoveEntriesForGlobals(user); + + AuthWriter.RemoveEntriesForNamespace(user, null); + foreach(IPagesStorageProviderV30 prov in Collectors.PagesProviderCollector.AllProviders) { + foreach(PageInfo page in prov.GetPages(null)) { + AuthWriter.RemoveEntriesForPage(user, page); + } + + foreach(NamespaceInfo nspace in prov.GetNamespaces()) { + AuthWriter.RemoveEntriesForNamespace(user, nspace); + + foreach(PageInfo page in prov.GetPages(nspace)) { + AuthWriter.RemoveEntriesForPage(user, page); + } + } + } + } + + /// + /// Removes all permissions for a group. + /// + /// The group. + private static void RemovePermissions(UserGroup group) { + foreach(IFilesStorageProviderV30 prov in Collectors.FilesProviderCollector.AllProviders) { + foreach(string dir in ListDirectories(prov)) { + AuthWriter.RemoveEntriesForDirectory(group, prov, dir); + } + } + + AuthWriter.RemoveEntriesForGlobals(group); + + AuthWriter.RemoveEntriesForNamespace(group, null); + foreach(IPagesStorageProviderV30 prov in Collectors.PagesProviderCollector.AllProviders) { + foreach(PageInfo page in prov.GetPages(null)) { + AuthWriter.RemoveEntriesForPage(group, page); + } + + foreach(NamespaceInfo nspace in prov.GetNamespaces()) { + AuthWriter.RemoveEntriesForNamespace(group, nspace); + + foreach(PageInfo page in prov.GetPages(nspace)) { + AuthWriter.RemoveEntriesForPage(group, page); + } + } + } + } + /// /// Changes the Password of a User. /// @@ -415,6 +496,8 @@ namespace ScrewTurn.Wiki { public static bool RemoveUserGroup(UserGroup group) { if(group.Provider.UserGroupsReadOnly) return false; + RemovePermissions(group); + bool done = group.Provider.RemoveUserGroup(group); if(done) {