using System;
using CMS.CMSHelper;
using CMS.EventLog;
using CMS.FormControls;
using CMS.GlobalHelper;
using CMS.SettingsProvider;
using CMS.SiteProvider;
using CMS.DocumentEngine;
using CMS.UIControls;
using CMS.WorkflowEngine;
public partial class CMSModules_Membership_FormControls_Users_SecurityAddUsers : ReadOnlyFormEngineUserControl
{
#region "Private variables"
private int mNodeID = 0;
private TreeNode mNode = null;
private int mBoardID = 0;
private int mForumID = 0;
private int mGroupID = 0;
private string mCurrentValues = String.Empty;
private TreeProvider mTree = null;
private EventLogProvider mEventLog = null;
#endregion
#region "Public properties"
///
/// Gets or sets node id.
///
public int NodeID
{
get
{
return mNodeID;
}
set
{
// Clear TreeNode on id change
if (mNodeID != value)
{
mNode = null;
}
mNodeID = value;
}
}
///
/// Gets or sets the TreeNode.
///
public TreeNode Node
{
get
{
if ((mNode == null) && (NodeID > 0))
{
// Get node
mNode = Tree.SelectSingleNode(NodeID);
}
return mNode;
}
set
{
mNode = value;
// Update NodeID
if (mNode != null)
{
mNodeID = mNode.NodeID;
}
}
}
///
/// Gets or sets board id.
///
public int BoardID
{
get
{
return mBoardID;
}
set
{
mBoardID = value;
}
}
///
/// Gets or sets forum id.
///
public int ForumID
{
get
{
return mForumID;
}
set
{
mForumID = value;
}
}
///
/// Gets or sets group id.
///
public int GroupID
{
get
{
if (NodeID > 0)
{
return mGroupID;
}
return usUsers.GroupID;
}
set
{
if (NodeID > 0)
{
mGroupID = value;
}
else
{
usUsers.GroupID = value;
}
}
}
///
/// Returns current uniselector.
///
public UniSelector CurrentSelector
{
get
{
return usUsers.UniSelector;
}
}
///
/// Gets or sets subscriber.
///
public string CurrentValues
{
get
{
return mCurrentValues;
}
set
{
mCurrentValues = value;
}
}
///
/// Enables or disables the control.
///
public override bool Enabled
{
get
{
return usUsers.Enabled;
}
set
{
usUsers.Enabled = value;
}
}
///
/// Enables or disables site filter in uni selector.
///
public bool ShowSiteFilter
{
get
{
return usUsers.ShowSiteFilter;
}
set
{
usUsers.ShowSiteFilter = value;
}
}
///
/// Gets or sets ID of the site. Only users of this site are shown in selector.
/// Note. SiteID is not used if site filter is enabled
///
public int SiteID
{
get
{
return usUsers.SiteID;
}
set
{
usUsers.SiteID = value;
}
}
///
/// Indicates if control is used on live site.
///
public override bool IsLiveSite
{
get
{
return base.IsLiveSite;
}
set
{
base.IsLiveSite = value;
usUsers.IsLiveSite = value;
}
}
#endregion
#region "Protected properties"
///
/// Tree provider.
///
protected TreeProvider Tree
{
get
{
return mTree ?? (mTree = new TreeProvider(CMSContext.CurrentUser));
}
}
///
/// Event log provider.
///
protected EventLogProvider EventLog
{
get
{
return mEventLog ?? (mEventLog = new EventLogProvider());
}
}
#endregion
#region "Events"
protected override void OnInit(EventArgs e)
{
base.OnInit(e);
// Add sites filter
usUsers.UniSelector.SetValue("FilterMode", "user");
usUsers.ResourcePrefix = "addusers";
}
protected void Page_Load(object sender, EventArgs e)
{
// Add event handling
usUsers.UniSelector.OnItemsSelected += usUsers_OnItemsSelected;
usUsers.UniSelector.OnSelectionChanged += usUsers_OnItemsSelected;
// Check node permissions
if (Node != null)
{
// Set group filter
if (GroupID > 0)
{
usUsers.UniSelector.FilterControl = "~/CMSFormControls/Filters/SiteGroupFilter.ascx";
usUsers.UniSelector.SetValue("GroupID", GroupID.ToString());
}
// Allow group administrator edit group document permissions on live site
if ((GroupID > 0) && IsLiveSite)
{
if (CMSContext.CurrentUser.IsGroupAdministrator(GroupID))
{
usUsers.Enabled = true;
return;
}
}
if (CMSContext.CurrentUser.IsAuthorizedPerDocument(Node, NodePermissionsEnum.ModifyPermissions) != AuthorizationResultEnum.Allowed)
{
usUsers.Enabled = false;
return;
}
}
// Check message board permission
if (BoardID > 0)
{
GeneralizedInfo boardObj = ModuleCommands.MessageBoardGetMessageBoardInfo(BoardID);
if (boardObj != null)
{
int boardGroupId = ValidationHelper.GetInteger(boardObj.GetValue("BoardGroupID"), 0);
if (boardGroupId > 0)
{
if (!CMSContext.CurrentUser.IsGroupAdministrator(boardGroupId))
{
usUsers.Enabled = false;
return;
}
}
else if (!CMSContext.CurrentUser.IsAuthorizedPerResource("CMS.MessageBoards", "Modify"))
{
usUsers.Enabled = false;
return;
}
}
}
// Check forum permission
if (ForumID > 0)
{
if (GroupID > 0)
{
if (!CMSContext.CurrentUser.IsGroupAdministrator(GroupID))
{
usUsers.Enabled = false;
return;
}
}
else if (!CMSContext.CurrentUser.IsAuthorizedPerResource("cms.forums", CMSAdminControl.PERMISSION_MODIFY))
{
usUsers.Enabled = false;
return;
}
}
}
protected void usUsers_OnItemsSelected(object sender, EventArgs e)
{
AclProvider aclProv = null;
// Create Acl provider to current treenode
if (Node != null)
{
aclProv = new AclProvider(Tree);
}
// Remove old items
string newValues = ValidationHelper.GetString(usUsers.Value, null);
string items = DataHelper.GetNewItemsInList(newValues, CurrentValues);
if (!String.IsNullOrEmpty(items))
{
string[] newItems = items.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
if (newItems != null)
{
// Add all new items to site
foreach (string item in newItems)
{
int userID = ValidationHelper.GetInteger(item, 0);
if (BoardID > 0)
{
// Remove message board from board
ModuleCommands.MessageBoardRemoveModeratorFromBoard(userID, BoardID);
}
else if (Node != null)
{
if (aclProv != null)
{
UserInfo ui = UserInfoProvider.GetUserInfo(userID);
if (ui != null)
{
// Remove user from treenode
aclProv.RemoveUser(NodeID, ui);
}
}
}
else if (ForumID > 0)
{
// Remove user from forum moderators
ModuleCommands.ForumsRemoveForumModerator(userID, ForumID);
}
}
}
}
// Add new items
items = DataHelper.GetNewItemsInList(CurrentValues, newValues);
if (!String.IsNullOrEmpty(items))
{
string[] newItems = items.Split(new char[] { ';' }, StringSplitOptions.RemoveEmptyEntries);
if (newItems != null)
{
// Add all new items to site
foreach (string item in newItems)
{
int userID = ValidationHelper.GetInteger(item, 0);
if (BoardID > 0)
{
// Add user to the message board
ModuleCommands.MessageBoardAddModeratorToBoard(userID, BoardID);
}
else if (Node != null)
{
// Add user to treenode
if (aclProv != null)
{
UserInfo ui = UserInfoProvider.GetUserInfo(userID);
if (ui != null)
{
// Remove user from treenode
aclProv.SetUserPermissions(Node, 0, 0, ui);
}
}
}
else if (ForumID > 0)
{
// Add user to the forum moderators
ModuleCommands.ForumsAddForumModerator(userID, ForumID);
}
}
}
}
// Log synchronization task
if (Node != null)
{
DocumentSynchronizationHelper.LogDocumentChange(Node, TaskTypeEnum.UpdateDocument, Node.TreeProvider);
}
RaiseOnChanged();
}
#endregion
///
/// Reloads the data of the UniSelector.
///
public void ReloadData()
{
usUsers.Value = CurrentValues;
usUsers.ReloadData();
}
}