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.

398 lines
12 KiB

  1. <?php
  2. if (!defined('DOCUMENT_ROOT')) die('Access denied');
  3. require 'vendor/autoload.php';
  4. use Monolog\Logger;
  5. use Monolog\Handler\SyslogHandler;
  6. /**
  7. * Error Handler...
  8. */
  9. function systemErrorHandler($errno, $errstr, $errfile, $errline, $errcontext = null)
  10. {
  11. $log = new Logger('movim');
  12. $log->pushHandler(new SyslogHandler('movim'));
  13. $log->addError($errstr);
  14. return false;
  15. }
  16. function fatalErrorShutdownHandler()
  17. {
  18. $last_error = error_get_last();
  19. if($last_error['type'] === E_ERROR) {
  20. systemErrorHandler(
  21. E_ERROR,
  22. $last_error['message'],
  23. $last_error['file'],
  24. $last_error['line']);
  25. if (ob_get_contents()) ob_clean();
  26. ?>
  27. <div style="font-family: Arial; text-align: center;">
  28. <h2>Oops... something went wrong.</h2>
  29. <p>But don't panic. The NSA is on the case.</p>
  30. </div>
  31. <?php
  32. if (ob_get_contents()) ob_end_clean();
  33. }
  34. }
  35. /**
  36. * Manage boot order
  37. */
  38. class Bootstrap {
  39. function boot($light = false) {
  40. //define all needed constants
  41. $this->setConstants();
  42. mb_internal_encoding("UTF-8");
  43. //First thing to do, define error management (in case of error forward)
  44. $this->setLogs();
  45. //Check if vital system need is OK
  46. $this->checkSystem();
  47. if(!$light) $this->setBrowserSupport();
  48. $this->loadSystem();
  49. $this->loadCommonLibraries();
  50. $this->loadDispatcher();
  51. $this->loadHelpers();
  52. $loadmodlsuccess = $this->loadModl();
  53. $this->setTimezone();
  54. $this->setLogLevel();
  55. if($loadmodlsuccess) {
  56. $this->startingSession();
  57. $this->loadLanguage();
  58. } else {
  59. throw new Exception('Error loading Modl');
  60. }
  61. }
  62. private function checkSystem() {
  63. $listWritableFile = array(
  64. DOCUMENT_ROOT.'/log/logger.log',
  65. DOCUMENT_ROOT.'/log/php.log',
  66. DOCUMENT_ROOT.'/cache/test.tmp',
  67. );
  68. $errors = array();
  69. if(!is_writable(DOCUMENT_ROOT))
  70. $errors[] = 'We\'re unable to write to folder '.DOCUMENT_ROOT.': check rights';
  71. else {
  72. if(!file_exists(DOCUMENT_ROOT.'/cache') && !@mkdir(DOCUMENT_ROOT.'/cache')) {
  73. $errors[] = 'Couldn\'t create directory cache';
  74. }
  75. if(!file_exists(DOCUMENT_ROOT.'/log') && !@mkdir(DOCUMENT_ROOT.'/log')) {
  76. $errors[] = 'Couldn\'t create directory log';
  77. }
  78. if(!file_exists(DOCUMENT_ROOT.'/config') && !@mkdir(DOCUMENT_ROOT.'/config')) {
  79. $errors[] = 'Couldn\'t create directory config';
  80. }
  81. if(!file_exists(DOCUMENT_ROOT.'/users') && !@mkdir(DOCUMENT_ROOT.'/users')) {
  82. $errors[] = 'Couldn\'t create directory users';
  83. } else {
  84. touch(DOCUMENT_ROOT.'/users/index.html');
  85. }
  86. }
  87. foreach($listWritableFile as $fileName) {
  88. if (!file_exists($fileName)) {
  89. if (touch($fileName) !== true) {
  90. $errors[] = 'We\'re unable to write to '.$fileName.': check rights';
  91. }
  92. }else if (is_writable($fileName) !== true) {
  93. $errors[] = 'We\'re unable to write to file '.$fileName.': check rights';
  94. }
  95. }
  96. if (!function_exists('json_decode')) {
  97. $errors[] = 'You need to install php5-json that\'s not seems to be installed';
  98. }
  99. if (count($errors)) {
  100. throw new Exception(implode("\n<br />",$errors));
  101. }
  102. }
  103. private function setConstants() {
  104. define('APP_TITLE', 'Movim');
  105. define('APP_NAME', 'movim');
  106. define('APP_VERSION', $this->getVersion());
  107. define('APP_SECURED', $this->isServerSecured());
  108. if(isset($_SERVER['HTTP_HOST'])) {
  109. define('BASE_HOST', $_SERVER['HTTP_HOST']);
  110. }
  111. if(isset($_SERVER['SERVER_NAME'])) {
  112. define('BASE_DOMAIN', $_SERVER["SERVER_NAME"]);
  113. }
  114. define('BASE_URI', $this->getBaseUri());
  115. define('CACHE_URI', $this->getBaseUri() . 'cache/');
  116. define('SESSION_ID', getenv('sid'));
  117. define('THEMES_PATH', DOCUMENT_ROOT . '/themes/');
  118. define('USERS_PATH', DOCUMENT_ROOT . '/users/');
  119. define('APP_PATH', DOCUMENT_ROOT . '/app/');
  120. define('SYSTEM_PATH', DOCUMENT_ROOT . '/system/');
  121. define('LIB_PATH', DOCUMENT_ROOT . '/lib/');
  122. define('LOCALES_PATH', DOCUMENT_ROOT . '/locales/');
  123. define('CACHE_PATH', DOCUMENT_ROOT . '/cache/');
  124. define('LOG_PATH', DOCUMENT_ROOT . '/log/');
  125. define('VIEWS_PATH', DOCUMENT_ROOT . '/app/views/');
  126. define('HELPERS_PATH', DOCUMENT_ROOT . '/app/helpers/');
  127. define('WIDGETS_PATH', DOCUMENT_ROOT . '/app/widgets/');
  128. define('MOVIM_API', 'https://api.movim.eu/');
  129. if (!defined('DOCTYPE')) {
  130. define('DOCTYPE','text/html');
  131. }
  132. }
  133. private function isServerSecured() {
  134. if((
  135. isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] != "")
  136. || (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] == "https")) {
  137. return true;
  138. }
  139. return false;
  140. }
  141. private function getVersion() {
  142. $file = "VERSION";
  143. if($f = fopen(DOCUMENT_ROOT.'/'.$file, 'r')) {
  144. return trim(fgets($f));
  145. }
  146. }
  147. private function getBaseUri() {
  148. $dirname = dirname($_SERVER['PHP_SELF']);
  149. if(strstr($dirname, 'index.php')) {
  150. $dirname = substr($dirname, 0, strrpos($dirname, 'index.php'));
  151. }
  152. $path = (($dirname == DIRECTORY_SEPARATOR) ? '' : $dirname).'/';
  153. // Determining the protocol to use.
  154. $uri = "http://";
  155. if($this->isServerSecured()) {
  156. $uri = 'https://';
  157. }
  158. if($path == "") {
  159. $uri .= $_SERVER['HTTP_HOST'] ;
  160. } elseif(isset($_SERVER['HTTP_HOST'])) {
  161. $uri .= str_replace('//', '/', $_SERVER['HTTP_HOST'] . $path);
  162. }
  163. if(getenv('baseuri') != null
  164. && filter_var(getenv('baseuri'), FILTER_VALIDATE_URL)
  165. && sizeof(getenv('baseuri')) < 32) {
  166. return getenv('baseuri');
  167. } else {
  168. return $uri;
  169. }
  170. }
  171. private function loadSystem() {
  172. require_once(SYSTEM_PATH . "Session.php");
  173. require_once(SYSTEM_PATH . "Sessionx.php");
  174. require_once(SYSTEM_PATH . "Utils.php");
  175. require_once(SYSTEM_PATH . "UtilsPicture.php");
  176. require_once(SYSTEM_PATH . "Cache.php");
  177. require_once(SYSTEM_PATH . "Event.php");
  178. require_once(SYSTEM_PATH . "RPC.php");
  179. require_once(SYSTEM_PATH . "User.php");
  180. require_once(SYSTEM_PATH . "Picture.php");
  181. }
  182. private function loadCommonLibraries() {
  183. // XMPPtoForm lib
  184. require_once(LIB_PATH . "XMPPtoForm.php");
  185. // SDPtoJingle and JingletoSDP lib :)
  186. //require_once(LIB_PATH . "SDPtoJingle.php");
  187. //require_once(LIB_PATH . "JingletoSDP.php");
  188. }
  189. private function loadHelpers() {
  190. foreach(glob(HELPERS_PATH."*Helper.php") as $file) {
  191. require $file;
  192. }
  193. }
  194. private function loadDispatcher() {
  195. require_once(SYSTEM_PATH . "template/TplPageBuilder.php");
  196. require_once(SYSTEM_PATH . "controllers/BaseController.php");
  197. require_once(SYSTEM_PATH . "controllers/AjaxController.php");
  198. require_once(SYSTEM_PATH . "Route.php");
  199. require_once(SYSTEM_PATH . "controllers/FrontController.php");
  200. require_once(SYSTEM_PATH . "widget/WidgetBase.php");
  201. require_once(SYSTEM_PATH . "widget/WidgetWrapper.php");
  202. //require_once(APP_PATH . "widgets/WidgetCommon/WidgetCommon.php");
  203. require_once(APP_PATH . "widgets/Notification/Notification.php");
  204. }
  205. /**
  206. * Loads up the language, either from the User or default.
  207. */
  208. function loadLanguage() {
  209. $user = new User();
  210. $user->reload();
  211. $cd = new \Modl\ConfigDAO();
  212. $config = $cd->get();
  213. $l = Movim\i18n\Locale::start();
  214. if($user->isLogged()) {
  215. $lang = $user->getConfig('language');
  216. if(isset($lang)) {
  217. $l->load($lang);
  218. } else {
  219. // Load default language.
  220. $l->load($config->locale);
  221. }
  222. }
  223. elseif(isset($_SERVER['HTTP_ACCEPT_LANGUAGE'])) {
  224. $l->detect();
  225. $l->loadPo();
  226. }
  227. else {
  228. $l->load($config->locale);
  229. }
  230. }
  231. private function setLogs() {
  232. ini_set('display_errors', 0);
  233. ini_set('error_log', DOCUMENT_ROOT.'/log/php.log');
  234. set_error_handler('systemErrorHandler', E_ALL);
  235. register_shutdown_function('fatalErrorShutdownHandler');
  236. }
  237. private function setTimezone() {
  238. // We set the default timezone to the server timezone
  239. $cd = new \Modl\ConfigDAO();
  240. $config = $cd->get();
  241. // And we set a global offset
  242. define('TIMEZONE_OFFSET', getTimezoneOffset($config->timezone));
  243. date_default_timezone_set($config->timezone);
  244. }
  245. private function setLogLevel() {
  246. // We set the default timezone to the server timezone
  247. $cd = new \Modl\ConfigDAO();
  248. $config = $cd->get();
  249. define('LOG_LEVEL', (int)$config->loglevel);
  250. }
  251. private function loadModl() {
  252. // We load Movim Data Layer
  253. $db = Modl\Modl::getInstance();
  254. $db->setModelsPath(APP_PATH.'models');
  255. Modl\Utils::loadModel('Config');
  256. Modl\Utils::loadModel('Presence');
  257. Modl\Utils::loadModel('Contact');
  258. Modl\Utils::loadModel('Privacy');
  259. Modl\Utils::loadModel('RosterLink');
  260. Modl\Utils::loadModel('Cache');
  261. Modl\Utils::loadModel('Postn');
  262. Modl\Utils::loadModel('Subscription');
  263. Modl\Utils::loadModel('Caps');
  264. Modl\Utils::loadModel('Item');
  265. Modl\Utils::loadModel('Message');
  266. Modl\Utils::loadModel('Sessionx');
  267. Modl\Utils::loadModel('Conference');
  268. if(file_exists(DOCUMENT_ROOT.'/config/db.inc.php')) {
  269. require DOCUMENT_ROOT.'/config/db.inc.php';
  270. } else {
  271. throw new Exception('Cannot find config/db.inc.php file');
  272. }
  273. $db->setConnectionArray($conf);
  274. $db->connect();
  275. return true;
  276. }
  277. private function setBrowserSupport() {
  278. if(isset( $_SERVER['HTTP_USER_AGENT'])) {
  279. $useragent = $_SERVER['HTTP_USER_AGENT'];
  280. if (preg_match('|MSIE ([0-9].[0-9]{1,2})|',$useragent,$matched)) {
  281. $browser_version=$matched[1];
  282. $browser = 'IE';
  283. } elseif (preg_match('/Opera[\/ ]([0-9]{1}\.[0-9]{1}([0-9])?)/',$useragent,$matched)) {
  284. $browser_version=$matched[1];
  285. $browser = 'Opera';
  286. } elseif(preg_match('|Firefox/([0-9\.]+)|',$useragent,$matched)) {
  287. $browser_version=$matched[1];
  288. $browser = 'Firefox';
  289. } elseif(preg_match('|Safari/([0-9\.]+)|',$useragent,$matched)) {
  290. $browser_version=$matched[1];
  291. $browser = 'Safari';
  292. } else {
  293. $browser_version = 0;
  294. $browser = 'other';
  295. }
  296. } else {
  297. $browser_version = 0;
  298. $browser= 'other';
  299. }
  300. define('BROWSER_VERSION', $browser_version);
  301. define('BROWSER', $browser);
  302. $compatible = false;
  303. switch($browser) {
  304. case 'Firefox':
  305. if($browser_version > 30.0)
  306. $compatible = true;
  307. break;
  308. case 'IE':
  309. if($browser_version > 10.0)
  310. $compatible = true;
  311. break;
  312. case 'Safari': // Also Chrome-Chromium
  313. if($browser_version > 522.0)
  314. $compatible = true;
  315. break;
  316. case 'Opera':
  317. if($browser_version > 12.1)
  318. $compatible = true;
  319. break;
  320. }
  321. define('BROWSER_COMP', $compatible);
  322. }
  323. private function startingSession() {
  324. $s = \Sessionx::start();
  325. $s->load();
  326. $user = new User;
  327. $db = Modl\Modl::getInstance();
  328. $db->setUser($user->getLogin());
  329. }
  330. }