module_handling.php 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239
  1. <?php
  2. /*
  3. *
  4. * OGP - Open Game Panel
  5. * Copyright (C) 2008 - 2018 The OGP Development Team
  6. *
  7. * http://www.opengamepanel.org/
  8. *
  9. * This program is free software; you can redistribute it and/or
  10. * modify it under the terms of the GNU General Public License
  11. * as published by the Free Software Foundation; either version 2
  12. * of the License, or any later version.
  13. *
  14. * This program is distributed in the hope that it will be useful,
  15. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  16. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  17. * GNU General Public License for more details.
  18. *
  19. * You should have received a copy of the GNU General Public License
  20. * along with this program; if not, write to the Free Software
  21. * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
  22. *
  23. */
  24. function list_available_modules()
  25. {
  26. return makefilelist("modules/", ".|..|.svn", true, "folders");
  27. }
  28. /// \return -2 Error while handling db queries after installation.
  29. /// \return -1 In case of error.
  30. /// \return 0 If module already installed.
  31. /// \return 1 If module installation was successfull.
  32. /// \return 2 If module installation was optional and module was not installed.
  33. function install_module($db, $module, $install_if_optional = TRUE)
  34. {
  35. // each module must have module.php file which contains the required variables.
  36. /// \todo We might want to turn this to XML file.
  37. if ( !is_file("modules/".$module."/module.php") )
  38. {
  39. print_failure("modules/".$module." ".get_lang("module_file_missing")."");
  40. return -1;
  41. }
  42. include("modules/".$module."/module.php");
  43. // Check that required fields exist.
  44. if ( !isset($module_title,$module_version) )
  45. {
  46. print_failure("modules/".$module."/module.php ".get_lang("module_file_missing_info")."");
  47. return -1;
  48. }
  49. if ( $db->isModuleInstalled($module) )
  50. return 0;
  51. // Prerequisites checking
  52. if(isset($module_prereqs) && is_array($module_prereqs) && count($module_prereqs)){
  53. $prereqPass = true;
  54. $missingPrereqs = "";
  55. $i = 0;
  56. foreach($module_prereqs as $prereq){
  57. if(!preReqInstalled($prereq)){
  58. if($i == 0){
  59. $missingPrereqs .= $prereq["name"];
  60. }else{
  61. $missingPrereqs .= ", " . $prereq["name"];
  62. }
  63. $prereqPass = false;
  64. }
  65. $i++;
  66. }
  67. if(!$prereqPass){
  68. print_failure(get_lang_f("prereqs_missing", $missingPrereqs, $module_title));
  69. return -2;
  70. }
  71. }
  72. // Check if the module should be installed or not.
  73. if ( $install_if_optional == FALSE && $module_required == FALSE )
  74. return 2;
  75. echo "<p>".get_lang_f('adding_module',$module_title)."</p>";
  76. $module_id = $db->addModule($module_title, $module, $module_version, $db_version);
  77. if ( isset( $install_queries ) )
  78. {
  79. foreach ( $install_queries as $key_db_version => $querys )
  80. {
  81. foreach ( $querys as $query )
  82. {
  83. if ( $db->query($query) )
  84. continue;
  85. print_failure("".get_lang("query_failed")." (".$query.") ".get_lang("query_failed_2")." ERROR: ".$db->getError()."");
  86. return -2;
  87. }
  88. }
  89. }
  90. if ( isset($module_menus) && is_array($module_menus) )
  91. {
  92. foreach( $module_menus as $menu )
  93. {
  94. $db->addModuleMenu($module_id,$menu['subpage'],$menu['group'],$menu['name']);
  95. }
  96. }
  97. $db->clearModuleAccessRights($module_id);
  98. if(isset($module_access_rights) and is_array($module_access_rights) and !empty($module_access_rights))
  99. {
  100. foreach($module_access_rights as $flag => $description)
  101. {
  102. $db->setModuleAccessRight($module_id, $flag, $description);
  103. }
  104. }
  105. return 1;
  106. }
  107. function uninstall_module($db, $module_id, $module, $adminOverride = false)
  108. {
  109. // Don't allow users to uninstall core IMPORTANT MODULES
  110. if(!isCoreModule($module) || $adminOverride === true){
  111. if ( !is_file("modules/".$module."/module.php") )
  112. {
  113. print_failure("modules/".$module." ".get_lang("module_file_missing")."");
  114. return FALSE;
  115. }
  116. if ( $db->delModule($module_id) === FALSE )
  117. {
  118. print_failure(get_lang("failed_del_db"));
  119. return FALSE;
  120. }
  121. include("modules/".$module."/module.php");
  122. $db->clearModuleAccessRights($module_id);
  123. if ( isset( $uninstall_queries ) )
  124. {
  125. foreach ( $uninstall_queries as $query )
  126. {
  127. if ( !$db->query($query) )
  128. {
  129. print_failure("".get_lang("query_failed")." (".$query.") ".get_lang("query_failed_2")." ERROR: ".$db->getError()."");
  130. return FALSE;
  131. }
  132. }
  133. }
  134. return TRUE;
  135. }
  136. return false;
  137. }
  138. function update_module($db, $module_id, $module)
  139. {
  140. if ( !is_file("modules/".$module."/module.php") )
  141. {
  142. print_failure("modules/".$module." ".get_lang("module_file_missing")."");
  143. return FALSE;
  144. }
  145. include("modules/".$module."/module.php");
  146. $module_info = $db->getModule($module_id);
  147. if ( $module_info['version'] != $module_version)
  148. {
  149. if(method_exists($db, "getModuleMenu")){ // Added this check for successful updates
  150. // Get position of module so that users don't need to reorder them after updating
  151. $currentModuleMenuInfo = $db->getModuleMenu($module_id);
  152. if($currentModuleMenuInfo !== false && is_array($currentModuleMenuInfo)){
  153. $pos = $currentModuleMenuInfo["pos"];
  154. if(!isset($pos) || empty($pos)){
  155. $pos = 0;
  156. }
  157. }else{
  158. $pos = 0;
  159. }
  160. }else{
  161. $pos = 0;
  162. }
  163. // Debug
  164. // echo "<p>Module position is " . $pos . " for module " . $currentModuleMenuInfo["menu_name"] . " with ID of " . $module_id . "</p>";
  165. $db->delModuleMenu($module_id);
  166. if ( isset($module_menus) && is_array($module_menus) )
  167. {
  168. foreach( $module_menus as $menu )
  169. {
  170. $db->addModuleMenu($module_id,$menu['subpage'],$menu['group'],$menu['name'],$pos);
  171. }
  172. }
  173. }
  174. if ( $module_info['db_version'] < $db_version)
  175. {
  176. $i = $module_info['db_version'];
  177. while ($i < $db_version)
  178. {
  179. if(isset($install_queries))
  180. {
  181. foreach ( $install_queries[$i+1] as $query )
  182. {
  183. if ( $db->query($query) )
  184. continue;
  185. print_failure("".get_lang("query_failed")." (".$query.") ".get_lang("query_failed_2")." ERROR: ".$db->getError()."");
  186. return -2;
  187. }
  188. }
  189. ++$i;
  190. }
  191. }
  192. if(method_exists($db, "clearModuleAccessRights")){
  193. $db->clearModuleAccessRights($module_id);
  194. }
  195. if(isset($module_access_rights) and is_array($module_access_rights) and !empty($module_access_rights))
  196. {
  197. foreach($module_access_rights as $flag => $description)
  198. {
  199. if(method_exists($db, "setModuleAccessRight")){
  200. $db->setModuleAccessRight($module_id, $flag, $description);
  201. }
  202. }
  203. }
  204. $db->updateModule($module_id, $module_version, $db_version);
  205. echo "<p>".get_lang_f('updated_module',$module_title)." - ".$module_info['db_version'] ." to ". $db_version."</p>";
  206. }
  207. ?>