#!/usr/bin/perl
+use File::stat;
use strict;
use warnings;
use Digest::SHA qw(sha256_hex sha1);
use MIME::Base64;
use File::Spec;
+use File::Spec::Functions qw(rel2abs);
use CGI;
use HTML::Entities;
use IO::Handle;
my $transaction="unknown";
my $logfile = "/var/log/download.log";
-my $datadir = "/var/www/server.example.com/public_html/download/";
+my $datadir = dirname(rel2abs($0))."/";
my $secretfile="/etc/apache2/download.secret";
my $secret;
my $sentheader = 0;
return sha256_hex(shift @_);
}
+sub getfile
+{
+ my $fn = $datadir.(shift @_);
+ $fn = File::Spec->rel2abs( readlink($fn) ) if (-l $fn);
+ qdie ("File not found") unless ( -f $fn);
+ return $fn;
+}
+
sub decodeparams
{
my $query = CGI::url(-absolute=>1);
my $hash = gethash($clienttime.":".$clientid.":".$clientfile.":".$secret);
qdie ("Bad hash") unless ($hash eq $clienthash);
- my $fn = $datadir.$clientfile;
- $fn = File::Spec->rel2abs( readlink($fn) ) if (-l $fn);
- qdie ("File not found") unless ( -f $fn);
+ my $fn = getfile($clientfile);
$clientfile = basename ($fn);
$transaction=$hash." ".$clientfile." ".$clientid;
return $fn;
}
+sub doinfo
+{
+ my $clientfile = shift @_;
+ my $fn = getfile($clientfile);
+ $clientfile = basename ($fn);
+ my $size = "unknown";
+ my $sb = stat($fn);
+ $size = $sb->size if (defined($sb) && defined($sb->size));
+ my $md5sum = "unknown";
+ my $md5fn = $fn.".md5sum";
+ if ( -r $md5fn )
+ {
+ my $md5;
+ open $md5, "<", $md5fn || qdie ("Can't read md5sum");
+ while (<$md5>)
+ {
+ chomp;
+ $md5sum = $1 if (/^([a-f0-9]+)\b/);
+ }
+ close $md5;
+ }
+ $sentheader = 1;
+ print CGI::header(
+ -type => 'text/plain' );
+
+ print "$clientfile $size $md5sum\n";
+}
+
open (my $sfh, "<", $secretfile) || qdie("Can't open secret file $secretfile: $!");
chomp($secret=join("",<$sfh>));
close ($sfh);
}
else
{
+ my $info = CGI::url_param('info');
+ if (defined($info))
+ {
+ doinfo($info);
+ exit 0;
+ }
+
openlog;
my $file = decodeparams;
my $sb = stat($file);