4 * Administrator Plugin - Options Page
6 * This script creates separate page, that allows to review and modify
7 * SquirrelMail configuration file.
10 * @author Philippe Mingo
11 * @copyright (c) 1999-2004 The SquirrelMail Project Team
12 * @license http://opensource.org/licenses/gpl-license.php GNU Public License
14 * @subpackage administrator
18 * parse the config file
20 * @param string $cfg_file
23 function parseConfig( $cfg_file ) {
27 $cfg = file( $cfg_file );
32 for ($i=0;$i<$l;$i++
) {
33 $line = trim( $cfg[$i] );
35 for ($j=0;$j<$s;$j++
) {
38 if ( $line{$j} == '=' ) {
39 // Ok, we've got a right value, lets detect what type
41 } else if ( $line{$j} == ';' ) {
48 if ( $line{$j} == ' ' ) {
56 if ( $line{$j} == ';' ) {
61 if ( $line{$j} == '\\' ) {
64 } else if ( $line{$j} == $delimiter && $modifier === FALSE ) {
66 $newcfg[$key] = $value . $delimiter;
75 if ( $line{$j} == ';' ) {
76 $newcfg{$key} = $value;
85 $line{$j}.$line{$j+
1} == '*/' ) {
92 switch ( $line{$j} ) {
95 // Double quote string
96 $delimiter = $value = $line{$j};
103 if ( strtoupper( substr( $line, $j, 4 ) ) == 'TRUE' ) {
105 $newcfg{$key} = 'TRUE';
108 } else if ( strtoupper( substr( $line, $j, 5 ) ) == 'FALSE' ) {
109 $newcfg{$key} = 'FALSE';
113 // Number or function call
120 if ( $line{$j} == '$' ) {
121 // We must detect $key name
124 } else if ( $s < $j +
2 ) {
125 } else if ( strtoupper( substr( $line, $j, 7 ) ) == 'GLOBAL ' ) {
126 // Skip untill next ;
129 } else if ( $line{$j}.$line{$j+
1} == '/*' ) {
132 } else if ( $line{$j} == '#' ||
$line{$j}.$line{$j+
1} == '//' ) {
133 // Delete till the end of the line
142 * Change paths containing SM_PATH to admin-friendly paths
143 * relative to the config dir, i.e.:
144 * '' --> <empty string>
145 * SM_PATH . 'images/logo.gif' --> ../images/logo.gif
146 * '/absolute/path/logo.gif' --> /absolute/path/logo.gif
147 * 'http://whatever/' --> http://whatever
148 * Note removal of quotes in returned value
150 * @param string $old_path path that has to be converted
151 * @return string new path
154 function change_to_rel_path($old_path) {
155 $new_path = str_replace("SM_PATH . '", "../", $old_path);
156 $new_path = str_replace("../config/","", $new_path);
157 $new_path = str_replace("'","", $new_path);
162 * Change relative path (relative to config dir) to
163 * internal SM_PATH, i.e.:
164 * empty_string --> ''
165 * ../images/logo.gif --> SM_PATH . 'images/logo.gif'
166 * images/logo.gif --> SM_PATH . 'config/images/logo.gif'
167 * /absolute/path/logo.gif --> '/absolute/path/logo.gif'
168 * http://whatever/ --> 'http://whatever'
170 * @param string $old_path path that has to be converted
171 * @return string new path
174 function change_to_sm_path($old_path) {
175 if ( $old_path === '' ||
$old_path == "''" ) {
177 } elseif ( preg_match("/^(\/|http)/", $old_path) ) {
178 return "'" . $old_path . "'";
179 } elseif ( preg_match("/^(\$|SM_PATH)/", $old_path) ) {
184 $rel_path = explode("../", $old_path);
185 if ( count($rel_path) > 2 ) {
186 // Since we're relative to the config dir,
187 // more than 1 ../ puts us OUTSIDE the SM tree.
188 // get full path to config.php, then pop the filename
189 $abs_path = explode('/', realpath (SM_PATH
. 'config/config.php'));
190 array_pop ($abs_path);
191 foreach ( $rel_path as $subdir ) {
192 if ( $subdir === '' ) {
193 array_pop ($abs_path);
195 array_push($abs_path, $subdir);
198 foreach ($abs_path as $subdir) {
199 $new_path .= $subdir . '/';
201 $new_path = "'$new_path'";
202 } elseif ( count($rel_path) > 1 ) {
203 // we're within the SM tree, prepend SM_PATH
204 $new_path = str_replace('../',"SM_PATH . '", $old_path . "'");
206 // Last, if it's a relative path without a .. prefix,
207 // we're somewhere within the config dir, so prepend
208 // SM_PATH . 'config/
209 $new_path = "SM_PATH . 'config/" . $old_path . "'";
215 /* ---------------------- main -------------------------- */
218 define('SM_PATH','../../');
220 /* SquirrelMail required files. */
221 require_once(SM_PATH
. 'include/validate.php');
222 require_once(SM_PATH
. 'functions/page_header.php');
223 require_once(SM_PATH
. 'functions/imap.php');
224 require_once(SM_PATH
. 'include/load_prefs.php');
225 require_once(SM_PATH
. 'plugins/administrator/defines.php');
226 require_once(SM_PATH
. 'plugins/administrator/auth.php');
228 global $data_dir, $username;
230 if ( !adm_check_user() ) {
231 header('Location: ' . SM_PATH
. 'src/options.php') ;
235 displayPageHeader($color, 'None');
239 foreach ( $defcfg as $key => $def ) {
243 $cfgfile = SM_PATH
. 'config/config.php';
244 parseConfig( SM_PATH
. 'config/config_default.php' );
245 parseConfig( $cfgfile );
247 $colapse = array( 'Titles' => 'off',
248 'Group1' => getPref($data_dir, $username, 'adm_Group1', 'off' ),
249 'Group2' => getPref($data_dir, $username, 'adm_Group2', 'on' ),
250 'Group3' => getPref($data_dir, $username, 'adm_Group3', 'on' ),
251 'Group4' => getPref($data_dir, $username, 'adm_Group4', 'on' ),
252 'Group5' => getPref($data_dir, $username, 'adm_Group5', 'on' ),
253 'Group6' => getPref($data_dir, $username, 'adm_Group6', 'on' ),
254 'Group7' => getPref($data_dir, $username, 'adm_Group7', 'on' ),
255 'Group8' => getPref($data_dir, $username, 'adm_Group8', 'on' ),
256 'Group9' => getPref($data_dir, $username, 'adm_Group9', 'on' ),
257 'Group10' => getPref($data_dir, $username, 'adm_Group10', 'on' ) );
259 /* look in $_GET array for 'switch' */
260 if ( sqgetGlobalVar('switch', $switch, SQ_GET
) ) {
261 if ( $colapse[$switch] == 'on' ) {
262 $colapse[$switch] = 'off';
264 $colapse[$switch] = 'on';
266 setPref($data_dir, $username, "adm_$switch", $colapse[$switch] );
269 echo '<form action="options.php" method="post" name="options">' .
270 '<center><table width="95%" bgcolor="'.$color[5].'"><tr><td>'.
271 '<table width="100%" cellspacing="0" bgcolor="'.$color[4].'">'.
272 '<tr bgcolor="'.$color[5].'"><th colspan="2">'.
273 _("Configuration Administrator").'</th></tr>'.
274 '<tr bgcolor="'.$color[5].'"><td colspan="2" align="center"><small>'.
275 _("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.").
277 _("Run or consult conf.pl should you run into difficulty with your configuration.").
278 '</small></td></tr>';
281 $act_grp = 'Titles'; /* Active group */
283 foreach ( $newcfg as $k => $v ) {
284 $l = strtolower( $v );
285 $type = SMOPT_TYPE_UNDEFINED
;
286 $n = substr( $k, 1 );
287 $n = str_replace( '[', '_', $n );
288 $n = str_replace( ']', '_', $n );
292 if ( isset( $defcfg[$k] ) ) {
293 $name = $defcfg[$k]['name'];
294 $type = $defcfg[$k]['type'];
295 if ( isset( $defcfg[$k]['size'] ) ) {
296 $size = $defcfg[$k]['size'];
300 } else if ( $l == 'true' ) {
302 $type = SMOPT_TYPE_BOOLEAN
;
303 } else if ( $l == 'false' ) {
305 $type = SMOPT_TYPE_BOOLEAN
;
306 } else if ( $v{0} == "'" ) {
307 $type = SMOPT_TYPE_STRING
;
308 } else if ( $v{0} == '"' ) {
309 $type = SMOPT_TYPE_STRING
;
312 if ( substr( $k, 0, 7 ) == '$theme[' ) {
313 $type = SMOPT_TYPE_THEME
;
314 } else if ( substr( $k, 0, 9 ) == '$plugins[' ) {
315 $type = SMOPT_TYPE_PLUGINS
;
316 } else if ( substr( $k, 0, 13 ) == '$ldap_server[' ) {
317 $type = SMOPT_TYPE_LDAP
;
320 if ( $type == SMOPT_TYPE_TITLE ||
$colapse[$act_grp] == 'off' ) {
323 case SMOPT_TYPE_LDAP
:
324 case SMOPT_TYPE_PLUGINS
:
325 case SMOPT_TYPE_THEME
:
326 case SMOPT_TYPE_HIDDEN
:
328 case SMOPT_TYPE_EXTERNAL
:
329 echo "<tr><td>$name</td><td><b>" .
330 $defcfg[$k]['value'] .
333 case SMOPT_TYPE_TITLE
:
334 if ( $colapse[$k] == 'on' ) {
339 echo '<tr bgcolor="'.$color[0].'"><th colspan="2">'.
340 "<a href=\"options.php?switch=$k\" style=\"text-decoration:none\">".
341 '<b>'.$sw.'</b></a> '.$name.'</th></tr>';
344 case SMOPT_TYPE_COMMENT
:
345 $v = substr( $v, 1, strlen( $v ) - 2 );
346 echo "<tr><td>$name</td><td>".
348 $newcfg[$k] = "'$v'";
349 if ( isset( $defcfg[$k]['comment'] ) ) {
350 echo ' ' . $defcfg[$k]['comment'];
354 case SMOPT_TYPE_INTEGER
:
355 /* look for variable $e in POST, fill into $v */
356 if ( sqgetGlobalVar($e, $v, SQ_POST
) ) {
360 echo "<tr><td>$name</td><td>".
361 "<input size=\"10\" name=\"adm_$n\" value=\"$v\" />";
362 if ( isset( $defcfg[$k]['comment'] ) ) {
363 echo ' ' . $defcfg[$k]['comment'];
367 case SMOPT_TYPE_NUMLIST
:
368 if ( sqgetGlobalVar($e, $v, SQ_POST
) ) {
371 echo "<tr><td>$name</td><td>";
372 echo "<select name=\"adm_$n\">";
373 foreach ( $defcfg[$k]['posvals'] as $kp => $vp ) {
374 echo "<option value=\"$kp\"";
376 echo ' selected="selected"';
378 echo ">$vp</option>";
381 if ( isset( $defcfg[$k]['comment'] ) ) {
382 echo ' ' . $defcfg[$k]['comment'];
386 case SMOPT_TYPE_STRLIST
:
387 if ( sqgetGlobalVar($e, $v, SQ_POST
) ) {
391 echo "<tr><td>$name</td><td>".
392 "<select name=\"adm_$n\">";
393 foreach ( $defcfg[$k]['posvals'] as $kp => $vp ) {
394 echo "<option value=\"$kp\"";
395 if ( $kp == substr( $v, 1, strlen( $v ) - 2 ) ) {
396 echo ' selected="selected"';
398 echo ">$vp</option>";
401 if ( isset( $defcfg[$k]['comment'] ) ) {
402 echo ' ' . $defcfg[$k]['comment'];
407 case SMOPT_TYPE_TEXTAREA
:
408 if ( sqgetGlobalVar($e, $v, SQ_POST
) ) {
410 $newcfg[$k] = str_replace( "\n", '', $v );
412 echo "<tr><td valign=\"top\">$name</td><td>".
413 "<textarea cols=\"$size\" rows=\"4\" name=\"adm_$n\">" . substr( $v, 1, strlen( $v ) - 2 ) . "</textarea>";
414 if ( isset( $defcfg[$k]['comment'] ) ) {
415 echo ' ' . $defcfg[$k]['comment'];
419 case SMOPT_TYPE_STRING
:
420 if ( sqgetGlobalVar($e, $v, SQ_POST
) ) {
424 if ( $v == '""' && isset( $defcfg[$k]['default'] ) ) {
425 $v = "'" . $defcfg[$k]['default'] . "'";
428 echo "<tr><td>$name</td><td>".
429 "<input size=\"$size\" name=\"adm_$n\" value=\"" . substr( $v, 1, strlen( $v ) - 2 ) . '" />';
430 if ( isset( $defcfg[$k]['comment'] ) ) {
431 echo ' ' . $defcfg[$k]['comment'];
435 case SMOPT_TYPE_BOOLEAN
:
436 if ( sqgetGlobalVar($e, $v, SQ_POST
) ) {
439 $v = strtoupper( $v );
441 if ( $v == 'TRUE' ) {
442 $ct = ' checked="checked"';
446 $cf = ' checked="checked"';
448 echo "<tr><td>$name</td><td>" .
449 "<input$ct type=\"radio\" name=\"adm_$n\" value=\"TRUE\" />" . _("Yes") .
450 "<input$cf type=\"radio\" name=\"adm_$n\" value=\"FALSE\" />" . _("No");
451 if ( isset( $defcfg[$k]['comment'] ) ) {
452 echo ' ' . $defcfg[$k]['comment'];
456 case SMOPT_TYPE_PATH
:
457 if ( sqgetGlobalVar($e, $v, SQ_POST
) ) {
458 $v = change_to_sm_path($v);
461 if ( $v == "''" && isset( $defcfg[$k]['default'] ) ) {
462 $v = change_to_sm_path($defcfg[$k]['default']);
465 echo "<tr><td>$name</td><td>".
466 "<input size=\"$size\" name=\"adm_$n\" value=\"" . change_to_rel_path($v) . '" />';
467 if ( isset( $defcfg[$k]['comment'] ) ) {
468 echo ' ' . $defcfg[$k]['comment'];
473 echo "<tr><td>$name</td><td>" .
475 if ( isset( $defcfg[$k]['comment'] ) ) {
476 echo ' ' . $defcfg[$k]['comment'];
483 /* Special Themes Block */
484 if ( $colapse['Group7'] == 'off' ) {
486 echo '<tr><th>' . _("Theme Name") .
487 '</th><th>' . _("Theme Path") .
489 while ( isset( $newcfg["\$theme[$i]['NAME']"] ) ) {
490 $k1 = "\$theme[$i]['NAME']";
491 $e1 = "theme_name_$i";
492 if ( sqgetGlobalVar($e, $v1, SQ_POST
) ) {
493 $v1 = '"' . str_replace( '\"', '"', $v1 ) . '"';
494 $v1 = '"' . str_replace( '"', '\"', $v1 ) . '"';
499 $k2 = "\$theme[$i]['PATH']";
500 $e2 = "theme_path_$i";
501 if ( sqgetGlobalVar($e, $v2, SQ_POST
) ) {
502 $v2 = change_to_sm_path($v2);
507 $name = substr( $v1, 1, strlen( $v1 ) - 2 );
508 $path = change_to_rel_path($v2);
510 "<td align=\"right\">$i. <input name=\"$e1\" value=\"$name\" size=\"30\" /></td>".
511 "<td><input name=\"$e2\" value=\"$path\" size=\"40\" /></td>".
518 /* Special Plugins Block */
519 if ( $colapse['Group8'] == 'on' ) {
524 echo '<tr bgcolor="'.$color[0].'"><th colspan="2">'.
525 '<a href="options.php?switch=Group8" style="text-decoration:none"><b>'.
526 $sw.'</b></a> '._("Plugins").'</th></tr>';
528 if ( $colapse['Group8'] == 'off' ) {
530 $plugpath = SM_PATH
. 'plugins/';
531 if ( file_exists($plugpath) ) {
532 $fd = opendir( $plugpath );
533 $op_plugin = array();
535 while (false !== ($file = readdir($fd))) {
536 if ($file != '.' && $file != '..' && $file != 'CVS' && is_dir($plugpath . $file) ) {
537 $op_plugin[] = $file;
544 /* Lets get the plugins that are active */
546 if ( sqgetGlobalVar('plg', $v, SQ_POST
) ) {
547 foreach ( $op_plugin as $plg ) {
548 if ( sqgetGlobalVar("plgs_$plg", $v, SQ_POST
) && $v == 'on' ) {
553 foreach ( $plugins as $plg ) {
554 $k = "\$plugins[$i]";
555 $newcfg[$k] = "'$plg'";
558 while ( isset( $newcfg["\$plugins[$i]"] ) ) {
559 $k = "\$plugins[$i]";
565 while ( isset( $newcfg["\$plugins[$i]"] ) ) {
566 $k = "\$plugins[$i]";
568 $plugins[] = substr( $v, 1, strlen( $v ) - 2 );
572 echo '<tr><td colspan="2"><input type="hidden" name="plg" value="on" /><center><table>';
573 foreach ( $op_plugin as $plg ) {
574 if ( in_array( $plg, $plugins ) ) {
575 $sw = ' checked="checked"';
580 if (file_exists(SM_PATH
. "plugins/$plg/README")) {
581 echo "<a href=\"../$plg/README\" target=\"_blank\">$plg</a>";
586 "<td><input$sw type=\"checkbox\" name=\"plgs_$plg\" /></td>".
589 echo '</table></center></td></tr>';
591 echo '<tr><td colspan="2" align="center">'.
592 sprintf(_("Plugin directory could not be found: %s"), $plugpath).
596 echo '<tr bgcolor="'.$color[5].'"><th colspan="2"><input value="'.
597 _("Change Settings").'" type="submit" /><br />'.
598 '<a href="'.SM_PATH
.'src/configtest.php" target="_blank">'.
599 _("Test Configuration")."</a></th></tr>\n".
600 '</table></td></tr></table></center></form>';
603 Write the options to the file.
606 if ( $fp = @fopen
( $cfgfile, 'w' ) ) {
607 fwrite( $fp, "<?php\n".
609 " * SquirrelMail Configuration File\n".
610 " * Created using the Administrator Plugin\n".
613 "global \$version;\n" );
615 foreach ( $newcfg as $k => $v ) {
616 if ( $k{0} == '$' && $v <> '' ||
is_int($v)) {
617 if ( substr( $k, 1, 11 ) == 'ldap_server' ) {
618 $v = substr( $v, 0, strlen( $v ) - 1 ) . "\n)";
619 $v = str_replace( 'array(', "array(\n\t", $v );
620 $v = str_replace( "',", "',\n\t", $v );
622 fwrite( $fp, "$k = $v;\n" );
628 echo '<br /><p align="center"><big>'.
629 _("Config file can't be opened. Please check config.php.").