Show index.html syntax highlighted
% # vim: set syntax=mason:
<%args>
$folder => 'none'
$start => -1
$n => 0
$sortby => 'unknown'
$filter => ''
$search_string => ''
$message => ''
$check => 0
</%args>
<& /mail/header.mhtml, message => $message, refresh => 1, folder => $folder, start => $start, n => $n, sortby => $sortby, title => "Mail - $folder" &>
<script type="text/javascript" language="JavaScript">
<!--
function check_all()
{
document.message_form.uids.checked=1;
for(var i=0; i<document.message_form.uids.length; i++)
document.message_form.uids[i].checked=1;
}
function uncheck_all()
{
document.message_form.uids.checked=0;
for(var i=0; i<document.message_form.uids.length; i++)
document.message_form.uids[i].checked=0;
}
function invert_checks()
{
document.message_form.uids.checked=!document.message_form.uids.checked;
for(var i=0; i<document.message_form.uids.length; i++)
document.message_form.uids[i].checked=!document.message_form.uids[i].checked;
}
function check_read()
{
if(document.message_form.uids.alt == "seen")
document.message_form.uids.checked=1;
else
document.message_form.uids.checked=0;
for(var i=0; i<document.message_form.uids.length; i++)
if(document.message_form.uids[i].alt == "seen")
document.message_form.uids[i].checked=1;
else
document.message_form.uids[i].checked=0;
}
function check_unread()
{
if(document.message_form.uids.alt == "seen")
document.message_form.uids.checked=0;
else
document.message_form.uids.checked=1;
for(var i=0; i<document.message_form.uids.length; i++)
if(document.message_form.uids[i].alt == "seen")
document.message_form.uids[i].checked=0;
else
document.message_form.uids[i].checked=1;
}
// -->
</script>
<form name="message_form" action="<% $base %>/mail/process_messages.html" method="post">
<div class="top_controls">
<div class="index_controls">
<!-- This is a hack. Attempt to make enter key only modify the filter,
instead of defaulting to the other "first" buttons. I don't want
this one to show, so I explicitly move it off-screen.
-->
<input style="zindex=2; position: absolute; left: -20pt; width: 0px;" type="submit" name="altfilt" value="1">
% if($trash eq $folder) {
<input type="submit" name="empty" value="Empty Trash">
% } else {
<input type="submit" name="delete" value="Delete">
% if($trash eq 'none') {
<input type="submit" name="purge" value="Purge Deleted">
% }
% }
<input type="hidden" name="folder" value="<% $folder |h %>">
<input type="hidden" name="uidv" value="<% $uidvalidity |h %>">
<select name="action" onChange="document.message_form.submit()">
<option selected value="none">More Actions ...</option>
% if($trash eq 'none') {
<option value="undelete"> Undelete</option>
% }
<option value="mark"> Flag</option>
<option value="unmark"> Unflag</option>
<option value="unread"> Mark as unread</option>
<option disabled value="none">-----</option>
<option value="report"> Report Spam</option>
% if($trash eq 'none') {
<option disabled value="none">-----</option>
<option value="kill"> Delete and Purge</option>
% }
<optgroup label="Move to:">
% for my $fldr (@alt_folders, @$folderlist) {
% my $displayname = $tr->decode($fldr);
% $displayname =~ s/^\Q$prefix\E//;
<option value="to:<% $fldr |h %>"><% decode('utf8', $displayname) |h %></option>
% }
</optgroup>
</select>
% if(!$user->getAttribute('javascript')) {
<input type="submit" name="nothing" value="Go">
% }
<% hyperlink("$base/mail/index.html", "Refresh") %><br>
</div>
<div class="navright">
% if($start > $n+1) {
<% hyperlink("$base/mail/index.html", "<< First", { start => 1, n => $n, sortby => $sortby , folder => $folder, search_string => $search_string, filter => $filter }, 'unselected') %>
% }
% if($start > 1) {
<% hyperlink("$base/mail/index.html", "< Previous", { start => ($start-$n > 0 ? ($start-$n):1), n => $n, sortby => $sortby, folder => $folder, search_string => $search_string, filter => $filter }, 'unselected') %>
% }
<% $msgcnt ? $start:0 %> - <% $start+$n-1 > $msgcnt ? $msgcnt:($start+$n-1) %> of <% $msgcnt %>
% if(($start+$n) < ($msgcnt+1)) {
<% hyperlink("$base/mail/index.html", "Next >", { start => $start+$n, n => $n, sortby => $sortby , folder => $folder, search_string => $search_string, filter => $filter }, 'unselected') %>
% }
% if($start+2*$n-1 < $msgcnt) {
<% hyperlink("$base/mail/index.html", "Last >>", { start => $msgcnt-$n+1, n => $n, sortby => $sortby , folder => $folder, search_string => $search_string, filter => $filter }, 'unselected') %>
% }
<br>Filter:<input onmouseover="return escape('Filter the folder view. Use from:address or to:address to filter by address, or simply use the words you want to find in the header and body of the messages. You may also use quotes for phrases. For example:<br> from:joe meeting')" type="text" name="search_string" size="20" value="<% $search_string |h %>">
</div>
</div>
<div class="message_quickcheck">
% if($js) {
Select:
<a class="control" onClick="check_all();" href="#">All</a>,
<a class="control" onClick="uncheck_all();" href="#">None</a>,
<a class="control" onClick="invert_checks();" href="#">Invert</a>,
<a class="control" onClick="check_read();" href="#">Read</a>,
<a class="control" onClick="check_unread();" href="#">Unread</a>
% } else {
Select:
<% hyperlink("$base/mail/index.html", "All", { check => "All" }, "control") %>,
<% hyperlink("$base/mail/index.html", "None", { check => 0 }, "control") %>,
<% hyperlink("$base/mail/index.html", "Read", { check => "Read" }, "control") %>,
<% hyperlink("$base/mail/index.html", "Unread", { check => "Unread" }, "control") %>
% }
</div>
<table class="messagelist">
<tr>
<td class="messageFlags">
</td>
<td class="messageFrom">
<div class="nowrap">
<% hyperlink("$base/mail/index.html", ($is_sent_or_drafts ? "To":"From"), { start => $start, n => $n, sortby => ($is_sent_or_drafts ? ($sortby eq 'to' ? 'rto':'to'):($sortby eq 'from' ? 'rfrom':'from')), uidv => $uidvalidity, search_string => $search_string, filter => $filter }, $sortby =~ m/^(from|to)$/ ? "selected":"unselected") %>
</div>
</td>
<td class="messageSubject">
<div class="nowrap">
<% hyperlink("$base/mail/index.html", "Subject", { start => $start, n => $n, sortby => ($sortby eq 'subject' ? 'rsubject':'subject'), uidv => $uidvalidity, search_string => $search_string, filter => $filter }, $sortby =~ m'subject' ? "selected":"unselected") %>
</div>
</td>
<td class="messageDate">
<div class="date">
<% hyperlink("$base/mail/index.html", "Date", { start => $start, n => $n, sortby => ($sortby eq 'date' ? 'rdate':'date'), uidv => $uidvalidity, search_string => $search_string, filter => $filter }, $sortby =~ m'date' ? "selected":"unselected") %>
</div>
</td>
</tr>
% if(defined($headers) && @$headers && defined($headers->[0]{to})) {
<%perl>
my $offset = $start;
for my $entry (@$headers) {
my $date = context_date($entry->{date});
my @fromaddr = Email::Address->parse($entry->{from});
my $from;
if(@fromaddr && defined($fromaddr[0]) && $fromaddr[0]->phrase) {
$from = $fromaddr[0]->phrase;
} elsif(@fromaddr && defined($fromaddr[0]) && $fromaddr[0]->address) {
$from = $fromaddr[0]->address;
} else {
$from = $entry->{from};
}
my @toaddr = Email::Address->parse($entry->{to});
my $to;
if(@toaddr && defined($toaddr[0]) && $toaddr[0]->phrase) {
$to = $toaddr[0]->phrase;
} elsif(@toaddr && defined($toaddr[0]) && $toaddr[0]->address) {
$to = $toaddr[0]->address;
} else {
$to = $entry->{to};
}
</%perl>
<tr>
<td class="messageFlags">
<input alt="<% $entry->{seen} ? "seen":"unseen" %>"
type="checkbox" name="uids"
<% ($check eq 'All' || ($check eq 'Read' && $entry->{seen}) || ($check eq 'Unread' && !$entry->{seen})) ? "checked":"" %>
value="<% $entry->{uid} %>">
<span class="flags" onmouseover="return escape('R = Replied, F = Forwarded');">
<% ($entry->{answered} ? 'R':'') %><% ($entry->{attachment} ? 'A':'') %><% ($entry->{forwarded} ? 'F':'') %>
</span>
% my $parts = parts2hover($entry->{parts});
% if($parts) {
<img ALT="Attachment" src="<% $base %>/static/paperclip.png" width="16" height="16" onmouseover="return escape('<% $parts %>');">
% }
</td>
% my $class = ($entry->{flagged} ? "flagged":($entry->{seen} ? "seen":"unseen"));
<td class="messageFrom">
<div class="nowrap">
<a href="<% build_url($read_page,
{ sorted_offset => $offset, n => $n,
uidv => $uidvalidity, uid => $entry->{uid},
sortby => $sortby , folder => $folder,
search_string => $search_string,
filter => $filter }) |h %>">
<span class="<% $class %>">
% if($is_sent_or_drafts) {
<% $to |h %>
% } else {
<% $from |h %>
% }
</span>
</a>
</div>
</td>
<td class="messageSubject">
<div class="nowrap">
<a href="<% build_url($read_page,
{ sorted_offset => $offset, n => $n,
uidv => $uidvalidity, uid => $entry->{uid},
sortby => $sortby , folder => $folder,
search_string => $search_string,
filter => $filter }) |h %>">
% if($entry->{deleted}) {
<span class="deleted">
% }
<span class="<% $class %>"><% (($sortby eq 'thread' && $entry->{threadlevel}) ? ("+" . "-" x $entry->{threadlevel}):"") . $entry->{subject} |h %></span> - <span class="snippet"><% $entry->{snippet} |h %></span>
% if($entry->{deleted}) {
</span>
% }
</a>
</div>
</td>
<td class="messageDate">
<div class="date">
<% $date |h %>
</div>
</td>
</tr>
% $offset++;
% }
% } else {
<tr>
<td class="tablemessage" colspan="4">
There are no messages in this mailbox.
</td>
</tr>
% }
</table>
<div class="message_quickcheck">
% if($js) {
Select:
<a class="control" onClick="check_all();" href="#">All</a>,
<a class="control" onClick="uncheck_all();" href="#">None</a>,
<a class="control" onClick="invert_checks();" href="#">Invert</a>,
<a class="control" onClick="check_read();" href="#">Read</a>,
<a class="control" onClick="check_unread();" href="#">Unread</a>
% } else {
Select:
<% hyperlink("$base/mail/index.html", "All", { check => "All" }, "control") %>,
<% hyperlink("$base/mail/index.html", "None", { check => 0 }, "control") %>,
<% hyperlink("$base/mail/index.html", "Read", { check => "Read" }, "control") %>,
<% hyperlink("$base/mail/index.html", "Unread", { check => "Unread" }, "control") %>
% }
</div>
<div class="index_controls">
% if($trash eq $folder) {
<input type="submit" name="empty" value="Empty Trash">
% } else {
<input type="submit" name="delete" value="Delete">
% if($trash eq 'none') {
<input type="submit" name="purge" value="Purge Deleted">
% }
% }
<select name="action2" onChange="document.message_form.submit()">
<option disabled selected value="none">More Actions ...</option>
% if($trash eq 'none') {
<option value="undelete"> Undelete</option>
% }
<option value="mark"> Flag</option>
<option value="unmark"> Unflag</option>
<option value="unread"> Mark as unread</option>
<option disabled value="none">-----</option>
<option value="report"> Report Spam</option>
% if($trash eq 'none') {
<option disabled value="none">-----</option>
<option value="kill"> Delete and Purge</option>
% }
<optgroup label="Move to:">
% for my $fldr (@alt_folders, @$folderlist) {
% my $displayname = $tr->decode($fldr);
% $displayname =~ s/^\Q$prefix\E//;
<option value="to:<% $fldr |h %>"><% decode('utf8', $displayname) |h %></option>
% }
</optgroup>
</select>
% if(!$user->getAttribute('javascript')) {
<input type="submit" name="nothing" value="Go">
% }
<% hyperlink("$base/mail/index.html", "Refresh", \%ARGS) %><br>
</div>
</form>
<!-- Cache lookup time: <% sprintf("%4.2f", tv_interval( $st, $st2)) %> seconds
<P>Response time: <% sprintf("%4.2f", tv_interval( $st, [gettimeofday])) %> seconds
-->
<& /mail/footer.mhtml &>
<%init>
$m->redirect($base . "/mail/logout.html") if($config->get('forcelogout', 0) &&
$config->get('nologin', 0));
my $user = Apache2::SiteControl->getCurrentUser($r);
if(!$user || !$user->isa('Apache2::SiteControl::User')) {
$logger->error("Unable to find a user for the given session key.");
$m->redirect("/");
}
AlphaMail::SessionUtil::sessionSetup($r, $user, $config);
my $js = 0;
my $tr;
my $is_sent_or_drafts;
my $prefs;
my $read_page = "$base/mail/read.html"; # Default, unless draft folder
eval {
$tr = Unicode::IMAPUtf7->new();
$prefs = new AlphaMail::Preferences($user,
$user->getAttribute('mx'), $config);
$search_string = decode_utf8($search_string);
};
if($@) {
$logger->error($user->getUsername() . ": fatal error: $@. User, m and r were: ". Dumper($user, $m, $r));
die "Unable to process index.html";
}
if($folder =~ m/\\/ || $folder =~ m/^\// || $folder =~ m/\.\./) {
$logger->error($user->getUsername() . ": SECURITY ALERT: Access requested for folder $folder by user: " . $user->getUsername());
$m->redirect("$base/mail/index.html");
}
if(!$prefs->get('trash_folder')) {
$m->redirect("$base/mail/first_login.html");
}
# Notify them if they clobbered their own session
if($user->getAttribute("session_removed") && $user->getAttribute("session_removed") == 1) {
$message = "Multiple sessions detected. You forgot to log out last time! Your old session was logged out.";
$user->setAttribute($r, "session_removed", 0);
}
if(!defined($user->getAttribute('javascript'))) {
# If the javascript property is not defined, then this is the first pass.
# Features that vary with browser:
# - field completion in compose: field_completion = 0 or 1
# - tool tips, auto form submission: javascript = 0 or 1
# - Spell check DOM replacement: dom_edit = 0 or 1
my $js = defined($user->getAttribute('credential_4')) ? $user->getAttribute('credential_4'):0;
$user->setAttribute($r, 'javascript', $js); # defaults
$user->setAttribute($r, 'field_completion', 0);
$user->setAttribute($r, 'dom_edit', 0);
if(defined($user->getAttribute('credential_4'))) {
my $id = $user->getAttribute('credential_5');
my $os = "other";
$os = "windows" if $id =~ m/windows/i;
$os = "mac" if $id =~ m/macintosh/i;
$os = "linux" if $id =~ m/linux/i;
$logger->info("Browser: $id");
if($id =~ m/Safari/) { # Safari
$user->setAttribute($r, 'field_completion', $js);
$user->setAttribute($r, 'dom_edit', 1);
} elsif($id =~ m/Opera/) { # Opera
$user->setAttribute($r, 'field_completion', $js);
$user->setAttribute($r, 'dom_edit', 1);
} elsif($id =~ m/Gecko\/(\d+)\b/i) { # Mozilla-based
if($1 > 20040500) {
$user->setAttribute($r, 'field_completion', $js);
$user->setAttribute($r, 'dom_edit', 1);
}
} elsif($id =~ m/MSIE\D+(\d+)\.(\d+)/) { # IE
if($1 >= 6) {
$user->setAttribute($r, 'field_completion', $js);
$user->setAttribute($r, 'dom_edit', 1);
}
}
$user->setAttribute($r, 'supported', ($user->getAttribute('field_completion') == 1 && $user->getAttribute('dom_edit') == 1));
$logger->info($user->getUsername() . " using " . $user->getAttribute('credential_5') . " version " . $user->getAttribute('credential_6'));
$logger->info("Enabling features: field_completion: " . $user->getAttribute('field_completion') . ", javascript: " . $js);
}
}
$js = $user->getAttribute('javascript');
# Deal with remote IP recording and checking.
eval {
require APR::SockAddr;
my $c = $r->connection;
if(!defined($user->getAttribute('ip'))) {
$user->setAttribute($r, 'ip', $c->remote_addr->ip_get);
} elsif($user->getAttribute('ip') ne $c->remote_addr->ip_get) {
$logger->error($user->getUsername() . ": User moved from one IP to another!\nOld IP:" .
$user->getAttribute('ip') . "\nNew IP: " .
$c->remote_addr->ip_get);
}
};
if($@) {
$logger->error($user->getUsername() . ": Unable to look at IPs: $@");
}
my ($prefix, $separator) = $config->getFolderPrefix($user);
$prefix .= $separator;
# Get the configured allowed number of messages per page:
my @allowed_per_page = $config->getList('allowed_per_page', 20, 30, 50);
my $trash = $prefs->get('trash_folder', 'none');
my $sent = $prefs->get('sent_folder', 'none');
my $drafts = $prefs->get('drafts_folder', 'none');
my $invertindex = $prefs->get('invertindex', 0);
my $altfolders = $prefs->get('alt_folders', '');
my @alt_folders = split /,/, $altfolders if($altfolders);
if(!$n) {
my @allowed_per_page = $config->getList('allowed_per_page', 20, 35, 50);
$n = $prefs->get('messages_per_page', $allowed_per_page[0]);
}
my $folderlist;
my $subscribed_folderlist;
my $headers;
my $uidvalidity;
my $c;
my $msgcnt;
my $st = [gettimeofday];
my $st2;
eval {
$c = new AlphaMail::Middleware($user->getAttribute('imap'), $user->getUsername(), $user->getAttribute('password'), $config);
$folderlist = AlphaMail::SessionUtil::getFolderList($r, $user, $config);
$subscribed_folderlist = AlphaMail::SessionUtil::getSubscribedFolderList($r, $user, $config);
($folder, $start, $n, $sortby, $invertindex) = AlphaMail::SessionUtil::markLocation($r, $user, $folder, $start, $n, $sortby, $invertindex);
$is_sent_or_drafts = ($folder eq $sent || $folder eq $drafts);
$read_page = "$base/mail/resume_compose.html" if($drafts eq $folder);
# Flip sorting around when changing folders
if($is_sent_or_drafts && $sortby eq 'from') {
$sortby = 'to';
$user->setAttribute($r, 'lastsortby', $sortby);
} elsif(!$is_sent_or_drafts && $sortby eq 'to') {
$sortby = 'from';
$user->setAttribute($r, 'lastsortby', $sortby);
}
$msgcnt = $c->getMessageCount($folder, $filter);
$start = $msgcnt - $n if($start > $msgcnt);
if(!$invertindex) {
if($start < 1) {
$start = $msgcnt - $n + 1;
}
} else {
$start = 1 if($start < 1);
}
$start = 1 if($start < 1);
$headers = $c->getMessageHeaders($folder, $start, $n, $sortby, $filter);
$msgcnt = $headers->[0]{count};
$uidvalidity = $headers->[0]{uidvalidity};
$c->close;
};
if($@) {
$logger->error($user->getUsername() . ": ERROR GETTING INDEX: $@");
$message = "Unable to read folder. Perhaps it is in use by another application. Please try again, or contact support.";
$msgcnt = 0;
}
$st2 = [gettimeofday];
</%init>
<%once>
use Data::Dumper;
use Encode;
use Time::HiRes qw( gettimeofday tv_interval );
use AlphaMail::HTMLHelper qw(build_url hyperlink context_date size_with_units);
our $logger = Log::Log4perl->get_logger('alphamail');
our $base = $config->get('base_uri');
sub parts2hover
{
my $parts = shift;
my $html = undef;
while($parts =~ m/\(([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*),([^,]*)\)/g)
{
my ($pt, $cset, $enc, $mt, $mst, $nm, $sz) = ($1, $2, $3, $4, $5, $6, $7);
if($nm) {
$sz = size_with_units($sz);
$html .= qq($nm $mt/$mst ($sz)<br>);
$html =~ s/\s+/ /g;
}
}
return $html;
}
</%once>
See more files for this project here