You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

288 lines
9.4 KiB

  1. <?php
  2. if (!defined('DOCUMENT_ROOT')) die('Access denied');
  3. /**
  4. * First thing, define autoloader
  5. * @param string $className
  6. * @return boolean
  7. */
  8. function __autoload($className)
  9. {
  10. $className = ltrim($className, '\\');
  11. $fileName = DOCUMENT_ROOT;
  12. $namespace = '';
  13. if ($lastNsPos = strrpos($className, '\\')) {
  14. $namespace = substr($className, 0, $lastNsPos);
  15. $className = substr($className, $lastNsPos + 1);
  16. $fileName = str_replace('\\', DIRECTORY_SEPARATOR, $namespace) . DIRECTORY_SEPARATOR;
  17. }
  18. $fileName .= '/'.str_replace('_', DIRECTORY_SEPARATOR, $className) . '.php';
  19. if (file_exists($fileName)) {
  20. require_once( $fileName);
  21. return true;
  22. } else {
  23. return false;
  24. }
  25. }
  26. /**
  27. * Error Handler...
  28. */
  29. function systemErrorHandler ( $errno , $errstr , $errfile , $errline , $errcontext=null )
  30. {
  31. \system\Logs\Logger::addLog( $errstr,$errno,'system',$errfile,$errline);
  32. return false;
  33. }
  34. /**
  35. * Manage boot order
  36. */
  37. class Bootstrap {
  38. function boot() {
  39. mb_internal_encoding("UTF-8");
  40. //First thing to do, define error management (in case of error forward)
  41. $this->setLogs();
  42. //define all needed constants
  43. $this->setContants();
  44. //Check if vital system need is OK
  45. $this->checkSystem();
  46. $this->setBrowserSupport();
  47. $this->loadSystem();
  48. $this->loadCommonLibraries();
  49. $this->loadDispatcher();
  50. $this->setTimezone();
  51. $loadmodlsuccess = $this->loadModl();
  52. ;
  53. $this->loadMoxl();
  54. if($loadmodlsuccess) {
  55. $this->startingSession();
  56. } else {
  57. throw new Exception('Error loading Modl');
  58. }
  59. }
  60. private function checkSystem() {
  61. $listWritableFile = array(
  62. DOCUMENT_ROOT.'/log/logger.log',
  63. DOCUMENT_ROOT.'/log/php.log',
  64. DOCUMENT_ROOT.'/cache/test.tmp',
  65. );
  66. $errors=array();
  67. foreach($listWritableFile as $fileName) {
  68. if (!file_exists($fileName)) {
  69. if (touch($fileName) !== true) {
  70. $errors[] = 'We\'re unable to write to '.$fileName.': check rights';
  71. }
  72. }else if (is_writable($fileName) !== true) {
  73. $errors[] = 'We\'re unable to write to file '.$fileName.': check rights';
  74. }
  75. }
  76. if (!function_exists('json_decode')) {
  77. $errors[] = 'You need to install php5-json that\'s not seems to be installed';
  78. }
  79. if (count($errors)) {
  80. throw new Exception(implode("\n<br />",$errors));
  81. }
  82. }
  83. private function setContants() {
  84. define('APP_TITLE', 'Movim');
  85. define('APP_NAME', 'movim');
  86. define('APP_VERSION', $this->getVersion());
  87. define('BASE_URI', $this->getBaseUri());
  88. define('THEMES_PATH', DOCUMENT_ROOT . '/themes/');
  89. define('USERS_PATH', DOCUMENT_ROOT . '/users/');
  90. define('APP_PATH', DOCUMENT_ROOT . '/app/');
  91. define('SYSTEM_PATH', DOCUMENT_ROOT . '/system/');
  92. define('LIB_PATH', DOCUMENT_ROOT . '/lib/');
  93. define('LOCALES_PATH', DOCUMENT_ROOT . '/locales/');
  94. define('CACHE_PATH', DOCUMENT_ROOT . '/cache/');
  95. if (!defined('DOCTYPE')) {
  96. define('DOCTYPE','text/html');
  97. }
  98. }
  99. private function getVersion() {
  100. $file = "VERSION";
  101. if($f = fopen(DOCUMENT_ROOT.'/'.$file, 'r')) {
  102. return trim(fgets($f));
  103. }
  104. }
  105. private function getBaseUri() {
  106. $path = dirname($_SERVER['PHP_SELF']).'/';
  107. // Determining the protocol to use.
  108. $uri = "http://";
  109. if((
  110. isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "")
  111. || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == "https")) {
  112. $uri = 'https://';
  113. }
  114. if($path == "") {
  115. $uri .= $_SERVER['HTTP_HOST'] ;
  116. } else {
  117. $uri .= $_SERVER['HTTP_HOST'] . $path;
  118. }
  119. $uri = str_replace('jajax.php', '', $uri);
  120. return $uri;
  121. }
  122. private function loadSystem() {
  123. // Loads up all system libraries.
  124. require_once(SYSTEM_PATH . "/i18n/i18n.php");
  125. require_once(SYSTEM_PATH . "Session.php");
  126. require_once(SYSTEM_PATH . "Utils.php");
  127. require_once(SYSTEM_PATH . "UtilsPicture.php");
  128. require_once(SYSTEM_PATH . "Cache.php");
  129. require_once(SYSTEM_PATH . "Event.php");
  130. require_once(SYSTEM_PATH . "MovimException.php");
  131. require_once(SYSTEM_PATH . "RPC.php");
  132. require_once(SYSTEM_PATH . "User.php");
  133. }
  134. private function loadCommonLibraries() {
  135. // XMPPtoForm lib
  136. require_once(LIB_PATH . "XMPPtoForm.php");
  137. // Markdown lib
  138. require_once(LIB_PATH . "Markdown.php");
  139. // The template lib
  140. require_once(LIB_PATH . 'RainTPL.php');
  141. }
  142. private function loadDispatcher() {
  143. require_once(SYSTEM_PATH . "controllers/ControllerBase.php");
  144. require_once(SYSTEM_PATH . "controllers/ControllerMain.php");
  145. require_once(SYSTEM_PATH . "controllers/ControllerAjax.php");
  146. //require_once(SYSTEM_PATH . "controllers/FrontController.php");
  147. require_once(SYSTEM_PATH . "Route.php");
  148. require_once(SYSTEM_PATH . "template/TplPageBuilder.php");
  149. require_once(SYSTEM_PATH . "widget/WidgetBase.php");
  150. require_once(SYSTEM_PATH . "widget/WidgetWrapper.php");
  151. require_once(APP_PATH . "widgets/WidgetCommon/WidgetCommon.php");
  152. require_once(APP_PATH . "widgets/Notification/Notification.php");
  153. }
  154. private function setLogs() {
  155. try {
  156. define('ENVIRONMENT',\system\Conf::getServerConfElement('environment'));
  157. } catch (Exception $e) {
  158. define('ENVIRONMENT','development');//default environment is production
  159. }
  160. /**
  161. * LOG_MANAGEMENT: define where logs are saved, prefer error_log, or log_folder if you use mutual server.
  162. * 'error_log' : save in file defined on your file server
  163. * 'log_folder' : save in log folder, in DOCUMENT_ROOT.'/log'
  164. * 'syslog' : save in global system logs (not in file server logs)
  165. */
  166. define('LOG_MANAGEMENT','error_log');
  167. if (ENVIRONMENT === 'development') {
  168. ini_set('log_errors', 1);
  169. ini_set('display_errors', 0);
  170. ini_set('error_reporting', E_ALL );
  171. } else {
  172. ini_set('log_errors', 1);
  173. ini_set('display_errors', 0);
  174. ini_set('error_reporting', E_ALL ^ E_DEPRECATED ^ E_NOTICE);
  175. }
  176. if (LOG_MANAGEMENT === 'log_folder') {
  177. ini_set('error_log', DOCUMENT_ROOT.'/log/php.log');
  178. }
  179. set_error_handler('systemErrorHandler', E_ALL);
  180. }
  181. private function setTimezone() {
  182. // We set the default timezone to the server timezone
  183. $conf = \system\Conf::getServerConf();
  184. if(isset($conf['timezone']))
  185. date_default_timezone_set($conf['timezone']);
  186. }
  187. private function loadModl() {
  188. // We load Movim Data Layer
  189. require_once(LIB_PATH . 'Modl/loader.php');
  190. $db = modl\Modl::getInstance();
  191. $db->setConnectionArray(\System\Conf::getServerConf());
  192. return $db->testConnection();
  193. }
  194. private function loadMoxl() {
  195. // We load Movim XMPP Library
  196. require_once(LIB_PATH . 'Moxl/loader.php');
  197. }
  198. private function setBrowserSupport() {
  199. if(isset( $_SERVER['HTTP_USER_AGENT'])) {
  200. $useragent = $_SERVER['HTTP_USER_AGENT'];
  201. if (preg_match('|MSIE ([0-9].[0-9]{1,2})|',$useragent,$matched)) {
  202. $browser_version=$matched[1];
  203. $browser = 'IE';
  204. } elseif (preg_match('/Opera[\/ ]([0-9]{1}\.[0-9]{1}([0-9])?)/',$useragent,$matched)) {
  205. $browser_version=$matched[1];
  206. $browser = 'Opera';
  207. } elseif(preg_match('|Firefox/([0-9\.]+)|',$useragent,$matched)) {
  208. $browser_version=$matched[1];
  209. $browser = 'Firefox';
  210. } elseif(preg_match('|Safari/([0-9\.]+)|',$useragent,$matched)) {
  211. $browser_version=$matched[1];
  212. $browser = 'Safari';
  213. }
  214. } else {
  215. $browser_version = 0;
  216. $browser= 'other';
  217. }
  218. define('BROWSER_VERSION', $browser_version);
  219. define('BROWSER', $browser);
  220. $compatible = false;
  221. switch($browser) {
  222. case 'Firefox':
  223. if($browser_version > 3.5)
  224. $compatible = true;
  225. break;
  226. case 'IE':
  227. if($browser_version > 9.0)
  228. $compatible = true;
  229. break;
  230. case 'Safari': // Also Chrome-Chromium
  231. if($browser_version > 522.0)
  232. $compatible = true;
  233. break;
  234. case 'Opera':
  235. if($browser_version > 9.0)
  236. $compatible = true;
  237. break;
  238. }
  239. define('BROWSER_COMP', $compatible);
  240. }
  241. private function startingSession() {
  242. global $session;
  243. // Starting session.
  244. $sess = Session::start(APP_NAME);
  245. $session = $sess->get('session');
  246. }
  247. }