Apache-App-Mercury
view release on metacpan or search on metacpan
# set up and preparation - independent of page
$self->get_mailboxes;
my $box = $self->{'current_box'} = $self->get_current_mailbox;
my $need_sort;
if ($args{$box.'_sortby'} and
$args{$box.'_sortby'} ne ($self->{$box}->{'sortby'} .
($self->{$box}->{'sortdir'}
? '__'.$self->{$box}->{'sortdir'} : ''))) {
my ($sort, $updown) = split('__', $args{$box.'_sortby'});
$need_sort = $self->set_sortby(undef, $sort, $updown);
} elsif (!$self->{$box}->{'sortby'}) {
$need_sort = $self->set_sortby;
}
# hit database if user wants or if more than 10 minutes has past since last
if ($q->param('check_mail') or !$self->{'last_mail_check'} or
$controller->get_time > $self->{'last_mail_check'}+600) {
$self->check_mail;
$need_sort = 0; # since mail checking automtically sorts
}
# cannot sort until boxes are made (by checkmail)
# but only sort if sortby was changed and mail was not checked
$self->sort_mailbox if $need_sort;
# actions, non-displaying
if ($q->param('delete')) {
$self->delete_messages;
} elsif ($q->param('transfer')) {
$self->transfer_messages;
}
# change state if we're now trying to view messages in an empty mailbox
$self->{'state'} = 'message_center'
if ($self->{'state'} eq 'view_messages' and
$#{$self->{$box}->{'index'}} < 0);
# outputting and page creation
if ($q->param('cancel')) {
$self->cancel_operation;
$self->{'state'} = 'message_center';
$self->show_mail_center;
$controller->sitemark('/messaging');
} elsif ($q->param('message_center')) {
$self->{'state'} = 'message_center';
$self->show_mail_center;
$controller->sitemark('/messaging');
} elsif ($self->{'state'} eq 'edit_settings' or $args{'edit_mail_prefs'}) {
if ($q->param('add_box')) {
if ($self->verify_new_mailbox($q->param('new_box'))) {
$self->add_new_mailbox($q->param('new_box'));
$self->checkmail;
$q->delete('new_box');
}
} elsif ($q->param('delete_box')) {
$self->delete_mailbox($q->param('custom_box'),
$q->param('delete_mail_in_box'));
$self->checkmail;
$q->delete('custom_box');
$q->delete('delete_mail_in_box');
} elsif ($q->param('commit_filter')) {
$self->edit_filters;
$self->checkmail;
# $q->delete('trans_filter');
} elsif ($q->param('update_auto_forward')) {
$self->update_auto_forward;
$self->checkmail;
}
$self->{'state'} = 'edit_settings';
$self->show_mail_settings;
$controller->sitemark('/messaging.settings');
} elsif ($self->{'state'} eq 'compose_message') {
$self->save_compose_message_fields;
$controller->sitemark('/messaging.compose');
$controller->infomsg("You must take action on your existing composition before creating a transaction-related message.")
if ($q->param('reply_trans') or $q->param('compose_trans'));
if ($q->param('preview')) {
my ($fail, $recip, $recip_desc) =
$self->verify_recipient($self->{compose_msg}->{'sent_to'}, 1);
unless ($fail) {
$self->{compose_msg}->{'sent_to'} = $recip;
$self->{compose_msg}->{'recipient_desc'} = $recip_desc;
$self->{'state'} = 'preview_message';
$self->show_mail_preview;
$controller->sitemark('/messaging.preview');
return;
}
} elsif ($q->param('return')) {
$controller->infomsg("Your composition has been saved in memory. It will be removed when you log out.");
$self->{'state'} = 'message_center';
$self->show_mail_center;
$controller->sitemark('/messaging');
return;
} elsif ($q->param('reset')) {
$self->reset_compose_message;
} elsif ($q->param('change_recip')) {
$self->{compose_msg}->{'action'} .= "-changed_recip";
} elsif ($q->param('memo')) {
$self->{compose_msg}->{'sent_to'} = $self->{user_manager}->userprofile('user');
$self->{compose_msg}->{'recipient_desc'} = $self->{user_manager}->userprofile('user_desc');
} elsif ($q->param('nonmemo')) {
$self->{compose_msg}->{'sent_to'} = '';
$self->{compose_msg}->{'recipient_desc'} = '';
} elsif (defined (my $attach_no = $q->param('remove_attach'))) {
splice(@{$self->{compose_msg}->{'Attachments'}}, $attach_no, 1);
}
$self->show_mail_compose;
} elsif ($self->{'state'} eq 'preview_message') {
$self->save_compose_message_fields;
$controller->sitemark('/messaging.preview');
$controller->infomsg("You must take action on your existing composition before creating a transaction-related message.")
if ($q->param('reply_trans') or $q->param('compose_trans'));
if ($q->param('send')) {
$self->{'state'} = 'message_center';
$self->message_send;
$self->check_mail;
$self->show_mail_center;
$controller->sitemark('/messaging');
} elsif ($q->param('make_changes')) {
$self->{'state'} = 'compose_message';
$self->show_mail_compose;
$controller->sitemark('/messaging.compose');
} elsif ($q->param('return')) {
$controller->infomsg("Your composition has been saved in memory. It will be removed when you log out.");
$self->{'state'} = 'message_center';
$self->show_mail_center;
$controller->sitemark('/messaging');
} else {
$self->show_mail_preview;
}
} elsif ($q->param('compose') or $q->param('compose_trans')) {
if (ref $self->{compose_msg} ne "Apache::App::Mercury::Message") {
$self->reset_compose_message;
$self->{compose_msg}->{'transcode'} = $q->param('transcode')
if $q->param('compose_trans');
} elsif ($q->param('compose_trans')) {
$controller->infomsg("You must take action on your saved composition before creating a new transaction-related message.");
}
$self->{'state'} = 'compose_message';
$self->show_mail_compose;
$controller->sitemark('/messaging.compose');
} elsif ($args{'mailto'}) {
if (ref $self->{compose_msg} ne "Apache::App::Mercury::Message") {
$self->reset_compose_message;
my ($fail, $recip, $recip_desc) =
$self->verify_recipient($args{'mailto'}, 1);
unless ($fail) {
$self->{compose_msg}->{'action'} = 'mailto';
$self->{compose_msg}->{'sent_to'} = $recip;
$self->{compose_msg}->{'recipient_desc'} = $recip_desc;
}
} else {
$controller->infomsg("You must take action on your saved composition before creating a new message.");
}
$self->{'state'} = 'compose_message';
$self->show_mail_compose;
$controller->sitemark('/messaging.compose');
} elsif ($self->{'state'} eq 'view_messages' or defined $args{'read'} or
$q->param('reply_trans') or
($self->{'cur_index'} and ($q->param('read_prev') or
$q->param('read_next')))) {
$self->set_current_index($args{'read'});
$self->{'state'} = 'compose_message';
$controller->sitemark('/messaging.compose');
if ($q->param('print')) {
$self->{'state'} = 'view_messages';
$controller->sitemark('/messaging.print');
$self->show_mail_print_message;
$self->make_read;
} elsif ($q->param('reply') or $q->param('reply_trans')) {
if (ref $self->{compose_msg} ne "Apache::App::Mercury::Message") {
$self->reset_compose_message;
unless ($self->set_compose_reply
($self->retrieve_message($q->param('msg_id')))) {
$self->show_mail_message;
return;
}
} else {
$controller->infomsg("You must take action on your saved composition before creating a new message reply.");
}
$self->show_mail_compose;
} elsif ($q->param('forward')) {
if (ref $self->{compose_msg} ne "Apache::App::Mercury::Message") {
$self->reset_compose_message;
$self->set_compose_forward
($self->retrieve_message($q->param('msg_id')));
} else {
$controller->infomsg("You must take action on your saved composition before creating a new message forward.");
}
$self->show_mail_compose;
} elsif ($q->param('re-send')) {
if (ref $self->{compose_msg} ne "Apache::App::Mercury::Message") {
$self->reset_compose_message;
$self->set_compose_resend
($self->retrieve_message($q->param('msg_id')));
} else {
$controller->infomsg("You must take action on your saved composition before creating a new message re-send.");
}
$self->show_mail_compose;
} else {
$self->{'state'} = 'view_messages';
if ($box ne 'outbox' and
$self->{$box}->{'msgs'}->{$msg}->{'status'} eq 'unread') {
if ($self->change_status(undef, 'read', undef, $msg)) {
$self->check_mail;
}
}
}
sub retrieve_message {
my ($self, $id) = @_;
my $msgs = $self->{$self->{'current_box'}}->{'msgs'};
return undef unless defined $id;
# retrieve it from memory if its easily accessible
return $msgs->{$id} if ref $msgs->{$id} eq "Apache::App::Mercury::Message";
# otherwise get out of table (for transactions)
return $self->get_messages(undef, undef, [ $id ])->{$id};
}
sub save_compose_message_fields {
my ($self) = @_;
my $q = $self->{q};
$self->{compose_msg}->{'sent_to'} = $q->param('recipient')
if defined $q->param('recipient');
$self->{compose_msg}->{'subject'} = $q->param('subject')
if defined $q->param('subject');
$self->{compose_msg}->{'body'} = $q->param('body')
if defined $q->param('body');
$self->{compose_msg}->{'num_to_attach'} =
$q->param('num_files_to_attach')
if defined $q->param('num_files_to_attach');
$self->{compose_msg}->{'security'} = $q->param('security')
if defined $q->param('security');
}
sub reset_compose_message {
my ($self) = @_;
my $q = $self->{q};
$self->{compose_msg} = Apache::App::Mercury::Message->new
({ 'sender' => $self->{user_manager}->userprofile('user') });
$self->{compose_msg}->initialize($self);
$self->{compose_msg}->{'action'} = 'new';
$self->{compose_msg}->{'subject'} = '';
$self->{compose_msg}->{'sent_to'} = '';
$self->{compose_msg}->{'recipient_desc'} = '';
$self->{compose_msg}->{'transcode'} = '';
$self->{compose_msg}->{'body'} = '';
delete $self->{compose_msg}->{'Attachments'};
}
sub set_compose_reply {
my ($self, $origmsg) = @_;
my $new = $self->{compose_msg};
my ($fail, $recip, $recip_desc) =
$self->verify_recipient($origmsg->{'sender'}, 1);
return 0 if $fail;
$new->{'action'} = 'reply';
$new->{'subject'} = "Re: ".$origmsg->{'subject'};
$new->{'sent_to'} = $recip;
$new->{'recipient_desc'} = $recip_desc;
$new->{'transcode'} = $origmsg->{'transcode'};
$new->{'body'} = $origmsg->{'sender'}." wrote:\n\n".$origmsg->{'body'};
$new->{'body'} =~ s/^/> /gm;
$new->{'body'} = "\n\n\n".$new->{'body'};
$new->{'security'} = $origmsg->{'security'};
$new->{'security_fixed'} = 1 if $origmsg->{'security_fixed'};
$new->{'Attachments'} = dclone $origmsg->{'Attachments'}
if ref $origmsg->{'Attachments'} eq "ARRAY";
return 1;
}
sub set_compose_forward {
my ($self, $origmsg) = @_;
my $new = $self->{compose_msg};
$new->{'action'} = 'forward';
$new->{'subject'} = "Fwd: ".$origmsg->{'subject'};
$new->{'sent_to'} = '';
$new->{'recipient_desc'} = '';
$new->{'transcode'} = $origmsg->{'transcode'};
$new->{'body'} = $origmsg->{'sender'}." wrote:\n\n".$origmsg->{'body'};
$new->{'body'} =~ s/^/> /gm;
$new->{'body'} = "\n\n\n".$new->{'body'};
$new->{'security'} = $origmsg->{'security'};
$new->{'security_fixed'} = 1 if $origmsg->{'security_fixed'};
$new->{'Attachments'} = dclone $origmsg->{'Attachments'}
if ref $origmsg->{'Attachments'} eq "ARRAY";
}
sub set_compose_resend {
my ($self, $origmsg) = @_;
my $new = $self->{compose_msg};
$new->{'action'} = 're-send';
$new->{'subject'} = "Rs: ".$origmsg->{'subject'};
$new->{'sent_to'} = '';
$new->{'recipient_desc'} = '';
$new->{'transcode'} = $origmsg->{'transcode'};
$new->{'body'} = $origmsg->{'body'};
$new->{'security'} = $origmsg->{'security'};
$new->{'security_fixed'} = 1 if $origmsg->{'security_fixed'};
$new->{'Attachments'} = dclone $origmsg->{'Attachments'}
if ref $origmsg->{'Attachments'} eq "ARRAY";
}
sub verify_recipient {
my ($self, $recip, $show_fail_message) = @_;
my $q = $self->{q};
my $controller = $self->{controller};
# remove all whitespace (user_names can't have any)
$recip =~ s/\s//g;
$self->warn("->verify_recipient: checking '$recip'.");
if (!$recip) {
$controller->infomsg("You must enter a recipient.") if $show_fail_message;
return ('fail', undef, undef);
} elsif ($recip eq $self->{user_manager}->userprofile('user')) {
return (0, $self->{user_manager}->userprofile('user'),
"(".$self->{user_manager}->userprofile('user_desc').")");
} else {
my @recps = split(';', $recip);
my @chk_recip = $self->{user_manager}->get_userinfo(@recps);
my ($usrs, $descript);
unless (@chk_recip) {
$controller->infomsg("Unknown user id: " . $recip)
if $show_fail_message;
return ('fail', undef, undef);
}
my $dispclass = Apache::App::Mercury::Config::DISPLAY_CLASS();
foreach (@chk_recip) {
$usrs .= ($usrs ? ';' : '') . $_->{'user'};
$descript .=
(($descript ? '; ' : '') .
($dispclass->can("USER_INFO_HREF")
? $dispclass->USER_INFO_HREF($_->{'user'}, $q)
: '') .
" (" . $_->{'fname'}." ".$_->{'lname'} . ")");
}
$controller->infomsg("Not all user ids were valid. You may wish to ".$q->em("make changes")." and try again.")
if ($show_fail_message and $#recps != $#chk_recip);
return (0, $usrs, $descript);
}
}
sub cancel_operation {
my ($self) = @_;
my $q = $self->{q};
$self->{controller}->infomsg("The previous operation has been cancelled.");
# delete appropriate data and params
$q->delete('cancel');
delete $self->{compose_msg};
}
sub message_send {
my ($self) = @_;
my $q = $self->{q};
my $compose = $self->{compose_msg};
my $is_memo = ($compose->{'sender'} eq $compose->{'sent_to'});
# add to msg object new attachments from CGI POST data that browser sent
$compose->read_attachments_from_cgi;
# tell message object to store itself
if ($compose->store) {
$self->{controller}->infomsg(!$is_memo ? "Your message has been sent." : "Your memo has been committed.");
delete $self->{compose_msg};
} else {
$self->{controller}->infomsg("There was an error ".(!$is_memo ? "sending your message" : "committing your memo").". Please contact technical support.");
}
}
sub verify_new_mailbox {
my ($self, $new_box) = @_;
my $controller = $self->{controller};
# make sure there is a new_box
if (!$new_box) {
$controller->infomsg("You did not enter a name for your new mailbox!");
return 0;
}
# make sure there are no commas
if (($new_box) =~ (m/,/)) {
$controller->infomsg("Sorry, your mailbox names cannot contain commas (,). Please try again.");
return 0;
}
# make sure this mailbox name doesn't already exist
foreach (@{$self->{'mailboxes'}}) {
if (ucfirst($_) eq ucfirst($new_box)) {
$controller->infomsg("You already have a mailbox with the name ".ucfirst($new_box).". Please pick a different name.");
return 0;
}
}
return 1;
}
sub add_new_mailbox {
my ($self, $new_box) = @_;
my $controller = $self->{controller};
my $user = $self->{user_manager}->userprofile('user');
my @old_boxes = $self->{user_manager}->mailboxes;
if ($#old_boxes == 14) {
$controller->infomsg("You already have 15 custom mailboxes, which is the maximum currently allowed.");
return;
}
push(@old_boxes, $new_box);
if ($self->{user_manager}->mailboxes($user, @old_boxes)) {
$controller->infomsg("Mailbox ".ucfirst($new_box)." has been created.");
}
}
sub delete_mailbox {
my ($self, $old_box, $delete_mail_in_box) = @_;
my $controller = $self->{controller};
my $user = $self->{user_manager}->userprofile('user');
my $num_displaced = $#{$self->{$old_box}->{'index'}} + 1;
# get rid of filters, if necessary
$self->remove_filters_for($old_box);
# then move out the mail
if ($delete_mail_in_box) {
$self->change_status(undef, 'deleted', $old_box);
} else {
$self->change_box('inbox', $old_box);
}
my @boxes = $self->{user_manager}->mailboxes;
( run in 3.341 seconds using v1.01-cache-2.11-cpan-13bb782fe5a )