📄 vmail.cgi
字号:
$stdcontainerend</BODY>\n_EOH }}sub message_audio(){ my ($forcedownload) = @_; my $folder = &untaint(param('folder')); my $msgid = &untaint(param('msgid')); my $mailbox = &untaint(param('mailbox')); my $context = &untaint(param('context')); my $format = param('format'); if (!$format) { $format = &getcookie('format'); } &untaint($format); my $path = "/var/spool/asterisk/voicemail/$context/$mailbox/$folder/msg${msgid}.$format"; $msgid =~ /^\d\d\d\d$/ || die("Msgid Liar ($msgid)!"); grep(/^${format}$/, keys %formats) || die("Format Liar ($format)!"); # Mailbox and folder are already verified if (open(AUDIO, "<$path")) { $size = -s $path; $|=1; if ($forcedownload) { print header(-type=>$formats{$format}->{'mime'}, -Content_length => $size, -attachment => "msg${msgid}.$format"); } else { print header(-type=>$formats{$format}->{'mime'}, -Content_length => $size); } while(($amt = sysread(AUDIO, $data, 4096)) > 0) { syswrite(STDOUT, $data, $amt); } close(AUDIO); } else { die("Hrm, can't seem to open $path\n"); }}sub message_index() { my ($folder, $message) = @_; my ($mbox, $context) = split(/\@/, param('mailbox')); my $passwd = param('password'); my $message2; my $msgcount; my $hasmsg; my ($newmessages, $oldmessages); my $format = param('format'); if (!$format) { $format = &getcookie('format'); } if (!$context) { $context = param('context'); } if (!$context) { $context = "default"; } if ($folder) { $msgcount = &msgcountstr($context, $mbox, $folder); $message2 = " Folder '$folder' has " . &msgcountstr($context, $mbox, $folder); } else { $newmessages = &msgcount($context, $mbox, "INBOX"); $oldmessages = &msgcount($context, $mbox, "Old"); if (($newmessages > 0) || ($oldmessages < 1)) { $folder = "INBOX"; } else { $folder = "Old"; } $message2 = "You have"; if ($newmessages > 0) { $message2 .= " <b>$newmessages</b> NEW"; if ($oldmessages > 0) { $message2 .= "and <b>$oldmessages</b> OLD"; if ($oldmessages != 1) { $message2 .= " messages."; } else { $message2 .= "message."; } } else { if ($newmessages != 1) { $message2 .= " messages."; } else { $message2 .= " message."; } } } else { if ($oldmessages > 0) { $message2 .= " <b>$oldmessages</b> OLD"; if ($oldmessages != 1) { $message2 .= " messages."; } else { $message2 .= " message."; } } else { $message2 .= " <b>no</b> messages."; } } } my $folders = &folder_list('newfolder', $context, $mbox, $folder); my $cfolders = &folder_list('changefolder', $context, $mbox, $folder); my $mailboxes = &mailbox_list('forwardto', $context, $mbox); print header(-cookie => &makecookie($format)); print <<_EOH;<TITLE>Asterisk Web-Voicemail: $mbox\@$context $folder</TITLE><BODY BGCOLOR="white">$stdcontainerstart<FORM METHOD="post"><table width=100% align=center><tr><td align=center colspan=2><font size=+2><I>$message</I></font></td></tr><tr><td align=right colspan=2><font size=+1><b>$folder</b> Messages</font> <input type=submit name="action" value="change to ->">$cfolders</td></tr><tr><td align=left colspan=2><font size=+1>$message2</font></td></tr></table><table width=100% align=center cellpadding=0 cellspacing=0>_EOHprint "<tr><td> Msg</td><td> From</td><td> Duration</td><td> Date</td><td> </td></tr>\n";print "<tr><td><hr></td><td><hr></td><td><hr></td><td><hr></td><td></td></tr>\n";foreach $msg (&messages($context, $mbox, $folder)) { $fields = &getfields($context, $mbox, $folder, $msg); $duration = $fields->{'duration'}; if ($duration) { $duration = sprintf "%d:%02d", $duration / 60, $duration % 60; } else { $duration = "<i>Unknown</i>"; } $hasmsg++; print "<tr><td><input type=checkbox name=\"msgselect\" value=\"$msg\"> <b>$msg</b></td><td>$fields->{'callerid'}</td><td>$duration</td><td>$fields->{'origdate'}</td><td><input name='play$msg' alt=\"Play message $msg\" border=0 type=image align=left src=\"$astpath/play.gif\"></td></tr>\n";}if (!$hasmsg) { print "<tr><td colspan=4 align=center><P><b><i>No messages</i></b><P></td></tr>";}print <<_EOH;</table><table width=100% align=center><tr><td align=right colspan=2> <input type="submit" name="action" value="refresh"> _EOHif ($hasmsg) {print <<_EOH; <input type="submit" name="action" value="delete"> <input type="submit" name="action" value="save to ->"> $folders <input type="submit" name="action" value="forward to ->"> $mailboxes_EOH}print <<_EOH;</td></tr><tr><td align=right colspan=2> <input type="submit" name="action" value="preferences"> <input type="submit" name="action" value="logout"></td></tr></table><input type=hidden name="folder" value="$folder"><input type=hidden name="mailbox" value="$mbox"><input type=hidden name="context" value="$context"><input type=hidden name="password" value="$passwd"></FORM>$stdcontainerend</BODY>\n_EOH}sub validfolder(){ my ($folder) = @_; return grep(/^$folder$/, @validfolders);}sub folder_list(){ my ($name, $context, $mbox, $selected) = @_; my $f; my $count; my $tmp = "<SELECT name=\"$name\">\n"; foreach $f (@validfolders) { $count = &msgcount($context, $mbox, $f); if ($f eq $selected) { $tmp .= "<OPTION SELECTED>$f ($count)</OPTION>\n"; } else { $tmp .= "<OPTION>$f ($count)</OPTION>\n"; } } $tmp .= "</SELECT>";}sub message_rename(){ my ($context, $mbox, $oldfolder, $old, $newfolder, $new) = @_; my ($oldfile, $newfile); return if ($old eq $new) && ($oldfolder eq $newfolder); if ($context =~ /^(\w+)$/) { $context = $1; } else { die("Invalid Context<BR>\n"); } if ($mbox =~ /^(\w+)$/) { $mbox = $1; } else { die ("Invalid mailbox<BR>\n"); } if ($oldfolder =~ /^(\w+)$/) { $oldfolder = $1; } else { die("Invalid old folder<BR>\n"); } if ($newfolder =~ /^(\w+)$/) { $newfolder = $1; } else { die("Invalid new folder ($newfolder)<BR>\n"); } if ($old =~ /^(\d\d\d\d)$/) { $old = $1; } else { die("Invalid old Message<BR>\n"); } if ($new =~ /^(\d\d\d\d)$/) { $new = $1; } else { die("Invalid old Message<BR>\n"); } my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$newfolder"; $path =~ /^(.*)$/; $path = $1; mkdir $path, 0770; $path = "/var/spool/asterisk/voicemail/$context/$mbox/$oldfolder"; opendir(DIR, $path) || die("Unable to open directory\n"); my @files = grep /^msg${old}\.\w+$/, readdir(DIR); closedir(DIR); foreach $oldfile (@files) { my $tmp = $oldfile; if ($tmp =~ /^(msg${old}.\w+)$/) { $tmp = $1; $oldfile = $path . "/$tmp"; $tmp =~ s/msg${old}/msg${new}/; $newfile = "/var/spool/asterisk/voicemail/$context/$mbox/$newfolder/$tmp";# print "Renaming $oldfile to $newfile<BR>\n"; rename($oldfile, $newfile); } }}sub file_copy(){ my ($orig, $new) = @_; my $res; my $data; $orig =~ /^(.*)$/; $orig = $1; $new =~ /^(.*)$/; $new = $1; open(IN, "<$orig") || die("Unable to open '$orig'\n"); open(OUT, ">$new") || DIE("Unable to open '$new'\n"); while(($res = sysread(IN, $data, 4096)) > 0) { syswrite(OUT, $data, $res); } close(OUT); close(IN);}sub message_copy(){ my ($context, $mbox, $newmbox, $oldfolder, $old, $new) = @_; my ($oldfile, $newfile); return if ($mbox eq $newmbox); if ($mbox =~ /^(\w+)$/) { $mbox = $1; } else { die ("Invalid mailbox<BR>\n"); } if ($newmbox =~ /^(\w+)$/) { $newmbox = $1; } else { die ("Invalid new mailbox<BR>\n"); } if ($oldfolder =~ /^(\w+)$/) { $oldfolder = $1; } else { die("Invalid old folder<BR>\n"); } if ($old =~ /^(\d\d\d\d)$/) { $old = $1; } else { die("Invalid old Message<BR>\n"); } if ($new =~ /^(\d\d\d\d)$/) { $new = $1; } else { die("Invalid old Message<BR>\n"); } my $path = "/var/spool/asterisk/voicemail/$context/$newmbox"; $path =~ /^(.*)$/; $path = $1; mkdir $path, 0770; $path = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX"; $path =~ /^(.*)$/; $path = $1; mkdir $path, 0770; $path = "/var/spool/asterisk/voicemail/$context/$mbox/$oldfolder"; opendir(DIR, $path) || die("Unable to open directory\n"); my @files = grep /^msg${old}\.\w+$/, readdir(DIR); closedir(DIR); foreach $oldfile (@files) { my $tmp = $oldfile; if ($tmp =~ /^(msg${old}.\w+)$/) { $tmp = $1; $oldfile = $path . "/$tmp"; $tmp =~ s/msg${old}/msg${new}/; $newfile = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX/$tmp";# print "Copying $oldfile to $newfile<BR>\n"; &file_copy($oldfile, $newfile); } }}sub message_delete(){ my ($context, $mbox, $folder, $msg) = @_; if ($mbox =~ /^(\w+)$/) { $mbox = $1; } else { die ("Invalid mailbox<BR>\n"); } if ($context =~ /^(\w+)$/) { $context = $1; } else { die ("Invalid context<BR>\n"); } if ($folder =~ /^(\w+)$/) { $folder = $1; } else { die("Invalid folder<BR>\n"); } if ($msg =~ /^(\d\d\d\d)$/) { $msg = $1; } else { die("Invalid Message<BR>\n"); } my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$folder"; opendir(DIR, $path) || die("Unable to open directory\n"); my @files = grep /^msg${msg}\.\w+$/, readdir(DIR); closedir(DIR); foreach $oldfile (@files) { if ($oldfile =~ /^(msg${msg}.\w+)$/) { $oldfile = $path . "/$1";# print "Deleting $oldfile<BR>\n"; unlink($oldfile); } }}sub message_forward(){ my ($toindex, @msgs) = @_; my $folder = param('folder'); my ($mbox, $context) = split(/\@/, param('mailbox')); my $newmbox = param('forwardto'); my $msg; my $msgcount; if (!$context) { $context = param('context'); } if (!$context) { $context = "default"; } $newmbox =~ s/(\w+)(\s+.*)?$/$1/; if (!&validmailbox($context, $newmbox)) { die("Bah! Not a valid mailbox '$newmbox'\n"); return ""; } my $txt; $context = &untaint($context); $newmbox = &untaint($newmbox); my $path = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX"; if ($msgs[0]) { if (&lock_path($path) == 0) { $msgcount = &msgcount($context, $newmbox, "INBOX"); if ($newmbox ne $mbox) { # print header; foreach $msg (@msgs) { # print "Forwarding $msg from $mbox to $newmbox<BR>\n"; &message_copy($context, $mbox, $newmbox, $folder, $msg, sprintf "%04d", $msgcount); $msgcount++; } $txt = "Forwarded messages " . join(', ', @msgs) . "to $newmbox"; } else { $txt = "Can't forward messages to yourself!\n"; } &unlock_path($path); } else { $txt = "Cannot forward messages: Unable to lock path.\n"; } } else { $txt = "Please Select Message(s) for this action.\n"; } if ($toindex) { &message_index($folder, $txt); } else { &message_play($txt, $msgs[0]); }}sub message_delete_or_move(){ my ($toindex, $del, @msgs) = @_; my $txt; my $path; my ($y, $x); my $folder = param('folder'); my $newfolder = param('newfolder') unless $del; $newfolder =~ s/^(\w+)\s+.*$/$1/; my ($mbox, $context) = split(/\@/, param('mailbox')); if (!$context) { $context = param('context'); } if (!$context) { $context = "default"; } my $passwd = param('password'); $context = &untaint($context); $mbox = &untaint($mbox); $folder = &untaint($folder); $path = "/var/spool/asterisk/voicemail/$context/$mbox/$folder"; if ($msgs[0]) { if (&lock_path($path) == 0) { my $msgcount = &msgcount($context, $mbox, $folder); my $omsgcount = &msgcount($context, $mbox, $newfolder) if $newfolder; # print header; if ($newfolder ne $folder) { $y = 0; for ($x=0;$x<$msgcount;$x++) { my $msg = sprintf "%04d", $x; my $newmsg = sprintf "%04d", $y; if (grep(/^$msg$/, @msgs)) { if ($newfolder) { &message_rename($context, $mbox, $folder, $msg, $newfolder, sprintf "%04d", $omsgcount); $omsgcount++; } else { &message_delete($context, $mbox, $folder, $msg); } } else { &message_rename($context, $mbox, $folder, $msg, $folder, $newmsg); $y++; } } if ($del) { $txt = "Deleted messages " . join (', ', @msgs); } else { $txt = "Moved messages " . join (', ', @msgs) . " to $newfolder"; } } else { $txt = "Can't move a message to the same folder they're in already"; } &unlock_path($path); } else { $txt = "Cannot move/delete messages: Unable to lock path.\n"; } } else { $txt = "Please Select Message(s) for this action.\n"; } # Not as many messages now $msgcount--; if ($toindex || ($msgs[0] >= $msgcount)) { &message_index($folder, $txt); } else { &message_play($txt, $msgs[0]); }}if (param()) { my $folder = param('folder'); my $changefolder = param('changefolder'); $changefolder =~ s/(\w+)\s+.*$/$1/; my $newfolder = param('newfolder'); $newfolder =~ s/^(\w+)\s+.*$/$1/; if ($newfolder && !&validfolder($newfolder)) { print header; die("Bah! new folder '$newfolder' isn't a folder."); } $action = param('action'); $msgid = param('msgid'); if (!$action) { my ($tmp) = grep /^play\d\d\d\d\.x$/, param; if ($tmp =~ /^play(\d\d\d\d)/) { $msgid = $1; $action = "play"; } else { print header; print "No message?<BR>\n"; return; } } @msgs = param('msgselect'); @msgs = ($msgid) unless @msgs; { ($mailbox) = &check_login(); if (length($mailbox)) { if ($action eq 'login') { &message_index($folder, "Welcome, $mailbox"); } elsif (($action eq 'refresh') || ($action eq 'index')) { &message_index($folder, "Welcome, $mailbox"); } elsif ($action eq 'change to ->') { if (&validfolder($changefolder)) { $folder = $changefolder; &message_index($folder, "Welcome, $mailbox"); } else { die("Bah! Not a valid change to folder '$changefolder'\n"); } } elsif ($action eq 'play') { &message_play("$mailbox $folder $msgid", $msgid); } elsif ($action eq 'preferences') { &message_prefs("refresh", $msgid); } elsif ($action eq 'download') { &message_audio(1); } elsif ($action eq 'play ') { &message_audio(0); } elsif ($action eq 'audio') { &message_audio(0); } elsif ($action eq 'delete') { &message_delete_or_move(1, 1, @msgs); } elsif ($action eq 'delete ') { &message_delete_or_move(0, 1, @msgs); } elsif ($action eq 'forward to ->') { &message_forward(1, @msgs); } elsif ($action eq 'forward to -> ') { &message_forward(0, @msgs); } elsif ($action eq 'save to ->') { &message_delete_or_move(1, 0, @msgs); } elsif ($action eq 'save to -> ') { &message_delete_or_move(0, 0, @msgs); } elsif ($action eq 'logout') { &login_screen("Logged out!\n"); } } else { sleep(1); &login_screen("Login Incorrect!\n"); } }} else { &login_screen("\ ");}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -