5d3a1fe1e8454a20a13fead4a6fae801a5e8235a
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-2007 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 * C:/absolute/win/path --> 'C:/absolute/win/path'
174 * /absolute/path/logo.gif --> '/absolute/path/logo.gif'
175 * http://whatever/ --> 'http://whatever'
177 * @param string $old_path path that has to be converted
178 * @return string new path
181 function change_to_sm_path($old_path) {
182 if ( $old_path === '' ||
$old_path == "''" ) {
184 } elseif ( preg_match("/^(\/|http)/", $old_path) ||
185 substr($old_path,1,2) == ':/' ) {
186 return "'" . $old_path . "'";
187 } elseif ( preg_match("/^(\$|SM_PATH)/", $old_path) ) {
192 $rel_path = explode("../", $old_path);
193 if ( count($rel_path) > 2 ) {
194 // Since we're relative to the config dir,
195 // more than 1 ../ puts us OUTSIDE the SM tree.
196 // get full path to config.php, then pop the filename
197 $abs_path = explode('/', realpath (SM_PATH
. 'config/config.php'));
198 array_pop ($abs_path);
199 foreach ( $rel_path as $subdir ) {
200 if ( $subdir === '' ) {
201 array_pop ($abs_path);
203 array_push($abs_path, $subdir);
206 foreach ($abs_path as $subdir) {
207 $new_path .= $subdir . '/';
209 $new_path = "'$new_path'";
210 } elseif ( count($rel_path) > 1 ) {
211 // we're within the SM tree, prepend SM_PATH
212 $new_path = str_replace('../',"SM_PATH . '", $old_path . "'");
214 // Last, if it's a relative path without a .. prefix,
215 // we're somewhere within the config dir, so prepend
216 // SM_PATH . 'config/
217 $new_path = "SM_PATH . 'config/" . $old_path . "'";
223 /* ---------------------- main -------------------------- */
224 /** main SquirrelMail include */
225 require('../../include/init.php');
226 /* configuration definitions */
227 include_once(SM_PATH
. 'plugins/administrator/defines.php');
228 /* additional functions */
229 include_once(SM_PATH
. 'plugins/administrator/auth.php');
231 global $data_dir, $username;
233 if ( !adm_check_user() ) {
234 header('Location: ' . SM_PATH
. 'src/options.php') ;
238 displayPageHeader($color);
242 foreach ( $defcfg as $key => $def ) {
246 $cfgfile = SM_PATH
. 'config/config.php';
247 parseConfig( SM_PATH
. 'config/config_default.php' );
248 parseConfig( $cfgfile );
250 $colapse = array( 'Titles' => 'off',
251 'Group1' => getPref($data_dir, $username, 'adm_Group1', 'off' ),
252 'Group2' => getPref($data_dir, $username, 'adm_Group2', 'on' ),
253 'Group3' => getPref($data_dir, $username, 'adm_Group3', 'on' ),
254 'Group4' => getPref($data_dir, $username, 'adm_Group4', 'on' ),
255 'Group5' => getPref($data_dir, $username, 'adm_Group5', 'on' ),
256 'Group6' => getPref($data_dir, $username, 'adm_Group6', 'on' ),
257 'Group7' => getPref($data_dir, $username, 'adm_Group7', 'on' ),
258 'Group8' => getPref($data_dir, $username, 'adm_Group8', 'on' ),
259 'Group9' => getPref($data_dir, $username, 'adm_Group9', 'on' ),
260 'Group10' => getPref($data_dir, $username, 'adm_Group10', 'on' ),
261 'Group11' => getPref($data_dir, $username, 'adm_Group11', 'on' ) );
263 /* look in $_GET array for 'switch' */
264 if ( sqgetGlobalVar('switch', $switch, SQ_GET
) ) {
265 if ( $colapse[$switch] == 'on' ) {
266 $colapse[$switch] = 'off';
268 $colapse[$switch] = 'on';
270 setPref($data_dir, $username, "adm_$switch", $colapse[$switch] );
273 echo '<form action="options.php" method="post" name="options">' .
274 '<table width="95%" align="center" bgcolor="'.$color[5].'"><tr><td>'.
275 '<table width="100%" cellspacing="0" bgcolor="'.$color[4].'">'.
276 '<tr bgcolor="'.$color[5].'"><th colspan="2">'.
277 _("Configuration Administrator").'</th></tr>'.
278 '<tr bgcolor="'.$color[5].'"><td colspan="2" align="center"><small>'.
279 _("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.").
281 _("Run or consult conf.pl should you run into difficulty with your configuration.").
282 '</small></td></tr>';
285 $act_grp = 'Titles'; /* Active group */
287 foreach ( $newcfg as $k => $v ) {
288 $l = strtolower( $v );
289 $type = SMOPT_TYPE_UNDEFINED
;
290 $n = substr( $k, 1 );
291 $n = str_replace( '[', '_', $n );
292 $n = str_replace( ']', '_', $n );
296 if ( isset( $defcfg[$k] ) ) {
297 $name = $defcfg[$k]['name'];
298 $type = $defcfg[$k]['type'];
299 if ( isset( $defcfg[$k]['size'] ) ) {
300 $size = $defcfg[$k]['size'];
304 } else if ( $l == 'true' ) {
306 $type = SMOPT_TYPE_BOOLEAN
;
307 } else if ( $l == 'false' ) {
309 $type = SMOPT_TYPE_BOOLEAN
;
310 } else if ( $v{0} == "'" ) {
311 $type = SMOPT_TYPE_STRING
;
312 } else if ( $v{0} == '"' ) {
313 $type = SMOPT_TYPE_STRING
;
316 if ( substr( $k, 0, 7 ) == '$theme[' ) {
317 $type = SMOPT_TYPE_THEME
;
318 } else if ( substr( $k, 0, 9 ) == '$plugins[' ) {
319 $type = SMOPT_TYPE_PLUGINS
;
320 } else if ( substr( $k, 0, 13 ) == '$ldap_server[' ) {
321 $type = SMOPT_TYPE_LDAP
;
322 } else if ( substr( $k, 0, 9 ) == '$fontsets' ||
323 substr( $k, 0, 13 ) == '$aTemplateSet' ) {
324 $type = SMOPT_TYPE_CUSTOM
;
327 if ( $type == SMOPT_TYPE_TITLE ||
$colapse[$act_grp] == 'off' ) {
330 case SMOPT_TYPE_LDAP
:
331 case SMOPT_TYPE_CUSTOM
:
332 case SMOPT_TYPE_PLUGINS
:
333 case SMOPT_TYPE_THEME
:
334 case SMOPT_TYPE_HIDDEN
:
336 case SMOPT_TYPE_EXTERNAL
:
337 echo "<tr><td>$name</td><td><b>" .
338 $defcfg[$k]['value'] .
341 case SMOPT_TYPE_TITLE
:
342 if ( $colapse[$k] == 'on' ) {
347 echo '<tr bgcolor="'.$color[0].'"><th colspan="2">'.
348 "<a href=\"options.php?switch=$k\" style=\"text-decoration:none\">".
349 '<b>'.$sw.'</b></a> '.$name.'</th></tr>';
352 case SMOPT_TYPE_COMMENT
:
353 $v = substr( $v, 1, strlen( $v ) - 2 );
354 echo "<tr><td>$name</td><td>".
356 $newcfg[$k] = "'$v'";
357 if ( isset( $defcfg[$k]['comment'] ) ) {
358 echo ' ' . $defcfg[$k]['comment'];
362 case SMOPT_TYPE_INTEGER
:
363 /* look for variable $e in POST, fill into $v */
364 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
365 $v = intval( $new_v );
368 echo "<tr><td>$name</td><td>".
369 "<input size=\"10\" name=\"adm_$n\" value=\"$v\" />";
370 if ( isset( $defcfg[$k]['comment'] ) ) {
371 echo ' ' . $defcfg[$k]['comment'];
375 case SMOPT_TYPE_NUMLIST
:
376 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
380 echo "<tr><td>$name</td><td>";
381 echo "<select name=\"adm_$n\">";
382 foreach ( $defcfg[$k]['posvals'] as $kp => $vp ) {
383 echo "<option value=\"$kp\"";
385 echo ' selected="selected"';
387 echo ">$vp</option>";
390 if ( isset( $defcfg[$k]['comment'] ) ) {
391 echo ' ' . $defcfg[$k]['comment'];
395 case SMOPT_TYPE_STRLIST
:
396 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
397 $v = '"' . $new_v . '"';
400 echo "<tr><td>$name</td><td>".
401 "<select name=\"adm_$n\">";
402 foreach ( $defcfg[$k]['posvals'] as $kp => $vp ) {
403 echo "<option value=\"$kp\"";
404 if ( $kp == substr( $v, 1, strlen( $v ) - 2 ) ) {
405 echo ' selected="selected"';
407 echo ">$vp</option>";
410 if ( isset( $defcfg[$k]['comment'] ) ) {
411 echo ' ' . $defcfg[$k]['comment'];
416 case SMOPT_TYPE_TEXTAREA
:
417 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
418 $v = '"' . addslashes($new_v) . '"';
419 $newcfg[$k] = str_replace( "\n", '', $v );
421 echo "<tr><td valign=\"top\">$name</td><td>"
422 ."<textarea cols=\"$size\" rows=\"4\" name=\"adm_$n\">"
423 .htmlspecialchars(stripslashes(substr( $v, 1, strlen( $v ) - 2 )))
425 if ( isset( $defcfg[$k]['comment'] ) ) {
426 echo ' ' . $defcfg[$k]['comment'];
430 case SMOPT_TYPE_STRING
:
431 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
432 $v = '"' . addslashes($new_v) . '"';
435 if ( $v == '""' && isset( $defcfg[$k]['default'] ) ) {
436 $v = "'" . $defcfg[$k]['default'] . "'";
439 echo "<tr><td>$name</td><td>"
440 ."<input size=\"$size\" name=\"adm_$n\" value=\""
441 .htmlspecialchars(stripslashes(substr( $v, 1, strlen( $v ) - 2 )))
443 if ( isset( $defcfg[$k]['comment'] ) ) {
444 echo ' ' . $defcfg[$k]['comment'];
448 case SMOPT_TYPE_BOOLEAN
:
449 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
453 $v = strtoupper( $v );
455 if ( $v == 'TRUE' ) {
456 $ct = ' checked="checked"';
460 $cf = ' checked="checked"';
462 echo "<tr><td>$name</td><td>" .
463 "<input$ct type=\"radio\" name=\"adm_$n\" value=\"TRUE\" />" . _("Yes") .
464 "<input$cf type=\"radio\" name=\"adm_$n\" value=\"FALSE\" />" . _("No");
465 if ( isset( $defcfg[$k]['comment'] ) ) {
466 echo ' ' . $defcfg[$k]['comment'];
470 case SMOPT_TYPE_PATH
:
471 if ( sqgetGlobalVar($e, $new_v, SQ_POST
) ) {
472 // FIXME: fix use of $data_dir in $attachment_dir
473 $v = change_to_sm_path($new_v);
476 if ( $v == "''" && isset( $defcfg[$k]['default'] ) ) {
477 $v = change_to_sm_path($defcfg[$k]['default']);
480 echo "<tr><td>$name</td><td>".
481 "<input size=\"$size\" name=\"adm_$n\" value=\"" . change_to_rel_path($v) . '" />';
482 if ( isset( $defcfg[$k]['comment'] ) ) {
483 echo ' ' . $defcfg[$k]['comment'];
488 echo "<tr><td>$name</td><td>" .
490 if ( isset( $defcfg[$k]['comment'] ) ) {
491 echo ' ' . $defcfg[$k]['comment'];
498 /* Special Themes Block */
499 if ( $colapse['Group7'] == 'off' ) {
501 echo '<tr><th>' . _("Theme Name") .
502 '</th><th>' . _("Theme Path") .
504 while ( isset( $newcfg["\$theme[$i]['NAME']"] ) ) {
505 $k1 = "\$theme[$i]['NAME']";
506 $e1 = "theme_name_$i";
507 if ( sqgetGlobalVar($e, $v1, SQ_POST
) ) {
508 $v1 = '"' . str_replace( '\"', '"', $v1 ) . '"';
509 $v1 = '"' . str_replace( '"', '\"', $v1 ) . '"';
514 $k2 = "\$theme[$i]['PATH']";
515 $e2 = "theme_path_$i";
516 if ( sqgetGlobalVar($e, $v2, SQ_POST
) ) {
517 $v2 = change_to_sm_path($v2);
522 $name = substr( $v1, 1, strlen( $v1 ) - 2 );
523 $path = change_to_rel_path($v2);
525 "<td align=\"right\">$i. <input name=\"$e1\" value=\"$name\" size=\"30\" /></td>".
526 "<td><input name=\"$e2\" value=\"$path\" size=\"40\" /></td>".
533 /* Special Plugins Block */
534 if ( $colapse['Group8'] == 'on' ) {
539 echo '<tr bgcolor="'.$color[0].'"><th colspan="2">'.
540 '<a href="options.php?switch=Group8" style="text-decoration:none"><b>'.
541 $sw.'</b></a> '._("Plugins").'</th></tr>';
543 if ( $colapse['Group8'] == 'off' ) {
545 $plugpath = SM_PATH
. 'plugins/';
546 if ( file_exists($plugpath) ) {
547 $fd = opendir( $plugpath );
548 $op_plugin = array();
550 while (false !== ($file = readdir($fd))) {
551 if ($file != '.' && $file != '..' && $file != 'CVS' && is_dir($plugpath . $file) ) {
552 $op_plugin[] = $file;
559 /* Lets get the plugins that are active */
561 if ( sqgetGlobalVar('plg', $v, SQ_POST
) ) {
562 foreach ( $op_plugin as $plg ) {
563 if ( sqgetGlobalVar("plgs_$plg", $v2, SQ_POST
) && $v2 == 'on' ) {
568 foreach ( $plugins as $plg ) {
569 $k = "\$plugins[$i]";
570 $newcfg[$k] = "'$plg'";
573 while ( isset( $newcfg["\$plugins[$i]"] ) ) {
574 $k = "\$plugins[$i]";
580 while ( isset( $newcfg["\$plugins[$i]"] ) ) {
581 $k = "\$plugins[$i]";
583 $plugins[] = substr( $v, 1, strlen( $v ) - 2 );
587 echo '<tr><td colspan="2"><input type="hidden" name="plg" value="on" /><table align="center">';
588 foreach ( $op_plugin as $plg ) {
589 if ( in_array( $plg, $plugins ) ) {
590 $sw = ' checked="checked"';
595 if (file_exists(SM_PATH
. "plugins/$plg/README")) {
596 echo "<a href=\"../$plg/README\" target=\"_blank\">$plg</a>";
601 "<td><input$sw type=\"checkbox\" name=\"plgs_$plg\" /></td>".
604 echo '</table></td></tr>';
606 echo '<tr><td colspan="2" align="center">'.
607 sprintf(_("Plugin directory could not be found: %s"), $plugpath).
611 echo '<tr bgcolor="'.$color[5].'"><th colspan="2"><input value="'.
612 _("Change Settings").'" type="submit" /><br />'.
613 '<a href="'.SM_PATH
.'src/configtest.php" target="_blank">'.
614 _("Test Configuration")."</a></th></tr>\n".
615 '</table></td></tr></table></form>';
618 Write the options to the file.
621 if ( $fp = @fopen
( $cfgfile, 'w' ) ) {
622 fwrite( $fp, "<?php\n".
624 " * SquirrelMail Configuration File\n".
625 " * Created using the Administrator Plugin\n".
629 foreach ( $newcfg as $k => $v ) {
630 if ( $k{0} == '$' && $v <> '' ||
is_int($v)) {
631 if ( substr( $k, 1, 11 ) == 'ldap_server' ) {
632 $v = substr( $v, 0, strlen( $v ) - 1 ) . "\n)";
633 $v = str_replace( 'array(', "array(\n\t", $v );
634 $v = str_replace( "',", "',\n\t", $v );
636 /* FIXME: add elseif that reverts plugins[#] to plugins[] */
637 fwrite( $fp, "$k = $v;\n" );
644 echo '<br /><p align="center"><big>'.
645 _("Config file can't be opened. Please check config.php.").