summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--deploy.cgi.sh24
-rwxr-xr-xlex.cgi30
2 files changed, 36 insertions, 18 deletions
diff --git a/deploy.cgi.sh b/deploy.cgi.sh
index 4ccd5de..03ba02b 100644
--- a/deploy.cgi.sh
+++ b/deploy.cgi.sh
@@ -30,21 +30,33 @@ fi
# directory tree
mkdir -p "/var/www/var"
-chmod 755 "/var/www/var"
chown root:daemon "/var/www/var"
+chmod 755 "/var/www/var"
mkdir -p "/var/www/var/lex"
-chmod 710 "/var/www/var/lex"
chown www:tool "/var/www/var/lex"
+chmod 710 "/var/www/var/lex"
+
+mkdir -p "/var/www/var/lex/locks"
+chown www:www "/var/www/var/lex/locks"
+chmod 750 "/var/www/var/lex/locks"
+
+mkdir -p "/var/www/var/lex/spool"
+chown www:tool "/var/www/var/lex/spool"
+chmod 710 "/var/www/var/lex/spool"
+
+mkdir -p "/var/www/var/lex/spool/tmp"
+chown www:www "/var/www/var/lex/spool/tmp"
+chmod 750 "/var/www/var/lex/spool/tmp"
+
+mkdir -p "/var/www/var/lex/spool/new"
+chown www:tool "/var/www/var/lex/spool/new"
+chmod 2770 "/var/www/var/lex/spool/new"
mkdir -p "/var/www/var/log"
chmod 1770 "/var/www/var/log"
chown www:tool "/var/www/var/log"
-mkdir -p "/var/www/var/lex/locks"
-chmod 750 "/var/www/var/lex/locks"
-chown www:www "/var/www/var/lex/locks"
-
# pubring.gpg
cp -f "$SRCDIR/pubring.gpg" "/var/www/var/lex/pubring.gpg"
chmod 440 "/var/www/var/lex/pubring.gpg"
diff --git a/lex.cgi b/lex.cgi
index da17fc5..255ab34 100755
--- a/lex.cgi
+++ b/lex.cgi
@@ -9,7 +9,7 @@ use File::Find;
use File::Path qw(make_path);
use OpenBSD::Pledge;
use OpenBSD::Unveil;
-use Time::HiRes qw(time);
+use Time::HiRes qw(gettimeofday time);
my $start_time = time();
@@ -39,6 +39,7 @@ BEGIN {
my $log_dir = "/var/log";
my $base_dir = "/var/lex";
+my $spool_dir = "/var/lex/spool";
my $keyring_file = "$base_dir/pubring.gpg";
unveil("/dev/null", "rw") or die "unveil /dev/null failed: $!";
@@ -257,24 +258,29 @@ unless (length($plain_text) > 0) {
respond_ok();
}
+my ($sec, $usec) = gettimeofday();
+my $spool_filename = sprintf("spool_%d%06d_%d.job", $sec, $usec, $$);
+my $tmp_spool_file = "$spool_dir/tmp/$spool_filename.tmp";
+my $spool_file = "$spool_dir/new/$spool_filename";
+
# Set umask so group gets read/write (0666 & ~0007 = 0660)
my $old_umask = umask(007);
-my $queue_file = "$base_dir/queue.txt";
-my $is_new = ! -e $queue_file;
-
-my $qfh;
-unless (open($qfh, '>>:utf8', $queue_file)) {
- log_msg("ERROR: Failed to append to $queue_file: $!");
+my $sfh;
+unless (open($sfh, '>:utf8', $tmp_spool_file)) {
+ umask($old_umask);
+ log_msg("ERROR: Failed to create $tmp_spool_file: $!");
respond_ok();
}
-if ($is_new) {
- my $tool_gid = getgrnam('tool');
- chown -1, $tool_gid, $queue_file;
+print $sfh $plain_text . "\n";
+close($sfh);
+
+unless (rename($tmp_spool_file, $spool_file)) {
+ umask($old_umask);
+ log_msg("ERROR: Failed to create $spool_file: $!");
+ respond_ok();
}
-print $qfh $plain_text . "\n";
-close($qfh);
umask($old_umask);
my $elapsed_ms = sprintf("%.2fms", (time() - $start_time) * 1000);