- *
- * @deprecated 2019.06 - use BaseURL->getHostname() instead
- */
- public function getHostName()
- {
- return $this->baseURL->getHostname();
- }
-
- /**
- * Returns the sub-path of the full URL
- *
- * @return string
- *
- * @deprecated 2019.06 - use BaseURL->getUrlPath() instead
- */
- public function getURLPath()
- {
- return $this->baseURL->getUrlPath();
- }
-
- /**
- * Initializes App->page['htmlhead'].
- *
- * Includes:
- * - Page title
- * - Favicons
- * - Registered stylesheets (through App->registerStylesheet())
- * - Infinite scroll data
- * - head.tpl template
- */
- public function initHead()
- {
- $interval = ((local_user()) ? Core\PConfig::get(local_user(), 'system', 'update_interval') : 40000);
-
- // If the update is 'deactivated' set it to the highest integer number (~24 days)
- if ($interval < 0) {
- $interval = 2147483647;
- }
-
- if ($interval < 10000) {
- $interval = 40000;
- }
-
- // Default title: current module called
- if (empty($this->page['title']) && $this->module) {
- $this->page['title'] = ucfirst($this->module);
- }
-
- // Prepend the sitename to the page title
- $this->page['title'] = $this->config->get('config', 'sitename', '') . (!empty($this->page['title']) ? ' | ' . $this->page['title'] : '');
-
- if (!empty(Core\Renderer::$theme['stylesheet'])) {
- $stylesheet = Core\Renderer::$theme['stylesheet'];
- } else {
- $stylesheet = $this->getCurrentThemeStylesheetPath();
- }
-
- $this->registerStylesheet($stylesheet);
-
- $shortcut_icon = $this->config->get('system', 'shortcut_icon');
- if ($shortcut_icon == '') {
- $shortcut_icon = 'images/friendica-32.png';
- }
-
- $touch_icon = $this->config->get('system', 'touch_icon');
- if ($touch_icon == '') {
- $touch_icon = 'images/friendica-128.png';
- }
-
- Core\Hook::callAll('head', $this->page['htmlhead']);
-
- $tpl = Core\Renderer::getMarkupTemplate('head.tpl');
- /* put the head template at the beginning of page['htmlhead']
- * since the code added by the modules frequently depends on it
- * being first
- */
- $this->page['htmlhead'] = Core\Renderer::replaceMacros($tpl, [
- '$local_user' => local_user(),
- '$generator' => 'Friendica' . ' ' . FRIENDICA_VERSION,
- '$delitem' => Core\L10n::t('Delete this item?'),
- '$update_interval' => $interval,
- '$shortcut_icon' => $shortcut_icon,
- '$touch_icon' => $touch_icon,
- '$block_public' => intval($this->config->get('system', 'block_public')),
- '$stylesheets' => $this->stylesheets,
- ]) . $this->page['htmlhead'];
- }
-
- /**
- * Initializes App->page['footer'].
- *
- * Includes:
- * - Javascript homebase
- * - Mobile toggle link
- * - Registered footer scripts (through App->registerFooterScript())
- * - footer.tpl template
- */
- public function initFooter()
- {
- // If you're just visiting, let javascript take you home
- if (!empty($_SESSION['visitor_home'])) {
- $homebase = $_SESSION['visitor_home'];
- } elseif (local_user()) {
- $homebase = 'profile/' . $this->user['nickname'];
- }
-
- if (isset($homebase)) {
- $this->page['footer'] .= '<script>var homebase="' . $homebase . '";</script>' . "\n";
- }
-
- /*
- * Add a "toggle mobile" link if we're using a mobile device
- */
- if ($this->is_mobile || $this->is_tablet) {
- if (isset($_SESSION['show-mobile']) && !$_SESSION['show-mobile']) {
- $link = 'toggle_mobile?address=' . urlencode(curPageURL());
- } else {
- $link = 'toggle_mobile?off=1&address=' . urlencode(curPageURL());
- }
- $this->page['footer'] .= Core\Renderer::replaceMacros(Core\Renderer::getMarkupTemplate("toggle_mobile_footer.tpl"), [
- '$toggle_link' => $link,
- '$toggle_text' => Core\L10n::t('toggle mobile')
- ]);
- }
-
- Core\Hook::callAll('footer', $this->page['footer']);
-
- $tpl = Core\Renderer::getMarkupTemplate('footer.tpl');
- $this->page['footer'] = Core\Renderer::replaceMacros($tpl, [
- '$footerScripts' => $this->footerScripts,
- ]) . $this->page['footer'];
- }
-
- /**
- * @brief Removes the base url from an url. This avoids some mixed content problems.
- *
- * @param string $origURL
- *
- * @return string The cleaned url
- * @throws InternalServerErrorException
- */
- public function removeBaseURL($origURL)
- {
- // Remove the hostname from the url if it is an internal link
- $nurl = Util\Strings::normaliseLink($origURL);
- $base = Util\Strings::normaliseLink($this->getBaseURL());
- $url = str_replace($base . '/', '', $nurl);
-
- // if it is an external link return the orignal value
- if ($url == Util\Strings::normaliseLink($origURL)) {
- return $origURL;
- } else {
- return $url;
- }
- }
-
- /**
- * Returns the current UserAgent as a String
- *
- * @return string the UserAgent as a String
- * @throws InternalServerErrorException
- */
- public function getUserAgent()
- {
- return
- FRIENDICA_PLATFORM . " '" .
- FRIENDICA_CODENAME . "' " .
- FRIENDICA_VERSION . '-' .
- DB_UPDATE_VERSION . '; ' .
- $this->getBaseURL();
- }
-
- /**
- * Checks, if the call is from the Friendica App
- *
- * Reason:
- * The friendica client has problems with the GUID in the notify. this is some workaround
- */
- private function checkFriendicaApp()
- {
- // Friendica-Client
- $this->isFriendicaApp = isset($_SERVER['HTTP_USER_AGENT']) && $_SERVER['HTTP_USER_AGENT'] == 'Apache-HttpClient/UNAVAILABLE (java 1.4)';
- }
-
- /**
- * Is the call via the Friendica app? (not a "normale" call)
- *
- * @return bool true if it's from the Friendica app
- */
- public function isFriendicaApp()
- {
- return $this->isFriendicaApp;
- }
-
- /**
- * @brief Checks if the site is called via a backend process
- *
- * This isn't a perfect solution. But we need this check very early.
- * So we cannot wait until the modules are loaded.
- *
- * @param string $module
- * @return bool
- */
- private function checkBackend($module) {
- static $backends = [
- '_well_known',
- 'api',
- 'dfrn_notify',
- 'feed',
- 'fetch',
- 'followers',
- 'following',
- 'hcard',
- 'hostxrd',
- 'inbox',
- 'manifest',
- 'nodeinfo',
- 'noscrape',
- 'objects',
- 'outbox',
- 'poco',
- 'post',
- 'proxy',
- 'pubsub',
- 'pubsubhubbub',
- 'receive',
- 'rsd_xml',
- 'salmon',
- 'statistics_json',
- 'xrd',
- ];
-
- // Check if current module is in backend or backend flag is set
- return in_array($module, $backends);
- }
-
- /**
- * Returns true, if the call is from a backend node (f.e. from a worker)
- *
- * @return bool Is it a known backend?
- */
- public function isBackend()
- {
- return $this->isBackend;
- }
-
- /**
- * @brief Checks if the maximum number of database processes is reached
- *
- * @return bool Is the limit reached?
- */
- public function isMaxProcessesReached()
- {
- // Deactivated, needs more investigating if this check really makes sense
- return false;
-
- /*
- * Commented out to suppress static analyzer issues
- *
- if ($this->is_backend()) {
- $process = 'backend';
- $max_processes = $this->config->get('system', 'max_processes_backend');
- if (intval($max_processes) == 0) {
- $max_processes = 5;
- }
- } else {
- $process = 'frontend';
- $max_processes = $this->config->get('system', 'max_processes_frontend');
- if (intval($max_processes) == 0) {
- $max_processes = 20;
- }
- }
-
- $processlist = DBA::processlist();
- if ($processlist['list'] != '') {
- Core\Logger::log('Processcheck: Processes: ' . $processlist['amount'] . ' - Processlist: ' . $processlist['list'], Core\Logger::DEBUG);
-
- if ($processlist['amount'] > $max_processes) {
- Core\Logger::log('Processcheck: Maximum number of processes for ' . $process . ' tasks (' . $max_processes . ') reached.', Core\Logger::DEBUG);
- return true;
- }
- }
- return false;
- */
- }
-
- /**
- * @brief Checks if the minimal memory is reached
- *
- * @return bool Is the memory limit reached?
- * @throws InternalServerErrorException
- */
- public function isMinMemoryReached()
- {
- $min_memory = $this->config->get('system', 'min_memory', 0);
- if ($min_memory == 0) {
- return false;
- }
-
- if (!is_readable('/proc/meminfo')) {
- return false;
- }
-
- $memdata = explode("\n", file_get_contents('/proc/meminfo'));
-
- $meminfo = [];
- foreach ($memdata as $line) {
- $data = explode(':', $line);
- if (count($data) != 2) {
- continue;
- }
- list($key, $val) = $data;
- $meminfo[$key] = (int) trim(str_replace('kB', '', $val));
- $meminfo[$key] = (int) ($meminfo[$key] / 1024);
- }
-
- if (!isset($meminfo['MemFree'])) {
- return false;
- }
-
- $free = $meminfo['MemFree'];
-
- $reached = ($free < $min_memory);
-
- if ($reached) {
- Core\Logger::log('Minimal memory reached: ' . $free . '/' . $meminfo['MemTotal'] . ' - limit ' . $min_memory, Core\Logger::DEBUG);
- }
-
- return $reached;
- }
-
- /**
- * @brief Checks if the maximum load is reached
- *
- * @return bool Is the load reached?
- * @throws InternalServerErrorException
- */
- public function isMaxLoadReached()
- {
- if ($this->isBackend()) {
- $process = 'backend';
- $maxsysload = intval($this->config->get('system', 'maxloadavg'));
- if ($maxsysload < 1) {
- $maxsysload = 50;
- }
- } else {
- $process = 'frontend';
- $maxsysload = intval($this->config->get('system', 'maxloadavg_frontend'));
- if ($maxsysload < 1) {
- $maxsysload = 50;
- }
- }
-
- $load = Core\System::currentLoad();
- if ($load) {
- if (intval($load) > $maxsysload) {
- Core\Logger::log('system: load ' . $load . ' for ' . $process . ' tasks (' . $maxsysload . ') too high.');
- return true;
- }
- }
- return false;
- }
-
- /**
- * Executes a child process with 'proc_open'
- *
- * @param string $command The command to execute
- * @param array $args Arguments to pass to the command ( [ 'key' => value, 'key2' => value2, ... ]
- * @throws InternalServerErrorException