using System; using System.Data; using System.Text; using System.Web.UI.WebControls; using CMS.CMSHelper; using CMS.GlobalHelper; using CMS.LicenseProvider; using CMS.SettingsProvider; using CMS.SiteProvider; using CMS.UIControls; using CMS.ExtendedControls; public partial class CMSModules_Membership_Pages_Users_General_User_Online : CMSUsersPage { #region "Variables" protected bool isInitiateChatEnabled; private string mSiteName; private const string CONTACT_DETAIL_DIALOG = "~/CMSModules/ContactManagement/Pages/Tools/Account/Contact_Detail.aspx"; private bool? mOnlineMarketingEnabled; private IUserFilter filter = null; #endregion #region "Properties" /// /// Gets current site name. /// private new string SiteName { get { if (String.IsNullOrEmpty(mSiteName)) { if (SiteID > 0) { SiteInfo si = SiteInfoProvider.GetSiteInfo(SiteID); if (si != null) { mSiteName = si.SiteName; } } } return mSiteName; } } /// /// Indicates if online marketing is enabled. /// private bool OnlineMarketingEnabled { get { if (mOnlineMarketingEnabled == null) { mOnlineMarketingEnabled = LicenseHelper.CheckFeature(URLHelper.GetCurrentDomain(), FeatureEnum.ContactManagement) && ResourceSiteInfoProvider.IsResourceOnSite("CMS.ContactManagement", CMSContext.CurrentSiteName) && SettingsKeyProvider.GetBoolValue(CMSContext.CurrentSiteName + ".CMSEnableOnlineMarketing"); } return (bool)mOnlineMarketingEnabled; } } #endregion #region "Page events" protected override void OnInit(EventArgs e) { base.OnInit(e); FilterMode = "online"; if (DisplayContacts) { gridElem.GridName = "User_OnlineDB.xml"; gridElem.OrderBy = "SessionFullName"; gridElem.Columns = "SessionUserID, SessionFullName, SessionEmail, SessionUserName, SessionNickName, SessionUserCreated, SessionLocation, SessionContactID, SessionSiteID, SessionLastActive"; EnableDisplayingGuests = true; } // Hide unigrid default filter button gridElem.HideFilterButton = true; gridElem.LoadGridDefinition(); // Get custom filter control if (SessionManager.StoreOnlineUsersInDatabase) { filter = (IUserFilter)gridElem.FilterFields["SessionSiteID"].ValueControl; } else { filter = (IUserFilter)gridElem.FilterFields["UserID"].ValueControl; // Where condition needs to be generated not only when user click "advanced filter show" button gridElem.ApplyFilter(this, new EventArgs()); } if (DisplayContacts) { filter.SessionInsteadOfUser = true; } filter.DisplayUserEnabled = false; filter.EnableDisplayingHiddenUsers = true; } protected void Page_Load(object sender, EventArgs e) { // Check permissions LicenseHelper.CheckFeatureAndRedirect(URLHelper.GetCurrentDomain(), FeatureEnum.OnlineUsers); isInitiateChatEnabled = CheckInitiateChat(); // If session management is disabled inform about it if (!SessionManager.OnlineUsersEnabled) { // Set disabled module info ucDisabledModule.SettingsKeys = "CMSUseSessionManagement"; ucDisabledModule.InfoText = GetString("administration.users.online.disabled"); ucDisabledModule.Visible = true; gridElem.Visible = false; lblGeneralInfo.Visible = false; } else { SetHeaderActions(); PrepareUnigrid(); } } protected override void OnPreRender(EventArgs e) { base.OnPreRender(e); SetCountOfUsers(); } protected override void CheckUIPermissions() { // Check UI Permissions for online marketing if needed if (QueryHelper.GetBoolean("isonlinemarketing", false)) { var user = CMSContext.CurrentUser; if (!user.IsAuthorizedPerUIElement("CMS.Desk", "OnlineMarketing")) { RedirectToCMSDeskUIElementAccessDenied("CMS.Desk", "OnlineMarketing"); } if (!user.IsAuthorizedPerUIElement("CMS.OnlineMarketing", new string[] { "OMCMGroup", "ContactsFrameset", "On-line_users" }, CMSContext.CurrentSiteName)) { RedirectToCMSDeskUIElementAccessDenied("CMS.OnlineMarketing", "OMCMGroup;ContactsFrameset;On-line_users"); } } else { base.CheckUIPermissions(); } } /// /// Checks the permission for administration if not in on-line marketing. /// public override void CheckAdministration() { if (!QueryHelper.GetBoolean("isonlinemarketing", false)) { base.CheckAdministration(); } } #endregion #region "Unigrid" /// /// Sets where condition before data binding. /// protected void gridElem_OnBeforeDataReload() { if (gridElem.QueryParameters == null) { gridElem.QueryParameters = new QueryDataParameters(); } gridElem.QueryParameters.Add("@Now", DateTime.Now); bool guestByDefault = QueryHelper.GetBoolean("guest", false); if (DisplayContacts) { gridElem.GridView.Columns[3].Visible = !guestByDefault; gridElem.GridView.Columns[4].Visible = !guestByDefault; gridElem.GridView.Columns[8].Visible = filter.DisplayGuests; gridElem.GridView.Columns[9].Visible = DisplayScore && (filter.SelectedScore > 0); gridElem.GridView.Columns[10].Visible = String.IsNullOrEmpty(SiteName) && (filter.SelectedSite <= 0); RegisterScripts(); } } /// /// On action event. /// private void gridElem_OnAction(string actionName, object actionArgument) { // Check "modify" permission if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.Users", "Modify")) { RedirectToAccessDenied("CMS.Users", "Modify"); } int userId = ValidationHelper.GetInteger(actionArgument, 0); switch (actionName.ToLowerCSafe()) { // Kick action case "kick": SessionManager.KickUser(userId); ShowConfirmation(GetString("kicked.user")); break; // Undo kick action case "undokick": SessionManager.RemoveUserFromKicked(userId); ShowConfirmation(GetString("kicked.cancel")); break; } } /// /// On external databound event. /// private object gridElem_OnExternalDataBound(object sender, string sourceName, object parameter) { switch (sourceName) { case "formattedusername": return GetFormattedUsername(parameter); case "fullname": return GetFullName(parameter); case "kick": return ModifyKickedButton(sender, parameter); case "undokick": return ModifyUndoKickButton(sender, parameter); case "initiatechat": return ModifyChatButton(sender, parameter); case "isguest": return GetIsGuest(parameter); case "editcontact": return ModifyContactButton(sender, parameter); default: return ""; } } DataSet gridElem_OnAfterRetrieveData(DataSet ds) { if (!DataHelper.DataSourceIsEmpty(ds) && (filter != null) && (filter.SelectedScore > 0)) { return GetScore(ds); } return ds; } #endregion #region "Unigrid data bound methods" /// /// Get formatted user name. /// private string GetFormattedUsername(object parameter) { var drv = (DataRowView)parameter; if (drv != null) { var ui = new UserInfo(drv.Row); string userName = Functions.GetFormattedUserName(ui.UserName); if (AuthenticationHelper.UserKicked(ui.UserID)) { return HTMLHelper.HTMLEncode(userName) + " " + GetString("administration.users.onlineusers.kicked") + ""; } return HTMLHelper.HTMLEncode(userName); } return ""; } /// /// Returns full name of the visitor. /// private object GetFullName(object parameter) { if (parameter == DBNull.Value) { return GetString("usersonline.anonymous"); } return parameter; } /// /// Displays button for kicking users. /// private object ModifyKickedButton(object sender, object parameter) { bool userIsAdmin = false; int userID; if (SessionManager.StoreOnlineUsersInDatabase) { userID = ValidationHelper.GetInteger(((DataRowView)((GridViewRow)parameter).DataItem).Row["SessionUserID"], 0); if (userID > 0) { UserInfo user = UserInfoProvider.GetUserInfo(userID); if (user != null) { userIsAdmin = user.UserIsGlobalAdministrator; } } } else { userID = ValidationHelper.GetInteger(((DataRowView)((GridViewRow)parameter).DataItem).Row["UserID"], 0); userIsAdmin = ValidationHelper.GetBoolean(((DataRowView)((GridViewRow)parameter).DataItem).Row["UserIsGlobalAdministrator"], false); } if (AuthenticationHelper.UserKicked(userID) || userIsAdmin || (userID == 0)) { var button = ((ImageButton)sender); button.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/Kickdisabled.png"); button.Enabled = false; } else { var button = ((ImageButton)sender); button.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/Kick.png"); button.Enabled = true; } return ""; } /// /// Displays button for undo kicked users. /// private object ModifyUndoKickButton(object sender, object parameter) { int userID = ValidationHelper.GetInteger(((DataRowView)((GridViewRow)parameter).DataItem).Row["UserID"], 0); if (AuthenticationHelper.UserKicked(userID)) { var button = ((ImageButton)sender); button.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/Undo.png"); button.Enabled = true; } else { var button = ((ImageButton)sender); button.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/Undodisabled.png"); button.Enabled = false; } return ""; } /// /// Display chat button. /// private object ModifyChatButton(object sender, object parameter) { ImageButton button = ((ImageButton)sender); button.ImageUrl = GetImageUrl("Design/Controls/UniGrid/Actions/Message.png"); if (!isInitiateChatEnabled) { button.Visible = false; } else { DataRow row = ((DataRowView)((GridViewRow)parameter).DataItem).Row; int contactID; int userID; if (DisplayContacts) { contactID = ValidationHelper.GetInteger(row["SessionContactID"], 0); userID = ValidationHelper.GetInteger(row["SessionUserID"], 0); } else { contactID = 0; userID = ValidationHelper.GetInteger(row["UserID"], 0); } // If userID and contactID are not known (can happen if online marketing is turned off), hide initiate chat button if ((userID <= 0) && (contactID <= 0)) { button.Visible = false; } else { button.OnClientClick = string.Format("if (window.top.ChatSupportManager) {{window.top.ChatSupportManager.InitiateChat({0}, {1});}} return false;", userID, contactID); } } return ""; } /// /// Modify contact button. /// private object ModifyContactButton(object sender, object parameter) { ImageButton button = ((ImageButton)sender); int contactID = ValidationHelper.GetInteger(((DataRowView)((GridViewRow)parameter).DataItem).Row["SessionContactID"], 0); if ((contactID > 0) && OnlineMarketingEnabled) { button.OnClientClick = String.Format("EditContact({0}); return false;", contactID); } else { button.Visible = false; } return ""; } /// /// Returns if online user is guest. /// private object GetIsGuest(object parameter) { int userID = ValidationHelper.GetInteger(parameter, 0); if (userID == 0) { return GetString("general.yes"); } return ""; } #endregion #region "Private methods" /// /// Set header actions. /// private void SetHeaderActions() { string[,] actions = new string[1, 6]; actions[0, 0] = HeaderActions.TYPE_HYPERLINK; actions[0, 1] = GetString("General.Refresh"); actions[0, 2] = null; actions[0, 3] = URLHelper.CurrentURL; actions[0, 4] = null; actions[0, 5] = GetImageUrl("CMSModules/CMS_PortalEngine/ContextMenu/Refresh.png"); CurrentMaster.HeaderActions.Actions = actions; } /// /// Sets number of online users. /// private void SetCountOfUsers() { int publicUsers; int authenticatedUsers; SessionManager.GetUsersNumber(SiteName, null, true, false, out publicUsers, out authenticatedUsers); lblGeneralInfo.Text = String.Format(GetString("OnlineUsers.GeneralInfo"), publicUsers + authenticatedUsers, publicUsers, authenticatedUsers) + "

"; } /// /// Prepares unigrid. /// private void PrepareUnigrid() { // Online users in DB if (SessionManager.StoreOnlineUsersInDatabase) { gridElem.ObjectType = "cms.onlineuser"; } // On-line users in hashtable else { string usersWhere = ValidationHelper.GetString(SessionManager.GetUsersWhereCondition(null, SiteName, true, true), String.Empty); if (!String.IsNullOrEmpty(usersWhere)) { gridElem.ObjectType = "cms.userlist"; gridElem.WhereCondition = usersWhere; } else { // Clear the object type gridElem.ObjectType = string.Empty; } } // Setup unigrid events gridElem.OnAction += gridElem_OnAction; gridElem.OnBeforeDataReload += gridElem_OnBeforeDataReload; gridElem.OnExternalDataBound += gridElem_OnExternalDataBound; gridElem.ZeroRowsText = GetString("general.nodatafound"); gridElem.OnAfterRetrieveData += gridElem_OnAfterRetrieveData; } /// /// Registers javascript. /// private void RegisterScripts() { ScriptHelper.RegisterDialogScript(Page); string script = @" function EditContact(contactID) { modalDialog('" + ResolveUrl(CONTACT_DETAIL_DIALOG) + @"?contactid=' + contactID, 'ContactDetail', '1024', '700'); } "; ScriptHelper.RegisterClientScriptBlock(this, typeof(string), "Actions", ScriptHelper.GetScript(script)); } /// /// Gets score for specified contacts. /// private DataSet GetScore(DataSet ds) { ds.Tables[0].Columns.Add("Score"); StringBuilder contacts = new StringBuilder(); foreach (DataRow dr in ds.Tables[0].Rows) { int contactID = ValidationHelper.GetInteger(dr["SessionContactID"], 0); if (contactID > 0) { contacts.Append(contactID + ","); } } string contactList = contacts.ToString(); if (!String.IsNullOrEmpty(contactList)) { contactList = contactList.Substring(0, contactList.Length - 1); GeneralizedInfo contactScore = CMSObjectHelper.GetReadOnlyObject("om.contactscorelist"); DataSet result = contactScore.GetData(null, String.Format("ContactID IN ({0}) AND ScoreID = {1}", contactList, filter.SelectedScore), null, -1, "ContactID,ScoreValue", false); if (!DataHelper.DataSourceIsEmpty(result)) { foreach (DataRow dr in result.Tables[0].Rows) { DataRow[] row = ds.Tables[0].Select("SessionContactID =" + dr["ContactID"]); row[0]["Score"] = dr["ScoreValue"]; } } } return ds; } #endregion }