$a = new App(dirname(__DIR__));
-if ($a->mode === App::MODE_NORMAL) {
+if (App\Mode::isNormal()) {
$oAuth = new ExAuth();
$oAuth->readStdin();
}
\ No newline at end of file
$a = new App(dirname(__DIR__));
-if ($a->isInstallMode()) {
+if (App\Mode::isInstall()) {
die("Friendica isn't properly installed yet.\n");
}
}
}
-/**
- * @brief Synchronise addons:
- *
- * system.addon contains a comma-separated list of names
- * of addons which are used on this system.
- * Go through the database list of already installed addons, and if we have
- * an entry, but it isn't in the config list, call the uninstall procedure
- * and mark it uninstalled in the database (for now we'll remove it).
- * Then go through the config list and if we have a addon that isn't installed,
- * call the install procedure and add it to the database.
- *
- * @param object $a App
- */
-function check_addons(App $a)
-{
- $r = q("SELECT * FROM `addon` WHERE `installed` = 1");
- if (DBA::isResult($r)) {
- $installed = $r;
- } else {
- $installed = [];
- }
-
- $addons = Config::get('system', 'addon');
- $addons_arr = [];
-
- if ($addons) {
- $addons_arr = explode(',', str_replace(' ', '', $addons));
- }
-
- $a->addons = $addons_arr;
-
- $installed_arr = [];
-
- if (count($installed)) {
- foreach ($installed as $i) {
- if (!in_array($i['name'], $addons_arr)) {
- Addon::uninstall($i['name']);
- } else {
- $installed_arr[] = $i['name'];
- }
- }
- }
-
- if (count($addons_arr)) {
- foreach ($addons_arr as $p) {
- if (!in_array($p, $installed_arr)) {
- Addon::install($p);
- }
- }
- }
-
- Addon::loadHooks();
-
- return;
-}
-
/**
* @brief Used to end the current process, after saving session state.
* @deprecated
require_once "include/dba.php";
// Missing DB connection: ERROR
-if ($a->mode & App::MODE_LOCALCONFIGPRESENT && !($a->mode & App::MODE_DBAVAILABLE)) {
+if (App\Mode::has(App\Mode::LOCALCONFIGPRESENT) && !App\Mode::has(App\Mode::DBAVAILABLE)) {
System::httpExit(500, ['title' => 'Error 500 - Internal Server Error', 'description' => 'Apologies but the website is unavailable at the moment.']);
}
System::httpExit(503, ['title' => 'Error 503 - Service Temporarily Unavailable', 'description' => 'System is currently overloaded. Please try again later.']);
}
-if (!$a->isInstallMode()) {
+if (!App\Mode::isInstall()) {
if (Config::get('system', 'force_ssl') && ($a->get_scheme() == "http")
&& (intval(Config::get('system', 'ssl_policy')) == SSL_POLICY_FULL)
&& (substr(System::baseUrl(), 0, 8) == "https://")
L10n::loadTranslationTable($lang);
}
-if (!empty($_GET['zrl']) && $a->mode == App::MODE_NORMAL) {
+if (!empty($_GET['zrl']) && App\Mode::isNormal()) {
$a->query_string = Profile::stripZrls($a->query_string);
if (!local_user()) {
// Only continue when the given profile link seems valid
}
}
-if (!empty($_GET['owt']) && $a->mode == App::MODE_NORMAL) {
+if (!empty($_GET['owt']) && App\Mode::isNormal()) {
$token = $_GET['owt'];
$a->query_string = Profile::stripQueryParam($a->query_string, 'owt');
Profile::openWebAuthInit($token);
// in install mode, any url loads install module
// but we need "view" module for stylesheet
-if ($a->isInstallMode() && $a->module!="view") {
+if (App\Mode::isInstall() && $a->module != 'view') {
$a->module = 'install';
-} elseif (!($a->mode & App::MODE_MAINTENANCEDISABLED) && $a->module != "view") {
+} elseif (!App\Mode::has(App\Mode::MAINTENANCEDISABLED) && $a->module != 'view') {
$a->module = 'maintenance';
} else {
check_url($a);
check_db(false);
- check_addons($a);
+ Addon::check();
}
Nav::setSelected('nothing');
/* initialise content region */
-if ($a->mode == App::MODE_NORMAL) {
+if (App\Mode::isNormal()) {
Addon::callHooks('page_content_top', $a->page['content']);
}
*/
class App
{
- const MODE_LOCALCONFIGPRESENT = 1;
- const MODE_DBAVAILABLE = 2;
- const MODE_DBCONFIGAVAILABLE = 4;
- const MODE_MAINTENANCEDISABLED = 8;
-
- /**
- * @deprecated since version 2008.08 Use App->isInstallMode() instead to check for install mode.
- */
- const MODE_INSTALL = 0;
-
- /**
- * @deprecated since version 2008.08 Use the precise mode constant to check for a specific capability instead.
- */
- const MODE_NORMAL = App::MODE_LOCALCONFIGPRESENT | App::MODE_DBAVAILABLE | App::MODE_DBCONFIGAVAILABLE | App::MODE_MAINTENANCEDISABLED;
-
public $module_loaded = false;
public $module_class = null;
public $query_string = '';
public $argv;
public $argc;
public $module;
- public $mode = App::MODE_INSTALL;
public $strings;
public $basepath;
public $urlpath;
$this->loadDatabase();
- $this->determineMode();
+ App\Mode::determine($this->basepath);
$this->determineUrlPath();
Config::load();
- if ($this->mode & self::MODE_DBAVAILABLE) {
+ if (App\Mode::has(App\Mode::DBAVAILABLE)) {
Core\Addon::loadHooks();
$this->loadAddonConfig();
}
}
- /**
- * Sets the App mode
- *
- * - App::MODE_INSTALL : Either the database connection can't be established or the config table doesn't exist
- * - App::MODE_MAINTENANCE: The maintenance mode has been set
- * - App::MODE_NORMAL : Normal run with all features enabled
- *
- * @return type
- */
- private function determineMode()
- {
- $this->mode = 0;
-
- if (!file_exists($this->basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php')
- && !file_exists($this->basepath . DIRECTORY_SEPARATOR . '.htconfig.php')) {
- return;
- }
-
- $this->mode |= App::MODE_LOCALCONFIGPRESENT;
-
- if (!DBA::connected()) {
- return;
- }
-
- $this->mode |= App::MODE_DBAVAILABLE;
-
- if (DBA::fetchFirst("SHOW TABLES LIKE 'config'") === false) {
- return;
- }
-
- $this->mode |= App::MODE_DBCONFIGAVAILABLE;
-
- if (Config::get('system', 'maintenance')) {
- return;
- }
-
- $this->mode |= App::MODE_MAINTENANCEDISABLED;
- }
-
public function loadDatabase()
{
if (DBA::connected()) {
$this->save_timestamp($stamp1, 'network');
}
- /**
- * Install mode is when the local config file is missing or the DB schema hasn't been installed yet.
- *
- * @return bool
- */
- public function isInstallMode()
- {
- return !($this->mode & App::MODE_LOCALCONFIGPRESENT) || !($this->mode & App::MODE_DBCONFIGAVAILABLE);
- }
-
/**
* @brief Returns the base filesystem path of the App
*
*/
public function getCurrentTheme()
{
- if ($this->isInstallMode()) {
+ if (App\Mode::isInstall()) {
return '';
}
--- /dev/null
+<?php
+
+namespace Friendica\App;
+
+use Friendica\Core\Config;
+use Friendica\Database\DBA;
+
+/**
+ * Mode of the current Friendica Node
+ *
+ * @package Friendica\App
+ */
+class Mode
+{
+ const LOCALCONFIGPRESENT = 1;
+ const DBAVAILABLE = 2;
+ const DBCONFIGAVAILABLE = 4;
+ const MAINTENANCEDISABLED = 8;
+
+ /***
+ * @var int the mode of this Application
+ *
+ * Default is 0 (= not set)
+ */
+ private static $mode = 0;
+
+ /**
+ * Sets the App mode
+ *
+ * - App::MODE_INSTALL : Either the database connection can't be established or the config table doesn't exist
+ * - App::MODE_MAINTENANCE: The maintenance mode has been set
+ * - App::MODE_NORMAL : Normal run with all features enabled
+ *
+ * @param string $basepath the Basepath of the Application
+ *
+ */
+ public static function determine($basepath)
+ {
+ self::$mode = 0;
+
+ if (!file_exists($basepath . DIRECTORY_SEPARATOR . 'config' . DIRECTORY_SEPARATOR . 'local.ini.php')
+ && !file_exists($basepath . DIRECTORY_SEPARATOR . '.htconfig.php')) {
+ return;
+ }
+
+ self::$mode |= Mode::LOCALCONFIGPRESENT;
+
+ if (!DBA::connected()) {
+ return;
+ }
+
+ self::$mode |= Mode::DBAVAILABLE;
+
+ if (DBA::fetchFirst("SHOW TABLES LIKE 'config'") === false) {
+ return;
+ }
+
+ self::$mode |= Mode::DBCONFIGAVAILABLE;
+
+ if (Config::get('system', 'maintenance')) {
+ return;
+ }
+
+ self::$mode |= Mode::MAINTENANCEDISABLED;
+ }
+
+ /**
+ * Checks, if the Friendica Node has the given mode
+ *
+ * @param int $mode A mode to test
+ *
+ * @return bool returns true, if the mode is set
+ */
+ public static function has($mode)
+ {
+ return self::$mode & $mode;
+ }
+
+
+ /**
+ * Install mode is when the local config file is missing or the DB schema hasn't been installed yet.
+ *
+ * @return bool
+ */
+ public static function isInstall()
+ {
+ return !self::has(Mode::LOCALCONFIGPRESENT) ||
+ !self::has(MODE::DBCONFIGAVAILABLE);
+ }
+
+ /**
+ * Normal mode is when the local config file is set, the DB schema is installed and the maintenance mode is off.
+ *
+ * @return bool
+ */
+ public static function isNormal()
+ {
+ return self::has(Mode::LOCALCONFIGPRESENT) &&
+ self::has(Mode::DBAVAILABLE) &&
+ self::has(Mode::DBCONFIGAVAILABLE) &&
+ self::has(Mode::MAINTENANCEDISABLED);
+ }
+}
namespace Friendica\Core;
use Friendica\App;
+use Friendica\BaseObject;
use Friendica\Database\DBA;
require_once 'include/dba.php';
/**
* Some functions to handle addons
*/
-class Addon
+class Addon extends BaseObject
{
+ /**
+ * @brief Synchronise addons:
+ *
+ * system.addon contains a comma-separated list of names
+ * of addons which are used on this system.
+ * Go through the database list of already installed addons, and if we have
+ * an entry, but it isn't in the config list, call the uninstall procedure
+ * and mark it uninstalled in the database (for now we'll remove it).
+ * Then go through the config list and if we have a addon that isn't installed,
+ * call the install procedure and add it to the database.
+ *
+ */
+ public static function check()
+ {
+ $a = self::getApp();
+
+ $r = DBA::select('addon', [], ['installed' => 1]);
+ if (DBA::isResult($r)) {
+ $installed = DBA::toArray($r);
+ } else {
+ $installed = [];
+ }
+
+ $addons = Config::get('system', 'addon');
+ $addons_arr = [];
+
+ if ($addons) {
+ $addons_arr = explode(',', str_replace(' ', '', $addons));
+ }
+
+ $a->addons = $addons_arr;
+
+ $installed_arr = [];
+
+ if (count($installed)) {
+ foreach ($installed as $i) {
+ if (!in_array($i['name'], $addons_arr)) {
+ self::uninstall($i['name']);
+ } else {
+ $installed_arr[] = $i['name'];
+ }
+ }
+ }
+
+ if (count($addons_arr)) {
+ foreach ($addons_arr as $p) {
+ if (!in_array($p, $installed_arr)) {
+ self::install($p);
+ }
+ }
+ }
+
+ self::loadHooks();
+
+ return;
+ }
+
/**
* @brief uninstalls an addon.
*
*/
public static function registerHook($hook, $file, $function, $priority = 0)
{
- $file = str_replace(get_app()->get_basepath() . DIRECTORY_SEPARATOR, '', $file);
+ $file = str_replace(self::getApp()->get_basepath() . DIRECTORY_SEPARATOR, '', $file);
$condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
$exists = DBA::exists('hook', $condition);
*/
public static function unregisterHook($hook, $file, $function)
{
- $relative_file = str_replace(get_app()->get_basepath() . DIRECTORY_SEPARATOR, '', $file);
+ $relative_file = str_replace(self::getApp()->get_basepath() . DIRECTORY_SEPARATOR, '', $file);
// This here is only needed for fixing a problem that existed on the develop branch
$condition = ['hook' => $hook, 'file' => $file, 'function' => $function];
*/
public static function loadHooks()
{
- $a = get_app();
+ $a = self::getApp();
$a->hooks = [];
$r = DBA::select('hook', ['hook', 'file', 'function'], [], ['order' => ['priority' => 'desc', 'file']]);
*/
public static function forkHooks($priority, $name, $data = null)
{
- $a = get_app();
+ $a = self::getApp();
if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
foreach ($a->hooks[$name] as $hook) {
*/
public static function callHooks($name, &$data = null)
{
- $a = get_app();
+ $a = self::getApp();
if (is_array($a->hooks) && array_key_exists($name, $a->hooks)) {
foreach ($a->hooks[$name] as $hook) {
*/
public static function isApp($name)
{
- $a = get_app();
+ $a = self::getApp();
if (is_array($a->hooks) && (array_key_exists('app_menu', $a->hooks))) {
foreach ($a->hooks['app_menu'] as $hook) {
*/
public static function getInfo($addon)
{
- $a = get_app();
+ $a = self::getApp();
$info = [
'name' => $addon,
public static function init()
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return;
}
public static function load($family = "config")
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return;
}
public static function get($family, $key, $default_value = null, $refresh = false)
{
// Database isn't ready or populated yet, fallback to file config
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return self::getApp()->getConfigValue($family, $key, $default_value);
}
public static function set($family, $key, $value)
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return false;
}
public static function delete($family, $key)
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return false;
}
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
- if ($a->mode === App::MODE_INSTALL) {
+ if (App\Mode::isInstall()) {
throw new RuntimeException('Friendica isn\'t properly installed yet.');
}
$this->out('Options: ' . var_export($this->options, true));
}
- if (!($a->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
$this->out('Database isn\'t ready or populated yet, database cache won\'t be available');
}
throw new CommandArgsException('Too many arguments');
}
- if (!($a->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
$this->out('Database isn\'t ready or populated yet, showing file config only');
}
if (count($this->args) == 0) {
Core\Config::load();
- if (Core\Config::get('system', 'config_adapter') == 'jit' && $a->mode & App::MODE_DBCONFIGAVAILABLE) {
+ if (Core\Config::get('system', 'config_adapter') == 'jit' && App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
$this->out('Warning: The JIT (Just In Time) Config adapter doesn\'t support loading the entire configuration, showing file config only');
}
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
- if ($a->isInstallMode()) {
+ if (App\Mode::isInstall()) {
throw new \RuntimeException('Database isn\'t ready or populated yet');
}
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
- if ($a->isInstallMode()) {
+ if (App\Mode::isInstall()) {
throw new RuntimeException('Database isn\'t ready or populated yet');
}
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
- if ($a->isInstallMode()) {
+ if (App\Mode::isInstall()) {
throw new \RuntimeException('Database isn\'t ready or populated yet');
}
throw new \Asika\SimpleConsole\CommandArgsException('Too many arguments');
}
- if ($a->isInstallMode()) {
+ if (App\Mode::isInstall()) {
throw new RuntimeException('Database isn\'t ready or populated yet');
}
return 0;
}
- if ($a->isInstallMode()) {
+ if (App\Mode::isInstall()) {
throw new \RuntimeException('Database isn\'t ready or populated yet');
}
public static function init($uid)
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return;
}
public static function load($uid, $family)
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return;
}
public static function get($uid, $family, $key, $default_value = null, $refresh = false)
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return;
}
public static function set($uid, $family, $key, $value)
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return false;
}
public static function delete($uid, $family, $key)
{
// Database isn't ready or populated yet
- if (!(self::getApp()->mode & App::MODE_DBCONFIGAVAILABLE)) {
+ if (!App\Mode::has(App\Mode::DBCONFIGAVAILABLE)) {
return false;
}
}
/**
- * @brief
+ * @brief Switches existing contacts to ActivityPub
*
- * @param $cid
+ * @param integer $cid Contact ID
* @param integer $uid User ID
- * @param $url
+ * @param string $url Profile URL
*/
private static function switchContact($cid, $uid, $url)
{
return;
}
- logger('Switch contact ' . $cid . ' (' . $profile['url'] . ') for user ' . $uid . ' from OStatus to ActivityPub');
+ logger('Switch contact ' . $cid . ' (' . $profile['url'] . ') for user ' . $uid . ' to ActivityPub');
$photo = $profile['photo'];
unset($profile['photo']);
Contact::updateAvatar($photo, $uid, $cid);
- /// @todo Send a new follow request to be sure that the connection still exists
+ // Send a new follow request to be sure that the connection still exists
+ if (($uid != 0) && DBA::exists('contact', ['id' => $cid, 'rel' => [Contact::SHARING, Contact::FRIEND]])) {
+ ActivityPub\Transmitter::sendActivity('Follow', $profile['url'], $uid);
+ logger('Send a new follow request to ' . $profile['url'] . ' for user ' . $uid, LOGGER_DEBUG);
+ }
}
/**