Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Skrypt zmiany hasła w roundcube
Forum PHP.pl > Forum > Gotowe rozwiązania
kolaborek
Witajcie.

Od razu przepraszam, jeżeli nie można umieszczać tutaj tego typu wątków i ewentualnie proszę o zadziałanie moderatora.

Mam zainstalowany serwer pocztowy na macierzy Synology. Doinstalowałem tam Roundcube'a aby mieć panel www. W roundcubie chciałem włączyć plugin do zmiany haseł przez użytkowników, ale nie działa. Od kilkunastu dni się z tym męczę. Przeglądnąłem fora dotyczące mojej macierzy, roundcubea i ogólnie googla. Nie udało się. Z uwagi na to, że plugin jest w PHP pomyślałem, że najlepiej będzie uderzyć tutaj. A więc.

Jest to plugin, który poprzez wykonanie polecenia systemowego ma zmieniać użytkownikom hasła. W konfiguracji ustawiającej plugin mam polecenie, które ma być wykonywane na macierzy:
  1. // chpasswd Driver options
  2. // ---------------------
  3. // Command to use
  4. $rcmail_config['password_chpasswd_cmd'] = 'sudo /usr/syno/sbin/synouser --setpw';


Natomiast driver obsługujący to polecenie jest poniżej:
  1. <?php
  2.  
  3. /**
  4.  * chpasswd Driver
  5.  *
  6.  * Driver that adds functionality to change the systems user password via
  7.  * the 'chpasswd' command.
  8.  *
  9.  * For installation instructions please read the README file.
  10.  *
  11.  * @version 2.0
  12.  * @author Alex Cartwright <acartwright@mutinydesign.co.uk>
  13.  */
  14.  
  15. class rcube_chpasswd_password
  16. {
  17. public function save($currpass, $newpass)
  18. {
  19. $cmd = rcmail::get_instance()->config->get('password_chpasswd_cmd');
  20. $username = $_SESSION['username'];
  21.  
  22. $handle = popen($cmd, "w");
  23. fwrite($handle, "$username $newpass\n");
  24.  
  25. if (pclose($handle) == 0) {
  26. return PASSWORD_SUCCESS;
  27. }
  28. else {
  29. raise_error(array(
  30. 'code' => 600,
  31. 'type' => 'php',
  32. 'file' => __FILE__, 'line' => __LINE__,
  33. 'message' => "Password plugin: Unable to execute $cmd"
  34. ), true, false);
  35. }
  36.  
  37. return PASSWORD_ERROR;
  38. }
  39. }
  40.  


Gdy wejdę na użytkownika nobody (bo na takim działa Apache) i wydam polecenie
sudo /usr/syno/sbin/synouser --setpw użytkownik hasło
To następuje poprawna zmiana hasła.
Natomiast z poziomu roundcuba wyskakuje błąd:
PHP Error in /volume1/web/roundcube/plugins/password/drivers/chpasswd.php (32): Password plugin: Unable to execute sudo synouser --setpw
Wygląda na błędne uprawnienia, ale już nie wiem komu i jakie mam ponadawać, aby to działało... Bardzo proszę o pomoc.
mar1aczi
Skonfiguruj sudo tak, aby użytkownik nobody miał prowo do uruchamiania polecenia
Kod
/usr/syno/sbin/synouser
bez podawania hasła.
kolaborek
Dzięki za zainteresowanie smile.gif

Poprzez visudo dodałem wcześniej już komendy:

nobody ALL=NOPASSWD:/usr/syno/sbin/synouser
nobody ALL=NOPASSWD:/opt/bin/sudo

Gdy jestem na nobody to nie muszę podawać hasła roota do uruchomienia polecenia sudo. W poniższej komendzie wydawanej z konta nobody:
sudo /usr/syno/sbin/synouser --setpw użytkownik hasło
podaje nazwę użytkownika któremu chcę zmienić hasło, no i hasło jakie chcę mu ustawić.

Z poziomu konsoli to działa. Przez www nie ....
mar1aczi
Co pojawia się w logach serwera www podczas próby zmiany hasła?
kolaborek
Przepraszam, że tak długo nie odpowiadałem, ale miałem gorący czas w pracy i nie mogłem się zająć tematem.
Wracając do sedna. Apache wyrzuca coś takiego
Cytat
172.24.96.9 - - [04/Mar/2013:11:40:55 +0100] "POST /roundcube/?_task=settings&_action=plugin.password-save HTTP/1.1" 200 2623 "http://172.24.96.18/roundcube/?_task=settings&_action=plugin.password-save" "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.14"
172.24.96.9 - - [04/Mar/2013:11:41:55 +0100] "GET /roundcube/?_task=settings&_action=keep-alive&_remote=1&_unlock=0&_=1362393715444 HTTP/1.1" 200 52 "http://172.24.96.18/roundcube/?_task=settings&_action=plugin.password-save" "Opera/9.80 (Windows NT 6.1) Presto/2.12.388 Version/12.14"


Zauważyłem jeszcze, że gdy dodam polecenie "echo" do linii w konfigu wywołującej polecenie
  1. // chpasswd Driver options
  2. // ---------------------
  3. // Command to use
  4. $rcmail_config['password_chpasswd_cmd'] = 'echo sudo /usr/syno/sbin/synouser --setpw';

to wyskakuje komunikat o poprawnie zapisanym haśle. Oczywiście jest to zmyłka, bo hasło zostaje stare....
mar1aczi
Zapisz poniższy kod do pliku i sprawdź czy nie ma na liście funkcji popen
Kod
error_reporting(E_ALL);
$disabled_functions = ini_get('disable_functions');
if ($disabled_functions!='')
{
$arr = explode(',', $disabled_functions);
sort($arr);
echo 'Disabled Functions:
';
for ($i=0; $i&lt;count($arr); $i++)
{
echo $i.' - '.$arr[$i].'&lt; br&gt;';
}
}
else
{
echo 'No functions disabled';
}
kolaborek
Poprawiłem nawiasy w skrypcie (jak poniżej) i w przeglądarce wyświetliło mi "No functions disabled".

  1. $disabled_functions = ini_get('disable_functions');
  2. if ($disabled_functions!='')
  3. {
  4. $arr = explode(',', $disabled_functions);
  5. sort($arr);
  6. echo 'Disabled Functions:';
  7. for ($i=0; $i<count($arr); $i++)
  8. {
  9. echo $i.' - '.$arr[$i].'< br&gt;';
  10. }
  11. }
  12. else
  13. {
  14. echo 'No functions disabled';
  15. }


Zastanawiam się, czy to Synology nie zrobiło jakiegoś brzydkiego zabezpieczenia, któro teraz daje o sobie znać ...
mar1aczi
Mnie już nic nie przychodzi, gdzie może być przyczyna.
kolaborek
W każdym razie dzięki wielkie za zaoferowaną pomoc i chęci wink.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.