]> git.treefish.org Git - fex.git/blobdiff - bin/fexsrv
Original release 20160919
[fex.git] / bin / fexsrv
index 8bef7fc65fb91fa7dd7018f7f97a7fec586127f7..2843167ad78c4327b0806e8a9d626b71e667750b 100755 (executable)
@@ -15,6 +15,7 @@ BEGIN {
   # stunnel workaround
   $SIG{CHLD} = "DEFAULT";
   $ENV{PERLINIT} = q{
   # stunnel workaround
   $SIG{CHLD} = "DEFAULT";
   $ENV{PERLINIT} = q{
+    $ENV{LC_ALL} = 'en_US.UTF-8';
     unshift @INC,(getpwuid($<))[7].'/perl';
     # web error handler
     $SIG{__DIE__} = $SIG{__WARN__} = sub {
     unshift @INC,(getpwuid($<))[7].'/perl';
     # web error handler
     $SIG{__DIE__} = $SIG{__WARN__} = sub {
@@ -92,7 +93,7 @@ foreach my $lib (
 # import from fex.pp
 our ($hostname,$debug,$timeout,$max_error,$max_error_handler);
 our ($spooldir,@logdir,$docdir,$xkeydir,$akeydir,$lockdir);
 # import from fex.pp
 our ($hostname,$debug,$timeout,$max_error,$max_error_handler);
 our ($spooldir,@logdir,$docdir,$xkeydir,$akeydir,$lockdir);
-our ($force_https,$default_locale,$bs,$MB,$adlm);
+our ($force_https,$default_locale,$bs,$MB,$adlm,@forbidden_user_agents);
 our (@locales);
 
 # load common code (local config: $FEXHOME/lib/fex.ph)
 our (@locales);
 
 # load common code (local config: $FEXHOME/lib/fex.ph)
@@ -144,7 +145,7 @@ else {
   if ($ssl_ra) {
     $ENV{PROTO} = 'https';
     $ENV{REMOTE_ADDR} = $ra = $ssl_ra;
   if ($ssl_ra) {
     $ENV{PROTO} = 'https';
     $ENV{REMOTE_ADDR} = $ra = $ssl_ra;
-    if ($ssl_ra =~ /\w:\w/) {
+    if ($ssl_ra =~ /[\w:]:\w/) {
       # ($rh) = `host $ssl_ra 2>/dev/null` =~ /name pointer (.+)\.$/;
       $^W = 0; eval 'use Socket6'; $^W = 1;
       http_error(503) if $@;
       # ($rh) = `host $ssl_ra 2>/dev/null` =~ /name pointer (.+)\.$/;
       $^W = 0; eval 'use Socket6'; $^W = 1;
       http_error(503) if $@;
@@ -368,6 +369,8 @@ REQUEST: while (*STDIN) {
     if ($uri =~ /\\|%5c/i) { badchar("\\") }
   }
 
     if ($uri =~ /\\|%5c/i) { badchar("\\") }
   }
 
+  my $fua = join('|',@forbidden_user_agents);
+
   while ($_ = shift @header) {
 
     # header inquisition!
   while ($_ = shift @header) {
 
     # header inquisition!
@@ -381,12 +384,8 @@ REQUEST: while (*STDIN) {
       exit;
     }
 
       exit;
     }
 
-    if ($header =~ /\nRange:/ and /^User-Agent: (FDM)/) {
-      disconnect($1,"499 Download Manager $1 Not Supported",30);
-    }
-
-    if (/^User-Agent: (Java\/[\d\.]+)/) {
-      disconnect($1,"499 User-Agent $1 Not Supported",30);
+    if ($fua and /^User-Agent: ($fua)/) {
+      disconnect($1,"499 User Agent $1 Not Supported",30);
     }
 
     if (/^Range:.*,/) {
     }
 
     if (/^Range:.*,/) {
@@ -436,7 +435,7 @@ REQUEST: while (*STDIN) {
     }
 
     # HTTP header ==> environment variables
     }
 
     # HTTP header ==> environment variables
-    if (/^([\w\-]+):\s*(.+)/s) {
+    if (/^([\w\-_]+):\s*(.+)/s) {
       $http_var = $1;
       $http_val = $2;
       $http_var =~ s/-/_/g;
       $http_var = $1;
       $http_val = $2;
       $http_var =~ s/-/_/g;
@@ -448,7 +447,10 @@ REQUEST: while (*STDIN) {
       } else {
         $http_val =~ s/\s+/ /g;
         if ($http_var =~ /^HTTP_(HOST|VERSION)$/) {
       } else {
         $http_val =~ s/\s+/ /g;
         if ($http_var =~ /^HTTP_(HOST|VERSION)$/) {
-          $http_var = 'X-'.$http_var;
+          $http_var = 'HTTP_X_'.$1;
+        } elsif ($http_var =~ /^PROXY/) {
+          # http://cert.at/warnings/all/20160718.html
+          $http_var = 'HTTP_X_'.$http_var;
         } elsif ($http_var !~ /^CONTENT_/) {
           $http_var = 'HTTP_'.$http_var;
         }
         } elsif ($http_var !~ /^CONTENT_/) {
           $http_var = 'HTTP_'.$http_var;
         }