[dw-free] email alias code cleanup
[commit: http://hg.dwscoalition.org/dw-free/rev/d1255b65ba6a]
http://bugs.dwscoalition.org/show_bug.cgi?id=3176
New convenience method: $u->site_email_alias (no error/priv-checking, just
outputs in the appropriate format). Move emailcheck.pl to LJ::check_email in
LJ::User.
Patch by
kareila.
Files modified:
http://bugs.dwscoalition.org/show_bug.cgi?id=3176
New convenience method: $u->site_email_alias (no error/priv-checking, just
outputs in the appropriate format). Move emailcheck.pl to LJ::check_email in
LJ::User.
Patch by
![[personal profile]](https://www.dreamwidth.org/img/silk/identity/user.png)
Files modified:
- bin/moveucluster.pl
- cgi-bin/LJ/User.pm
- cgi-bin/emailcheck.pl
- cgi-bin/modperl_subs.pl
- htdocs/manage/profile/index.bml
- htdocs/tools/tellafriend.bml
- t/console-reset.t
-------------------------------------------------------------------------------- diff -r 902e293aa620 -r d1255b65ba6a bin/moveucluster.pl --- a/bin/moveucluster.pl Wed Nov 03 13:18:06 2010 +0800 +++ b/bin/moveucluster.pl Wed Nov 03 13:25:31 2010 +0800 @@ -523,7 +523,7 @@ sub moveUser { $dbh->do("DELETE FROM domains WHERE userid = ?", undef, $u->id); $dbh->do("DELETE FROM email_aliases WHERE alias = ?", - undef, "$u->{user}\@$LJ::USER_DOMAIN"); + undef, $u->site_email_alias ); $dbh->do("DELETE FROM userinterests WHERE userid = ?", undef, $u->id); $dbh->do("DELETE FROM comminterests WHERE userid = ?", undef, $u->id); $dbh->do("DELETE FROM syndicated WHERE userid = ?", undef, $u->id); diff -r 902e293aa620 -r d1255b65ba6a cgi-bin/LJ/User.pm --- a/cgi-bin/LJ/User.pm Wed Nov 03 13:18:06 2010 +0800 +++ b/cgi-bin/LJ/User.pm Wed Nov 03 13:25:31 2010 +0800 @@ -345,7 +345,7 @@ sub delete_and_purge_completely { $dbh->do("DELETE FROM wt_edges WHERE from_userid = ? OR to_userid = ?", undef, $u->id, $u->id); $dbh->do("DELETE FROM reluser WHERE targetid=?", undef, $u->id); - $dbh->do("DELETE FROM email_aliases WHERE alias=?", undef, $u->user . "\@$LJ::USER_DOMAIN"); + $dbh->do("DELETE FROM email_aliases WHERE alias=?", undef, $u->site_email_alias); $dbh->do("DELETE FROM community WHERE userid=?", undef, $u->id) if $u->is_community; @@ -4301,13 +4301,11 @@ sub accounts_by_email { sub delete_email_alias { - my $u = shift; - - return if exists $LJ::FIXED_ALIAS{$u->user}; + my $u = $_[0]; my $dbh = LJ::get_db_writer(); $dbh->do( "DELETE FROM email_aliases WHERE alias=?", - undef, $u->user . "\@$LJ::USER_DOMAIN" ); + undef, $u->site_email_alias ); return 0 if $dbh->err; return 1; @@ -4392,7 +4390,7 @@ sub emails_visible { } if ( $whatemail eq "B" || $whatemail eq "V" || $whatemail eq "L" ) { - push @emails, $u->user . "\@$LJ::USER_DOMAIN" + push @emails, $u->site_email_alias unless $u->prop( 'no_mail_alias' ); } return wantarray ? @emails : $emails[0]; @@ -4478,17 +4476,23 @@ sub set_email { } +sub site_email_alias { + my $u = $_[0]; + my $alias = $u->user . "\@$LJ::USER_DOMAIN"; + return $alias; +} + + sub update_email_alias { - my $u = shift; + my $u = $_[0]; return unless $u && $u->can_have_email_alias; - return if exists $LJ::FIXED_ALIAS{$u->user}; return if $u->prop("no_mail_alias"); return unless $u->is_validated; my $dbh = LJ::get_db_writer(); $dbh->do( "REPLACE INTO email_aliases (alias, rcpt) VALUES (?,?)", - undef, $u->user . "\@$LJ::USER_DOMAIN", $u->email_raw ); + undef, $u->site_email_alias, $u->email_raw ); return 0 if $dbh->err; return 1; @@ -5082,7 +5086,7 @@ sub ljtalk_id { my $u = shift; croak "Invalid user object passed" unless LJ::isu($u); - return $u->user . '@' . $LJ::USER_DOMAIN; + return $u->site_email_alias; } @@ -8572,6 +8576,89 @@ sub rate_log =head2 Email-Related Functions (LJ) =cut +# <LJFUNC> +# name: LJ::check_email +# des: checks for and rejects bogus e-mail addresses. +# info: Checks that the address is of the form username@some.domain, +# does not contain invalid characters. in the username, is a valid domain. +# Also checks for mis-spellings of common webmail providers, +# and web addresses instead of an e-mail address. +# args: +# returns: nothing on success, or error with error message if invalid/bogus e-mail address +# </LJFUNC> +sub check_email +{ + my ($email, $errors) = @_; + + # Trim off whitespace and force to lowercase. + $email =~ s/^\s+//; + $email =~ s/\s+$//; + $email = lc $email; + + my $reject = sub { + my $errcode = shift; + my $errmsg = shift; + # TODO: add $opts to end of check_email and make option + # to either return error codes, or let caller supply + # a subref to resolve error codes into native language + # error messages (probably via BML::ML hash, or something) + push @$errors, $errmsg; + return; + }; + + # Empty email addresses are not good. + unless ($email) { + return $reject->("empty", + "Your email address cannot be blank."); + } + + # Check that the address is of the form username@some.domain. + my ($username, $domain); + if ($email =~ /^([^@]+)@([^@]+)/) { + $username = $1; + $domain = $2; + } else { + return $reject->("bad_form", + "You did not give a valid email address. An email address looks like username\@some.domain"); + } + + # Check the username for invalid characters. + unless ($username =~ /^[^\s\",;\(\)\[\]\{\}\<\>]+$/) { + return $reject->("bad_username", + "You have invalid characters in your email address username."); + } + + # Check the domain name. + unless ($domain =~ /^[\w-]+(\.[\w-]+)*\.(ac|ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|info|int|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$/) + { + return $reject->("bad_domain", + "Your email address domain is invalid."); + } + + # Catch misspellings of hotmail.com + if ($domain =~ /^(otmail|hotmial|hotmil|hotamail|hotmaul|hoatmail|hatmail|htomail)\.(cm|co|com|cmo|om)$/ or + $domain =~ /^hotmail\.(cm|co|om|cmo)$/) + { + return $reject->("bad_hotmail_spelling", + "You gave $email as your email address. Are you sure you didn't mean hotmail.com?"); + } + + # Catch misspellings of aol.com + elsif ($domain =~ /^(ol|aoll)\.(cm|co|com|cmo|om)$/ or + $domain =~ /^aol\.(cm|co|om|cmo)$/) + { + return $reject->("bad_aol_spelling", + "You gave $email as your email address. Are you sure you didn't mean aol.com?"); + } + + # Catch web addresses (two or more w's followed by a dot) + elsif ($username =~ /^www*\./) + { + return $reject->("web_address", + "You gave $email as your email address, but it looks more like a web address to me."); + } +} + sub set_email { my ($userid, $email) = @_; diff -r 902e293aa620 -r d1255b65ba6a cgi-bin/emailcheck.pl --- a/cgi-bin/emailcheck.pl Wed Nov 03 13:18:06 2010 +0800 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,106 +0,0 @@ -#!/usr/bin/perl -# This code was forked from the LiveJournal project owned and operated -# by Live Journal, Inc. The code has been modified and expanded by -# Dreamwidth Studios, LLC. These files were originally licensed under -# the terms of the license supplied by Live Journal, Inc, which can -# currently be found at: -# -# http://code.livejournal.org/trac/livejournal/browser/trunk/LICENSE-LiveJournal.txt -# -# In accordance with the original license, this code and all its -# modifications are provided under the GNU General Public License. -# A copy of that license can be found in the LICENSE file included as -# part of this distribution. -# -# -# Function to reject bogus email addresses -# - -package LJ; -use strict; - -# <LJFUNC> -# name: LJ::check_email -# des: checks for and rejects bogus e-mail addresses. -# info: Checks that the address is of the form username@some.domain, -# does not contain invalid characters. in the username, is a valid domain. -# Also checks for mis-spellings of common webmail providers, -# and web addresses instead of an e-mail address. -# args: -# returns: nothing on success, or error with error message if invalid/bogus e-mail address -# </LJFUNC> -sub check_email -{ - my ($email, $errors) = @_; - - # Trim off whitespace and force to lowercase. - $email =~ s/^\s+//; - $email =~ s/\s+$//; - $email = lc $email; - - my $reject = sub { - my $errcode = shift; - my $errmsg = shift; - # TODO: add $opts to end of check_email and make option - # to either return error codes, or let caller supply - # a subref to resolve error codes into native language - # error messages (probably via BML::ML hash, or something) - push @$errors, $errmsg; - return; - }; - - # Empty email addresses are not good. - unless ($email) { - return $reject->("empty", - "Your email address cannot be blank."); - } - - # Check that the address is of the form username@some.domain. - my ($username, $domain); - if ($email =~ /^([^@]+)@([^@]+)/) { - $username = $1; - $domain = $2; - } else { - return $reject->("bad_form", - "You did not give a valid email address. An email address looks like username\@some.domain"); - } - - # Check the username for invalid characters. - unless ($username =~ /^[^\s\",;\(\)\[\]\{\}\<\>]+$/) { - return $reject->("bad_username", - "You have invalid characters in your email address username."); - } - - # Check the domain name. - unless ($domain =~ /^[\w-]+(\.[\w-]+)*\.(ac|ad|ae|aero|af|ag|ai|al|am|an|ao|aq|ar|arpa|as|at|au|aw|az|ba|bb|bd|be|bf|bg|bh|bi|biz|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|com|coop|cr|cu|cv|cx|cy|cz|de|dj|dk|dm|do|dz|ec|edu|ee|eg|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gov|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|info|int|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mil|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|museum|mv|mw|mx|my|mz|na|name|nc|ne|net|nf|ng|ni|nl|no|np|nr|nu|nz|om|org|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|pro|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|sk|sl|sm|sn|so|sr|st|su|sv|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|um|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)$/) - { - return $reject->("bad_domain", - "Your email address domain is invalid."); - } - - # Catch misspellings of hotmail.com - if ($domain =~ /^(otmail|hotmial|hotmil|hotamail|hotmaul|hoatmail|hatmail|htomail)\.(cm|co|com|cmo|om)$/ or - $domain =~ /^hotmail\.(cm|co|om|cmo)$/) - { - return $reject->("bad_hotmail_spelling", - "You gave $email as your email address. Are you sure you didn't mean hotmail.com?"); - } - - # Catch misspellings of aol.com - elsif ($domain =~ /^(ol|aoll)\.(cm|co|com|cmo|om)$/ or - $domain =~ /^aol\.(cm|co|om|cmo)$/) - { - return $reject->("bad_aol_spelling", - "You gave $email as your email address. Are you sure you didn't mean aol.com?"); - } - - # Catch web addresses (two or more w's followed by a dot) - elsif ($username =~ /^www*\./) - { - return $reject->("web_address", - "You gave $email as your email address, but it looks more like a web address to me."); - } -} - -1; - diff -r 902e293aa620 -r d1255b65ba6a cgi-bin/modperl_subs.pl --- a/cgi-bin/modperl_subs.pl Wed Nov 03 13:18:06 2010 +0800 +++ b/cgi-bin/modperl_subs.pl Wed Nov 03 13:25:31 2010 +0800 @@ -87,7 +87,6 @@ use LJ::CleanHTML; use LJ::CleanHTML; use LJ::Talk; require "ljfeed.pl"; -require "emailcheck.pl"; require "ljmemories.pl"; require "ljmail.pl"; require "sysban.pl"; diff -r 902e293aa620 -r d1255b65ba6a htdocs/manage/profile/index.bml --- a/htdocs/manage/profile/index.bml Wed Nov 03 13:18:06 2010 +0800 +++ b/htdocs/manage/profile/index.bml Wed Nov 03 13:25:31 2010 +0800 @@ -331,7 +331,7 @@ body<= $ret .= "<tr class='field_block'><td class='field_name'>"; $ret .= BML::ml( '.fn.email.site', { siteabbrev => $LJ::SITENAMEABBREV } ); $ret .= "</td><td class='" . $zebra_row1->() . "' style='vertical-align: middle'>\n"; - $ret .= $u->username . "\@$LJ::USER_DOMAIN"; + $ret .= $u->site_email_alias; $ret .= "</td><td class='selectvis" . $zebra_row2->() . "'>"; # this is where we get BVL back my $checked = ( $u->opt_whatemailshow =~ /[BVL]/ ) ? 'Y' : 'N'; diff -r 902e293aa620 -r d1255b65ba6a htdocs/tools/tellafriend.bml --- a/htdocs/tools/tellafriend.bml Wed Nov 03 13:18:06 2010 +0800 +++ b/htdocs/tools/tellafriend.bml Wed Nov 03 13:25:31 2010 +0800 @@ -48,7 +48,7 @@ _c?> my $u = LJ::load_userid($remote->{'userid'}); $u->{'emailpref'} = $u->email_raw; if ( $u->can_have_email_alias ) { - $u->{'emailpref'} = $u->{'user'} . '@' . $LJ::USER_DOMAIN; + $u->{'emailpref'} = $u->site_email_alias; } # Email not validated diff -r 902e293aa620 -r d1255b65ba6a t/console-reset.t --- a/t/console-reset.t Wed Nov 03 13:18:06 2010 +0800 +++ b/t/console-reset.t Wed Nov 03 13:25:31 2010 +0800 @@ -3,7 +3,6 @@ use Test::More; use Test::More; use lib "$ENV{LJHOME}/cgi-bin"; require 'ljlib.pl'; -require "emailcheck.pl"; use LJ::Console; use LJ::Test qw (temp_user); local $LJ::T_NO_COMMAND_PRINT = 1; @@ -57,24 +56,25 @@ ok($u2->password ne $oldpass, "Password # ------ EMAIL ALIASES ---------- my $user = $u2->user; +my $alias = $u2->site_email_alias; is($run->("email_alias show $user"), "error: You are not authorized to run this command."); $u->grant_priv("reset_email"); is($run->("email_alias show $user"), - "error: $user\@$LJ::USER_DOMAIN is not currently defined."); + "error: $alias is not currently defined."); is($run->("email_alias set $user testing\@example.com"), - "success: Successfully set $user\@$LJ::USER_DOMAIN => testing\@example.com"); + "success: Successfully set $alias => testing\@example.com"); is($run->("email_alias show $user"), - "success: $user\@$LJ::USER_DOMAIN aliases to testing\@example.com"); + "success: $alias aliases to testing\@example.com"); is($run->("email_alias delete $user"), - "success: Successfully deleted $user\@$LJ::USER_DOMAIN alias."); + "success: Successfully deleted $alias alias."); is($run->("email_alias show $user"), - "error: $user\@$LJ::USER_DOMAIN is not currently defined."); + "error: $alias is not currently defined."); $u->revoke_priv("reset_email"); --------------------------------------------------------------------------------