mirror of
https://github.com/asterisk/asterisk.git
synced 2025-09-04 20:04:50 +00:00
add path-locking to voicemail CGI app (bug #4304)
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@6055 65c4cc65-6c06-0410-ace0-fbb531ad65f3
This commit is contained in:
@@ -11,10 +11,15 @@
|
||||
# (icky, I know.... if you know better perl please help!)
|
||||
#
|
||||
#
|
||||
# Synchronization added by GDS Partners (www.gdspartners.com)
|
||||
# Stojan Sljivic (stojan.sljivic@gdspartners.com)
|
||||
#
|
||||
use CGI qw/:standard/;
|
||||
use Carp::Heavy;
|
||||
use CGI::Carp qw(fatalsToBrowser);
|
||||
use DBI;
|
||||
use Fcntl qw ( O_WRONLY O_CREAT O_EXCL );
|
||||
use Time::HiRes qw ( usleep );
|
||||
|
||||
$context=""; # Define here your by default context (so you dont need to put voicemail@context in the login
|
||||
|
||||
@@ -44,6 +49,57 @@ $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 lock_path() {
|
||||
|
||||
my($path) = @_;
|
||||
my $rand;
|
||||
my $rfile;
|
||||
my $start;
|
||||
my $res;
|
||||
|
||||
$rand = rand 99999999;
|
||||
$rfile = "$path/.lock-$rand";
|
||||
|
||||
sysopen(RFILE, $rfile, O_WRONLY | O_CREAT | O_EXCL, 0666) or return -1;
|
||||
close(RFILE);
|
||||
|
||||
$res = link($rfile, "$path/.lock");
|
||||
$start = time;
|
||||
if ($res == 0) {
|
||||
while (($res == 0) && (time - $start <= 5)) {
|
||||
$res = link($rfile, "$path/.lock");
|
||||
usleep(1);
|
||||
}
|
||||
}
|
||||
unlink($rfile);
|
||||
|
||||
if ($res == 0) {
|
||||
return -1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
sub unlock_path() {
|
||||
|
||||
my($path) = @_;
|
||||
|
||||
unlink("$path/.lock");
|
||||
}
|
||||
|
||||
sub untaint() {
|
||||
|
||||
my($data) = @_;
|
||||
|
||||
if ($data =~ /^([-\@\w.]+)$/) {
|
||||
$data = $1;
|
||||
} else {
|
||||
die "Security violation.";
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
sub login_screen() {
|
||||
print header;
|
||||
my ($message) = @_;
|
||||
@@ -873,19 +929,29 @@ sub message_forward()
|
||||
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++;
|
||||
$context = &untaint($context);
|
||||
$newmbox = &untaint($newmbox);
|
||||
my $path = "/var/spool/asterisk/voicemail/$context/$newmbox/INBOX";
|
||||
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";
|
||||
}
|
||||
$txt = "Forwarded messages " . join(', ', @msgs) . "to $newmbox";
|
||||
&unlock_path($path);
|
||||
} else {
|
||||
$txt = "Can't forward messages to yourself!\n";
|
||||
}
|
||||
$txt = "Cannot forward messages: Unable to lock path.\n";
|
||||
}
|
||||
if ($toindex) {
|
||||
&message_index($folder, $txt);
|
||||
} else {
|
||||
@@ -910,33 +976,42 @@ sub message_delete_or_move()
|
||||
$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++;
|
||||
$context = &untaint($context);
|
||||
$mbox = &untaint($mbox);
|
||||
$folder = &untaint($folder);
|
||||
my $path = "/var/spool/asterisk/voicemail/$context/$mbox/$folder";
|
||||
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_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) {
|
||||
$txt = "Deleted messages " . join (', ', @msgs);
|
||||
if ($del) {
|
||||
$txt = "Deleted messages " . join (', ', @msgs);
|
||||
} else {
|
||||
$txt = "Moved messages " . join (', ', @msgs) . " to $newfolder";
|
||||
}
|
||||
} 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 {
|
||||
$txt = "Can't move a message to the same folder they're in already";
|
||||
$txt = "Cannot move/delete messages: Unable to lock path.\n";
|
||||
}
|
||||
# Not as many messages now
|
||||
$msgcount--;
|
||||
|
Reference in New Issue
Block a user