From eb2c0c03d10e1561f8bfbea42b29bdf1b165c52b Mon Sep 17 00:00:00 2001 From: Jonathan Prykop Date: Wed, 2 Dec 2015 05:02:17 -0600 Subject: [PATCH] RT#29354: Password Security in Email [xmlhttp validation for selfservice] --- FS/FS/ClientAPI/MyAccount.pm | 39 +++++++++++++++++++ fs_selfservice/FS-SelfService/SelfService.pm | 1 + .../cgi/add_password_validation.html | 36 +++++++++++++++++ .../FS-SelfService/cgi/change_password.html | 12 +++++- fs_selfservice/FS-SelfService/cgi/selfservice.cgi | 11 +++++- .../FS-SelfService/cgi/send_xmlhttp.html | 45 ++++++++++++++++++++++ fs_selfservice/FS-SelfService/cgi/signup.cgi | 28 ++++++++++++++ fs_selfservice/FS-SelfService/cgi/signup.html | 14 ++++++- .../FS-SelfService/cgi/validate_password.html | 9 +++++ httemplate/elements/change_password.html | 2 +- 10 files changed, 191 insertions(+), 6 deletions(-) create mode 100644 fs_selfservice/FS-SelfService/cgi/add_password_validation.html create mode 100644 fs_selfservice/FS-SelfService/cgi/send_xmlhttp.html create mode 100644 fs_selfservice/FS-SelfService/cgi/validate_password.html diff --git a/FS/FS/ClientAPI/MyAccount.pm b/FS/FS/ClientAPI/MyAccount.pm index f50b9f1bf..336482123 100644 --- a/FS/FS/ClientAPI/MyAccount.pm +++ b/FS/FS/ClientAPI/MyAccount.pm @@ -3245,6 +3245,45 @@ sub process_reset_passwd { } +sub validate_passwd { + my $p = shift; + + my %result; + %result = ( 'fieldid' => $p->{'fieldid'} ) + if $p->{'fieldid'} =~ /^\w+$/; + + return { %result, 'password_invalid' => 'Enter new password' } + unless length($p->{'check_password'}); + + my $svc_acct; + if ($p->{'svcnum'}) { + # false laziness with myaccount_passwd + my($context, $session, $custnum) = _custoragent_session_custnum($p); + return { %result, 'error' => $session } if $context eq 'error'; + + $custnum =~ /^(\d+)$/ or die "illegal custnum"; + my $search = " AND custnum = $1"; + $search .= " AND agentnum = ". $session->{'agentnum'} if $context eq 'agent'; + + $svc_acct = qsearchs( { + 'table' => 'svc_acct', + 'addl_from' => 'LEFT JOIN cust_svc USING ( svcnum ) '. + 'LEFT JOIN cust_pkg USING ( pkgnum ) '. + 'LEFT JOIN cust_main USING ( custnum ) ', + 'hashref' => { 'svcnum' => $p->{'svcnum'}, }, + 'extra_sql' => $search, #important + } ) + or return { %result, 'error' => "Service not found" }; + # end false laziness + } + + $svc_acct ||= new FS::svc_acct {}; + + my $error = $svc_acct->is_password_allowed($p->{'check_password'}); + return { %result, 'password_invalid' => $error } if $error; + return { %result, 'password_valid' => 1 }; +} + sub list_tickets { my $p = shift; my($context, $session, $custnum) = _custoragent_session_custnum($p); diff --git a/fs_selfservice/FS-SelfService/SelfService.pm b/fs_selfservice/FS-SelfService/SelfService.pm index 9764ad474..7379452b5 100644 --- a/fs_selfservice/FS-SelfService/SelfService.pm +++ b/fs_selfservice/FS-SelfService/SelfService.pm @@ -95,6 +95,7 @@ $socket .= '.'.$tag if defined $tag && length($tag); 'reset_passwd' => 'MyAccount/reset_passwd', 'check_reset_passwd' => 'MyAccount/check_reset_passwd', 'process_reset_passwd' => 'MyAccount/process_reset_passwd', + 'validate_passwd' => 'MyAccount/validate_passwd', 'list_tickets' => 'MyAccount/list_tickets', 'create_ticket' => 'MyAccount/create_ticket', 'get_ticket' => 'MyAccount/get_ticket', diff --git a/fs_selfservice/FS-SelfService/cgi/add_password_validation.html b/fs_selfservice/FS-SelfService/cgi/add_password_validation.html new file mode 100644 index 000000000..e349fd7ad --- /dev/null +++ b/fs_selfservice/FS-SelfService/cgi/add_password_validation.html @@ -0,0 +1,36 @@ + diff --git a/fs_selfservice/FS-SelfService/cgi/change_password.html b/fs_selfservice/FS-SelfService/cgi/change_password.html index 22d897362..ef665545a 100644 --- a/fs_selfservice/FS-SelfService/cgi/change_password.html +++ b/fs_selfservice/FS-SelfService/cgi/change_password.html @@ -12,7 +12,7 @@ Change password for account: - <%= foreach my $svc ( @svcs ) { $OUT .= '