26 use Elgg\Traits\Loggable;
27 use Symfony\Component\Console\Input\ArgvInput;
28 use Symfony\Component\Console\Input\ArrayInput;
29 use Symfony\Component\Console\Input\InputInterface;
30 use Symfony\Component\Console\Output\ConsoleOutput;
31 use Symfony\Component\Console\Output\NullOutput;
32 use Symfony\Component\Console\Output\OutputInterface;
33 use Symfony\Component\HttpFoundation\RedirectResponse as SymfonyRedirect;
34 use Symfony\Component\HttpFoundation\Response;
78 protected $boot_status = [
79 'application_boot_completed' =>
false,
80 'full_boot_completed' =>
false,
81 'plugins_boot_completed' =>
false,
82 'service_boot_completed' =>
false,
91 if (self::$_instance ===
null) {
92 self::$_instance = self::factory();
93 self::setGlobalConfig(self::$_instance);
96 return self::$_instance;
107 self::$_instance = $application;
118 $this->internal_services = $internal_services;
119 $this->public_services = PublicContainer::factory();
137 foreach (self::getEngineLibs() as $file) {
139 Includer::requireFileOnce(
"$path/$file");
140 }
catch (\Error $e) {
152 $app = self::getInstance();
164 return function_exists(
'elgg');
213 $this->boot_status[
$type] = $status;
226 return $this->internal_services->publicDb;
238 $CONFIG = $application->internal_services->config;
254 public static function factory(array $spec = []) {
258 'handle_exceptions' =>
true,
259 'handle_shutdown' =>
true,
261 'internal_services' =>
null,
262 'set_start_time' =>
true,
263 'settings_path' =>
'',
267 if ($spec[
'set_start_time']) {
269 if (!isset($GLOBALS[
'START_MICROTIME'])) {
270 $GLOBALS[
'START_MICROTIME'] = microtime(
true);
274 if ($spec[
'handle_exceptions']) {
281 if (!$spec[
'internal_services']) {
282 if (!$spec[
'config']) {
283 $spec[
'config'] = Config::factory($spec[
'settings_path']);
286 $spec[
'internal_services'] = InternalContainer::factory([
'config' => $spec[
'config']]);
289 if ($spec[
'request']) {
290 if (!$spec[
'request'] instanceof HttpRequest) {
294 $spec[
'request']->initializeTrustedProxyConfiguration($spec[
'internal_services']->config);
295 $spec[
'request']->correctBaseURL($spec[
'internal_services']->config);
296 $spec[
'internal_services']->set(
'request', $spec[
'request']);
299 $app =
new self($spec[
'internal_services']);
301 if ($spec[
'handle_shutdown']) {
323 if (self::$_instance) {
324 $app = self::$_instance;
325 $app->internal_services->set(
'request',
$request);
328 $app = self::factory([
332 self::setGlobalConfig($app);
333 self::setInstance($app);
335 return self::install();
353 if (self::$_instance) {
354 self::$_instance->internal_services->responseFactory->respond($builder);
356 return self::$_instance->internal_services->responseFactory->getSentResponse();
361 $status = $builder->getStatusCode();
364 if ($builder->isRedirection()) {
370 }
catch (\Exception $ex) {
371 $response =
new Response($ex->getMessage(), 500);
374 $response->headers->set(
'Pragma',
'public');
375 $response->headers->set(
'Cache-Control',
'no-store, must-revalidate');
376 $response->headers->set(
'Expires',
'Fri, 05 Feb 1982 00:00:00 -0500');
378 self::getResponseTransport()->send(
$response);
389 return self::route(self::getRequest());
398 $config = $this->internal_services->config;
399 $request = $this->internal_services->request;
408 $www_root = rtrim(
$request->getSchemeAndHttpHost() .
$request->getBaseUrl(),
'/') .
'/';
410 $config->wwwroot_cli_server = $www_root;
413 if (str_starts_with(
$request->getElggPath(),
'/cache/')) {
414 $config->_disable_session_save =
true;
416 self::getResponseTransport()->send(
$response);
421 if (
$request->getElggPath() ===
'/refresh_token') {
422 $config->_disable_session_save =
true;
423 $token = new \Elgg\Controllers\RefreshCsrfToken();
425 self::getResponseTransport()->send(
$response);
430 if (str_starts_with(
$request->getElggPath(),
'/serve-file/')) {
431 $config->_disable_session_save =
true;
433 self::getResponseTransport()->send(
$response);
438 if ($this->isCli()) {
439 $config->_disable_session_save =
true;
445 $request = $this->internal_services->request;
447 if (!$this->internal_services->router->route(
$request)) {
455 }
else if (
$request->getFirstUrlSegment() ==
'action') {
460 $forward_url = (string) $this->internal_services->events->triggerResults(
'forward', $ex->getCode(), [
'exception' => $ex],
$forward_url);
463 if ($ex->getMessage()) {
464 $this->internal_services->system_messages->addErrorMessage($ex->getMessage());
477 return $this->internal_services->responseFactory->getSentResponse();
486 ini_set(
'display_errors', 1);
489 $installer = new \ElggInstaller();
491 }
catch (\Exception $ex) {
518 $request = self::$_instance->internal_services->request;
519 $signer = self::$_instance->internal_services->urlSigner;
526 if (isset(
$mac) && !$signer->isValid(
$url)) {
530 unset(
$query[UrlSigner::KEY_MAC]);
536 $url = self::$_instance->internal_services->urlSigner->sign(
$url);
540 }
catch (\Exception $ex) {
555 $constants =
Paths::elgg() .
'engine/lib/constants.php';
556 Includer::requireFileOnce($constants);
558 $conf =
Paths::elgg() .
'engine/schema/migrations.php';
566 $app = new \Phinx\Console\PhinxApplication();
567 $wrapper = new \Phinx\Wrapper\TextWrapper($app, [
568 'configuration' => $conf,
570 $log = $wrapper->getMigrate();
572 if (!empty($_SERVER[
'argv']) && in_array(
'--verbose', $_SERVER[
'argv'])) {
587 $db_config = DbConfig::fromElggConfig(
$config);
589 if ($db_config->isDatabaseSplit()) {
590 $conn = $db_config->getConnectionConfig(DbConfig::WRITE);
592 $conn = $db_config->getConnectionConfig();
597 'migrations' =>
Paths::elgg() .
'engine/schema/migrations/',
600 'default_migration_table' =>
"{$conn['prefix']}migrations",
601 'default_environment' =>
'prod',
603 'adapter' =>
'mysql',
604 'host' => $conn[
'host'],
605 'port' => $conn[
'port'],
606 'name' => $conn[
'database'],
607 'user' => $conn[
'user'],
608 'pass' => $conn[
'password'],
609 'charset' => $conn[
'encoding'],
610 'table_prefix' => $conn[
'prefix'],
623 $request = $this->internal_services->request;
624 $new = $this->internal_services->router->allowRewrite(
$request);
629 $this->internal_services->set(
'request', $new);
654 if (self::$_instance) {
655 return self::$_instance->internal_services->request;
658 return HttpRequest::createFromGlobals();
669 $argv =
$request->server->get(
'argv') ?: [];
670 return new ArgvInput($argv);
673 return new ArrayInput([]);
683 return new ConsoleOutput();
685 return new NullOutput();
695 $std_out = self::getStdOut();
696 if (is_callable([$std_out,
'getErrorOutput'])) {
697 return $std_out->getErrorOutput();
710 return new \Elgg\Http\OutputBufferTransport();
713 return new \Elgg\Http\HttpProtocolTransport();
723 private static function getEngineLibs() {
736 'deprecated-6.1.php',
738 'external_files.php',
$content
Set robots.txt action.
if(! $entity->delete(true, true)) $forward_url
return[ 'admin/delete_admin_notices'=>['access'=> 'admin'], 'admin/menu/save'=>['access'=> 'admin'], 'admin/plugins/activate'=>['access'=> 'admin'], 'admin/plugins/activate_all'=>['access'=> 'admin'], 'admin/plugins/deactivate'=>['access'=> 'admin'], 'admin/plugins/deactivate_all'=>['access'=> 'admin'], 'admin/plugins/set_priority'=>['access'=> 'admin'], 'admin/security/security_txt'=>['access'=> 'admin'], 'admin/security/settings'=>['access'=> 'admin'], 'admin/security/regenerate_site_secret'=>['access'=> 'admin'], 'admin/site/cache/invalidate'=>['access'=> 'admin'], 'admin/site/flush_cache'=>['access'=> 'admin'], 'admin/site/icons'=>['access'=> 'admin'], 'admin/site/set_maintenance_mode'=>['access'=> 'admin'], 'admin/site/set_robots'=>['access'=> 'admin'], 'admin/site/theme'=>['access'=> 'admin'], 'admin/site/unlock_upgrade'=>['access'=> 'admin'], 'admin/site/settings'=>['access'=> 'admin'], 'admin/upgrade'=>['access'=> 'admin'], 'admin/upgrade/reset'=>['access'=> 'admin'], 'admin/user/ban'=>['access'=> 'admin'], 'admin/user/bulk/ban'=>['access'=> 'admin'], 'admin/user/bulk/delete'=>['access'=> 'admin'], 'admin/user/bulk/unban'=>['access'=> 'admin'], 'admin/user/bulk/validate'=>['access'=> 'admin'], 'admin/user/change_email'=>['access'=> 'admin'], 'admin/user/delete'=>['access'=> 'admin'], 'admin/user/login_as'=>['access'=> 'admin'], 'admin/user/logout_as'=>[], 'admin/user/makeadmin'=>['access'=> 'admin'], 'admin/user/resetpassword'=>['access'=> 'admin'], 'admin/user/removeadmin'=>['access'=> 'admin'], 'admin/user/unban'=>['access'=> 'admin'], 'admin/user/validate'=>['access'=> 'admin'], 'annotation/delete'=>[], 'avatar/upload'=>[], 'comment/save'=>[], 'diagnostics/download'=>['access'=> 'admin'], 'entity/chooserestoredestination'=>[], 'entity/delete'=>[], 'entity/mute'=>[], 'entity/restore'=>[], 'entity/subscribe'=>[], 'entity/trash'=>[], 'entity/unmute'=>[], 'entity/unsubscribe'=>[], 'login'=>['access'=> 'logged_out'], 'logout'=>[], 'notifications/mute'=>['access'=> 'public'], 'plugins/settings/remove'=>['access'=> 'admin'], 'plugins/settings/save'=>['access'=> 'admin'], 'plugins/usersettings/save'=>[], 'register'=>['access'=> 'logged_out', 'middleware'=>[\Elgg\Router\Middleware\RegistrationAllowedGatekeeper::class,],], 'river/delete'=>[], 'settings/notifications'=>[], 'settings/notifications/subscriptions'=>[], 'user/changepassword'=>['access'=> 'public'], 'user/requestnewpassword'=>['access'=> 'public'], 'useradd'=>['access'=> 'admin'], 'usersettings/save'=>[], 'widgets/add'=>[], 'widgets/delete'=>[], 'widgets/move'=>[], 'widgets/save'=>[],]
Handles application boot sequence.
Handle system and PHP errors.
Handler for uncaught exceptions.
Load, boot, and implement a front controller for an Elgg application.
static isCoreLoaded()
Are Elgg's global functions loaded?
bootCore()
Bootstrap the Elgg engine, loads plugins, and calls initial system events.
static upgrade()
Elgg upgrade script.
static index()
Elgg's front controller.
static getStdErr()
Load console error output interface.
static migrate()
Runs database migrations.
static getStdOut()
Load console output interface.
static respond(ResponseBuilder $builder)
Build and send a response.
static getMigrationSettings()
Returns configuration array for database migrations.
static getResponseTransport()
Build a transport for sending responses.
static setInstance(?Application $application=null)
Set the global Application instance.
static factory(array $spec=[])
Create a new application.
static getInstance()
Get the global Application instance.
static getRequest()
Build request object.
run()
Routes the request, booting core if not yet booted.
setBootStatus(string $type, bool $status)
Sets the boot status.
static start()
Start and boot the core.
static $_instance
Reference to the loaded Application.
allowPathRewrite()
Allow plugins to rewrite the path.
static getStdIn()
Load console input interface.
getBootStatus(string $type)
Retrieve the boot status of the application.
getDb()
Get a Database wrapper for performing queries without booting Elgg.
static isCli()
Is application running in CLI.
static install()
Renders a web UI for installing Elgg.
static route(HttpRequest $request)
Route a request.
__construct(InternalContainer $internal_services)
Constructor.
static loadCore()
Define all Elgg global functions and constants, wire up boot events, but don't boot.
static setGlobalConfig(Application $application)
Make the global $CONFIG a reference to this application's config service.
Database configuration service.
A generic parent class for Configuration exceptions.
Thrown when there is a major problem with the installation.
getRedirectUrl()
Get preferred redirect URL.
Thrown when one of the gatekeepers prevents access.
Thrown when page is not accessible.
Exception thrown if an argument is not of the expected type.
Redirect response builder.
Find Elgg and project paths.
Component for creating signed URLs.
const ELGG_HTTP_INTERNAL_SERVER_ERROR
const ELGG_HTTP_PERMANENTLY_REDIRECT
const ELGG_HTTP_FORBIDDEN
const REFERRER
Used in calls to forward() to specify the browser should be redirected to the referring page.
foreach($plugin_guids as $guid) if(empty($deactivated_plugins)) $url
$config
Advanced site settings, debugging section.
if(! $pagination && $limit !==false &&!empty($items) &&count($items) >=$limit) $base_url
elgg()
Bootstrapping and helper procedural code available for use in Elgg core and plugins.
elgg_http_add_url_query_elements(string $url, array $elements)
Sets elements in a URL's query string.
elgg_extract($key, $array, $default=null, bool $strict=true)
Checks for $array[$key] and returns its value if it exists, else returns $default.
elgg_get_login_url(array $query=[], string $fragment='')
Returns site's login URL Triggers a 'login_url', 'site' event that can be used by plugins to alter th...
HTTP response builder interface.
HTTP response transport interface.
elgg_echo(string $message_key, array $args=[], string $language='')
Elgg language module Functions to manage language and translations.
elgg_normalize_site_url(string $unsafe_url)
From untrusted input, get a site URL safe for forwarding.
if(parse_url(elgg_get_site_url(), PHP_URL_PATH) !=='/') if(file_exists(elgg_get_root_path() . 'robots.txt'))
Set robots.txt.
elgg_is_logged_in()
Returns whether or not the user is currently logged in.