X-Git-Url: https://vcs.fsf.org/?p=squirrelmail.git;a=blobdiff_plain;f=plugins%2Fadministrator%2Foptions.php;h=15a1c4b2dafd346641eba6774e3e39ea7731f1ee;hp=a5500f7b899049f615ce0a60bd0e1c81deccd4e2;hb=786a9741cdff427db9898ce60ab940784240479c;hpb=dcd6f144904822503c14198413459bcbf49de96e diff --git a/plugins/administrator/options.php b/plugins/administrator/options.php index a5500f7b..15a1c4b2 100644 --- a/plugins/administrator/options.php +++ b/plugins/administrator/options.php @@ -1,123 +1,287 @@ $j + 1 && + $line{$j}.$line{$j+1} == '*/' ) { + $mode = ''; + $j++; + } + break; + case 'D': + // Delimiter detect + switch ( $line{$j} ) { + case '"': + case "'": + // Double quote string + $delimiter = $value = $line{$j}; + $mode = 'S'; + break; + case ' ': + // Nothing yet + break; + default: + if ( strtoupper( substr( $line, $j, 4 ) ) == 'TRUE' ) { + // Boolean TRUE + $newcfg{$key} = 'TRUE'; + $key = ''; + $mode = ';'; + } else if ( strtoupper( substr( $line, $j, 5 ) ) == 'FALSE' ) { + $newcfg{$key} = 'FALSE'; + $key = ''; + $mode = ';'; + } else { + // Number or function call + $mode = 'N'; + $value = $line{$j}; + } + } + break; + default: + if ( $line{$j} == '$' ) { + // We must detect $key name + $mode = 'K'; + $key = '$'; + } else if ( $s < $j + 2 ) { + } else if ( strtoupper( substr( $line, $j, 7 ) ) == 'GLOBAL ' ) { + // Skip untill next ; + $mode = ';'; + $j += 6; + } else if ( $line{$j}.$line{$j+1} == '/*' ) { + $mode = 'C'; + $j++; + } else if ( $line{$j} == '#' || $line{$j}.$line{$j+1} == '//' ) { + // Delete till the end of the line + $j = $s; + } + } + } + } +} + +/** + * Change paths containing SM_PATH to admin-friendly paths + * relative to the config dir, i.e.: + * '' --> + * SM_PATH . 'images/logo.gif' --> ../images/logo.gif + * '/absolute/path/logo.gif' --> /absolute/path/logo.gif + * 'http://whatever/' --> http://whatever + * Note removal of quotes in returned value + * + * @param string $old_path path that has to be converted + * @return string new path + * @access private + */ +function change_to_rel_path($old_path) { + $new_path = str_replace("SM_PATH . '", "../", $old_path); + $new_path = str_replace("../config/","", $new_path); + $new_path = str_replace("'","", $new_path); + return $new_path; +} + +/** + * Change relative path (relative to config dir) to + * internal SM_PATH, i.e.: + * empty_string --> '' + * ../images/logo.gif --> SM_PATH . 'images/logo.gif' + * images/logo.gif --> SM_PATH . 'config/images/logo.gif' + * /absolute/path/logo.gif --> '/absolute/path/logo.gif' + * http://whatever/ --> 'http://whatever' + * + * @param string $old_path path that has to be converted + * @return string new path + * @access private +*/ +function change_to_sm_path($old_path) { + if ( $old_path === '' || $old_path == "''" ) { + return "''"; + } elseif ( preg_match("/^(\/|http)/", $old_path) ) { + return "'" . $old_path . "'"; + } elseif ( preg_match("/^(\$|SM_PATH)/", $old_path) ) { + return $old_path; + } + + $new_path = ''; + $rel_path = explode("../", $old_path); + if ( count($rel_path) > 2 ) { + // Since we're relative to the config dir, + // more than 1 ../ puts us OUTSIDE the SM tree. + // get full path to config.php, then pop the filename + $abs_path = explode('/', realpath (SM_PATH . 'config/config.php')); + array_pop ($abs_path); + foreach ( $rel_path as $subdir ) { + if ( $subdir === '' ) { + array_pop ($abs_path); + } else { + array_push($abs_path, $subdir); + } + } + foreach ($abs_path as $subdir) { + $new_path .= $subdir . '/'; + } + $new_path = "'$new_path'"; + } elseif ( count($rel_path) > 1 ) { + // we're within the SM tree, prepend SM_PATH + $new_path = str_replace('../',"SM_PATH . '", $old_path . "'"); + } else { + // Last, if it's a relative path without a .. prefix, + // we're somewhere within the config dir, so prepend + // SM_PATH . 'config/ + $new_path = "SM_PATH . 'config/" . $old_path . "'"; } + return $new_path; } -if ( !auth ) { - header("Location: ../../src/options.php") ; + +/* ---------------------- main -------------------------- */ +/** main SquirrelMail include */ +require('../../include/init.php'); +/* configuration definitions */ +include_once(SM_PATH . 'plugins/administrator/defines.php'); +/* additional functions */ +include_once(SM_PATH . 'plugins/administrator/auth.php'); + +global $data_dir, $username; + +if ( !adm_check_user() ) { + header('Location: ' . SM_PATH . 'src/options.php') ; exit; } displayPageHeader($color, 'None'); -$cfgfile = '../config/config.php'; -$cfg_defaultfile = '../config/config_default.php'; -$cfg = file( $cfg_defaultfile ); -$newcfg = $dfncfg = array( ); -$cm = FALSE; +$newcfg = array( ); foreach ( $defcfg as $key => $def ) { $newcfg[$key] = ''; } -foreach ( $cfg as $l ) { - // Remove inline /* */ Blocks - $l = preg_replace( '/\/\*.*\*\//', '', $l ); - $l = preg_replace( '/#.*$/', '', $l ); - $l = preg_replace( '/\/\/.*$/', '', $l ); - $v = $s = trim( $l ); - if ( $cm ) { - if( substr( $v, -2 ) == '*/' ) { - $v = ''; - $cm = FALSE; - } else if( $i = strpos( $v, '*/' ) ) { - $v = substr( $v, $i ); - $cm = FALSE; - } else { - $v = ''; - } - } else { - if( $v{0}.$v{1} == '/*' ) { - $v = ''; - $cm = TRUE; - } else if ( $i = strpos( $v, '/*' ) ) { - $v = substr( $v, 0, $i ); - $cm = TRUE; - } - } +$cfgfile = SM_PATH . 'config/config.php'; +parseConfig( SM_PATH . 'config/config_default.php' ); +parseConfig( $cfgfile ); - if ( $i = strpos( $v, '=' ) ) { - $key = trim( substr( $v, 0, $i - 1 ) ); - $val = str_replace( ';', '', trim( substr( $v, $i + 1 ) ) ); - $newcfg[$key] = $val; - $dfncfg[$key] = $val; - } +$colapse = array( 'Titles' => 'off', + 'Group1' => getPref($data_dir, $username, 'adm_Group1', 'off' ), + 'Group2' => getPref($data_dir, $username, 'adm_Group2', 'on' ), + 'Group3' => getPref($data_dir, $username, 'adm_Group3', 'on' ), + 'Group4' => getPref($data_dir, $username, 'adm_Group4', 'on' ), + 'Group5' => getPref($data_dir, $username, 'adm_Group5', 'on' ), + 'Group6' => getPref($data_dir, $username, 'adm_Group6', 'on' ), + 'Group7' => getPref($data_dir, $username, 'adm_Group7', 'on' ), + 'Group8' => getPref($data_dir, $username, 'adm_Group8', 'on' ), + 'Group9' => getPref($data_dir, $username, 'adm_Group9', 'on' ), + 'Group10' => getPref($data_dir, $username, 'adm_Group10', 'on' ), + 'Group11' => getPref($data_dir, $username, 'adm_Group11', 'on' ) ); -} - -$cfg = file( $cfgfile ); - -$cm = FALSE; -foreach ( $cfg as $l ) { - $l = preg_replace( '/\/\*.*\*\//', '', $l ); - $l = preg_replace( '/#.*$/', '', $l ); - $l = preg_replace( '/\/\/.*$/', '', $l ); - $v = $s = trim( $l ); - if ( $cm ) { - if( substr( $v, -2 ) == '*/' ) { - $v = ''; - $cm = FALSE; - } else if( $i = strpos( $v, '*/' ) ) { - $v = substr( $v, $i ); - $cm = FALSE; - } else { - $v = ''; - } +/* look in $_GET array for 'switch' */ +if ( sqgetGlobalVar('switch', $switch, SQ_GET) ) { + if ( $colapse[$switch] == 'on' ) { + $colapse[$switch] = 'off'; } else { - if( $v{0}.$v{1} == '/*' ) { - $v = ''; - $cm = TRUE; - } else if ( $i = strpos( $v, '/*' ) ) { - $v = substr( $v, 0, $i ); - $cm = TRUE; - } + $colapse[$switch] = 'on'; } + setPref($data_dir, $username, "adm_$switch", $colapse[$switch] ); +} - if ( $i = strpos( $v, '=' ) ) { - $key = trim( substr( $v, 0, $i - 1 ) ); - $val = str_replace( ';', '', trim( substr( $v, $i + 1 ) ) ); - $newcfg[$key] = $val; - } +echo '
' . + '
'. + ''. + ''. + ''; -} -echo "" . - "
'. + _("Configuration Administrator").'
'. + _("Note: it is recommended that you configure your system using conf.pl, and not this plugin. conf.pl contains additional information regarding the purpose of variables and appropriate values, as well as additional verification steps."). + '
'. + _("Run or consult conf.pl should you run into difficulty with your configuration."). + '
". - "" , - ""; +$act_grp = 'Titles'; /* Active group */ + foreach ( $newcfg as $k => $v ) { $l = strtolower( $v ); $type = SMOPT_TYPE_UNDEFINED; @@ -130,7 +294,11 @@ foreach ( $newcfg as $k => $v ) { if ( isset( $defcfg[$k] ) ) { $name = $defcfg[$k]['name']; $type = $defcfg[$k]['type']; - $size = $defcfg[$k]['size']; + if ( isset( $defcfg[$k]['size'] ) ) { + $size = $defcfg[$k]['size']; + } else { + $size = 40; + } } else if ( $l == 'true' ) { $v = 'TRUE'; $type = SMOPT_TYPE_BOOLEAN; @@ -143,128 +311,339 @@ foreach ( $newcfg as $k => $v ) { $type = SMOPT_TYPE_STRING; } - switch ( $type ) { - case SMOPT_TYPE_TITLE: - echo ""; - break; - case SMOPT_TYPE_COMMENT: - $v = substr( $v, 1, strlen( $v ) - 2 ); - echo "'; + break; + case SMOPT_TYPE_TITLE: + if ( $colapse[$k] == 'on' ) { + $sw = '(+)'; + } else { + $sw = '(-)'; + } + echo ''; + $act_grp = $k; + break; + case SMOPT_TYPE_COMMENT: + $v = substr( $v, 1, strlen( $v ) - 2 ); + echo "\n"; + break; + case SMOPT_TYPE_INTEGER: + /* look for variable $e in POST, fill into $v */ + if ( sqgetGlobalVar($e, $new_v, SQ_POST) ) { + $v = intval( $new_v ); + $newcfg[$k] = $v; + } + echo "\n"; + break; + case SMOPT_TYPE_NUMLIST: + if ( sqgetGlobalVar($e, $new_v, SQ_POST) ) { + $v = $new_v; + $newcfg[$k] = $v; + } + echo "\n"; + break; + case SMOPT_TYPE_STRLIST: + if ( sqgetGlobalVar($e, $new_v, SQ_POST) ) { + $v = '"' . $new_v . '"'; + $newcfg[$k] = $v; + } + echo "\n"; + break; + + case SMOPT_TYPE_TEXTAREA: + if ( sqgetGlobalVar($e, $new_v, SQ_POST) ) { + $v = '"' . addslashes($new_v) . '"'; + $newcfg[$k] = str_replace( "\n", '', $v ); + } + echo "\n"; + break; + case SMOPT_TYPE_STRING: + if ( sqgetGlobalVar($e, $new_v, SQ_POST) ) { + $v = '"' . addslashes($new_v) . '"'; + $newcfg[$k] = $v; + } + if ( $v == '""' && isset( $defcfg[$k]['default'] ) ) { + $v = "'" . $defcfg[$k]['default'] . "'"; + $newcfg[$k] = $v; + } + echo "\n"; + break; + case SMOPT_TYPE_BOOLEAN: + if ( sqgetGlobalVar($e, $new_v, SQ_POST) ) { + $v = $new_v; + $newcfg[$k] = $v; + } else { + $v = strtoupper( $v ); + } + if ( $v == 'TRUE' ) { + $ct = ' checked="checked"'; + $cf = ''; + } else { + $ct = ''; + $cf = ' checked="checked"'; + } + echo "\n"; + break; + case SMOPT_TYPE_PATH: + if ( sqgetGlobalVar($e, $new_v, SQ_POST) ) { + // FIXME: fix use of $data_dir in $attachment_dir + $v = change_to_sm_path($new_v); + $newcfg[$k] = $v; + } + if ( $v == "''" && isset( $defcfg[$k]['default'] ) ) { + $v = change_to_sm_path($defcfg[$k]['default']); + $newcfg[$k] = $v; + } + echo "\n"; + break; + default: + echo "\n"; } - echo ''; - break; - case SMOPT_TYPE_STRLIST: - if ( isset( $HTTP_POST_VARS[$e] ) ) { - $v = '"' . $HTTP_POST_VARS[$e] . '"'; - $newcfg[$k] = $v; + } +} + +/* Special Themes Block */ +if ( $colapse['Group7'] == 'off' ) { + $i = 0; + echo ''; + while ( isset( $newcfg["\$theme[$i]['NAME']"] ) ) { + $k1 = "\$theme[$i]['NAME']"; + $e1 = "theme_name_$i"; + if ( sqgetGlobalVar($e, $v1, SQ_POST) ) { + $v1 = '"' . str_replace( '\"', '"', $v1 ) . '"'; + $v1 = '"' . str_replace( '"', '\"', $v1 ) . '"'; + $newcfg[$k1] = $v1; + } else { + $v1 = $newcfg[$k1]; } - echo "'. + "". + "". + "\n"; + $i++; - case SMOPT_TYPE_STRING: - if ( isset( $HTTP_POST_VARS[$e] ) ) { - $v = '"' . $HTTP_POST_VARS[$e] . '"'; - $newcfg[$k] = $v; - } - echo "'; + +if ( $colapse['Group8'] == 'off' ) { + + $plugpath = SM_PATH . 'plugins/'; + if ( file_exists($plugpath) ) { + $fd = opendir( $plugpath ); + $op_plugin = array(); + $p_count = 0; + while (false !== ($file = readdir($fd))) { + if ($file != '.' && $file != '..' && $file != 'CVS' && is_dir($plugpath . $file) ) { + $op_plugin[] = $file; + $p_count++; + } } - if ( $v == 'TRUE' ) { - $ct = ' checked'; - $cf = ''; + closedir($fd); + asort( $op_plugin ); + + /* Lets get the plugins that are active */ + $plugins = array(); + if ( sqgetGlobalVar('plg', $v, SQ_POST) ) { + foreach ( $op_plugin as $plg ) { + if ( sqgetGlobalVar("plgs_$plg", $v2, SQ_POST) && $v2 == 'on' ) { + $plugins[] = $plg; + } + } + $i = 0; + foreach ( $plugins as $plg ) { + $k = "\$plugins[$i]"; + $newcfg[$k] = "'$plg'"; + $i++; + } + while ( isset( $newcfg["\$plugins[$i]"] ) ) { + $k = "\$plugins[$i]"; + $newcfg[$k] = ''; + $i++; + } } else { - $ct = ''; - $cf = ' checked'; + $i = 0; + while ( isset( $newcfg["\$plugins[$i]"] ) ) { + $k = "\$plugins[$i]"; + $v = $newcfg[$k]; + $plugins[] = substr( $v, 1, strlen( $v ) - 2 ); + $i++; + } } - echo "'; + } else { + echo '\n"; } - echo "\n"; } -echo "" , +echo '\n". '
" . _("Configuration Administrator") . "
$name
$name"; - echo "$v"; - $newcfg[$k] = "'$v'"; - break; - case SMOPT_TYPE_INTEGER: - if ( isset( $HTTP_POST_VARS[$e] ) ) { - $v = intval( $HTTP_POST_VARS[$e] ); - $newcfg[$k] = $v; - } - echo "
$name"; - echo ""; - break; - case SMOPT_TYPE_NUMLIST: - if ( isset( $HTTP_POST_VARS[$e] ) ) { - $v = $HTTP_POST_VARS[$e]; - $newcfg[$k] = $v; - } - echo "
$name"; - echo "
$name" . + $defcfg[$k]['value'] . + '
'. + "". + ''.$sw.' '.$name.'
$name". + "$v"; + $newcfg[$k] = "'$v'"; + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
$name". + ""; + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
$name"; + echo "'; + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
$name". + "'; + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
$name" + .""; + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
$name" + ."'; + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
$name" . + "" . _("Yes") . + "" . _("No"); + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
$name". + "'; + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
$name" . + "$v"; + if ( isset( $defcfg[$k]['comment'] ) ) { + echo '   ' . $defcfg[$k]['comment']; + } + echo "
' . _("Theme Name") . + '' . _("Theme Path") . + '
$name"; - echo "'; - break; + $name = substr( $v1, 1, strlen( $v1 ) - 2 ); + $path = change_to_rel_path($v2); + echo '
$i.
$name"; - echo ""; - break; - case SMOPT_TYPE_BOOLEAN: - if ( isset( $HTTP_POST_VARS[$e] ) ) { - $v = $HTTP_POST_VARS[$e]; - $newcfg[$k] = $v; + } +} + +/* Special Plugins Block */ +if ( $colapse['Group8'] == 'on' ) { + $sw = '(+)'; +} else { + $sw = '(-)'; +} +echo '
'. + ''. + $sw.' '._("Plugins").'
$name"; - echo "" . _("Yes") . - "" . _("No"); - break; - default: - echo "
$name"; - echo "$v"; + echo '
'; + foreach ( $op_plugin as $plg ) { + if ( in_array( $plg, $plugins ) ) { + $sw = ' checked="checked"'; + } else { + $sw = ''; + } + echo '\n". + "". + "\n"; + } + echo '
'; + if (file_exists(SM_PATH . "plugins/$plg/README")) { + echo "$plg"; + } else { + echo $plg; + } + echo "
'. + sprintf(_("Plugin directory could not be found: %s"), $plugpath). + "

'. + ''. + _("Test Configuration")."
'; /* Write the options to the file. */ -$fp = fopen( $cfgfile, 'w' ); -fwrite( $fp, " $v ) { - if ( $k{0} == '$' ) { - if( $i = strpos( $k, '[' ) ) { - if( strpos( $k, '[0]' ) ) { - if( $not_first ) { - fwrite( $fp, ', ' ); - } - fwrite( $fp, substr( $k, 0, $i) ); - $not_first = TRUE; - } - } else { - if( $not_first ) { - fwrite( $fp, ', ' ); + +if ( $fp = @fopen( $cfgfile, 'w' ) ) { + fwrite( $fp, " $v ) { + if ( $k{0} == '$' && $v <> '' || is_int($v)) { + if ( substr( $k, 1, 11 ) == 'ldap_server' ) { + $v = substr( $v, 0, strlen( $v ) - 1 ) . "\n)"; + $v = str_replace( 'array(', "array(\n\t", $v ); + $v = str_replace( "',", "',\n\t", $v ); } - fwrite( $fp, $k ); - $not_first = TRUE; + /* FIXME: add elseif that reverts plugins[#] to plugins[] */ + fwrite( $fp, "$k = $v;\n" ); } } + // close php + fwrite( $fp, '?>' ); + fclose( $fp ); +} else { + echo '

'. + _("Config file can't be opened. Please check config.php."). + '

'; } -fwrite( $fp, ";\n" ); -foreach ( $newcfg as $k => $v ) { - if ( $k{0} == '$' ) { - fwrite( $fp, "$k = $v;\n" ); - } -} -fwrite( $fp, '?>' ); -fclose( $fp ); + ?> + \ No newline at end of file