Y no veas qué bien me ha sentado poder disponer de él.
Hable en una entrada anterior sobre algunos programas que habían desaparecido de Debian tras el paso a la versión 10 y que entre ellos estaba phpldapadmin. Este programa permite administrar servidores LDAP desde un navegador web presentando su contenido de manera organizada y directa. Tan organizada como el propio servidor y el concepto LDAP sea, que ya es, pero para alguien que suele tener que trabajar con estructuras medias pero vitales como yo es de gran valor.
Es una de esas herramientas que empleas cuando empiezas a desesperar por la extrañas sintaxis de consulta y modificación desde consola y que, al final, lo que quieres es entender el lío que suelen suponer estos árboles de datos. Indispensable para la administración de sistemas de guerrilla que suelo tener que hacer.
En la versión 10 de Debian este programa había desaparecido por no haber resistido el cambio del lenguaje PHP a la versión 7. Aún molesto es tan útil que no le dí importancia porque, mira, a las malas siempre se podía instalar desde los fuentes originales, ¿ no ? Pues no.
Uno de esos problemas de cambio de versión es que el programa emplea una función llamada password_hash en una de sus bibliotecas y resulta que, ¡ mira por dónde !, la versión 7 de PHP tiene una versión con nombre y propósito idéntico. Así que, sencillamente, no es posible hacerlo funcionar sin realizar modificaciones en el código del programa. Que es lo que, al final, ha tenido que hacer el desarrollador Debian de turno para poder empaquetarlo en la versión sid.
Es un poco bochornoso el asunto pero es que PHP es así; con la excusa de progresar se saltan ciertas reglas básicas de la programación y te dejan con el culete al aire y, ¡ tachan !, decenas o centenares de programas que funcionaban con tranquilidad progresan ahora hacia el desguace porque a alguien le pareció buena idea el avance. Supongo que habrá más detalles pero este me pareció tan obvio que sentí vergüenza ajena.
El caso es que el mantenedor del paquete Debian, Fabio Tranchitella, ha tenido que modificar el código y parchearlo para que esa función no está duplicada. Y mira, dirán lo que quieran sobre las versiones de los programas en Debian, pero la labor de los mantenedores es impagable. No sólo tienen que entender el programa si no además saber cómo trucarlo para que sea civilizado y se adapte.
Instalación y configuración
Al estar escrito en un lenguaje interpretado es fácil descargar la versión en la rama testing y hacer una instalación vía dpkg directa. Luego, según lo que ya tengas, es posible que necesites arreglar la instalación con apt-get -f install y asegurarte de que php5 está desactivado en el servidor web Apache si es el que usas.
La configuración es la habitual. En el directorio /etc/phpldapadmin existe un archivo llamado config.php en el que se describen las opciones globales para el interfaz web y el comportamiento general y los diferentes servidores que puedes gestionar desde un único punto.
Respecto al servidor Apache también es muy sencillo de configurar. Concretamente añadirle un alias a un directorio fuera de la raíz de los archivos web y algunas directivas concretas:
Alias /ldap /usr/share/phpldapadmin/htdocs
<Directory /usr/share/phpldapadmin/htdocs/>
DirectoryIndex index.php
Options +FollowSymLinks
AllowOverride None
Require all granted
# ... directivas php5 y demás
</Directory>
El programa, como he dicho, permite gestionar todo el árbol LDAP del servidor correspondiente y, salvo alguna modificación concreta, el mayor uso que le doy es el de añadir entradas. Antes de conocer el mecanismo de plantillas que utiliza esta tarea era también inusual por lo costoso que me parecía enfrentarme tan crudamente con la organización de clases y atributos. Cuando la cosa se ponía algo más seria (más de diez usuarios) empleaba alguno de los otros programas que tampoco estaban en Debian Buster como ldap-account-manager.
Pero ahora he entendido cómo escribir plantillas para añadir y modificar entradas LDAP que simplifican tanto el agregado de datos que salvo que necesite que sean cuentas de sistema además de entradas LDAP como permite ldap-account-manager prefiero usar nada más que phpldapadmin.
Plantillas
¿ Para qué sirven las plantillas en un programa como éste ? Pues para facilitar la adición de información o su alteración ? Generalmente cuando tienes la rama del árbol de entradas y quieres añadir una nueva te aparece lo siguiente:
Y aquí es donde la matan. En primer lugar porque si bien es cierto que se pueden añadir manualmente es una mala idea por todas las cosas que pueden fallar. No hay que olvidar que este programa es un interfaz a otro que tiene sus reglas aparte que el primero no puede conocer del todo.
En segundo porque con lo que vemos no es suficiente para saber con seguridad qué clase de objeto vamos a añadir y si va a servirnos. Y de ahí que los creadores de phpldapadmin tengan un directorio con estas plantillas en formato XML bajo la ruta /etc/phpldapadmin/templates. La documentación está más abajo, en las referencias.
La plantilla que yo he creado para el dominio que tengo que mantener es la siguiente:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE template SYSTEM "template.dtd">
<template>
<askcontainer>0</askcontainer>
<description>Usuario de Zeine</description>
<icon>address-book.png</icon>
<invalid>0</invalid>
<rdn>cn</rdn>
<regexp>^ou=users,.*</regexp>
<noleaf>0</noleaf>
<title>Usuario de Zeine</title>
<visible>1</visible>
<objectClasses>
<objectClass id="inetOrgPerson"></objectClass>
</objectClasses>
<attributes>
<!-- Nombre de usuario -->
<attribute id="cn">
<display>Usuario (cn)</display>
<icon>ldap-uid.png</icon>
<onchange>=autoFill(uid;%cn%)</onchange>
<onchange>=autoFill(mail;%uid%\@zeine.es)</onchange>
<page>1</page>
<order>1</order>
</attribute>
<!--
ID de usuario para emplearlo en grupos (autocompletado)
-->
<attribute id="uid">
<display>UID</display>
<onchange>=autoFill(mail;%uid%\@zeine.es)</onchange>
<order>2</order>
</attribute>
<!--
Contraseña con cifrado ssha
-->
<attribute id="userPassword">
<display>Contraseña (userPassword)</display>
<helper>
<display>Tipo de cifrado</display>
<id>enc</id>
<value>=php.PasswordEncryptionTypes()</value>
</helper>
<icon>lock.png</icon>
<page>1</page>
<post>=php.PasswordEncrypt(%enc%;%userPassword%)</post>
<spacer>1</spacer>
<verify>1</verify>
<order>3</order>
</attribute>
<!-- Nombre -->
<attribute id="givenName">
<display>Nombre (givenName)</display>
<icon>ldap-uid.png</icon>
<onchange>=autoFill(displayName;%givenName% %sn%)</onchange>
<page>1</page>
<order>4</order>
</attribute>
<!-- Apellidos (obligatorio según esquema) -->
<attribute id="sn">
<display>Apellidos (sn)</display>
<onchange>=autoFill(displayName;%givenName% %sn%)</onchange>
<page>1</page>
<order>5</order>
</attribute>
<!-- Nombre completo visible -->
<attribute id="displayName">
<display>Nombre visible (displayName)</display>
<page>1</page>
<order>6</order>
</attribute>
<!-- Correo electrónico -->
<attribute id="mail">
<display>Correo electrónico (mail)</display>
<page>1</page>
<order>7</order>
</attribute>
<!-- Teléfono (principalmente móvil) -->
<attribute id="mobile">
<display>Teléfono (mobile)</display>
<page>1</page>
<order>8</order>
</attribute>
<!-- Foto -->
<attribute id="jpegPhoto">
<display>Fotografía (jpegPhoto)</display>
<spacer>1</spacer>
<order>9</order>
</attribute>
</attributes>
</template>
No me voy a extender sobre su contenido porque para eso están las referencias pero sí voy a anotar algunas cosas interesantes:
- La plantilla permite personalizar mucho la información que se presenta respecto a los campos.
- No es un formulario completo, está específicamente creado para el programa y su metodología así que virguerías pocas pero suficientes.
- Permite indicar las clases LDAP que vas a añadir/editar, un filtro (tipo expresión regualr) para que sólo se use en ciertos lugares del árbol y alguna pequeña capacidad para lanzar acciones.
- Estas acciones que pueden definirse son de dos tipos: por Javascript (con el atributo onchange) y por PHP (con el atributo post). Más o menos así, hay alguna excepción pero para eso la documentación.
Ahora respecto al uso unos ejemplos en forma de galería cuando añades una entrada empleando la plantilla mencionada:
La mejor parte para mí siempre ha sido que puedo ver qué va a enviar al servidor LDAP. Que éste lo acepto o no ya es otro cantar pero al menos tienes constancia del origen del posible problema.
[…] la entrada en la que hablaba sobre la recuperación de este programa para mi uso olvidé anotar ciertos detalles que, si bien se […]