Browse Source

Added rndfile.cgi

Alois Mahdal 11 years ago
parent
commit
6e4c27811e
1 changed files with 130 additions and 0 deletions
  1. 130
    0
      cgi-bin/rndfile.cgi

+ 130
- 0
cgi-bin/rndfile.cgi View File

@@ -0,0 +1,130 @@
1
+#!c:\strawberry\perl\bin\perl.exe
2
+use strict;
3
+use warnings;
4
+use Readonly;
5
+use CGI;
6
+
7
+###
8
+### CONSTANTS ###
9
+###
10
+
11
+# settings
12
+Readonly my $DEFMIN          => 1024;
13
+Readonly my $DEFMAX          => 20480;
14
+Readonly my $FNAME_LENGTH    => 16;
15
+Readonly my $FNAME_EXTENSION => '.txt';
16
+Readonly my $DEBUG           => 0;
17
+# facts
18
+Readonly my $EICAR_BODY      => 'X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*';
19
+Readonly my $HARDMIN         => 1024;
20
+Readonly my $HARDMAX         => 20480;
21
+my @RANDOM_CHARS    =  ( 'a' .. 'z', 'A' .. 'Z', '0' .. '9', '_' );
22
+
23
+( $DEFMIN < $DEFMAX )   or die("Invalid lower and upper limits!");
24
+( $HARDMIN < $HARDMAX ) or die("Invalid lower and upper limits!");
25
+
26
+
27
+my $q = CGI -> new();
28
+
29
+###
30
+### SUBBIES ###
31
+###
32
+sub dprint {                ## @message ## print all $message-s with dbg fancy
33
+    my $mes;
34
+    return if ( $DEBUG == 0 );
35
+    while (1) {
36
+        $mes = shift or return;
37
+        print "randomfile: DEBUG: $mes\n";
38
+    }
39
+    return;
40
+}
41
+
42
+sub minmax_valid {          ## low, high, min, max ## Validate boundaries
43
+    my ($low, $hgh, $min, $max ) = @_;
44
+    # dprint "## $low # $high ## $min # $max ##";
45
+    # If array is wanted, try to crop
46
+    if ( wantarray() ) {
47
+        $low = $min if ( $low <= $min );     # crop low to min
48
+        $low = $max if ( $low >= $max );     # crop low to max
49
+        $hgh = $min if ( $hgh <= $min );     # crop hgh to min
50
+        $hgh = $max if ( $hgh >= $max );     # crop hgh to max
51
+        return ( $low, $hgh, $min, $max );   # return valid low high min max
52
+    }
53
+    # Else just answer if it's OK
54
+    else {
55
+        return 0 if ( $low < $min || $low > $max );
56
+        return 0 if ( $hgh < $min || $hgh > $max );
57
+        return 0 if ( $hgh < $low );
58
+        return 0 if ( $max < $max );
59
+        return 1;
60
+    }
61
+}
62
+
63
+sub http_die {				## $status ## Http-die with $status
64
+  my $status = shift || 400;
65
+  print $q->header ( -type => 'text/plain' , -status => $status );
66
+  exit 1;
67
+}
68
+
69
+sub generate_random_string {    # -------
70
+    my $length = shift;
71
+    my $flush = shift;
72
+    my $random_string;
73
+    foreach ( 1 .. $length ) {
74
+        $random_string .= $RANDOM_CHARS[ rand @RANDOM_CHARS ];
75
+    }
76
+    return $random_string;
77
+}
78
+
79
+sub print_random_string {       # -------
80
+    my $length = shift;
81
+    foreach ( 1 .. $length ) {
82
+        print $RANDOM_CHARS[ rand @RANDOM_CHARS ];
83
+    }
84
+    return 1;
85
+}
86
+
87
+###
88
+### PAREMETER RETRIEVAL & VALIDATION ###
89
+###
90
+
91
+# Get parameters from CGI query
92
+$q->import_names;
93
+my $min             = defined ($Q::min)     ? $Q::min   : $DEFMIN;
94
+my $max             = defined ($Q::max)     ? $Q::max   : $DEFMAX;
95
+my $eicar_chance    = defined ($Q::eicar)   ? $Q::eicar : 0;
96
+
97
+
98
+# Validate min/max against hard min/max
99
+minmax_valid ( $min , $max, $HARDMIN, $HARDMAX  ) or http_die( 400 );
100
+
101
+###
102
+### MAIN ###
103
+###
104
+
105
+# Generate random output length
106
+my $length = int( $min + rand( $max - $min ) );
107
+
108
+# Generate the random filename
109
+my $random_fname  = &generate_random_string($FNAME_LENGTH) . $FNAME_EXTENSION;
110
+
111
+# Random throw of EICAR ( 0 to 99 inclusive )
112
+my $eicar_throw = int ( rand ( 100 ) );
113
+
114
+#final printing
115
+if ($eicar_throw <= $eicar_chance ) {
116
+    # serve EICAR
117
+    print $q->header();
118
+    print $EICAR_BODY;
119
+} else {
120
+    # serve random content
121
+    print $q->header();
122
+    print_random_string($length);
123
+}
124
+
125
+dprint (
126
+    "\$min = $min",
127
+    "\$max = $max",
128
+    "\$eicar_chance = $eicar_chance",
129
+    "\$eicar_throw = $eicar_throw",
130
+    );