options.php 16 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514
  1. <?php
  2. /**
  3. * Administrator Plugin
  4. *
  5. * Copyright (c) 1999-2002 The SquirrelMail Project Team
  6. * Licensed under the GNU GPL. For full terms see the file COPYING.
  7. *
  8. * Philippe Mingo
  9. *
  10. * $Id$
  11. */
  12. function parseConfig( $cfg_file ) {
  13. global $newcfg;
  14. $cfg = file( $cfg_file );
  15. $mode = '';
  16. $l = count( $cfg );
  17. $modifier = FALSE;
  18. for ($i=0;$i<$l;$i++) {
  19. $line = trim( $cfg[$i] );
  20. $s = strlen( $line );
  21. for ($j=0;$j<$s;$j++) {
  22. switch ( $mode ) {
  23. case '=':
  24. if ( $line{$j} == '=' ) {
  25. // Ok, we've got a right value, lets detect what type
  26. $mode = 'D';
  27. } else if ( $line{$j} == ';' ) {
  28. // hu! end of command
  29. $key = $mode = '';
  30. }
  31. break;
  32. case 'K':
  33. // Key detect
  34. if( $line{$j} == ' ' ) {
  35. $mode = '=';
  36. } else {
  37. $key .= $line{$j};
  38. }
  39. break;
  40. case ';':
  41. // Skip until next ;
  42. if ( $line{$j} == ';' ) {
  43. $mode = '';
  44. }
  45. break;
  46. case 'S':
  47. if ( $line{$j} == '\\' ) {
  48. $value .= $line{$j};
  49. $modifier = TRUE;
  50. } else if ( $line{$j} == $delimiter && $modifier === FALSE ) {
  51. // End of string;
  52. $newcfg[$key] = $value . $delimiter;
  53. $key = $value = '';
  54. $mode = ';';
  55. } else {
  56. $value .= $line{$j};
  57. $modifier = FALSE;
  58. }
  59. break;
  60. case 'N':
  61. if ( $line{$j} == ';' ) {
  62. $newcfg{$key} = $value;
  63. $key = $mode = '';
  64. } else {
  65. $value .= $line{$j};
  66. }
  67. break;
  68. case 'C':
  69. // Comments
  70. if ( $s > $j + 1 &&
  71. $line{$j}.$line{$j+1} == '*/' ) {
  72. $mode = '';
  73. $j++;
  74. }
  75. break;
  76. case 'D':
  77. // Delimiter detect
  78. switch ( $line{$j} ) {
  79. case '"':
  80. case "'":
  81. // Double quote string
  82. $delimiter = $value = $line{$j};
  83. $mode = 'S';
  84. break;
  85. case ' ':
  86. // Nothing yet
  87. break;
  88. default:
  89. if ( strtoupper( substr( $line, $j, 4 ) ) == 'TRUE' ) {
  90. // Boolean TRUE
  91. $newcfg{$key} = 'TRUE';
  92. $key = '';
  93. $mode = ';';
  94. } else if ( strtoupper( substr( $line, $j, 5 ) ) == 'FALSE' ) {
  95. $newcfg{$key} = 'FALSE';
  96. $key = '';
  97. $mode = ';';
  98. } else {
  99. // Number or function call
  100. $mode = 'N';
  101. $value = $line{$j};
  102. }
  103. }
  104. break;
  105. default:
  106. if ( $line{$j} == '$' ) {
  107. // We must detect $key name
  108. $mode = 'K';
  109. $key = '$';
  110. } else if ( $s < $j + 2 ) {
  111. } else if ( strtoupper( substr( $line, $j, 7 ) ) == 'GLOBAL ' ) {
  112. // Skip untill next ;
  113. $mode = ';';
  114. $j += 6;
  115. } else if ( $line{$j}.$line{$j+1} == '/*' ) {
  116. $mode = 'C';
  117. $j++;
  118. } else if ( $line{$j} == '#' || $line{$j}.$line{$j+1} == '//' ) {
  119. // Delete till the end of the line
  120. $j = $s;
  121. }
  122. }
  123. }
  124. }
  125. }
  126. /* ---------------------- main -------------------------- */
  127. chdir('..');
  128. require_once('../src/validate.php');
  129. require_once('../functions/page_header.php');
  130. require_once('../functions/imap.php');
  131. require_once('../src/load_prefs.php');
  132. require_once('../plugins/administrator/defines.php');
  133. require_once('../plugins/administrator/auth.php');
  134. GLOBAL $data_dir, $username;
  135. if ( !adm_check_user() ) {
  136. header("Location: ../../src/options.php") ;
  137. exit;
  138. }
  139. displayPageHeader($color, 'None');
  140. $newcfg = array( );
  141. foreach ( $defcfg as $key => $def ) {
  142. $newcfg[$key] = '';
  143. }
  144. $cfgfile = '../config/config.php';
  145. parseConfig( '../config/config_default.php' );
  146. parseConfig( $cfgfile );
  147. $colapse = array( 'Titles' => 'off',
  148. 'Group1' => getPref($data_dir, $username, 'adm_Group1', 'off' ),
  149. 'Group2' => getPref($data_dir, $username, 'adm_Group2', 'on' ),
  150. 'Group3' => getPref($data_dir, $username, 'adm_Group3', 'on' ),
  151. 'Group4' => getPref($data_dir, $username, 'adm_Group4', 'on' ),
  152. 'Group5' => getPref($data_dir, $username, 'adm_Group5', 'on' ),
  153. 'Group6' => getPref($data_dir, $username, 'adm_Group6', 'on' ),
  154. 'Group7' => getPref($data_dir, $username, 'adm_Group7', 'on' ),
  155. 'Group8' => getPref($data_dir, $username, 'adm_Group8', 'on' ) );
  156. if ( isset( $switch ) ) {
  157. if ( $colapse[$switch] == 'on' ) {
  158. $colapse[$switch] = 'off';
  159. } else {
  160. $colapse[$switch] = 'on';
  161. }
  162. setPref($data_dir, $username, "adm_$switch", $colapse[$switch] );
  163. }
  164. echo "<form action=options.php method=post name=options>" .
  165. "<br><center><table width=95% bgcolor=\"$color[5]\"><tr><td>".
  166. "<table width=100% cellspacing=0 bgcolor=\"$color[4]\">" ,
  167. "<tr bgcolor=\"$color[5]\"><th colspan=2>" . _("Configuration Administrator") . "</th></tr>";
  168. $act_grp = 'Titles'; /* Active group */
  169. foreach ( $newcfg as $k => $v ) {
  170. $l = strtolower( $v );
  171. $type = SMOPT_TYPE_UNDEFINED;
  172. $n = substr( $k, 1 );
  173. $n = str_replace( '[', '_', $n );
  174. $n = str_replace( ']', '_', $n );
  175. $e = 'adm_' . $n;
  176. $name = $k;
  177. $size = 50;
  178. if ( isset( $defcfg[$k] ) ) {
  179. $name = $defcfg[$k]['name'];
  180. $type = $defcfg[$k]['type'];
  181. if ( isset( $defcfg[$k]['size'] ) ) {
  182. $size = $defcfg[$k]['size'];
  183. } else {
  184. $size = 40;
  185. }
  186. } else if ( $l == 'true' ) {
  187. $v = 'TRUE';
  188. $type = SMOPT_TYPE_BOOLEAN;
  189. } else if ( $l == 'false' ) {
  190. $v = 'FALSE';
  191. $type = SMOPT_TYPE_BOOLEAN;
  192. } else if ( $v{0} == "'" ) {
  193. $type = SMOPT_TYPE_STRING;
  194. } else if ( $v{0} == '"' ) {
  195. $type = SMOPT_TYPE_STRING;
  196. }
  197. if ( substr( $k, 0, 7 ) == '$theme[' ) {
  198. $type = SMOPT_TYPE_THEME;
  199. } else if ( substr( $k, 0, 9 ) == '$plugins[' ) {
  200. $type = SMOPT_TYPE_PLUGINS;
  201. } else if ( substr( $k, 0, 13 ) == '$ldap_server[' ) {
  202. $type = SMOPT_TYPE_LDAP;
  203. }
  204. if( $type == SMOPT_TYPE_TITLE || $colapse[$act_grp] == 'off' ) {
  205. switch ( $type ) {
  206. case SMOPT_TYPE_LDAP:
  207. case SMOPT_TYPE_PLUGINS:
  208. case SMOPT_TYPE_THEME:
  209. case SMOPT_TYPE_HIDDEN:
  210. break;
  211. case SMOPT_TYPE_EXTERNAL:
  212. echo "<tr><td>$name</td><td><b>" .
  213. $defcfg[$k]['value'] .
  214. "</b></td></tr>";
  215. break;
  216. case SMOPT_TYPE_TITLE:
  217. if ( $colapse[$k] == 'on' ) {
  218. $sw = '(+)';
  219. } else {
  220. $sw = '(-)';
  221. }
  222. echo "<tr bgcolor=\"$color[0]\"><th colspan=2>" .
  223. "<a href=options.php?switch=$k STYLE=\"text-decoration:none\"><b>$sw</b> </a>" .
  224. "$name</th></tr>";
  225. $act_grp = $k;
  226. break;
  227. case SMOPT_TYPE_COMMENT:
  228. $v = substr( $v, 1, strlen( $v ) - 2 );
  229. echo "<tr><td>$name</td><td>".
  230. "<b>$v</b>";
  231. $newcfg[$k] = "'$v'";
  232. if ( isset( $defcfg[$k]['comment'] ) ) {
  233. echo ' &nbsp; ' . $defcfg[$k]['comment'];
  234. }
  235. echo "</td></tr>\n";
  236. break;
  237. case SMOPT_TYPE_INTEGER:
  238. if ( isset( $HTTP_POST_VARS[$e] ) ) {
  239. $v = intval( $HTTP_POST_VARS[$e] );
  240. $newcfg[$k] = $v;
  241. }
  242. echo "<tr><td>$name</td><td>".
  243. "<input size=10 name=\"adm_$n\" value=\"$v\">";
  244. if ( isset( $defcfg[$k]['comment'] ) ) {
  245. echo ' &nbsp; ' . $defcfg[$k]['comment'];
  246. }
  247. echo "</td></tr>\n";
  248. break;
  249. case SMOPT_TYPE_NUMLIST:
  250. if ( isset( $HTTP_POST_VARS[$e] ) ) {
  251. $v = $HTTP_POST_VARS[$e];
  252. $newcfg[$k] = $v;
  253. }
  254. echo "<tr><td>$name</td><td>";
  255. echo "<select name=\"adm_$n\">";
  256. foreach ( $defcfg[$k]['posvals'] as $kp => $vp ) {
  257. echo "<option value=\"$kp\"";
  258. if ( $kp == $v ) {
  259. echo ' selected';
  260. }
  261. echo ">$vp</option>";
  262. }
  263. echo '</select>';
  264. if ( isset( $defcfg[$k]['comment'] ) ) {
  265. echo ' &nbsp; ' . $defcfg[$k]['comment'];
  266. }
  267. echo "</td></tr>\n";
  268. break;
  269. case SMOPT_TYPE_STRLIST:
  270. if ( isset( $HTTP_POST_VARS[$e] ) ) {
  271. $v = '"' . $HTTP_POST_VARS[$e] . '"';
  272. $newcfg[$k] = $v;
  273. }
  274. echo "<tr><td>$name</td><td>".
  275. "<select name=\"adm_$n\">";
  276. foreach ( $defcfg[$k]['posvals'] as $kp => $vp ) {
  277. echo "<option value=\"$kp\"";
  278. if ( $kp == substr( $v, 1, strlen( $v ) - 2 ) ) {
  279. echo ' selected';
  280. }
  281. echo ">$vp</option>";
  282. }
  283. echo '</select>';
  284. if ( isset( $defcfg[$k]['comment'] ) ) {
  285. echo ' &nbsp; ' . $defcfg[$k]['comment'];
  286. }
  287. echo "</td></tr>\n";
  288. break;
  289. case SMOPT_TYPE_TEXTAREA:
  290. if ( isset( $HTTP_POST_VARS[$e] ) ) {
  291. $v = '"' . $HTTP_POST_VARS[$e] . '"';
  292. $newcfg[$k] = str_replace( "\n", '', $v );
  293. }
  294. echo "<tr><td valign=top>$name</td><td>".
  295. "<textarea cols=\"$size\" name=\"adm_$n\">" . substr( $v, 1, strlen( $v ) - 2 ) . "</textarea>";
  296. if ( isset( $defcfg[$k]['comment'] ) ) {
  297. echo ' &nbsp; ' . $defcfg[$k]['comment'];
  298. }
  299. echo "</td></tr>\n";
  300. break;
  301. case SMOPT_TYPE_STRING:
  302. if ( isset( $HTTP_POST_VARS[$e] ) ) {
  303. $v = '"' . $HTTP_POST_VARS[$e] . '"';
  304. $newcfg[$k] = $v;
  305. }
  306. if ( $v == '""' && isset( $defcfg[$k]['default'] ) ) {
  307. $v = "'" . $defcfg[$k]['default'] . "'";
  308. $newcfg[$k] = $v;
  309. }
  310. echo "<tr><td>$name</td><td>".
  311. "<input size=\"$size\" name=\"adm_$n\" value=\"" . substr( $v, 1, strlen( $v ) - 2 ) . "\">";
  312. if ( isset( $defcfg[$k]['comment'] ) ) {
  313. echo ' &nbsp; ' . $defcfg[$k]['comment'];
  314. }
  315. echo "</td></tr>\n";
  316. break;
  317. case SMOPT_TYPE_BOOLEAN:
  318. if ( isset( $HTTP_POST_VARS[$e] ) ) {
  319. $v = $HTTP_POST_VARS[$e];
  320. $newcfg[$k] = $v;
  321. } else {
  322. $v = strtoupper( $v );
  323. }
  324. if ( $v == 'TRUE' ) {
  325. $ct = ' checked';
  326. $cf = '';
  327. } else {
  328. $ct = '';
  329. $cf = ' checked';
  330. }
  331. echo "<tr><td>$name</td><td>" .
  332. "<INPUT$ct type=radio NAME=\"adm_$n\" value=\"TRUE\">" . _("Yes") .
  333. "<INPUT$cf type=radio NAME=\"adm_$n\" value=\"FALSE\">" . _("No");
  334. if ( isset( $defcfg[$k]['comment'] ) ) {
  335. echo ' &nbsp; ' . $defcfg[$k]['comment'];
  336. }
  337. echo "</td></tr>\n";
  338. break;
  339. default:
  340. echo "<tr><td>$name</td><td>" .
  341. "<b><i>$v</i></b>";
  342. if ( isset( $defcfg[$k]['comment'] ) ) {
  343. echo ' &nbsp; ' . $defcfg[$k]['comment'];
  344. }
  345. echo "</td></tr>\n";
  346. }
  347. }
  348. }
  349. /* Special Themes Block */
  350. if ( $colapse['Group7'] == 'off' ) {
  351. $i = 0;
  352. echo '<tr><th>' . _("Theme Name") .
  353. '</th><th>' . _("Theme Path") .
  354. '</th></tr>';
  355. while ( isset( $newcfg["\$theme[$i]['NAME']"] ) ) {
  356. $k1 = "\$theme[$i]['NAME']";
  357. $e1 = "theme_name_$i";
  358. if ( isset( $HTTP_POST_VARS[$e1] ) ) {
  359. $v1 = '"' . str_replace( '\"', '"', $HTTP_POST_VARS[$e1] ) . '"';
  360. $v1 = '"' . str_replace( '"', '\"', $v1 ) . '"';
  361. $newcfg[$k1] = $v1;
  362. } else {
  363. $v1 = $newcfg[$k1];
  364. }
  365. $k2 = "\$theme[$i]['PATH']";
  366. $e2 = "theme_path_$i";
  367. if ( isset( $HTTP_POST_VARS[$e2] ) ) {
  368. $v2 = '"' . str_replace( '\"', '"', $HTTP_POST_VARS[$e2] ) . '"';
  369. $v2 = '"' . str_replace( '"', '\"', $v2 ) . '"';
  370. $newcfg[$k2] = $v2;
  371. } else {
  372. $v2 = $newcfg[$k2];
  373. }
  374. $name = substr( $v1, 1, strlen( $v1 ) - 2 );
  375. $path = substr( $v2, 1, strlen( $v2 ) - 2 );
  376. echo '<tr>'.
  377. "<td align=right>$i. <input name=\"$e1\" value=\"$name\" size=30></td>".
  378. "<td><input name=\"$e2\" value=\"$path\" size=40></td>".
  379. "</tr>\n";
  380. $i++;
  381. }
  382. }
  383. /* Special Plugins Block */
  384. if ( $colapse['Group8'] == 'on' ) {
  385. $sw = '(+)';
  386. } else {
  387. $sw = '(-)';
  388. }
  389. echo "<tr bgcolor=\"$color[0]\"><th colspan=2>" .
  390. "<a href=options.php?switch=Group8 STYLE=\"text-decoration:none\"><b>$sw</b> </a>" .
  391. _("Plugins") . '</th></tr>';
  392. if( $colapse['Group8'] == 'off' ) {
  393. $fd = opendir( '../plugins/' );
  394. $op_plugin = array();
  395. $p_count = 0;
  396. while (false!==($file = readdir($fd))) {
  397. if ($file != '.' && $file != '..' && $file != 'CVS' ) {
  398. if ( filetype( $file ) == 'dir' ) {
  399. $op_plugin[] = $file;
  400. $p_count++;
  401. }
  402. }
  403. }
  404. closedir($fd);
  405. asort( $op_plugin );
  406. /* Lets get the plugins that are active */
  407. $plugins = array();
  408. if ( isset( $HTTP_POST_VARS['plg'] ) ) {
  409. foreach ( $op_plugin as $plg ) {
  410. if ( isset( $HTTP_POST_VARS["plgs_$plg"] ) &&
  411. $HTTP_POST_VARS["plgs_$plg"] == 'on' ) {
  412. $plugins[] = $plg;
  413. }
  414. }
  415. $i = 0;
  416. foreach ( $plugins as $plg ) {
  417. $k = "\$plugins[$i]";
  418. $newcfg[$k] = "'$plg'";
  419. $i++;
  420. }
  421. while ( isset( $newcfg["\$plugins[$i]"] ) ) {
  422. $k = "\$plugins[$i]";
  423. $newcfg[$k] = '';
  424. $i++;
  425. }
  426. } else {
  427. $i = 0;
  428. while ( isset( $newcfg["\$plugins[$i]"] ) ) {
  429. $k = "\$plugins[$i]";
  430. $v = $newcfg[$k];
  431. $plugins[] = substr( $v, 1, strlen( $v ) - 2 );
  432. $i++;
  433. }
  434. }
  435. echo "<tr><td colspan=2><input type=hidden name=plg value=on><center><table><tr><td>";
  436. foreach ( $op_plugin as $plg ) {
  437. if ( in_array( $plg, $plugins ) ) {
  438. $sw = ' checked';
  439. } else {
  440. $sw = '';
  441. }
  442. echo '<tr>' .
  443. "<td>$plg</td><td><input$sw type=checkbox name=plgs_$plg></td>".
  444. "</tr>\n";
  445. }
  446. echo '</td></tr></table>';
  447. }
  448. echo "<tr bgcolor=\"$color[5]\"><th colspan=2><input value=\"" .
  449. _("Change Settings") . "\" type=submit></th></tr>" ,
  450. '</table></td></tr></table></form>';
  451. /*
  452. Write the options to the file.
  453. */
  454. if( $fp = @fopen( $cfgfile, 'w' ) ) {
  455. fwrite( $fp, "<?PHP\n".
  456. "/**\n".
  457. " * SquirrelMail Configuration File\n".
  458. " * Created using the Administrator Plugin\n".
  459. " */\n" );
  460. foreach ( $newcfg as $k => $v ) {
  461. if ( $k{0} == '$' && $v <> '' ) {
  462. if ( substr( $k, 1, 11 ) == 'ldap_server' ) {
  463. $v = substr( $v, 0, strlen( $v ) - 1 ) . "\n)";
  464. $v = str_replace( 'array(', "array(\n\t", $v );
  465. $v = str_replace( "',", "',\n\t", $v );
  466. }
  467. fwrite( $fp, "$k = $v;\n" );
  468. }
  469. }
  470. fwrite( $fp, '?>' );
  471. fclose( $fp );
  472. } else {
  473. echo '<font size=+1><br>'.
  474. _("Config file can't be opened. Please check config.php.").
  475. '</font>';
  476. }
  477. ?>