changeset 344:0f14a20f48ca

Improve gallery settings validation, etc.
author Matti Hamalainen <ccr@tnsp.org>
date Sun, 27 Aug 2023 05:34:20 +0300
parents d6422e856ecd
children 9fbec6399cdd
files mgallery.inc.php mgtool.php
diffstat 2 files changed, 152 insertions(+), 30 deletions(-) [+]
line wrap: on
line diff
--- a/mgallery.inc.php	Sun Aug 27 04:16:05 2023 +0300
+++ b/mgallery.inc.php	Sun Aug 27 05:34:20 2023 +0300
@@ -34,10 +34,19 @@
 define("MG_BOOL"             , 6);
 define("MG_FLAGS"            , 7);
 define("MG_DATE"             , 8);
-
+define("MG_CALLABLE"         , 9);
 
-define("yes"                 , 1);
-define("no"                  , 0);
+$mgValueTypes = [
+  MG_STR                   => "string",
+  MG_STR_LC                => "string lc",
+  MG_STR_ARRAY             => "string array",
+  MG_INT                   => "int",
+  MG_DVA                   => "dva",
+  MG_BOOL                  => "bool",
+  MG_FLAGS                 => "flags",
+  MG_DATE                  => "date",
+  MG_CALLABLE              => "callable",
+];
 
 
 $mgGFlags = [
@@ -104,6 +113,23 @@
 ];
 
 
+//
+// Gallery album settings
+//
+$mgAlbumDefaults = [
+  "show_keywords"    => [MG_CALLABLE, FALSE, "mgParseShowKeywords"],
+  "hide"             => [MG_BOOL, FALSE],
+  "hide_contents"    => [MG_BOOL, FALSE],
+  "albumpic"         => [MG_STR, FALSE],
+  "tn_format"        => [MG_STR_LC, "jpeg"],
+  "med_format"       => [MG_STR_LC, "jpeg"],
+
+  "header"           => [MG_STR_ARRAY, FALSE],
+  "caption"          => [MG_STR_ARRAY, FALSE],
+  "title"            => [MG_STR_ARRAY, FALSE],
+];
+
+
 function mgDebug($msg)
 {
   global $mgalDebug;
@@ -174,29 +200,6 @@
       mgFatal("Setting '".$key."' is not set, but is required to be configured.\n");
   }
 
-  switch ($mgDefaults[$key][0])
-  {
-    case MG_STR_LC:
-      $val = strtolower($val);
-      break;
-
-    case MG_FLAGS:
-      if (is_string($val))
-      {
-        $flags = $mgDefaults[$key][2];
-        $cval = preg_split("/\s*[,|]\s*/", strtolower($val), -1, PREG_SPLIT_NO_EMPTY);
-        $nval = 0;
-        foreach ($cval as $qval)
-        {
-          if (array_key_exists($qval, $flags))
-            $nval |= $flags[$qval];
-          else
-            mgFatal("Invalid flag value for '".$key."': '".$qval."'.");
-        }
-      }
-      break;
-  }
-
   return $val;
 }
 
@@ -228,9 +231,111 @@
 }
 
 
+function mgParseShowKeywords($val)
+{
+  return preg_split("/\s*[,|]\s*/", $val, -1, PREG_SPLIT_NO_EMPTY);
+}
+
+
+function mgInvalidType(&$defaults, $key, $val)
+{
+  global $mgValueTypes;
+
+  mgFatal("Invalid value type '".gettype($val)."' for setting '".$key."', expected '".
+    $mgValueTypes[$defaults[$key][0]]."', value: '".$val."'.\n");
+
+  return FALSE;
+}
+
+
+function mgParseConfigSetting(&$settings, &$defaults, $key, $val)
+{
+  if (!array_key_exists($key, $defaults))
+    return mgFatal("Unknown setting key '".$key."'.\n");
+
+  switch ($defaults[$key][0])
+  {
+    case MG_STR:
+      if (!is_string($val))
+        return mgInvalidType($defaults, $key, $val);
+      break;
+
+    case MG_STR_LC:
+      if (!is_string($val))
+        return mgInvalidType($defaults, $key, $val);
+
+      $val = strtolower($val);
+      break;
+
+    case MG_STR_ARRAY:
+      if (is_string($val))
+        $val = array($val);
+
+      if (!is_array($val))
+        return mgInvalidType($defaults, $key, $val);
+      break;
+
+    case MG_INT:
+      if (!is_int($val))
+        return mgInvalidType($defaults, $key, $val);
+      break;
+
+    case MG_BOOL:
+      if (is_string($val))
+      {
+        switch (strtolower(trim($val)))
+        {
+          case "yes": case "on": case "true": case "1":
+            $val = true;
+            break;
+
+          case "no": case "off": case "false": case "0":
+            $val = false;
+            break;
+
+          default:
+            mgInvalidType($defaults, $key, $val);
+        }
+      }
+
+      if (!is_bool($val) && !is_int($val))
+        return mgInvalidType($defaults, $key, $val);
+      break;
+
+    case MG_FLAGS:
+      if (is_string($val))
+      {
+        $flags = $mgDefaults[$key][2];
+        $cval = preg_split("/\s*[,|]\s*/", strtolower($val), -1, PREG_SPLIT_NO_EMPTY);
+        $nval = 0;
+        foreach ($cval as $qval)
+        {
+          if (array_key_exists($qval, $flags))
+            $nval |= $flags[$qval];
+          else
+            return mgFatal("Invalid flag value for '".$key."': '".$qval."'.");
+        }
+        $val = $nval;
+      } else
+        return mgInvalidType($defaults, $key, $val);
+      break;
+
+    case MG_CALLABLE:
+      if (!is_callable($defaults[$key][2]))
+        return mgInvalidType($defaults, $key, $val);
+
+      $val = call_user_func($defaults[$key][2], $val);
+      break;
+  }
+
+  $settings[$key] = $val;
+  return TRUE;
+}
+
+
 function mgReadOneConfig(&$searchPaths, $pathList)
 {
-  global $mgSettings, $mgProgConfigFile;
+  global $mgSettings, $mgDefaults, $mgProgConfigFile;
   $found = FALSE;
 
   foreach (array_unique($pathList) as $path)
@@ -247,7 +352,7 @@
       {
         mgDebug("Found '".$filename."' config.\n");
         foreach ($data as $dkey => &$dval)
-          $mgSettings[$dkey] = $dval;
+          mgParseConfigSetting($mgSettings, $mgDefaults, $dkey, $dval);
 
         $found = TRUE;
       }
@@ -352,8 +457,10 @@
     $skeys = array($skeys);
 
   foreach ($skeys as $skey)
-  if (!array_key_exists($skey, $data))
-    return $sfmt2;
+  {
+    if (!array_key_exists($skey, $data))
+      return $sfmt2;
+  }
 
   $str = $sfmt1;
   for ($i = 1; $i <= sizeof($skeys); $i++)
--- a/mgtool.php	Sun Aug 27 04:16:05 2023 +0300
+++ b/mgtool.php	Sun Aug 27 05:34:20 2023 +0300
@@ -551,6 +551,8 @@
 //
 function mgGetAlbumData($galBasePath, $galPath)
 {
+  global $mgAlbumDefaults;
+
   // Check path permissions
   $galData = [];
   if (is_readable($galPath))
@@ -561,7 +563,20 @@
     {
       mgDebug("Reading INFOFILE: ".$filename."\n");
       if (($galData = parse_ini_file($filename, FALSE)) === FALSE)
+      {
         $galData = [];
+      }
+      else
+      {
+        // Sanity check settings
+        foreach ($galData as $key => $data)
+        {
+          if (array_key_exists($key, $mgAlbumDefaults))
+            mgParseConfigSetting($galData, $mgAlbumDefaults, $key, $galData[$key]);
+          else
+            mgFatal("Invalid setting '".$key."' in '".$filename."'\n");
+        }
+      }
     }
 
     // Read header file, if any, and we don't have "header" field set yet