aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/Sietima/MailStore.pm9
-rw-r--r--lib/Sietima/Role/SubscriberOnly.pm5
-rw-r--r--lib/Sietima/Role/SubscriberOnly/Drop.pm3
-rw-r--r--lib/Sietima/Role/SubscriberOnly/Moderate.pm39
-rw-r--r--lib/Sietima/Role/WithAdmin.pm16
-rw-r--r--lib/Sietima/Role/WithMailStore.pm15
-rw-r--r--lib/Sietima/Types.pm3
7 files changed, 88 insertions, 2 deletions
diff --git a/lib/Sietima/MailStore.pm b/lib/Sietima/MailStore.pm
new file mode 100644
index 0000000..2d2b1a7
--- /dev/null
+++ b/lib/Sietima/MailStore.pm
@@ -0,0 +1,9 @@
+package Sietima::MailStore;
+use strict;
+use warnings;
+use 5.020;
+use Moo::Role;
+
+requires 'store','retrieve_by_tags','retrieve_by_id';
+
+1;
diff --git a/lib/Sietima/Role/SubscriberOnly.pm b/lib/Sietima/Role/SubscriberOnly.pm
index 4dcb66c..98c02a6 100644
--- a/lib/Sietima/Role/SubscriberOnly.pm
+++ b/lib/Sietima/Role/SubscriberOnly.pm
@@ -6,13 +6,16 @@ use namespace::clean;
requires 'munge_mail_from_non_subscriber';
+our $let_it_pass=0;
+
around munge_mail => sub {
my ($orig,$self,$mail) = @_;
my $from = (Email::Address->parse(
$mail->header_str('from'),
))[0]->address;
- if ( any { $_->address eq $from } @{$self->subscribers} ) {
+ if ( $let_it_pass or
+ any { $_->address eq $from } @{$self->subscribers} ) {
$self->$orig($mail);
}
else {
diff --git a/lib/Sietima/Role/SubscriberOnly/Drop.pm b/lib/Sietima/Role/SubscriberOnly/Drop.pm
index 91354e5..8db062f 100644
--- a/lib/Sietima/Role/SubscriberOnly/Drop.pm
+++ b/lib/Sietima/Role/SubscriberOnly/Drop.pm
@@ -1,4 +1,7 @@
package Sietima::Role::SubscriberOnly::Drop;
+use strict;
+use warnings;
+use 5.020;
use Moo::Role;
use namespace::clean;
diff --git a/lib/Sietima/Role/SubscriberOnly/Moderate.pm b/lib/Sietima/Role/SubscriberOnly/Moderate.pm
new file mode 100644
index 0000000..107a843
--- /dev/null
+++ b/lib/Sietima/Role/SubscriberOnly/Moderate.pm
@@ -0,0 +1,39 @@
+package Sietima::Role::SubscriberOnly::Moderate;
+use strict;
+use warnings;
+use 5.020;
+use Moo::Role;
+use Email::Stuffer;
+use Email::MIME;
+use namespace::clean;
+
+with 'Sietima::Role::SubscriberOnly',
+ 'Sietima::Role::WithMailStore',
+ 'Sietima::Role::WithAdmin';
+
+sub munge_mail_from_non_subscriber {
+ my ($self,$mail) = @_;
+
+ my $id = $self->mail_store->store($mail,'moderation');
+ my $notice = Email::Stuffer
+ ->from($self->return_path)
+ ->to($self->admin)
+ ->subject("Message held for moderation - ".$mail->header_str('subject'))
+ ->text_body("Use id $id to refer to it")
+ ->attach($mail->as_string, content_type => 'message/rfc822');
+ $self->transport->send($notice->email,{
+ from => $self->return_path,
+ to => [ $self->admin ],
+ });
+ return;
+}
+
+sub resume {
+ my ($self,$mail_id) = @_;
+
+ my $mail = $self->mail_store->retrieve_by_id($mail_id);
+ local $Sietima::Role::SubscriberOnly::let_it_pass=1;
+ $self->handle_mail($mail);
+}
+
+1;
diff --git a/lib/Sietima/Role/WithAdmin.pm b/lib/Sietima/Role/WithAdmin.pm
new file mode 100644
index 0000000..08bf0d2
--- /dev/null
+++ b/lib/Sietima/Role/WithAdmin.pm
@@ -0,0 +1,16 @@
+package Sietima::Role::WithAdmin;
+use strict;
+use warnings;
+use 5.020;
+use Moo::Role;
+use Sietima::Types qw(Address AddressFromStr);
+use namespace::clean;
+
+has admin => (
+ is => 'ro',
+ isa => Address,
+ required => 1,
+ coerce => AddressFromStr,
+);
+
+1;
diff --git a/lib/Sietima/Role/WithMailStore.pm b/lib/Sietima/Role/WithMailStore.pm
new file mode 100644
index 0000000..abee4e2
--- /dev/null
+++ b/lib/Sietima/Role/WithMailStore.pm
@@ -0,0 +1,15 @@
+package Sietima::Role::WithMailStore;
+use strict;
+use warnings;
+use 5.020;
+use Moo::Role;
+use Sietima::Types qw(MailStore);
+use namespace::clean;
+
+has mail_store => (
+ is => 'ro',
+ isa => MailStore,
+ required => 1,
+);
+
+1;
diff --git a/lib/Sietima/Types.pm b/lib/Sietima/Types.pm
index 95d1f88..af3e1c0 100644
--- a/lib/Sietima/Types.pm
+++ b/lib/Sietima/Types.pm
@@ -10,10 +10,11 @@ use Type::Library
-declare => qw(Address AddressFromStr
EmailMIME Message
Subscriber SubscriberFromAddress SubscriberFromStr
- Transport);
+ Transport MailStore);
class_type EmailMIME, { class => 'Email::MIME' };
role_type Transport, { role => 'Email::Sender::Transport' };
+role_type MailStore, { role => 'Sietima::MailStore' };
class_type Address, { class => 'Email::Address' };
declare_coercion AddressFromStr,