mourningdove/cgi-bin/LJ/Console/Command/EmailAlias.pm

112 lines
3.6 KiB
Perl
Raw Normal View History

2026-05-24 01:03:05 +00:00
# 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.
package LJ::Console::Command::EmailAlias;
use strict;
use base qw(LJ::Console::Command);
use Carp qw(croak);
sub cmd { "email_alias" }
sub desc { "View and edit email aliases. Requires priv: reset_email." }
sub args_desc {
[
action =>
"One of: 'show' (to view recipient), 'delete' (to delete), or 'set' (to set a value)",
alias => "The first portion of the email alias (eg, just the username)",
value =>
"Value to set the email alias to, if using 'set'. Append '!' to override spell-check.",
]
}
sub usage { '<action> <alias> [ <value> ]' }
sub can_execute {
my $remote = LJ::get_remote();
return $remote && $remote->has_priv("reset_email");
}
sub execute {
my ( $self, $action, $alias, $value, @args ) = @_;
return $self->error("This command takes two or three arguments. Consult the reference.")
unless $action && $alias && scalar(@args) == 0;
return $self->error("Invalid action. Must be either 'show', 'delete', or 'set'.")
unless $action =~ /^(?:show|delete|set)$/;
# canonicalize
$alias =~ s/\@.*//;
$alias .= "@" . $LJ::USER_DOMAIN;
my $dbh = LJ::get_db_writer();
if ( $action eq "set" ) {
my @emails = split( /\s*,\s*/, $value );
return $self->error("You must specify a recipient for the email alias.")
unless scalar(@emails);
$value = join( ",", @emails );
return $self->error("Total length of recipient addresses cannot exceed 200 characters.")
if length $value > 200;
my @errors;
for (@emails) {
my $force_spelling = s/!$//;
# "lj" as a recipient is magical
next if $_ eq 'lj';
my ( $bad_spelling, @errors_here );
LJ::check_email( $_, \@errors_here, { force_spelling => $force_spelling },
\$bad_spelling );
push @errors_here, "Append '!' to override spell-check."
if ( $bad_spelling && !$force_spelling );
@errors = ( @errors, @errors_here );
}
return $self->error( join( "\n", @errors ) ) if @errors;
$dbh->do( "REPLACE INTO email_aliases VALUES (?, ?)", undef, $alias, $value );
return $self->error( "Database error: " . $dbh->errstr )
if $dbh->err;
return $self->print("Successfully set $alias => $value");
}
elsif ( $action eq "delete" ) {
$dbh->do( "DELETE FROM email_aliases WHERE alias=?", undef, $alias );
return $self->error( "Database error: " . $dbh->errstr )
if $dbh->err;
return $self->print("Successfully deleted $alias alias.");
}
else {
my ($rcpt) =
$dbh->selectrow_array( "SELECT rcpt FROM email_aliases WHERE alias=?", undef, $alias );
return $self->error( "Database error: " . $dbh->errstr )
if $dbh->err;
if ($rcpt) {
return $self->print("$alias aliases to $rcpt");
}
else {
return $self->error("$alias is not currently defined.");
}
}
}
1;