Magento 1.5.0.0 (shame on all of us)

En medio del Magento Imagine se hizo pública la versión 1.5.0.0 de Magento.

Ya se sabía que no habría grandes novedades entre lo que se vio desde la segunda versión alpha. El único cambio significativo fue la inclusión de MagentoConnect Manager 2.

El resumen de mejoras quedó de la siguiente forma:

  • Mejoras en el importador y exportador de Productos y Clientes.
  • Actualización de Zend Framework a la 1.11.1.
  • Inclusión de la extensión Mobile como funcionalidad por defecto.
  • Gestión de los estados de la Orden.
  • Posibilidad de configurar el almacenamiento para el contenido de media.
  • Se agrega Payflow Link como opción de pago.
  • Manejo del Carrito a través de la API.
  • Se agrega el módulo PageCache.
  • Inclusión de MagentoConnect Manager 2.
  • Mejoras al módulo Wishlist.
  • Mejoras al Carrito, soportando ahora la edición de configuraciones de productos.

Hasta acá todo muy lindo, pero con gusto a poco para mi gusto.

Lo que destaca realmente a ésta versión y a su lanzamiento, fue el problema de seguridad originado por la inclusión de un archivo llamado get.php en la raíz de la plataforma.

Dicho archivo permite obtener el contenido de cualquier archivo de la plataforma. Por ejemplo, si usáramos la url http://www.dominio.com/get.php/app/etc/local.xml, obtendríamos algo como esto.

<config>
    <global>
        <install>
            <date>Tue, 15 Feb 2011 19:12:14 +0000</date>
        </install>
        <crypt>
            <key>a3a94d4d2bdffaba9b0a9ef9942a6760</key>
        </crypt>
        <disable_local_modules>false</disable_local_modules>
        <resources>
            <db>
                <table_prefix></table_prefix>
            </db>
            <default_setup>
                <connection>
                    <host>localhost</host>
                    <username>user</username>
                    <password>password</password>
                    <dbname>database</dbname>
                    <active>1</active>
                </connection>
            </default_setup>
        </resources>
        <session_save>files</session_save>
    </global>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <frontName>admin</frontName>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

O, sabiendo qué clases tenemos disponibles, probando con ésta otra http://www.dominio.com/get.php/app/code/core/Mage/Admin/Model/Acl.php, se puede ver la clase completa.

class Mage_Admin_Model_Acl extends Zend_Acl
{
    /**
     * All the group roles are prepended by G
     *
     */
    const ROLE_TYPE_GROUP = 'G';
 
    /**
     * All the user roles are prepended by U
     *
     */
    const ROLE_TYPE_USER = 'U';
 
    /**
     * Permission level to deny access
     *
     */
    const RULE_PERM_DENY = 0;
 
    /**
     * Permission level to inheric access from parent role
     *
     */
    const RULE_PERM_INHERIT = 1;
 
    /**
     * Permission level to allow access
     *
     */
    const RULE_PERM_ALLOW = 2;
 
    /**
     * Get role registry object or create one
     *
     * @return Mage_Admin_Model_Acl_Role_Registry
     */
    protected function _getRoleRegistry()
    {
        if (null === $this->_roleRegistry) {
            $this->_roleRegistry = Mage::getModel('admin/acl_role_registry');
        }
        return $this->_roleRegistry;
    }
 
    /**
     * Add parent to role object
     *
     * @param Zend_Acl_Role $role
     * @param Zend_Acl_Role $parent
     * @return Mage_Admin_Model_Acl
     */
    public function addRoleParent($role, $parent)
    {
        $this->_getRoleRegistry()->addParent($role, $parent);
        return $this;
    }
}

Semejante error podría tener consecuencias bastante serias si esto se combinara con otros elementos poco fortuitos. No deja de ser, bajo ningún punto de vista, una demostración de cómo se lleva adelante el desarrollo de la plataforma.

Como decía al principio, el lanzamiento se hizo en medio del evento, y parecería tener sentido la urgencia por publicar la versión. Lo que no es entendible es semejante… ¿falta de respeto?.

Ahora bien, hay un detalle no menor. El famoso archivo get.php, está presente desde la versión alpha 1. La pregunta obligada es: ¿absolutamente nadie lo vio?. ¿Dónde estaba la gente de Testing?. Peor aún, ¿dónde estábamos, nosotros, la comunidad, que lo dejamos pasar?.

Con esto último no quiero decir que comparta el post oficial sobre la preocupación por la seguridad en Magento. Si hay algo que hace tiempo se ve es que la comunidad (pensando en la comunidad real, y no en la que paga para figurar en una lista) no está en los primeros puestos de las prioridades. Además, si el desarrollo lo maneja la empresa, lo que se incluya o excluya del proyecto, es mérito exclusivo de la misma.

Este papelón, trajo como efecto inmediato dos cuestiones. El primero, la publicación del nuevo release, que trajo consigo algunos cambios más. La segunda consecuencia, fue la nueva invitación a convertirse en un Contribuidor de Magento. (Otro tema que genera sensaciones encontradas)

Volviendo al fallado release en cuestión, en ésta oportunidad no vamos a contar con el changelog específico, ya que se mergeó éste con el de la versión siguiente.

Espero que sirva lo sucedido de ejemplo para que bajo ningún punto de vista sigan actualizando las tiendas productivas al último release sin antes haberle dedicado el tiempo pertinente en entornos de testing.