# HG changeset patch # User Matti Hamalainen # Date 1693103660 -10800 # Node ID 0f14a20f48ca74387efc8b635f0fb72590832574 # Parent d6422e856ecdff9d8aab88a27897f0fbe41e2761 Improve gallery settings validation, etc. diff -r d6422e856ecd -r 0f14a20f48ca mgallery.inc.php --- 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++) diff -r d6422e856ecd -r 0f14a20f48ca mgtool.php --- 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