options.php 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530
  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 = '"' . $HTTP_POST_VARS[$e1] . '"';
  360. $newcfg[$k1] = $v1;
  361. } else {
  362. $v1 = $newcfg[$k1];
  363. }
  364. $k2 = "\$theme[$i]['PATH']";
  365. $e2 = "theme_path_$i";
  366. if ( isset( $HTTP_POST_VARS[$e2] ) ) {
  367. $v2 = '"' . $HTTP_POST_VARS[$e2] . '"';
  368. $newcfg[$k2] = $v2;
  369. } else {
  370. $v2 = $newcfg[$k2];
  371. }
  372. $name = substr( $v1, 1, strlen( $v1 ) - 2 );
  373. $path = substr( $v2, 1, strlen( $v2 ) - 2 );
  374. echo '<tr>'.
  375. "<td align=right>$i. <input name=\"$e1\" value=\"$name\" size=30></td>".
  376. "<td><input name=\"$e2\" value=\"$path\" size=40></td>".
  377. "</tr>\n";
  378. $i++;
  379. }
  380. }
  381. /* Special Plugins Block */
  382. if ( $colapse['Group8'] == 'on' ) {
  383. $sw = '(+)';
  384. } else {
  385. $sw = '(-)';
  386. }
  387. echo "<tr bgcolor=\"$color[0]\"><th colspan=2>" .
  388. "<a href=options.php?switch=Group8 STYLE=\"text-decoration:none\"><b>$sw</b> </a>" .
  389. _("Plugins") . '</th></tr>';
  390. if( $colapse['Group8'] == 'off' ) {
  391. $fd = opendir( '../plugins/' );
  392. $op_plugin = array();
  393. $p_count = 0;
  394. while (false!==($file = readdir($fd))) {
  395. if ($file != '.' && $file != '..' && $file != 'CVS' ) {
  396. if ( filetype( $file ) == 'dir' ) {
  397. $op_plugin[] = $file;
  398. $p_count++;
  399. }
  400. }
  401. }
  402. closedir($fd);
  403. asort( $op_plugin );
  404. /* Lets get the plugins that are active */
  405. $plugins = array();
  406. if ( isset( $HTTP_POST_VARS['plg'] ) ) {
  407. foreach ( $op_plugin as $plg ) {
  408. if ( isset( $HTTP_POST_VARS["plgs_$plg"] ) &&
  409. $HTTP_POST_VARS["plgs_$plg"] == 'on' ) {
  410. $plugins[] = $plg;
  411. }
  412. }
  413. $i = 0;
  414. foreach ( $plugins as $plg ) {
  415. $k = "\$plugins[$i]";
  416. $newcfg[$k] = "'$plg'";
  417. $i++;
  418. }
  419. while ( isset( $newcfg["\$plugins[$i]"] ) ) {
  420. $k = "\$plugins[$i]";
  421. $newcfg[$k] = '';
  422. $i++;
  423. }
  424. } else {
  425. $i = 0;
  426. while ( isset( $newcfg["\$plugins[$i]"] ) ) {
  427. $k = "\$plugins[$i]";
  428. $v = $newcfg[$k];
  429. $plugins[] = substr( $v, 1, strlen( $v ) - 2 );
  430. $i++;
  431. }
  432. }
  433. echo "<tr><td colspan=2><input type=hidden name=plg value=on><center><table><tr><td>";
  434. foreach ( $op_plugin as $plg ) {
  435. if ( in_array( $plg, $plugins ) ) {
  436. $sw = ' checked';
  437. } else {
  438. $sw = '';
  439. }
  440. echo '<tr>' .
  441. "<td>$plg</td><td><input$sw type=checkbox name=plgs_$plg></td>".
  442. "</tr>\n";
  443. }
  444. echo '</td></tr></table>';
  445. }
  446. echo "<tr bgcolor=\"$color[5]\"><th colspan=2><input value=\"" .
  447. _("Change Settings") . "\" type=submit></th></tr>" ,
  448. '</table></td></tr></table></form>';
  449. /*
  450. Write the options to the file.
  451. */
  452. $fp = fopen( $cfgfile, 'w' );
  453. fwrite( $fp, "<?PHP\n".
  454. "/**\n".
  455. " * SquirrelMail Configuration File\n".
  456. " * Created using the Administrator Plugin\n".
  457. " */\n".
  458. "GLOBAL \$version;\n" );
  459. /*
  460. fwrite( $fp, 'GLOBAL ' );
  461. $not_first = FALSE;
  462. foreach ( $newcfg as $k => $v ) {
  463. if ( $k{0} == '$' ) {
  464. if( $i = strpos( $k, '[' ) ) {
  465. if( strpos( $k, '[0]' ) ) {
  466. if( $not_first ) {
  467. fwrite( $fp, ', ' );
  468. }
  469. fwrite( $fp, substr( $k, 0, $i) );
  470. }
  471. } else {
  472. if( $not_first ) {
  473. fwrite( $fp, ', ' );
  474. }
  475. fwrite( $fp, $k );
  476. }
  477. $not_first = TRUE;
  478. }
  479. }
  480. fwrite( $fp, ";\n" );
  481. */
  482. foreach ( $newcfg as $k => $v ) {
  483. if ( $k{0} == '$' && $v <> '' ) {
  484. if ( substr( $k, 1, 11 ) == 'ldap_server' ) {
  485. $v = substr( $v, 0, strlen( $v ) - 1 ) . "\n)";
  486. $v = str_replace( 'array(', "array(\n\t", $v );
  487. $v = str_replace( "',", "',\n\t", $v );
  488. }
  489. fwrite( $fp, "$k = $v;\n" );
  490. }
  491. }
  492. fwrite( $fp, '?>' );
  493. fclose( $fp );
  494. ?>