HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
File: D:/HostingSpaces/TDijk1/erp-apps.eu/wwwroot/CMSModules/Forums/Controls/ForumDivider.ascx.cs
using System;
using System.Data;
using System.Collections;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.HtmlControls;

using CMS.DocumentEngine;
using CMS.ExtendedControls;
using CMS.Forums;
using CMS.Helpers;
using CMS.Membership;

public partial class CMSModules_Forums_Controls_ForumDivider : ForumViewer, INamingContainer
{
    #region "Private variables"

    // Default path to the forum layouts directory
    private const string defaultPath = "~/CMSModules/Forums/Controls/Layouts/";
    // Current control
    private Control ctrl = null;
    // Indicates starting mode, 0 - Group, 1 - Forum
    private int startingMode = -1;
    // Current forum state
    private ForumStateEnum currentState = ForumStateEnum.Unknown;
    // group name
    private string mGroupName = "";
    // forum name
    private string mForumName = "";
    // Indicates whether current control is search results control
    private bool mSearchResult = false;

    #endregion


    #region "Public properties"

    /// <summary>
    /// Messages placeholder
    /// </summary>
    public override MessagesPlaceHolder MessagesPlaceHolder
    {
        get
        {
            return plcMess;
        }
    }


    /// <summary>
    /// Indicates if control is used on live site.
    /// </summary>
    public override bool IsLiveSite
    {
        get
        {
            return base.IsLiveSite;
        }
        set
        {
            plcMess.IsLiveSite = value;
            base.IsLiveSite = value;
        }
    }


    /// <summary>
    /// Gets or sets the value that indicates whether current control is search result.
    /// </summary>
    public bool SearchResult
    {
        get
        {
            return mSearchResult;
        }
        set
        {
            mSearchResult = value;
        }
    }


    /// <summary>
    /// Gets or sets the forum id.
    /// </summary>
    public override int ForumID
    {
        get
        {
            return base.ForumID;
        }
        set
        {
            base.ForumID = value;
            startingMode = 1;
            ForumContext.ForumID = value;
        }
    }


    /// <summary>
    /// Gets or sets the group id.
    /// </summary>
    public override int GroupID
    {
        get
        {
            return base.GroupID;
        }
        set
        {
            if (!StopProcessing && !ForumContext.StopViewerLoading)
            {
                base.GroupID = value;
                ForumContext.GroupID = value;
                startingMode = 0;
                // Check whether forum is defined
                if ((ForumContext.CurrentForum != null) && (currentState != ForumStateEnum.Forums))
                {
                    // For nested level call request to single display
                    if ((ForumContext.CurrentGroup != null) && (ForumContext.CurrentForum.ForumGroupID == ForumContext.CurrentGroup.GroupID))
                    {
                        ForumContext.DisplayOnlyMe(this);
                        ForumContext.StopViewerLoading = true;
                    }
                }
            }
        }
    }


    /// <summary>
    /// Gets or sets the community group id.
    /// </summary>
    public override int CommunityGroupID
    {
        get
        {
            return base.CommunityGroupID;
        }
        set
        {
            base.CommunityGroupID = value;
            ForumContext.CommunityGroupID = value;
        }
    }


    /// <summary>
    /// Gets or sets current group name.
    /// </summary>
    public string GroupName
    {
        get
        {
            return mGroupName;
        }
        set
        {
            ForumGroupInfo fgi = ForumGroupInfoProvider.GetForumGroupInfo(value, SiteID, CommunityGroupID);
            if (fgi != null)
            {
                GroupID = fgi.GroupID;
            }
            mGroupName = value;
        }
    }


    /// <summary>
    /// Gets or sets current forum name.
    /// </summary>
    public string ForumName
    {
        get
        {
            return mForumName;
        }
        set
        {
            ForumInfo fi = ForumInfoProvider.GetForumInfo(value, SiteID, CommunityGroupID);
            if (fi != null)
            {
                ForumID = fi.ForumID;
            }

            if ((!String.IsNullOrEmpty(value)) && (value == "adhocforumgroup" || value == "ad_hoc_forum"))
            {
                IsAdHocForum = true;
                fi = ForumInfoProvider.GetForumInfoByDocument(DocumentContext.CurrentDocument.DocumentID);
                if (fi != null)
                {
                    ForumID = fi.ForumID;
                }
                else
                {
                    ForumID = -1;
                }
            }
            startingMode = 1;
            mForumName = value;
        }
    }

    #endregion


    #region "Methods"

    /// <summary>
    /// Check permissions.
    /// </summary>
    /// <param name="state">Current state</param>
    public ForumStateEnum CheckPermissions(ForumStateEnum state)
    {
        // Return original state for selected types
        if ((state == ForumStateEnum.Forums) || (state == ForumStateEnum.Unknown) || (state == ForumStateEnum.Search))
        {
            return state;
        }

        // If forum doesn't exist display default
        if (ForumContext.CurrentForum == null)
        {
            return ForumStateEnum.Forums;
        }

        // If forum is closed => hide
        if ((!IsAdHocForum) && (!ForumContext.CurrentForum.ForumOpen))
        {
            return ForumStateEnum.Forums;
        }

        // Sets threads state for every action if forum is locked
        if (ForumContext.CurrentForum.ForumIsLocked)
        {
            switch (state)
            {
                case ForumStateEnum.NewSubscription:
                case ForumStateEnum.NewThread:
                case ForumStateEnum.ReplyToPost:
                case ForumStateEnum.SubscribeToPost:
                    return ForumStateEnum.Threads;
                // Allow attachment view for forum moderators
                case ForumStateEnum.Attachments:
                    if (ForumContext.UserIsModerator(ForumContext.CurrentForum.ForumID, CommunityGroupID))
                    {
                        return state;
                    }
                    return ForumStateEnum.Threads;
            }
        }

        // If user is global admin, forum admin, community admin or moderator
        if (ForumContext.UserIsModerator(ForumContext.CurrentForum.ForumID, CommunityGroupID))
        {
            return state;
        }

        // Sets thread state for locked post 
        if ((ForumContext.CurrentThread != null) && (ForumContext.CurrentThread.PostIsLocked))
        {
            if (!ForumContext.UserIsModerator(ForumContext.CurrentForum.ForumID, CommunityGroupID))
            {
                switch (state)
                {
                    case ForumStateEnum.NewSubscription:
                    case ForumStateEnum.SubscribeToPost:
                    case ForumStateEnum.NewThread:
                    case ForumStateEnum.ReplyToPost:
                    case ForumStateEnum.Attachments:
                        return ForumStateEnum.Thread;
                }
            }
        }

        bool hasPermissions = true;

        // Check permissions for action
        switch (state)
        {
            case ForumStateEnum.ReplyToPost:
                hasPermissions = CheckPermission("Reply", ForumContext.CurrentForum.AllowReply, ForumContext.CurrentForum.ForumGroupID, ForumContext.CurrentForum.ForumID);
                break;
            case ForumStateEnum.NewThread:
                hasPermissions = CheckPermission("Post", ForumContext.CurrentForum.AllowPost, ForumContext.CurrentForum.ForumGroupID, ForumContext.CurrentForum.ForumID);
                break;
            case ForumStateEnum.Attachments:
                hasPermissions = CheckPermission("AttachFiles", ForumContext.CurrentForum.AllowAttachFiles, ForumContext.CurrentForum.ForumGroupID, ForumContext.CurrentForum.ForumID);
                break;
            case ForumStateEnum.TopicMove:
                hasPermissions = ForumContext.UserIsModerator(ForumContext.CurrentForum.ForumID, CommunityGroupID);
                break;
            case ForumStateEnum.SubscribeToPost:
            case ForumStateEnum.NewSubscription:
                hasPermissions = CheckPermission("Subscribe", ForumContext.CurrentForum.AllowSubscribe, ForumContext.CurrentForum.ForumGroupID, ForumContext.CurrentForum.ForumID) && EnableSubscription;
                break;
            case ForumStateEnum.EditPost:
                hasPermissions = ForumContext.UserIsModerator(ForumContext.CurrentForum.ForumID, CommunityGroupID) || (ForumContext.CurrentForum.ForumAuthorEdit && (ForumContext.CurrentPost != null && !MembershipContext.AuthenticatedUser.IsPublic() && (ForumContext.CurrentPost.PostUserID == MembershipContext.AuthenticatedUser.UserID)));
                break;
        }

        // Check ForumAccess permission
        if (ForumContext.CurrentForum != null)
        {
            hasPermissions = hasPermissions && CheckPermission("AccessToForum", ForumContext.CurrentForum.AllowAccess, ForumContext.CurrentForum.ForumGroupID, ForumContext.CurrentForum.ForumID);
        }

        // Check whether user has permissions for selected state
        if (!hasPermissions)
        {
            // Check whether public user should be redirected to logon page
            if (RedirectUnauthorized && MembershipContext.AuthenticatedUser.IsPublic())
            {
                URLHelper.Redirect(URLHelper.AddParameterToUrl(ResolveUrl(LogonPageURL), "returnurl", HttpUtility.UrlEncode(RequestContext.CurrentURL)));
            }
            else if (!String.IsNullOrEmpty(AccessDeniedPageURL))
            {
                URLHelper.Redirect(URLHelper.AddParameterToUrl(ResolveUrl(AccessDeniedPageURL), "returnurl", HttpUtility.UrlEncode(RequestContext.CurrentURL)));
            }
            // Sets state with dependence on current settings
            else
            {
                if (startingMode == 0)
                {
                    return ForumStateEnum.Forums;
                }
                else
                {
                    return ForumStateEnum.AccessDenied;
                }
            }
        }

        return state;
    }


    /// <summary>
    /// OnInit - handle single display request.
    /// </summary>
    /// <param name="e">Event args</param>
    protected override void OnInit(EventArgs e)
    {
        // Add current viewer to the viewers collection
        ForumContext.ForumViewers.Add(this);
        base.OnInit(e);
    }


    /// <summary>
    /// Page_Load - Set properties for current control.
    /// </summary>
    protected void Page_Load(object sender, EventArgs e)
    {
        try
        {
            // Check stop processing
            if (StopProcessing)
            {
                return;
            }

            EnsureUnsubscription();

            if (!SearchResult)
            {
                ForumContext.GroupID = GroupID;
                ForumContext.ForumID = ForumID;
                ForumContext.CommunityGroupID = CommunityGroupID;
            }

            // If search result control, check whether search is performed
            if (SearchResult && (ForumContext.CurrentState != ForumStateEnum.Search))
            {
                return;
            }

            // Get current state
            currentState = CheckPermissions(ForumContext.CurrentState);

            if (currentState != ForumStateEnum.Search)
            {
                // Group
                if (startingMode == 0)
                {
                    // Check whether forum is defined
                    if ((ForumContext.CurrentForum != null) && (currentState != ForumStateEnum.Forums))
                    {
                        // For nested level call request to single display
                        if ((ForumContext.CurrentGroup != null) && (ForumContext.CurrentForum.ForumGroupID == ForumContext.CurrentGroup.GroupID))
                        {
                            ForumContext.DisplayOnlyMe(this);
                        }
                        else
                        {
                            // Hide current forum because ids not match
                            return;
                        }
                    }
                }
                // Forum
                else if (startingMode == 1)
                {
                    // Hide all others forums
                    ForumContext.DisplayOnlyMe(this);
                }
                else
                {
                    // Hide forum because none of mandatory property was set
                    return;
                }
            }


            // Display correspondent control with dependence on current mode
            switch (currentState)
            {
                // Threads
                case ForumStateEnum.Threads:
                    ctrl = this.LoadUserControl(defaultPath + ForumLayout + "/Threads.ascx");
                    ctrl.ID = ControlsHelper.GetUniqueID(plcForum, "threadsElem", ctrl);
                    break;

                // Thread
                case ForumStateEnum.Thread:
                    // Log thread views
                    if ((ForumContext.CurrentThread != null) && (!QueryHelper.Contains("tpage")))
                    {
                        ThreadViewCounter.LogThreadView(ForumContext.CurrentThread.PostId);
                    }
                    ctrl = this.LoadUserControl(defaultPath + ForumLayout + "/Thread.ascx");
                    ctrl.ID = ControlsHelper.GetUniqueID(plcForum, "threadElem", ctrl);
                    break;

                // New post, reply or edit post
                case ForumStateEnum.NewThread:
                case ForumStateEnum.ReplyToPost:
                case ForumStateEnum.EditPost:
                    ctrl = this.LoadUserControl(defaultPath + ForumLayout + "/ThreadEdit.ascx");
                    ctrl.ID = ControlsHelper.GetUniqueID(plcForum, "editElem", ctrl);
                    break;

                // Subscription to forum or subscription to post
                case ForumStateEnum.NewSubscription:
                case ForumStateEnum.SubscribeToPost:
                    ctrl = this.LoadUserControl(defaultPath + ForumLayout + "/SubscriptionEdit.ascx");
                    ctrl.ID = ControlsHelper.GetUniqueID(plcForum, "subscriptionElem", ctrl);
                    break;

                // Forums
                case ForumStateEnum.Forums:
                    ctrl = this.LoadUserControl(defaultPath + ForumLayout + "/Forums.ascx");
                    ctrl.ID = ControlsHelper.GetUniqueID(plcForum, "forumsElem", ctrl);
                    break;

                case ForumStateEnum.Attachments:
                    ctrl = this.LoadUserControl(defaultPath + ForumLayout + "/Attachments.ascx");
                    ctrl.ID = ControlsHelper.GetUniqueID(plcForum, "attachmentElem", ctrl);
                    break;

                case ForumStateEnum.Search:
                    if (SearchResult)
                    {
                        ctrl = this.LoadUserControl(defaultPath + ForumLayout + "/SearchResults.ascx");
                        ctrl.ID = ControlsHelper.GetUniqueID(plcForum, "searchElem", ctrl);
                    }
                    else
                    {
                        return;
                    }
                    break;

                case ForumStateEnum.AccessDenied:
                    Visible = false;
                    return;

                // Unknown
                case ForumStateEnum.Unknown:
                    if (!SearchResult)
                    {
                        throw new Exception("[Forum divider]: Unknown forum state.");
                    }
                    return;
            }

            // Clear controls collection
            plcForum.Controls.Clear();

            // Add loaded control to the control collection
            plcForum.Controls.Add(ctrl);


            // Get forum viewer control
            ForumViewer frmv = ctrl as ForumViewer;

            // If control exists set forum properties
            if (frmv != null)
            {
                CopyValues(frmv);
            }
        }
        catch (Exception ex)
        {
            ShowError(ex.Message);
        }
    }


    /// <summary>
    /// Redirect to the unsubscription page if current url contains valid unbscription information.
    /// </summary>
    protected void EnsureUnsubscription()
    {
        Guid unsubGuid = QueryHelper.GetGuid("forumsubguid", Guid.Empty);
        if (unsubGuid != Guid.Empty)
        {
            int forumId = QueryHelper.GetInteger("forumid", 0);
            if (forumId > 0)
            {
                ForumSubscriptionInfo fsi = ForumSubscriptionInfoProvider.GetForumSubscriptionInfo(unsubGuid);
                if (fsi != null)
                {
                    ForumInfo fi = ForumInfoProvider.GetForumInfo(forumId);
                    if ((fi != null) && (fsi.SubscriptionForumID == fi.ForumID))
                    {
                        URLHelper.Redirect("~/CMSModules/Forums/CMSPages/unsubscribe.aspx?forumsubguid=" + unsubGuid.ToString());
                    }
                }
            }
        }
    }

    #endregion
}