diff --git a/Features/UserUIExtension.cs b/Features/UserUIExtension.cs new file mode 100644 index 0000000..eb3b1de --- /dev/null +++ b/Features/UserUIExtension.cs @@ -0,0 +1,124 @@ +using Disco.Models.UI.User; +using Disco.Services.Interop.ActiveDirectory; +using Disco.Services.Plugins; +using Disco.Services.Plugins.Features.UIExtension; +using System; +using System.Text; +using System.Web.Mvc; + +namespace Disco.Plugins.ADCompare.Features +{ + [PluginFeature(Id = "ADCompareUserUI", Name = "User Page - AD Compare")] + public class UserUIExtension : UIExtensionFeature + { + public override UIExtensionResult ExecuteAction(ControllerContext context, UserShowModel model) + { + var user = model.User; + if (user == null || string.IsNullOrEmpty(user.UserId)) + return Nothing(); + + var html = new StringBuilder(); + html.Append("
"); + html.Append("

"); + html.Append(" AD Details

"); + + try + { + var adUser = ActiveDirectory.RetrieveADUserAccount( + user.UserId, + new[] { "lastLogonTimestamp", "whenCreated", "memberOf" }); + + if (adUser == null) + { + html.Append("
"); + html.Append(" User not found in Active Directory"); + html.Append("
"); + } + else + { + html.Append(""); + + html.Append(""); + + var lastLogonTicks = adUser.GetPropertyValue("lastLogonTimestamp"); + html.Append(""); + + if (!string.IsNullOrEmpty(adUser.DistinguishedName)) + { + html.Append(""); + } + + html.Append("
AD Status"); + if (adUser.IsDisabled) + { + html.Append(" Disabled"); + } + else + { + html.Append(" Active"); + } + html.Append("
Last Login"); + if (lastLogonTicks > 0) + { + try + { + var lastLogon = DateTime.FromFileTime(lastLogonTicks); + var ago = DateTime.Now.Subtract(lastLogon); + html.Append(Encode(lastLogon.ToString("dd/MM/yyyy hh:mm tt"))); + html.Append(" ("); + html.Append(FormatTimeAgo(ago)); + html.Append(")"); + + if (ago.TotalDays > 30 && !adUser.IsDisabled) + { + html.Append(" Inactive 30+ days"); + } + } + catch + { + html.Append("Unable to parse"); + } + } + else + { + html.Append("Never"); + } + html.Append("
AD Location"); + html.Append(""); + html.Append(Encode(adUser.DistinguishedName)); + html.Append(""); + html.Append("
"); + } + } + catch (Exception ex) + { + html.Append("
"); + html.Append(" AD lookup error: "); + html.Append(Encode(ex.Message)); + html.Append("
"); + } + + html.Append("
"); + return Literal(html.ToString()); + } + + private string Encode(string value) + { + if (string.IsNullOrEmpty(value)) return ""; + return System.Web.HttpUtility.HtmlEncode(value); + } + + private string FormatTimeAgo(TimeSpan span) + { + if (span.TotalDays >= 365) + return string.Format("{0} year(s) ago", (int)(span.TotalDays / 365)); + if (span.TotalDays >= 30) + return string.Format("{0} month(s) ago", (int)(span.TotalDays / 30)); + if (span.TotalDays >= 1) + return string.Format("{0} day(s) ago", (int)span.TotalDays); + if (span.TotalHours >= 1) + return string.Format("{0} hour(s) ago", (int)span.TotalHours); + return "Just now"; + } + } +}