using System; using System.Data; using System.Configuration; using System.Collections; using System.Collections.Generic; using System.IO; using System.Web; using System.Web.Security; using System.Web.UI; using System.Web.UI.WebControls; using System.Web.UI.WebControls.WebParts; using System.Web.UI.HtmlControls; using ScrewTurn.Wiki.PluginFramework; using System.Text; namespace ScrewTurn.Wiki { public partial class History : BasePage { private PageInfo page; private PageContent content; private bool canRollback; protected void Page_Load(object sender, EventArgs e) { Page.Title = Properties.Messages.HistoryTitle + " - " + Settings.WikiTitle; page = Pages.FindPage(Request["Page"]); if(page != null) { canRollback = AuthChecker.CheckActionForPage(page, Actions.ForPages.ManagePage, SessionFacade.GetCurrentUsername(), SessionFacade.GetCurrentGroupNames()); content = Content.GetPageContent(page, true); lblTitle.Text = Properties.Messages.PageHistory + ": " + FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.PageContent, page); bool canView = AuthChecker.CheckActionForPage(page, Actions.ForPages.ReadPage, SessionFacade.GetCurrentUsername(), SessionFacade.GetCurrentGroupNames()); if(!canView) UrlTools.Redirect("AccessDenied.aspx"); } else { lblTitle.Text = Properties.Messages.PageNotFound; return; } if(!Page.IsPostBack && page != null) { List revisions = Pages.GetBackups(page); revisions.Reverse(); // Populate dropdown lists lstRev1.Items.Clear(); lstRev2.Items.Clear(); lstRev2.Items.Add(new ListItem(Properties.Messages.Current, "Current")); if(Request["Rev2"] != null && Request["Rev2"].Equals(lstRev2.Items[0].Value)) lstRev2.SelectedIndex = 0; for(int i = 0; i < revisions.Count; i++) { lstRev1.Items.Add(new ListItem(revisions[i].ToString(), revisions[i].ToString())); lstRev2.Items.Add(new ListItem(revisions[i].ToString(), revisions[i].ToString())); if(Request["Rev1"] != null && Request["Rev1"].Equals(lstRev1.Items[i].Value)) lstRev1.SelectedIndex = i; if(Request["Rev2"] != null && Request["Rev2"].Equals(lstRev2.Items[i + 1].Value)) lstRev2.SelectedIndex = i + 1; } if(revisions.Count == 0) btnCompare.Enabled = false; } PrintHistory(); } /// /// Prints the history. /// public void PrintHistory() { if(page == null) return; StringBuilder sb = new StringBuilder(); if(Request["Revision"] == null) { // Show version list List revisions = Pages.GetBackups(page); revisions.Reverse(); List result = new List(revisions.Count + 1); result.Add(new RevisionRow(-1, Content.GetPageContent(page, false), false)); foreach(int rev in revisions) { PageContent content = Pages.GetBackupContent(page, rev); result.Add(new RevisionRow(rev, content, canRollback)); } rptHistory.DataSource = result; rptHistory.DataBind(); } else { int rev = -1; if(!int.TryParse(Request["Revision"], out rev)) UrlTools.Redirect(page.FullName + Settings.PageExtension); List backups = Pages.GetBackups(page); if(!backups.Contains(rev)) { UrlTools.Redirect(page.FullName + Settings.PageExtension); return; } PageContent revision = Pages.GetBackupContent(page, rev); sb.Append(@"
"); sb.Append(@"

"); if(rev > 0) { sb.Append(@"« "); sb.Append(Properties.Messages.OlderRevision); sb.Append(""); } else { sb.Append("« "); sb.Append(Properties.Messages.OlderRevision); } sb.Append(@" - "); sb.Append(Properties.Messages.BackToHistory); sb.Append(" - "); if(rev < backups.Count - 1) { sb.Append(@""); sb.Append(Properties.Messages.NewerRevision); sb.Append(" »"); } else { sb.Append(@""); sb.Append(Properties.Messages.CurrentRevision); sb.Append(""); } sb.Append("


"); sb.Append(@"

"); sb.Append(Properties.Messages.PageRevision); sb.Append(": "); sb.Append(Preferences.AlignWithTimezone(revision.LastModified).ToString(Settings.DateTimeFormat)); sb.Append("


"); sb.Append(FormattingPipeline.FormatWithPhase3(FormattingPipeline.FormatWithPhase1And2(revision.Content, false, FormattingContext.PageContent, page).Replace(Formatter.EditSectionPlaceHolder, ""), FormattingContext.PageContent, page)); } lblHistory.Text = sb.ToString(); } protected void rptHistory_ItemCommand(object sender, CommandEventArgs e) { if(e.CommandName == "Rollback") { if(!canRollback) return; int rev = int.Parse(e.CommandArgument as string); Log.LogEntry("Page rollback requested for " + page.FullName + " to rev. " + rev.ToString(), EntryType.General, SessionFacade.GetCurrentUsername()); Pages.Rollback(page, rev); PrintHistory(); } } protected void btnCompare_Click(object sender, EventArgs e) { UrlTools.Redirect(UrlTools.BuildUrl("Diff.aspx?Page=", Tools.UrlEncode(page.FullName), "&Rev1=", lstRev1.SelectedValue, "&Rev2=", lstRev2.SelectedValue)); } } /// /// Represents a page revision for display purposes. /// public class RevisionRow { private string page, revision, title, savedOn, savedBy, comment; private bool canRollback; /// /// Initializes a new instance of the class. /// /// The revision (-1 for current). /// The original page content. /// A value indicating whether the current user can rollback the page. public RevisionRow(int revision, PageContent content, bool canRollback) { this.page = content.PageInfo.FullName; if(revision == -1) this.revision = Properties.Messages.Current; else this.revision = revision.ToString(); title = FormattingPipeline.PrepareTitle(content.Title, false, FormattingContext.PageContent, content.PageInfo); savedOn = Preferences.AlignWithTimezone(content.LastModified).ToString(Settings.DateTimeFormat); savedBy = content.User; comment = content.Comment; this.canRollback = canRollback; } /// /// Gets the page name. /// public string Page { get { return page; } } /// /// Gets the revision. /// public string Revision { get { return revision; } } /// /// Gets the title. /// public string Title { get { return title; } } /// /// Gets the save date/time. /// public string SavedOn { get { return savedOn; } } /// /// Gets the revision author. /// public string SavedBy { get { return savedBy; } } /// /// Gets the comment. /// public string Comment { get { return comment; } } /// /// Gets a value indicating whether the current user can rollback the page. /// public bool CanRollback { get { return canRollback; } } } }