Wednesday, November 5, 2014

Breaking Item level Permission on ItemAdded and Add a Specific Group (Permission) for item

Here is the code for breaking permission for an item, whenever Items get added. And you can also add any group or permission as per your need. It can be very useful at times :

using System;
using System.Security.Permissions;
using Microsoft.SharePoint;
using Microsoft.SharePoint.Security;
using Microsoft.SharePoint.Utilities;
using Microsoft.SharePoint.Workflow;

namespace DemoByKrishna.BreakItemLevelPermisiion
{
    /// <summary>
    /// List Item Events
    /// </summary>
    public class DocReadAccessEventReceiver : SPItemEventReceiver
    {
        /// <summary>
        /// An item was added.
        /// </summary>
        public override void ItemAdded(SPItemEventProperties properties)
        {
            this.EventFiringEnabled = false;
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                try
                {
                    using (SPSite site = new SPSite(properties.SiteId))
                    {
                        using (SPWeb web = site.OpenWeb(properties.RelativeWebUrl))
                        {
                            //SPList list = properties.List;
                            //SPListItem item = properties.ListItem;
                            SPListItem item = web.Lists[properties.ListId].GetItemById(properties.ListItem.ID);


                            web.AllowUnsafeUpdates = true;

                            item.BreakRoleInheritance(false);
                            string Group = "Viewers";
                            SPPrincipal cxosGroupUserGroup = FindUserOrSiteGroup(site, Group);
                            SPRoleDefinitionCollection GroupRole = web.RoleDefinitions;
                            SPRoleAssignment GroupRoleAssign = new SPRoleAssignment(cxosGroupUserGroup); 
                            cxosGroupRoleAssign.RoleDefinitionBindings.Add(cxosGroupRole["Read"]);
                            item.RoleAssignments.Add(GroupRoleAssign);

                            item.Update();
                        }
                    }
                }
                catch (Exception ex)
                {
                    properties.Status = SPEventReceiverStatus.CancelWithError;
                    properties.ErrorMessage = ex.Message;
                    properties.Cancel = true;
                }
            });
            this.EventFiringEnabled = true;

        }

        private static SPPrincipal FindUserOrSiteGroup(SPSite site, string userOrGroup)
        {
            SPPrincipal myUser = null;


            if (SPUtility.IsLoginValid(site, userOrGroup))
            {
                myUser = site.RootWeb.EnsureUser(userOrGroup);
            }
            else
            {
                foreach (SPGroup g in site.RootWeb.SiteGroups)
                {
                    if (g.Name.ToUpper(System.Globalization.CultureInfo.InvariantCulture) == userOrGroup.ToUpper(System.Globalization.CultureInfo.InvariantCulture))
                    {
                        myUser = g;
                        break;
                    }
                }
            }
            return myUser;


        }

    }
}