using System; using System.Collections.Generic; using System.Web; using System.Web.UI; using System.Web.UI.WebControls; using ScrewTurn.Wiki.PluginFramework; namespace ScrewTurn.Wiki { public partial class AdminNamespaces : BasePage { private const string RootName = "<root>"; private const string RootNameUnescaped = "-- root --"; protected void Page_Load(object sender, EventArgs e) { AdminMaster.RedirectToLoginIfNeeded(); if(!AdminMaster.CanManageNamespaces(SessionFacade.GetCurrentUsername(), SessionFacade.GetCurrentGroupNames())) UrlTools.Redirect("AccessDenied.aspx"); if(!Page.IsPostBack) { rptNamespaces.DataBind(); // Populate themes string[] themes = Tools.AvailableThemes; foreach(string theme in themes) { lstTheme.Items.Add(new ListItem(theme, theme)); } } } protected void rptNamespaces_DataBinding(object sender, EventArgs e) { List namespaces = Pages.GetNamespaces(); List result = new List(namespaces.Count); bool canSetPermissions = AdminMaster.CanManagePermissions(SessionFacade.GetCurrentUsername(), SessionFacade.GetCurrentGroupNames()); PageInfo defaultPage = Pages.FindPage(Settings.DefaultPage); // Inject the root namespace as first entry, retrieving the default page in Settings result.Add(new NamespaceRow(new NamespaceInfo(RootName, defaultPage.Provider, defaultPage), Settings.GetTheme(null), Pages.GetPages(null).Count, Pages.GetCategories(null).Count, canSetPermissions, txtCurrentNamespace.Value == RootName)); foreach(NamespaceInfo ns in namespaces) { result.Add(new NamespaceRow(ns, Settings.GetTheme(ns.Name), Pages.GetPages(ns).Count, Pages.GetCategories(ns).Count, canSetPermissions, txtCurrentNamespace.Value == ns.Name)); } rptNamespaces.DataSource = result; } protected void rptNamespaces_ItemCommand(object sender, RepeaterCommandEventArgs e) { txtCurrentNamespace.Value = e.CommandArgument as string; NamespaceInfo nspace = txtCurrentNamespace.Value != RootName ? Pages.FindNamespace(txtCurrentNamespace.Value) : null; if(e.CommandName == "Select") { // rptNamespaces.DataBind(); Not needed because the list is hidden on select string theme = Settings.GetTheme(nspace != null ? nspace.Name : null); txtName.Enabled = false; txtName.Text = nspace != null ? nspace.Name : RootNameUnescaped; txtNewName.Text = ""; cvName.Enabled = false; cvName2.Enabled = false; LoadDefaultPages(); lstTheme.SelectedIndex = -1; foreach(ListItem item in lstTheme.Items) { if(item.Value == theme) { item.Selected = true; break; } } providerSelector.SelectedProvider = nspace != null ? nspace.Provider.ToString() : Settings.DefaultPagesProvider; providerSelector.Enabled = false; btnCreate.Visible = false; btnSave.Visible = true; btnDelete.Visible = true; // Cannot delete root namespace btnDelete.Enabled = nspace != null; // Cannot rename root namespace btnRename.Enabled = nspace != null; pnlList.Visible = false; pnlEditNamespace.Visible = true; lblResult.Text = ""; lblResult.CssClass = ""; } else if(e.CommandName == "Perms") { if(!AdminMaster.CanManagePermissions(SessionFacade.GetCurrentUsername(), SessionFacade.GetCurrentGroupNames())) return; permissionsManager.CurrentResourceName = nspace != null ? nspace.Name : null; lblNamespaceName.Text = nspace != null ? nspace.Name : RootName; pnlList.Visible = false; pnlPermissions.Visible = true; lblResult.Text = ""; lblResult.CssClass = ""; } } protected void btnPublic_Click(object sender, EventArgs e) { NamespaceInfo nspace = Pages.FindNamespace(txtCurrentNamespace.Value); RemoveAllPermissions(nspace); // Set permissions AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.FullControl, Users.FindUserGroup(Settings.AdministratorsGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.CreatePages, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.ManageCategories, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.PostDiscussion, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.DownloadAttachments, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.ModifyPages, Users.FindUserGroup(Settings.AnonymousGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.PostDiscussion, Users.FindUserGroup(Settings.AnonymousGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.DownloadAttachments, Users.FindUserGroup(Settings.AnonymousGroup)); RefreshPermissionsManager(); } protected void btnNormal_Click(object sender, EventArgs e) { NamespaceInfo nspace = Pages.FindNamespace(txtCurrentNamespace.Value); RemoveAllPermissions(nspace); // Set permissions AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.FullControl, Users.FindUserGroup(Settings.AdministratorsGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.CreatePages, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.ManageCategories, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.PostDiscussion, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.DownloadAttachments, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.ReadPages, Users.FindUserGroup(Settings.AnonymousGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.ReadDiscussion, Users.FindUserGroup(Settings.AnonymousGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.DownloadAttachments, Users.FindUserGroup(Settings.AnonymousGroup)); RefreshPermissionsManager(); } protected void btnPrivate_Click(object sender, EventArgs e) { NamespaceInfo nspace = Pages.FindNamespace(txtCurrentNamespace.Value); RemoveAllPermissions(nspace); // Set permissions AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.FullControl, Users.FindUserGroup(Settings.AdministratorsGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.CreatePages, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.ManageCategories, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.PostDiscussion, Users.FindUserGroup(Settings.UsersGroup)); AuthWriter.SetPermissionForNamespace(AuthStatus.Grant, nspace, Actions.ForNamespaces.DownloadAttachments, Users.FindUserGroup(Settings.UsersGroup)); RefreshPermissionsManager(); } /// /// Refreshes the permissions manager. /// private void RefreshPermissionsManager() { string r = permissionsManager.CurrentResourceName; permissionsManager.CurrentResourceName = r; } /// /// Removes all the permissions for a namespace. /// /// The namespace (null for the root). private void RemoveAllPermissions(NamespaceInfo nspace) { AuthWriter.RemoveEntriesForNamespace(Users.FindUserGroup(Settings.AnonymousGroup), nspace); AuthWriter.RemoveEntriesForNamespace(Users.FindUserGroup(Settings.UsersGroup), nspace); AuthWriter.RemoveEntriesForNamespace(Users.FindUserGroup(Settings.AdministratorsGroup), nspace); } protected void cvName_ServerValidate(object sender, ServerValidateEventArgs e) { e.IsValid = Pages.FindNamespace(txtName.Text) == null; } protected void cvName2_ServerValidate(object sender, ServerValidateEventArgs e) { e.IsValid = Pages.IsValidName(txtName.Text); } protected void btnCreate_Click(object sender, EventArgs e) { Page.Validate("namespace"); if(!Page.IsValid) return; // Create new namespace and the default page (MainPage) bool done = Pages.CreateNamespace(txtName.Text, Collectors.PagesProviderCollector.GetProvider(providerSelector.SelectedProvider)); if(done) { NamespaceInfo nspace = Pages.FindNamespace(txtName.Text); done = Pages.CreatePage(nspace, "MainPage"); PageInfo page = Pages.FindPage(NameTools.GetFullName(nspace.Name, "MainPage")); if(done) { done = Pages.ModifyPage(page, "Main Page", Log.SystemUsername, DateTime.Now, "", Defaults.MainPageContentForSubNamespace, new string[0], "", SaveMode.Normal); if(done) { done = Pages.SetNamespaceDefaultPage(nspace, page); if(done) { Settings.SetTheme(nspace.Name, lstTheme.SelectedValue); if(done) { RefreshList(); lblResult.CssClass = "resultok"; lblResult.Text = Properties.Messages.NamespaceCreated; ReturnToList(); } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.NamespaceCreatedCouldNotSetTheme; } } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.NamespaceCreatedCouldNotSetDefaultPage; } } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.NamespaceCreatedCouldNotStoreDefaultPageContent; } } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.NamespaceCreatedCouldNotCreateDefaultPage; } } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.CouldNotCreateNamespace; } } protected void btnSave_Click(object sender, EventArgs e) { // This can rarely occur if(string.IsNullOrEmpty(lstDefaultPage.SelectedValue)) return; if(string.IsNullOrEmpty(lstTheme.SelectedValue)) return; NamespaceInfo nspace = txtCurrentNamespace.Value != RootName ? Pages.FindNamespace(txtCurrentNamespace.Value) : null; bool done = Pages.SetNamespaceDefaultPage(nspace, Pages.FindPage(lstDefaultPage.SelectedValue)); if(done) { Settings.SetTheme(nspace != null ? nspace.Name : null, lstTheme.SelectedValue); if(done) { RefreshList(); lblResult.CssClass = "resultok"; lblResult.Text = Properties.Messages.NamespaceSaved; ReturnToList(); } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.CouldNotSetNamespaceTheme; } } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.CouldNotSetNamespaceDefaultPage; } } protected void btnDelete_Click(object sender, EventArgs e) { pnlDelete.Visible = true; } protected void btnConfirmDeletion_Click(object sender, EventArgs e) { bool done = Pages.RemoveNamespace(Pages.FindNamespace(txtCurrentNamespace.Value)); if(done) { RefreshList(); lblResult.CssClass = "resultok"; lblResult.Text = Properties.Messages.NamespaceDeleted; ReturnToList(); } else { lblResult.CssClass = "resulterror"; lblResult.Text = Properties.Messages.CouldNotDeleteNamespace; } } protected void btnCancel_Click(object sender, EventArgs e) { RefreshList(); ReturnToList(); } protected void btnBack_Click(object sender, EventArgs e) { RefreshList(); ReturnToList(); } protected void btnNewNamespace_Click(object sender, EventArgs e) { pnlList.Visible = false; pnlEditNamespace.Visible = true; lstDefaultPage.Enabled = false; lblDefaultPageInfo.Visible = true; btnRename.Enabled = false; lblResult.Text = ""; lblResult.CssClass = ""; } /// /// Refreshes the namespace list. /// private void RefreshList() { txtCurrentNamespace.Value = ""; ResetEditor(); rptNamespaces.DataBind(); } /// /// Loads the available pages and selects the current one. /// private void LoadDefaultPages() { // Populate default page, if there is a namespace selected if(!string.IsNullOrEmpty(txtCurrentNamespace.Value)) { NamespaceInfo nspace = Pages.FindNamespace( txtCurrentNamespace.Value != RootName ? txtCurrentNamespace.Value : null); List pages = Pages.GetPages(nspace); string currentDefaultPage = nspace != null ? nspace.DefaultPage.FullName : Settings.DefaultPage; lstDefaultPage.Items.Clear(); foreach(PageInfo page in pages) { ListItem item = new ListItem(NameTools.GetLocalName(page.FullName), page.FullName); if(page.FullName == currentDefaultPage) item.Selected = true; lstDefaultPage.Items.Add(item); } } } /// /// Resets the namespace editor. /// private void ResetEditor() { txtName.Text = ""; txtName.Enabled = true; cvName.Enabled = true; cvName2.Enabled = true; providerSelector.Enabled = true; providerSelector.Reload(); lstDefaultPage.Enabled = true; lstDefaultPage.Items.Clear(); lblDefaultPageInfo.Visible = false; lstTheme.SelectedIndex = 0; btnCreate.Visible = true; btnSave.Visible = false; btnDelete.Visible = false; btnDelete.Enabled = true; pnlDelete.Visible = false; btnRename.Enabled = true; } /// /// Returns to the group list. /// private void ReturnToList() { pnlEditNamespace.Visible = false; pnlPermissions.Visible = false; pnlList.Visible = true; } protected void cvNewName_ServerValidate(object sender, ServerValidateEventArgs e) { e.IsValid = Pages.FindNamespace(txtNewName.Text) == null; } protected void cvNewName2_ServerValidate(object sender, ServerValidateEventArgs e) { e.IsValid = Pages.IsValidName(txtNewName.Text); } protected void btnRename_Click(object sender, EventArgs e) { lblRenameResult.CssClass = ""; lblRenameResult.Text = ""; Page.Validate("rename"); if(!Page.IsValid) return; NamespaceInfo nspace = Pages.FindNamespace(txtCurrentNamespace.Value); string theme = Settings.GetTheme(nspace.Name); if(Pages.RenameNamespace(nspace, txtNewName.Text)) { Settings.SetTheme(txtNewName.Text, theme); RefreshList(); lblRenameResult.CssClass = "resultok"; lblRenameResult.Text = Properties.Messages.NamespaceRenamed; ReturnToList(); } else { lblRenameResult.CssClass = "resulterror"; lblRenameResult.Text = Properties.Messages.CouldNotRenameNamespace; } } } /// /// Represents a Namespace for display purposes. /// public class NamespaceRow { private string name, defaultPage, theme, pageCount, categoryCount, provider, additionalClass; private bool canSetPermissions; /// /// Initializes a new instance of the class. /// /// The original namespace. /// The theme for the namespace. /// The page count. /// The category count. /// A value indicating whether the current user can set namespace permissions. /// A value indicating whether the namespace is selected. public NamespaceRow(NamespaceInfo nspace, string theme, int pageCount, int categoryCount, bool canSetPermissions, bool selected) { name = nspace.Name; defaultPage = nspace.DefaultPage.FullName; this.theme = theme; this.pageCount = pageCount.ToString(); this.categoryCount = categoryCount.ToString(); provider = nspace.Provider.Information.Name; this.canSetPermissions = canSetPermissions; additionalClass = selected ? " selected" : ""; } /// /// Gets the name. /// public string Name { get { return name; } } /// /// Gets the default page. /// public string DefaultPage { get { return defaultPage; } } /// /// Gets the theme. /// public string Theme { get { return theme; } } /// /// Gets the page count. /// public string PageCount { get { return pageCount; } } /// /// Gets the category count. /// public string CategoryCount { get { return categoryCount; } } /// /// Gets the provider. /// public string Provider { get { return provider; } } /// /// Gets a value indicating whether the current user can set namespace permissions. /// public bool CanSetPermissions { get { return canSetPermissions; } } /// /// Gets the additional CSS class. /// public string AdditionalClass { get { return additionalClass; } } } }