Fixed and closed #457: deleting a user or group also deletes related ACL entries.

This commit is contained in:
Dario Solera 2010-01-14 07:47:29 +00:00
parent 446934322c
commit eb7d19e8f6
2 changed files with 85 additions and 2 deletions

View file

@ -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")]

View file

@ -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 {
}
}
/// <summary>
/// Lists all directories in a provider, including the root.
/// </summary>
/// <param name="provider">The provider.</param>
/// <returns>The directories.</returns>
private static List<string> ListDirectories(IFilesStorageProviderV30 provider) {
List<string> directories = new List<string>(50);
directories.Add("/");
ListDirectoriesRecursive(provider, "/", directories);
return directories;
}
private static void ListDirectoriesRecursive(IFilesStorageProviderV30 provider, string current, List<string> output) {
foreach(string dir in provider.ListDirectories(current)) {
output.Add(dir);
ListDirectoriesRecursive(provider, dir, output);
}
}
/// <summary>
/// Removes all permissions for a user.
/// </summary>
/// <param name="user">The user.</param>
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);
}
}
}
}
/// <summary>
/// Removes all permissions for a group.
/// </summary>
/// <param name="group">The group.</param>
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);
}
}
}
}
/// <summary>
/// Changes the Password of a User.
/// </summary>
@ -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) {