Hace un tiempo migré una de mis instalaciones de MediaWiki hacia un servidor Web OpenBSD con PHP. En esa tarea me había quedado pendiente resolver un inconveniente con el envío de mails desde PHP, el cual me impedía resetear contraseñas de MediaWiki mediante el método tradicional de envío por correo electrónico. Como no era un problema urgente ni crítico lo dejé de lado, pero tarde o temprano un usuario de la Wiki tuvo la necesidad de resetear su contraseña. Con lo cual tuve que resolver el problema de una vez por todas.



Bien, al momento de intentar resetear la contraseña ocurría un error, pero MediaWiki no daba mayor detalle o información al respecto. Sólo un mensaje de error genérico.

El primer paso entonces, consiste en lograr visualizar los errores de PHP. a tal fin, editar el archivo LocalSettings.php:

# nano /var/www/htdocs/wiki/LocalSettings.php

Para ver los errores de PHP, agregar las siguientes líneas al final del archivo:

error_reporting( -1 );
ini_set( 'display_errors', 1 );
$wgShowExceptionDetails = true;

La variable $wgShowExceptionDetails permite visualizar un mayor nivel de detalle (como una especie de traza) en la página de error.

Al intentar resetear (restablecer) una contraseña nuevamente, el mensaje de error era el siguiente:

[19d14ed0] /wiki/index.php?title=Especial:RestablecerContrase%C3%B1a MWException from line 291 of /htdocs/wiki/includes/mail/UserMailer.php: PEAR mail package is not installed

Backtrace:

#0 /htdocs/wiki/includes/User.php(4263): UserMailer::send(MailAddress, MailAddress, string, string, array)
#1 /htdocs/wiki/includes/specials/SpecialPasswordReset.php(276): User->sendMail(string, string)
#2 [internal function]: SpecialPasswordReset->onSubmit(array, OOUIHTMLForm)
#3 /htdocs/wiki/includes/htmlform/HTMLForm.php(580): call_user_func(array, array, OOUIHTMLForm)
#4 /htdocs/wiki/includes/htmlform/HTMLForm.php(503): HTMLForm->trySubmit()
#5 /htdocs/wiki/includes/htmlform/HTMLForm.php(518): HTMLForm->tryAuthorizedSubmit()
#6 /htdocs/wiki/includes/specialpage/FormSpecialPage.php(154): HTMLForm->show()
#7 /htdocs/wiki/includes/specialpage/SpecialPage.php(384): FormSpecialPage->execute(NULL)
#8 /htdocs/wiki/includes/specialpage/SpecialPageFactory.php(553): SpecialPage->run(NULL)
#9 /htdocs/wiki/includes/MediaWiki.php(281): SpecialPageFactory::executePath(Title, RequestContext)
#10 /htdocs/wiki/includes/MediaWiki.php(714): MediaWiki->performRequest()
#11 /htdocs/wiki/includes/MediaWiki.php(508): MediaWiki->main()
#12 /htdocs/wiki/index.php(41): MediaWiki->run()
#13 {main}

Allí se observa claramente: "PEAR mail package is not installed".

Esto significa que el paquete pear-Mail no está instalado (o no se encuentra). Este paquete define una interfaz para implementar diferentes mecanismos de envío de correo a través de PHP, y es un requerimiento de MediaWiki.

Cabe recordar que la instalación por defecto de httpd en sistemas OpenBSD corre dentro de un jail chroot, el cual restringe el acceso a los scripts PHP sólo a los archivos dentro del directorio /var/www/. Sin embargo los paquetes de PEAR en OpenBSD se instalan automáticamente dentro del entorno de chroot (/var/ww/). Por ende esto significa que simplemente no está instalado, o al menos no está instalado el paquete correspondiente a PEAR Mail.

Es posible buscar el paquete correspondiente utilizando pkg_info. En este caso se trata del paquete "pear-Mail".

Para instalarlo, simplemente ejecutar pkg_add pear-Mail:

# pkg_add pear-Mail
quirks-2.367 signed on 2017-10-03T11:21:28Z
pear-Mail-1.4.1v0:pear-Net-Socket-1.2.2: ok
pear-Mail-1.4.1v0:pear-Auth-SASL-1.1.0: ok
pear-Mail-1.4.1v0:pear-Net-SMTP-1.8.0: ok
pear-Mail-1.4.1v0: ok

Ahora es posible intentar nuevamente el reseteo de una contraseña vía mail:

Sin embargo aún quedan errores por resolver. En este caso no es posible resolver la dirección IP ("no address associated with name") correspondiente al nombre del servidor de correo electrónico a través del cual se envían los mensajes (SMTP). Esto se debe a que falta el archivo resolv.conf dentro del chroot.

Además de haber creado un directorio temporal /var/www/tmp/ para las sesiones de PHP dentro del chroot, es necesario copiar algunos archivos dentro de /etc/ a fin de poder utilizar funciones de red, tales como /etc/resolv.conf:

# mkdir /var/www/etc
# cp /etc/resolv.conf /var/www/etc/

Crear el directorio /etc dentro del chroot, copiar el archivo resolv.conf, y voilà!

Referencias


Tal vez pueda interesarte


Compartí este artículo