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.

333 lines
11 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. $this->loadMoxl();
  53. if($loadmodlsuccess) {
  54. $this->startingSession();
  55. } else {
  56. throw new Exception('Error loading Modl');
  57. }
  58. }
  59. private function checkSystem() {
  60. $listWritableFile = array(
  61. DOCUMENT_ROOT.'/log/logger.log',
  62. DOCUMENT_ROOT.'/log/php.log',
  63. DOCUMENT_ROOT.'/cache/test.tmp',
  64. );
  65. $errors=array();
  66. if(!is_writable(DOCUMENT_ROOT))
  67. $errors[] = 'We\'re unable to write to folder '.DOCUMENT_ROOT.': check rights';
  68. else {
  69. if(!file_exists(DOCUMENT_ROOT.'/cache') && !@mkdir(DOCUMENT_ROOT.'/cache')) {
  70. $errors[] = 'Couldn\'t create directory cache';
  71. }
  72. if(!file_exists(DOCUMENT_ROOT.'/log') && !@mkdir(DOCUMENT_ROOT.'/log')) {
  73. $errors[] = 'Couldn\'t create directory log';
  74. }
  75. if(!file_exists(DOCUMENT_ROOT.'/config') && !@mkdir(DOCUMENT_ROOT.'/config')) {
  76. $errors[] = 'Couldn\'t create directory config';
  77. }
  78. if(!file_exists(DOCUMENT_ROOT.'/users') && !@mkdir(DOCUMENT_ROOT.'/users')) {
  79. $errors[] = 'Couldn\'t create directory users';
  80. } else {
  81. touch(DOCUMENT_ROOT.'/users/index.html');
  82. }
  83. }
  84. foreach($listWritableFile as $fileName) {
  85. if (!file_exists($fileName)) {
  86. if (touch($fileName) !== true) {
  87. $errors[] = 'We\'re unable to write to '.$fileName.': check rights';
  88. }
  89. }else if (is_writable($fileName) !== true) {
  90. $errors[] = 'We\'re unable to write to file '.$fileName.': check rights';
  91. }
  92. }
  93. if (!function_exists('json_decode')) {
  94. $errors[] = 'You need to install php5-json that\'s not seems to be installed';
  95. }
  96. if (count($errors)) {
  97. throw new Exception(implode("\n<br />",$errors));
  98. }
  99. }
  100. private function setContants() {
  101. define('APP_TITLE', 'Movim');
  102. define('APP_NAME', 'movim');
  103. define('APP_VERSION', $this->getVersion());
  104. define('BASE_URI', $this->getBaseUri());
  105. define('THEMES_PATH', DOCUMENT_ROOT . '/themes/');
  106. define('USERS_PATH', DOCUMENT_ROOT . '/users/');
  107. define('APP_PATH', DOCUMENT_ROOT . '/app/');
  108. define('SYSTEM_PATH', DOCUMENT_ROOT . '/system/');
  109. define('LIB_PATH', DOCUMENT_ROOT . '/lib/');
  110. define('LOCALES_PATH', DOCUMENT_ROOT . '/locales/');
  111. define('CACHE_PATH', DOCUMENT_ROOT . '/cache/');
  112. if (!defined('DOCTYPE')) {
  113. define('DOCTYPE','text/html');
  114. }
  115. }
  116. private function getVersion() {
  117. $file = "VERSION";
  118. if($f = fopen(DOCUMENT_ROOT.'/'.$file, 'r')) {
  119. return trim(fgets($f));
  120. }
  121. }
  122. private function getBaseUri() {
  123. $path = dirname($_SERVER['PHP_SELF']).'/';
  124. // Determining the protocol to use.
  125. $uri = "http://";
  126. if((
  127. isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "")
  128. || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == "https")) {
  129. $uri = 'https://';
  130. }
  131. if($path == "") {
  132. $uri .= $_SERVER['HTTP_HOST'] ;
  133. } else {
  134. $uri .= str_replace('//', '/', $_SERVER['HTTP_HOST'] . $path);
  135. }
  136. $uri = str_replace('jajax.php', '', $uri);
  137. return $uri;
  138. }
  139. private function loadSystem() {
  140. // Loads up all system libraries.
  141. require_once(SYSTEM_PATH . "/i18n/i18n.php");
  142. require_once(SYSTEM_PATH . "Session.php");
  143. require_once(SYSTEM_PATH . "Utils.php");
  144. require_once(SYSTEM_PATH . "UtilsPicture.php");
  145. require_once(SYSTEM_PATH . "Cache.php");
  146. require_once(SYSTEM_PATH . "Event.php");
  147. require_once(SYSTEM_PATH . "MovimException.php");
  148. require_once(SYSTEM_PATH . "RPC.php");
  149. require_once(SYSTEM_PATH . "User.php");
  150. }
  151. private function loadCommonLibraries() {
  152. // XMPPtoForm lib
  153. require_once(LIB_PATH . "XMPPtoForm.php");
  154. // Markdown lib
  155. require_once(LIB_PATH . "Markdown.php");
  156. // The template lib
  157. require_once(LIB_PATH . 'RainTPL.php');
  158. }
  159. private function loadDispatcher() {
  160. require_once(SYSTEM_PATH . "controllers/ControllerBase.php");
  161. require_once(SYSTEM_PATH . "controllers/ControllerMain.php");
  162. require_once(SYSTEM_PATH . "controllers/ControllerAjax.php");
  163. //require_once(SYSTEM_PATH . "controllers/FrontController.php");
  164. require_once(SYSTEM_PATH . "Route.php");
  165. require_once(SYSTEM_PATH . "template/TplPageBuilder.php");
  166. require_once(SYSTEM_PATH . "widget/WidgetBase.php");
  167. require_once(SYSTEM_PATH . "widget/WidgetWrapper.php");
  168. require_once(APP_PATH . "widgets/WidgetCommon/WidgetCommon.php");
  169. require_once(APP_PATH . "widgets/Notification/Notification.php");
  170. }
  171. private function setLogs() {
  172. try {
  173. define('ENVIRONMENT',\system\Conf::getServerConfElement('environment'));
  174. } catch (Exception $e) {
  175. define('ENVIRONMENT','development');//default environment is production
  176. }
  177. /**
  178. * LOG_MANAGEMENT: define where logs are saved, prefer error_log, or log_folder if you use mutual server.
  179. * 'error_log' : save in file defined on your file server
  180. * 'log_folder' : save in log folder, in DOCUMENT_ROOT.'/log'
  181. * 'syslog' : save in global system logs (not in file server logs)
  182. */
  183. define('LOG_MANAGEMENT','log_folder');
  184. if (ENVIRONMENT === 'development') {
  185. ini_set('log_errors', 1);
  186. ini_set('display_errors', 0);
  187. ini_set('error_reporting', E_ALL );
  188. } else {
  189. ini_set('log_errors', 1);
  190. ini_set('display_errors', 0);
  191. ini_set('error_reporting', E_ALL ^ E_DEPRECATED ^ E_NOTICE);
  192. }
  193. if (LOG_MANAGEMENT === 'log_folder') {
  194. ini_set('error_log', DOCUMENT_ROOT.'/log/php.log');
  195. }
  196. set_error_handler('systemErrorHandler', E_ALL);
  197. }
  198. private function setTimezone() {
  199. // We set the default timezone to the server timezone
  200. $conf = \system\Conf::getServerConf();
  201. if(isset($conf['timezone']))
  202. date_default_timezone_set($conf['timezone']);
  203. }
  204. private function loadModl() {
  205. // We load Movim Data Layer
  206. require_once(LIB_PATH . 'Modl/loader.php');
  207. $db = modl\Modl::getInstance();
  208. $db->setModelsPath(APP_PATH.'models');
  209. modl\loadModel('Presence');
  210. modl\loadModel('Contact');
  211. modl\loadModel('Privacy');
  212. modl\loadModel('RosterLink');
  213. modl\loadModel('Session');
  214. modl\loadModel('Cache');
  215. modl\loadModel('Postn');
  216. modl\loadModel('Subscription');
  217. modl\loadModel('Caps');
  218. modl\loadModel('Item');
  219. modl\loadModel('Message');
  220. $db->setConnectionArray(\System\Conf::getServerConf());
  221. $db->connect();
  222. return true;
  223. }
  224. private function loadMoxl() {
  225. // We load Movim XMPP Library
  226. require_once(LIB_PATH . 'Moxl/loader.php');
  227. }
  228. private function setBrowserSupport() {
  229. if(isset( $_SERVER['HTTP_USER_AGENT'])) {
  230. $useragent = $_SERVER['HTTP_USER_AGENT'];
  231. if (preg_match('|MSIE ([0-9].[0-9]{1,2})|',$useragent,$matched)) {
  232. $browser_version=$matched[1];
  233. $browser = 'IE';
  234. } elseif (preg_match('/Opera[\/ ]([0-9]{1}\.[0-9]{1}([0-9])?)/',$useragent,$matched)) {
  235. $browser_version=$matched[1];
  236. $browser = 'Opera';
  237. } elseif(preg_match('|Firefox/([0-9\.]+)|',$useragent,$matched)) {
  238. $browser_version=$matched[1];
  239. $browser = 'Firefox';
  240. } elseif(preg_match('|Safari/([0-9\.]+)|',$useragent,$matched)) {
  241. $browser_version=$matched[1];
  242. $browser = 'Safari';
  243. } else {
  244. $browser_version = 0;
  245. $browser = 'other';
  246. }
  247. } else {
  248. $browser_version = 0;
  249. $browser= 'other';
  250. }
  251. define('BROWSER_VERSION', $browser_version);
  252. define('BROWSER', $browser);
  253. $compatible = false;
  254. switch($browser) {
  255. case 'Firefox':
  256. if($browser_version > 3.5)
  257. $compatible = true;
  258. break;
  259. case 'IE':
  260. if($browser_version > 9.0)
  261. $compatible = true;
  262. break;
  263. case 'Safari': // Also Chrome-Chromium
  264. if($browser_version > 522.0)
  265. $compatible = true;
  266. break;
  267. case 'Opera':
  268. if($browser_version > 9.0)
  269. $compatible = true;
  270. break;
  271. }
  272. define('BROWSER_COMP', $compatible);
  273. }
  274. private function startingSession() {
  275. global $session;
  276. // Starting session.
  277. $sess = Session::start(APP_NAME);
  278. $session = $sess->get('session');
  279. //$this->user = new User;
  280. /*$db = modl\Modl::getInstance();
  281. $u = new User();
  282. $db->setUser($u->getLogin());*/
  283. }
  284. }