From: Christopher Burger Date: Tue, 7 May 2019 13:19:57 +0000 (-0400) Subject: RT# 82132 - updated selfservice login to use config username-uppercase X-Git-Url: http://git.freeside.biz/gitweb/?p=freeside.git;a=commitdiff_plain;h=6dcc5cc9c8bdeb5635f122761e2ce2d3f52885b6 RT# 82132 - updated selfservice login to use config username-uppercase --- diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index e8130160b..4e2eb1b31 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -217,9 +217,9 @@ sub login { my $p = shift; my $conf = new FS::Conf; - my $svc_x = ''; my $session = {}; + if ( $p->{'domain'} eq 'svc_phone' && $conf->exists('selfservice_server-phone_login') ) { @@ -238,15 +238,28 @@ sub login { $svc_x = $svc_phone; } elsif ( $p->{email} - && (my $contact = FS::contact->by_selfservice_email($p->{email})) + && (my $contact = FS::contact->by_selfservice_email($p->{email},'case_insensitive')) ) { + my @customers = grep $_->selfservice_access, $contact->cust_contact; + my @cust_contact; + + foreach my $customer (@customers) { + if ($conf->exists('username-uppercase') || $conf->exists('username-uppercase', $customer->cust_main->agentnum)) { + my $check_contact = FS::contact->by_selfservice_email_custnum($p->{email}, $customer->custnum); + push @cust_contact, $customer if $check_contact; + } + else { push @cust_contact, $customer; } + } + + return { error => 'Email '.$p->{email}.' not found!'} + unless @cust_contact; + return { error => 'Incorrect contact password.' } unless $contact->authenticate_password($p->{'password'}); $session->{'contactnum'} = $contact->contactnum; - my @cust_contact = grep $_->selfservice_access, $contact->cust_contact; if ( scalar(@cust_contact) == 1 ) { $session->{'custnum'} = $cust_contact[0]->custnum; } elsif ( scalar(@cust_contact) ) { diff --git a/FS/FS/contact.pm b/FS/FS/contact.pm index 9775e7f6b..26f39eda5 100644 --- a/FS/FS/contact.pm +++ b/FS/FS/contact.pm @@ -828,7 +828,38 @@ or there isn't one, returns the empty string. =cut sub by_selfservice_email { - my($class, $email) = @_; + my($class, $email, $case_insensitive) = @_; + + my $email_search = "emailaddress = '".$email."'"; + $email_search = "LOWER(emailaddress) = LOWER('".$email."')" if $case_insensitive; + + my $contact_email = qsearchs({ + 'table' => 'contact_email', + 'addl_from' => ' LEFT JOIN contact USING ( contactnum ) ', + 'extra_sql' => " + WHERE $email_search + AND ( contact.disabled IS NULL ) + AND EXISTS ( SELECT 1 FROM cust_contact + WHERE contact.contactnum = cust_contact.contactnum + AND cust_contact.selfservice_access = 'Y' + ) + ", + }) or return ''; + + $contact_email->contact; + +} + +=item by_selfservice_email_custnum EMAILADDRESS, CUSTNUM + +Alternate search constructor (class method). Given an email address and custnum, returns +the contact for that address and custnum. If that contact doesn't have selfservice access, +or there isn't one, returns the empty string. + +=cut + +sub by_selfservice_email_custnum { + my($class, $email, $custnum) = @_; my $contact_email = qsearchs({ 'table' => 'contact_email', @@ -839,6 +870,7 @@ sub by_selfservice_email { AND EXISTS ( SELECT 1 FROM cust_contact WHERE contact.contactnum = cust_contact.contactnum AND cust_contact.selfservice_access = 'Y' + AND cust_contact.custnum = $custnum ) ", }) or return '';