[phpBB Debug] PHP Warning: in file [ROOT]/ext/tas2580/seourls/event/listener.php on line 213: Undefined array key "FORUM_NAME"
REDAXO Forum • Community: Passwort vergessen -> neues Passwort anlegen
Seite 1 von 1

Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 8. Jun 2015, 18:14
von derkrebs
Hallo,

ich möchte über einen Passwort-Vergessen-Link den User auffordern, ein neues Passwort anzulegen. Dazu habe ich (analog zu dem Community-Demo-Paket) eine entsprechende Seite mit einem XForm-Formular angelegt, wo der User seine E-Mail eingibt und nach Prüfung eine Mail bekommt mit einem Link (mit angehängten Aktivierungscode und E-Mail-Adresse) zu dem Artikel, wo er das Passwort ändern kann. Bis dahin funktioniert auch alles, wie es soll.

Nur auf der Zielseite selbst habe ich ein Problem. Dort habe ich folgende XForm-Konfiguration verwendet (auch analog zum Demo Paket bzw. zu diesem Artikel: https://github.com/yakamara/redaxo_comm ... -loginlink):

Code: Alles auswählen

hidden|status|1
objparams|submit_btn_show|1
objparams|send|1|init

validate|com_auth_login|activation_key=rex_com_activation_key,email=rex_com_email|status=1|Zugang wurde bereits bestätigt oder ist schon fehlgeschlagen|status

action|html|<section class="content-block">
action|html|<div class="double-col left password">
password|password|Neues Passwort
action|html|</div>
action|html|<div class="clearer"></div>
action|html|</section>

action|html|<section class="content-block">
action|html|<div class="double-right left password">
password|password_2|Passwort wiederholen||no_db
action|html|</div>
action|html|<div class="clearer"></div>
action|html|</section>

validate|empty|password|Bitte geben Sie ein Passwort ein.
validate|compare|password|password_2|Bitte geben Sie zweimal das gleiche Passwort ein

action|html|<section class="content-block">
action|html|<div class="double-col left register">
action|showtext||Ihre Daten wurden aktualisiert. Das neue Passwort ist ab sofort aktiv.||1
action|html|</div>
action|html|<div class="clearer"></div>
action|html|</section>

com_auth_password_hash|password|password|
action|com_auth_db|update
Leider funktioniert das so irgendwie nicht - es kommt immer die hinterlegte Fehlermeldung "Zugang wurde bereits bestätigt oder ist schon fehlgeschlagen" und das Passwort wird auch nicht geändert.

Kann mir da vielleicht jemand auf die Sprünge helfen, wo der Fehler liegt?

Vielen Dank!!

Gruß,
Michael

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 8. Jun 2015, 19:26
von RexDude
Probiers mit ner Testinstallation und der Community Demo und wenns da geht schau was du anderes gemacht hast ;)

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 9. Jun 2015, 00:05
von derkrebs
Hi RexDude,

ähm, ich habe doch die Community-Demo als Vorlage genommen - dort wird über die Passwort-Vergessen-Funktion allerdings nur das vorhandene Passwort an den User verschickt. Ich wollte aber erreichen, dass der Benutzer sich ein neues Passwort anlegt. Dazu bekommt dieser eine E-Mail mit einem Link zu der entsprechenden Seite - das funktioniert ja auch wie gesagt.

Nur eben das Neuanlegen des Passworts funzt mit meiner XForm-Definiton nicht. Als Basis hierfür habe ich die Definition der Registrierung-Bestätigung aus der Community-Demo verwendet (wegen der Datenübertragung aus der Mail -> validate|com_auth_login| ...). Irgendwas habe ich bei meiner Ergänzung aber wohl falsch gemacht ... aber was? :(

Hier nochmal die XForm-Konfuguration ohne mein HTML-Gedöns:

Code: Alles auswählen

hidden|status|1
objparams|submit_btn_show|1
objparams|send|1|init

validate|com_auth_login|activation_key=rex_com_activation_key,email=rex_com_email|status=1|Zugang wurde bereits bestätigt oder ist schon fehlgeschlagen|status

password|password|Neues Passwort
password|password_2|Passwort wiederholen||no_db

validate|empty|password|Bitte geben Sie ein Passwort ein.
validate|compare|password|password_2|Bitte geben Sie zweimal das gleiche Passwort ein

action|showtext||Ihre Daten wurden aktualisiert. Das neue Passwort ist ab sofort aktiv.||1

com_auth_password_hash|password|password|
action|com_auth_db|update
Gruß,
Michael

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 10. Jun 2015, 20:46
von derkrebs
Hi,

da ich das mit der bisherigen XForm-Konfiguration irgendwie nicht hinbekomme, habe ich mir überlegt, per rex_get den Aktivation-Key und die E-Mail-Adresse aus der URL zu holen, die der User per E-Mail bekommen hat.

Jetzt wäre nur die Frage, wie ich per XForm das neu eingegebene Passwort und den Passwort-Hash dem entsprechenden Nutzer in der User-DB zuordne - kann mir da jemand einen Tipp geben?

Vielen Dank für Eure Hilfe!

Gruß,
Michael

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 11. Jun 2015, 07:50
von RexDude
Vielleicht hilfts wenn du XForm mit PHP baust:
Thread: http://www.redaxo.org/de/forum/addons-f ... ml#p108487
Beispiel (siehe Ausgabe): http://www.redaxo.org/de/download/modul ... &cat_id=-1

Dann bist du völlig frei noch extra zeugs nach submit zu machen.

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 12. Jun 2015, 00:59
von derkrebs
Hi,

hab das jetzt auf die Weise gemacht. Ich hole mir über rex_get(..) meine beiden Werte ...

Code: Alles auswählen

$activation_key = rex_get('rex_com_activation_key','string');
$email = rex_get('rex_com_email','string');
... was auch funktioniert. Dann lege ich mir (neben den anderen Feldern) zwei "hidden"-Fields an, in die ich die Werte reinschreibe:

Code: Alles auswählen

$xform->setValueField("hidden",array('ackey',$activation_key,'','no_db'));
$xform->setValueField("hidden",array('eml',$email,'','no_db'));
Damit die Daten nach dem Versenden in die DB geschrieben werden, verwende ich folgenden Code:

Code: Alles auswählen

if (($form = $xform->getForm()) == '') {
	// Formular wurde verschickt
	
	$formData = $xform->objparams['value_pool']['email'];
	
	$sql = rex_sql::factory();
	$sql->debugsql = 1;
	$sql->setTable($REX['TABLE_PREFIX'] . 'com_user');
	$sql->setWhere("activation_key='" . $formData['ackey'] . "' AND email='" . $formData['eml'] . "'");
	$sql->setValue('password', $formData['password']);
	
	if ($sql->update()) {
		$cont_output .= 'Ihre Daten wurden aktualisiert.';
	} else {
		$cont_output .= 'Es ist ein Fehler aufgetreten.';
	}
	
} else {
	// Formular anzeigen
	$cont_output .= $t2 . $form . $b . $b;
}

 [...]
Jetzt mein Problem: Kann es sein, dass im Valuepool die Werte aus "hidden"-Feldern nicht gespeichert werden? Jedenfalls werden diese Werte in der setWhere-Anweisung nicht ausgegeben. Wenn ich aber statt der "hidden"-Felder testhalber normale Text-Felder verwende, klappt das auf einmal... ?!

Woran kann das liegen? :(

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 12. Jun 2015, 09:19
von RexDude
Gute Frage. Das muss wohl jemand aus dem Core-Team beantworten.
Kannst du nicht als Workaround über rex_post() an die hidden Felder kommen sonst auch?

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 14. Jun 2015, 23:48
von derkrebs
Hi RexDude,

vielen Dank für Deinen Tipp!! Nur leider klappt das auch nicht, obwohl ich nicht weiß warum - weil eigentlich müßte der Workaround so funktionieren (nach meinem dafürhalten), weil das Formular doch per POST verschickt wird... Aber irgendwie ist da scheinbar der Wurm drin ... Seufz... :(

Also, weiß denn jemand vom Core-Team vielleicht einen Rat? Please help! Bin langsam mit meiner "Weisheit" am Ende ...

Danke!

Gruß,
Michael

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 15. Jun 2015, 10:26
von Sysix
Hallo,

ich hab mal bisschen rumgeschaut und folgendes Gefunden:

Code: Alles auswählen

$xform->setHiddenField($name, $value);
und mit den Code kannst du den Value wieder auslesen:

Code: Alles auswählen

$value = $xform->objparams['form_hiddenfields'][$key];
Ich hab nirgendwo gefunden, dass die Felder hier abgespeichert werden:

https://github.com/yakamara/redaxo_xfor ... ddenfields

Gruß Sysix

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 15. Jun 2015, 11:36
von wolfgang
Da bin ich auch schon drüber gestolpert. Das hidden Feld braucht ein REQUEST.

Also z.B.
$xform->setValueField("hidden",array('ackey',$activation_key,'REQUEST','no_db'));

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 16. Jun 2015, 03:35
von derkrebs
Ich bin hier bald am Verzweifeln ... das funktioniert beides auch nicht... Was habe ich denn in meinem Formular bloß für'n blöden Fehler drin??? :cry:

@Sysix: An welche Stelle in der XForm-Konfiguration muss denn "$value = $xform->objparams['form_hiddenfields'][$key];" eingefügt werden - in der Abfrage für nach Abschicken des Formulars? Ich nehme an, das $key der Name des Hidden-Fields ist, oder? Und ersetzt das "$xform->setHiddenField($name, $value);" das "$xform->setValueField("hidden",...)"? Ich weiß, Fragen über Fragen .. :wink: :(

Danke nochmal für Eure Mühe!!!

Gruß, Michael

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 16. Jun 2015, 03:46
von derkrebs
P.S.: Hier ist nochmal mein aktuelles Skript:

Code: Alles auswählen

<?php

$activation_key = rex_get('rex_com_activation_key','string');
$email = rex_get('rex_com_email','string');
// Diese Daten kommen an, dass habe ich geprüft.

$xform = new rex_xform;

$xform->setObjectparams("form_action", rex_getUrl($REX['ARTICLE_ID']));
$xform->setObjectparams("submit_btn_show", false);

$xform->setHiddenField('ackey', $activation_key);
$xform->setHiddenField('eml', $email);

// Wrapper-SECTION
$xform->setValueField("html",array('label','<section class="content-block">'));
$xform->setValueField("html",array('label','<div class="register-col left password">'));

// Eingabe Passwort
$xform->setValueField("password",array('password','Neues Passwort'));

// Passwort wiederholen
$xform->setValueField("html",array('label','<div class="register-col right password">'));
$xform->setValueField("password",array('password_2','Password bestätigen','','no_db'));
$xform->setValueField("html",array('label','</div>'));

$xform->setValueField("html",array('label','<div class="clearer"></div>')); // Clearer-DIV

// Passwort verschlüsseln
$xform->setValueField("com_auth_password_hash",array('password_hash','password'));

// Submit
$xform->setValueField("html",array('label','<div class="double-col left register">'));
$xform->setValueField("submit", array('submit','Senden','no_db'));
$xform->setValueField("html",array('label','</div>'));

$xform->setValueField("html",array('label','<div class="clearer"></div>')); // Clearer-DIV
$xform->setValueField("html",array('label','</section>')); // .content-block

// Eingaben überprüfen (Pflichtfelder)
$xform->setValidateField('empty', array('password','Bitte geben Sie ein Passwort ein.'));
$xform->setValidateField('compare', array('password','password_2','Bitte geben Sie zweimal das gleiche Passwort ein.'));


// Daten verarbeiten
if (($form = $xform->getForm()) == '') {
	
	// Formular wurde verschickt
	
	$formData = $xform->objparams['value_pool']['email'];
	
	$ackey = $xform->objparams['form_hiddenfields']['ackey'];
	$eml = $xform->objparams['form_hiddenfields']['eml'];
	
	$sql = rex_sql::factory();
	
	$sql->debugsql = 1;
	
	$sql->setTable($REX['TABLE_PREFIX'] . 'com_user');
	$sql->setWhere("activation_key='" . $ackey . "' AND email='" . $eml . "'");
	$sql->setValue('password', $formData['password']);
	
	if ($sql->update()) {
		
		$cont_output .= $t2 . '<section class="content-block">';
		
		$cont_output .= $t3 . '<div class="double-col left register">' ;
		$cont_output .= $t4 . '<div class="form-success"><span class="msg"><i class="fa fa-check"></i> Ihre Daten wurden aktualisiert. Das neue Passwort ist ab sofort aktiv.</span><span class="bklnk"><a href="' . rex_getUrl($REX['START_ARTICLE_ID']) . '">###linktext_zurueck_startseite###</a></span><div class="clearer"></div></div>';
		$cont_output .= $t3 . '</div>';
		
		$cont_output .= $t2 . '</section>';
		
	} else {
		$cont_output .= 'Es ist ein Fehler aufgetreten.';
	}
	
	
} else {

	// Formular anzeigen
	$cont_output .= $t2 . $activation_key . ' / ' . $email;
	$cont_output .= $t2 . $form;
	
}

?>
Gruß, Michael

Re: Community: Passwort vergessen -> neues Passwort anlegen

Verfasst: 16. Jun 2015, 12:01
von derkrebs
Hi,

ääähm, man sollte vielleicht nicht mehr so spät am Abend programmieren - mit Wolfgangs Tipp funktioniert es nun doch! Die richtige Reihenfolge beim Abfragen der Variablen sollte man dann allerdings einhalten... :roll:

So funktionierts natürlich nicht:

Code: Alles auswählen

if (($form = $xform->getForm()) == '') {

	[...]

	$ackey = $formData['ackey'];
	$eml = $formData['eml'];

	$formData = $xform->objparams['value_pool']['email'];
	
	[..]

}
Aber so:

Code: Alles auswählen

if (($form = $xform->getForm()) == '') {

	[...]

	$formData = $xform->objparams['value_pool']['email'];

	$ackey = $formData['ackey'];
	$eml = $formData['eml'];
	
	[..]

}
:wink:

Danke für Eure Hilfe!

Gruß, Michael