ISPConfig 3 change squirrelmail password

Konfiguracja squirrelmail umożliwiająca użytkownikom zmianę hasła poprzez interfejs www.

1. Pobieramy i instalujemy plugin do zmiany hasła change_sqlpass:

root@server:/# cd /usr/share/squirrelmail/plugins/
root@server:/# wget http://squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fchange_sqlpass-3.3-1.2.tar.gz
root@server:/# tar xvf change_sqlpass-3.3-1.2.tar.gz

2. Naprawiamy błąd md5crypt poprzez odpowiednią zmianę pliku function.php:

root@server:/# cd /usr/share/squirrelmail/plugins/change_sqlpass
root@server:/# vim function.php

Odnajdujemy poniższe linie:

case strtolower(PASSWORD_ENCRYPTION_MD5CRYPT):
   return '"' . md5crypt($password, $salt) . '"';

i wstawiamy pomiędzy nie kod oznaczony na czarno:

case strtolower(PASSWORD_ENCRYPTION_MD5CRYPT):
   include_once(SM_PATH . 'plugins/change_sqlpass/md5crypt.php');
   return '"' . md5crypt($password, $salt) . '"';

3. Tworzymy nowy plik konfiguracyjny config.php i otwieramy go w dowolnym edytorze go:

root@server:/# touch config.php
root@server:/# vim config.php

Do pliku wstawiamy poniższy kod:

<?
global $csp_dsn, $password_update_queries, $lookup_password_query,
       $force_change_password_check_query, $password_encryption,
       $csp_salt_query, $csp_salt_static, $csp_secure_port,
       $csp_non_standard_http_port, $csp_delimiter, $csp_debug,
       $min_password_length, $max_password_length, $include_digit_in_password,
       $include_uppercase_letter_in_password, $include_lowercase_letter_in_password,
       $include_nonalphanumeric_in_password;

$csp_dsn = 'mysql://mysqluser:mysqlpass@127.0.0.1/dbispconfig';

$Lookup_Password_Query = 'SELECT count(*) FROM mail_user WHERE email = "%1" AND crypt_password = %4';

$password_update_queries = array(
          'UPDATE mail_user SET password = %4 WHERE email = "%1"',
                                );

$force_change_password_check_query = '';

$password_encryption = 'MD5CRYPT';

$csp_salt_query = 'SELECT SUBSTRING(PASSWORD, 4, 8) FROM mail_user WHERE email = "%1"';

$csp_secure_port = 0;

$csp_non_standard_http_port = 0;

$min_password_length = 6;
$max_password_length = 0;
$include_digit_in_password = 0;
$include_uppercase_letter_in_password = 0;
$include_lowercase_letter_in_password = 0;
$include_nonalphanumeric_in_password = 0;

$csp_delimiter = '@';

$csp_debug = 0;
?>

Przed zapisaniem pliku zmieniamy mysqluser i mysqlpass na odpowiednie wartości. Najlepiej wstawić dane odczytane z pliku konfiguracyjnego ISPConfig 3 /usr/local/ispconfig/server/lib/config.inc.php ze zmiennych: $conf[‚db_user’] oraz $conf[‚db_password’].

4. Pobieramy i instalujemy dodatek compatibility:

root@server:/# cd /usr/share/squirrelmail/plugins/
root@server:/# wget http://www.squirrelmail.org/countdl.php?fileurl=http%3A%2F%2Fwww.squirrelmail.org%2Fplugins%2Fcompatibility-2.0.14-1.0.tar.gz
root@server:/# tar xvf ./compatibility-2.0.14-1.0.tar.gz

5. Sprawdzamy czy mamy zainstalowane wymagane biblioteki:

root@server:/# pear install DB

lub

root@server:/# apt-get install php-pear php-db

6. Usuwamy niepotrzebne pliki:

root@server:/# cd /usr/share/squirrelmail/plugins/
root@server:/# rm change_sqlpass-3.3-1.2.tar.gz
root@server:/# compatibility-2.0.14-1.0.tar.gz

7. Aktywujemy zainstalowany dodatek w konfiguracji squirrelmail:

root@server:/# squirrelmail-configur

Wybieramy: 8

Sprawdzamy jaka liczba jest na liście Available Plugins przy pozycji change_sqlpass wpisujemy ją i wciskamy Enter:

Na zakończenie konfiguracji wybieramy S (zapis) i Q (wyjście).

W tym momencie możemy sprawdzić czy z poziomu strony www użytkownicy mogą zmieniać hasło do poczty.

Może się  zdarzyć, że po zmianie hasło, pomimo tego, że mamy zainstalowane wcześniej odpowiednie biblioteki wyświetla się komunikat: Could not find Pear DB library. MOżna temu zaradzić poprzez edycję pliku konfiguracyjnego squirrelamail:

root@server:/# vim /etc/squirrelmail/apache.conf

w pliku należ zakomentować poniższe 2 linie:

# php_value include_path .
# php_admin_value open_basedir /usr/share/squirrelmail:/etc/squirrelmail:/var/lib/squirrelmail:/etc/hostname:/etc/mailname

Zamiast nich wstawiamy poniższy kod:

php_admin_value open_basedir /usr/share/squirrelmail::/etc/squirrelmail:/var/lib/squirrelmail:/etc/hostname:/etc/mailname:/usr/share/php

Po zapisaniu pliku restartujemy apacha:

root@server:/# service apache2 restart

 

Jeśli po pomyślnej zmianie hasła w squirrelmail przy wykorzystaniu pluginu change_sqlpass wyświetla się komunikat błedu:

This page request could not be verified and appears to have expired.

należy dokonać modyfikacji w pliku /usr/share/squirrelmail/plugins/change_sqlpass/functions.php. We fragmencie kodu jak poniżej należy zakomentować poniższą linię zaznaczoną na czarno:

sqgetGlobalVar('csp_was_already_encrypted_port', $csp_was_already_encrypted_port, SQ_SESSION);
sqgetGlobalVar('HTTP_HOST', $HTTP_HOST, SQ_SERVER);
if (empty($base_uri)) $base_uri = sqm_baseuri();
#$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=no';

następnie poniżej wklejamy kod:

sqgetGlobalVar('csp_was_already_encrypted_port', $csp_was_already_encrypted_port, SQ_SESSION);
sqgetGlobalVar('HTTP_HOST', $HTTP_HOST, SQ_SERVER);
if (empty($base_uri)) $base_uri = sqm_baseuri();
#$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=no';
$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=no&smtoken=' . sm_generate_security_token();

W kolejnym kroku przed linią <input type=”submit” … wstawiamy ukryty input:

<td align="right" colspan="2">
            <input type="hidden" name="csp_submit_change" value="1">
            <input type="hidden" name="smtoken" value="<?php echo sm_generate_security_token(); ?>">
            <input type="submit" value="<?php echo _("Submit"); ?>">
Na zakończenie należy zakomentować linię zaznaczoną na czarno:
if (!empty($csp_was_force_mode))
      $loc = $base_uri . 'src/right_main.php';
    else
      //$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=yes';

i poniżej jej wkleić dodatkowy kod:

if (!empty($csp_was_force_mode))
   $loc = $base_uri . 'src/right_main.php';
else
   //$loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=yes';
   $loc = $base_uri . 'src/options.php?optpage=xx&optmode=submit&csp_change_success=yes&smtoken=' . sm_generate_security_token();