Problema con Edit Online en CIFS con Alfresco (y solución)

En Alfresco se puede producir un problema si se activa CIFS y la edición en línea para crear y modificar documentos en MS-Office.

Problema:
Cuando se crea o modifica un documento en Word/Excel, Alfresco asigna el aspecto «ownable» con el valor de «owner» a null. Esto provoca que si dentro del espacio de trabajo, el usuario que lo ha creado o modificado tiene el rol «Editor», no se puede borrar (no aparece el icono de la papelera ni se puede invocar a la acción de borrar).

Investigando un poco vemos que efectivamente al documento creado desde Word en la carpeta compartida de CIFS que controla Alfresco se le asigna el aspecto con el valor «owner» a null.

Este efecto puede observarse mejor en el explorador de nodos.

Entorno:
– Alfresco ECM 3.3.5
– RedHat 5
– MySQL 5
– Autenticación: Kerberos+SSO (Active Directory)

Solución:
He creado dos soluciones con scripts en JavaScript. Una de ellas lo que hace es eliminar el aspecto directamente y la segunda lo que hace es asignar el valor del campo «creator» al campo «owner» del aspecto «ownable».

Ambas soluciones son válidas y solo hay que elegir la que mejor venga en cada ocasión. En mi caso, la primera es quizás más acorde con el funcionamiento normal del Alfresco, ya que al subir un nuevo documento, este no asigna nunca el aspecto «ownable».

Implementación:
Tanto una como otra solución consisten en scripts en JavaScript que tienen que ser llamados por ejemplo desde una regla asignada al espacio donde se crean los documentos directamente en Word vía unidad compartida con CIFS. Deben crearse dos reglas, una para los nuevos documentos y otra para cuando sean modificados.

Scripts:
Fichero: removeAspect_ownable.js

// Elimina aspecto owneable (problema en edit-online con office – 1a solución)
if (document.properties[«cm:owner»] == null)
{
    logger.log(«Eliminando owner vacío para el documento «+document.properties[«name»]);
    document.removeAspect(«cm:ownable»);
}

Fichero: creatorToOwner.js

// Asigna como owner el creator (problema en edit-online con office – 2a solución)
if (document.properties[«cm:owner»] == null)
{
    logger.log(«Asignando «+document.properties[«cm:creator»]+» al owner vacío para el documento «+document.properties[«cm:name»]);
    document.properties[«cm:owner»] = document.properties[«cm:creator»];
    document.save();
}

De esta forma, queda solucionado este problema hasta que sea solucionado por parte de Alfresco en siguientes versiones.

Más información:
JavaScript API para Alfresco: http://wiki.alfresco.com/wiki/JavaScript_API
Reglas y acciones en Alfresco: http://wiki.alfresco.com/wiki/Actions_and_Rules
Crear reglas y acciones (en Share): http://www.youtube.com/watch?v=1NL8a-6dU7Y

10 respuestas en “Problema con Edit Online en CIFS con Alfresco (y solución)”

  1. Bueno, una forma de ejecutar un script o partes de este por un usuario normal es utilizando una clase Java que haga una operación similar al «sudo» de linux de forma que puedas ejecutar lo que quieras dentro de esta. La clase sería así:

    package ejemplo.jscript;

    import org.alfresco.repo.jscript.BaseScopableProcessorExtension;
    import org.alfresco.repo.security.authentication.AuthenticationUtil;
    import org.alfresco.repo.security.authentication.AuthenticationUtil.RunAsWork;
    import org.mozilla.javascript.Context;
    import org.mozilla.javascript.Function;
    import org.mozilla.javascript.Scriptable;

    public class SudoJScript extends BaseScopableProcessorExtension {

    public void sudo(final Function func) {
    final Context cx = Context.getCurrentContext();
    final Scriptable scope = getScope();

    RunAsWork<_quitar_object> raw = new RunAsWork<_quitar_object>() {
    public Object doWork() throws Exception {
    func.call(cx, scope, scope, new Object[] {});
    return null;
    }
    };

    AuthenticationUtil.runAs(raw, AuthenticationUtil.getAdminUserName());
    }
    }

    Una vez compilada puedes llamarla desde cualquier JavaScript, por ejemplo para este caso:

    var fsudo = function ()
    {
    // Elimina aspecto owneable (problema en edit-online con office – 1a solución)
    if (document.properties[«cm:owner»] == null)
    {
    logger.log(«Eliminando owner vacío para el documento «+document.properties[«name»]);
    document.removeAspect(«cm:ownable»);
    }
    };
    sudojscript.sudo(fsudo);

    En concreto esto último no lo he comprobado pero creo que funcionaría perfectamente para el primer caso de lo explicado en el artículo.

  2. Efectivamente, solo tienes que crear el fichero terminado en -context.xml y añadir:
    _MENOR_QUE_?xml version='1.0' encoding='UTF-8'?_MAYOR_QUE_
    _MENOR_QUE_!DOCTYPE beans PUBLIC '-//SPRING//DTD BEAN//EN' 'http://www.springframework.org/dtd/spring-beans.dtd'_MAYOR_QUE_

    _MENOR_QUE_beans_MAYOR_QUE_
    _MENOR_QUE_bean id=»SudoJScript» parent=»baseJavaScriptExtension» class=»ejemplo.jscript.SudoJScript»_MAYOR_QUE_
    _MENOR_QUE_property name=»extensionName»_MAYOR_QUE_
    _MENOR_QUE_value_MAYOR_QUE_sudojscript_MENOR_QUE_/value_MAYOR_QUE_
    _MENOR_QUE_/property_MAYOR_QUE_
    _MENOR_QUE_/bean_MAYOR_QUE_
    _MENOR_QUE_/beans_MAYOR_QUE_

    Cambiando _MENOR_QUE_ por < y _MAYOR_QUE_ por >

  3. Hola nuevamente

    muchas gracias por tomarte el tiempo de escribirlo

    Una ultima pregunta, donde debo de poner el sudojscript.java, en intentado, creando el directorio ejemplo/jscript dentro de
    C:Alfrescotomcatsharedclasses
    pero en alfresco.log sale lo siguiente

    java.lang.ClassNotFoundException: ejemplo.jscript.SudoJScript

    No se que mas puedo hacer, no encuentro ningún lugar donde digan la ubicación de un archivo .java,(este debe de ir dentro de un jar?) estoy por rendirme e intentarlo con un workflow avanzado, por que aun sigo dudando que en realidad funcione ya a mi parecer, Alfresco con el solo hecho de saber que un usuario no admin lo va a ejecuta, para y dice:
    «Acceso denegado. Usted carece de los permisos adecuados para realizar esta operación.)»

  4. Muchas gracias Frenando ya tengo una mejor idea sobre extender Alfresco(aun no logro hacerlo funcionar, pero ya esta mucho mas claro, sera cosa de poder dedicarle mas tiempo para ver que estoy haciendo mal, creo que el «-context.xml» va dentro del .jar, ya que si esta fuera de este, Alfresco cuando inicia da error 404), su blog ha sido de mucha ayuda.

    El señor antoniosoler propuso utilizar unas lineas en el web-cliente-config-custom.xml para permitir a los usuarios usar los javascript, pero tampoco funciono https://forums.alfresco.com/es/forum/desarrollo/extender-o-cambiar-alfresco/el-lado-maligno-de-alfresco-javascript-07022013-2157

Responder a Jefer Cancelar la respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *