Added identity impersonation logic to all background operations (ThreadPool).

This commit is contained in:
Dario Solera 2011-02-20 15:31:43 +01:00
parent ec69ace193
commit 180e45d90c
3 changed files with 50 additions and 42 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 // You can specify all the values or you can default the Revision and Build Numbers
// by using the '*' as shown below: // by using the '*' as shown below:
[assembly: AssemblyVersion("3.0.4.575")] [assembly: AssemblyVersion("3.0.4.576")]
[assembly: AssemblyFileVersion("3.0.4.575")] [assembly: AssemblyFileVersion("3.0.4.576")]

View file

@ -3,36 +3,39 @@ using System;
using System.Configuration; using System.Configuration;
using System.Net; using System.Net;
using System.Net.Mail; using System.Net.Mail;
using System.Security.Principal;
using System.Web; using System.Web;
using System.Web.Security; using System.Web.Security;
using System.Web.UI; using System.Web.UI;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls; using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts; using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;
using ScrewTurn.Wiki.PluginFramework; using ScrewTurn.Wiki.PluginFramework;
namespace ScrewTurn.Wiki { namespace ScrewTurn.Wiki {
/// <summary> /// <summary>
/// Implements email-related tools. /// Implements email-related tools.
/// </summary> /// </summary>
public static class EmailTools { public static class EmailTools {
/// <summary> /// <summary>
/// Sends an email. /// Sends an email.
/// </summary> /// </summary>
/// <param name="recipient">The recipient.</param> /// <param name="recipient">The recipient.</param>
/// <param name="sender">The sender.</param> /// <param name="sender">The sender.</param>
/// <param name="subject">The subject.</param> /// <param name="subject">The subject.</param>
/// <param name="body">The message body.</param> /// <param name="body">The message body.</param>
/// <param name="html"><c>true</c> if the body is HTML.</param> /// <param name="html"><c>true</c> if the body is HTML.</param>
public static void AsyncSendEmail(string recipient, string sender, string subject, string body, bool html) { public static void AsyncSendEmail(string recipient, string sender, string subject, string body, bool html) {
System.Threading.ThreadPool.QueueUserWorkItem(delegate(object state) { System.Threading.ThreadPool.QueueUserWorkItem(delegate(object state) {
MailMessage message = new MailMessage(sender, recipient, subject, body); using(((WindowsIdentity)state).Impersonate()) {
message.IsBodyHtml = html; MailMessage message = new MailMessage(sender, recipient, subject, body);
TrySendMessage(message); message.IsBodyHtml = html;
}); TrySendMessage(message);
} }
}, WindowsIdentity.GetCurrent());
}
/// <summary> /// <summary>
/// Tries to send a message, swallowing all exceptions. /// Tries to send a message, swallowing all exceptions.
@ -94,15 +97,17 @@ namespace ScrewTurn.Wiki {
if(recipients.Length == 0) return; if(recipients.Length == 0) return;
System.Threading.ThreadPool.QueueUserWorkItem(delegate(object state) { System.Threading.ThreadPool.QueueUserWorkItem(delegate(object state) {
MailMessage message = new MailMessage(new MailAddress(sender), new MailAddress(sender)); using(((WindowsIdentity)state).Impersonate()) {
message.Subject = subject; MailMessage message = new MailMessage(new MailAddress(sender), new MailAddress(sender));
message.Body = body; message.Subject = subject;
for(int i = 0; i < recipients.Length; i++) { message.Body = body;
message.Bcc.Add(new MailAddress(recipients[i])); for(int i = 0; i < recipients.Length; i++) {
message.Bcc.Add(new MailAddress(recipients[i]));
}
message.IsBodyHtml = html;
TrySendMessage(message);
} }
message.IsBodyHtml = html; }, WindowsIdentity.GetCurrent());
TrySendMessage(message);
});
} }
/// <summary> /// <summary>

View file

@ -2,6 +2,7 @@
using System; using System;
using System.IO; using System.IO;
using System.Resources; using System.Resources;
using System.Security.Principal;
using System.Web.Configuration; using System.Web.Configuration;
using ScrewTurn.Wiki.PluginFramework; using ScrewTurn.Wiki.PluginFramework;
@ -192,24 +193,26 @@ namespace ScrewTurn.Wiki {
Log.LogEntry("ScrewTurn Wiki is ready", EntryType.General, Log.SystemUsername); Log.LogEntry("ScrewTurn Wiki is ready", EntryType.General, Log.SystemUsername);
System.Threading.ThreadPool.QueueUserWorkItem(ignored => { System.Threading.ThreadPool.QueueUserWorkItem(state => {
if((DateTime.Now - Settings.LastPageIndexing).TotalDays > 7) { using(((WindowsIdentity)state).Impersonate()) {
Settings.LastPageIndexing = DateTime.Now; if((DateTime.Now - Settings.LastPageIndexing).TotalDays > 7) {
System.Threading.Thread.Sleep(10000); Settings.LastPageIndexing = DateTime.Now;
using(MemoryStream ms = new MemoryStream()) { System.Threading.Thread.Sleep(10000);
using(StreamWriter wr = new System.IO.StreamWriter(ms)) { using(MemoryStream ms = new MemoryStream()) {
System.Web.HttpContext.Current = new System.Web.HttpContext(new System.Web.Hosting.SimpleWorkerRequest("", "", wr)); using(StreamWriter wr = new System.IO.StreamWriter(ms)) {
foreach(var provider in Collectors.PagesProviderCollector.AllProviders) { System.Web.HttpContext.Current = new System.Web.HttpContext(new System.Web.Hosting.SimpleWorkerRequest("", "", wr));
if(!provider.ReadOnly) { foreach(var provider in Collectors.PagesProviderCollector.AllProviders) {
Log.LogEntry("Starting automatic rebuilding index for provider: " + provider.Information.Name, EntryType.General, Log.SystemUsername); if(!provider.ReadOnly) {
provider.RebuildIndex(); Log.LogEntry("Starting automatic rebuilding index for provider: " + provider.Information.Name, EntryType.General, Log.SystemUsername);
Log.LogEntry("Finished automatic rebuilding index for provider: " + provider.Information.Name, EntryType.General, Log.SystemUsername); provider.RebuildIndex();
Log.LogEntry("Finished automatic rebuilding index for provider: " + provider.Information.Name, EntryType.General, Log.SystemUsername);
}
} }
} }
} }
} }
} }
}); }, WindowsIdentity.GetCurrent());
} }
/// <summary> /// <summary>