Merged revisions 114689 via svnmerge from

https://origsvn.digium.com/svn/asterisk/branches/1.4

........
r114689 | tilghman | 2008-04-26 08:15:21 -0500 (Sat, 26 Apr 2008) | 6 lines

Clicking forward without selecting a message leaves an errant .lock file.
(closes issue #12528)
 Reported by: pukepail
 Patches: 
       patch.diff uploaded by pukepail (license 431)

........


git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@114690 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
Tilghman Lesher 2008-04-26 13:17:19 +00:00
parent c5f11a59d0
commit 3376c2212c
1 changed files with 139 additions and 131 deletions

View File

@ -21,7 +21,7 @@ use DBI;
use Fcntl qw ( O_WRONLY O_CREAT O_EXCL ); use Fcntl qw ( O_WRONLY O_CREAT O_EXCL );
use Time::HiRes qw ( usleep ); use Time::HiRes qw ( usleep );
$context=""; # Define here your by default context (so you dont need to put voicemail@context in the login $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" ); @validfolders = ( "INBOX", "Old", "Work", "Family", "Friends", "Cust1", "Cust2", "Cust3", "Cust4", "Cust5" );
@ -46,10 +46,10 @@ $context=""; # Define here your by default context (so you dont need to put voic
$astpath = "/_asterisk"; $astpath = "/_asterisk";
$stdcontainerstart = "<table align=center width=600><tr><td>\n"; $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>"; $footer = "<hr><font size=-1><a href=\"http://www.asterisk.org\">The Asterisk Open Source PBX</a> Copyright 2004-2008, <a href=\"http://www.digium.com\">Digium, Inc.</a></a>";
$stdcontainerend = "</td></tr><tr><td align=right>$footer</td></tr></table>\n"; $stdcontainerend = "</td></tr><tr><td align=right>$footer</td></tr></table>\n";
sub lock_path() { sub lock_path($) {
my($path) = @_; my($path) = @_;
my $rand; my $rand;
@ -80,14 +80,14 @@ sub lock_path() {
} }
} }
sub unlock_path() { sub unlock_path($) {
my($path) = @_; my($path) = @_;
unlink("$path/.lock"); unlink("$path/.lock");
} }
sub untaint() { sub untaint($) {
my($data) = @_; my($data) = @_;
@ -100,7 +100,7 @@ sub untaint() {
return $data; return $data;
} }
sub login_screen() { sub login_screen($) {
print header; print header;
my ($message) = @_; my ($message) = @_;
print <<_EOH; print <<_EOH;
@ -126,7 +126,7 @@ _EOH
} }
sub check_login() sub check_login($$)
{ {
local ($filename, $startcat) = @_; local ($filename, $startcat) = @_;
local ($mbox, $context) = split(/\@/, param('mailbox')); local ($mbox, $context) = split(/\@/, param('mailbox'));
@ -160,28 +160,28 @@ sub check_login()
} }
} elsif (/\[(.*)\]/) { } elsif (/\[(.*)\]/) {
$category = $1; $category = $1;
} elsif ($category eq "general") { } elsif ($category eq "general") {
if (/([^\s]+)\s*\=\s*(.*)/) { if (/([^\s]+)\s*\=\s*(.*)/) {
if ($1 eq "dbname") { if ($1 eq "dbname") {
$dbname = $2; $dbname = $2;
} elsif ($1 eq "dbpass") { } elsif ($1 eq "dbpass") {
$dbpass = $2; $dbpass = $2;
} elsif ($1 eq "dbhost") { } elsif ($1 eq "dbhost") {
$dbhost = $2; $dbhost = $2;
} elsif ($1 eq "dbuser") { } elsif ($1 eq "dbuser") {
$dbuser = $2; $dbuser = $2;
} }
} }
if ($dbname and $dbpass and $dbhost and $dbuser) { if ($dbname and $dbpass and $dbhost and $dbuser) {
# db variables are present. Use db for authentication. # db variables are present. Use db for authentication.
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass); my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass);
my $sth = $dbh->prepare(qq{select fullname,context from voicemail where mailbox='$mbox' and password='$pass' and context='$context'}); my $sth = $dbh->prepare(qq{select fullname,context from voicemail where mailbox='$mbox' and password='$pass' and context='$context'});
$sth->execute(); $sth->execute();
if (($fullname, $category) = $sth->fetchrow_array()) {; if (($fullname, $category) = $sth->fetchrow_array()) {
return ($fullname ? $fullname : "Extension $mbox in $context",$category); return ($fullname ? $fullname : "Extension $mbox in $context",$category);
} }
} }
} elsif (($category ne "general") && ($category ne "zonemessages")) { } elsif (($category ne "general") && ($category ne "zonemessages")) {
if (/([^\s]+)\s*\=\>?\s*(.*)/) { if (/([^\s]+)\s*\=\>?\s*(.*)/) {
@fields = split(/\,\s*/, $2); @fields = split(/\,\s*/, $2);
@ -196,7 +196,7 @@ sub check_login()
return ("", $category); return ("", $category);
} }
sub validmailbox() sub validmailbox($$$$)
{ {
local ($context, $mbox, $filename, $startcat) = @_; local ($context, $mbox, $filename, $startcat) = @_;
local $category = $startcat; local $category = $startcat;
@ -215,7 +215,7 @@ sub validmailbox()
$category = "general"; $category = "general";
} }
open(VMAIL, "<$filename") || die("Bleh, no $filename"); open(VMAIL, "<$filename") || die("Bleh, no $filename");
while(<VMAIL>) { while (<VMAIL>) {
chomp; chomp;
if (/include\s\"([^\"]+)\"$/) { if (/include\s\"([^\"]+)\"$/) {
($tmp, $category) = &validmailbox($mbox, $context, "/etc/asterisk/$1"); ($tmp, $category) = &validmailbox($mbox, $context, "/etc/asterisk/$1");
@ -224,28 +224,28 @@ sub validmailbox()
} }
} elsif (/\[(.*)\]/) { } elsif (/\[(.*)\]/) {
$category = $1; $category = $1;
} elsif ($category eq "general") { } elsif ($category eq "general") {
if (/([^\s]+)\s*\=\s*(.*)/) { if (/([^\s]+)\s*\=\s*(.*)/) {
if ($1 eq "dbname") { if ($1 eq "dbname") {
$dbname = $2; $dbname = $2;
} elsif ($1 eq "dbpass") { } elsif ($1 eq "dbpass") {
$dbpass = $2; $dbpass = $2;
} elsif ($1 eq "dbhost") { } elsif ($1 eq "dbhost") {
$dbhost = $2; $dbhost = $2;
} elsif ($1 eq "dbuser") { } elsif ($1 eq "dbuser") {
$dbuser = $2; $dbuser = $2;
} }
} }
if ($dbname and $dbpass and $dbhost and $dbuser) { if ($dbname and $dbpass and $dbhost and $dbuser) {
# db variables are present. Use db for authentication. # db variables are present. Use db for authentication.
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass); my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass);
my $sth = $dbh->prepare(qq{select fullname,context from voicemail where mailbox='$mbox' and password='$pass' and context='$context'}); my $sth = $dbh->prepare(qq{select fullname,context from voicemail where mailbox='$mbox' and password='$pass' and context='$context'});
$sth->execute(); $sth->execute();
if (($fullname, $context) = $sth->fetchrow_array()) {; if (($fullname, $context) = $sth->fetchrow_array()) {
return ($fullname ? $fullname : "unknown", $category); return ($fullname ? $fullname : "unknown", $category);
} }
} }
} elsif (($category ne "general") && ($category ne "zonemessages") && ($category eq $context)) { } elsif (($category ne "general") && ($category ne "zonemessages") && ($category eq $context)) {
if (/([^\s]+)\s*\=\>?\s*(.*)/) { if (/([^\s]+)\s*\=\>?\s*(.*)/) {
@fields = split(/\,\s*/, $2); @fields = split(/\,\s*/, $2);
@ -282,37 +282,37 @@ sub mailbox_options()
$tmp .= $tmp2; $tmp .= $tmp2;
} elsif (/\[(.*)\]/) { } elsif (/\[(.*)\]/) {
$category = $1; $category = $1;
} elsif ($category eq "general") { } elsif ($category eq "general") {
if (/([^\s]+)\s*\=\s*(.*)/) { if (/([^\s]+)\s*\=\s*(.*)/) {
if ($1 eq "dbname") { if ($1 eq "dbname") {
$dbname = $2; $dbname = $2;
} elsif ($1 eq "dbpass") { } elsif ($1 eq "dbpass") {
$dbpass = $2; $dbpass = $2;
} elsif ($1 eq "dbhost") { } elsif ($1 eq "dbhost") {
$dbhost = $2; $dbhost = $2;
} elsif ($1 eq "dbuser") { } elsif ($1 eq "dbuser") {
$dbuser = $2; $dbuser = $2;
} }
} }
if ($dbname and $dbpass and $dbhost and $dbuser) { if ($dbname and $dbpass and $dbhost and $dbuser) {
# db variables are present. Use db for authentication. # db variables are present. Use db for authentication.
my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass); my $dbh = DBI->connect("DBI:mysql:$dbname:$dbhost",$dbuser,$dbpass);
my $sth = $dbh->prepare(qq{select mailbox,fullname,context from voicemail where context='$context' order by mailbox}); my $sth = $dbh->prepare(qq{select mailbox,fullname,context from voicemail where context='$context' order by mailbox});
$sth->execute(); $sth->execute();
while (($mailbox, $fullname, $category) = $sth->fetchrow_array()) { while (($mailbox, $fullname, $category) = $sth->fetchrow_array()) {
$text = $mailbox; $text = $mailbox;
if ($fullname) { if ($fullname) {
$text .= " (".$fullname.")"; $text .= " (".$fullname.")";
} }
if ($mailbox eq $current) { if ($mailbox eq $current) {
$tmp .= "<OPTION SELECTED>$text</OPTION>\n"; $tmp .= "<OPTION SELECTED>$text</OPTION>\n";
} else { } else {
$tmp .= "<OPTION>$text</OPTION>\n"; $tmp .= "<OPTION>$text</OPTION>\n";
} }
} }
return ($tmp, $category); return ($tmp, $category);
} }
} elsif (($category ne "general") && ($category ne "zonemessages")) { } elsif (($category ne "general") && ($category ne "zonemessages")) {
if (/([^\s]+)\s*\=\>?\s*(.*)/) { if (/([^\s]+)\s*\=\>?\s*(.*)/) {
@fields = split(/\,\s*/, $2); @fields = split(/\,\s*/, $2);
@ -587,7 +587,7 @@ sub message_index()
my $message2; my $message2;
my $msgcount; my $msgcount;
my $hasmsg; my $hasmsg;
my $newmessages, $oldmessages; my ($newmessages, $oldmessages);
my $format = param('format'); my $format = param('format');
if (!$format) { if (!$format) {
$format = &getcookie('format'); $format = &getcookie('format');
@ -737,14 +737,14 @@ sub folder_list()
sub message_rename() sub message_rename()
{ {
my ($context, $mbox, $oldfolder, $old, $newfolder, $new) = @_; my ($context, $mbox, $oldfolder, $old, $newfolder, $new) = @_;
my $oldfile, $newfile; my ($oldfile, $newfile);
return if ($old eq $new) && ($oldfolder eq $newfolder); return if ($old eq $new) && ($oldfolder eq $newfolder);
if ($context =~ /^(\w+)$/) { if ($context =~ /^(\w+)$/) {
$context = $1; $context = $1;
} else { } else {
die("Invalid Context<BR>\n"); die("Invalid Context<BR>\n");
} }
if ($mbox =~ /^(\w+)$/) { if ($mbox =~ /^(\w+)$/) {
$mbox = $1; $mbox = $1;
@ -780,7 +780,7 @@ sub message_rename()
$path =~ /^(.*)$/; $path =~ /^(.*)$/;
$path = $1; $path = $1;
mkdir $path, 0770; mkdir $path, 0770;
my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$oldfolder"; $path = "/var/spool/asterisk/voicemail/$context/$mbox/$oldfolder";
opendir(DIR, $path) || die("Unable to open directory\n"); opendir(DIR, $path) || die("Unable to open directory\n");
my @files = grep /^msg${old}\.\w+$/, readdir(DIR); my @files = grep /^msg${old}\.\w+$/, readdir(DIR);
closedir(DIR); closedir(DIR);
@ -818,7 +818,7 @@ sub file_copy()
sub message_copy() sub message_copy()
{ {
my ($context, $mbox, $newmbox, $oldfolder, $old, $new) = @_; my ($context, $mbox, $newmbox, $oldfolder, $old, $new) = @_;
my $oldfile, $newfile; my ($oldfile, $newfile);
return if ($mbox eq $newmbox); return if ($mbox eq $newmbox);
if ($mbox =~ /^(\w+)$/) { if ($mbox =~ /^(\w+)$/) {
@ -855,11 +855,11 @@ sub message_copy()
$path =~ /^(.*)$/; $path =~ /^(.*)$/;
$path = $1; $path = $1;
mkdir $path, 0770; mkdir $path, 0770;
my $path = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX"; $path = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX";
$path =~ /^(.*)$/; $path =~ /^(.*)$/;
$path = $1; $path = $1;
mkdir $path, 0770; mkdir $path, 0770;
my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$oldfolder"; $path = "/var/spool/asterisk/voicemail/$context/$mbox/$oldfolder";
opendir(DIR, $path) || die("Unable to open directory\n"); opendir(DIR, $path) || die("Unable to open directory\n");
my @files = grep /^msg${old}\.\w+$/, readdir(DIR); my @files = grep /^msg${old}\.\w+$/, readdir(DIR);
closedir(DIR); closedir(DIR);
@ -936,23 +936,27 @@ sub message_forward()
$context = &untaint($context); $context = &untaint($context);
$newmbox = &untaint($newmbox); $newmbox = &untaint($newmbox);
my $path = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX"; my $path = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX";
if (&lock_path($path) == 0) { if ($msgs[0]) {
$msgcount = &msgcount($context, $newmbox, "INBOX"); if (&lock_path($path) == 0) {
$msgcount = &msgcount($context, $newmbox, "INBOX");
if ($newmbox ne $mbox) {
# print header; if ($newmbox ne $mbox) {
foreach $msg (@msgs) { # print header;
# print "Forwarding $msg from $mbox to $newmbox<BR>\n"; foreach $msg (@msgs) {
&message_copy($context, $mbox, $newmbox, $folder, $msg, sprintf "%04d", $msgcount); # print "Forwarding $msg from $mbox to $newmbox<BR>\n";
$msgcount++; &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";
} }
$txt = "Forwarded messages " . join(', ', @msgs) . "to $newmbox"; &unlock_path($path);
} else { } else {
$txt = "Can't forward messages to yourself!\n"; $txt = "Cannot forward messages: Unable to lock path.\n";
} }
&unlock_path($path);
} else { } else {
$txt = "Cannot forward messages: Unable to lock path.\n"; $txt = "Please Select Message(s) for this action.\n";
} }
if ($toindex) { if ($toindex) {
&message_index($folder, $txt); &message_index($folder, $txt);
@ -966,7 +970,7 @@ sub message_delete_or_move()
my ($toindex, $del, @msgs) = @_; my ($toindex, $del, @msgs) = @_;
my $txt; my $txt;
my $path; my $path;
my $y, $x; my ($y, $x);
my $folder = param('folder'); my $folder = param('folder');
my $newfolder = param('newfolder') unless $del; my $newfolder = param('newfolder') unless $del;
$newfolder =~ s/^(\w+)\s+.*$/$1/; $newfolder =~ s/^(\w+)\s+.*$/$1/;
@ -981,39 +985,43 @@ sub message_delete_or_move()
$context = &untaint($context); $context = &untaint($context);
$mbox = &untaint($mbox); $mbox = &untaint($mbox);
$folder = &untaint($folder); $folder = &untaint($folder);
my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$folder"; $path = "/var/spool/asterisk/voicemail/$context/$mbox/$folder";
if (&lock_path($path) == 0) { if ($msgs[0]) {
my $msgcount = &msgcount($context, $mbox, $folder); if (&lock_path($path) == 0) {
my $omsgcount = &msgcount($context, $mbox, $newfolder) if $newfolder; my $msgcount = &msgcount($context, $mbox, $folder);
# print header; my $omsgcount = &msgcount($context, $mbox, $newfolder) if $newfolder;
if ($newfolder ne $folder) { # print header;
$y = 0; if ($newfolder ne $folder) {
for ($x=0;$x<$msgcount;$x++) { $y = 0;
my $msg = sprintf "%04d", $x; for ($x=0;$x<$msgcount;$x++) {
my $newmsg = sprintf "%04d", $y; my $msg = sprintf "%04d", $x;
if (grep(/^$msg$/, @msgs)) { my $newmsg = sprintf "%04d", $y;
if ($newfolder) { if (grep(/^$msg$/, @msgs)) {
&message_rename($context, $mbox, $folder, $msg, $newfolder, sprintf "%04d", $omsgcount); if ($newfolder) {
$omsgcount++; &message_rename($context, $mbox, $folder, $msg, $newfolder, sprintf "%04d", $omsgcount);
$omsgcount++;
} else {
&message_delete($context, $mbox, $folder, $msg);
}
} else { } else {
&message_delete($context, $mbox, $folder, $msg); &message_rename($context, $mbox, $folder, $msg, $folder, $newmsg);
$y++;
} }
} else {
&message_rename($context, $mbox, $folder, $msg, $folder, $newmsg);
$y++;
} }
} if ($del) {
if ($del) { $txt = "Deleted messages " . join (', ', @msgs);
$txt = "Deleted messages " . join (', ', @msgs); } else {
$txt = "Moved messages " . join (', ', @msgs) . " to $newfolder";
}
} else { } else {
$txt = "Moved messages " . join (', ', @msgs) . " to $newfolder"; $txt = "Can't move a message to the same folder they're in already";
} }
&unlock_path($path);
} else { } else {
$txt = "Can't move a message to the same folder they're in already"; $txt = "Cannot move/delete messages: Unable to lock path.\n";
} }
&unlock_path($path);
} else { } else {
$txt = "Cannot move/delete messages: Unable to lock path.\n"; $txt = "Please Select Message(s) for this action.\n";
} }
# Not as many messages now # Not as many messages now
$msgcount--; $msgcount--;