Bivio::Biz::Model::UserPasswordQueryForm
# Copyright (c) 2005-2023 bivio Software, Inc. All Rights Reserved.
package Bivio::Biz::Model::UserPasswordQueryForm;
use strict;
use Bivio::Base 'Biz.FormModel';
my($_E) = __PACKAGE__->use('Type.Email');
my($_USER_FIELD) = b_use('Model.UserLoginForm')->USER_FIELD;
sub QUERY_KEY {
return 'email';
}
sub add_email_to_query {
my($proto, $email, $query) = @_;
($query ||= {})->{$proto->QUERY_KEY} = $email;
return $query;
}
sub execute_empty {
my($self) = @_;
# Default the email address to the user in the cookie if present.
# don't overwrite if already set by subclass
return if $self->unsafe_get('Email.email');
my($req) = $self->get_request;
$self->SUPER::execute_empty;
my($email) = $self->new_other('Email');
if (my $q = $self->ureq('query')) {
$q = $q->{$self->QUERY_KEY};
return
unless $q && $email->unauth_load({email => $q});
}
else {
return
unless my $cookie = $req->ureq('cookie');
my($user_id) = $cookie->unsafe_get($_USER_FIELD);
return
unless $user_id && $email->unauth_load({
realm_id => $user_id,
});
}
$email = $email->unsafe_get('email');
return
unless $_E->is_valid($email);
$self->internal_put_field('Email.email' => $email);
return;
}
sub execute_ok {
my($self) = @_;
return unless $self->validate_email_and_put_uri;
$self->put_on_request(1);
return {
method => 'server_redirect',
task_id => 'next',
query => undef,
};
}
sub internal_initialize {
my($self) = @_;
# Returns config
return $self->merge_initialize_info($self->SUPER::internal_initialize, {
version => 1,
visible => [
'Email.email',
],
other => [
{
name => 'uri',
type => 'Line',
constraint => 'NONE',
},
],
});
}
sub validate_email_and_put_uri {
my($self, $form) = @_;
$form ||= $self;
my($req) = $form->get_request;
my($ro) = $self->new_other('RealmOwner');
if (my $err = $ro->validate_login($form->get('Email.email'))) {
$form->internal_put_error('Email.email', $err);
return 0;
}
if ($ro->is_locked_out) {
b_warn('locked owner=', $self);
$form->internal_put_error('Email.email', 'USER_LOCKED_OUT');
return 0;
}
$form->internal_put_field(
uri => $req->with_realm(
$ro,
sub {
return Bivio::Biz::Action->get_instance('AccessChallenge')
->format_password_query_uri($req)
unless $req->is_super_user($ro->get('realm_id'))
|| $ro->require_otp;
$form->internal_put_error(qw(Email.email PERMISSION_DENIED));
return;
},
) || return 0,
);
return 1;
}
1;