X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FPromulger%2FDispatch.pm;h=55b11cf5164149ee94530b1926b3f68fffafa125;hb=8ad89cb2224232bdaad52a71ccb11e6855e59463;hp=36fc651a93cd5664f092c496a3aec2770dc3c7ca;hpb=e93133c754102001828fe572104327f7fe6aead5;p=p5sagit%2FPromulger.git diff --git a/lib/Promulger/Dispatch.pm b/lib/Promulger/Dispatch.pm index 36fc651..55b11cf 100644 --- a/lib/Promulger/Dispatch.pm +++ b/lib/Promulger/Dispatch.pm @@ -2,6 +2,7 @@ package Promulger::Dispatch; use strict; use warnings; +use Email::Address; use Email::Simple; # XXX allow the user to specify their own Email::Sender::Transport -- apeiron, # 2010-03-13 @@ -12,62 +13,70 @@ use Promulger::Config; # XXX no bounce parsing yet -- apeiron, 2010-03-13 sub dispatch { - my($message) = @_; + my ($message) = @_; my $config = Promulger::Config->config; my $email = Email::Simple->new($message); my $recipient = $email->header('To'); + my $local_user = user_for_address($recipient); my $sender = $email->header('From'); my $subject = $email->header('Subject'); - my $list = Promulger::List->resolve($recipient); + my $list = Promulger::List->resolve($local_user); unless($list) { reject($recipient, $sender); + return; } - if($recipient =~ /-request$/) { - handle_request($list, $sender, $recipient, $subject, $config); + if($local_user =~ /-request$/) { + handle_request($list, $sender, $local_user, $subject, $config); + return; } # they don't have a request for us, so they want to post a message post_message($list, $email, $config); + return; } sub handle_request { my ($list, $sender, $recipient, $subject) = @_; - if($subject =~ /^subscribe/i) { - $list->subscribe($sender) - or already_subscribed($list, $sender); - } elsif($subject =~ /^unsubscribe/i) { - $list->unsubscribe($sender) - or not_subscribed($list, $sender); + my $sender_address = bare_address($sender); + if($subject =~ /^\s*subscribe/i) { + $list->subscribe($sender_address) + or already_subscribed($list, $recipient, $sender_address); + } elsif($subject =~ /^\s*unsubscribe/i) { + $list->unsubscribe($sender_address) + or not_subscribed($list, $recipient, $sender_address); } } sub post_message { - my($list, $email, $config) = @_; + my ($list, $email, $config) = @_; my $sender = $email->header('From'); + my $sender_address = bare_address($sender); my $recipient = $email->header('To'); - reject($recipient, $sender) unless $list->accept_posts_from($sender); - reject($recipient, $sender) unless $list->active; + unless($list->accept_posts_from($sender_address) && $list->active) { + reject($recipient, $sender); + return; + } # they're allowed to post (subscribed or not), the list is active. let's do # this thing. # XXX no MIME or other fancy handling for now -- apeiron, 2010-03-13 my $body = $email->body; - for my $subscriber ($list->subscribers) { - my $verped_from = Mail::Verp->encode($list->address, $subscriber); + for my $subscriber (keys %{$list->subscribers}) { + #my $verped_from = Mail::Verp->encode($recipient, $subscriber); # XXX we let the MTA create the message-id for us for now -- apeiron, # 2010-03-13 my $new_message = Email::Simple->create( header => [ - From => $verped_from, + From => $recipient, To => $subscriber, - Subject => $email->subject, + Subject => $email->header('Subject'), ], body => $body, ); @@ -79,7 +88,7 @@ sub post_message { # XXX make this actually not suck -- apeiron, 2010-03-13 sub reject { - my($recipient, $sender) = @_; + my ($recipient, $sender) = @_; my $email = Email::Simple->create( header => [ From => $recipient, @@ -94,35 +103,46 @@ BODY } sub not_subscribed { - my($list, $sender) = @_; - my $list_address = $list->address; + my ($list, $recipient, $sender) = @_; my $email = Email::Simple->create( + # XXX need admin address header => [ - From => $list->admin_address, + From => $recipient, To => $sender, Subject => 'Not subscribed', ], body => <address; + my ($list, $recipient, $sender) = @_; my $email = Email::Simple->create( header => [ - From => $list->admin_address, + From => $recipient, To => $sender, Subject => 'Already subscribed', ], body => <parse($full_addr); + return $addr_obj->address; +} + +sub user_for_address { + my ($full_addr) = @_; + my ($addr_obj) = Email::Address->parse($full_addr); + return $addr_obj->user; +} + 'http://www.shadowcat.co.uk/blog/matt-s-trout/oh-subdispatch-oh-subdispatch/';