Fix multiple email handling in the Inbox.

Put an email regex into WebGUI::Utility, and use it in Form/Email and Account/Inbox.
This commit is contained in:
Colin Kuskie 2009-06-03 17:11:36 +00:00
parent 4bf3f457de
commit 29759ede9c
6 changed files with 111 additions and 53 deletions

View file

@ -3,8 +3,7 @@
- fixed #10450: A different errormessage is given if the username does exist and
does not exist. (Arjan Widlak / United Knowledge)
- fixed: Reverted bugfix for 10409 and changed the hover help to reflect the correct way to build list-type form controls in the MetaData.
- Fixed a problem with graphing created by the newer versions of Image
Magick.
- Fixed a problem with graphing created by the newer versions of Image Magick.
- fixed: Template parser cannot be set
- fixed #10361: Shortcuts duplicate extra header tags
- fixed #10356: SQL report is cached too long
@ -19,12 +18,10 @@
- fixed #10365: Head tags do not work "Use Packed Head Tags".
- fixed #9927: Survey - verbatim
- fixed #10352: Deleting a user does not clean up any address books
- Fixed the problem with Basic Auth that UK fixed, but in a different way
that still allows non-realm based Basic authentication.
- fixed #10228: Calendar: Weekly re-occurence function not working properly
( Martin Kamerbeek / Oqapi )
- fixed #9851: New Users have blank profile field privacy settings (United
Knowledge)
- Fixed the problem with Basic Auth that UK fixed, but in a different way that still allows non-realm based Basic authentication.
- fixed #10228: Calendar: Weekly re-occurence function not working properly ( Martin Kamerbeek / Oqapi )
- fixed #9851: New Users have blank profile field privacy settings (United Knowledge)
- fixed #10208: Account/Inbox.pm site invititations
7.7.8
- fixed: Basic Auth doesn't work if password contains colon (Arjan Widlak,

View file

@ -839,10 +839,6 @@ sub www_inviteUserSave {
my $user = $session->user;
my $i18n = WebGUI::International->new($session,"Account_Inbox");
#Must have a person to send email to
my $to = $form->get('to');
return $self->www_inviteUser($i18n->get('missing email')) unless $to;
#Must have a subject
my $defaultSubject = $setting->get("inboxInviteUserSubject");
WebGUI::Macro::process($session,\$defaultSubject);
@ -861,51 +857,84 @@ sub www_inviteUserSave {
;
return $self->www_inviteUser($i18n->get('missing message')) unless $message;
#User existance check.
my $existingUser = WebGUI::User->newByEmail($session,$to);
if (defined $existingUser) {
my $existingProfile = $existingUser->getProfileUrl;
my $existingUser = $existingUser->username;
my $errorMsg = sprintf($i18n->get('already a member'),$existingProfile,$existingUser);
return $self->www_inviteUser($errorMsg);
}
#Profile Email address check
my $email = $session->user->profileField('email');
unless ($email) {
return $self->www_inviteUser($i18n->get('no email'));
}
#Must have a person to send email to
my $to = $form->get('to');
$to =~ s/\s+//g;
return $self->www_inviteUser($i18n->get('missing email')) unless $to;
# Test all email addresses before sending any
my $db = $session->db;
my @toList = split /[;,]/, $to;
for my $inviteeEmail (@toList) {
unless ( $inviteeEmail =~ WebGUI::Utility::emailRegex ) {
return $self->www_inviteUser( $i18n->get('invalid email') );
}
# User existance check.
my $existingUser = WebGUI::User->newByEmail( $session, $inviteeEmail );
if ( defined $existingUser ) {
my $existingProfile = $existingUser->getProfileUrl;
my $existingUser = $existingUser->username;
my $errorMsg = sprintf( $i18n->get('already a member'), $existingProfile, $existingUser );
return $self->www_inviteUser($errorMsg);
}
# Outstanding Invitation check
my $sth = $db->read( "SELECT email FROM userInvitations WHERE email=?", [$inviteeEmail] );
my ($emailStored) = $sth->array;
if ($emailStored) {
my $errorMsg = sprintf( $i18n->get('currently invited'), $inviteeEmail );
return $self->www_inviteUser($errorMsg);
}
} ## end for my $inviteeEmail (@toList)
# We think the email addresses are good now.
# Create a separate record for each invitee
#
for my $inviteeEmail (@toList) {
my $var = {};
##Create the invitation url for each individual invitation
my $inviteId = $session->id->generate();
$var->{'url'}
= $session->url->append( $session->url->getSiteURL, 'op=auth;method=createAccount;code=' . $inviteId );
##Create the invitation record.
my $now = WebGUI::DateTime->new( $session, DateTime->now->set_time_zone('UTC')->epoch )->toMysqlDate;
my $hash = {
userId => $user->userId,
dateSent => $now,
email => $inviteeEmail,
dateCreated => $now,
};
$session->db->setRow( 'userInvitations', 'inviteId', $hash, $inviteId );
my $invitation = WebGUI::Mail::Send->create(
$session, {
to => $to,
from => $email,
subject => $subject,
}
);
## No sneaky attack paths...
$var->{'message'} = WebGUI::HTML::html2text( WebGUI::HTML::filter($message) );
my $emailBody = $self->processTemplate( $var, $self->getInviteUserMessageTemplateId );
$invitation->addText($emailBody);
$invitation->send;
} ## end for my $inviteeEmail (@toList)
my $var = {};
##No sneaky attack paths...
$var->{'message'} = WebGUI::HTML::html2text(WebGUI::HTML::filter($message));
##Create the invitation url.
my $inviteId = $session->id->generate();
$var->{'url'} = $session->url->append(
$session->url->getSiteURL,'op=auth;method=createAccount;code='.$inviteId
);
my $emailBody = $self->processTemplate($var,$self->getInviteUserMessageTemplateId);
##Create the invitation record.
my $hash = {
userId => $user->userId,
dateSent => WebGUI::DateTime->new($session, time)->toMysqlDate,
email => $to,
};
$session->db->setRow('userInvitations','inviteId',$hash,$inviteId);
my $invitation = WebGUI::Mail::Send->create($session, {
to => $to,
from => $email,
subject => $subject,
});
$invitation->addText($emailBody);
$invitation->send;
$var = {};
$self->appendCommonVars($var);
return $self->processTemplate($var,$self->getInviteUserConfirmTemplateId);
}

View file

@ -17,6 +17,7 @@ package WebGUI::Form::Email;
use strict;
use base 'WebGUI::Form::Text';
use WebGUI::International;
use WebGUI::Utility;
=head1 NAME
@ -65,7 +66,7 @@ An optional value to process instead of POST input.
sub getValue {
my $self = shift;
my $value = @_ ? shift : $self->session->form->param($self->get("name"));
if ($value =~ /^[0-9a-z._%+-]+@(?:[0-9a-z-]+\.)+[a-z]{2,9}$/i) {
if ($value =~ WebGUI::Utility::emailRegex) {
return $value;
}
return undef;

View file

@ -79,6 +79,19 @@ sub commify {
}
#-------------------------------------------------------------------
=head2 emailRegex ( )
Returns a regex object that can be used to validate email addresses.
=cut
sub emailRegex {
return qr/^([0-9a-zA-Z]+[-._+&])*\w+@([-0-9a-zA-Z]+[.])+[a-zA-Z]{2,7}$/;
}
#-------------------------------------------------------------------
=head2 formatBytes ( integer )

View file

@ -470,8 +470,13 @@ our $I18N = {
lastUpdated => 1181409056,
},
'too many emails' => {
message => q|The invitation cannot be sent because you did not enter an email address.|,
lastUpdated => 1181409056,
},
'missing message' => {
message => q|Your invitiation must have a message.|,
message => q|Your invitation must have a message.|,
lastUpdated => 1181409432,
},

View file

@ -17,7 +17,7 @@ use Tie::IxHash;
use WebGUI::Test;
use WebGUI::Session;
use Test::More tests => 44; # increment this value for each test you create
use Test::More tests => 46; # increment this value for each test you create
use Test::Deep;
my $session = WebGUI::Test->session;
@ -140,6 +140,19 @@ is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.257.0.1/32']), undef, 'isInS
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.168.258.1/32']), undef, 'isInSubnet: ip has an out of range quad');
is(WebGUI::Utility::isInSubnet('192.168.0.1', ['192.168.0.259/32']), undef, 'isInSubnet: ip has an out of range quad');
#####################################################################
#
# emailRegex
#
#####################################################################
isa_ok(WebGUI::Utility::emailRegex, 'Regexp');
TODO: {
local $TODO = 'Things to do';
ok(0, 'Move email validation tests out of Form/Email into here');
}
# Local variables:
# mode: cperl
# End: