cancel
Showing results for 
Search instead for 
Did you mean: 

Eliminar permisos y herencia de espacios

nemrp
Champ in-the-making
Champ in-the-making
Buenas.

Aquí estoy de nuevo para hacer un aporte. Es pequeñito, pero bueno, quizás pueda servirle a alguien. Hay que tener en cuenta que tan sólo lo he probado en Alfresco 3.4, por lo que me pasaré por aquí cuando lo haya probado en un Alfresco 2.2, que es mi verdadera intención con este script.

El código está comentado, pero si hay alguna duda con respecto a alguna línea ya sabéis :wink:. Lo que sí me gustaría es que me indicáseis aquello que viérais que se puede mejorar o que esté incorrecto.


/* ******************************************************************************************************** */
/* Script que permite el borrado de permisos establecidos en los subespacios a partir del espacio donde    */
/* se ejecute.                                                      */
/*                                                            */
/* Una vez finalizado genera un archivo de log, en el mismo espacio donde se ejecute, que mostrara todas   */
/* las incidencias surgidas en el proceso.                                       */
/*                                                            */
/* Las constantes "group" y "permission" determinan a que grupo o usuario se quiere eliminar el permiso.   */
/* Por otro lado, la constante "spaceDestinity" indica el espacio padre a partir del cual se comenzara a   */
/* ejecutar el script (excluyendolo a el).                                       */
/*                                                            */
/* Ademas elimina la herencia de permisos en dichos subespacios (linea 62).                  */
/* ******************************************************************************************************** */

/* Constantes */
var spaceDestinity = space; // Espacio destino. Aquel donde se va almacenar el log y a partir del cual se van a borrar los permisos.
var state = "ALLOWED"; // Estado del permiso. "ALLOWED" indica que el estado del permiso es "permitido" o esta "activado".
var group = "GROUP_EVERYONE"; // Grupo o usuario. Indica el grupo o usuario al que se le quiere quitar el permiso.
var permission = "Consumer"; // Permiso. Indica el permiso que se quiere quitar.
var date = new Date(); // Objeto fecha que permitira crear el archivo de log unico.

/* Adaptacion del objeto fecha al formato espanol */
var month = date.getMonth() + 1;
if (month > 0 && month < 10) {
month = "0" + month;
}

var day = date.getDate() + 1;
if (day > 0 && day < 10) {
day = "0" + day;
}

/* Creacion del archivo de log en el espacio destino */
var logFileName = "permissions_deleted_" + date.getFullYear() + month + day + date.getHours() + date.getMinutes() + date.getSeconds() + ".txt";
var logFile = spaceDestinity.childByNamePath(logFileName);
var log = "";

if (logFile == null) {
   logFile = spaceDestinity.createFile(logFileName);
}

/* Llamada a la funcion */
deletePermissions();

/* Funcion */
function deletePermissions() {
   // Se obtiene la lista de nodos (espacios y contenidos) hijos.
   var childrenList = spaceDestinity.children;
   
   log = "************** PERMISSIONS DELETED **************\n\n";
   log += "Permissions to delete:\n";
   log += "\tState: " + state + " | " + "Group: " + group + " | " + "Permission: " + permission + "\n\n";
   
    for (var i = 0; i < childrenList.length; i++) {
      // Se obtiene el primer nodo (espacio o contenido).
      nodeVar = childrenList[i];
      
      if (nodeVar.isContainer) {
         log += nodeVar.name + ":\n";
         
         if (nodeVar.hasPermission("ChangePermissions")) {
            // Se deshabilita la herencia de permisos al nodo (espacio o contenido).
            nodeVar.setInheritsPermissions(false);
            
            // Se obtienen los permisos del nodo (espacio o contenido).
            var permissions = nodeVar.permissions;
            var result=[];
            
            // Se itera por los permisos identificando aquellos que se quieren eliminar.
            for (var j = 0; j < permissions.length; j++) {
               var result = permissions[j].split(";");
               var resultState = result[0];
               var resultGroup = result[1];
               var resultPermission = result[2];
               
               if (resultState == state && resultGroup == group && resultPermission == permission) {
                  // Dependiendo de la version utilizada el prototipo del metodo cambia. Asi, el
                  // prototipo para una 3.x es como se muestra a continuacion, mientras que para
                  // un version 2.x es la que aparece una linea mas abajo.
                  //nodeVar.removePermission(group, permission);
                  nodeVar.removePermission(permission, group);
                  log += "\tState: " + resultState + " | " + "Group: " + resultGroup + " | " + "Permission: " + resultPermission;
                  log += "\t—>\tPermission deleted.\n";
               } else {
                  log += "\tState: " + resultState + " | " + "Group: " + resultGroup + " | " + "Permission: " + resultPermission;
                  log += "\t—>\tPermission not deleted.\n";
               }
            }
         } else {
            log += "\tHis role does not allow you to change the permissions of this space.\n\n";
         }

                        // Se hacen perisistentes los cambios. Esta llamada es valida para versiones 2.x, siendo
         // opcional para versiones 3.x.
         nodeVar.save();
      }
   }
}

/* Insercion del texto de log */
log += "**************** END OF DELETION ****************";
logFile.content += log;
logFile.save();
logFile.content

Saludos.

PD: Edito el post para que el código contemple los cambios comentados en posts sucesivos.
7 REPLIES 7

cristinamr
World-Class Innovator
World-Class Innovator
Una cosa… No veo por ningún lado que realices un .save sobre el log, lo mismo con los nodos que tratas cuando mofidicas el permiso. Ten cuidado porque la 2.x ers muy tiquismiquis para todas estas cosas (las pasé horrible haciendo un scrip para la 2.1.7 en su época).

Lo del log deberías poner debajo de la llamada al delete, algo como por ejemplo:

//Salvamos el log para guardar
logFile.content += "FIN Log \r\n\r\n";
logFile.content = salida+"\r\n\r\n";
logFile.save();
logFile.content;

Ten cuidadín, si falla ten ambas cosas en cuenta Smiley Wink

Un saludoooo!
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc

nemrp
Champ in-the-making
Champ in-the-making
Una cosa… No veo por ningún lado que realices un .save sobre el log, lo mismo con los nodos que tratas cuando mofidicas el permiso. Ten cuidado porque la 2.x ers muy tiquismiquis para todas estas cosas (las pasé horrible haciendo un scrip para la 2.1.7 en su época).

¿Cómo se realiza un "save" de los nodos tras tratarlos?

Lo del log deberías poner debajo de la llamada al delete

¿Te refieres a justo después de la llamada a la función o bien cuando ésta finalice?. Es decir,

después de

/* Llamada a la funcion */
deletePermissions();

o después de

/* Insercion del texto de log */
logFile.content += log;

cristinamr
World-Class Innovator
World-Class Innovator
Lo del log, despues de:

/* Insercion del texto de log */
logFile.content += log;

U sea al final del todo 😃

Lo del save, ten en cuenta que es como un commit en BBDD, puedes realizarlos justo después de que se remueva el permiso, o sea, algo así:



nodeVar.removePermission(group, permission);
nodeVar.save();


Smiley Wink
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc

nemrp
Champ in-the-making
Champ in-the-making
Hola de nuevo cristinaMR.

Al pasar este script a una 2.2 estoy teniendo problemas con la llamada a la eliminación del permiso. Concretamente a la línea del código que puse en mi anterior post (con las modificaciones que me sugeristes, claro está :winkSmiley Happy siguiente:

nodeVar.removePermission(group, permission);

Donde "group" es "GROUP_EVERYONE" y "permission" es "Consumer".

El error que me lanza es el siguiente:


Error  Por favor corrija los errores siguientes y haga clic en Finalizar.

    * No se ha podido crear la acción debido a un error: Failed to execute script 'workspace://SpacesStore/e36e3ccd-be92-11e0-910f-bf45e125ba1a': Failed to execute script 'workspace://SpacesStore/e36e3ccd-be92-11e0-910f-bf45e125ba1a': Wrapped java.lang.UnsupportedOperationException: Can not find GROUP_EVERYONE (AlfrescoScript#77)

Donde el recurso "'workspace://SpacesStore/e36e3ccd-be92-11e0-910f-bf45e125ba1a" es el proprio script.

¿Sabes a qué puede deberse?. ¿Quizás para esta versión la llamada a la eliminación de permisos es distinta?.

cristinamr
World-Class Innovator
World-Class Innovator
¡Claro que sé por qué es! Como que en Alfresco 2.2 no existe el grupo EVERYONE!!  De hecho, la gestión de permisos al estar solo el explorador de alfresco no va por grupos (esto apareció con la 3.2 con el Share), solo vas a tener que quitar el permiso consumer, pero no tratarlo como si fuera un grupo.

Si mira la wiki, concretamente el API de la 2.x, tienes esta llamada:

void removePermission(string permission) 
    Remove a permission for ALL users from the node.

Es decir, algo como removePermission("consumer") y eso de cada nodo que le pases te quitará esa asociacion.

Un consejo: Haz una pequeña prueba antes y nos comentas Smiley Wink

Por cierto en la 2.x si que tienes la consola de debugger te lo digo por si te sirve para hacer una traza de lo qu va haciendo tu script.

Un saludo!!
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc

nemrp
Champ in-the-making
Champ in-the-making
Buenos días CristinaMR.

Muchas gracias por tu ayuda. Leyendo la API para la 2.x que me has pasado he visto que también existe el método que permite hacer el borrado a partir del grupo o usuario.

void removePermission(string permission, string authority) 
    Remove a permission for the specified authority (e.g. username or group) from the node.
La diferencia con respecto a las versiones 3.x es que el prototipo cambia, ya que en este caso el primer parámetro de entrada es el permiso y el segundo el grupo o usuario, mientras que para las 3.x es al contrario.

Con este método consigo lo que busco y, además, me aseguro que no me va a borrar permisos de lectura que no sean para el grupo "EVERYONE", en este caso, o cualquier otro en el futuro.

He realizado una prueba y ha funcionado a la perfección. Voy a modificar el código de mi primer mensaje de este hilo para que tenga en cuenta este nuevo descubrimiento Smiley Very Happy

Un saludo y, de nuevo, muchas gracias :wink:.

cristinamr
World-Class Innovator
World-Class Innovator
Pues de arte Smiley Very Happy  Me alegro que finalmente lo consiguieras Smiley Wink

Un saludo y gracias por haberlo compartido!!
--
VenziaIT: helping companies since 2005! Our ECM products: AQuA & Seidoc