miércoles, 28 de enero de 2009

OwnerEventHandler 1.0.0

Recientemente he publicado en codeplex el proyecto “OwnerEventHandler”. Consiste en una solución sharepoint que despliega un eventhandler para controlar las modifiocaciones de los elementos o documentos.

OwnerEventHandler permite que los usuarios tenga permisos de colaborador en las listas o librerías pero solo puedan modificar o editar los documentos de los que son propietarios.

La ventaja de este proyecto es que tiene múltiples utilidades con ciertos cambios en el código. Por ejemplo: podríamos utilizarlo para cambiar los permisos de los elementos, de manera que cada usuario pudiera ver los elementos que haya subido, o incluso podrías hacer que solo los pudieran editar un grupo de usuarios encargados de la supervisión.

El proyecto está compuesto de una solución WSP “OwnerEventReceiver”, que contiene una feature a nivel de sitio “OwnerItemEventReceiver”. El eventHandler está alojado en la librería OwnerEventHandler.dll.

Para registrarlo en una librería o biblioteca podemos utilizar "Event handler explorer”.

El código es bastante sencillo, consiste en un EventHandler que captura el evento ItemAdded para modificar los permisos de manera que todos los miembros excepto el propietario tengan permisos de lectura.

 

public class OwnerEventItemEventReceiver : SPItemEventReceiver
    { 
         public override void ItemAdded(SPItemEventProperties properties)
        {
            try
            {
                SPUser currentUser = properties.ListItem.ParentList.ParentWeb.CurrentUser;

                using (SPWeb webOrigUser = properties.OpenWeb())
                {
                    SPUserToken token = webOrigUser.AllUsers["SHAREPOINT\\system"].UserToken;
                    using (SPSite site = new SPSite(properties.SiteId, token))
                    {
                        using (SPWeb currentWeb = site.OpenWeb(properties.RelativeWebUrl))
                        {

                            try
                            {
                                DisableEventFiring();

                                SPList sourceList = currentWeb.Lists[properties.ListId];
                                SPListItem itemAdded = sourceList.GetItemById(properties.ListItem.ID);
                                if (!itemAdded.HasUniqueRoleAssignments)
                                {
                                    itemAdded.BreakRoleInheritance(true);
                                    itemAdded.ParentList.ParentWeb.Dispose();
                                }

                                SPRoleAssignmentCollection roleAssignmentCollection = itemAdded.RoleAssignments;
                                foreach (SPRoleAssignment roleAssignment in roleAssignmentCollection)
                                {
                                    roleAssignment.RoleDefinitionBindings.RemoveAll();
                                    roleAssignment.RoleDefinitionBindings.Add(currentWeb.RoleDefinitions.GetByType(SPRoleType.Reader));
                                    roleAssignment.Update();
                                }

                                SPRoleDefinition reviserRoleDefinition = currentWeb.RoleDefinitions.GetByType(SPRoleType.Administrator);
                                SPRoleAssignment reviserRolePropietario = new SPRoleAssignment(currentUser);
                                reviserRolePropietario.RoleDefinitionBindings.Add(reviserRoleDefinition);
                                itemAdded.RoleAssignments.Add(reviserRolePropietario);

                                itemAdded.Update();
                            }
                            catch (Exception ex1)
                            {
                                properties.ErrorMessage = ex1.Message;
                                properties.Status = SPEventReceiverStatus.CancelWithError;
                                System.Diagnostics.Trace.Write("Exception OwnerEventHandler.OwnerEventItemEventReceiver.ItemAdded.1: {0}", ex1.Message);
                            }
                            finally
                            {
                                EnableEventFiring();
                            }

                        }
                    }
                }
            }
            catch (Exception ex)
            {
                properties.ErrorMessage = ex.Message;
                properties.Status = SPEventReceiverStatus.CancelWithError;
                System.Diagnostics.Trace.Write("Exception OwnerEventHandler.OwnerEventItemEventReceiver.ItemAdded: {0}", ex.Message);
            }
        }

    }

 

Lo primero que hacemos es obtener el token del usuario system, esto es parecido a ejecutar “SPSecurity.RunWithElevatedPrivileges”.

A continuación abrimos una referencia a la colección y al sitio, hacemos esto en lugar de utilizar el del SPItemEventProperties debido a que las referencias que mantiene el elemento añadido referencian al usuario que añadió el elemento, por lo que a la hora de modificar los permisos puede que no tenga permisos de Adminsitrador.

Después recorremos todas las configuraciones de permisos del elemento añadido y las editamos de manera que los miembros solo puedan leer.

Por último añadimos al usuario propietario el control total sobre el elemento.

No hay comentarios: