Page MenuHomeDevCentral

D3825.diff
No OneTemporary

D3825.diff

diff --git a/composer.json b/composer.json
--- a/composer.json
+++ b/composer.json
@@ -18,7 +18,8 @@
],
"require": {
"keruald/database": "0.5.2",
- "keruald/omnitools": "0.15.1",
+ "keruald/omnitools": "0.16.0",
+ "keruald/yaml": "0.1.1",
"netresearch/jsonmapper": "^v5.0.0",
"smarty/smarty": "^5.6.0",
"vlucas/phpdotenv": "^v5.6.2",
diff --git a/workspaces/composer.json b/workspaces/composer.json
--- a/workspaces/composer.json
+++ b/workspaces/composer.json
@@ -4,7 +4,8 @@
"type": "project",
"require": {
"keruald/database": "0.5.2",
- "keruald/omnitools": "0.15.1",
+ "keruald/omnitools": "0.16.0",
+ "keruald/yaml": "0.1.1",
"smarty/smarty": "^5.6.0"
},
"require-dev": {
diff --git a/workspaces/src/Engines/Apps/Application.php b/workspaces/src/Engines/Apps/Application.php
--- a/workspaces/src/Engines/Apps/Application.php
+++ b/workspaces/src/Engines/Apps/Application.php
@@ -18,6 +18,7 @@
namespace Waystone\Workspaces\Engines\Apps;
use Waystone\Workspaces\Engines\Controller\Controller;
+use Waystone\Workspaces\Engines\Errors\ErrorHandling;
use Waystone\Workspaces\Engines\Workspaces\WorkspaceConfiguration;
use Collection;
diff --git a/workspaces/src/Engines/Apps/ApplicationConfiguration.php b/workspaces/src/Engines/Apps/ApplicationConfiguration.php
--- a/workspaces/src/Engines/Apps/ApplicationConfiguration.php
+++ b/workspaces/src/Engines/Apps/ApplicationConfiguration.php
@@ -17,10 +17,9 @@
namespace Waystone\Workspaces\Engines\Apps;
-use Waystone\Workspaces\Engines\Workspaces\WorkspaceConfiguration;
+use Waystone\Workspaces\Engines\Serialization\ArrayDeserializable;
use Message;
-use ObjectDeserializable;
/**
* Application configuration class
@@ -29,7 +28,7 @@
*
* It can be serialized into a workspace.conf application entry
*/
-class ApplicationConfiguration implements ObjectDeserializable {
+class ApplicationConfiguration implements ArrayDeserializable {
/**
* @var string The URL the application is binded to, without initial slash.
@@ -53,31 +52,20 @@
public $useCollections = [];
/**
- * Loads a WorkspaceConfiguration instance from an object
+ * Loads an ApplicationConfiguration instance from an associative array
*
- * @param object $data The object to deserialize
+ * @param array $data The associative array to deserialize
*
- * @return WorkspaceConfiguration The deserialized instance
+ * @return ApplicationConfiguration The deserialized instance
*/
- public static function loadFromObject ($data) {
- $instance = new ApplicationConfiguration();
+ public static function loadFromArray (array $data) : self {
+ $instance = new static;
- //Applications array
foreach ($data as $key => $value) {
- switch ($key) {
- case 'nav':
- $instance->nav = new Message($value);
- break;
-
- case 'useCollections':
- foreach ($data->useCollections as $role => $name) {
- $instance->useCollections[$role] = $name;
- }
- break;
-
- default:
- $instance->$key = $value;
- }
+ $instance->$key = match ($key) {
+ "nav" => new Message($value),
+ default => $value,
+ };
}
return $instance;
diff --git a/workspaces/src/Engines/Exceptions/WorkspaceException.php b/workspaces/src/Engines/Exceptions/WorkspaceException.php
new file mode 100644
--- /dev/null
+++ b/workspaces/src/Engines/Exceptions/WorkspaceException.php
@@ -0,0 +1,9 @@
+<?php
+
+namespace Waystone\Workspaces\Engines\Exceptions;
+
+use RuntimeException;
+
+class WorkspaceException extends RuntimeException {
+
+}
diff --git a/workspaces/src/Engines/Serialization/ArrayDeserializable.php b/workspaces/src/Engines/Serialization/ArrayDeserializable.php
new file mode 100644
--- /dev/null
+++ b/workspaces/src/Engines/Serialization/ArrayDeserializable.php
@@ -0,0 +1,15 @@
+<?php
+
+namespace Waystone\Workspaces\Engines\Serialization;
+
+interface ArrayDeserializable {
+
+ /**
+ * Loads a specified class instance from an associative array.
+ *
+ * @param array $data The object to deserialize
+ * @return self The deserialized instance
+ */
+ public static function loadFromArray (array $data) : self;
+
+}
diff --git a/workspaces/src/Engines/Serialization/ArrayDeserializableWithContext.php b/workspaces/src/Engines/Serialization/ArrayDeserializableWithContext.php
new file mode 100644
--- /dev/null
+++ b/workspaces/src/Engines/Serialization/ArrayDeserializableWithContext.php
@@ -0,0 +1,16 @@
+<?php
+
+namespace Waystone\Workspaces\Engines\Serialization;
+
+interface ArrayDeserializableWithContext {
+
+ /**
+ * Loads a specified class instance from an associative array.
+ *
+ * @param array $data The object to deserialize
+ * @param mixed $context The site or application context
+ * @return self The deserialized instance
+ */
+ public static function loadFromArray (array $data, mixed $context) : self;
+
+}
diff --git a/workspaces/src/Engines/Workspaces/Workspace.php b/workspaces/src/Engines/Workspaces/Workspace.php
--- a/workspaces/src/Engines/Workspaces/Workspace.php
+++ b/workspaces/src/Engines/Workspaces/Workspace.php
@@ -189,16 +189,27 @@
public function loadConfiguration (Context $context) {
global $Config;
- $file = $Config['Content']['Workspaces'] . '/' . $this->code
- . '/workspace.conf';
- if (!file_exists($file)) {
- $exceptionMessage =
- sprintf(Language::get('NotConfiguredWorkspace'), $file);
- throw new Exception($exceptionMessage);
+ $dir = $Config['Content']['Workspaces'] . '/' . $this->code;
+
+ // Load JSON configuration file
+ $file = $dir . '/workspace.conf';
+ if (file_exists($file)) {
+ $this->configuration =
+ WorkspaceConfiguration::loadFromFile($file, $context);
+ return;
}
- $this->configuration =
- WorkspaceConfiguration::loadFromFile($file, $context);
+ // Load YAML configuration file
+ $file = $dir . '/workspace.yml';
+ if (file_exists($file)) {
+ $this->configuration =
+ WorkspaceConfiguration::loadFromYamlFile($file, $context);
+ return;
+ }
+
+ $exceptionMessage =
+ sprintf(Language::get('NotConfiguredWorkspace'), $file);
+ throw new Exception($exceptionMessage);
}
/**
diff --git a/workspaces/src/Engines/Workspaces/WorkspaceConfiguration.php b/workspaces/src/Engines/Workspaces/WorkspaceConfiguration.php
--- a/workspaces/src/Engines/Workspaces/WorkspaceConfiguration.php
+++ b/workspaces/src/Engines/Workspaces/WorkspaceConfiguration.php
@@ -18,9 +18,14 @@
namespace Waystone\Workspaces\Engines\Workspaces;
use Waystone\Workspaces\Engines\Apps\ApplicationConfiguration;
+use Waystone\Workspaces\Engines\Exceptions\WorkspaceException;
use Waystone\Workspaces\Engines\Framework\Context;
+use Waystone\Workspaces\Engines\Serialization\ArrayDeserializableWithContext;
-use ObjectDeserializableWithContext;
+use Keruald\Yaml\Parser as YamlParser;
+use Keruald\Yaml\Tags\EnvTag;
+
+use AuthenticationMethod;
use Exception;
@@ -29,7 +34,7 @@
*
* This class maps the workspaces table.
*/
-class WorkspaceConfiguration implements ObjectDeserializableWithContext {
+class WorkspaceConfiguration implements ArrayDeserializableWithContext {
/**
* @var array applications (each element is an instance of
@@ -109,102 +114,111 @@
}
/**
- * Loads a WorkspaceConfiguration instance from an object
+ * Loads a WorkspaceConfiguration instance from an array
*
- * @param object $data The object to deserialize
- * @param Context $context The site context
+ * @param array $data The array to deserialize
+ * @param mixed $context The application context
*
* @return WorkspaceConfiguration The deserialized instance
+ * @throws WorkspaceException
*/
- public static function loadFromObject ($data, $context) {
+ public static function loadFromArray (
+ array $data,
+ mixed $context
+ ) : self {
$instance = new WorkspaceConfiguration();
- //Applications array
- if (property_exists($data, 'applications')) {
- foreach ($data->applications as $applicationData) {
- if (!property_exists($applicationData, 'name')) {
- throw new Exception("Missing required property: application name");
- }
+ // Parse applications to load in the workspace
+ $applications = $data["applications"] ?? [];
+ foreach ($applications as $applicationData) {
+ if (!array_key_exists("name", $applicationData)) {
+ throw new WorkspaceException("Missing required property: application name");
+ }
- $controllerClass = $applicationData->name;
- if (!class_exists($controllerClass)) {
- trigger_error("Application controller doesn't exist: $controllerClass. If you've just added application code, update includes/autoload.php file to register your new classes.",
- E_USER_WARNING);
- continue;
- }
- $configurationClass = $controllerClass . 'Configuration';
- if (!class_exists($configurationClass)) {
- $configurationClass = "ApplicationConfiguration";
- }
- $instance->applications[] =
- $configurationClass::loadFromObject($applicationData);
+ $controllerClass = $applicationData["name"];
+ if (!class_exists($controllerClass)) {
+ trigger_error("Application controller doesn't exist: $controllerClass.",
+ E_USER_WARNING);
+ continue;
+ }
+
+ $configurationClass = $controllerClass . "Configuration";
+ if (!class_exists($configurationClass)) {
+ $configurationClass = ApplicationConfiguration::class;
}
+
+ $instance->applications[] = [$configurationClass, "loadFromArray"]($applicationData);
}
- //Login array
- if (property_exists($data, 'login')) {
+ // Parse custom authentication methods for this workspace
+ if (array_key_exists("login", $data)) {
$instance->allowInternalAuthentication = false;
- foreach ($data->login as $authData) {
- if (!property_exists($authData, 'type')) {
- throw new Exception("Missing required property: login type");
- }
-
- if ($authData->type == 'internal') {
+ foreach ($data["login"] as $authData) {
+ if ($authData["type"] == "internal") {
$instance->allowInternalAuthentication = true;
continue;
}
- $class = $authData->type;
- if (!class_exists($class)) {
- throw new Exception("Authentication method doesn't exist: $class. If you've just added authentication code, update includes/autoload.php file to register your new classes.");
- }
- $authenticationMethod = $class::loadFromObject($authData);
- $authenticationMethod->context = $context;
- $instance->authenticationMethods[] = $authenticationMethod;
+ $auth = self::loadAuthenticationMethod($authData, $context);
+ $instance->authenticationMethods[] = $auth;
}
}
- //Disclaimers array
- if (property_exists($data, 'disclaimers')) {
- $instance->disclaimers = $data->disclaimers;
- }
-
- //Collections array
- if (property_exists($data, 'collections')) {
- foreach ($data->collections as $collection) {
- if (!property_exists($collection, 'name')) {
- throw new Exception("A collection has been declared without name in the workspace configuration.");
- }
- $name = $collection->name;
- if (!property_exists($collection, 'global')
- || !$collection->global) {
- $name =
- WorkspaceConfiguration::getCollectionNameWithPrefix($context->workspace,
- $name);
- }
- if (property_exists($collection, 'documentType')) {
- $type = $collection->documentType;
- if (!class_exists($type)) {
- throw new Exception("CollectionDocument children class doesn't exist: $type. If you've just added authentication code, update includes/autoload.php file to register your new classes.");
- }
- } else {
- $type = null;
+ // Parse collections the workspace applications can access
+ $collections = $data->collections ?? [];
+ foreach ($collections as $collection) {
+ if (!property_exists($collection, 'name')) {
+ throw new WorkspaceException("A collection has been declared without name in the workspace configuration.");
+ }
+ $name = $collection->name;
+ if (!property_exists($collection, 'global')
+ || !$collection->global) {
+ $name =
+ WorkspaceConfiguration::getCollectionNameWithPrefix($context->workspace,
+ $name);
+ }
+ if (property_exists($collection, 'documentType')) {
+ $type = $collection->documentType;
+ if (!class_exists($type)) {
+ throw new WorkspaceException("CollectionDocument children class doesn't exist: $type. If you've just added authentication code, update includes/autoload.php file to register your new classes.");
}
- $instance->collections[$name] = $type;
+ } else {
+ $type = null;
}
+ $instance->collections[$name] = $type;
}
- //Header string
- if (property_exists($data, 'header')) {
- $instance->header = $data->header;
+ // Customization
+ $instance->disclaimers = $data->disclaimers ?? [];
+ $instance->header = $data["header"] ?? "";
+ $instance->footer = $data["footer"] ?? "";
+
+ return $instance;
+ }
+
+ private static function loadAuthenticationMethod (
+ array $authData,
+ Context $context,
+ ) : AuthenticationMethod {
+ if (!array_key_exists("type", $authData)) {
+ throw new WorkspaceException("Missing required property: login type");
}
- //Footer string
- if (property_exists($data, 'footer')) {
- $instance->footer = $data->footer;
+ $class = $authData["type"];
+ if (!class_exists($class)) {
+ throw new WorkspaceException("Authentication method doesn't exist: $class.");
}
- return $instance;
+ try {
+ $authenticationMethod = $class::loadFromArray($authData);
+ $authenticationMethod->context = $context;
+ } catch (Exception $ex) {
+ throw new WorkspaceException(
+ "Can't load authentication method: " . $ex->getMessage(), 0, $ex
+ );
+ }
+
+ return $authenticationMethod;
}
/**
@@ -226,12 +240,33 @@
* Loads a WorkspaceConfiguration instance deserializing a JSON file
*/
public static function loadFromFile ($file, $context) {
- $object = json_decode(file_get_contents($file));
+ $object = json_decode(file_get_contents($file), true);
if ($object === null) {
throw new Exception("Can't parse configuration file: "
. json_last_error_msg());
}
- return self::loadFromObject($object, $context);
+ return self::loadFromArray($object, $context);
+ }
+
+ /**
+ * @throws WorkspaceException
+ */
+ public static function loadFromYamlFile (
+ string $file,
+ Context $context
+ ) : self {
+ $parser = new YamlParser();
+ $parser->withTagClass(EnvTag::class);
+
+ try {
+ $value = $parser->parseFile($file);
+ }
+ catch (Exception $ex) {
+ throw new WorkspaceException("Can't parse configuration file: "
+ . $ex->getMessage(), 0, $ex);
+ }
+
+ return self::loadFromArray($value, $context);
}
}
diff --git a/workspaces/src/includes/ObjectDeserializable.php b/workspaces/src/includes/ObjectDeserializable.php
--- a/workspaces/src/includes/ObjectDeserializable.php
+++ b/workspaces/src/includes/ObjectDeserializable.php
@@ -28,18 +28,3 @@
*/
public static function loadFromObject ($data);
}
-
-
-/**
- * ObjectDeserializableWithContext interface
- */
-interface ObjectDeserializableWithContext {
- /**
- * Loads a specified class instance from a generic object. Typically used to deserialize a JSON document.
- *
- * @param object $data The object to deserialize
- * @param object $context The site or application context
- * @return object The deserialized instance
- */
- public static function loadFromObject ($data, $context);
-}
\ No newline at end of file
diff --git a/workspaces/src/includes/auth/AddToGroupUserAction.php b/workspaces/src/includes/auth/AddToGroupUserAction.php
--- a/workspaces/src/includes/auth/AddToGroupUserAction.php
+++ b/workspaces/src/includes/auth/AddToGroupUserAction.php
@@ -16,10 +16,12 @@
*
*/
+use Waystone\Workspaces\Engines\Serialization\ArrayDeserializable;
+
/**
* User action to add a user into a group
*/
-class AddToGroupUserAction extends UserAction implements ObjectDeserializable {
+class AddToGroupUserAction extends UserAction implements ArrayDeserializable {
/**
* @var UserGroup The group to add the user to
*/
@@ -30,6 +32,7 @@
*/
public $isAdmin;
+
/**
* Executes the user action
*/
@@ -46,15 +49,19 @@
}
/**
- * Loads a AddToGroupUserAction instance from an object.
+ * Loads an AddToGroupUserAction instance from an object.
+ *
+ * @param array $data The associative array to deserialize
*
- * @param object $data The object to deserialize
* @return AddToGroupUserAction The deserialized instance
+ * @throws Exception when the group code is not found
*/
- public static function loadFromObject ($data) {
+ public static function loadFromArray (array $data) : self {
$instance = new AddToGroupUserAction();
- $instance->group = UserGroup::fromCode($data->code);
- $instance->isAdmin = ($data->isAdmin == true);
+
+ $instance->group = UserGroup::fromCode($data["code"]);
+ $instance->isAdmin = ($data["isAdmin"] == true);
+
return $instance;
}
}
diff --git a/workspaces/src/includes/auth/AuthenticationMethod.php b/workspaces/src/includes/auth/AuthenticationMethod.php
--- a/workspaces/src/includes/auth/AuthenticationMethod.php
+++ b/workspaces/src/includes/auth/AuthenticationMethod.php
@@ -16,6 +16,7 @@
*/
use Waystone\Workspaces\Engines\Framework\Context;
+use Waystone\Workspaces\Engines\Serialization\ArrayDeserializable;
/**
* Authentication method class
@@ -23,7 +24,7 @@
* This class has to be extended to implement custom authentication methods.
*/
-abstract class AuthenticationMethod implements ObjectDeserializable {
+abstract class AuthenticationMethod implements ArrayDeserializable {
/**
* @var User The local user matching the authentication
*/
@@ -201,43 +202,44 @@
}
/**
- * Loads a AuthenticationMethod instance from a generic object. Typically used to deserialize a JSON document.
+ * Loads an AuthenticationMethod instance from a generic array.
+ * Typically used to deserialize a configuration.
+ *
+ * @param array $data The associative array to deserialize
*
- * @param object $data The object to deserialize
* @return AuthenticationMethod The deserialized instance
+ * @throws InvalidArgumentException|Exception
*/
- public static function loadFromObject ($data) {
+ public static function loadFromArray(array $data) : self {
$instance = new static;
- if (!property_exists($data, 'id')) {
+ if (!array_key_exists("id", $data)) {
throw new InvalidArgumentException("Authentication method id is required.");
}
- $instance->id = $data->id;
+ $instance->id = $data["id"];
- if (property_exists($data, 'loginMessage')) {
- $instance->loginMessage = new Message($data->loginMessage);
- } else {
- $instance->loginMessage = new Message(Language::get("SignIn"));
- }
+ $message = $data["loginMessage"] ?? Language::get("SignIn");
+ $instance->loginMessage = new Message($message);
+
+ if (array_key_exists("createUser", $data)) {
+ $createUser = $data["createUser"];
- if (property_exists($data, 'createUser')) {
- if (property_exists($data->createUser, 'enabled')) {
- $instance->canCreateUser = ($data->createUser->enabled == true);
+ if (array_key_exists("enabled", $createUser)) {
+ $instance->canCreateUser = ($createUser["enabled"] === true);
}
- if (property_exists($data->createUser, 'addToGroups')) {
- foreach ($data->createUser->addToGroups as $actionData) {
- $instance->createUserActions[] = AddToGroupUserAction::loadFromObject($actionData);
- }
+ $addToGroups = $createUser["addToGroups"] ?? [];
+ foreach ($addToGroups as $actionData) {
+ $instance->createUserActions[] = AddToGroupUserAction::loadFromArray($actionData);
}
- if (property_exists($data->createUser, 'givePermissions')) {
- foreach ($data->createUser->givePermissions as $actionData) {
- $instance->createUserActions[] = GivePermissionUserAction::loadFromObject($actionData);
- }
+ $givePermissions = $createUser["givePermissions"] ?? [];
+ foreach ($createUser["givePermissions"] as $actionData) {
+ $instance->createUserActions[] = GivePermissionUserAction::loadFromArray($actionData);
}
}
return $instance;
}
+
}
diff --git a/workspaces/src/includes/auth/AzharProvider.php b/workspaces/src/includes/auth/AzharProvider.php
--- a/workspaces/src/includes/auth/AzharProvider.php
+++ b/workspaces/src/includes/auth/AzharProvider.php
@@ -188,17 +188,18 @@
}
/**
- * Loads a AzharProvider instance from a generic object. Typically used to deserialize a JSON document.
+ * Loads an AzharProvider instance from a generic array.
+ * Typically used to deserialize a configuration.
*
- * @param object $data The object to deserialize
+ * @param array $data The associative array to deserialize
* @return AzharProvider The deserialized instance
*/
- public static function loadFromObject ($data) {
- $instance = parent::loadFromObject($data);
+ public static function loadFromArray (array $data) : self {
+ $instance = parent::loadFromArray($data);
- $instance->url = $data->url;
- $instance->secretKey = $data->secretKey;
- $instance->clientKey = $data->clientKey;
+ $instance->url = $data["url"];
+ $instance->secretKey = $data["secretKey"];
+ $instance->clientKey = $data["clientKey"];
return $instance;
}
diff --git a/workspaces/src/includes/auth/GivePermissionUserAction.php b/workspaces/src/includes/auth/GivePermissionUserAction.php
--- a/workspaces/src/includes/auth/GivePermissionUserAction.php
+++ b/workspaces/src/includes/auth/GivePermissionUserAction.php
@@ -16,10 +16,12 @@
*
*/
+use Waystone\Workspaces\Engines\Serialization\ArrayDeserializable;
+
/**
* User action to grant user a permission
*/
-class GivePermissionUserAction extends UserAction implements ObjectDeserializable, JsonSerializable {
+class GivePermissionUserAction extends UserAction implements ArrayDeserializable, JsonSerializable {
/**
* @var string The permission name
*/
@@ -54,42 +56,48 @@
}
/**
- * Loads a GivePermissionUserAction instance from an object.
+ * Loads a GivePermissionUserAction instance from an associative array.
*
- * @param object $data The object to deserialize
+ * @param object $data The associative array to deserialize
* @return GivePermissionUserAction The deserialized instance
*/
- public static function loadFromObject ($data) {
- //Checks the object contains every mandatory data
- if (!property_exists($data, 'resource')) {
+ public static function loadFromArray (mixed $data) : self {
+ // Validate mandatory data
+ if (!array_key_exists("resource", $data)) {
throw new InvalidArgumentException("A resource property, with two mandatory type and id property is required.");
}
- if (!property_exists($data, 'permission')) {
+ if (!array_key_exists("permission", $data)) {
throw new InvalidArgumentException("A permission property, with a mandatory name property and a facultative flag property is required.");
}
- if (!property_exists($data->permission, 'name')) {
+
+ $resource = $data["resource"];
+ $permission = $data["permission"];
+
+ if (!array_key_exists("name", $permission)) {
throw new InvalidArgumentException("Permission name is required.");
}
- if (!property_exists($data->resource, 'type')) {
+ if (!array_key_exists("type", $resource)) {
throw new InvalidArgumentException("Resource type is required.");
}
- if (!property_exists($data->resource, 'id')) {
+ if (!array_key_exists("id", $resource)) {
throw new InvalidArgumentException("Resource id is required.");
}
- //Builds instance
+ // Build instance
$instance = new GivePermissionUserAction();
- $instance->resourceType = Permission::getResourceTypeLetterFromCode($data->resource->type);
- $instance->resourceIdentifier = $data->resource->id;
- $instance->permissionName = $data->permission->name;
- if (property_exists($data->permission, 'flag')) {
- $instance->permissionFlag = $data->permission->flag;
+ $instance->resourceType = Permission::getResourceTypeLetterFromCode($resource["type"]);
+ $instance->resourceIdentifier = $resource["id"];
+ $instance->permissionName = $permission["name"];
+
+ if (array_key_exists("flag", $permission)) {
+ $instance->permissionFlag = $permission["flag"];
}
return $instance;
}
+
/**
* Serializes the object to a value that can be serialized natively by json_encode().
*
diff --git a/workspaces/src/includes/autoload.php b/workspaces/src/includes/autoload.php
--- a/workspaces/src/includes/autoload.php
+++ b/workspaces/src/includes/autoload.php
@@ -51,7 +51,6 @@
if ($name == 'Events') { require $dir . '/includes/Events.php'; return true; }
if ($name == 'LoadableWithContext') { require $dir . '/includes/LoadableWithContext.php'; return true; }
if ($name == 'ObjectDeserializable') { require $dir . '/includes/ObjectDeserializable.php'; return true; }
- if ($name == 'ObjectDeserializableWithContext') { require $dir . '/includes/ObjectDeserializable.php'; return true; }
if ($name == 'Application') { require $dir . '/includes/apps/Application.php'; return true; }
if ($name == 'ApplicationConfiguration') { require $dir . '/includes/apps/ApplicationConfiguration.php'; return true; }

File Metadata

Mime Type
text/plain
Expires
Sat, Nov 1, 18:46 (4 h, 10 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
3124817
Default Alt Text
D3825.diff (27 KB)

Event Timeline