using Disco.Data.Repository; 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 void Initialize(DiscoDataContext Database) { Register(); } 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(); // Wrapper div with unique ID for relocation html.Append("
"); 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("
"); // form-group html.Append("
"); // wrapper // Script to relocate panel under the device assignment section 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"; } } }