12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013 |
- #!/usr/bin/perl
- #
- # Web based Voicemail for Asterisk
- #
- # Copyright (C) 2002, Linux Support Services, Inc.
- #
- # Distributed under the terms of the GNU General Public License
- #
- # Written by Mark Spencer <markster@linux-support.net>
- #
- # (icky, I know.... if you know better perl please help!)
- #
- #
- use CGI qw/:standard/;
- use Carp::Heavy;
- use CGI::Carp qw(fatalsToBrowser);
- use DBI;
- $context=""; # Define here your by default context (so you dont need to put voicemail@context in the login
- @validfolders = ( "INBOX", "Old", "Work", "Family", "Friends", "Cust1", "Cust2", "Cust3", "Cust4", "Cust5" );
- %formats = (
- "wav" => {
- name => "Uncompressed WAV",
- mime => "audio/x-wav",
- pref => 1
- },
- "WAV" => {
- name => "GSM Compressed WAV",
- mime => "audio/x-wav",
- pref => 2
- },
- "gsm" => {
- name => "Raw GSM Audio",
- mime => "audio/x-gsm",
- pref => 3
- }
- );
- $astpath = "/_asterisk";
- $stdcontainerstart = "<table align=center width=600><tr><td>\n";
- $footer = "<hr><font size=-1><a href=\"http://www.asterisk.org\">The Asterisk Open Source PBX</a> Copyright 2004, <a href=\"http://www.digium.com\">Digium, Inc.</a></a>";
- $stdcontainerend = "</td></tr><tr><td align=right>$footer</td></tr></table>\n";
- sub login_screen() {
- print header;
- my ($message) = @_;
- print <<_EOH;
- <TITLE>Asterisk Web-Voicemail</TITLE>
- <BODY BGCOLOR="white">
- $stdcontainerstart
- <FORM METHOD="post">
- <input type=hidden name="action" value="login">
- <table align=center>
- <tr><td valign=top align=center rowspan=6><img align=center src="$astpath/animlogo.gif"></td></tr>
- <tr><td align=center colspan=2><font size=+2>Comedian Mail Login</font></td></tr>
- <tr><td align=center colspan=2><font size=+1>$message</font></td></tr>
- <tr><td>Mailbox:</td><td><input type=text name="mailbox"></td></tr>
- <tr><td>Password:</td><td><input type=password name="password"></td></tr>
- <tr><td align=right colspan=2><input value="Login" type=submit></td></tr>
- <input type=hidden name="context" value="$context">
- </table>
- </FORM>
- $stdcontainerend
- </BODY>\n
- _EOH
- }
- sub check_login()
- {
- local ($filename, $startcat) = @_;
- local ($mbox, $context) = split(/\@/, param('mailbox'));
- local $pass = param('password');
- local $category = $startcat;
- local @fields;
- local $tmp;
- local (*VMAIL);
- if (!$category) {
- $category = "general";
- }
- if (!$context) {
- $context = param('context');
- }
- if (!$context) {
- $context = "default";
- }
- if (!$filename) {
- $filename = "/etc/asterisk/voicemail.conf";
- }
- # print header;
- # print "Including <h2>$filename</h2> while in <h2>$category</h2>...\n";
- open(VMAIL, "<$filename") || die("Bleh, no $filename");
- while(<VMAIL>) {
- chomp;
- if (/include\s\"([^\"]+)\"$/) {
- ($tmp, $category) = &check_login("/etc/asterisk/$1", $category);
- if (length($tmp)) {
- # print "Got '$tmp'\n";
- return ($tmp, $category);
- }
- } elsif (/\[(.*)\]/) {
- $category = $1;
- } elsif ($category eq "general") {
- if (/([^\s]+)\s*\=\s*(.*)/) {
- if ($1 eq "dbname") {
- $dbname = $2;
- } elsif ($1 eq "dbpass") {
- $dbpass = $2;
- } elsif ($1 eq "dbhost") {
- $dbhost = $2;
- } elsif ($1 eq "dbuser") {
- $dbuser = $2;
- }
- }
- if ($dbname and $dbpass and $dbhost and $dbuser) {
- # db variables are present. Use db for authentication.
- my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass);
- my $sth = $dbh->prepare(qq{select fullname,context from users where mailbox='$mbox' and password='$pass' and context='$context'});
- $sth->execute();
- if (($fullname, $category) = $sth->fetchrow_array()) {;
- return ($fullname ? $fullname : "Extension $mbox in $context",$category);
- }
- }
- } elsif (($category ne "general") && ($category ne "zonemessages")) {
- if (/([^\s]+)\s*\=\>?\s*(.*)/) {
- @fields = split(/\,\s*/, $2);
- # print "<p>Mailbox is $1\n";
- if (($mbox eq $1) && (($pass eq $fields[0]) || ("-${pass}" eq $fields[0])) && ($context eq $category)) {
- return ($fields[1] ? $fields[1] : "Extension $mbox in $context", $category);
- }
- }
- }
- }
- close(VMAIL);
- return ("", $category);
- }
- sub validmailbox()
- {
- local ($context, $mbox, $filename, $startcat) = @_;
- local $category = $startcat;
- local @fields;
- local (*VMAIL);
- if (!$context) {
- $context = param('context');
- }
- if (!$context) {
- $context = "default";
- }
- if (!$filename) {
- $filename = "/etc/asterisk/voicemail.conf";
- }
- if (!$category) {
- $category = "general";
- }
- open(VMAIL, "<$filename") || die("Bleh, no $filename");
- while(<VMAIL>) {
- chomp;
- if (/include\s\"([^\"]+)\"$/) {
- ($tmp, $category) = &validmailbox($mbox, $context, "/etc/asterisk/$1");
- if ($tmp) {
- return ($tmp, $category);
- }
- } elsif (/\[(.*)\]/) {
- $category = $1;
- } elsif ($category eq "general") {
- if (/([^\s]+)\s*\=\s*(.*)/) {
- if ($1 eq "dbname") {
- $dbname = $2;
- } elsif ($1 eq "dbpass") {
- $dbpass = $2;
- } elsif ($1 eq "dbhost") {
- $dbhost = $2;
- } elsif ($1 eq "dbuser") {
- $dbuser = $2;
- }
- }
- if ($dbname and $dbpass and $dbhost and $dbuser) {
- # db variables are present. Use db for authentication.
- my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass);
- my $sth = $dbh->prepare(qq{select fullname,context from users where mailbox='$mbox' and password='$pass' and context='$context'});
- $sth->execute();
- if (($fullname, $category) = $sth->fetchrow_array()) {;
- return ($fullname ? $fullname : "unknown", $category);
- }
- }
- } elsif (($category ne "general") && ($category ne "zonemessages") && ($category eq $context)) {
- if (/([^\s]+)\s*\=\>?\s*(.*)/) {
- @fields = split(/\,\s*/, $2);
- if (($mbox eq $1) && ($context eq $category)) {
- return ($fields[2] ? $fields[2] : "unknown", $category);
- }
- }
- }
- }
- return ("", $category);
- }
- sub mailbox_options()
- {
- local($context, $current, $filename, $category) = @_;
- local (*VMAIL);
- local $tmp2;
- local $tmp;
- if (!$filename) {
- $filename = "/etc/asterisk/voicemail.conf";
- }
- if (!$category) {
- $category = "general";
- }
- # print header;
- # print "Including <h2>$filename</h2> while in <h2>$category</h2>...\n";
- open(VMAIL, "<$filename") || die("Bleh, no voicemail.conf");
- while(<VMAIL>) {
- chomp;
- s/\;.*$//;
- if (/include\s\"([^\"]+)\"$/) {
- ($tmp2, $category) = &mailbox_options($context, $current, "/etc/asterisk/$1", $category);
- # print "Got '$tmp2'...\n";
- $tmp .= $tmp2;
- } elsif (/\[(.*)\]/) {
- $category = $1;
- } elsif ($category eq "general") {
- if (/([^\s]+)\s*\=\s*(.*)/) {
- if ($1 eq "dbname") {
- $dbname = $2;
- } elsif ($1 eq "dbpass") {
- $dbpass = $2;
- } elsif ($1 eq "dbhost") {
- $dbhost = $2;
- } elsif ($1 eq "dbuser") {
- $dbuser = $2;
- }
- }
- if ($dbname and $dbpass and $dbhost and $dbuser) {
- # db variables are present. Use db for authentication.
- my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass);
- my $sth = $dbh->prepare(qq{select mailbox,fullname,context from users where context='$context' order by mailbox});
- $sth->execute();
- while (($mailbox, $fullname, $category) = $sth->fetchrow_array()) {
- $text = $mailbox;
- if ($fullname) {
- $text .= " (".$fullname.")";
- }
- if ($mailbox eq $current) {
- $tmp .= "<OPTION SELECTED>$text</OPTION>\n";
- } else {
- $tmp .= "<OPTION>$text</OPTION>\n";
- }
- }
- return ($tmp, $category);
- }
- } elsif (($category ne "general") && ($category ne "zonemessages")) {
- if (/([^\s]+)\s*\=\>?\s*(.*)/) {
- @fields = split(/\,\s*/, $2);
- $text = "$1";
- if ($fields[1]) {
- $text .= " ($fields[1])";
- }
- if ($1 eq $current) {
- $tmp .= "<OPTION SELECTED>$text</OPTION>\n";
- } else {
- $tmp .= "<OPTION>$text</OPTION>\n";
- }
-
- }
- }
- }
- close(VMAIL);
- return ($tmp, $category);
- }
- sub mailbox_list()
- {
- local ($name, $context, $current) = @_;
- local $tmp;
- local $text;
- local $tmp;
- local $opts;
- if (!$context) {
- $context = "default";
- }
- $tmp = "<SELECT name=\"$name\">\n";
- ($opts) = &mailbox_options($context, $current);
- $tmp .= $opts;
- $tmp .= "</SELECT>\n";
-
- }
- sub msgcount()
- {
- my ($context, $mailbox, $folder) = @_;
- my $path = "/var/spool/asterisk/voicemail/$context/$mailbox/$folder";
- if (opendir(DIR, $path)) {
- my @msgs = grep(/^msg....\.txt$/, readdir(DIR));
- closedir(DIR);
- return sprintf "%d", $#msgs + 1;
- }
- return "0";
- }
- sub msgcountstr()
- {
- my ($context, $mailbox, $folder) = @_;
- my $count = &msgcount($context, $mailbox, $folder);
- if ($count > 1) {
- "$count messages";
- } elsif ($count > 0) {
- "$count message";
- } else {
- "no messages";
- }
- }
- sub messages()
- {
- my ($context, $mailbox, $folder) = @_;
- my $path = "/var/spool/asterisk/voicemail/$context/$mailbox/$folder";
- if (opendir(DIR, $path)) {
- my @msgs = sort grep(/^msg....\.txt$/, readdir(DIR));
- closedir(DIR);
- return map { s/^msg(....)\.txt$/$1/; $_ } @msgs;
- }
- return ();
- }
- sub getcookie()
- {
- my ($var) = @_;
- return cookie($var);
- }
- sub makecookie()
- {
- my ($format) = @_;
- cookie(-name => "format", -value =>["$format"], -expires=>"+1y");
- }
- sub getfields()
- {
- my ($context, $mailbox, $folder, $msg) = @_;
- my $fields;
- if (open(MSG, "</var/spool/asterisk/voicemail/$context/$mailbox/$folder/msg${msg}.txt")) {
- while(<MSG>) {
- s/\#.*$//g;
- if (/^(\w+)\s*\=\s*(.*)$/) {
- $fields->{$1} = $2;
- }
- }
- close(MSG);
- $fields->{'msgid'} = $msg;
- } else { print "<BR>Unable to open '$msg' in '$mailbox', '$folder'\n<B>"; }
- $fields;
- }
- sub message_prefs()
- {
- my ($nextaction, $msgid) = @_;
- my $folder = param('folder');
- my $mbox = param('mailbox');
- my $context = param('context');
- my $passwd = param('password');
- my $format = param('format');
- if (!$format) {
- $format = &getcookie('format');
- }
- print header;
- print <<_EOH;
- <TITLE>Asterisk Web-Voicemail: Preferences</TITLE>
- <BODY BGCOLOR="white">
- $stdcontainerstart
- <FORM METHOD="post">
- <table width=100% align=center>
- <tr><td align=right colspan=3><font size=+2>Web Voicemail Preferences</font></td></tr>
- <tr><td align=left><font size=+1>Preferred Audio Format:</font></td><td colspan=2></td></tr>
- _EOH
- foreach $fmt (sort { $formats{$a}->{'pref'} <=> $formats{$b}->{'pref'} } keys %formats) {
- my $clicked = "checked" if $fmt eq $format;
- print "<tr><td></td><td align=left><input type=radio name=\"format\" $clicked value=\"$fmt\"></td><td width=100%> $formats{$fmt}->{name}</td></tr>\n";
- }
- print <<_EOH;
- <tr><td align=right colspan=3><input type=submit value="save settings..."></td></tr>
- </table>
- <input type=hidden name="action" value="$nextaction">
- <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">
- <input type=hidden name="msgid" value="$msgid">
- $stdcontainerend
- </BODY>\n
- _EOH
- }
- sub message_play()
- {
- my ($message, $msgid) = @_;
- my $folder = param('folder');
- my ($mbox, $context) = split(/\@/, param('mailbox'));
- my $passwd = param('password');
- my $format = param('format');
-
- my $fields;
- if (!$context) {
- $context = param('context');
- }
- if (!$context) {
- $context = "default";
- }
-
- my $folders = &folder_list('newfolder', $context, $mbox, $folder);
- my $mailboxes = &mailbox_list('forwardto', $context, $mbox);
- if (!$format) {
- $format = &getcookie('format');
- }
- if (!$format) {
- &message_prefs("play", $msgid);
- } else {
- print header(-cookie => &makecookie($format));
- $fields = &getfields($context, $mbox, $folder, $msgid);
- if (!$fields) {
- print "<BR>Bah!\n";
- return;
- }
- my $duration = $fields->{'duration'};
- if ($duration) {
- $duration = sprintf "%d:%02d", $duration/60, $duration % 60;
- } else {
- $duration = "<i>Unknown</i>";
- }
- print <<_EOH;
-
- <TITLE>Asterisk Web-Voicemail: $folder Message $msgid</TITLE>
- <BODY BGCOLOR="white">
- $stdcontainerstart
- <FORM METHOD="post">
- <table width=100% align=center>
- <tr><td align=right colspan=3><font size=+1>$folder Message $msgid</font></td></tr>
- _EOH
- print <<_EOH;
- <tr><td align=center colspan=3>
- <table>
- <tr><td colspan=2 align=center><font size=+1>$folder <b>$msgid</b></font></td></tr>
- <tr><td><b>Message:</b></td><td>$msgid</td></tr>\n
- <tr><td><b>Mailbox:</b></td><td>$mbox\@$context</td></tr>\n
- <tr><td><b>Folder:</b></td><td>$folder</td></tr>\n
- <tr><td><b>From:</b></td><td>$fields->{callerid}</td></tr>\n
- <tr><td><b>Duration:</b></td><td>$duration</td></tr>\n
- <tr><td><b>Original Date:</b></td><td>$fields->{origdate}</td></tr>\n
- <tr><td><b>Original Mailbox:</b></td><td>$fields->{origmailbox}</td></tr>\n
- <tr><td><b>Caller Channel:</b></td><td>$fields->{callerchan}</td></tr>\n
- <tr><td align=center colspan=2>
- <input name="action" type=submit value="index">
- <input name="action" type=submit value="delete ">
- <input name="action" type=submit value="forward to -> ">
- $mailboxes
- <input name="action" type=submit value="save to ->">
- $folders
- <input name="action" type=submit value="play ">
- <input name="action" type=submit value="download">
- </td></tr>
- <tr><td colspan=2 align=center>
- <embed width=400 height=40 src="vmail.cgi?action=audio&folder=$folder&mailbox=$mbox&context=$context&password=$passwd&msgid=$msgid&format=$format&dontcasheme=$$.$format" autostart=yes loop=false></embed>
- </td></tr></table>
- </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">
- <input type=hidden name="msgid" value="$msgid">
- $stdcontainerend
- </BODY>\n
- _EOH
- }
- }
- sub message_audio()
- {
- my ($forcedownload) = @_;
- my $folder = param('folder');
- my $msgid = param('msgid');
- my $mailbox = param('mailbox');
- my $context = param('context');
- my $format = param('format');
- if (!$format) {
- $format = &getcookie('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>
- _EOH
- print "<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">
- _EOH
- if ($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";
- mkdir $path, 0770;
- my $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;
- 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";
- mkdir $path, 0770;
- my $path = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX";
- mkdir $path, 0770;
- my $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 "";
- }
- $msgcount = &msgcount($context, $newmbox, "INBOX");
- my $txt;
- 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";
- }
- 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');
- 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";
- }
- # 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("\ ");
- }
|