Author Topic: Passwort ändern ohne Logout  (Read 10274 times)

Offline EdMolf

  • Jr. Member
  • **
  • Posts: 26
Passwort ändern ohne Logout
« on: August 25, 2009, 05:09:23 AM »
Hallo!

Ich habe mir das Passwortändern Plugin installiert und es auch entsprechend konfiguriert.

An sich funktioniert es auch wunderbar. Mein Problem ist nur, dass mein IMAP Login über die E-Mail Adresse funktioniert welche sich in einer MySQL-Datenbank befindet.

Wenn sich jetzt also das Passwort ändert, dann funktioniert die IMAP Authentifizierung natürlich nicht mehr.

Hat jemand eine Idee wie ich das umgehen könnte? Gibt es evtl eine Methode den Login erneut zu senden, so dass nach dem Passwort ändern einfach ein neuer Login mit den neuen Daten ausgeführt wird?

Ich habe es momentan so gemacht das der Benutzer nach dem Ändern des Passworts auf die Logoutseite per header weitergeleitet wird, damit die Oberfläche nicht mit lauter 403-Fehlern angezeigt wird. Dies ist aber nur eine suboptimale Lösung.

Vielleicht hat ja jemand von euch einen Lösungsansatz für mich.

Viele Grüße,
EdMolf

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Passwort ändern ohne Logout
« Reply #1 on: August 25, 2009, 05:21:37 AM »
Wenn Du bei der Passwortänderung ausgelogged wirst, dann scheint das Problem wo anders zu sein.

RoundCube speichert in der SESSION den Imap-User und das zugehörige Passwort. Das Plugin überschreibt bei einer Änderung das Passwort in der SESSION. Der User dürfte sich ja nicht ändern. Dann greift RoundCube bei jeder Herstellung einer IMAP-Verbindung auf die SESSION-Daten zurück. Du dürftest also nicht ausgelogged werden.

_______
92       else if (!($res = $this->_save($curpwd,$newpwd))) {
93         $rcmail->output->command('display_message', $this->gettext('successfullysaved'), 'confirmation');
94         $_SESSION['password'] = $rcmail->encrypt($newpwd);
95       }
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline EdMolf

  • Jr. Member
  • **
  • Posts: 26
Passwort ändern ohne Logout
« Reply #2 on: August 26, 2009, 01:58:06 AM »
Hallo,
danke für die Hilfe.
Das Passwort wird tatsächlich in die Session übernommen.

Ich habe gerade nochmal alle Änderungen die ich im Script vorgenommen hatte zurückgesetzt und nun bekomme ich beim ändern des Passwortes folgenden Fehler:

"SERVICE CURRENTLY NOT AVAILABLE!

Error No. [500]"


Wenn ich das Passwort auf ein neues ändere bekomme ich die Fehlermeldung und verliere ich danach die Verbindung zum IMAP-Server. Wenn ich das Passwort auf das selbe Passwort ändere wie es schon ist, dann erhalte ich nur den Fehler und werde nicht vom IMAP-Server getrennt.

Hast jemand vielleicht noch eine Idee woran das liegen könnte?

Viele Grüße,
Christian

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Passwort ändern ohne Logout
« Reply #3 on: August 26, 2009, 05:10:24 AM »
Error No. [500] deutet auf einen Datenbankfehler hin. Das Query zum Ändern des Passwortes ist vermutlich fehlerhaft. Das ERROR log sollte Aufschluss geben.
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline EdMolf

  • Jr. Member
  • **
  • Posts: 26
Passwort ändern ohne Logout
« Reply #4 on: August 26, 2009, 06:14:13 AM »
Ich habe mir das Query nochmal angeschaut und das funktioniert einwandfrei und ist auch korrekt.

Das Log sag:


MDB2 Error
no such table (-18): _doQuery: [Error messageCould not execute statement]\n[Last executed queryPREPARE mdb2_statement_mysql_3b18ec83f9ffe2b61cece10f4255b9aea2f7f71ee FROM 'SELECT vars FROM session\\n     WHERE  sess_id=?']\n[Native code1146]\n[Native messageTable 'mailserver.session' doesn't exist]\n, referer: http://domain.net/?_task=settings&_action=plugin.password



Evtl liegt es daran, dass ich für die Passwortänderungen auf die Datenbank "mailserver" zugreife, die Roundcube Datenbank aber "roundcube" heißt.

Die Datenbankconfig für Roundcube sieht so aus:
mysql://roundcube:******@localhost/roundcube';

und die in der config für die Passwortänderungn so:
$rcmail_config['password_db_dsn'] = 'mysql://roundcube:******@localhost/mailserver';

Die Tabelle mailserver.session existiert also nicht, aber das ist ja auch klar. Das Query müsste ja auf roundcube.session zugreifen und nicht auf die Datenbank mailserver.

Darf ich evtl für das Passwort ändern Query keine andere Datenbank verwenden?


Viele Grüße,
EdMolf

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Passwort ändern ohne Logout
« Reply #5 on: August 26, 2009, 07:02:34 AM »
Du musst sowohl die Datenbank als auch das Query so anpassen, dass es zu Deinem MailServer passt (siehe SQL Optionen in der Plugin Config).

Jetzt habe ich mir das nochmal angeschaut. Wieso willst Du das Passwort im RoundCube Session Table ändern? Das macht doch überhaupt keinen Sinn! Erstens geht das auch simpel über $_SESSION['password'] = "xyz" und zweitens ändert das nicht das IMAP-Server Passwort, weil das Passwort in der IMAP-Server Datenbank oder sonst wo gespeichert ist.
« Last Edit: August 26, 2009, 10:17:41 AM by rosali »
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline EdMolf

  • Jr. Member
  • **
  • Posts: 26
Passwort ändern ohne Logout
« Reply #6 on: August 28, 2009, 02:10:00 AM »
hmm, ich glaube ich habe mich blöd ausgedrückt oder du hast nicht verstanden was genau ich wollte ;)

Nochmal von vorne und genaue erklärt:

Ich habe mir von einiger Zeit die 0.3RC1 Version von Roundcube auf meinen V-Server eingerichtet. Dabei verwendet Roundcube die MySQL-Tabelle "roundcube".

Dann habe ich auf meinem V-Server noch einen Postfix Mailserver laufen, welcher die E-Mail Konten ebenfalls per MySQL Verwaltet. Die Tabelle für Postfix heißt "mailserver".

Nach der Installation von Roundcube habe ich mir noch das Passwort-Ändern-Plugin eingerichtet. Dazu habe ich in der Config des Plugins folgendes angepasst:


$rcmail_config
['password_driver'] = 'sql';
$rcmail_config['password_db_dsn'] = 'mysql://roundcube:******@localhost/mailserver';
$rcmail_config['password_query'] = 'UPDATE virtual_users SET password = MD5(%p) WHERE domain_id = (SELECT id FROM virtual_domains WHERE name = %h) AND user = %u';


password_db_dsn zeigt auf die Mailserver-Tabelle, da ich ja das Passwort des Mail-Accounts ändere.

Dann habe ich noch in der password.php geändert, das der Host und der Benutzername getrennt werden, da bei mir der IMAP Benutzername gleich der E-Mail Adresse ist und ich mit der kompletten E-Mail Adresse mein Query nicht hätte ausführen können.

Wenn ich jetzt das Passwort über Roundcube ändere, dann kommt der Fehler 500 und ich verliere die Verbindung zum IMAP-Server.

Der Apache-Error-Log sag dazu folgendes:
MDB2 Errorno such table (-18): _doQuery: [Error messageCould not execute statement]n[Last executed queryPREPARE mdb2_statement_mysql_3b18ec83f9ffe2b61cece10f4255b9aea2f7f71ee FROM 'SELECT vars FROM session\\n     WHERE  sess_id=?']n[Native code1146]n[Native messageTable 'mailserver.session' doesnt exist]nrefererhttp://domain.net/?_task=settings&_action=plugin.password


In dem Log will Roundcube auf die tabelle mailserver.session zugreifen, aber die db mailserver ist ja vom Postfix nicht von roundcube. Es müsste also roundcube.session heißen.

Kann es sein das Roundcube die Datenbank-Verbindung für die Passwortänderung mit der Datenbank-Verbindung vom Roundcube überrschreibt so das er dann die normalen Querys auch auf die mailserver-db ausführt?

Ich hatte niemals vor das Passwort innerhalb einer Session oder in der Session-Tabelle zu ändern. Der Fehler aus dem Log kommt von Roundcube und ist kein Query welches ich selber angelegt habe oder ich absichtlich ausführen lasse.

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Passwort ändern ohne Logout
« Reply #7 on: August 28, 2009, 03:42:57 AM »
OK, jetzt bin ich mit an Bord ;-)

Hast Du die Datenbankverbindung in db.inc.php auf "persistent" gesetzt? Wenn nein, versuche es mal *). Wenn das hilft, gebe ich Dir einen Patch, so dass es auch ohne "persistent" funktionieren sollte.

Wenn ich richtig liege, kannst Du es auch selber patchen. Die Vorlage findest Du hier Zeile 103 - 107.

____________________________
*) Das RoundCube-Session-Management ist datenbankbasiert. Wenn die RoundCube-Datenbank nicht "persistent" geöffnet wurde und nun das Passwort-Plugin zur IMAP-Server-Datenbank wechselt ohne am Ende zurückzuwechseln, dann versucht das RoundCube-Session-Management wohl in die zuletzt geöffnete Datenbank zu schreiben und das ist in Deinem Fall "mailserver". Dort gibt es keine Tabelle "session" ... Error ... SESSION-Passwort nicht überschrieben ... IMAP-Server-Passwort überschrieben ... IMAP-Server-Passwort ungleich SESSION-Passwort ... Logout !!!
« Last Edit: August 28, 2009, 05:16:58 AM by rosali »
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline EdMolf

  • Jr. Member
  • **
  • Posts: 26
Passwort ändern ohne Logout
« Reply #8 on: August 28, 2009, 04:27:13 AM »
Ahh, der Tipp den Datenbankverbindungsmodus auf "persistent" umzustellen hat geholfen.
Jetzt funktioniert es ohne das ich die Verbindung zum IMAP-Server verliere.

Vielen Dank für deine Mühe und Hilfe!

Viele Grüße,
EdMolf

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Passwort ändern ohne Logout
« Reply #9 on: August 28, 2009, 04:58:22 AM »
OK, "persistent" ist aber oftmals buggy. Ich benutze es nicht und schreibe meine Plugins so, dass es auch ohne funktioniert.

http://trac.roundcube.net/ticket/1486067
« Last Edit: August 28, 2009, 05:19:03 AM by rosali »
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline rosali

  • Hero Member
  • *****
  • Posts: 2,533
Passwort ändern ohne Logout
« Reply #10 on: August 31, 2009, 02:02:22 AM »
Könntest Du bitte ausprobieren, ob das hilft wenn die Verbindung nicht "persistent" ist:

#1486067: Password Plugin SQL driver
------------------------+---------------------------------------------------
 Reporter:  rosali      |        Type:  Bugs  
   Status:  new         |    Priority:  5      
Milestone:  0.3-stable  |   Component:  Plugins
  Version:  0.3-rc1     |    Severity:  normal
 Keywords:              |  
------------------------+---------------------------------------------------

Comment(by alec):

 I'm using postgres, so get me to know if adding "?new_link=true" to
 password_db_dsn fixes this issue.
Regards,
Rosali
__________________
MyRoundcube Project (commercial)

Offline EdMolf

  • Jr. Member
  • **
  • Posts: 26
Passwort ändern ohne Logout
« Reply #11 on: August 31, 2009, 05:05:12 AM »
Habe es gerade getestet und es funktioniert.

db.inc.php:

$rcmail_config
['db_persistent'] = false;


plugin password - config.inc.php

$rcmail_config
['password_db_dsn'] = 'mysql://roundcube:******@localhost/mailserver?new_link=true';



Viele Grüße,
EdMolf