Show index.html syntax highlighted
% # vim: set syntax=mason:
<%args>
$folder => 'none'
$start => -1
$n => 0
$sortby => 'unknown'
$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="/mail/process_messages.html" method="post">
<div class="top_controls">
<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">
% }
% }
<input type="hidden" name="folder" value="<% $folder |h %>">
<input type="hidden" name="start" value="<% $start |h %>">
<input type="hidden" name="n" value="<% $n |h %>">
<input type="hidden" name="sortby" value="<% $sortby |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("/mail/index.html", "Refresh", \%ARGS) %><br>
</div>
% if($user->getAttribute('basic_html')) { # DUMB BROWSER AGAIN! ***********
<div class="navright_retarded">
% } else { # END OF DUMB BROWSER ********************************************
<div class="navright">
% }
% if($start > $n+1) {
<% hyperlink('/mail/index.html', "<< First", { start => 1, n => $n, sortby => $sortby , folder => $folder }, 'unselected') %>
% }
% if($start > 1) {
<% hyperlink('/mail/index.html', "< Previous", { start => ($start-$n > 0 ? ($start-$n):1), n => $n, sortby => $sortby , folder => $folder }, 'unselected') %>
% }
<% $msgcnt ? $start:0 %> - <% $start+$n-1 > $msgcnt ? $msgcnt:($start+$n-1) %> of <% $msgcnt %>
% if(($start+$n) < ($msgcnt+1)) {
<% hyperlink('/mail/index.html', "Next >", { start => $start+$n, n => $n, sortby => $sortby , folder => $folder }, 'unselected') %>
% }
% if($start+2*$n-1 < $msgcnt) {
<% hyperlink('/mail/index.html', "Last >>", { start => $msgcnt-$n+1, n => $n, sortby => $sortby , folder => $folder }, 'unselected') %>
% }
</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('/mail/index.html', "All", { check => "All" }, "control") %>,
<% hyperlink('/mail/index.html', "None", { check => 0 }, "control") %>,
<% hyperlink('/mail/index.html', "Read", { check => "Read" }, "control") %>,
<% hyperlink('/mail/index.html', "Unread", { check => "Unread" }, "control") %>
% }
</div>
% if($user->getAttribute('basic_html')) { # STUPID BROWSER *****************
<table class="messagelist">
<tr>
<td>
</td>
<td class="messageFrom_retarded">
<% hyperlink("/mail/index.html", ($folder eq $sent ? "To":"From"), { start => $start, n => $n, sortby => ($folder eq $sent ? 'to':'from'), uidv => $uidvalidity }, $sortby =~ m/^(from|to)$/ ? "selected":"unselected") %>
</td>
<td class="messageSubject_retarded">
<% hyperlink("/mail/index.html", "Subject" . ($sortby eq 'thread' ? " (sorted by thread and date)":""), { start => $start, n => $n, sortby => 'thread', uidv => $uidvalidity }, $sortby eq 'thread' ? "selected":"unselected") %>
</td>
<td class="messageDate_retarded">
<% hyperlink("/mail/index.html", "Date", { start => $start, n => $n, sortby => 'date', uidv => $uidvalidity }, $sortby eq 'date' ? "selected":"unselected") %>
</td>
</tr>
% if(defined($headers) && @$headers && defined($headers->[0]{to})) {
<%perl>
my $offset = $start;
for my $entry (@$headers) {
my $date = $entry->{date};
my ($day, $month, $year, $hour, $minute) = $date =~ m/(?:\w+,\s+)?(\d{1,2})\s+(\w{3})\s+(\d{2,4})\s+(\d+):(\d+):/;
# Customize the date:
eval {
my $mon = Decode_Month($month);
my $dow = Day_of_Week($year, $mon, $day);
if($today[3] == $day && $today[5]+1900 == $year && $today[4]+1 == $mon)
{
$date = "$hour:$minute";
} elsif(Delta_Days($year, $mon, $day, $today[5]+1900, $today[4]+1, $today[3]) < 7) {
$date = Day_of_Week_Abbreviation($dow);
} elsif($today[5]+1900 == $year) {
$date = "$month $day";
} else {
$year =~ s/^..//;
$date = "$mon/$day/$year";
}
};
if($@) {
$logger->error("Unable to format date: $@");
$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_retarded">
<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>
</td>
<td class="messageFrom_retarded">
<a href="<% build_url("/mail/read.html",
{ sorted_offset => $offset, n => $n,
uidv => $uidvalidity, uid => $entry->{uid},
sortby => $sortby , folder => $folder }) |h %>">
% if($folder eq $sent) {
<% $to |h %>
% } else {
<% $from |h %>
% }
</a>
</td>
<td class="messageSubject_retarded">
<a href="<% build_url("/mail/read.html",
{ sorted_offset => $offset, n => $n,
uidv => $uidvalidity, uid => $entry->{uid},
sortby => $sortby , folder => $folder }) |h %>">
% if($entry->{deleted}) {
<span class="deleted">
% }
% my $class = ($entry->{flagged} ? "flagged":($entry->{seen} ? "seen":"unseen"));
<span class="<% $class %>"><% (($sortby eq 'thread' && $entry->{threadlevel}) ? ("+" . "-" x $entry->{threadlevel}):"") . $entry->{subject} |h %> - <span class="snippet"><% $entry->{snippet} |h %></span></span>
% if($entry->{deleted}) {
</span>
% }
</a>
</td>
<td class="messageDate_retarded">
<% $date |h %>
</td>
</tr>
% $offset++;
% }
% } else {
<tr>
<td class="tablemessage_retarded" colspan="4">
There are no messages in this mailbox.
</td>
</tr>
% }
</table>
% } else { # NOT A DUMB BROWSER: ********************************************
<table class="messagelist">
<tr>
<td class="messageFlags">
</td>
<td class="messageFrom">
<div class="nowrap">
<% hyperlink("/mail/index.html", ($folder eq $sent ? "To":"From"), { start => $start, n => $n, sortby => ($folder eq $sent ? 'to':'from'), uidv => $uidvalidity }, $sortby =~ m/^(from|to)$/ ? "selected":"unselected") %>
</div>
</td>
<td class="messageSubject">
<div class="nowrap">
<% hyperlink("/mail/index.html", "Subject" . ($sortby eq 'thread' ? " (sorted by thread and date)":""), { start => $start, n => $n, sortby => 'thread', uidv => $uidvalidity }, $sortby eq 'thread' ? "selected":"unselected") %>
</div>
</td>
<td class="messageDate">
<div class="date">
<% hyperlink("/mail/index.html", "Date", { start => $start, n => $n, sortby => 'date', uidv => $uidvalidity }, $sortby eq 'date' ? "selected":"unselected") %>
</div>
</td>
</tr>
% if(defined($headers) && @$headers && defined($headers->[0]{to})) {
<%perl>
my $offset = $start;
for my $entry (@$headers) {
my $date = $entry->{date};
my ($day, $month, $year, $hour, $minute) = $date =~ m/(?:\w+,\s+)?(\d{1,2})\s+(\w{3})\s+(\d{2,4})\s+(\d+):(\d+):/;
# Customize the date:
eval {
my $mon = Decode_Month($month);
my $dow = Day_of_Week($year, $mon, $day);
if($today[3] == $day && $today[5]+1900 == $year && $today[4]+1 == $mon)
{
$date = "$hour:$minute";
} elsif(Delta_Days($year, $mon, $day, $today[5]+1900, $today[4]+1, $today[3]) < 7) {
$date = Day_of_Week_Abbreviation($dow);
} elsif($today[5]+1900 == $year) {
$date = "$month $day";
} else {
$year =~ s/^..//;
$date = "$mon/$day/$year";
}
};
if($@) {
$logger->error("Unable to format date: $@");
$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>
</td>
<td class="messageFrom">
<div class="nowrap">
<a href="<% build_url("/mail/read.html",
{ sorted_offset => $offset, n => $n,
uidv => $uidvalidity, uid => $entry->{uid},
sortby => $sortby , folder => $folder }) |h %>">
% if($folder eq $sent) {
<% $to |h %>
% } else {
<% $from |h %>
% }
</a>
</div>
</td>
<td class="messageSubject">
<div class="nowrap">
<a href="<% build_url("/mail/read.html",
{ sorted_offset => $offset, n => $n,
uidv => $uidvalidity, uid => $entry->{uid},
sortby => $sortby , folder => $folder }) |h %>">
% if($entry->{deleted}) {
<span class="deleted">
% }
% my $class = ($entry->{flagged} ? "flagged":($entry->{seen} ? "seen":"unseen"));
<span class="<% $class %>"><% (($sortby eq 'thread' && $entry->{threadlevel}) ? ("+" . "-" x $entry->{threadlevel}):"") . $entry->{subject} |h %> - <span class="snippet"><% $entry->{snippet} |h %></span></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>
% } # END OF NOT A DUMB BROWSER *********************************************
<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('/mail/index.html', "All", { check => "All" }, "control") %>,
<% hyperlink('/mail/index.html', "None", { check => 0 }, "control") %>,
<% hyperlink('/mail/index.html', "Read", { check => "Read" }, "control") %>,
<% hyperlink('/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("/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>
my $logger = Log::Log4perl->get_logger('alphamail');
my $user = Apache::SiteControl->getCurrentUser($r);
if(!$user || !$user->isa('Apache::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 $prefs;
my @today;
eval {
$tr = Unicode::IMAPUtf7->new();
$prefs = new AlphaMail::Preferences($user->getUsername(),
$user->getAttribute('imap'), $config);
@today = localtime;
};
if($@) {
$logger->error("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("SECURITY ALERT: Access requested for folder $folder by user: " . $user->getUsername());
$m->redirect('/mail/index.html');
}
if(!$prefs->get('trash_folder')) {
$m->redirect('/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:
# - Basic HTML vs advanced HTML: basic_html = 0 or 1
# - 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, 'basic_html', 1);
$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;
if($id =~ m/Safari/) { # Safari
$user->setAttribute($r, 'basic_html', 0);
$user->setAttribute($r, 'field_completion', $js);
$user->setAttribute($r, 'dom_edit', 1);
} elsif($id =~ m/Opera/) { # Opera
$user->setAttribute($r, 'basic_html', 0);
$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, 'basic_html', 0);
$user->setAttribute($r, 'field_completion', $js);
$user->setAttribute($r, 'dom_edit', 1);
}
} elsif($id =~ m/MSIE\s+(\d+)\.(\d+)/) { # IE
if($1 >= 6) {
$user->setAttribute($r, 'basic_html', 0);
$user->setAttribute($r, 'field_completion', $js);
$user->setAttribute($r, 'dom_edit', 1);
}
}
$user->setAttribute($r, 'supported', ($user->getAttribute('basic_html') == 0 && $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: basic_html: " . $user->getAttribute('basic_html') . ", field_completion: " . $user->getAttribute('field_completion') . ", javascript: " . $js);
}
}
$js = $user->getAttribute('javascript');
my $prefix = $prefs->get('folder_prefix', $config->get('folder_prefix', 'mail'));
# Get the configured allowed number of messages per page:
my @allowed_per_page = $config->getList('allowed_per_page', 20, 30, 50);
@allowed_per_page = (20) if(!@allowed_per_page);
my $trash = $prefs->get('trash_folder', 'none');
my $sent = $prefs->get('sent_folder', 'none');
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 $headers;
my $uidvalidity;
my $c;
my $msgcnt;
my $st = [gettimeofday];
my $st2;
if($sortby eq 'unknown') {
$sortby = $user->getAttribute('lastsortby') || 'date';
# Flip sorting around when changing folders
$sortby = 'to' if($folder eq $sent && $sortby eq 'from');
$sortby = 'from' if($folder ne $sent && $sortby eq 'to');
} else {
$user->setAttribute($r, 'lastsortby', $sortby);
}
eval {
$c = new AlphaMail::Middleware($user->getAttribute('imap'), $user->getUsername(), $user->getAttribute('password'), $config);
$folderlist = AlphaMail::SessionUtil::getFolderList($r, $user, $config);
($folder, $start, $n, $sortby) = AlphaMail::SessionUtil::markLocation($r, $user, $folder, $start, $n, $sortby);
$msgcnt = $c->getMessageCount($folder);
$start = $msgcnt - $n if($start > $msgcnt);
if($start < 1) {
$start = $msgcnt - $n + 1;
}
$start = 1 if($start < 1);
$headers = $c->getMessageHeaders($folder, $start, $n, $sortby);
$msgcnt = $headers->[0]{count};
$uidvalidity = $headers->[0]{uidvalidity};
$c->close;
};
if($@) {
$logger->error("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 Date::Calc qw(Decode_Month Day_of_Week Day_of_Week_Abbreviation Delta_Days);
use Data::Dumper;
use Encode;
use Time::HiRes qw( gettimeofday tv_interval );
use AlphaMail::HTMLHelper qw(build_url hyperlink);
</%once>
See more files for this project here