apache: support mod_dir DirectorySlash
[hcoop/domtool2.git] / src / plugins / apache.sml
index 5a3bb88..20bd7ed 100644 (file)
@@ -1,6 +1,6 @@
 (* HCoop Domtool (http://hcoop.sourceforge.net/)
  * Copyright (c) 2006-2009, Adam Chlipala
- * Copyright (c) 2013 Clinton Ebadi
+ * Copyright (c) 2013,2014,2015,2017,2018,2019 Clinton Ebadi
  *
  * This program is free software; you can redistribute it and/or
  * modify it under the terms of the GNU General Public License
@@ -97,7 +97,8 @@ val _ = Env.type_one "proxy_reverse_target"
 
 val _ = Env.type_one "rewrite_arg"
        Env.string
-       (CharVector.all Char.isAlphaNum)
+       (* #":" is permitted here, but really ought to be disallowed or escaped for E=VAR:VAL *)
+       (CharVector.all (fn ch => (Char.isGraph ch) andalso not (List.exists (fn c => ch = c) [ #"[", #"]", #",", #"\"", #"'", #"=", #"\\" ])))
 
 val _ = Env.type_one "suexec_flag"
        Env.bool
@@ -470,7 +471,8 @@ fun vhostPost () = (!post ();
                    write "</VirtualHost>\n";
                    app (TextIO.closeOut o #2) (!vhostFiles))
 
-val php_version = fn (EVar "fast_php", _) => SOME 6
+val php_version = fn (EVar "php56", _) => SOME 56
+                   | (EVar "php72", _) => SOME 72
                    | _ => NONE
 
 fun vhostBody (env, makeFullHost) =
@@ -561,26 +563,18 @@ fun vhostBody (env, makeFullHost) =
                                  TextIO.output (file, user);
                                  TextIO.output (file, "/DAVLock");
 
-                                 if php = 6
-                                 then
-                                     (* fastcgi php 5.6, using version 6 since php6 doesn't exist *)
-                                     (TextIO.output (file, "\n\tAddHandler fcgid-script .php .phtml");
-                                      map (fn ext => (TextIO.output (file, "\n\tFcgidWrapper \"");
-                                                      (* kerberos wrapper, simulates waklog+mod_cgi *)
-                                                      if isWaklog node then
-                                                          (TextIO.output (file, Config.Apache.fastCgiWrapperOf user);
-                                                           TextIO.output (file, " "))
-                                                      else
-                                                          ();
-                                                      TextIO.output (file, Config.Apache.phpFastCgiWrapper);
-                                                      TextIO.output (file, "\" ");
-                                                      TextIO.output (file, ext)))
-                                          [".php", ".phtml"];
-                                      ())
-                                 else
-                                     (TextIO.output (file, "\n\tAddHandler x-httpd-php");
-                                      TextIO.output (file, Int.toString php);
-                                      TextIO.output (file, " .php .phtml"));
+                                 TextIO.output (file, "\n\tAddHandler fcgid-script .php .phtml");
+                                 map (fn ext => (TextIO.output (file, "\n\tFcgidWrapper \"");
+                                                 (* kerberos wrapper, simulates waklog+mod_cgi *)
+                                                 if isWaklog node then
+                                                     (TextIO.output (file, Config.Apache.fastCgiWrapperOf user);
+                                                      TextIO.output (file, " "))
+                                                 else
+                                                     ();
+                                                 TextIO.output (file, Config.Apache.phpFastCgiWrapper php);
+                                                 TextIO.output (file, "\" ");
+                                                 TextIO.output (file, ext)))
+                                     [".php", ".phtml"];
                          (ld, file)
                              end)
                          places;
@@ -893,6 +887,13 @@ val () = Env.action_one "directoryIndex"
              app (fn opt => (write " "; write opt)) opts;
              write "\n"))
 
+val () = Env.action_one "directorySlash"
+       ("enable", Env.bool)
+       (fn enable =>
+           (write "\tDirectorySlash ";
+            if enable then write "On" else write "Off";
+            write "\n"))
+
 val () = Env.action_one "serverAliasHost"
         ("host", Env.string)
         (fn host =>
@@ -1153,6 +1154,34 @@ val () = Env.action_two "setEnv"
                                                        | ch => str ch) value);
                              write "\"\n"))
 
+val () = Env.action_three "setEnvIf"
+        ("attribute", Env.string, "match", Env.string, "env_variables", Env.list Env.string)
+        (fn (attribute, match, envs) =>
+            case envs of
+                [] => (print "WARNING: Skipped setEnvIf, no environment variables provided.\n")
+             | envs =>
+               (write "\tSetEnvIf\t\"";
+                write attribute;
+                write "\"\t\"";
+                write match;
+                write "\"";
+                app (fn env => (write "\t"; write env)) envs;
+                write "\n"))
+
+val () = Env.action_three "setEnvIfNoCase"
+        ("attribute", Env.string, "match", Env.string, "env_variables", Env.list Env.string)
+        (fn (attribute, match, envs) =>
+            case envs of
+                [] => (print "WARNING: Skipped setEnvIfNoCase, no environment variables provided.\n")
+             | envs =>
+               (write "\tSetEnvIfNoCase\t\"";
+                write attribute;
+                write "\"\t\"";
+                write match;
+                write "\"";
+                app (fn env => (write "\t"; write env)) envs;
+                write "\n"))
+
 val () = Env.action_one "diskCache"
         ("path", Env.string)
         (fn path => (write "\tCacheEnable disk \"";
@@ -1161,21 +1190,14 @@ val () = Env.action_one "diskCache"
 
 val () = Env.action_one "phpVersion"
         ("version", php_version)
-        (fn version => (if version = 6
-                        then
-                            (* fastcgi php 5.6 since 6 doesn't exist *)
-                            (write "\tAddHandler fcgid-script .php .phtml\n";
+        (fn version => (write "\tAddHandler fcgid-script .php .phtml\n";
                              (* FIXME: only set kerberos wrapper of waklog is on *)
                              (* won't be trivial, since we don't have access to node here *)
                              write "\n\tFcgidWrapper \"";
                              write (Config.Apache.fastCgiWrapperOf (Domain.getUser ()));
                              write " ";
-                             write Config.Apache.phpFastCgiWrapper;
-                             write "\" .php .phtml\n")
-                        else
-                            (write "\tAddHandler x-httpd-php";
-                             write (Int.toString version);
-                             write " .php .phtml\n")))
+                             write (Config.Apache.phpFastCgiWrapper version);
+                             write "\" .php .phtml\n"))
 
 val () = Env.action_two "addType"
         ("mime type", Env.string, "extension", Env.string)