Page MenuHomeDevCentral

No OneTemporary

diff --git a/composer.json b/composer.json
index 96357a2..f00a2d7 100644
--- a/composer.json
+++ b/composer.json
@@ -1,45 +1,46 @@
{
"name": "waystone/waystone",
"type": "library",
"description": "Modular libraries to build applications with Obsidian Workspaces",
"keywords": [
"framework",
"keruald",
"waystone",
"obsidian"
],
"license": "BSD-2-Clause",
"homepage": "https://waystone.nasqueron.org",
"authors": [
{
"name": "Sébastien Santoro",
"email": "dereckson@espace-win.org"
}
],
"require": {
"keruald/database": "0.5.2",
"keruald/omnitools": "0.15.1",
"smarty/smarty": "^5.6.0",
+ "vlucas/phpdotenv": "^v5.6.2",
"ext-mysqli": "*"
},
"require-dev": {
"nasqueron/codestyle": "^0.1.2",
"phpunit/phpunit": "^12.4",
"squizlabs/php_codesniffer": "^4.0"
},
"replace": {
"waystone/workspaces": "1.0.0"
},
"autoload": {
"psr-4": {
"Waystone\\Workspaces\\": "workspaces/src/",
"Waystone\\Workspaces\\Tests\\": "workspaces/tests/"
}
},
"scripts": {
"lint-src": "find */src -type f -name '*.php' | xargs -I {} php -l {} 1> /dev/null",
"lint-tests": "find */tests -type f -name '*.php' | xargs -n1 php -l",
"test": "vendor/bin/phpunit"
},
"minimum-stability": "dev"
}
diff --git a/workspaces/composer.json b/workspaces/composer.json
index 0c40218..217e1af 100644
--- a/workspaces/composer.json
+++ b/workspaces/composer.json
@@ -1,29 +1,30 @@
{
"name": "waystone/workspaces",
"description": "Core interfaces for Obsidian Workspaces",
"type": "project",
"require": {
"keruald/database": "0.5.2",
"keruald/omnitools": "0.15.1",
"smarty/smarty": "^5.6.0"
},
"require-dev": {
"phpunit/phpunit": "^12.4",
"nasqueron/codestyle": "^0.1.2",
"squizlabs/php_codesniffer": "^4.0",
+ "vlucas/phpdotenv": "^v5.6.2",
"ext-mysqli": "*"
},
"license": "BSD-2-Clause",
"autoload": {
"psr-4": {
"Waystone\\Workspaces\\": "src/",
"Waystone\\Workspaces\\Tests\\": "tests/"
}
},
"authors": [
{
"name": "Sébastien Santoro",
"email": "dereckson@espace-win.org"
}
]
}
diff --git a/workspaces/src/Engines/Framework/Application.php b/workspaces/src/Engines/Framework/Application.php
new file mode 100644
index 0000000..b448ae6
--- /dev/null
+++ b/workspaces/src/Engines/Framework/Application.php
@@ -0,0 +1,27 @@
+<?php
+
+namespace Waystone\Workspaces\Engines\Framework;
+
+use Keruald\Database\Database;
+use Waystone\Workspaces\Engines\Errors\ErrorHandling;
+
+class Application {
+
+ public static function init () : void {
+ Environment::init();
+ ErrorHandling::init();
+ }
+
+ public static function getContext(array $config) : Context {
+ $context = new Context();
+
+ $context->config = $config;
+ $context->db = Database::load($config["sql"]);
+ $context->session = Session::load($context->db);
+ $context->url = get_current_url_fragments();
+ $context->initializeTemplateEngine($context->config['Theme']);
+
+ return $context;
+ }
+
+}
diff --git a/workspaces/src/Engines/Framework/Environment.php b/workspaces/src/Engines/Framework/Environment.php
new file mode 100644
index 0000000..91d50f2
--- /dev/null
+++ b/workspaces/src/Engines/Framework/Environment.php
@@ -0,0 +1,32 @@
+<?php
+
+namespace Waystone\Workspaces\Engines\Framework;
+
+use Dotenv\Dotenv;
+
+/**
+ * Interact with the environment
+ */
+class Environment {
+
+ /**
+ * Path to
+ */
+ const string ROOT_DIR = __DIR__ . "/../../..";
+
+ const array ENV_DIR_CANDIDATES = [
+ # Framework installed from workspaces/
+ self::ROOT_DIR,
+
+ # Monorepo installation
+ self::ROOT_DIR . "/..",
+ ];
+
+ /**
+ * Reads and loads .env environment file into environment
+ */
+ public static function init() : void {
+ $dotenv = Dotenv::createImmutable(self::ENV_DIR_CANDIDATES);
+ $dotenv->safeLoad();
+ }
+}
diff --git a/workspaces/src/includes/session.php b/workspaces/src/Engines/Framework/Session.php
similarity index 55%
rename from workspaces/src/includes/session.php
rename to workspaces/src/Engines/Framework/Session.php
index 2b8a6e0..73f6eb0 100755
--- a/workspaces/src/includes/session.php
+++ b/workspaces/src/Engines/Framework/Session.php
@@ -1,261 +1,314 @@
<?php
/**
* _, __, _, _ __, _ _, _, _
* / \ |_) (_ | | \ | /_\ |\ |
* \ / |_) , ) | |_/ | | | | \|
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*
* Session
*
* This class uses a singleton pattern, as we only need one single instance.
* Cf. http://www.php.net/manual/en/language.oop5.patterns.php
*
* @package ObsidianWorkspaces
* @subpackage Keruald
* @author Sébastien Santoro aka Dereckson <dereckson@espace-win.org>
* @license http://www.opensource.org/licenses/bsd-license.php BSD
* @filesource
*
*/
+namespace Waystone\Workspaces\Engines\Framework;
+
+use Keruald\Database\DatabaseEngine;
+use User;
+use Waystone\Workspaces\Engines\Errors\ErrorHandling;
+
/**
* Session class
*/
class Session {
+
/**
* @var string session ID
*/
public $id;
/**
* @var string remote client IP
*/
public $ip;
+ public DatabaseEngine $db;
+
/*
* @var Session current session instance
*/
private static $instance;
/*
* Gets or initializes current session instance
*
* @return Session current session instance
*/
- public static function load () {
+ public static function load (DatabaseEngine $db) {
if (!isset(self::$instance)) {
- //Creates new session instance
- $c = __CLASS__;
- self::$instance = new $c;
+ self::$instance = new self($db);
}
return self::$instance;
}
/**
* Initializes a new instance of Session object
*/
- private function __construct () {
+ private function __construct (DatabaseEngine $db) {
+ $this->db = $db;
+
//Starts PHP session, and gets id
session_start();
$_SESSION['ID'] = session_id();
$this->id = $_SESSION['ID'];
//Gets remote client IP
$this->ip = self::get_ip();
//Updates or creates the session in database
$this->update();
}
/**
* Gets remote client IP address
+ *
* @return string IP
*/
public static function get_ip () {
//mod_proxy + mod_rewrite (old pluton url scheme) will define 127.0.0.1
//in REMOTE_ADDR, and will store ip in HTTP_X_FORWARDED_FOR variable.
//Some ISP/orgz proxies also use this setting.
if (array_key_exists('HTTP_X_FORWARDED_FOR', $_SERVER)) {
return $_SERVER['HTTP_X_FORWARDED_FOR'];
}
//Standard cases
return $_SERVER['REMOTE_ADDR'];
}
/**
* Cleans up session
* i. deletes expired session
* ii. sets offline relevant sessions
*/
- public static function clean_old_sessions () {
- global $db, $Config;
+ public function clean_old_sessions () {
+ global $Config;
+ $db = $this->db;
//Gets session and online status lifetime (in seconds)
//If not specified in config, sets default 5 and 120 minutes values
- $onlineDuration = array_key_exists('OnlineDuration', $Config) ? $Config['OnlineDuration'] : 300;
- $sessionDuration = array_key_exists('SessionDuration', $Config) ? $Config['SessionDuration'] : 7200;
+ $onlineDuration = array_key_exists('OnlineDuration', $Config)
+ ? $Config['OnlineDuration'] : 300;
+ $sessionDuration = array_key_exists('SessionDuration', $Config)
+ ? $Config['SessionDuration'] : 7200;
- $resource = array_key_exists('ResourceID', $Config) ? '\'' . $db->escape($Config['ResourceID']) . '\'' : 'default';
+ $resource = array_key_exists('ResourceID', $Config) ? '\''
+ . $db->escape($Config['ResourceID'])
+ . '\''
+ : 'default';
//Deletes expired sessions
- $sql = "DELETE FROM " . TABLE_SESSIONS . " WHERE session_resource = $resource AND TIMESTAMPDIFF(SECOND, session_updated, NOW()) > $sessionDuration";
- if (!$db->query($sql)) message_die(SQL_ERROR, "Can't delete expired sessions", '', __LINE__, __FILE__, $sql);
+ $sql = "DELETE FROM " . TABLE_SESSIONS
+ . " WHERE session_resource = $resource AND TIMESTAMPDIFF(SECOND, session_updated, NOW()) > $sessionDuration";
+ if (!$db->query($sql)) {
+ ErrorHandling::messageAndDie(SQL_ERROR,
+ "Can't delete expired sessions", '', __LINE__, __FILE__, $sql);
+ }
//Online -> offline
- $sql = "UPDATE " . TABLE_SESSIONS . " SET session_resource = $resource AND session_online = 0 WHERE TIMESTAMPDIFF(SECOND, session_updated, NOW()) > $onlineDuration";
- if (!$db->query($sql)) message_die(SQL_ERROR, 'Can\'t update sessions online statuses', '', __LINE__, __FILE__, $sql);
+ $sql = "UPDATE " . TABLE_SESSIONS
+ . " SET session_resource = $resource AND session_online = 0 WHERE TIMESTAMPDIFF(SECOND, session_updated, NOW()) > $onlineDuration";
+ if (!$db->query($sql)) {
+ ErrorHandling::messageAndDie(SQL_ERROR,
+ 'Can\'t update sessions online statuses', '', __LINE__,
+ __FILE__, $sql);
+ }
}
/**
* Updates or creates a session in the database
*/
public function update () {
- global $db, $Config;
+ global $Config;
+ $db = $this->db;
//Cleans up session
//To boost SQL performances, try a random trigger
// e.g. if (rand(1, 100) < 3) self::clean_old_sessions();
//or comment this line and execute a cron script you launch each minute.
- self::clean_old_sessions();
+ $this->clean_old_sessions();
//Saves session in database.
//If the session already exists, it updates the field online and updated.
$id = $db->escape($this->id);
- $resource = array_key_exists('ResourceID', $Config) ? '\'' . $db->escape($Config['ResourceID']) . '\'' : 'default';
+ $resource = array_key_exists('ResourceID', $Config) ? '\''
+ . $db->escape($Config['ResourceID'])
+ . '\''
+ : 'default';
$user_id = $db->escape(ANONYMOUS_USER);
- $sql = "INSERT INTO " . TABLE_SESSIONS . " (session_id, session_ip, session_resource, user_id) VALUES ('$id', '$this->ip', $resource, '$user_id') ON DUPLICATE KEY UPDATE session_online = 1";
- if (!$db->query($sql)) message_die(SQL_ERROR, 'Can\'t save current session', '', __LINE__, __FILE__, $sql);
+ $sql = "INSERT INTO " . TABLE_SESSIONS
+ . " (session_id, session_ip, session_resource, user_id) VALUES ('$id', '$this->ip', $resource, '$user_id') ON DUPLICATE KEY UPDATE session_online = 1";
+ if (!$db->query($sql)) {
+ ErrorHandling::messageAndDie(SQL_ERROR,
+ 'Can\'t save current session', '', __LINE__, __FILE__, $sql);
+ }
}
/**
* Gets the number of online users
*
* @return int the online users count
*/
public function count_online () {
//Keeps result for later method call
static $count = -1;
if ($count == -1) {
//Queries sessions table
- global $db, $Config;
-
- $resource = array_key_exists('ResourceID', $Config) ? '\'' . $db->escape($Config['ResourceID']) . '\'' : 'default';
- $sql = "SELECT count(*) FROM " . TABLE_SESSIONS . " WHERE session_resource = $resource AND session_online = 1";
- $count = (int)$db->queryScalar($sql, "Can't count online users");
+ global $Config;
+ $db = $this->db;
+
+ $resource = array_key_exists('ResourceID', $Config) ? '\''
+ . $db->escape($Config['ResourceID'])
+ . '\''
+ : 'default';
+ $sql = "SELECT count(*) FROM " . TABLE_SESSIONS
+ . " WHERE session_resource = $resource AND session_online = 1";
+ $count =
+ (int)$db->queryScalar($sql, "Can't count online users");
}
//Returns number of users online
return $count;
}
/**
* Gets the value of a custom session table field
*
* @param string $info the field to get
+ *
* @return string the session specified field's value
*/
public function get_info ($info) {
- global $db;
+ $db = $this->db;
$id = $db->escape($this->id);
- $sql = "SELECT `$info` FROM " . TABLE_SESSIONS . " WHERE session_id = '$id'";
+ $sql = "SELECT `$info` FROM " . TABLE_SESSIONS
+ . " WHERE session_id = '$id'";
+
return $db->queryScalar($sql, "Can't get session $info info");
}
/**
* Sets the value of a custom session table field to the specified value
*
- * @param string $info the field to update
+ * @param string $info the field to update
* @param string $value the value to set
*/
public function set_info ($info, $value) {
- global $db;
+ $db = $this->db;
- $value = ($value === null) ? 'NULL' : "'" . $db->escape($value) . "'";
+ $value =
+ ($value === null) ? 'NULL' : "'" . $db->escape($value) . "'";
$id = $db->escape($this->id);
- $sql = "UPDATE " . TABLE_SESSIONS . " SET `$info` = $value WHERE session_id = '$id'";
- if (!$db->query($sql))
- message_die(SQL_ERROR, "Can't set session $info info", '', __LINE__, __FILE__, $sql);
+ $sql = "UPDATE " . TABLE_SESSIONS
+ . " SET `$info` = $value WHERE session_id = '$id'";
+ if (!$db->query($sql)) {
+ ErrorHandling::messageAndDie(SQL_ERROR,
+ "Can't set session $info info", '', __LINE__, __FILE__, $sql);
+ }
}
/**
* Gets logged user information
*
* @return User the logged user information
*/
public function get_logged_user () {
- global $db;
+ $db = $this->db;
//Gets session information
$id = $db->escape($this->id);
$sql = "SELECT * FROM " . TABLE_SESSIONS . " WHERE session_id = '$id'";
- if (!$result = $db->query($sql))
- message_die(SQL_ERROR, "Can't query session information", '', __LINE__, __FILE__, $sql);
+ if (!$result = $db->query($sql)) {
+ ErrorHandling::messageAndDie(SQL_ERROR,
+ "Can't query session information", '', __LINE__, __FILE__,
+ $sql);
+ }
$row = $db->fetchRow($result);
//Gets user instance
require_once('includes/objects/user.php');
$user = new User($row['user_id']);
//Adds session property to this user instance
$user->session = $row;
//Returns user instance
return $user;
}
/**
* Cleans session
*
* This method is to be called when an event implies a session destroy
*/
public function clean () {
//Destroys $_SESSION array values, help ID
foreach ($_SESSION as $key => $value) {
- if ($key != 'ID') unset($_SESSION[$key]);
+ if ($key != 'ID') {
+ unset($_SESSION[$key]);
+ }
}
}
/**
* Updates the session in a user login context
*
* @param string $user_id the user ID
*/
public function user_login ($user_id) {
- global $db;
+ $db = $this->db;
//Sets specified user ID in sessions table
$user_id = $db->escape($user_id);
- $id = $db->escape($this->id);
- $sql = "UPDATE " . TABLE_SESSIONS . " SET user_id = '$user_id' WHERE session_id = '$id'";
- if (!$db->query($sql))
- message_die(SQL_ERROR, "Can't set logged in status", '', __LINE__, __FILE__, $sql);
+ $id = $db->escape($this->id);
+ $sql = "UPDATE " . TABLE_SESSIONS
+ . " SET user_id = '$user_id' WHERE session_id = '$id'";
+ if (!$db->query($sql)) {
+ ErrorHandling::messageAndDie(SQL_ERROR,
+ "Can't set logged in status", '', __LINE__, __FILE__, $sql);
+ }
}
/**
* Updates the session in a user logout context
*/
public function user_logout () {
- global $db;
+ $db = $this->db;
//Sets anonymous user in sessions table
$user_id = $db->escape(ANONYMOUS_USER);
- $id = $db->escape($this->id);
- $sql = "UPDATE " . TABLE_SESSIONS . " SET user_id = '$user_id' WHERE session_id = '$id'";
- if (!$db->query($sql))
- message_die(SQL_ERROR, "Can't set logged out status", '', __LINE__, __FILE__, $sql);
+ $id = $db->escape($this->id);
+ $sql = "UPDATE " . TABLE_SESSIONS
+ . " SET user_id = '$user_id' WHERE session_id = '$id'";
+ if (!$db->query($sql)) {
+ ErrorHandling::messageAndDie(SQL_ERROR,
+ "Can't set logged out status", '', __LINE__, __FILE__, $sql);
+ }
//Cleans session
$this->clean();
}
}
-//The user_id matching anonymous user (overridable in config file)
-if (!defined('ANONYMOUS_USER')) {
- define('ANONYMOUS_USER', -1);
-}
diff --git a/workspaces/src/includes/core.php b/workspaces/src/includes/core.php
index d178ba6..5ceb59b 100755
--- a/workspaces/src/includes/core.php
+++ b/workspaces/src/includes/core.php
@@ -1,52 +1,47 @@
<?php
/**
* _, __, _, _ __, _ _, _, _
* / \ |_) (_ | | \ | /_\ |\ |
* \ / |_) , ) | |_/ | | | | \|
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*
* Core global functions
*
* @package ObsidianWorkspaces
* @subpackage Keruald
* @author Sébastien Santoro aka Dereckson <dereckson@espace-win.org>
* @license http://www.opensource.org/licenses/bsd-license.php BSD
* @filesource
*
*/
////////////////////////////////////////////////////////////////////////////////
/// ///
/// Configures PHP and loads site-wide used libraries ///
/// ///
////////////////////////////////////////////////////////////////////////////////
-require_once("autoload_vendor.php");
-
-//Errors management
-include_once("error.php");
-error_reporting(E_ALL);
-
-$minorRecoverableErrors = E_NOTICE | E_USER_NOTICE | E_DEPRECATED | E_USER_DEPRECATED;
-set_error_handler('throwExceptionErrorHandler', E_ALL ^ $minorRecoverableErrors);
-
//Loads global functions
include_once("GlobalFunctions.php"); //Global functions
//Loads configuration
if (isset($_SERVER) && array_key_exists('OBSIDIAN_CONFIG', $_SERVER)) {
$configFile = $_SERVER['OBSIDIAN_CONFIG'];
if (file_exists($configFile)) {
include_once($configFile);
unset($configFile);
} else {
die("You've specified a custom configuration file path in the environment, but this file doesn't exist: $configFile");
}
} else {
include_once("config.php");
}
//Loads libraries
-include_once("session.php"); //Sessions handler
include_once("autoload.php"); //Autoloader for needed classes
+
+//The user_id matching anonymous user (overridable in config file)
+if (!defined('ANONYMOUS_USER')) {
+ define('ANONYMOUS_USER', -1);
+}
diff --git a/workspaces/src/includes/login.php b/workspaces/src/includes/login.php
index e0185f3..76249e4 100755
--- a/workspaces/src/includes/login.php
+++ b/workspaces/src/includes/login.php
@@ -1,53 +1,56 @@
<?php
/**
* _, __, _, _ __, _ _, _, _
* / \ |_) (_ | | \ | /_\ |\ |
* \ / |_) , ) | |_/ | | | | \|
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*
* Login and logout code
*
* @package ObsidianWorkspaces
* @subpackage Keruald
* @author Sébastien Santoro aka Dereckson <dereckson@espace-win.org>
* @license http://www.opensource.org/licenses/bsd-license.php BSD
* @filesource
*
*/
use Waystone\Workspaces\Engines\Errors\ErrorHandling;
+global $context;
+$db = $context->db;
+
$action = array_key_exists('action', $_GET) ? $_GET['action'] : '';
if (array_key_exists('LogIn', $_POST)) {
//User have submitted login form
$username = $db->escape($_POST['username']);
$sql = "SELECT user_password, user_id FROM " . TABLE_USERS . " WHERE username = '$username'";
if ( !($result = $db->query($sql)) ) ErrorHandling::messageAndDie(SQL_ERROR, "Can't get user information", '', __LINE__, __FILE__, $sql);
if ($row = $db->fetchRow($result)) {
if (!$row['user_password']) {
//No password set
$LoginError = "This account exists but hasn't a password defined. Contact the site administrator.";
} elseif ($row['user_password'] != md5($_POST['password'])) {
//The password doesn't match
$LoginError = "Incorrect password.";
} else {
//Login successful
- Session::load()->user_login($row['user_id']);
+ $context->session->user_login($row['user_id']);
$LoginSuccessful = true;
}
} else {
$LoginError = "Username not found.";
}
} elseif (array_key_exists('LogOut', $_POST) || $action == "user.logout") {
//User have submitted logout form or clicked a logout link
- Session::load()->user_logout();
+ $context->session->user_logout();
} elseif (array_key_exists('authenticationMethodId', $_GET)) {
//Call authentication method for more processing
$auth = AuthenticationMethod::getFromId($_GET['authenticationMethodId'], $context);
if ($auth) {
$auth->handleRequest();
}
}
\ No newline at end of file
diff --git a/workspaces/src/index.php b/workspaces/src/index.php
index cc82a0b..de34667 100755
--- a/workspaces/src/index.php
+++ b/workspaces/src/index.php
@@ -1,106 +1,105 @@
<?php
+global $Config;
/**
* _, __, _, _ __, _ _, _, _
* / \ |_) (_ | | \ | /_\ |\ |
* \ / |_) , ) | |_/ | | | | \|
* ~ ~ ~ ~ ~ ~ ~ ~ ~ ~
*
* Main web application entry point
*
* @package ObsidianWorkspaces
* @subpackage Controllers
* @author Sébastien Santoro aka Dereckson <dereckson@espace-win.org>
* @license http://www.opensource.org/licenses/bsd-license.php BSD
* @filesource
*
*/
-use Keruald\Database\Database;
use Waystone\Workspaces\Engines\Errors\ErrorHandling;
+use Waystone\Workspaces\Engines\Framework\Application;
////////////////////////////////////////////////////////////////////////////////
///
/// Initialization
///
-//Keruald and Obsidian Workspaces libraries
+require_once("includes/autoload_vendor.php");
+Application::init();
include('includes/core.php');
//Prepares the site context
-$context = new Context();
-$context->config = $Config;
-$context->db = $db = Database::load($Config["sql"]);
-$context->session = Session::load();
-$context->url = get_current_url_fragments();
-$context->initializeTemplateEngine($context->config['Theme']);
+
+$context = Application::getContext($Config);
+$db = $context->db;
//Loads language files
Language::initialize();
Language::load($context)->configLoad('core.conf');
//Loads workspace
try {
if (Workspace::is_workspace($context->url[0])) {
$context->workspace = Workspace::fromCode(array_shift($context->url));
$context->workspace->loadConfiguration($context);
}
} catch (Exception $ex) {
ErrorHandling::messageAndDie(GENERAL_ERROR, $ex->getMessage(), Language::get('CantLoadWorkspace'));
}
//Handles login or logout
include("includes/login.php");
//Gets current user information
$context->user = $context->session->get_logged_user();
////////////////////////////////////////////////////////////////////////////////
///
/// Serves the requested page
///
//If the user isn't logged in (is anonymous), prints login/invite page & dies.
if ($context->user->id == ANONYMOUS_USER) {
//Anonymous user
include('controllers/anonymous.php');
exit;
}
//If a workspace has been selected, ensures the current logged in user has access to it.
if ($context->workspace && !$context->workspace->userCanAccess($context->user)) {
ErrorHandling::messageAndDie(HACK_ERROR, "You don't have access to this workspace.", 'Access control');
}
$controller = count($context->url) > 0 ? $context->url[0] : '';
switch ($controller) {
case '':
//Calls homepage controller
HomepageController::run($context);
break;
case 'help':
case 'reports':
//Calls requested controller
include("controllers/$controller.php");
break;
default:
//Current workspace application controller?
if ($context->workspace != null) {
$workspaceConfig = $context->workspace->configuration;
$applicationConfiguration = null;
if ($workspaceConfig != null && $workspaceConfig->hasControllerBind($controller, $applicationConfiguration)) {
//Runs controller
$controllerClass = $applicationConfiguration->name;
$appContext = ApplicationContext::loadFromContext($context, $applicationConfiguration);
$controllerClass::run($appContext);
break;
}
}
//Not a workspace, nor a controller toponym
ErrorPageController::show($context, 404);
exit;
}

File Metadata

Mime Type
text/x-diff
Expires
Sat, Nov 1, 18:17 (1 d, 2 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3112844
Default Alt Text
(25 KB)

Event Timeline