diff --git a/docs/changelog/7.x.x.txt b/docs/changelog/7.x.x.txt index c4bb091ca..d83ec2e43 100644 --- a/docs/changelog/7.x.x.txt +++ b/docs/changelog/7.x.x.txt @@ -6,6 +6,9 @@ - fix: purge old asset revisions could purge the most recent revision if the database had some referential integrity probems - Wiki autolinks prefer longest title match + - fix: Recover Password by Profile Field can now work with subclasses of + WebGUI::Auth::WebGUI and with custom WebGUI::Form::Controls as profile + fields. 7.4.0 - api: Form Controls and Workflow Activities may now include web based helper diff --git a/lib/WebGUI/Auth/WebGUI.pm b/lib/WebGUI/Auth/WebGUI.pm index 5027830c3..5487d5362 100644 --- a/lib/WebGUI/Auth/WebGUI.pm +++ b/lib/WebGUI/Auth/WebGUI.pm @@ -816,6 +816,7 @@ sub recoverPasswordFinish { sub profileRecoverPasswordFinish { my $self = shift; + my $session = $self->session; my $i18n = WebGUI::International->new($self->session); my $i18n2 = WebGUI::International->new($self->session, 'AuthWebGUI'); return $self->displayLogin unless ($self->session->setting->get('webguiPasswordRecovery') ne '') and $self->userId eq '1'; @@ -848,12 +849,13 @@ sub profileRecoverPasswordFinish { my @fieldValues = values %fieldValues; my $wheres = join(' ', map{"AND upd.$fieldNames[$_] = ?"} (0..$#fieldNames)); $wheres .= ' AND u.username = ?' if defined $username; - my $sql = "SELECT u.userId FROM users AS u JOIN userProfileData AS upd ON u.userId=upd.userId WHERE u.authMethod = 'WebGUI' $wheres"; - my @userIds = $self->session->db->buildArray($sql, [@fieldValues, (defined($username)? ($username) : ())]); + my $sql = "SELECT u.userId FROM users AS u JOIN userProfileData AS upd ON u.userId=upd.userId WHERE u.authMethod = ? $wheres"; + my @userIds = $self->session->db->buildArray($sql, [$self->authMethod, @fieldValues, (defined($username)? ($username) : ())]); if (@userIds == 0) { return $self->recoverPassword($i18n2->get('password recovery no results')); - } elsif (@userIds > 1) { + } + elsif (@userIds > 1) { return $self->recoverPassword($i18n2->get('password recovery multiple results')); } @@ -865,14 +867,27 @@ sub profileRecoverPasswordFinish { my $vars = {}; $vars->{title} = $i18n->get(71); $vars->{'recoverFormHeader'} = "\n\n" . WebGUI::Form::formHeader($self->session, {}); - $vars->{'recoverFormHidden'} = - (WebGUI::Form::hidden($self->session, {name => 'op', value => 'auth'}) - . WebGUI::Form::hidden($self->session, {name => 'method', value => 'recoverPasswordFinish'}) - . (defined($username)? - WebGUI::Form::hidden($self->session, {name => 'authWebGUI.username', - value => $username}) : '') - . join('', map{WebGUI::Form::hidden($self->session, {name => $_, value => $fieldValues{$_}})} - keys %fieldValues)); + $vars->{'recoverFormHidden'} + = WebGUI::Form::hidden($session, {name => 'op', value => 'auth'}) + . WebGUI::Form::hidden($session, {name => 'method', value => 'recoverPasswordFinish'}) + . ( defined($username) + ? WebGUI::Form::hidden($session, {name => 'authWebGUI.username', value => $username}) + : '') + ; + + # Add hidden fields for each required profile field + for my $profileField (@fields) { + my $formField + = $profileField->getFormControlClass->new($session, + $profileField->formProperties({ + name => $profileField->getId, + value => $fieldValues{ $profileField->getId }, + }) + ); + + $vars->{'recoverFormHidden'} .= $formField->toHtmlAsHidden; + } + $vars->{'recoverFormSubmit'} = WebGUI::Form::submit($self->session, {}); $vars->{'recoverFormFooter'} = WebGUI::Form::formFooter($self->session); diff --git a/lib/WebGUI/ProfileField.pm b/lib/WebGUI/ProfileField.pm index 9630fcae1..2e89d7492 100644 --- a/lib/WebGUI/ProfileField.pm +++ b/lib/WebGUI/ProfileField.pm @@ -122,7 +122,7 @@ sub create { $properties->{fieldType} ||= "ReadOnly"; my $formClass = 'WebGUI::Form::' . ucfirst $properties->{fieldType}; eval "use $formClass;"; - my $dbDataType = $formClass->new($session, $self->_formProperties($properties))->get("dbDataType"); + my $dbDataType = $formClass->new($session, $self->formProperties($properties))->get("dbDataType"); # Add the column to the userProfileData table $db->write( @@ -157,8 +157,16 @@ sub delete { #------------------------------------------------------------------- -# Get a hashref of properties to give to a WebGUI::Form::Control -sub _formProperties { + +=head2 formProperties ( hashRef ) + +Get a hashref of properties to give to a WebGUI::Form::Control. The +hashRef argument allows you to specify some additional items (such as +a value) that are not known by the ProfileField. + +=cut + +sub formProperties { my $self = shift; my $properties = shift || {}; @@ -187,6 +195,12 @@ sub _formProperties { return \%properties; } +#-- This is here in case people did not understand that _ means private +#-- this can be removed when the API is unlocked. +sub _formProperties { my $self = shift; return $self->formProperties(@_); } + +#------------------------------------------------------------------- + =head2 formField ( [ formProperties, withWrapper, userObject ] ) Returns an HTMLified form field element. @@ -207,7 +221,7 @@ A WebGUI::User object reference to use instead of the currently logged in user. sub formField { my $self = shift; - my $properties = $self->_formProperties(shift); + my $properties = $self->formProperties(shift); my $withWrapper = shift; my $u = shift || $self->session->user; my $skipDefault = shift; @@ -251,7 +265,7 @@ Returns the value retrieved from a form post. sub formProcess { my $self = shift; my $u = shift || $self->session->user; - my $properties = $self->_formProperties({value => $u->profileField($self->getId)}); + my $properties = $self->formProperties({value => $u->profileField($self->getId)}); my $result = $self->session->form->process($self->getId,$self->get("fieldType"),WebGUI::Operation::Shared::secureEval($self->session,$self->get("dataDefault")), $properties); if (ref $result eq "ARRAY") { my @results = @$result; @@ -578,7 +592,7 @@ sub rename { # Rename the userProfileData column my $fieldClass = $self->getFormControlClass; eval "use $fieldClass;"; - my $dbDataType = $fieldClass->new($session, $self->_formProperties)->get("dbDataType"); + my $dbDataType = $fieldClass->new($session, $self->formProperties)->get("dbDataType"); $self->session->db->write( "ALTER TABLE userProfileData " @@ -684,7 +698,7 @@ sub set { my $fieldClass = "WebGUI::Form::".ucfirst($properties->{fieldType}); eval "use $fieldClass;"; my $dbDataType - = $fieldClass->new($session, $self->_formProperties($properties))->get("dbDataType"); + = $fieldClass->new($session, $self->formProperties($properties))->get("dbDataType"); my $sql = "ALTER TABLE userProfileData MODIFY COLUMN "