PageRenderTime 59ms CodeModel.GetById 25ms RepoModel.GetById 1ms app.codeStats 0ms

/inc/mod_old/modules.inc.php

https://gitlab.com/dddudeman/Haruko
PHP | 773 lines | 738 code | 0 blank | 35 comment | 1 complexity | 86a19b2ca5154493eeaad15e5ec4c0f1 MD5 | raw file
Possible License(s): BSD-3-Clause, WTFPL
  1. <?php
  2. if (!defined("IN_MOD"))
  3. {
  4. die("Nah, I won't serve that file to you.");
  5. }
  6. $mitsuba->admin->reqPermission("modules.view");
  7. $search = "";
  8. $replace = "";
  9. if ((!empty($_GET['cfg'])) && ($_GET['cfg'] == 1) && (!empty($_GET['n'])))
  10. {
  11. $mitsuba->admin->reqPermission("modules.config");
  12. $result = $conn->query("SELECT * FROM modules WHERE namespace='".$conn->real_escape_string($_GET['n'])."';");
  13. if ($result->num_rows != 1)
  14. {
  15. echo "<b style='color: red;'>".$lang['mod/module_not_installed']."</b>";
  16. } else {
  17. $dir = "./modules/".$_GET['n'];
  18. include($dir."/install.php");
  19. $installer = new $json->install_class($conn, $mitsuba);
  20. $installer->uninstall();
  21. exit;
  22. }
  23. }
  24. if ((!empty($_POST['mode'])) && ($_POST['mode'] == "upload"))
  25. {
  26. $mitsuba->admin->reqPermission("modules.upload");
  27. $mitsuba->admin->ui->checkToken($_POST['token']);
  28. if (empty($_FILES['upfile']['tmp_name']))
  29. {
  30. echo "<b style='color: red;'>".$lang['mod/no_file']."</b>";
  31. } else {
  32. $filename = strtolower(preg_replace('/[^a-zA-Z0-9_ %\[\]\.\(\)%&-]/s', '', $_FILES['upfile']['name']));
  33. //Zip file checks
  34. $tmpname = $_FILES['upfile']['tmp_name'];
  35. $zip = new ZipArchive();
  36. if ($zip->open($tmpname) !== TRUE) {
  37. echo "<b style='color: red;'>".$lang['mod/no_file']."</b>";
  38. } elseif (is_null($zip->locateName("module.json")))
  39. {
  40. echo "<b style='color: red;'>".$lang['mod/invalid_module']."</b>";
  41. } elseif ((is_null($zip->locateName("install.php"))) || (is_null($zip->locateName("config.php")))) //Does the archive contain install.php and config.php?
  42. {
  43. echo "<b style='color: red;'>".$lang['mod/invalid_module']."</b>";
  44. } else {
  45. //Is the JSON valid?
  46. $json = json_decode($zip->getFromIndex($zip->locateName("module.json")));
  47. if (is_null($json))
  48. {
  49. echo "<b style='color: red;'>".$lang['mod/invalid_module']."</b>";
  50. } elseif ((empty($json->name)) || (empty($json->namespace)) || (empty($json->description)) || (empty($json->author)) || (empty($json->version)) || (empty($json->install_class)) || (empty($json->config_class)))
  51. {
  52. echo "<b style='color: red;'>".$lang['mod/invalid_module']."</b>";
  53. } elseif (is_dir("./modules/".$json->namespace."/")) {
  54. echo "<b style='color: red;'>".sprintf($lang['mod/module_dir_exists'], $json->namespace)."</b>";
  55. } else {
  56. mkdir("./modules/".$json->namespace);
  57. $zip->extractTo("./modules/".$json->namespace."/");
  58. echo "<b style='color: green;'>".$lang['mod/module_uploaded']."</b>";
  59. }
  60. }
  61. $zip->close();
  62. }
  63. }
  64. if ((!empty($_GET['ins'])) && ($_GET['ins'] == 1) && (!empty($_GET['n'])))
  65. {
  66. $mitsuba->admin->reqPermission("modules.install");
  67. $result = $conn->query("SELECT * FROM modules WHERE namespace='".$conn->real_escape_string($_GET['n'])."';");
  68. if ($result->num_rows == 1)
  69. {
  70. echo "<b style='color: red;'>".$lang['mod/module_already_installed']."</b>";
  71. } else {
  72. $dir = "./modules/".$_GET['n'];
  73. //Validate JSON
  74. if ((is_dir($dir)) &&(file_exists($dir."/module.json")) && (file_exists($dir."/install.php")) && (file_exists($dir."/config.php")))
  75. {
  76. $json = json_decode(file_get_contents($dir."/module.json"));
  77. if ((!is_null($json)) && (!empty($json->name)) && (!empty($json->namespace)) && (!empty($json->description)) && (!empty($json->author)) && (!empty($json->version)) && (!empty($json->install_class)) && (!empty($json->config_class)))
  78. {
  79. //We can haz module!
  80. $continue = 1;
  81. //Check post fields
  82. if ($continue)
  83. {
  84. if ((!empty($json->new_post_fields)) && (is_array($json->new_post_fields)))
  85. {
  86. $all_fields = $conn->query("SHOW COLUMNS FROM posts;");
  87. $fields = array();
  88. while ($row = $all_fields->fetch_assoc())
  89. {
  90. $fields[$row['Field']] = 1;
  91. }
  92. foreach ($json->new_post_fields as $field) {
  93. if (!empty($fields[$field->name]))
  94. {
  95. //We haz a conflicting field o_O
  96. echo "<b style='color:red;'>".$lang['mod/module_install_error'].sprintf($lang['mod/module_post_field_conflict'], $field->name)."</b>";
  97. $continue = 0;
  98. break;
  99. }
  100. }
  101. }
  102. }
  103. //Check permissions
  104. if ($continue)
  105. {
  106. if ((!empty($json->new_permissions)) && (is_array($json->new_permissions)))
  107. {
  108. $all_permissions = $conn->query("SELECT * FROM permissions");
  109. $permissions = array();
  110. while ($row = $all_permissions->fetch_assoc())
  111. {
  112. $permissions[$row['name']] = 1;
  113. }
  114. foreach ($json->new_permissions as $permission) {
  115. if (!empty($permissions["modules.".$json->namespace.".".$permission->name]))
  116. {
  117. echo "<b style='color:red;'>".$lang['mod/module_install_error'].sprintf($lang['mod/module_permission_conflict'], "modules.".$json->namespace.".".$permission->name)."</b>";
  118. $continue = 0;
  119. break;
  120. }
  121. }
  122. }
  123. }
  124. //Check config
  125. if ($continue)
  126. {
  127. if ((!empty($json->new_config)) && (is_array($json->new_config)))
  128. {
  129. $all_config = $conn->query("SELECT * FROM module_config WHERE namespace='".$conn->real_escape_string($json->namespace)."'");
  130. $econfig = array();
  131. while ($row = $all_config->fetch_assoc())
  132. {
  133. $econfig[$row['name']] = 1;
  134. }
  135. foreach ($json->new_config as $config) {
  136. if (!empty($econfig[$config->name]))
  137. {
  138. echo "<b style='color:red;'>".$lang['mod/module_install_error'].sprintf($lang['mod/module_config_conflict'], $config->name)."</b>";
  139. $continue = 0;
  140. break;
  141. }
  142. }
  143. }
  144. }
  145. //Check board config
  146. if ($continue)
  147. {
  148. if ((!empty($json->new_boardconfig)) && (is_array($json->new_boardconfig)))
  149. {
  150. $all_fields = $conn->query("SHOW COLUMNS FROM boards;");
  151. $fields = array();
  152. while ($row = $all_fields->fetch_assoc())
  153. {
  154. $fields[$row['Field']] = 1;
  155. }
  156. foreach ($json->new_boardconfig as $field) {
  157. if (!empty($fields[$field->name]))
  158. {
  159. //We haz a conflicting field o_O
  160. echo "<b style='color:red;'>".$lang['mod/module_install_error'].sprintf($lang['mod/module_board_field_conflict'], $field->name)."</b>";
  161. $continue = 0;
  162. break;
  163. }
  164. }
  165. }
  166. }
  167. //Check new classes
  168. if ($continue)
  169. {
  170. if ((!empty($json->new_classes)) && (is_array($json->new_classes)))
  171. {
  172. foreach ($json->new_classes as $field) {
  173. $name = $field->name;
  174. if (!empty($mitsuba->$name))
  175. {
  176. //We haz a conflicting field o_O
  177. echo "<b style='color:red;'>".$lang['mod/module_install_error'].sprintf($lang['mod/module_class_conflict'], $field->name)."</b>";
  178. $continue = 0;
  179. break;
  180. }
  181. }
  182. }
  183. }
  184. //Check extra tables
  185. if ($continue)
  186. {
  187. if ((!empty($json->new_tables)) && (is_array($json->new_tables)))
  188. {
  189. $all_fields = $conn->query("SHOW TABLES;");
  190. $fields = array();
  191. while ($row = $all_fields->fetch_row())
  192. {
  193. $fields[$row[0]] = 1;
  194. }
  195. foreach ($json->new_tables as $table) {
  196. if (!empty($fields[$table]))
  197. {
  198. //We haz a conflicting field o_O
  199. echo "<b style='color:red;'>".$lang['mod/module_install_error'].sprintf($lang['mod/module_table_conflict'], $table)."</b>";
  200. $continue = 0;
  201. break;
  202. }
  203. }
  204. }
  205. }
  206. //Check panel pages
  207. if ($continue)
  208. {
  209. if ((!empty($json->panel_pages)) && (is_array($json->panel_pages)))
  210. {
  211. $all_fields = $conn->query("SELECT * FROM module_pages;");
  212. $fields = array();
  213. while ($row = $all_fields->fetch_assoc())
  214. {
  215. $fields[$row['url']] = 1;
  216. }
  217. foreach ($json->panel_pages as $pages) {
  218. if (!empty($fields[$pages->url]))
  219. {
  220. //We haz a conflicting field o_O
  221. echo "<b style='color:red;'>".$lang['mod/module_install_error'].sprintf($lang['mod/module_page_conflict'], $field->page)."</b>";
  222. $continue = 0;
  223. break;
  224. }
  225. }
  226. }
  227. }
  228. $continue = 1;
  229. $undo_queries = array();
  230. //Create post fields
  231. if ($continue)
  232. {
  233. if ((!empty($json->new_post_fields)) && (is_array($json->new_post_fields)))
  234. {
  235. foreach ($json->new_post_fields as $field) {
  236. if (!$conn->query("ALTER TABLE posts ADD `".$conn->real_escape_string($field->name)."` ".$conn->real_escape_string($field->definition)))
  237. {
  238. //Oh crap we haz an error!
  239. $continue = 0;
  240. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  241. foreach ($undo_queries as $query) {
  242. $conn->query($query);
  243. }
  244. break;
  245. } else {
  246. $undo_queries[] = "ALTER TABLE posts DROP `".$conn->real_escape_string($field->name)."`;";
  247. if (!$conn->query("INSERT INTO module_fields (`namespace`, `name`, `type`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($field->name)."', 'postfield');"))
  248. {
  249. //Oh crap we haz an error!
  250. $continue = 0;
  251. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  252. foreach ($undo_queries as $query) {
  253. $conn->query($query);
  254. }
  255. break;
  256. } else {
  257. $undo_queries[] = "DELETE FROM module_fields WHERE namespace='".$conn->real_escape_string($json->namespace)."' AND name='".$conn->real_escape_string($field->name)."';";
  258. }
  259. }
  260. }
  261. }
  262. }
  263. //Create permissions
  264. if ($continue)
  265. {
  266. if ((!empty($json->new_permissions)) && (is_array($json->new_permissions)))
  267. {
  268. $id = $conn->query("SELECT * FROM permissions_categories WHERE name='module';")->fetch_assoc()['id'];
  269. foreach ($json->new_permissions as $permission) {
  270. if (!$conn->query("INSERT INTO `permissions` (`name`, `description`, `category`) VALUES ('".$conn->real_escape_string($permission->name)."', '".$conn->real_escape_string($permission->description)."', ".$id.")"))
  271. {
  272. //Oh crap we haz an error!
  273. $continue = 0;
  274. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  275. foreach ($undo_queries as $query) {
  276. $conn->query($query);
  277. }
  278. break;
  279. } else {
  280. $undo_queries[] = "DELETE FROM `permissions` WHERE name='".$conn->real_escape_string($permission->name)."';";
  281. }
  282. }
  283. }
  284. }
  285. //Create config
  286. if ($continue)
  287. {
  288. if ((!empty($json->new_config)) && (is_array($json->new_config)))
  289. {
  290. foreach ($json->new_config as $config) {
  291. if (!$conn->query("INSERT INTO `module_config` (`namespace`, `name`, `description`, `default_value`, `value`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($config->name)."', '".$conn->real_escape_string($config->description)."', '".$conn->real_escape_string($config->default_value)."', '".$conn->real_escape_string($config->default_value)."')"))
  292. {
  293. //Oh crap we haz an error!
  294. $continue = 0;
  295. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  296. foreach ($undo_queries as $query) {
  297. $conn->query($query);
  298. }
  299. break;
  300. } else {
  301. $undo_queries[] = "DELETE FROM `module_config` WHERE name='".$conn->real_escape_string($config->name)."' AND namespace='".$conn->real_escape_string($json->namespace)."';";
  302. }
  303. }
  304. }
  305. }
  306. //Create board config
  307. if ($continue)
  308. {
  309. if ((!empty($json->new_boardconfig)) && (is_array($json->new_boardconfig)))
  310. {
  311. foreach ($json->new_boardconfig as $config) {
  312. if (!$conn->query("INSERT INTO `module_boardconfig` (`namespace`, `name`, `description`, `default_value`, `value`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($config->name)."', '".$conn->real_escape_string($config->description)."', '".$conn->real_escape_string($config->default_value)."', '".$conn->real_escape_string($config->default_value)."')"))
  313. {
  314. //Oh crap we haz an error!
  315. $continue = 0;
  316. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  317. foreach ($undo_queries as $query) {
  318. $conn->query($query);
  319. }
  320. break;
  321. } else {
  322. $undo_queries[] = "DELETE FROM `module_boardconfig` WHERE name='".$conn->real_escape_string($config->name)."' AND namespace='".$conn->real_escape_string($json->namespace)."';";
  323. if (!$conn->query("ALTER TABLE boards ADD `".$conn->real_escape_string($config->name)."` ".$conn->real_escape_string($config->definition)))
  324. {
  325. //Oh crap we haz an error!
  326. $continue = 0;
  327. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  328. foreach ($undo_queries as $query) {
  329. $conn->query($query);
  330. }
  331. break;
  332. } else {
  333. $undo_queries[] = "ALTER TABLE posts DROP `".$conn->real_escape_string($config->name)."`;";
  334. }
  335. }
  336. }
  337. }
  338. }
  339. //Create new classes
  340. if ($continue)
  341. {
  342. if ((!empty($json->new_classes)) && (is_array($json->new_classes)))
  343. {
  344. foreach ($json->new_classes as $class) {
  345. if (!$conn->query("INSERT INTO `module_classes` (`namespace`, `name`, `file`, `class`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($class->name)."', '".$conn->real_escape_string($class->file)."', '".$conn->real_escape_string($class->class)."')"))
  346. {
  347. //Oh crap we haz an error!
  348. $continue = 0;
  349. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  350. foreach ($undo_queries as $query) {
  351. $conn->query($query);
  352. }
  353. break;
  354. } else {
  355. $undo_queries[] = "DELETE FROM `module_classes` WHERE name='".$conn->real_escape_string($class->name)."';";
  356. }
  357. }
  358. }
  359. }
  360. //Create panel pages
  361. if ($continue)
  362. {
  363. if ((!empty($json->panel_pages)) && (is_array($json->panel_pages)))
  364. {
  365. foreach ($json->panel_pages as $page) {
  366. if (!$conn->query("INSERT INTO `module_pages` (`namespace`, `url`, `file`, `class`, `method`) VALUES ('".$conn->real_escape_string($page->namespace)."', '".$conn->real_escape_string($page->url)."', '".$conn->real_escape_string($page->file)."', '".$conn->real_escape_string($page->class)."', '".$conn->real_escape_string($page->method)."')"))
  367. {
  368. //Oh crap we haz an error!
  369. $continue = 0;
  370. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  371. foreach ($undo_queries as $query) {
  372. $conn->query($query);
  373. }
  374. break;
  375. } else {
  376. $undo_queries[] = "DELETE FROM `module_pages` WHERE url='".$conn->real_escape_string($page->url)."' AND namespace='".$conn->real_escape_string($json->namespace)."';";
  377. }
  378. }
  379. }
  380. }
  381. //Create events
  382. if ($continue)
  383. {
  384. if ((!empty($json->events)) && (is_array($json->events)))
  385. {
  386. foreach ($json->events as $event) {
  387. if (!$conn->query("INSERT INTO `module_events` (`namespace`, `event`, `file`, `class`, `method`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($event->event)."', '".$conn->real_escape_string($event->file)."', '".$conn->real_escape_string($event->class)."', '".$conn->real_escape_string($event->method)."')"))
  388. {
  389. //Oh crap we haz an error!
  390. $continue = 0;
  391. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  392. foreach ($undo_queries as $query) {
  393. $conn->query($query);
  394. }
  395. break;
  396. } else {
  397. $undo_queries[] = "DELETE FROM `module_events` WHERE event='".$conn->real_escape_string($event->event)."' AND namespace='".$conn->real_escape_string($json->namespace)."';";
  398. }
  399. }
  400. }
  401. }
  402. //Add to modules table
  403. if ($continue)
  404. {
  405. if (!$conn->query("INSERT INTO `modules` (`namespace`, `name`, `description`, `author`, `version`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($json->name)."', '".$conn->real_escape_string($json->description)."', '".$conn->real_escape_string($json->author)."', '".$conn->real_escape_string($json->version)."');"))
  406. {
  407. //Oh crap we haz an error!
  408. $continue = 0;
  409. echo "<b style='color:red;'>".$lang['mod/module_install_error'].$conn->error."</b>";
  410. foreach ($undo_queries as $query) {
  411. $conn->query($query);
  412. }
  413. break;
  414. } else {
  415. $undo_queries[] = "DELETE FROM `modules` WHERE namespace='".$conn->real_escape_string($json->namespace)."';";
  416. }
  417. }
  418. //Execute install.php (create extra tables etc.)
  419. if ($continue)
  420. {
  421. include($dir."/install.php");
  422. $installer = new $json->install_class($conn, $mitsuba);
  423. $installer->install();
  424. echo "<b style='color: green;'>".$lang['mod/module_installed']."</b>";
  425. }
  426. } else {
  427. echo "<b style='color: red;'>".$lang['mod/module_invalid_json']."</b>";
  428. }
  429. } else {
  430. echo "<b style='color: red;'>".$lang['mod/module_no_file']."</b>";
  431. }
  432. }
  433. }
  434. if ((!empty($_GET['unins'])) && ($_GET['unins'] == 1) && (!empty($_GET['n'])))
  435. {
  436. $mitsuba->admin->reqPermission("modules.uninstall");
  437. $result = $conn->query("SELECT * FROM modules WHERE namespace='".$conn->real_escape_string($_GET['n'])."';");
  438. if ($result->num_rows != 1)
  439. {
  440. echo "<b style='color: red;'>".$lang['mod/module_not_installed']."</b>";
  441. } else {
  442. $dir = "./modules/".$_GET['n'];
  443. //Validate JSON
  444. if ((is_dir($dir)) &&(file_exists($dir."/module.json")) && (file_exists($dir."/install.php")) && (file_exists($dir."/config.php")))
  445. {
  446. $json = json_decode(file_get_contents($dir."/module.json"));
  447. if ((!is_null($json)) && (!empty($json->name)) && (!empty($json->namespace)) && (!empty($json->description)) && (!empty($json->author)) && (!empty($json->version)) && (!empty($json->install_class)) && (!empty($json->config_class)))
  448. {
  449. $continue = 1;
  450. $undo_queries = array();
  451. //Create post fields
  452. if ($continue)
  453. {
  454. if ((!empty($json->new_post_fields)) && (is_array($json->new_post_fields)))
  455. {
  456. foreach ($json->new_post_fields as $field) {
  457. if (!$conn->query("ALTER TABLE posts DROP `".$conn->real_escape_string($field->name)."`;"))
  458. {
  459. //Oh crap we haz an error!
  460. $continue = 0;
  461. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  462. foreach ($undo_queries as $query) {
  463. $conn->query($query);
  464. }
  465. break;
  466. } else {
  467. $undo_queries[] = "ALTER TABLE posts ADD `".$conn->real_escape_string($field->name)."` ".$conn->real_escape_string($field->definition);
  468. if (!$conn->query("DELETE FROM module_fields WHERE namespace='".$conn->real_escape_string($json->namespace)."' AND name='".$conn->real_escape_string($field->name)."';"))
  469. {
  470. //Oh crap we haz an error!
  471. $continue = 0;
  472. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  473. foreach ($undo_queries as $query) {
  474. $conn->query($query);
  475. }
  476. break;
  477. } else {
  478. $undo_queries[] = "INSERT INTO module_fields (`namespace`, `name`, `type`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($field->name)."', 'postfield');";
  479. }
  480. }
  481. }
  482. }
  483. }
  484. //Create permissions
  485. if ($continue)
  486. {
  487. if ((!empty($json->new_permissions)) && (is_array($json->new_permissions)))
  488. {
  489. $id = $conn->query("SELECT * FROM permissions_categories WHERE name='module';")->fetch_assoc()['id'];
  490. foreach ($json->new_permissions as $permission) {
  491. if (!$conn->query("DELETE FROM `permissions` WHERE name='".$conn->real_escape_string($permission->name)."';"))
  492. {
  493. //Oh crap we haz an error!
  494. $continue = 0;
  495. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  496. foreach ($undo_queries as $query) {
  497. $conn->query($query);
  498. }
  499. break;
  500. } else {
  501. $undo_queries[] = "INSERT INTO `permissions` (`name`, `description`, `category`) VALUES ('".$conn->real_escape_string($permission->name)."', '".$conn->real_escape_string($permission->description)."', ".$id.")";
  502. }
  503. }
  504. }
  505. }
  506. //Create config
  507. if ($continue)
  508. {
  509. if ((!empty($json->new_config)) && (is_array($json->new_config)))
  510. {
  511. foreach ($json->new_config as $config) {
  512. if (!$conn->query("DELETE FROM `module_config` WHERE name='".$conn->real_escape_string($config->name)."' AND namespace='".$conn->real_escape_string($json->namespace)."';"))
  513. {
  514. //Oh crap we haz an error!
  515. $continue = 0;
  516. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  517. foreach ($undo_queries as $query) {
  518. $conn->query($query);
  519. }
  520. break;
  521. } else {
  522. $undo_queries[] = "INSERT INTO `module_config` (`namespace`, `name`, `description`, `default_value`, `value`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($config->name)."', '".$conn->real_escape_string($config->description)."', '".$conn->real_escape_string($config->default_value)."', '".$conn->real_escape_string($config->default_value)."')";
  523. }
  524. }
  525. }
  526. }
  527. //Create board config
  528. if ($continue)
  529. {
  530. if ((!empty($json->new_boardconfig)) && (is_array($json->new_boardconfig)))
  531. {
  532. foreach ($json->new_boardconfig as $config) {
  533. if (!$conn->query("DELETE FROM `module_boardconfig` WHERE name='".$conn->real_escape_string($config->name)."' AND namespace='".$conn->real_escape_string($json->namespace)."';"))
  534. {
  535. //Oh crap we haz an error!
  536. $continue = 0;
  537. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  538. foreach ($undo_queries as $query) {
  539. $conn->query($query);
  540. }
  541. break;
  542. } else {
  543. $undo_queries[] = "INSERT INTO `module_boardconfig` (`namespace`, `name`, `description`, `default_value`, `value`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($config->name)."', '".$conn->real_escape_string($config->description)."', '".$conn->real_escape_string($config->default_value)."', '".$conn->real_escape_string($config->default_value)."')";
  544. if (!$conn->query("ALTER TABLE posts DROP `".$conn->real_escape_string($config->name)."`;"))
  545. {
  546. //Oh crap we haz an error!
  547. $continue = 0;
  548. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  549. foreach ($undo_queries as $query) {
  550. $conn->query($query);
  551. }
  552. break;
  553. } else {
  554. $undo_queries[] = "ALTER TABLE boards ADD `".$conn->real_escape_string($config->name)."` ".$conn->real_escape_string($config->definition);
  555. }
  556. }
  557. }
  558. }
  559. }
  560. //Create new classes
  561. if ($continue)
  562. {
  563. if ((!empty($json->new_classes)) && (is_array($json->new_classes)))
  564. {
  565. foreach ($json->new_classes as $class) {
  566. if (!$conn->query("DELETE FROM `module_classes` WHERE name='".$conn->real_escape_string($class->name)."';"))
  567. {
  568. //Oh crap we haz an error!
  569. $continue = 0;
  570. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  571. foreach ($undo_queries as $query) {
  572. $conn->query($query);
  573. }
  574. break;
  575. } else {
  576. $undo_queries[] = "INSERT INTO `module_classes` (`namespace`, `name`, `file`, `class`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($class->name)."', '".$conn->real_escape_string($class->file)."', '".$conn->real_escape_string($class->class)."')";
  577. }
  578. }
  579. }
  580. }
  581. //Create panel pages
  582. if ($continue)
  583. {
  584. if ((!empty($json->panel_pages)) && (is_array($json->panel_pages)))
  585. {
  586. foreach ($json->panel_pages as $page) {
  587. if (!$conn->query("DELETE FROM `module_pages` WHERE url='".$conn->real_escape_string($page->url)."' AND namespace='".$conn->real_escape_string($json->namespace)."';"))
  588. {
  589. //Oh crap we haz an error!
  590. $continue = 0;
  591. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  592. foreach ($undo_queries as $query) {
  593. $conn->query($query);
  594. }
  595. break;
  596. } else {
  597. $undo_queries[] = "INSERT INTO `module_pages` (`namespace`, `url`, `file`, `class`, `method`) VALUES ('".$conn->real_escape_string($page->namespace)."', '".$conn->real_escape_string($page->url)."', '".$conn->real_escape_string($page->file)."', '".$conn->real_escape_string($page->class)."', '".$conn->real_escape_string($page->method)."')";
  598. }
  599. }
  600. }
  601. }
  602. //Create events
  603. if ($continue)
  604. {
  605. if ((!empty($json->events)) && (is_array($json->events)))
  606. {
  607. foreach ($json->events as $event) {
  608. if (!$conn->query("DELETE FROM `module_events` WHERE event='".$conn->real_escape_string($event->event)."' AND namespace='".$conn->real_escape_string($json->namespace)."';"))
  609. {
  610. //Oh crap we haz an error!
  611. $continue = 0;
  612. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  613. foreach ($undo_queries as $query) {
  614. $conn->query($query);
  615. }
  616. break;
  617. } else {
  618. $undo_queries[] = "INSERT INTO `module_events` (`namespace`, `event`, `file`, `class`, `method`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($event->event)."', '".$conn->real_escape_string($event->file)."', '".$conn->real_escape_string($event->class)."', '".$conn->real_escape_string($event->method)."')";
  619. }
  620. }
  621. }
  622. }
  623. //Add to modules table
  624. if ($continue)
  625. {
  626. if (!$conn->query("DELETE FROM `modules` WHERE namespace='".$conn->real_escape_string($json->namespace)."';"))
  627. {
  628. //Oh crap we haz an error!
  629. $continue = 0;
  630. echo "<b style='color:red;'>".$lang['mod/module_uninstall_error'].$conn->error."</b>";
  631. foreach ($undo_queries as $query) {
  632. $conn->query($query);
  633. }
  634. break;
  635. } else {
  636. $undo_queries[] = "INSERT INTO `modules` (`namespace`, `name`, `description`, `author`, `version`) VALUES ('".$conn->real_escape_string($json->namespace)."', '".$conn->real_escape_string($json->name)."', '".$conn->real_escape_string($json->description)."', '".$conn->real_escape_string($json->author)."', '".$conn->real_escape_string($json->version)."');";
  637. }
  638. }
  639. //Execute install.php (create extra tables etc.)
  640. if ($continue)
  641. {
  642. include($dir."/install.php");
  643. $installer = new $json->install_class($conn, $mitsuba);
  644. $installer->uninstall();
  645. echo "<b style='color: green;'>".$lang['mod/module_uninstalled']."</b>";
  646. }
  647. } else {
  648. echo "<b style='color: red;'>".$lang['mod/module_invalid_json']."</b>";
  649. }
  650. } else {
  651. echo "<b style='color: red;'>".$lang['mod/module_no_file']."</b>";
  652. }
  653. }
  654. }
  655. if ((!empty($_GET['del'])) && ($_GET['del'] == 1) && (!empty($_GET['n'])))
  656. {
  657. $mitsuba->admin->reqPermission("modules.delete");
  658. $result = $conn->query("SELECT * FROM modules WHERE namespace='".$conn->real_escape_string($_GET['n'])."';");
  659. if ($result->num_rows == 1)
  660. {
  661. echo "<b style='color: red;'>".$lang['mod/module_installed_delete']."</b>";
  662. } else {
  663. $dir = "./modules/".$_GET['n'];
  664. $mitsuba->common->delTree("./".$dir);
  665. echo "<b style='color: green;'>".$lang['mod/module_deleted']."</b>";
  666. }
  667. }
  668. ?>
  669. <b><?php echo $lang['mod/rebuild_notice']; ?></b><br />
  670. <?php $mitsuba->admin->ui->startSection($lang['mod/manage_modules']); ?>
  671. <table>
  672. <thead>
  673. <tr>
  674. <td><?php echo $lang['mod/name']; ?></td>
  675. <td><?php echo $lang['mod/description']; ?></td>
  676. <td><?php echo $lang['mod/author']; ?></td>
  677. <td><?php echo $lang['mod/version']; ?></td>
  678. <td><?php echo $lang['mod/actions']; ?></td>
  679. </tr>
  680. </thead>
  681. <tbody>
  682. <?php
  683. $installed = array();
  684. $result = $conn->query("SELECT * FROM modules ORDER BY name ASC");
  685. while ($row = $result->fetch_assoc())
  686. {
  687. $installed[$row['namespace']] = 1;
  688. echo "<tr>";
  689. echo "<td class='text-center'>".htmlspecialchars($row['name'])."</td>";
  690. echo "<td>".htmlspecialchars($row['description'])."</td>";
  691. echo "<td class='text-center'>".htmlspecialchars($row['author'])."</td>";
  692. echo "<td class='text-center'>".htmlspecialchars($row['version'])."</td>";
  693. echo "<td class='text-center'><a href='?/modules&unins=1&n=".$row['namespace']."'>".$lang['mod/uninstall']."</a></td>";
  694. echo "</tr>";
  695. }
  696. ?>
  697. </tbody>
  698. </table>
  699. <?php $mitsuba->admin->ui->endSection(); ?>
  700. <br /><br />
  701. <?php $mitsuba->admin->ui->startSection($lang['mod/uninstalled_modules']); ?>
  702. <table>
  703. <thead>
  704. <tr>
  705. <td class='text-center'><?php echo $lang['mod/name']; ?></td>
  706. <td><?php echo $lang['mod/description']; ?></td>
  707. <td class='text-center'><?php echo $lang['mod/author']; ?></td>
  708. <td class='text-center'><?php echo $lang['mod/version']; ?></td>
  709. <td class='text-center'><?php echo $lang['mod/actions']; ?></td>
  710. </tr>
  711. </thead>
  712. <tbody>
  713. <?php
  714. $dirs = array_filter(glob('./modules/*'), 'is_dir');
  715. foreach ($dirs as $dir) {
  716. if (file_exists($dir."/module.json"))
  717. {
  718. $json = json_decode(file_get_contents($dir."/module.json"));
  719. if ((!is_null($json)) && (!empty($json->name)) && (!empty($json->namespace)) && (!empty($json->description)) && (!empty($json->author)) && (!empty($json->version)) && (!empty($json->install_class)) && (!empty($json->config_class)))
  720. {
  721. if (!empty($installed[$json->namespace]))
  722. {
  723. continue;
  724. }
  725. echo "<tr>";
  726. echo "<td class='text-center'>".$json->name."</td>";
  727. echo "<td>".$json->description."</td>";
  728. echo "<td class='text-center'>".$json->author."</td>";
  729. echo "<td class='text-center'>".$json->version."</td>";
  730. echo "<td class='text-center'><a href='?/modules&ins=1&n=".$json->namespace."'>".$lang['mod/install']."</a> <a href='?/modules&del=1&n=".$json->namespace."'>".$lang['mod/delete']."</a></td>";
  731. echo "</tr>";
  732. }
  733. }
  734. }
  735. ?>
  736. </tbody>
  737. </table>
  738. <?php $mitsuba->admin->ui->endSection(); ?>
  739. <br /><br />
  740. <?php $mitsuba->admin->ui->startSection($lang['mod/upload_module']); ?>
  741. <form action="?/modules" method="POST" enctype="multipart/form-data">
  742. <?php $mitsuba->admin->ui->getToken($path); ?>
  743. <input type="hidden" name="MAX_FILE_SIZE" value="2097152">
  744. <input type="hidden" name="mode" value="upload">
  745. <?php echo $lang['mod/file']; ?>: <input id="postFile" name="upfile" type="file"><br />
  746. <input type="submit" value="<?php echo $lang['mod/submit']; ?>" />
  747. </form>
  748. <?php $mitsuba->admin->ui->endSection(); ?>