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.

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