Page Menu
Home
DevCentral
Search
Configure Global Search
Log In
Files
F12373699
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
25 KB
Referenced Files
None
Subscribers
None
View Options
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
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Nov 1, 18:17 (19 h, 46 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3112844
Default Alt Text
(25 KB)
Attached To
Mode
rOBSIDIAN Obsidian Workspaces
Attached
Detach File
Event Timeline
Log In to Comment