7ab1862eea78637b157c505b3fdf342cb4b4574e
[GitHub/Stricted/Domain-Control-Panel.git] / lib / system / RequestHandler.class.php
1 <?php
2 namespace dns\system;
3 use dns\system\cache\builder\ControllerCacheBuilder;
4
5 /**
6 * @author Jan Altensen (Stricted)
7 * @license GNU Lesser General Public License <http://opensource.org/licenses/lgpl-license.php>
8 * @copyright 2013-2016 Jan Altensen (Stricted)
9 */
10 class RequestHandler {
11 protected $pattern = "";
12 protected $routeData = array();
13
14 /**
15 * init RequestHandler
16 */
17 public function __construct ($module = '') {
18 $this->pattern = '~/?(?:(?P<controller>[A-Za-z0-9\-]+)(?:/(?P<id>\d+)(?:-(?P<title>[^/]+))?)?)?~x';
19 $controllers = ControllerCacheBuilder::getInstance()->getData(array('module' => $module));
20
21 if (DNS::getSession()->username !== null) {
22 DNS::getTPL()->assign(array("username" => DNS::getSession()->username));
23 }
24 else {
25 DNS::getTPL()->assign(array("username" => ''));
26 }
27
28 $className = "";
29 if (!empty($_SERVER['QUERY_STRING'])) {
30 $this->matches($_SERVER['QUERY_STRING']);
31 $this->registerRouteData();
32 }
33 else {
34 $className = '\\dns'.(empty($module) ? '' : '\\'.$module).'\\page\\IndexPage';
35 }
36
37 if (isset($this->routeData['controller']) && !empty($this->routeData['controller'])) {
38 $controller = strtolower($this->routeData['controller']);
39 if (isset($controllers[$controller]) && !empty($controllers[$controller])) {
40 $className = $controllers[$controller];
41 }
42 else {
43 @header('HTTP/1.0 404 Not Found');
44 DNS::getTPL()->assign(array("activeMenuItem" => '', "error" => 'The link you are trying to reach is no longer available or invalid.'));
45 DNS::getTPL()->display('error.tpl');
46 exit;
47 }
48 }
49
50 if (!User::isLoggedIn() && $className != '\dns\page\LoginPage' && $className != '\dns\page\ApiPage') {
51 DNS::getTPL()->display('login.tpl');
52 exit;
53 }
54
55 // handle offline mode
56 if (defined('OFFLINE') && OFFLINE) {
57 $admin = User::isAdmin();
58 $available = false;
59
60 if (defined($className . '::AVAILABLE_DURING_OFFLINE_MODE') && constant($className . '::AVAILABLE_DURING_OFFLINE_MODE')) {
61 $available = true;
62 }
63
64 if (!$admin && !$available) {
65 @header('HTTP/1.1 503 Service Unavailable');
66 DNS::getTPL()->display('offline.tpl');
67 exit;
68 }
69 }
70
71 try {
72 new $className();
73 }
74 catch (\Exception $e) {
75 if ($e->getCode() == 404) {
76 @header('HTTP/1.0 404 Not Found');
77 }
78 else if ($e->getCode() == 403) {
79 @header('HTTP/1.0 403 Forbidden');
80 }
81
82 /* show error page */
83 DNS::getTPL()->assign(array("activeMenuItem" => '', "error" => $e->getMessage()));
84 DNS::getTPL()->display('error.tpl');
85 exit;
86 }
87 }
88
89 /**
90 * Registers route data within $_GET and $_REQUEST.
91 */
92 protected function registerRouteData() {
93 foreach ($this->routeData as $key => $value) {
94 $_GET[$key] = $value;
95 $_REQUEST[$key] = $value;
96 }
97 }
98
99 public function matches($requestURL) {
100 if (preg_match($this->pattern, $requestURL, $matches)) {
101 foreach ($matches as $key => $value) {
102 if (!is_numeric($key)) {
103 $this->routeData[$key] = $value;
104 }
105 }
106
107 return true;
108 }
109
110 return false;
111 }
112 }