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 replies on “Problema con Edit Online en CIFS con Alfresco (y solución)”

  1. Jefer dice:

    Hola, muchas gracias por la información, pero esto solo funciona si la persona que hace que se ejecute el javascript es administrador, como se puede hacer para que lo ejecute un usuario coordinador u otro?

    Gracias

  2. 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.

  3. En el código anterior tienes que quitar _QUITAR_ para que funcione, lo he puesto para que el editor de comentario me dejara poner el código fuente.

  4. Jefer dice:

    Muchas gracias Fernando, empezare a consultar como implementar esa clase java en alfresco, nunca lo había hecho. supongo que tendré que crear un bean?

  5. 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 >

  6. Jefer dice:

    Hola nuevamente

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

    java.lang.ClassNotFoundException: ejemplo.jscript.SudoJScript

  7. Jefer dice:

    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.)”

  8. Jefer dice:

    Disculpa mi ignorancia,creo que debo compilar el .java y generar el .jar?
    y ponerlo el libs?

  9. Exacto Jefer, tendrás que compilar la clase. Lo mejor es compilarla, crear el JAR y ponerla en tomcat/webapps/alfresco/WEB-INF/lib aunque también puedes crearte un paquete de instalación AMP.

  10. Jefer dice:

    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

Deja un comentario

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