1c35dc432c4f2c529f2e64a27bddbae6b2418b56
4 * Administrator Plugin - Options Page
6 * This script creates separate page, that allows to review and modify
7 * SquirrelMail configuration file.
9 * @author Philippe Mingo
10 * @copyright © 1999-2006 The SquirrelMail Project Team
11 * @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 );
33 for ($i=0;$i<$l;$i++
) {
34 $line = trim( $cfg[$i] );
36 for ($j=0;$j<$s;$j++
) {
39 if ( $line{$j} == '=' ) {
40 // Ok, we've got a right value, lets detect what type
42 } else if ( $line{$j} == ';' ) {
49 if ( $line{$j} == ' ' ) {
53 // FIXME: this is only pour workaround for plugins[] array.
54 if ($line{$j}=='[' && $line{($j+
1)}==']') {
62 if ( $line{$j} == ';' ) {
67 if ( $line{$j} == '\\' ) {
70 } else if ( $line{$j} == $delimiter && $modifier === FALSE ) {
72 $newcfg[$key] = $value . $delimiter;
81 if ( $line{$j} == ';' ) {
82 $newcfg{$key} = $value;
91 $line{$j}.$line{$j+
1} == '*/' ) {
98 switch ( $line{$j} ) {
101 // Double quote string
102 $delimiter = $value = $line{$j};
109 if ( strtoupper( substr( $line, $j, 4 ) ) == 'TRUE' ) {
111 $newcfg{$key} = 'TRUE';
114 } else if ( strtoupper( substr( $line, $j, 5 ) ) == 'FALSE' ) {
115 $newcfg{$key} = 'FALSE';
119 // Number or function call
126 if ( $line{$j} == '$' ) {
127 // We must detect $key name
130 } else if ( $s < $j +
2 ) {
131 } else if ( strtoupper( substr( $line, $j, 7 ) ) == 'GLOBAL ' ) {
132 // Skip untill next ;
135 } else if ( $line{$j}.$line{$j+
1} == '/*' ) {
138 } else if ( $line{$j} == '#' ||
$line{$j}.$line{$j+
1} == '//' ) {
139 // Delete till the end of the line
148 * Change paths containing SM_PATH to admin-friendly paths
149 * relative to the config dir, i.e.:
150 * '' --> <empty string>
151 * SM_PATH . 'images/logo.gif' --> ../images/logo.gif
152 * '/absolute/path/logo.gif' --> /absolute/path/logo.gif
153 * 'http://whatever/' --> http://whatever
154 * Note removal of quotes in returned value
156 * @param string $old_path path that has to be converted
157 * @return string new path
160 function change_to_rel_path($old_path) {
161 $new_path = str_replace("SM_PATH . '", "../", $old_path);
162 $new_path = str_replace("../config/","", $new_path);
163 $new_path = str_replace("'","", $new_path);
168 * Change relative path (relative to config dir) to
169 * internal SM_PATH, i.e.:
170 * empty_string --> ''
171 * ../images/logo.gif --> SM_PATH . 'images/logo.gif'
172 * images/logo.gif --> SM_PATH . 'config/images/logo.gif'
173 * /absolute/path/logo.gif --> '/absolute/path/logo.gif'
174 * http://whatever/ --> 'http://whatever'
176 * @param string $old_path path that has to be converted
177 * @return string new path
180 function change_to_sm_path($old_path) {
181 if ( $old_path === '' ||
$old_path == "''" ) {
183 } elseif ( preg_match("/^(\/|http)/", $old_path) ) {
184 return "'" . $old_path . "'";
185 } elseif ( preg_match("/^(\$|SM_PATH)/", $old_path) ) {
190 $rel_path = explode("../", $old_path);
191 if ( count($rel_path) > 2 ) {
192 // Since we're relative to the config dir,
193 // more than 1 ../ puts us OUTSIDE the SM tree.
194 // get full path to config.php, then pop the filename
195 $abs_path = explode('/', realpath (SM_PATH
. 'config/config.php'));
196 array_pop ($abs_path);
197 foreach ( $rel_path as $subdir ) {
198 if ( $subdir === '' ) {
199 array_pop ($abs_path);
201 array_push($abs_path, $subdir);
204 foreach ($abs_path as $subdir) {
205 $new_path .= $subdir . '/';
207 $new_path = "'$new_path'";
208 } elseif ( count($rel_path) > 1 ) {
209 // we're within the SM tree, prepend SM_PATH
210 $new_path = str_replace('../',"SM_PATH . '", $old_path . "'");
212 // Last, if it's a relative path without a .. prefix,
213 // we're somewhere within the config dir, so prepend
214 // SM_PATH . 'config/
215 $new_path = "SM_PATH . 'config/" . $old_path . "'";
221 /* ---------------------- main -------------------------- */
224 define('SM_PATH','../../');
226 /* SquirrelMail required files. */
227 require_once(SM_PATH
. 'include/validate.php');
228 require_once(SM_PATH
. 'functions/imap.php');
229 require_once(SM_PATH
. 'plugins/administrator/defines.php');
230 require_once(SM_PATH
. 'plugins/administrator/auth.php');
232 global $data_dir, $username;
234 if ( !adm_check_user() ) {
235 header('Location: ' . SM_PATH
. 'src/options.php') ;
239 displayPageHeader($color, 'None');
243 foreach ( $defcfg as $key => $def ) {
247 $cfgfile = SM_PATH
. 'config/config.php';
248 parseConfig( SM_PATH
. 'config/config_default.php' );
249 parseConfig( $cfgfile );
251 $colapse = array( 'Titles' => 'off',
252 'Group1' => getPref($data_dir, $username, 'adm_Group1', 'off' ),
253 'Group2' => getPref($data_dir, $username, 'adm_Group2', 'on' ),
254 'Group3' => getPref($data_dir, $username, 'adm_Group3', 'on' ),
255 'Group4' => getPref($data_dir, $username, 'adm_Group4', 'on' ),
256 'Group5' => getPref($data_dir, $username, 'adm_Group5', 'on' ),
257 'Group6' => getPref($data_dir, $username, 'adm_Group6', 'on' ),
258 'Group7' => getPref($data_dir, $username, 'adm_Group7', 'on' ),
259 'Group8' => getPref($data_dir, $username, 'adm_Group8', 'on' ),
260 'Group9' => getPref($data_dir, $username, 'adm_Group9', 'on' ),
261 'Group10' => getPref($data_dir, $username, 'adm_Group10', 'on' ),
262 'Group11' => getPref($data_dir, $username, 'adm_Group11', 'on' ) );
264 /* look in $_GET array for 'switch' */
265 if ( sqgetGlobalVar('switch', $switch, SQ_GET
) ) {
266 if ( $colapse[$switch] == 'on' ) {
267 $colapse[$switch] = 'off';
269 $colapse[$switch] = 'on';
271 setPref($data_dir, $username, "adm_$switch", $colapse[$switch] );
274 echo '<form action="options.php" method="post" name="options">' .
275 '<table width="95%" align="center" bgcolor="'.$color[5].'"><tr><td>'.
276 '<table width="100%" cellspacing="0" bgcolor="'.$color[4].'">'.
277 '<tr bgcolor="'.$color[5].'"><th colspan="2">'.
278 _("Configuration Administrator").'</th></tr>'.
279 '<tr bgcolor="'.$color[5].'"><td colspan="2" align="center"><small>'.
280 _("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.").
282 _("Run or consult conf.pl should you run into difficulty with your configuration.").
283 '</small></td></tr>';
286 $act_grp = 'Titles'; /* Active group */
288 foreach ( $newcfg as $k => $v ) {
289 $l = strtolower( $v );
290 $type = SMOPT_TYPE_UNDEFINED
;
291 $n = substr( $k, 1 );
292 $n = str_replace( '[', '_', $n );
293 $n = str_replace( ']', '_', $n );
297 if ( isset( $defcfg[$k] ) ) {
298 $name = $defcfg[$k]['name'];
299 $type = $defcfg[$k]['type'];
300 if ( isset( $defcfg[$k]['size'] ) ) {
301 $size = $defcfg[$k]['size'];
305 } else if ( $l == 'true' ) {
307 $type = SMOPT_TYPE_BOOLEAN
;
308 } else if ( $l == 'false' ) {
310 $type = SMOPT_TYPE_BOOLEAN
;
311 } else if ( $v{0} == "'" ) {
312 $type = SMOPT_TYPE_STRING
;
313 } else if ( $v{0} == '"' ) {
314 $type = SMOPT_TYPE_STRING
;
317 if ( substr( $k, 0, 7 ) == '$theme[' ) {
318 $type = SMOPT_TYPE_THEME
;
319 } else if ( substr( $k, 0, 9 ) == '$plugins[' ) {
320 $type = SMOPT_TYPE_PLUGINS
;
321 } else if ( substr( $k, 0, 13 ) == '$ldap_server[' ) {
322 $type = SMOPT_TYPE_LDAP
;
323 } else if ( substr( $k, 0, 9 ) == '$fontsets' ||
324 substr( $k, 0, 13 ) == '$aTemplateSet' ) {
325 $type = SMOPT_TYPE_CUSTOM
;
328 if ( $type == SMOPT_TYPE_TITLE ||
$colapse[$act_grp] == 'off' ) {
331 case SMOPT_TYPE_LDAP
:
332 case SMOPT_TYPE_CUSTOM
:
333 case SMOPT_TYPE_PLUGINS
:
334 case SMOPT_TYPE_THEME
:
335 case SMOPT_TYPE_HIDDEN
:
337 case SMOPT_TYPE_EXTERNAL
:
338 echo "<tr><td>$name</td><td><b>" .
339 $defcfg[$k]['value'] .
342 case SMOPT_TYPE_TITLE
:
343 if ( $colapse[$k] == 'on' ) {
348 echo '<tr bgcolor="'.$color[0].'"><th colspan="2">'.
349 "<a href=\"options.php?switch=$k\" style=\"text-decoration:none\">".
350 '<b>'.$sw.'</b></a> '.$name.'</th></tr>';
353 case SMOPT_TYPE_COMMENT
:
354 $v = substr( $v, 1, strlen( $v ) - 2 );
355 echo "<tr><td>$name</td><td>".
357 $newcfg[$k] = "'$v'";
358 if ( isset( $defcfg[$k]['comment'] ) ) {
359 echo ' ' . $defcfg[$k]['comment'];
363 case SMOPT_TYPE_INTEGER
:
364 /* look for variable $e in POST, fill into $v */
365 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
366 $v = intval( $new_v );
369 echo "<tr><td>$name</td><td>".
370 "<input size=\"10\" name=\"adm_$n\" value=\"$v\" />";
371 if ( isset( $defcfg[$k]['comment'] ) ) {
372 echo ' ' . $defcfg[$k]['comment'];
376 case SMOPT_TYPE_NUMLIST
:
377 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
381 echo "<tr><td>$name</td><td>";
382 echo "<select name=\"adm_$n\">";
383 foreach ( $defcfg[$k]['posvals'] as $kp => $vp ) {
384 echo "<option value=\"$kp\"";
386 echo ' selected="selected"';
388 echo ">$vp</option>";
391 if ( isset( $defcfg[$k]['comment'] ) ) {
392 echo ' ' . $defcfg[$k]['comment'];
396 case SMOPT_TYPE_STRLIST
:
397 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
398 $v = '"' . $new_v . '"';
401 echo "<tr><td>$name</td><td>".
402 "<select name=\"adm_$n\">";
403 foreach ( $defcfg[$k]['posvals'] as $kp => $vp ) {
404 echo "<option value=\"$kp\"";
405 if ( $kp == substr( $v, 1, strlen( $v ) - 2 ) ) {
406 echo ' selected="selected"';
408 echo ">$vp</option>";
411 if ( isset( $defcfg[$k]['comment'] ) ) {
412 echo ' ' . $defcfg[$k]['comment'];
417 case SMOPT_TYPE_TEXTAREA
:
418 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
419 $v = '"' . $new_v . '"';
420 $newcfg[$k] = str_replace( "\n", '', $v );
422 echo "<tr><td valign=\"top\">$name</td><td>".
423 "<textarea cols=\"$size\" rows=\"4\" name=\"adm_$n\">" . substr( $v, 1, strlen( $v ) - 2 ) . "</textarea>";
424 if ( isset( $defcfg[$k]['comment'] ) ) {
425 echo ' ' . $defcfg[$k]['comment'];
429 case SMOPT_TYPE_STRING
:
430 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
431 $v = '"' . $new_v . '"';
434 if ( $v == '""' && isset( $defcfg[$k]['default'] ) ) {
435 $v = "'" . $defcfg[$k]['default'] . "'";
438 echo "<tr><td>$name</td><td>".
439 "<input size=\"$size\" name=\"adm_$n\" value=\"" . substr( $v, 1, strlen( $v ) - 2 ) . '" />';
440 if ( isset( $defcfg[$k]['comment'] ) ) {
441 echo ' ' . $defcfg[$k]['comment'];
445 case SMOPT_TYPE_BOOLEAN
:
446 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
450 $v = strtoupper( $v );
452 if ( $v == 'TRUE' ) {
453 $ct = ' checked="checked"';
457 $cf = ' checked="checked"';
459 echo "<tr><td>$name</td><td>" .
460 "<input$ct type=\"radio\" name=\"adm_$n\" value=\"TRUE\" />" . _("Yes") .
461 "<input$cf type=\"radio\" name=\"adm_$n\" value=\"FALSE\" />" . _("No");
462 if ( isset( $defcfg[$k]['comment'] ) ) {
463 echo ' ' . $defcfg[$k]['comment'];
467 case SMOPT_TYPE_PATH
:
468 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
469 // FIXME: fix use of $data_dir in $attachment_dir
470 $v = change_to_sm_path($new_v);
473 if ( $v == "''" && isset( $defcfg[$k]['default'] ) ) {
474 $v = change_to_sm_path($defcfg[$k]['default']);
477 echo "<tr><td>$name</td><td>".
478 "<input size=\"$size\" name=\"adm_$n\" value=\"" . change_to_rel_path($v) . '" />';
479 if ( isset( $defcfg[$k]['comment'] ) ) {
480 echo ' ' . $defcfg[$k]['comment'];
485 echo "<tr><td>$name</td><td>" .
487 if ( isset( $defcfg[$k]['comment'] ) ) {
488 echo ' ' . $defcfg[$k]['comment'];
495 /* Special Themes Block */
496 if ( $colapse['Group7'] == 'off' ) {
498 echo '<tr><th>' . _("Theme Name") .
499 '</th><th>' . _("Theme Path") .
501 while ( isset( $newcfg["\$theme[$i]['NAME']"] ) ) {
502 $k1 = "\$theme[$i]['NAME']";
503 $e1 = "theme_name_$i";
504 if ( sqgetGlobalVar($e, $v1, SQ_POST
) ) {
505 $v1 = '"' . str_replace( '\"', '"', $v1 ) . '"';
506 $v1 = '"' . str_replace( '"', '\"', $v1 ) . '"';
511 $k2 = "\$theme[$i]['PATH']";
512 $e2 = "theme_path_$i";
513 if ( sqgetGlobalVar($e, $v2, SQ_POST
) ) {
514 $v2 = change_to_sm_path($v2);
519 $name = substr( $v1, 1, strlen( $v1 ) - 2 );
520 $path = change_to_rel_path($v2);
522 "<td align=\"right\">$i. <input name=\"$e1\" value=\"$name\" size=\"30\" /></td>".
523 "<td><input name=\"$e2\" value=\"$path\" size=\"40\" /></td>".
530 /* Special Plugins Block */
531 if ( $colapse['Group8'] == 'on' ) {
536 echo '<tr bgcolor="'.$color[0].'"><th colspan="2">'.
537 '<a href="options.php?switch=Group8" style="text-decoration:none"><b>'.
538 $sw.'</b></a> '._("Plugins").'</th></tr>';
540 if ( $colapse['Group8'] == 'off' ) {
542 $plugpath = SM_PATH
. 'plugins/';
543 if ( file_exists($plugpath) ) {
544 $fd = opendir( $plugpath );
545 $op_plugin = array();
547 while (false !== ($file = readdir($fd))) {
548 if ($file != '.' && $file != '..' && $file != 'CVS' && is_dir($plugpath . $file) ) {
549 $op_plugin[] = $file;
556 /* Lets get the plugins that are active */
558 if ( sqgetGlobalVar('plg', $v, SQ_POST
) ) {
559 foreach ( $op_plugin as $plg ) {
560 if ( sqgetGlobalVar("plgs_$plg", $v2, SQ_POST
) && $v2 == 'on' ) {
565 foreach ( $plugins as $plg ) {
566 $k = "\$plugins[$i]";
567 $newcfg[$k] = "'$plg'";
570 while ( isset( $newcfg["\$plugins[$i]"] ) ) {
571 $k = "\$plugins[$i]";
577 while ( isset( $newcfg["\$plugins[$i]"] ) ) {
578 $k = "\$plugins[$i]";
580 $plugins[] = substr( $v, 1, strlen( $v ) - 2 );
584 echo '<tr><td colspan="2"><input type="hidden" name="plg" value="on" /><table align="center">';
585 foreach ( $op_plugin as $plg ) {
586 if ( in_array( $plg, $plugins ) ) {
587 $sw = ' checked="checked"';
592 if (file_exists(SM_PATH
. "plugins/$plg/README")) {
593 echo "<a href=\"../$plg/README\" target=\"_blank\">$plg</a>";
598 "<td><input$sw type=\"checkbox\" name=\"plgs_$plg\" /></td>".
601 echo '</table></td></tr>';
603 echo '<tr><td colspan="2" align="center">'.
604 sprintf(_("Plugin directory could not be found: %s"), $plugpath).
608 echo '<tr bgcolor="'.$color[5].'"><th colspan="2"><input value="'.
609 _("Change Settings").'" type="submit" /><br />'.
610 '<a href="'.SM_PATH
.'src/configtest.php" target="_blank">'.
611 _("Test Configuration")."</a></th></tr>\n".
612 '</table></td></tr></table></form>';
615 Write the options to the file.
618 if ( $fp = @fopen
( $cfgfile, 'w' ) ) {
619 fwrite( $fp, "<?php\n".
621 " * SquirrelMail Configuration File\n".
622 " * Created using the Administrator Plugin\n".
625 "global \$version;\n" );
627 foreach ( $newcfg as $k => $v ) {
628 if ( $k{0} == '$' && $v <> '' ||
is_int($v)) {
629 if ( substr( $k, 1, 11 ) == 'ldap_server' ) {
630 $v = substr( $v, 0, strlen( $v ) - 1 ) . "\n)";
631 $v = str_replace( 'array(', "array(\n\t", $v );
632 $v = str_replace( "',", "',\n\t", $v );
634 /* FIXME: add elseif that reverts plugins[#] to plugins[] */
635 fwrite( $fp, "$k = $v;\n" );
638 // add local config support
639 fwrite( $fp, "@include SM_PATH . 'config/config_local.php';\n" );
644 echo '<br /><p align="center"><big>'.
645 _("Config file can't be opened. Please check config.php.").