Merge pull request #11660 from Quix0r/fixes/more-type-hints-003

More type-hints - Batch 003
This commit is contained in:
Hypolite Petovan 2022-06-20 21:53:17 -04:00 committed by GitHub
commit d2ca812647
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
31 changed files with 500 additions and 417 deletions

View file

@ -47,7 +47,7 @@ function fbrowser_content(App $a)
} }
// Needed to match the correct template in a module that uses a different theme than the user/site/default // Needed to match the correct template in a module that uses a different theme than the user/site/default
$theme = Strings::sanitizeFilePathItem($_GET['theme'] ?? null); $theme = Strings::sanitizeFilePathItem($_GET['theme'] ?? '');
if ($theme && is_file("view/theme/$theme/config.php")) { if ($theme && is_file("view/theme/$theme/config.php")) {
$a->setCurrentTheme($theme); $a->setCurrentTheme($theme);
} }

View file

@ -187,7 +187,7 @@ function photos_post(App $a)
} }
if (DI::args()->getArgc() > 3 && DI::args()->getArgv()[2] === 'album') { if (DI::args()->getArgc() > 3 && DI::args()->getArgv()[2] === 'album') {
if (!Strings::isHex(DI::args()->getArgv()[3])) { if (!Strings::isHex(DI::args()->getArgv()[3] ?? '')) {
DI::baseUrl()->redirect('photos/' . $user['nickname'] . '/album'); DI::baseUrl()->redirect('photos/' . $user['nickname'] . '/album');
} }
$album = hex2bin(DI::args()->getArgv()[3]); $album = hex2bin(DI::args()->getArgv()[3]);
@ -892,7 +892,7 @@ function photos_content(App $a)
return; return;
} }
$selname = Strings::isHex($datum) ? hex2bin($datum) : ''; $selname = (!is_null($datum) && Strings::isHex($datum)) ? hex2bin($datum) : '';
$albumselect = ''; $albumselect = '';
@ -954,7 +954,7 @@ function photos_content(App $a)
// Display a single photo album // Display a single photo album
if ($datatype === 'album') { if ($datatype === 'album') {
// if $datum is not a valid hex, redirect to the default page // if $datum is not a valid hex, redirect to the default page
if (!Strings::isHex($datum)) { if (is_null($datum) || !Strings::isHex($datum)) {
DI::baseUrl()->redirect('photos/' . $user['nickname']. '/album'); DI::baseUrl()->redirect('photos/' . $user['nickname']. '/album');
} }
$album = hex2bin($datum); $album = hex2bin($datum);

View file

@ -116,8 +116,7 @@ HELP;
/** /**
* Lists plugins * Lists plugins
* *
* @return int Return code of this command * @return int|bool Return code of this command, false on error (?)
*
* @throws \Exception * @throws \Exception
*/ */
private function list() private function list()
@ -165,10 +164,9 @@ HELP;
* Enables an addon * Enables an addon
* *
* @return int Return code of this command * @return int Return code of this command
*
* @throws \Exception * @throws \Exception
*/ */
private function enable() private function enable(): int
{ {
$addonname = $this->getArgument(1); $addonname = $this->getArgument(1);
@ -190,10 +188,9 @@ HELP;
* Disables an addon * Disables an addon
* *
* @return int Return code of this command * @return int Return code of this command
*
* @throws \Exception * @throws \Exception
*/ */
private function disable() private function disable(): int
{ {
$addonname = $this->getArgument(1); $addonname = $this->getArgument(1);

View file

@ -124,7 +124,7 @@ class Addon
* @return void * @return void
* @throws \Exception * @throws \Exception
*/ */
public static function uninstall($addon) public static function uninstall(string $addon)
{ {
$addon = Strings::sanitizeFilePathItem($addon); $addon = Strings::sanitizeFilePathItem($addon);
@ -149,7 +149,7 @@ class Addon
* @return bool * @return bool
* @throws \Exception * @throws \Exception
*/ */
public static function install($addon) public static function install(string $addon): bool
{ {
$addon = Strings::sanitizeFilePathItem($addon); $addon = Strings::sanitizeFilePathItem($addon);
@ -185,6 +185,8 @@ class Addon
/** /**
* reload all updated addons * reload all updated addons
*
* @return void
*/ */
public static function reload() public static function reload()
{ {
@ -222,7 +224,7 @@ class Addon
* @return array with the addon information * @return array with the addon information
* @throws \Exception * @throws \Exception
*/ */
public static function getInfo($addon) public static function getInfo(string $addon): array
{ {
$addon = Strings::sanitizeFilePathItem($addon); $addon = Strings::sanitizeFilePathItem($addon);
@ -287,7 +289,7 @@ class Addon
* @param string $addon * @param string $addon
* @return boolean * @return boolean
*/ */
public static function isEnabled($addon) public static function isEnabled(string $addon): bool
{ {
return in_array($addon, self::$addons); return in_array($addon, self::$addons);
} }
@ -297,7 +299,7 @@ class Addon
* *
* @return array * @return array
*/ */
public static function getEnabledList() public static function getEnabledList(): array
{ {
return self::$addons; return self::$addons;
} }
@ -308,7 +310,7 @@ class Addon
* @return array * @return array
* @throws \Exception * @throws \Exception
*/ */
public static function getVisibleList() public static function getVisibleList(): array
{ {
$visible_addons = []; $visible_addons = [];
$stmt = DBA::select('addon', ['name'], ['hidden' => false, 'installed' => true]); $stmt = DBA::select('addon', ['name'], ['hidden' => false, 'installed' => true]);

View file

@ -49,6 +49,8 @@ class Hook
/** /**
* Load hooks * Load hooks
*
* @return void
*/ */
public static function loadHooks() public static function loadHooks()
{ {
@ -69,8 +71,9 @@ class Hook
* @param string $hook * @param string $hook
* @param string $file * @param string $file
* @param string $function * @param string $function
* @return void
*/ */
public static function add($hook, $file, $function) public static function add(string $hook, string $file, string $function)
{ {
if (!array_key_exists($hook, self::$hooks)) { if (!array_key_exists($hook, self::$hooks)) {
self::$hooks[$hook] = []; self::$hooks[$hook] = [];
@ -90,7 +93,7 @@ class Hook
* @return mixed|bool * @return mixed|bool
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function register($hook, $file, $function, $priority = 0) public static function register(string $hook, string $file, string $function, int $priority = 0)
{ {
$file = str_replace(DI::app()->getBasePath() . DIRECTORY_SEPARATOR, '', $file); $file = str_replace(DI::app()->getBasePath() . DIRECTORY_SEPARATOR, '', $file);
@ -111,7 +114,7 @@ class Hook
* @return boolean * @return boolean
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function unregister($hook, $file, $function) public static function unregister(string $hook, string $file, string $function): bool
{ {
$relative_file = str_replace(DI::app()->getBasePath() . DIRECTORY_SEPARATOR, '', $file); $relative_file = str_replace(DI::app()->getBasePath() . DIRECTORY_SEPARATOR, '', $file);
@ -120,8 +123,8 @@ class Hook
self::delete($condition); self::delete($condition);
$condition = ['hook' => $hook, 'file' => $relative_file, 'function' => $function]; $condition = ['hook' => $hook, 'file' => $relative_file, 'function' => $function];
$result = self::delete($condition);
return $result; return self::delete($condition);
} }
/** /**
@ -130,7 +133,7 @@ class Hook
* @param string $name Name of the hook * @param string $name Name of the hook
* @return array * @return array
*/ */
public static function getByName($name) public static function getByName(string $name): array
{ {
$return = []; $return = [];
@ -149,9 +152,10 @@ class Hook
* @param integer $priority of the hook * @param integer $priority of the hook
* @param string $name of the hook to call * @param string $name of the hook to call
* @param mixed $data to transmit to the callback handler * @param mixed $data to transmit to the callback handler
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function fork($priority, $name, $data = null) public static function fork(int $priority, string $name, $data = null)
{ {
if (array_key_exists($name, self::$hooks)) { if (array_key_exists($name, self::$hooks)) {
foreach (self::$hooks[$name] as $hook) { foreach (self::$hooks[$name] as $hook) {
@ -184,9 +188,10 @@ class Hook
* *
* @param string $name of the hook to call * @param string $name of the hook to call
* @param string|array &$data to transmit to the callback handler * @param string|array &$data to transmit to the callback handler
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function callAll($name, &$data = null) public static function callAll(string $name, &$data = null)
{ {
if (array_key_exists($name, self::$hooks)) { if (array_key_exists($name, self::$hooks)) {
foreach (self::$hooks[$name] as $hook) { foreach (self::$hooks[$name] as $hook) {
@ -202,9 +207,10 @@ class Hook
* @param string $name of the hook to call * @param string $name of the hook to call
* @param array $hook Hook data * @param array $hook Hook data
* @param string|array &$data to transmit to the callback handler * @param string|array &$data to transmit to the callback handler
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function callSingle(App $a, $name, $hook, &$data = null) public static function callSingle(App $a, string $name, array $hook, &$data = null)
{ {
// Don't run a theme's hook if the user isn't using the theme // Don't run a theme's hook if the user isn't using the theme
if (strpos($hook[0], 'view/theme/') !== false && strpos($hook[0], 'view/theme/' . $a->getCurrentTheme()) === false) { if (strpos($hook[0], 'view/theme/') !== false && strpos($hook[0], 'view/theme/' . $a->getCurrentTheme()) === false) {
@ -229,7 +235,7 @@ class Hook
* @param string $name Name of the addon * @param string $name Name of the addon
* @return boolean * @return boolean
*/ */
public static function isAddonApp($name) public static function isAddonApp(string $name): bool
{ {
$name = Strings::sanitizeFilePathItem($name); $name = Strings::sanitizeFilePathItem($name);
@ -253,7 +259,7 @@ class Hook
* @return bool * @return bool
* @throws \Exception * @throws \Exception
*/ */
public static function delete(array $condition) public static function delete(array $condition): bool
{ {
$result = DBA::delete('hook', $condition); $result = DBA::delete('hook', $condition);
@ -273,7 +279,7 @@ class Hook
* @return bool * @return bool
* @throws \Exception * @throws \Exception
*/ */
private static function insert(array $condition) private static function insert(array $condition): bool
{ {
$result = DBA::insert('hook', $condition); $result = DBA::insert('hook', $condition);

View file

@ -128,7 +128,7 @@ class L10n
private function setLangFromSession(IHandleSessions $session) private function setLangFromSession(IHandleSessions $session)
{ {
if ($session->get('language') !== $this->lang) { if ($session->get('language') !== $this->lang) {
$this->loadTranslationTable($session->get('language')); $this->loadTranslationTable($session->get('language') ?? $this->lang);
} }
} }
@ -140,10 +140,10 @@ class L10n
* Uses an App object shim since all the strings files refer to $a->strings * Uses an App object shim since all the strings files refer to $a->strings
* *
* @param string $lang language code to load * @param string $lang language code to load
* * @return void
* @throws \Exception * @throws \Exception
*/ */
private function loadTranslationTable($lang) private function loadTranslationTable(string $lang)
{ {
$lang = Strings::sanitizeFilePathItem($lang); $lang = Strings::sanitizeFilePathItem($lang);
@ -183,7 +183,7 @@ class L10n
* *
* @return string The two-letter language code * @return string The two-letter language code
*/ */
public static function detectLanguage(array $server, array $get, string $sysLang = self::DEFAULT) public static function detectLanguage(array $server, array $get, string $sysLang = self::DEFAULT): string
{ {
$lang_variable = $server['HTTP_ACCEPT_LANGUAGE'] ?? null; $lang_variable = $server['HTTP_ACCEPT_LANGUAGE'] ?? null;
@ -269,7 +269,7 @@ class L10n
* *
* @return string * @return string
*/ */
public function t($s, ...$vars) public function t(string $s, ...$vars): string
{ {
if (empty($s)) { if (empty($s)) {
return ''; return '';
@ -307,7 +307,7 @@ class L10n
* @return string * @return string
* @throws \Exception * @throws \Exception
*/ */
public function tt(string $singular, string $plural, int $count) public function tt(string $singular, string $plural, int $count): string
{ {
$s = null; $s = null;
@ -352,7 +352,7 @@ class L10n
* *
* @return bool * @return bool
*/ */
private function stringPluralSelectDefault($n) private function stringPluralSelectDefault(int $n): bool
{ {
return $n != 1; return $n != 1;
} }
@ -369,7 +369,7 @@ class L10n
* *
* @return array * @return array
*/ */
public static function getAvailableLanguages() public static function getAvailableLanguages(): array
{ {
$langs = []; $langs = [];
$strings_file_paths = glob('view/lang/*/strings.php'); $strings_file_paths = glob('view/lang/*/strings.php');
@ -391,10 +391,9 @@ class L10n
* Translate days and months names. * Translate days and months names.
* *
* @param string $s String with day or month name. * @param string $s String with day or month name.
*
* @return string Translated string. * @return string Translated string.
*/ */
public function getDay($s) public function getDay(string $s): string
{ {
$ret = str_replace(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'], $ret = str_replace(['Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sunday'],
[$this->t('Monday'), $this->t('Tuesday'), $this->t('Wednesday'), $this->t('Thursday'), $this->t('Friday'), $this->t('Saturday'), $this->t('Sunday')], [$this->t('Monday'), $this->t('Tuesday'), $this->t('Wednesday'), $this->t('Thursday'), $this->t('Friday'), $this->t('Saturday'), $this->t('Sunday')],
@ -411,10 +410,9 @@ class L10n
* Translate short days and months names. * Translate short days and months names.
* *
* @param string $s String with short day or month name. * @param string $s String with short day or month name.
*
* @return string Translated string. * @return string Translated string.
*/ */
public function getDayShort($s) public function getDayShort(string $s): string
{ {
$ret = str_replace(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'], $ret = str_replace(['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun'],
[$this->t('Mon'), $this->t('Tue'), $this->t('Wed'), $this->t('Thu'), $this->t('Fri'), $this->t('Sat'), $this->t('Sun')], [$this->t('Mon'), $this->t('Tue'), $this->t('Wed'), $this->t('Thu'), $this->t('Fri'), $this->t('Sat'), $this->t('Sun')],
@ -435,7 +433,7 @@ class L10n
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @hook poke_verbs pokes array * @hook poke_verbs pokes array
*/ */
public function getPokeVerbs() public function getPokeVerbs(): array
{ {
// index is present tense verb // index is present tense verb
// value is array containing past tense verb, translation of present, translation of past // value is array containing past tense verb, translation of present, translation of past
@ -461,7 +459,7 @@ class L10n
* @return static A new L10n instance * @return static A new L10n instance
* @throws \Exception * @throws \Exception
*/ */
public function withLang(string $lang) public function withLang(string $lang): L10n
{ {
// Don't create a new instance for same language // Don't create a new instance for same language
if ($lang === $this->lang) { if ($lang === $this->lang) {

View file

@ -71,7 +71,7 @@ class Renderer
* @return string * @return string
* @throws ServiceUnavailableException * @throws ServiceUnavailableException
*/ */
public static function replaceMacros(string $template, array $vars = []) public static function replaceMacros(string $template, array $vars = []): string
{ {
DI::profiler()->startRecording('rendering'); DI::profiler()->startRecording('rendering');

View file

@ -32,7 +32,7 @@ require_once 'boot.php';
*/ */
class Theme class Theme
{ {
public static function getAllowedList() public static function getAllowedList(): array
{ {
$allowed_themes_str = DI::config()->get('system', 'allowed_themes'); $allowed_themes_str = DI::config()->get('system', 'allowed_themes');
$allowed_themes_raw = explode(',', str_replace(' ', '', $allowed_themes_str)); $allowed_themes_raw = explode(',', str_replace(' ', '', $allowed_themes_str));
@ -69,7 +69,7 @@ class Theme
* @param string $theme the name of the theme * @param string $theme the name of the theme
* @return array * @return array
*/ */
public static function getInfo($theme) public static function getInfo(string $theme): array
{ {
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
@ -133,7 +133,7 @@ class Theme
* @return string * @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function getScreenshot($theme) public static function getScreenshot(string $theme): string
{ {
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
@ -146,7 +146,13 @@ class Theme
return DI::baseUrl() . '/images/blank.png'; return DI::baseUrl() . '/images/blank.png';
} }
public static function uninstall($theme) /**
* Uninstalls given theme name
*
* @param string $theme Name of theme
* @return bool true on success
*/
public static function uninstall(string $theme)
{ {
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
@ -167,10 +173,18 @@ class Theme
if ($key !== false) { if ($key !== false) {
unset($allowed_themes[$key]); unset($allowed_themes[$key]);
Theme::setAllowedList($allowed_themes); Theme::setAllowedList($allowed_themes);
return true;
} }
return false;
} }
public static function install($theme) /**
* Installs given theme name
*
* @param string $theme Name of theme
* @return bool true on success
*/
public static function install(string $theme): bool
{ {
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
@ -208,7 +222,7 @@ class Theme
* @return string Path to the file or empty string if the file isn't found * @return string Path to the file or empty string if the file isn't found
* @throws \Exception * @throws \Exception
*/ */
public static function getPathForFile($file) public static function getPathForFile(string $file): string
{ {
$a = DI::app(); $a = DI::app();
@ -237,10 +251,9 @@ class Theme
* Provide a sane default if nothing is chosen or the specified theme does not exist. * Provide a sane default if nothing is chosen or the specified theme does not exist.
* *
* @param string $theme Theme name * @param string $theme Theme name
*
* @return string * @return string
*/ */
public static function getStylesheetPath($theme) public static function getStylesheetPath(string $theme): string
{ {
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
@ -263,10 +276,10 @@ class Theme
/** /**
* Returns the path of the provided theme * Returns the path of the provided theme
* *
* @param $theme * @param string $theme Theme name
* @return string|null * @return string|null
*/ */
public static function getConfigFile($theme) public static function getConfigFile(string $theme)
{ {
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);
@ -285,11 +298,11 @@ class Theme
/** /**
* Returns the background color of the provided theme if available. * Returns the background color of the provided theme if available.
* *
* @param string $theme * @param string $theme Theme name
* @param int|null $uid Current logged-in user id * @param int|null $uid Current logged-in user id
* @return string|null * @return string|null
*/ */
public static function getBackgroundColor(string $theme, $uid = null) public static function getBackgroundColor(string $theme, int $uid = null)
{ {
$theme = Strings::sanitizeFilePathItem($theme); $theme = Strings::sanitizeFilePathItem($theme);

View file

@ -42,7 +42,7 @@ class DBA
*/ */
const NULL_DATETIME = '0001-01-01 00:00:00'; const NULL_DATETIME = '0001-01-01 00:00:00';
public static function connect() public static function connect(): bool
{ {
return DI::dba()->connect(); return DI::dba()->connect();
} }
@ -58,7 +58,7 @@ class DBA
/** /**
* Perform a reconnect of an existing database connection * Perform a reconnect of an existing database connection
*/ */
public static function reconnect() public static function reconnect(): bool
{ {
return DI::dba()->reconnect(); return DI::dba()->reconnect();
} }
@ -90,7 +90,7 @@ class DBA
* *
* @return string * @return string
*/ */
public static function serverInfo() public static function serverInfo(): string
{ {
return DI::dba()->serverInfo(); return DI::dba()->serverInfo();
} }
@ -101,7 +101,7 @@ class DBA
* @return string * @return string
* @throws \Exception * @throws \Exception
*/ */
public static function databaseName() public static function databaseName(): string
{ {
return DI::dba()->databaseName(); return DI::dba()->databaseName();
} }
@ -112,7 +112,7 @@ class DBA
* @param string $str * @param string $str
* @return string escaped string * @return string escaped string
*/ */
public static function escape($str) public static function escape(string $str): string
{ {
return DI::dba()->escape($str); return DI::dba()->escape($str);
} }
@ -122,7 +122,7 @@ class DBA
* *
* @return boolean is the database connected? * @return boolean is the database connected?
*/ */
public static function connected() public static function connected(): bool
{ {
return DI::dba()->connected(); return DI::dba()->connected();
} }
@ -138,7 +138,7 @@ class DBA
* @param string $sql An SQL string without the values * @param string $sql An SQL string without the values
* @return string The input SQL string modified if necessary. * @return string The input SQL string modified if necessary.
*/ */
public static function anyValueFallback($sql) public static function anyValueFallback(string $sql): string
{ {
return DI::dba()->anyValueFallback($sql); return DI::dba()->anyValueFallback($sql);
} }
@ -152,7 +152,7 @@ class DBA
* @param string $sql An SQL string without the values * @param string $sql An SQL string without the values
* @return string The input SQL string modified if necessary. * @return string The input SQL string modified if necessary.
*/ */
public static function cleanQuery($sql) public static function cleanQuery(string $sql): string
{ {
$search = ["\t", "\n", "\r", " "]; $search = ["\t", "\n", "\r", " "];
$replace = [' ', ' ', ' ', ' ']; $replace = [' ', ' ', ' ', ' '];
@ -169,7 +169,7 @@ class DBA
* @param array $args Parameter array * @param array $args Parameter array
* @return array universalized parameter array * @return array universalized parameter array
*/ */
public static function getParam($args) public static function getParam(array $args): array
{ {
unset($args[0]); unset($args[0]);
@ -192,7 +192,7 @@ class DBA
* @return bool|object statement object or result object * @return bool|object statement object or result object
* @throws \Exception * @throws \Exception
*/ */
public static function p($sql) public static function p(string $sql)
{ {
$params = self::getParam(func_get_args()); $params = self::getParam(func_get_args());
@ -208,8 +208,8 @@ class DBA
* @return boolean Was the query successfull? False is returned only if an error occurred * @return boolean Was the query successfull? False is returned only if an error occurred
* @throws \Exception * @throws \Exception
*/ */
public static function e($sql) { public static function e(string $sql): bool
{
$params = self::getParam(func_get_args()); $params = self::getParam(func_get_args());
return DI::dba()->e($sql, $params); return DI::dba()->e($sql, $params);
@ -220,11 +220,10 @@ class DBA
* *
* @param string|array $table Table name or array [schema => table] * @param string|array $table Table name or array [schema => table]
* @param array $condition array of fields for condition * @param array $condition array of fields for condition
*
* @return boolean Are there rows for that condition? * @return boolean Are there rows for that condition?
* @throws \Exception * @throws \Exception
*/ */
public static function exists($table, $condition) public static function exists($table, array $condition): bool
{ {
return DI::dba()->exists($table, $condition); return DI::dba()->exists($table, $condition);
} }
@ -238,7 +237,7 @@ class DBA
* @return array first row of query * @return array first row of query
* @throws \Exception * @throws \Exception
*/ */
public static function fetchFirst($sql) public static function fetchFirst(string $sql)
{ {
$params = self::getParam(func_get_args()); $params = self::getParam(func_get_args());
@ -250,7 +249,7 @@ class DBA
* *
* @return int Number of rows * @return int Number of rows
*/ */
public static function affectedRows() public static function affectedRows(): int
{ {
return DI::dba()->affectedRows(); return DI::dba()->affectedRows();
} }
@ -261,7 +260,7 @@ class DBA
* @param object Statement object * @param object Statement object
* @return int Number of columns * @return int Number of columns
*/ */
public static function columnCount($stmt) public static function columnCount($stmt): int
{ {
return DI::dba()->columnCount($stmt); return DI::dba()->columnCount($stmt);
} }
@ -271,7 +270,7 @@ class DBA
* @param PDOStatement|mysqli_result|mysqli_stmt Statement object * @param PDOStatement|mysqli_result|mysqli_stmt Statement object
* @return int Number of rows * @return int Number of rows
*/ */
public static function numRows($stmt) public static function numRows($stmt): int
{ {
return DI::dba()->numRows($stmt); return DI::dba()->numRows($stmt);
} }
@ -297,7 +296,7 @@ class DBA
* @return boolean was the insert successful? * @return boolean was the insert successful?
* @throws \Exception * @throws \Exception
*/ */
public static function insert($table, array $param, int $duplicate_mode = Database::INSERT_DEFAULT) public static function insert($table, array $param, int $duplicate_mode = Database::INSERT_DEFAULT): bool
{ {
return DI::dba()->insert($table, $param, $duplicate_mode); return DI::dba()->insert($table, $param, $duplicate_mode);
} }
@ -312,7 +311,7 @@ class DBA
* @return boolean was the insert successful? * @return boolean was the insert successful?
* @throws \Exception * @throws \Exception
*/ */
public static function replace($table, $param) public static function replace($table, array $param): bool
{ {
return DI::dba()->replace($table, $param); return DI::dba()->replace($table, $param);
} }
@ -322,7 +321,7 @@ class DBA
* *
* @return integer Last inserted id * @return integer Last inserted id
*/ */
public static function lastInsertId() public static function lastInsertId(): int
{ {
return DI::dba()->lastInsertId(); return DI::dba()->lastInsertId();
} }
@ -337,7 +336,7 @@ class DBA
* @return boolean was the lock successful? * @return boolean was the lock successful?
* @throws \Exception * @throws \Exception
*/ */
public static function lock($table) public static function lock($table): bool
{ {
return DI::dba()->lock($table); return DI::dba()->lock($table);
} }
@ -348,7 +347,7 @@ class DBA
* @return boolean was the unlock successful? * @return boolean was the unlock successful?
* @throws \Exception * @throws \Exception
*/ */
public static function unlock() public static function unlock(): bool
{ {
return DI::dba()->unlock(); return DI::dba()->unlock();
} }
@ -358,7 +357,7 @@ class DBA
* *
* @return boolean Was the command executed successfully? * @return boolean Was the command executed successfully?
*/ */
public static function transaction() public static function transaction(): bool
{ {
return DI::dba()->transaction(); return DI::dba()->transaction();
} }
@ -368,7 +367,7 @@ class DBA
* *
* @return boolean Was the command executed successfully? * @return boolean Was the command executed successfully?
*/ */
public static function commit() public static function commit(): bool
{ {
return DI::dba()->commit(); return DI::dba()->commit();
} }
@ -378,7 +377,7 @@ class DBA
* *
* @return boolean Was the command executed successfully? * @return boolean Was the command executed successfully?
*/ */
public static function rollback() public static function rollback(): bool
{ {
return DI::dba()->rollback(); return DI::dba()->rollback();
} }
@ -392,7 +391,7 @@ class DBA
* @return boolean was the delete successful? * @return boolean was the delete successful?
* @throws \Exception * @throws \Exception
*/ */
public static function delete($table, array $conditions, array $options = []) public static function delete($table, array $conditions, array $options = []): bool
{ {
return DI::dba()->delete($table, $conditions, $options); return DI::dba()->delete($table, $conditions, $options);
} }
@ -427,7 +426,7 @@ class DBA
* @return boolean was the update successfull? * @return boolean was the update successfull?
* @throws \Exception * @throws \Exception
*/ */
public static function update($table, array $fields, array $condition, $old_fields = [], array $params = []) public static function update($table, array $fields, array $condition, $old_fields = [], array $params = []): bool
{ {
return DI::dba()->update($table, $fields, $condition, $old_fields, $params); return DI::dba()->update($table, $fields, $condition, $old_fields, $params);
} }
@ -528,7 +527,7 @@ class DBA
* @param string|array $tables * @param string|array $tables
* @return string * @return string
*/ */
public static function buildTableString($tables) public static function buildTableString($tables): string
{ {
if (is_string($tables)) { if (is_string($tables)) {
$tables = [$tables]; $tables = [$tables];
@ -553,7 +552,7 @@ class DBA
* @param $identifier * @param $identifier
* @return string * @return string
*/ */
public static function quoteIdentifier($identifier) public static function quoteIdentifier(string $identifier): string
{ {
return '`' . str_replace('`', '``', $identifier) . '`'; return '`' . str_replace('`', '``', $identifier) . '`';
} }
@ -576,7 +575,7 @@ class DBA
* @param array $condition * @param array $condition
* @return string * @return string
*/ */
public static function buildCondition(array &$condition = []) public static function buildCondition(array &$condition = []): string
{ {
$condition = self::collapseCondition($condition); $condition = self::collapseCondition($condition);
@ -600,7 +599,7 @@ class DBA
* @param array $condition * @param array $condition
* @return array * @return array
*/ */
public static function collapseCondition(array $condition) public static function collapseCondition(array $condition): array
{ {
// Ensures an always true condition is returned // Ensures an always true condition is returned
if (count($condition) < 1) { if (count($condition) < 1) {
@ -675,7 +674,7 @@ class DBA
* @return array A collapsed condition * @return array A collapsed condition
* @see DBA::collapseCondition() for the condition array formats * @see DBA::collapseCondition() for the condition array formats
*/ */
public static function mergeConditions(array ...$conditions) public static function mergeConditions(array ...$conditions): array
{ {
if (count($conditions) == 1) { if (count($conditions) == 1) {
return current($conditions); return current($conditions);
@ -724,7 +723,7 @@ class DBA
* @param array $params * @param array $params
* @return string * @return string
*/ */
public static function buildParameter(array $params = []) public static function buildParameter(array $params = []): string
{ {
$groupby_string = ''; $groupby_string = '';
if (!empty($params['group_by'])) { if (!empty($params['group_by'])) {
@ -771,7 +770,7 @@ class DBA
* *
* @return array Data array * @return array Data array
*/ */
public static function toArray($stmt, $do_close = true, int $count = 0): array public static function toArray($stmt, bool $do_close = true, int $count = 0): array
{ {
return DI::dba()->toArray($stmt, $do_close, $count); return DI::dba()->toArray($stmt, $do_close, $count);
} }
@ -847,10 +846,9 @@ class DBA
* Checks if $array is a filled array with at least one entry. * Checks if $array is a filled array with at least one entry.
* *
* @param mixed $array A filled array with at least one entry * @param mixed $array A filled array with at least one entry
*
* @return boolean Whether $array is a filled array or an object with rows * @return boolean Whether $array is a filled array or an object with rows
*/ */
public static function isResult($array) public static function isResult($array): bool
{ {
return DI::dba()->isResult($array); return DI::dba()->isResult($array);
} }
@ -862,7 +860,7 @@ class DBA
* @param boolean $add_quotation add quotation marks for string values * @param boolean $add_quotation add quotation marks for string values
* @return void * @return void
*/ */
public static function escapeArray(&$arr, $add_quotation = false) public static function escapeArray(&$arr, bool $add_quotation = false)
{ {
DI::dba()->escapeArray($arr, $add_quotation); DI::dba()->escapeArray($arr, $add_quotation);
} }

View file

@ -26,6 +26,7 @@ use Friendica\Core\System;
use Friendica\Network\HTTPException\ServiceUnavailableException; use Friendica\Network\HTTPException\ServiceUnavailableException;
use Friendica\Util\DateTimeFormat; use Friendica\Util\DateTimeFormat;
use Friendica\Util\Profiler; use Friendica\Util\Profiler;
use InvalidArgumentException;
use mysqli; use mysqli;
use mysqli_result; use mysqli_result;
use mysqli_stmt; use mysqli_stmt;
@ -88,7 +89,12 @@ class Database
} }
} }
public function connect() /**
* Tries to connect to database
*
* @return bool Success
*/
public function connect(): bool
{ {
if (!is_null($this->connection) && $this->connected()) { if (!is_null($this->connection) && $this->connected()) {
return $this->connected; return $this->connected;
@ -255,7 +261,7 @@ class Database
* *
* @return string with either "pdo" or "mysqli" * @return string with either "pdo" or "mysqli"
*/ */
public function getDriver() public function getDriver(): string
{ {
return $this->driver; return $this->driver;
} }
@ -266,9 +272,9 @@ class Database
* This function discriminate between the deprecated mysql API and the current * This function discriminate between the deprecated mysql API and the current
* object-oriented mysqli API. Example of returned string: 5.5.46-0+deb8u1 * object-oriented mysqli API. Example of returned string: 5.5.46-0+deb8u1
* *
* @return string * @return string Database server information
*/ */
public function serverInfo() public function serverInfo(): string
{ {
if ($this->server_info == '') { if ($this->server_info == '') {
switch ($this->driver) { switch ($this->driver) {
@ -286,10 +292,10 @@ class Database
/** /**
* Returns the selected database name * Returns the selected database name
* *
* @return string * @return string Database name
* @throws \Exception * @throws \Exception
*/ */
public function databaseName() public function databaseName(): string
{ {
$ret = $this->p("SELECT DATABASE() AS `db`"); $ret = $this->p("SELECT DATABASE() AS `db`");
$data = $this->toArray($ret); $data = $this->toArray($ret);
@ -300,10 +306,10 @@ class Database
* Analyze a database query and log this if some conditions are met. * Analyze a database query and log this if some conditions are met.
* *
* @param string $query The database query that will be analyzed * @param string $query The database query that will be analyzed
* * @return void
* @throws \Exception * @throws \Exception
*/ */
private function logIndex($query) private function logIndex(string $query)
{ {
if (!$this->configCache->get('system', 'db_log_index')) { if (!$this->configCache->get('system', 'db_log_index')) {
@ -359,11 +365,10 @@ class Database
* Removes every not allowlisted character from the identifier string * Removes every not allowlisted character from the identifier string
* *
* @param string $identifier * @param string $identifier
*
* @return string sanitized identifier * @return string sanitized identifier
* @throws \Exception * @throws \Exception
*/ */
private function sanitizeIdentifier($identifier) private function sanitizeIdentifier(string $identifier): string
{ {
return preg_replace('/[^A-Za-z0-9_\-]+/', '', $identifier); return preg_replace('/[^A-Za-z0-9_\-]+/', '', $identifier);
} }
@ -383,11 +388,21 @@ class Database
} }
} }
public function isConnected() /**
* Returns connected flag
*
* @return bool Whether connection to database was success
*/
public function isConnected(): bool
{ {
return $this->connected; return $this->connected;
} }
/**
* Checks connection status
*
* @return bool Whether connection to database was success
*/
public function connected() public function connected()
{ {
$connected = false; $connected = false;
@ -424,7 +439,7 @@ class Database
* *
* @return string The input SQL string modified if necessary. * @return string The input SQL string modified if necessary.
*/ */
public function anyValueFallback($sql) public function anyValueFallback(string $sql): string
{ {
$server_info = $this->serverInfo(); $server_info = $this->serverInfo();
if (version_compare($server_info, '5.7.5', '<') || if (version_compare($server_info, '5.7.5', '<') ||
@ -442,7 +457,7 @@ class Database
* *
* @return string The replaced SQL query * @return string The replaced SQL query
*/ */
private function replaceParameters($sql, $args) private function replaceParameters(string $sql, array $args): string
{ {
$offset = 0; $offset = 0;
foreach ($args as $param => $value) { foreach ($args as $param => $value) {
@ -476,7 +491,7 @@ class Database
* @return bool|object statement object or result object * @return bool|object statement object or result object
* @throws \Exception * @throws \Exception
*/ */
public function p($sql) public function p(string $sql)
{ {
$this->profiler->startRecording('database'); $this->profiler->startRecording('database');
@ -741,8 +756,9 @@ class Database
* @return boolean Was the query successfull? False is returned only if an error occurred * @return boolean Was the query successfull? False is returned only if an error occurred
* @throws \Exception * @throws \Exception
*/ */
public function e($sql) public function e(string $sql): bool
{ {
$retval = false;
$this->profiler->startRecording('database_write'); $this->profiler->startRecording('database_write');
@ -810,7 +826,7 @@ class Database
* @return boolean Are there rows for that condition? * @return boolean Are there rows for that condition?
* @throws \Exception * @throws \Exception
*/ */
public function exists($table, $condition) public function exists($table, array $condition): bool
{ {
if (empty($table)) { if (empty($table)) {
return false; return false;
@ -850,10 +866,10 @@ class Database
* *
* @param string $sql SQL statement * @param string $sql SQL statement
* *
* @return array first row of query * @return array|bool first row of query or false on failure
* @throws \Exception * @throws \Exception
*/ */
public function fetchFirst($sql) public function fetchFirst(string $sql)
{ {
$params = DBA::getParam(func_get_args()); $params = DBA::getParam(func_get_args());
@ -875,7 +891,7 @@ class Database
* *
* @return int Number of rows * @return int Number of rows
*/ */
public function affectedRows() public function affectedRows(): int
{ {
return $this->affected_rows; return $this->affected_rows;
} }
@ -887,7 +903,7 @@ class Database
* *
* @return int Number of columns * @return int Number of columns
*/ */
public function columnCount($stmt) public function columnCount($stmt): int
{ {
if (!is_object($stmt)) { if (!is_object($stmt)) {
return 0; return 0;
@ -908,7 +924,7 @@ class Database
* *
* @return int Number of rows * @return int Number of rows
*/ */
public function numRows($stmt) public function numRows($stmt): int
{ {
if (!is_object($stmt)) { if (!is_object($stmt)) {
return 0; return 0;
@ -927,7 +943,7 @@ class Database
* *
* @param bool|PDOStatement|mysqli_stmt $stmt statement object * @param bool|PDOStatement|mysqli_stmt $stmt statement object
* *
* @return array|false current row * @return array|bool Current row or false on failure
*/ */
public function fetch($stmt) public function fetch($stmt)
{ {
@ -994,7 +1010,7 @@ class Database
* @return boolean was the insert successful? * @return boolean was the insert successful?
* @throws \Exception * @throws \Exception
*/ */
public function insert($table, array $param, int $duplicate_mode = self::INSERT_DEFAULT) public function insert($table, array $param, int $duplicate_mode = self::INSERT_DEFAULT): bool
{ {
if (empty($table) || empty($param)) { if (empty($table) || empty($param)) {
$this->logger->info('Table and fields have to be set'); $this->logger->info('Table and fields have to be set');
@ -1044,7 +1060,7 @@ class Database
* @return boolean was the insert successful? * @return boolean was the insert successful?
* @throws \Exception * @throws \Exception
*/ */
public function replace($table, array $param) public function replace($table, array $param): bool
{ {
if (empty($table) || empty($param)) { if (empty($table) || empty($param)) {
$this->logger->info('Table and fields have to be set'); $this->logger->info('Table and fields have to be set');
@ -1069,7 +1085,7 @@ class Database
* *
* @return integer Last inserted id * @return integer Last inserted id
*/ */
public function lastInsertId() public function lastInsertId(): int
{ {
switch ($this->driver) { switch ($this->driver) {
case self::PDO: case self::PDO:
@ -1092,7 +1108,7 @@ class Database
* @return boolean was the lock successful? * @return boolean was the lock successful?
* @throws \Exception * @throws \Exception
*/ */
public function lock($table) public function lock($table): bool
{ {
// See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
if ($this->driver == self::PDO) { if ($this->driver == self::PDO) {
@ -1126,7 +1142,7 @@ class Database
* @return boolean was the unlock successful? * @return boolean was the unlock successful?
* @throws \Exception * @throws \Exception
*/ */
public function unlock() public function unlock(): bool
{ {
// See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
$this->performCommit(); $this->performCommit();
@ -1177,7 +1193,12 @@ class Database
return true; return true;
} }
protected function performCommit() /**
* Performs the commit
*
* @return boolean Was the command executed successfully?
*/
protected function performCommit(): bool
{ {
switch ($this->driver) { switch ($this->driver) {
case self::PDO: case self::PDO:
@ -1199,7 +1220,7 @@ class Database
* *
* @return boolean Was the command executed successfully? * @return boolean Was the command executed successfully?
*/ */
public function commit() public function commit(): bool
{ {
if (!$this->performCommit()) { if (!$this->performCommit()) {
return false; return false;
@ -1213,7 +1234,7 @@ class Database
* *
* @return boolean Was the command executed successfully? * @return boolean Was the command executed successfully?
*/ */
public function rollback() public function rollback(): bool
{ {
$ret = false; $ret = false;
@ -1230,6 +1251,7 @@ class Database
$ret = $this->connection->rollback(); $ret = $this->connection->rollback();
break; break;
} }
$this->in_transaction = false; $this->in_transaction = false;
return $ret; return $ret;
} }
@ -1243,7 +1265,7 @@ class Database
* @return boolean was the delete successful? * @return boolean was the delete successful?
* @throws \Exception * @throws \Exception
*/ */
public function delete($table, array $conditions) public function delete($table, array $conditions): bool
{ {
if (empty($table) || empty($conditions)) { if (empty($table) || empty($conditions)) {
$this->logger->info('Table and conditions have to be set'); $this->logger->info('Table and conditions have to be set');
@ -1288,8 +1310,9 @@ class Database
* *
* @return boolean was the update successfull? * @return boolean was the update successfull?
* @throws \Exception * @throws \Exception
* @todo Implement "bool $update_on_duplicate" to avoid mixed type for $old_fields
*/ */
public function update($table, $fields, $condition, $old_fields = [], $params = []) public function update($table, array $fields, array $condition, $old_fields = [], array $params = [])
{ {
if (empty($table) || empty($fields) || empty($condition)) { if (empty($table) || empty($fields) || empty($condition)) {
$this->logger->info('Table, fields and condition have to be set'); $this->logger->info('Table, fields and condition have to be set');
@ -1354,7 +1377,7 @@ class Database
* @throws \Exception * @throws \Exception
* @see $this->select * @see $this->select
*/ */
public function selectFirst($table, array $fields = [], array $condition = [], $params = []) public function selectFirst($table, array $fields = [], array $condition = [], array $params = [])
{ {
$params['limit'] = 1; $params['limit'] = 1;
$result = $this->select($table, $fields, $condition, $params); $result = $this->select($table, $fields, $condition, $params);
@ -1390,9 +1413,9 @@ class Database
* *
* @param array $fields * @param array $fields
* @param array $options * @param array $options
* @return array * @return array Escaped fields
*/ */
private function escapeFields(array $fields, array $options) private function escapeFields(array $fields, array $options): array
{ {
// In the case of a "GROUP BY" we have to add all the ORDER fields to the fieldlist. // In the case of a "GROUP BY" we have to add all the ORDER fields to the fieldlist.
// This needs to done to apply the "ANY_VALUE(...)" treatment from below to them. // This needs to done to apply the "ANY_VALUE(...)" treatment from below to them.
@ -1490,7 +1513,7 @@ class Database
* @param array $condition Array of fields for condition * @param array $condition Array of fields for condition
* @param array $params Array of several parameters * @param array $params Array of several parameters
* *
* @return int * @return int Count of rows
* *
* Example: * Example:
* $table = "post"; * $table = "post";
@ -1502,10 +1525,10 @@ class Database
* $count = DBA::count($table, $condition); * $count = DBA::count($table, $condition);
* @throws \Exception * @throws \Exception
*/ */
public function count($table, array $condition = [], array $params = []) public function count($table, array $condition = [], array $params = []): int
{ {
if (empty($table)) { if (empty($table)) {
return false; throw new InvalidArgumentException('Parameter "table" cannot be empty.');
} }
$table_string = DBA::buildTableString($table); $table_string = DBA::buildTableString($table);
@ -1569,7 +1592,8 @@ class Database
* @param array $fields * @param array $fields
* @return array casted fields * @return array casted fields
*/ */
public function castFields(string $table, array $fields) { public function castFields(string $table, array $fields): array
{
// When there is no data, we don't need to do something // When there is no data, we don't need to do something
if (empty($fields)) { if (empty($fields)) {
return $fields; return $fields;
@ -1642,7 +1666,7 @@ class Database
* *
* @return string Error message ('' if no error) * @return string Error message ('' if no error)
*/ */
public function errorMessage() public function errorMessage(): string
{ {
return $this->error; return $this->error;
} }
@ -1729,7 +1753,7 @@ class Database
* @param string $name * @param string $name
* @return string content * @return string content
*/ */
public function getVariable(string $name) public function getVariable(string $name): string
{ {
$result = $this->fetchFirst("SHOW GLOBAL VARIABLES WHERE `Variable_name` = ?", $name); $result = $this->fetchFirst("SHOW GLOBAL VARIABLES WHERE `Variable_name` = ?", $name);
return $result['Value'] ?? null; return $result['Value'] ?? null;
@ -1742,7 +1766,7 @@ class Database
* *
* @return boolean Whether $array is a filled array or an object with rows * @return boolean Whether $array is a filled array or an object with rows
*/ */
public function isResult($array) public function isResult($array): bool
{ {
// It could be a return value from an update statement // It could be a return value from an update statement
if (is_bool($array)) { if (is_bool($array)) {
@ -1762,10 +1786,9 @@ class Database
* @param mixed $value Array value * @param mixed $value Array value
* @param string $key Array key * @param string $key Array key
* @param boolean $add_quotation add quotation marks for string values * @param boolean $add_quotation add quotation marks for string values
*
* @return void * @return void
*/ */
private function escapeArrayCallback(&$value, $key, $add_quotation) private function escapeArrayCallback(&$value, string $key, bool $add_quotation)
{ {
if (!$add_quotation) { if (!$add_quotation) {
if (is_bool($value)) { if (is_bool($value)) {
@ -1790,10 +1813,9 @@ class Database
* *
* @param mixed $arr Array with values to be escaped * @param mixed $arr Array with values to be escaped
* @param boolean $add_quotation add quotation marks for string values * @param boolean $add_quotation add quotation marks for string values
*
* @return void * @return void
*/ */
public function escapeArray(&$arr, $add_quotation = false) public function escapeArray(&$arr, bool $add_quotation = false)
{ {
array_walk($arr, [$this, 'escapeArrayCallback'], $add_quotation); array_walk($arr, [$this, 'escapeArrayCallback'], $add_quotation);
} }
@ -1801,10 +1823,11 @@ class Database
/** /**
* Replaces a string in the provided fields of the provided table * Replaces a string in the provided fields of the provided table
* *
* @param string $table_name * @param string $table_name Table name
* @param array $fields List of field names in the provided table * @param array $fields List of field names in the provided table
* @param string $search * @param string $search
* @param string $replace * @param string $replace
* @return void
* @throws \Exception * @throws \Exception
*/ */
public function replaceInTableFields(string $table_name, array $fields, string $search, string $replace) public function replaceInTableFields(string $table_name, array $fields, string $search, string $replace)

View file

@ -39,12 +39,12 @@ class View
* On first pass, defines DB_UPDATE_VERSION constant. * On first pass, defines DB_UPDATE_VERSION constant.
* *
* @see static/dbview.config.php * @see static/dbview.config.php
* @param boolean $with_addons_structure Whether to tack on addons additional tables
* @param string $basePath The base path of this application * @param string $basePath The base path of this application
* @param boolean $with_addons_structure Whether to tack on addons additional tables
* @return array * @return array
* @throws Exception * @throws Exception
*/ */
public static function definition($basePath = '', $with_addons_structure = true) public static function definition(string $basePath = '', bool $with_addons_structure = true): array
{ {
if (!self::$definition) { if (!self::$definition) {
if (empty($basePath)) { if (empty($basePath)) {
@ -75,6 +75,13 @@ class View
return $definition; return $definition;
} }
/**
* Creates a view
*
* @param bool $verbose Whether to show SQL statements
* @param bool $action Whether to execute SQL statements
* @return void
*/
public static function create(bool $verbose, bool $action) public static function create(bool $verbose, bool $action)
{ {
// Delete previously used views that aren't used anymore // Delete previously used views that aren't used anymore
@ -94,11 +101,17 @@ class View
$definition = self::definition(); $definition = self::definition();
foreach ($definition as $name => $structure) { foreach ($definition as $name => $structure) {
self::createview($name, $structure, $verbose, $action); self::createView($name, $structure, $verbose, $action);
} }
} }
public static function printStructure($basePath) /**
* Prints view structure
*
* @param string $basePath Base path
* @return void
*/
public static function printStructure(string $basePath)
{ {
$database = self::definition($basePath, false); $database = self::definition($basePath, false);
@ -112,12 +125,21 @@ class View
} }
} }
private static function createview($name, $structure, $verbose, $action) /**
* Creates view
*
* @param string $name Name of view
* @param array $structure Structure of view
* @param bool $verbose Whether to show SQL statements
* @param bool $action Whether to execute SQL statements
* @return bool Whether execution went fine
*/
private static function createView(string $name, array $structure, bool $verbose, bool $action): bool
{ {
$r = true; $r = true;
$sql_rows = []; $sql_rows = [];
foreach ($structure["fields"] as $fieldname => $origin) { foreach ($structure['fields'] as $fieldname => $origin) {
if (is_string($origin)) { if (is_string($origin)) {
$sql_rows[] = $origin . " AS `" . DBA::escape($fieldname) . "`"; $sql_rows[] = $origin . " AS `" . DBA::escape($fieldname) . "`";
} elseif (is_array($origin) && (sizeof($origin) == 2)) { } elseif (is_array($origin) && (sizeof($origin) == 2)) {
@ -159,7 +181,7 @@ class View
* @param string $view * @param string $view
* @return boolean "true" if it's a view * @return boolean "true" if it's a view
*/ */
private static function isView(string $view) private static function isView(string $view): bool
{ {
$status = DBA::selectFirst(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_TYPE'], $status = DBA::selectFirst(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_TYPE'],
['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_NAME' => $view]); ['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_NAME' => $view]);
@ -177,7 +199,7 @@ class View
* @param string $table * @param string $table
* @return boolean "true" if it's a table * @return boolean "true" if it's a table
*/ */
private static function isTable(string $table) private static function isTable(string $table): bool
{ {
$status = DBA::selectFirst(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_TYPE'], $status = DBA::selectFirst(['INFORMATION_SCHEMA' => 'TABLES'], ['TABLE_TYPE'],
['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_NAME' => $table]); ['TABLE_SCHEMA' => DBA::databaseName(), 'TABLE_NAME' => $table]);

View file

@ -190,7 +190,7 @@ class Status extends BaseFactory
*/ */
public function createFromMailId(int $id): \Friendica\Object\Api\Mastodon\Status public function createFromMailId(int $id): \Friendica\Object\Api\Mastodon\Status
{ {
$item = ActivityPub\Transmitter::ItemArrayFromMail($id, true); $item = ActivityPub\Transmitter::getItemArrayFromMail($id, true);
if (empty($item)) { if (empty($item)) {
$this->mstdnErrorFactory->RecordNotFound(); $this->mstdnErrorFactory->RecordNotFound();
} }

View file

@ -116,6 +116,7 @@ class APContact
* @return array profile array * @return array profile array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
* @todo Rewrite parameter $update to avoid true|false|null (boolean is binary, null adds a third case)
*/ */
public static function getByURL(string $url, $update = null): array public static function getByURL(string $url, $update = null): array
{ {

View file

@ -918,8 +918,11 @@ class GServer
return []; return [];
} }
$server = ['detection-method' => self::DETECT_NODEINFO_2, $server = [
'register_policy' => Register::CLOSED]; 'detection-method' => self::DETECT_NODEINFO_2,
'register_policy' => Register::CLOSED,
'platform' => 'unknown',
];
if (!empty($nodeinfo['openRegistrations'])) { if (!empty($nodeinfo['openRegistrations'])) {
$server['register_policy'] = Register::OPEN; $server['register_policy'] = Register::OPEN;

View file

@ -1841,13 +1841,13 @@ class Item
$parsed = parse_url($uri); $parsed = parse_url($uri);
// Remove the scheme to make sure that "https" and "http" doesn't make a difference // Remove the scheme to make sure that "https" and "http" doesn't make a difference
unset($parsed["scheme"]); unset($parsed['scheme']);
// Glue it together to be able to make a hash from it // Glue it together to be able to make a hash from it
$host_id = implode("/", $parsed); $host_id = implode('/', $parsed);
// Use a mixture of several hashes to provide some GUID like experience // Use a mixture of several hashes to provide some GUID like experience
return hash("crc32", $host) . '-'. hash('joaat', $host_id) . '-'. hash('fnv164', $host_id); return hash('crc32', $host) . '-'. hash('joaat', $host_id) . '-'. hash('fnv164', $host_id);
} }
/** /**
@ -1859,9 +1859,9 @@ class Item
* @return string * @return string
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function newURI($uid, $guid = "") public static function newURI(int $uid, string $guid = ''): string
{ {
if ($guid == "") { if ($guid == '') {
$guid = System::createUUID(); $guid = System::createUUID();
} }

View file

@ -1245,6 +1245,7 @@ class Processor
* perform a "follow" request * perform a "follow" request
* *
* @param array $activity * @param array $activity
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
@ -1296,8 +1297,8 @@ class Processor
/** /**
* Transmit pending events to the new follower * Transmit pending events to the new follower
* *
* @param integer $cid * @param integer $cid Contact id
* @param integer $uid * @param integer $uid User id
* @return void * @return void
*/ */
private static function transmitPendingEvents(int $cid, int $uid) private static function transmitPendingEvents(int $cid, int $uid)
@ -1340,6 +1341,7 @@ class Processor
* Delete the given profile * Delete the given profile
* *
* @param array $activity * @param array $activity
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function deletePerson(array $activity) public static function deletePerson(array $activity)
@ -1367,6 +1369,7 @@ class Processor
* Blocks the user by the contact * Blocks the user by the contact
* *
* @param array $activity * @param array $activity
* @return void
* @throws \Exception * @throws \Exception
*/ */
public static function blockAccount(array $activity) public static function blockAccount(array $activity)
@ -1390,6 +1393,7 @@ class Processor
* Unblocks the user by the contact * Unblocks the user by the contact
* *
* @param array $activity * @param array $activity
* @return void
* @throws \Exception * @throws \Exception
*/ */
public static function unblockAccount(array $activity) public static function unblockAccount(array $activity)

View file

@ -80,13 +80,13 @@ class Receiver
/** /**
* Checks incoming message from the inbox * Checks incoming message from the inbox
* *
* @param $body * @param string $body Body string
* @param $header * @param array $header Header lines
* @param integer $uid User ID * @param integer $uid User ID
* @return void
* @throws \Exception * @throws \Exception
* @todo Find type for $body/$header
*/ */
public static function processInbox($body, $header, int $uid) public static function processInbox(string $body, array $header, int $uid)
{ {
$activity = json_decode($body, true); $activity = json_decode($body, true);
if (empty($activity)) { if (empty($activity)) {
@ -96,9 +96,9 @@ class Receiver
$ldactivity = JsonLD::compact($activity); $ldactivity = JsonLD::compact($activity);
$actor = JsonLD::fetchElement($ldactivity, 'as:actor', '@id'); $actor = JsonLD::fetchElement($ldactivity, 'as:actor', '@id') ?? '';
$apcontact = APContact::getByURL($actor); $apcontact = APContact::getByURL($actor);
if (empty($apcontact)) { if (empty($apcontact)) {
Logger::notice('Unable to retrieve AP contact for actor - message is discarded', ['actor' => $actor]); Logger::notice('Unable to retrieve AP contact for actor - message is discarded', ['actor' => $actor]);
return; return;

View file

@ -103,12 +103,12 @@ class Transmitter
} }
/** /**
* Subscribe to a relay * Subscribe to a relay and updates contact on success
* *
* @param string $url Subscribe actor url * @param string $url Subscribe actor url
* @return bool success * @return bool success
*/ */
public static function sendRelayFollow(string $url) public static function sendRelayFollow(string $url): bool
{ {
$contact = Contact::getByURL($url); $contact = Contact::getByURL($url);
if (empty($contact)) { if (empty($contact)) {
@ -125,13 +125,13 @@ class Transmitter
} }
/** /**
* Unsubscribe from a relay * Unsubscribe from a relay and updates contact on success or forced
* *
* @param string $url Subscribe actor url * @param string $url Subscribe actor url
* @param bool $force Set the relay status as non follower even if unsubscribe hadn't worked * @param bool $force Set the relay status as non follower even if unsubscribe hadn't worked
* @return bool success * @return bool success
*/ */
public static function sendRelayUndoFollow(string $url, bool $force = false) public static function sendRelayUndoFollow(string $url, bool $force = false): bool
{ {
$contact = Contact::getByURL($url); $contact = Contact::getByURL($url);
if (empty($contact)) { if (empty($contact)) {
@ -139,6 +139,7 @@ class Transmitter
} }
$success = self::sendContactUndo($url, $contact['id'], 0); $success = self::sendContactUndo($url, $contact['id'], 0);
if ($success || $force) { if ($success || $force) {
Contact::update(['rel' => Contact::NOTHING], ['id' => $contact['id']]); Contact::update(['rel' => Contact::NOTHING], ['id' => $contact['id']]);
} }
@ -155,11 +156,10 @@ class Transmitter
* @param integer $page Page number * @param integer $page Page number
* @param string $requester URL of the requester * @param string $requester URL of the requester
* @param boolean $nocache Wether to bypass caching * @param boolean $nocache Wether to bypass caching
*
* @return array of owners * @return array of owners
* @throws \Exception * @throws \Exception
*/ */
public static function getContacts(array $owner, array $rel, string $module, int $page = null, string $requester = null, $nocache = false) public static function getContacts(array $owner, array $rel, string $module, int $page = null, string $requester = null, bool $nocache = false): array
{ {
if (empty($page)) { if (empty($page)) {
$cachekey = self::CACHEKEY_CONTACTS . $module . ':'. $owner['uid']; $cachekey = self::CACHEKEY_CONTACTS . $module . ':'. $owner['uid'];
@ -246,12 +246,11 @@ class Transmitter
* @param integer $page Page number * @param integer $page Page number
* @param string $requester URL of requesting account * @param string $requester URL of requesting account
* @param boolean $nocache Wether to bypass caching * @param boolean $nocache Wether to bypass caching
*
* @return array of posts * @return array of posts
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function getOutbox(array $owner, int $page = null, string $requester = '', $nocache = false) public static function getOutbox(array $owner, int $page = null, string $requester = '', bool $nocache = false): array
{ {
if (empty($page)) { if (empty($page)) {
$cachekey = self::CACHEKEY_OUTBOX . $owner['uid']; $cachekey = self::CACHEKEY_OUTBOX . $owner['uid'];
@ -274,15 +273,16 @@ class Transmitter
} }
} }
$condition = array_merge($condition, $condition = array_merge($condition, [
['uid' => $owner['uid'], 'uid' => $owner['uid'],
'author-id' => Contact::getIdForURL($owner['url'], 0, false), 'author-id' => Contact::getIdForURL($owner['url'], 0, false),
'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT], 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT],
'network' => Protocol::FEDERATED, 'network' => Protocol::FEDERATED,
'parent-network' => Protocol::FEDERATED, 'parent-network' => Protocol::FEDERATED,
'origin' => true, 'origin' => true,
'deleted' => false, 'deleted' => false,
'visible' => true]); 'visible' => true
]);
$count = Post::count($condition); $count = Post::count($condition);
@ -340,7 +340,7 @@ class Transmitter
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function getFeatured(array $owner, int $page = null, $nocache = false) public static function getFeatured(array $owner, int $page = null, bool $nocache = false): array
{ {
if (empty($page)) { if (empty($page)) {
$cachekey = self::CACHEKEY_FEATURED . $owner['uid']; $cachekey = self::CACHEKEY_FEATURED . $owner['uid'];
@ -355,8 +355,8 @@ class Transmitter
$condition = ["`uri-id` IN (SELECT `uri-id` FROM `collection-view` WHERE `cid` = ? AND `type` = ?)", $condition = ["`uri-id` IN (SELECT `uri-id` FROM `collection-view` WHERE `cid` = ? AND `type` = ?)",
$owner_cid, Post\Collection::FEATURED]; $owner_cid, Post\Collection::FEATURED];
$condition = DBA::mergeConditions($condition, $condition = DBA::mergeConditions($condition, [
['uid' => $owner['uid'], 'uid' => $owner['uid'],
'author-id' => $owner_cid, 'author-id' => $owner_cid,
'private' => [Item::PUBLIC, Item::UNLISTED], 'private' => [Item::PUBLIC, Item::UNLISTED],
'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT], 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT],
@ -364,7 +364,8 @@ class Transmitter
'parent-network' => Protocol::FEDERATED, 'parent-network' => Protocol::FEDERATED,
'origin' => true, 'origin' => true,
'deleted' => false, 'deleted' => false,
'visible' => true]); 'visible' => true
]);
$count = Post::count($condition); $count = Post::count($condition);
@ -418,11 +419,13 @@ class Transmitter
* *
* @return array with service data * @return array with service data
*/ */
private static function getService() private static function getService(): array
{ {
return ['type' => 'Service', return [
'type' => 'Service',
'name' => FRIENDICA_PLATFORM . " '" . FRIENDICA_CODENAME . "' " . FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION, 'name' => FRIENDICA_PLATFORM . " '" . FRIENDICA_CODENAME . "' " . FRIENDICA_VERSION . '-' . DB_UPDATE_VERSION,
'url' => DI::baseUrl()->get()]; 'url' => DI::baseUrl()->get()
];
} }
/** /**
@ -537,7 +540,7 @@ class Transmitter
* @return array * @return array
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function getDeletedUser($username) public static function getDeletedUser(string $username): array
{ {
return [ return [
'@context' => ActivityPub::CONTEXT, '@context' => ActivityPub::CONTEXT,
@ -559,7 +562,7 @@ class Transmitter
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
private static function fetchPermissionBlockFromThreadParent(array $item, bool $is_forum_thread) private static function fetchPermissionBlockFromThreadParent(array $item, bool $is_forum_thread): array
{ {
if (empty($item['thr-parent-id'])) { if (empty($item['thr-parent-id'])) {
return []; return [];
@ -606,7 +609,7 @@ class Transmitter
* @param integer $item_id * @param integer $item_id
* @return boolean "true" if the post is from ActivityPub * @return boolean "true" if the post is from ActivityPub
*/ */
private static function isAPPost(int $item_id) private static function isAPPost(int $item_id): bool
{ {
if (empty($item_id)) { if (empty($item_id)) {
return false; return false;
@ -626,7 +629,7 @@ class Transmitter
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
private static function createPermissionBlockForItem($item, $blindcopy, $last_id = 0) private static function createPermissionBlockForItem(array $item, bool $blindcopy, int $last_id = 0): array
{ {
if ($last_id == 0) { if ($last_id == 0) {
$last_id = $item['id']; $last_id = $item['id'];
@ -858,10 +861,9 @@ class Transmitter
* Check if an inbox is archived * Check if an inbox is archived
* *
* @param string $url Inbox url * @param string $url Inbox url
*
* @return boolean "true" if inbox is archived * @return boolean "true" if inbox is archived
*/ */
public static function archivedInbox($url) public static function archivedInbox(string $url): bool
{ {
return DBA::exists('inbox-status', ['url' => $url, 'archive' => true]); return DBA::exists('inbox-status', ['url' => $url, 'archive' => true]);
} }
@ -869,12 +871,12 @@ class Transmitter
/** /**
* Check if a given contact should be delivered via AP * Check if a given contact should be delivered via AP
* *
* @param array $contact * @param array $contact Contact array
* @param array $networks * @param array $networks Array with networks
* @return bool * @return bool Whether the used protocol matches ACTIVITYPUB
* @throws Exception * @throws Exception
*/ */
private static function isAPContact(array $contact, array $networks) private static function isAPContact(array $contact, array $networks): bool
{ {
if (in_array($contact['network'], $networks) || ($contact['protocol'] == Protocol::ACTIVITYPUB)) { if (in_array($contact['network'], $networks) || ($contact['protocol'] == Protocol::ACTIVITYPUB)) {
return true; return true;
@ -889,12 +891,11 @@ class Transmitter
* @param integer $uid User ID * @param integer $uid User ID
* @param boolean $personal fetch personal inboxes * @param boolean $personal fetch personal inboxes
* @param boolean $all_ap Retrieve all AP enabled inboxes * @param boolean $all_ap Retrieve all AP enabled inboxes
*
* @return array of follower inboxes * @return array of follower inboxes
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function fetchTargetInboxesforUser($uid, $personal = false, bool $all_ap = false) public static function fetchTargetInboxesforUser(int $uid, bool $personal = false, bool $all_ap = false): array
{ {
$inboxes = []; $inboxes = [];
@ -963,7 +964,7 @@ class Transmitter
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function fetchTargetInboxes($item, $uid, $personal = false, $last_id = 0) public static function fetchTargetInboxes(array $item, int $uid, bool $personal = false, int $last_id = 0): array
{ {
$permissions = self::createPermissionBlockForItem($item, true, $last_id); $permissions = self::createPermissionBlockForItem($item, true, $last_id);
if (empty($permissions)) { if (empty($permissions)) {
@ -1022,12 +1023,11 @@ class Transmitter
/** /**
* Creates an array in the structure of the item table for a given mail id * Creates an array in the structure of the item table for a given mail id
* *
* @param integer $mail_id * @param integer $mail_id Mail id
*
* @return array * @return array
* @throws \Exception * @throws \Exception
*/ */
public static function ItemArrayFromMail($mail_id, $use_title = false) public static function getItemArrayFromMail(int $mail_id, bool $use_title = false): array
{ {
$mail = DBA::selectFirst('mail', [], ['id' => $mail_id]); $mail = DBA::selectFirst('mail', [], ['id' => $mail_id]);
if (!DBA::isResult($mail)) { if (!DBA::isResult($mail)) {
@ -1079,9 +1079,9 @@ class Transmitter
* @return array of activity * @return array of activity
* @throws \Exception * @throws \Exception
*/ */
public static function createActivityFromMail($mail_id, $object_mode = false) public static function createActivityFromMail(int $mail_id, bool $object_mode = false): array
{ {
$mail = self::ItemArrayFromMail($mail_id); $mail = self::getItemArrayFromMail($mail_id);
if (empty($mail)) { if (empty($mail)) {
return []; return [];
} }
@ -1133,18 +1133,17 @@ class Transmitter
/** /**
* Returns the activity type of a given item * Returns the activity type of a given item
* *
* @param array $item * @param array $item Item array
*
* @return string with activity type * @return string with activity type
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
private static function getTypeOfItem($item) private static function getTypeOfItem(array $item): string
{ {
$reshared = false; $reshared = false;
// Only check for a reshare, if it is a real reshare and no quoted reshare // Only check for a reshare, if it is a real reshare and no quoted reshare
if (strpos($item['body'], "[share") === 0) { if (strpos($item['body'], '[share') === 0) {
$announce = self::getAnnounceArray($item); $announce = self::getAnnounceArray($item);
$reshared = !empty($announce); $reshared = !empty($announce);
} }
@ -1183,13 +1182,12 @@ class Transmitter
/** /**
* Creates the activity or fetches it from the cache * Creates the activity or fetches it from the cache
* *
* @param integer $item_id * @param integer $item_id Item id
* @param boolean $force Force new cache entry * @param boolean $force Force new cache entry
*
* @return array with the activity * @return array with the activity
* @throws \Exception * @throws \Exception
*/ */
public static function createCachedActivityFromItem($item_id, $force = false) public static function createCachedActivityFromItem(int $item_id, bool $force = false): array
{ {
$cachekey = 'APDelivery:createActivity:' . $item_id; $cachekey = 'APDelivery:createActivity:' . $item_id;
@ -1211,7 +1209,6 @@ class Transmitter
* *
* @param integer $item_id * @param integer $item_id
* @param boolean $object_mode Is the activity item is used inside another object? * @param boolean $object_mode Is the activity item is used inside another object?
*
* @return false|array * @return false|array
* @throws \Exception * @throws \Exception
*/ */
@ -1335,11 +1332,10 @@ class Transmitter
/** /**
* Creates a location entry for a given item array * Creates a location entry for a given item array
* *
* @param array $item * @param array $item Item array
*
* @return array with location array * @return array with location array
*/ */
private static function createLocation($item) private static function createLocation(array $item): array
{ {
$location = ['type' => 'Place']; $location = ['type' => 'Place'];
@ -1369,12 +1365,11 @@ class Transmitter
/** /**
* Returns a tag array for a given item array * Returns a tag array for a given item array
* *
* @param array $item * @param array $item Item array
*
* @return array of tags * @return array of tags
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
private static function createTagList($item) private static function createTagList(array $item): array
{ {
$tags = []; $tags = [];
@ -1416,7 +1411,7 @@ class Transmitter
* @return array with attachment data * @return array with attachment data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
private static function createAttachmentList($item, $type) private static function createAttachmentList(array $item, string $type): array
{ {
$attachments = []; $attachments = [];
@ -1468,7 +1463,7 @@ class Transmitter
* @return string Replaced mention * @return string Replaced mention
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
private static function mentionAddrCallback($match) private static function mentionAddrCallback(array $match): string
{ {
if (empty($match[1])) { if (empty($match[1])) {
return ''; return '';
@ -1485,11 +1480,10 @@ class Transmitter
/** /**
* Remove image elements since they are added as attachment * Remove image elements since they are added as attachment
* *
* @param string $body * @param string $body HTML code
*
* @return string with removed images * @return string with removed images
*/ */
private static function removePictures($body) private static function removePictures(string $body): string
{ {
// Simplify image codes // Simplify image codes
$body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body); $body = preg_replace("/\[img\=([0-9]*)x([0-9]*)\](.*?)\[\/img\]/ism", '[img]$3[/img]', $body);
@ -1518,12 +1512,11 @@ class Transmitter
/** /**
* Fetches the "context" value for a givem item array from the "conversation" table * Fetches the "context" value for a givem item array from the "conversation" table
* *
* @param array $item * @param array $item Item array
*
* @return string with context url * @return string with context url
* @throws \Exception * @throws \Exception
*/ */
private static function fetchContextURLForItem($item) private static function fetchContextURLForItem(array $item): string
{ {
$conversation = DBA::selectFirst('conversation', ['conversation-href', 'conversation-uri'], ['item-uri' => $item['parent-uri']]); $conversation = DBA::selectFirst('conversation', ['conversation-href', 'conversation-uri'], ['item-uri' => $item['parent-uri']]);
if (DBA::isResult($conversation) && !empty($conversation['conversation-href'])) { if (DBA::isResult($conversation) && !empty($conversation['conversation-href'])) {
@ -1539,12 +1532,11 @@ class Transmitter
/** /**
* Returns if the post contains sensitive content ("nsfw") * Returns if the post contains sensitive content ("nsfw")
* *
* @param integer $uri_id * @param integer $uri_id URI id
* * @return boolean Whether URI id was found
* @return boolean
* @throws \Exception * @throws \Exception
*/ */
private static function isSensitive($uri_id) private static function isSensitive(int $uri_id): bool
{ {
return DBA::exists('tag-view', ['uri-id' => $uri_id, 'name' => 'nsfw', 'type' => Tag::HASHTAG]); return DBA::exists('tag-view', ['uri-id' => $uri_id, 'name' => 'nsfw', 'type' => Tag::HASHTAG]);
} }
@ -1552,12 +1544,11 @@ class Transmitter
/** /**
* Creates event data * Creates event data
* *
* @param array $item * @param array $item Item array
*
* @return array with the event data * @return array with the event data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
private static function createEvent($item) private static function createEvent(array $item): array
{ {
$event = []; $event = [];
$event['name'] = $item['event-summary']; $event['name'] = $item['event-summary'];
@ -1583,12 +1574,11 @@ class Transmitter
* Creates a note/article object array * Creates a note/article object array
* *
* @param array $item * @param array $item
*
* @return array with the object data * @return array with the object data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function createNote($item) public static function createNote(array $item): array
{ {
if (empty($item)) { if (empty($item)) {
return []; return [];
@ -1739,10 +1729,9 @@ class Transmitter
* Fetches the language from the post, the user or the system. * Fetches the language from the post, the user or the system.
* *
* @param array $item * @param array $item
*
* @return string language string * @return string language string
*/ */
private static function getLanguage(array $item) private static function getLanguage(array $item): string
{ {
// Try to fetch the language from the post itself // Try to fetch the language from the post itself
if (!empty($item['language'])) { if (!empty($item['language'])) {
@ -1767,74 +1756,71 @@ class Transmitter
/** /**
* Creates an an "add tag" entry * Creates an an "add tag" entry
* *
* @param array $item * @param array $item Item array
* @param array $data activity data * @param array $activity activity data
*
* @return array with activity data for adding tags * @return array with activity data for adding tags
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
private static function createAddTag($item, $data) private static function createAddTag(array $item, array $activity): array
{ {
$object = XML::parseString($item['object']); $object = XML::parseString($item['object']);
$target = XML::parseString($item["target"]); $target = XML::parseString($item['target']);
$data['diaspora:guid'] = $item['guid']; $activity['diaspora:guid'] = $item['guid'];
$data['actor'] = $item['author-link']; $activity['actor'] = $item['author-link'];
$data['target'] = (string)$target->id; $activity['target'] = (string)$target->id;
$data['summary'] = BBCode::toPlaintext($item['body']); $activity['summary'] = BBCode::toPlaintext($item['body']);
$data['object'] = ['id' => (string)$object->id, 'type' => 'tag', 'name' => (string)$object->title, 'content' => (string)$object->content]; $activity['object'] = ['id' => (string)$object->id, 'type' => 'tag', 'name' => (string)$object->title, 'content' => (string)$object->content];
return $data; return $activity;
} }
/** /**
* Creates an announce object entry * Creates an announce object entry
* *
* @param array $item * @param array $item Item array
* @param array $data activity data * @param array $activity activity data
*
* @return array with activity data * @return array with activity data
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
private static function createAnnounce($item, $data) private static function createAnnounce(array $item, array $activity): array
{ {
$orig_body = $item['body']; $orig_body = $item['body'];
$announce = self::getAnnounceArray($item); $announce = self::getAnnounceArray($item);
if (empty($announce)) { if (empty($announce)) {
$data['type'] = 'Create'; $activity['type'] = 'Create';
$data['object'] = self::createNote($item); $activity['object'] = self::createNote($item);
return $data; return $activity;
} }
if (empty($announce['comment'])) { if (empty($announce['comment'])) {
// Pure announce, without a quote // Pure announce, without a quote
$data['type'] = 'Announce'; $activity['type'] = 'Announce';
$data['object'] = $announce['object']['uri']; $activity['object'] = $announce['object']['uri'];
return $data; return $activity;
} }
// Quote // Quote
$data['type'] = 'Create'; $activity['type'] = 'Create';
$item['body'] = $announce['comment'] . "\n" . $announce['object']['plink']; $item['body'] = $announce['comment'] . "\n" . $announce['object']['plink'];
$data['object'] = self::createNote($item); $activity['object'] = self::createNote($item);
/// @todo Finally descide how to implement this in AP. This is a possible way: /// @todo Finally descide how to implement this in AP. This is a possible way:
$data['object']['attachment'][] = self::createNote($announce['object']); $activity['object']['attachment'][] = self::createNote($announce['object']);
$data['object']['source']['content'] = $orig_body; $activity['object']['source']['content'] = $orig_body;
return $data; return $activity;
} }
/** /**
* Return announce related data if the item is an annunce * Return announce related data if the item is an annunce
* *
* @param array $item * @param array $item
* * @return array Announcement array
* @return array
*/ */
public static function getAnnounceArray($item) public static function getAnnounceArray(array $item): array
{ {
$reshared = Item::getShareArray($item); $reshared = Item::getShareArray($item);
if (empty($reshared['guid'])) { if (empty($reshared['guid'])) {
@ -1861,11 +1847,10 @@ class Transmitter
/** /**
* Checks if the provided item array is an announce * Checks if the provided item array is an announce
* *
* @param array $item * @param array $item Item array
* * @return boolean Whether item is an announcement
* @return boolean
*/ */
public static function isAnnounce($item) public static function isAnnounce(array $item): bool
{ {
if (!empty($item['verb']) && ($item['verb'] == Activity::ANNOUNCE)) { if (!empty($item['verb']) && ($item['verb'] == Activity::ANNOUNCE)) {
return true; return true;
@ -1886,7 +1871,7 @@ class Transmitter
* *
* @return bool|string activity id * @return bool|string activity id
*/ */
public static function activityIDFromContact($cid) public static function activityIDFromContact(int $cid)
{ {
$contact = DBA::selectFirst('contact', ['uid', 'id', 'created'], ['id' => $cid]); $contact = DBA::selectFirst('contact', ['uid', 'id', 'created'], ['id' => $cid]);
if (!DBA::isResult($contact)) { if (!DBA::isResult($contact)) {
@ -1904,17 +1889,17 @@ class Transmitter
* @param integer $uid User ID * @param integer $uid User ID
* @param string $inbox Target inbox * @param string $inbox Target inbox
* @param integer $suggestion_id Suggestion ID * @param integer $suggestion_id Suggestion ID
*
* @return boolean was the transmission successful? * @return boolean was the transmission successful?
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function sendContactSuggestion($uid, $inbox, $suggestion_id) public static function sendContactSuggestion(int $uid, string $inbox, int $suggestion_id): bool
{ {
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
$suggestion = DI::fsuggest()->selectOneById($suggestion_id); $suggestion = DI::fsuggest()->selectOneById($suggestion_id);
$data = ['@context' => ActivityPub::CONTEXT, $data = [
'@context' => ActivityPub::CONTEXT,
'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
'type' => 'Announce', 'type' => 'Announce',
'actor' => $owner['url'], 'actor' => $owner['url'],
@ -1922,7 +1907,8 @@ class Transmitter
'content' => $suggestion->note, 'content' => $suggestion->note,
'instrument' => self::getService(), 'instrument' => self::getService(),
'to' => [ActivityPub::PUBLIC_COLLECTION], 'to' => [ActivityPub::PUBLIC_COLLECTION],
'cc' => []]; 'cc' => []
];
$signed = LDSignature::sign($data, $owner); $signed = LDSignature::sign($data, $owner);
@ -1935,15 +1921,15 @@ class Transmitter
* *
* @param integer $uid User ID * @param integer $uid User ID
* @param string $inbox Target inbox * @param string $inbox Target inbox
*
* @return boolean was the transmission successful? * @return boolean was the transmission successful?
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function sendProfileRelocation($uid, $inbox) public static function sendProfileRelocation(int $uid, string $inbox): bool
{ {
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
$data = ['@context' => ActivityPub::CONTEXT, $data = [
'@context' => ActivityPub::CONTEXT,
'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
'type' => 'dfrn:relocate', 'type' => 'dfrn:relocate',
'actor' => $owner['url'], 'actor' => $owner['url'],
@ -1951,7 +1937,8 @@ class Transmitter
'published' => DateTimeFormat::utcNow(DateTimeFormat::ATOM), 'published' => DateTimeFormat::utcNow(DateTimeFormat::ATOM),
'instrument' => self::getService(), 'instrument' => self::getService(),
'to' => [ActivityPub::PUBLIC_COLLECTION], 'to' => [ActivityPub::PUBLIC_COLLECTION],
'cc' => []]; 'cc' => []
];
$signed = LDSignature::sign($data, $owner); $signed = LDSignature::sign($data, $owner);
@ -1964,11 +1951,10 @@ class Transmitter
* *
* @param integer $uid User ID * @param integer $uid User ID
* @param string $inbox Target inbox * @param string $inbox Target inbox
*
* @return boolean was the transmission successful? * @return boolean was the transmission successful?
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function sendProfileDeletion($uid, $inbox) public static function sendProfileDeletion(int $uid, string $inbox): bool
{ {
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
@ -2003,7 +1989,6 @@ class Transmitter
* *
* @param integer $uid User ID * @param integer $uid User ID
* @param string $inbox Target inbox * @param string $inbox Target inbox
*
* @return boolean was the transmission successful? * @return boolean was the transmission successful?
* @throws HTTPException\InternalServerErrorException * @throws HTTPException\InternalServerErrorException
* @throws HTTPException\NotFoundException * @throws HTTPException\NotFoundException
@ -2036,17 +2021,18 @@ class Transmitter
* @param string $activity Type name * @param string $activity Type name
* @param string $target Target profile * @param string $target Target profile
* @param integer $uid User ID * @param integer $uid User ID
* @param string $id Activity-identifier
* @return bool * @return bool
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
* @throws \Exception * @throws \Exception
*/ */
public static function sendActivity($activity, $target, $uid, $id = '') public static function sendActivity(string $activity, string $target, int $uid, string $id = ''): bool
{ {
$profile = APContact::getByURL($target); $profile = APContact::getByURL($target);
if (empty($profile['inbox'])) { if (empty($profile['inbox'])) {
Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]); Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]);
return; return false;
} }
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
@ -2055,13 +2041,15 @@ class Transmitter
$id = DI::baseUrl() . '/activity/' . System::createGUID(); $id = DI::baseUrl() . '/activity/' . System::createGUID();
} }
$data = ['@context' => ActivityPub::CONTEXT, $data = [
'@context' => ActivityPub::CONTEXT,
'id' => $id, 'id' => $id,
'type' => $activity, 'type' => $activity,
'actor' => $owner['url'], 'actor' => $owner['url'],
'object' => $profile['url'], 'object' => $profile['url'],
'instrument' => self::getService(), 'instrument' => self::getService(),
'to' => [$profile['url']]]; 'to' => [$profile['url']],
];
Logger::info('Sending activity ' . $activity . ' to ' . $target . ' for user ' . $uid); Logger::info('Sending activity ' . $activity . ' to ' . $target . ' for user ' . $uid);
@ -2081,12 +2069,12 @@ class Transmitter
* @throws \ImagickException * @throws \ImagickException
* @throws \Exception * @throws \Exception
*/ */
public static function sendFollowObject($object, $target, $uid = 0) public static function sendFollowObject(string $object, string $target, int $uid = 0): bool
{ {
$profile = APContact::getByURL($target); $profile = APContact::getByURL($target);
if (empty($profile['inbox'])) { if (empty($profile['inbox'])) {
Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]); Logger::warning('No inbox found for target', ['target' => $target, 'profile' => $profile]);
return; return false;
} }
if (empty($uid)) { if (empty($uid)) {
@ -2108,13 +2096,15 @@ class Transmitter
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
$data = ['@context' => ActivityPub::CONTEXT, $data = [
'@context' => ActivityPub::CONTEXT,
'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
'type' => 'Follow', 'type' => 'Follow',
'actor' => $owner['url'], 'actor' => $owner['url'],
'object' => $object, 'object' => $object,
'instrument' => self::getService(), 'instrument' => self::getService(),
'to' => [$profile['url']]]; 'to' => [$profile['url']],
];
Logger::info('Sending follow ' . $object . ' to ' . $target . ' for user ' . $uid); Logger::info('Sending follow ' . $object . ' to ' . $target . ' for user ' . $uid);
@ -2126,12 +2116,13 @@ class Transmitter
* Transmit a message that the contact request had been accepted * Transmit a message that the contact request had been accepted
* *
* @param string $target Target profile * @param string $target Target profile
* @param $id * @param integer $id Object id
* @param integer $uid User ID * @param integer $uid User ID
* @return void
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function sendContactAccept($target, $id, $uid) public static function sendContactAccept(string $target, int $id, int $uid)
{ {
$profile = APContact::getByURL($target); $profile = APContact::getByURL($target);
if (empty($profile['inbox'])) { if (empty($profile['inbox'])) {
@ -2140,7 +2131,8 @@ class Transmitter
} }
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
$data = ['@context' => ActivityPub::CONTEXT, $data = [
'@context' => ActivityPub::CONTEXT,
'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
'type' => 'Accept', 'type' => 'Accept',
'actor' => $owner['url'], 'actor' => $owner['url'],
@ -2151,7 +2143,8 @@ class Transmitter
'object' => $owner['url'] 'object' => $owner['url']
], ],
'instrument' => self::getService(), 'instrument' => self::getService(),
'to' => [$profile['url']]]; 'to' => [$profile['url']],
];
Logger::debug('Sending accept to ' . $target . ' for user ' . $uid . ' with id ' . $id); Logger::debug('Sending accept to ' . $target . ' for user ' . $uid . ' with id ' . $id);
@ -2163,13 +2156,13 @@ class Transmitter
* Reject a contact request or terminates the contact relation * Reject a contact request or terminates the contact relation
* *
* @param string $target Target profile * @param string $target Target profile
* @param $id * @param integer $id Object id
* @param integer $uid User ID * @param integer $uid User ID
* @return bool Operation success * @return bool Operation success
* @throws HTTPException\InternalServerErrorException * @throws HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
*/ */
public static function sendContactReject($target, $id, $uid): bool public static function sendContactReject(string $target, int $id, int $uid): bool
{ {
$profile = APContact::getByURL($target); $profile = APContact::getByURL($target);
if (empty($profile['inbox'])) { if (empty($profile['inbox'])) {
@ -2178,7 +2171,8 @@ class Transmitter
} }
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
$data = ['@context' => ActivityPub::CONTEXT, $data = [
'@context' => ActivityPub::CONTEXT,
'id' => DI::baseUrl() . '/activity/' . System::createGUID(), 'id' => DI::baseUrl() . '/activity/' . System::createGUID(),
'type' => 'Reject', 'type' => 'Reject',
'actor' => $owner['url'], 'actor' => $owner['url'],
@ -2189,7 +2183,8 @@ class Transmitter
'object' => $owner['url'] 'object' => $owner['url']
], ],
'instrument' => self::getService(), 'instrument' => self::getService(),
'to' => [$profile['url']]]; 'to' => [$profile['url']],
];
Logger::debug('Sending reject to ' . $target . ' for user ' . $uid . ' with id ' . $id); Logger::debug('Sending reject to ' . $target . ' for user ' . $uid . ' with id ' . $id);
@ -2201,13 +2196,14 @@ class Transmitter
* Transmits a message that we don't want to follow this contact anymore * Transmits a message that we don't want to follow this contact anymore
* *
* @param string $target Target profile * @param string $target Target profile
* @param integer $cid Contact id
* @param integer $uid User ID * @param integer $uid User ID
* @return bool success
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
* @throws \ImagickException * @throws \ImagickException
* @throws \Exception * @throws \Exception
* @return bool success
*/ */
public static function sendContactUndo($target, $cid, $uid) public static function sendContactUndo(string $target, int $cid, int $uid): bool
{ {
$profile = APContact::getByURL($target); $profile = APContact::getByURL($target);
if (empty($profile['inbox'])) { if (empty($profile['inbox'])) {
@ -2223,15 +2219,20 @@ class Transmitter
$id = DI::baseUrl() . '/activity/' . System::createGUID(); $id = DI::baseUrl() . '/activity/' . System::createGUID();
$owner = User::getOwnerDataById($uid); $owner = User::getOwnerDataById($uid);
$data = ['@context' => ActivityPub::CONTEXT, $data = [
'@context' => ActivityPub::CONTEXT,
'id' => $id, 'id' => $id,
'type' => 'Undo', 'type' => 'Undo',
'actor' => $owner['url'], 'actor' => $owner['url'],
'object' => ['id' => $object_id, 'type' => 'Follow', 'object' => [
'id' => $object_id,
'type' => 'Follow',
'actor' => $owner['url'], 'actor' => $owner['url'],
'object' => $profile['url']], 'object' => $profile['url']
],
'instrument' => self::getService(), 'instrument' => self::getService(),
'to' => [$profile['url']]]; 'to' => [$profile['url']],
];
Logger::info('Sending undo to ' . $target . ' for user ' . $uid . ' with id ' . $id); Logger::info('Sending undo to ' . $target . ' for user ' . $uid . ' with id ' . $id);
@ -2239,7 +2240,15 @@ class Transmitter
return HTTPSignature::transmit($signed, $profile['inbox'], $uid); return HTTPSignature::transmit($signed, $profile['inbox'], $uid);
} }
private static function prependMentions($body, int $uriid, string $authorLink) /**
* Prepends mentions (@) to $body variable
*
* @param string $body HTML code
* @param int $uriid URI id
* @param string $authorLink Author link
* @return string HTML code with prepended mentions
*/
private static function prependMentions(string $body, int $uriid, string $authorLink): string
{ {
$mentions = []; $mentions = [];

View file

@ -312,7 +312,7 @@ class Feed
$item['uri'] = $guid; $item['uri'] = $guid;
// Don't use the GUID value directly but instead use it as a basis for the GUID // Don't use the GUID value directly but instead use it as a basis for the GUID
$item['guid'] = Item::guidFromUri($guid, parse_url($guid, PHP_URL_HOST) ?? parse_url($item['plink'], PHP_URL_HOST)); $item['guid'] = Item::guidFromUri($guid, parse_url($guid, PHP_URL_HOST) ?? parse_url($item['plink'], PHP_URL_HOST) ?? '');
} }
if (empty($item['uri'])) { if (empty($item['uri'])) {

View file

@ -43,7 +43,7 @@ class Salmon
* @return mixed * @return mixed
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function getKey($uri, $keyhash) public static function getKey(string $uri, string $keyhash)
{ {
$ret = []; $ret = [];
@ -109,18 +109,18 @@ class Salmon
* @return integer * @return integer
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
public static function slapper($owner, $url, $slap) public static function slapper(array $owner, string $url, string $slap): int
{ {
// does contact have a salmon endpoint? // does contact have a salmon endpoint?
if (!strlen($url)) { if (!strlen($url)) {
return; return -1;
} }
if (!$owner['sprvkey']) { if (!$owner['sprvkey']) {
Logger::notice(sprintf("user '%s' (%d) does not have a salmon private key. Send failed.", Logger::notice(sprintf("user '%s' (%d) does not have a salmon private key. Send failed.",
$owner['name'], $owner['uid'])); $owner['name'], $owner['uid']));
return; return -1;
} }
Logger::info('slapper called for '.$url.'. Data: ' . $slap); Logger::info('slapper called for '.$url.'. Data: ' . $slap);
@ -229,7 +229,7 @@ class Salmon
* @return string * @return string
* @throws \Exception * @throws \Exception
*/ */
public static function salmonKey($pubkey) public static function salmonKey(string $pubkey): string
{ {
Crypto::pemToMe($pubkey, $modulus, $exponent); Crypto::pemToMe($pubkey, $modulus, $exponent);
return 'RSA' . '.' . Strings::base64UrlEncode($modulus, true) . '.' . Strings::base64UrlEncode($exponent, true); return 'RSA' . '.' . Strings::base64UrlEncode($modulus, true) . '.' . Strings::base64UrlEncode($exponent, true);

View file

@ -69,7 +69,7 @@ final class FriendicaSmartyEngine extends TemplateEngine
/** /**
* @inheritDoc * @inheritDoc
*/ */
public function replaceMacros(string $template, array $vars) public function replaceMacros(string $template, array $vars): string
{ {
if (!Strings::startsWith($template, self::FILE_PREFIX)) { if (!Strings::startsWith($template, self::FILE_PREFIX)) {
$template = self::STRING_PREFIX . $template; $template = self::STRING_PREFIX . $template;

View file

@ -45,6 +45,7 @@ abstract class TemplateEngine
* parameter or displays them directly if it's null. * parameter or displays them directly if it's null.
* *
* @param array|null $errors * @param array|null $errors
* @return void
*/ */
abstract public function testInstall(array &$errors = null); abstract public function testInstall(array &$errors = null);
@ -53,9 +54,9 @@ abstract class TemplateEngine
* *
* @param string $template * @param string $template
* @param array $vars * @param array $vars
* @return string * @return string Template output with replaced macros
*/ */
abstract public function replaceMacros(string $template, array $vars); abstract public function replaceMacros(string $template, array $vars): string;
/** /**
* Returns the template string from a file path and an optional sub-directory from the project root * Returns the template string from a file path and an optional sub-directory from the project root

View file

@ -32,11 +32,11 @@ class Strings
/** /**
* Generates a pseudo-random string of hexadecimal characters * Generates a pseudo-random string of hexadecimal characters
* *
* @param int $size * @param int $size Size of string (default: 64)
* @return string * @return string Pseudo-random string
* @throws \Exception * @throws \Exception
*/ */
public static function getRandomHex($size = 64) public static function getRandomHex(int $size = 64): string
{ {
$byte_size = ceil($size / 2); $byte_size = ceil($size / 2);
@ -51,10 +51,9 @@ class Strings
* Checks, if the given string is a valid hexadecimal code * Checks, if the given string is a valid hexadecimal code
* *
* @param string $hexCode * @param string $hexCode
*
* @return bool * @return bool
*/ */
public static function isHex($hexCode) public static function isHex(string $hexCode): bool
{ {
return !empty($hexCode) ? @preg_match("/^[a-f0-9]{2,}$/i", $hexCode) && !(strlen($hexCode) & 1) : false; return !empty($hexCode) ? @preg_match("/^[a-f0-9]{2,}$/i", $hexCode) && !(strlen($hexCode) & 1) : false;
} }
@ -75,10 +74,9 @@ class Strings
* Generate a string that's random, but usually pronounceable. Used to generate initial passwords * Generate a string that's random, but usually pronounceable. Used to generate initial passwords
* *
* @param int $len length * @param int $len length
*
* @return string * @return string
*/ */
public static function getRandomName($len) public static function getRandomName(int $len): string
{ {
if ($len <= 0) { if ($len <= 0) {
return ''; return '';
@ -161,7 +159,6 @@ class Strings
* *
* @param string $network Network name of the contact (e.g. dfrn, rss and so on) * @param string $network Network name of the contact (e.g. dfrn, rss and so on)
* @param string $url The contact url * @param string $url The contact url
*
* @return string Formatted network name * @return string Formatted network name
* @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/ */
@ -189,7 +186,7 @@ class Strings
* *
* @return string Transformed string. * @return string Transformed string.
*/ */
public static function deindent(string $text, string $chr = "[\t ]", int $count = null) public static function deindent(string $text, string $chr = "[\t ]", int $count = null): string
{ {
$lines = explode("\n", $text); $lines = explode("\n", $text);
@ -218,7 +215,7 @@ class Strings
* *
* @return string Size with measured units. * @return string Size with measured units.
*/ */
public static function formatBytes($bytes, $precision = 2) public static function formatBytes(int $bytes, int $precision = 2): string
{ {
$units = ['B', 'KB', 'MB', 'GB', 'TB']; $units = ['B', 'KB', 'MB', 'GB', 'TB'];
$bytes = max($bytes, 0); $bytes = max($bytes, 0);
@ -233,10 +230,9 @@ class Strings
* Protect percent characters in sprintf calls * Protect percent characters in sprintf calls
* *
* @param string $s String to transform. * @param string $s String to transform.
*
* @return string Transformed string. * @return string Transformed string.
*/ */
public static function protectSprintf($s) public static function protectSprintf(string $s): string
{ {
return str_replace('%', '%%', $s); return str_replace('%', '%%', $s);
} }
@ -246,10 +242,9 @@ class Strings
* *
* @param string $s URL to encode * @param string $s URL to encode
* @param boolean $strip_padding Optional. Default false * @param boolean $strip_padding Optional. Default false
*
* @return string Encoded URL * @return string Encoded URL
*/ */
public static function base64UrlEncode($s, $strip_padding = false) public static function base64UrlEncode(string $s, bool $strip_padding = false): string
{ {
$s = strtr(base64_encode($s), '+/', '-_'); $s = strtr(base64_encode($s), '+/', '-_');
@ -262,18 +257,13 @@ class Strings
/** /**
* Decode Base64 Encoded URL and translate -_ to +/ * Decode Base64 Encoded URL and translate -_ to +/
* @param string $s URL to decode
* *
* @param string $s URL to decode
* @return string Decoded URL * @return string Decoded URL
* @throws \Exception * @throws \Exception
*/ */
public static function base64UrlDecode($s) public static function base64UrlDecode(string $s): string
{ {
if (is_array($s)) {
Logger::notice('base64url_decode: illegal input: ', ['backtrace' => debug_backtrace()]);
return $s;
}
/* /*
* // Placeholder for new rev of salmon which strips base64 padding. * // Placeholder for new rev of salmon which strips base64 padding.
* // PHP base64_decode handles the un-padded input without requiring this step * // PHP base64_decode handles the un-padded input without requiring this step
@ -297,10 +287,9 @@ class Strings
* Normalize url * Normalize url
* *
* @param string $url URL to be normalized. * @param string $url URL to be normalized.
*
* @return string Normalized URL. * @return string Normalized URL.
*/ */
public static function normaliseLink($url) public static function normaliseLink(string $url): string
{ {
$ret = str_replace(['https:', '//www.'], ['http:', '//'], $url); $ret = str_replace(['https:', '//www.'], ['http:', '//'], $url);
return rtrim($ret, '/'); return rtrim($ret, '/');
@ -310,10 +299,9 @@ class Strings
* Normalize OpenID identity * Normalize OpenID identity
* *
* @param string $s OpenID Identity * @param string $s OpenID Identity
*
* @return string normalized OpenId Identity * @return string normalized OpenId Identity
*/ */
public static function normaliseOpenID($s) public static function normaliseOpenID(string $s): string
{ {
return trim(str_replace(['http://', 'https://'], ['', ''], $s), '/'); return trim(str_replace(['http://', 'https://'], ['', ''], $s), '/');
} }
@ -329,7 +317,7 @@ class Strings
* @return boolean True if the URLs match, otherwise False * @return boolean True if the URLs match, otherwise False
* *
*/ */
public static function compareLink($a, $b) public static function compareLink(string $a, string $b): bool
{ {
return (strcasecmp(self::normaliseLink($a), self::normaliseLink($b)) === 0); return (strcasecmp(self::normaliseLink($a), self::normaliseLink($b)) === 0);
} }
@ -340,7 +328,7 @@ class Strings
* @param string $uri * @param string $uri
* @return string * @return string
*/ */
public static function ensureQueryParameter($uri) public static function ensureQueryParameter(string $uri): string
{ {
if (strpos($uri, '?') === false && ($pos = strpos($uri, '&')) !== false) { if (strpos($uri, '?') === false && ($pos = strpos($uri, '&')) !== false) {
$uri = substr($uri, 0, $pos) . '?' . substr($uri, $pos + 1); $uri = substr($uri, 0, $pos) . '?' . substr($uri, $pos + 1);
@ -356,7 +344,7 @@ class Strings
* @param array $chars * @param array $chars
* @return bool * @return bool
*/ */
public static function startsWithChars($string, array $chars) public static function startsWithChars(string $string, array $chars): bool
{ {
$return = in_array(substr(trim($string), 0, 1), $chars); $return = in_array(substr(trim($string), 0, 1), $chars);
@ -371,7 +359,7 @@ class Strings
* @param string $start * @param string $start
* @return bool * @return bool
*/ */
public static function startsWith(string $string, string $start) public static function startsWith(string $string, string $start): bool
{ {
$return = substr_compare($string, $start, 0, strlen($start)) === 0; $return = substr_compare($string, $start, 0, strlen($start)) === 0;
@ -386,7 +374,7 @@ class Strings
* @param string $end * @param string $end
* @return bool * @return bool
*/ */
public static function endsWith(string $string, string $end) public static function endsWith(string $string, string $end): string
{ {
$return = substr_compare($string, $end, -strlen($end)) === 0; $return = substr_compare($string, $end, -strlen($end)) === 0;
@ -399,7 +387,7 @@ class Strings
* @return string * @return string
* @see https://daringfireball.net/2010/07/improved_regex_for_matching_urls * @see https://daringfireball.net/2010/07/improved_regex_for_matching_urls
*/ */
public static function autoLinkRegEx() public static function autoLinkRegEx(): string
{ {
return '@ return '@
(?<![=\'\]"/]) # Not preceded by [, =, \', ], ", / (?<![=\'\]"/]) # Not preceded by [, =, \', ], ", /
@ -429,7 +417,7 @@ class Strings
* @param string $pathItem * @param string $pathItem
* @return string * @return string
*/ */
public static function sanitizeFilePathItem($pathItem) public static function sanitizeFilePathItem(string $pathItem): string
{ {
$pathItem = str_replace('/', '_', $pathItem); $pathItem = str_replace('/', '_', $pathItem);
$pathItem = str_replace('\\', '_', $pathItem); $pathItem = str_replace('\\', '_', $pathItem);
@ -451,7 +439,7 @@ class Strings
* @return string * @return string
* @see substr_replace() * @see substr_replace()
*/ */
public static function substringReplace(string $string, string $replacement, int $start, int $length = null) public static function substringReplace(string $string, string $replacement, int $start, int $length = null): string
{ {
$string_length = mb_strlen($string); $string_length = mb_strlen($string);

View file

@ -21,6 +21,9 @@
namespace Friendica\Util; namespace Friendica\Util;
use DOMDocument;
use DOMElement;
use DOMNode;
use DOMXPath; use DOMXPath;
use Friendica\Core\Logger; use Friendica\Core\Logger;
use Friendica\Core\System; use Friendica\Core\System;
@ -39,22 +42,21 @@ class XML
* @param bool $remove_header Should the XML header be removed or not? * @param bool $remove_header Should the XML header be removed or not?
* @param array $namespaces List of namespaces * @param array $namespaces List of namespaces
* @param bool $root interally used parameter. Mustn't be used from outside. * @param bool $root interally used parameter. Mustn't be used from outside.
* * @return void
* @return string The created XML
*/ */
public static function fromArray($array, &$xml, $remove_header = false, $namespaces = [], $root = true) public static function fromArray(array $array, &$xml, bool $remove_header = false, array $namespaces = [], bool $root = true)
{ {
if ($root) { if ($root) {
foreach ($array as $key => $value) { foreach ($array as $key => $value) {
foreach ($namespaces as $nskey => $nsvalue) { foreach ($namespaces as $nskey => $nsvalue) {
$key .= " xmlns".($nskey == "" ? "":":").$nskey.'="'.$nsvalue.'"'; $key .= ' xmlns' . ($nskey == '' ? '' : ':') . $nskey . '="' . $nsvalue . '"';
} }
if (is_array($value)) { if (is_array($value)) {
$root = new SimpleXMLElement("<".$key."/>"); $root = new SimpleXMLElement('<' . $key . '/>');
self::fromArray($value, $root, $remove_header, $namespaces, false); self::fromArray($value, $root, $remove_header, $namespaces, false);
} else { } else {
$root = new SimpleXMLElement("<".$key.">".self::escape($value)."</".$key.">"); $root = new SimpleXMLElement('<' . $key . '>' . self::escape($value ?? '') . '</' . $key . '>');
} }
$dom = dom_import_simplexml($root)->ownerDocument; $dom = dom_import_simplexml($root)->ownerDocument;
@ -88,11 +90,11 @@ class XML
continue; continue;
} }
$element_parts = explode(":", $key); $element_parts = explode(':', $key);
if ((count($element_parts) > 1) && isset($namespaces[$element_parts[0]])) { if ((count($element_parts) > 1) && isset($namespaces[$element_parts[0]])) {
$namespace = $namespaces[$element_parts[0]]; $namespace = $namespaces[$element_parts[0]];
} elseif (isset($namespaces[""])) { } elseif (isset($namespaces[''])) {
$namespace = $namespaces[""]; $namespace = $namespaces[''];
} else { } else {
$namespace = null; $namespace = null;
} }
@ -102,13 +104,13 @@ class XML
$key = $element_parts[1]; $key = $element_parts[1];
} }
if (substr($key, 0, 11) == "@attributes") { if (substr($key, 0, 11) == '@attributes') {
if (!isset($element) || !is_array($value)) { if (!isset($element) || !is_array($value)) {
continue; continue;
} }
foreach ($value as $attr_key => $attr_value) { foreach ($value as $attr_key => $attr_value) {
$element_parts = explode(":", $attr_key); $element_parts = explode(':', $attr_key);
if ((count($element_parts) > 1) && isset($namespaces[$element_parts[0]])) { if ((count($element_parts) > 1) && isset($namespaces[$element_parts[0]])) {
$namespace = $namespaces[$element_parts[0]]; $namespace = $namespaces[$element_parts[0]];
} else { } else {
@ -122,7 +124,7 @@ class XML
} }
if (!is_array($value)) { if (!is_array($value)) {
$element = $xml->addChild($key, self::escape($value), $namespace); $element = $xml->addChild($key, self::escape($value ?? ''), $namespace);
} elseif (is_array($value)) { } elseif (is_array($value)) {
$element = $xml->addChild($key, null, $namespace); $element = $xml->addChild($key, null, $namespace);
self::fromArray($value, $element, $remove_header, $namespaces, false); self::fromArray($value, $element, $remove_header, $namespaces, false);
@ -138,7 +140,7 @@ class XML
* @param string $elementname Name of the XML element of the target * @param string $elementname Name of the XML element of the target
* @return void * @return void
*/ */
public static function copy(&$source, &$target, $elementname) public static function copy(&$source, &$target, string $elementname)
{ {
if (count($source->children()) == 0) { if (count($source->children()) == 0) {
$target->addChild($elementname, self::escape($source)); $target->addChild($elementname, self::escape($source));
@ -153,14 +155,14 @@ class XML
/** /**
* Create an XML element * Create an XML element
* *
* @param \DOMDocument $doc XML root * @param DOMDocument $doc XML root
* @param string $element XML element name * @param string $element XML element name
* @param string $value XML value * @param string $value XML value
* @param array $attributes array containing the attributes * @param array $attributes array containing the attributes
* *
* @return \DOMElement XML element object * @return \DOMElement XML element object
*/ */
public static function createElement(\DOMDocument $doc, $element, $value = "", $attributes = []) public static function createElement(DOMDocument $doc, string $element, string $value = '', array $attributes = []): DOMElement
{ {
$element = $doc->createElement($element, self::escape($value)); $element = $doc->createElement($element, self::escape($value));
@ -175,14 +177,14 @@ class XML
/** /**
* Create an XML and append it to the parent object * Create an XML and append it to the parent object
* *
* @param \DOMDocument $doc XML root * @param DOMDocument $doc XML root
* @param object $parent parent object * @param object $parent parent object
* @param string $element XML element name * @param string $element XML element name
* @param string $value XML value * @param string $value XML value
* @param array $attributes array containing the attributes * @param array $attributes array containing the attributes
* @return void * @return void
*/ */
public static function addElement(\DOMDocument $doc, $parent, $element, $value = "", $attributes = []) public static function addElement(DOMDocument $doc, $parent, string $element, string $value = '', array $attributes = [])
{ {
$element = self::createElement($doc, $element, $value, $attributes); $element = self::createElement($doc, $element, $value, $attributes);
$parent->appendChild($element); $parent->appendChild($element);
@ -198,7 +200,7 @@ class XML
* *
* @return array | string The array from the xml element or the string * @return array | string The array from the xml element or the string
*/ */
public static function elementToArray($xml_element, &$recursion_depth = 0) public static function elementToArray($xml_element, int &$recursion_depth = 0)
{ {
// If we're getting too deep, bail out // If we're getting too deep, bail out
if ($recursion_depth > 512) { if ($recursion_depth > 512) {
@ -217,7 +219,7 @@ class XML
if (is_array($xml_element)) { if (is_array($xml_element)) {
$result_array = []; $result_array = [];
if (count($xml_element) <= 0) { if (count($xml_element) <= 0) {
return (trim(strval($xml_element_copy))); return trim(strval($xml_element_copy));
} }
foreach ($xml_element as $key => $value) { foreach ($xml_element as $key => $value) {
@ -233,9 +235,9 @@ class XML
]; ];
} }
return ($result_array); return $result_array;
} else { } else {
return (trim(strval($xml_element))); return trim(strval($xml_element));
} }
} }
@ -261,7 +263,7 @@ class XML
* @return array The parsed XML in an array form. Use print_r() to see the resulting array structure. * @return array The parsed XML in an array form. Use print_r() to see the resulting array structure.
* @throws \Exception * @throws \Exception
*/ */
public static function toArray($contents, $namespaces = true, $get_attributes = 1, $priority = 'attribute') public static function toArray(string $contents, bool $namespaces = true, int $get_attributes = 1, string $priority = 'attribute'): array
{ {
if (!$contents) { if (!$contents) {
return []; return [];
@ -300,7 +302,7 @@ class XML
Logger::debug('libxml: parse: ' . $err->code . " at " . $err->line . ":" . $err->column . " : " . $err->message); Logger::debug('libxml: parse: ' . $err->code . " at " . $err->line . ":" . $err->column . " : " . $err->message);
} }
libxml_clear_errors(); libxml_clear_errors();
return; return [];
} }
//Initializations //Initializations
@ -414,20 +416,20 @@ class XML
} }
} }
return($xml_array); return $xml_array;
} }
/** /**
* Delete a node in a XML object * Delete a node in a XML object
* *
* @param \DOMDocument $doc XML document * @param DOMDocument $doc XML document
* @param string $node Node name * @param string $node Node name
* @return void * @return void
*/ */
public static function deleteNode(\DOMDocument $doc, $node) public static function deleteNode(DOMDocument $doc, string $node)
{ {
$xpath = new DOMXPath($doc); $xpath = new DOMXPath($doc);
$list = $xpath->query("//".$node); $list = $xpath->query('//' . $node);
foreach ($list as $child) { foreach ($list as $child) {
$child->parentNode->removeChild($child); $child->parentNode->removeChild($child);
} }
@ -436,9 +438,9 @@ class XML
/** /**
* Parse XML string * Parse XML string
* *
* @param string $s * @param string $s XML string to parse into object
* @param boolean $suppress_log * @param boolean $suppress_log Whether to supressing logging
* @return Object * @return SimpleXMLElement|bool SimpleXMLElement or false on failure
*/ */
public static function parseString(string $s, bool $suppress_log = false) public static function parseString(string $s, bool $suppress_log = false)
{ {
@ -458,7 +460,15 @@ class XML
return $x; return $x;
} }
public static function getFirstNodeValue(DOMXPath $xpath, $element, $context = null) /**
* Gets first node value
*
* @param DOMXPath $xpath XPath object
* @param string $element Element name
* @param DOMNode $context Context object or NULL
* @return string XML node value or empty string on failure
*/
public static function getFirstNodeValue(DOMXPath $xpath, string $element, DOMNode $context = null)
{ {
$result = @$xpath->evaluate($element, $context); $result = @$xpath->evaluate($element, $context);
if (!is_object($result)) { if (!is_object($result)) {
@ -473,7 +483,15 @@ class XML
return $first_item->nodeValue; return $first_item->nodeValue;
} }
public static function getFirstAttributes(DOMXPath $xpath, $element, $context = null) /**
* Gets first attributes
*
* @param DOMXPath $xpath XPath object
* @param string $element Element name
* @param DOMNode $context Context object or NULL
* @return ???|bool First element's attributes field or false on failure
*/
public static function getFirstAttributes(DOMXPath $xpath, string $element, DOMNode $context = null)
{ {
$result = @$xpath->query($element, $context); $result = @$xpath->query($element, $context);
if (!is_object($result)) { if (!is_object($result)) {
@ -488,9 +506,17 @@ class XML
return $first_item->attributes; return $first_item->attributes;
} }
public static function getFirstValue($xpath, $search, $context) /**
* Gets first node's value
*
* @param DOMXPath $xpath XPath object
* @param string $element Element name
* @param DOMNode $context Context object or NULL
* @return string First value or empty string on failure
*/
public static function getFirstValue(DOMXPath $xpath, string $element, DOMNode $context = null): string
{ {
$result = @$xpath->query($search, $context); $result = @$xpath->query($element, $context);
if (!is_object($result)) { if (!is_object($result)) {
return ''; return '';
} }
@ -508,32 +534,31 @@ class XML
* *
* @param string $str * @param string $str
* @return string Escaped text. * @return string Escaped text.
* @todo Move this generic method to Util\Strings and also rewrite all other findingd
*/ */
public static function escape($str) public static function escape(string $str): string
{ {
$buffer = htmlspecialchars($str, ENT_QUOTES, 'UTF-8'); return trim(htmlspecialchars($str, ENT_QUOTES, 'UTF-8'));
$buffer = trim($buffer);
return $buffer;
} }
/** /**
* undo an escape * Undo an escape
* *
* @param string $s xml escaped text * @param string $s xml escaped text
* @return string unescaped text * @return string unescaped text
* @todo Move this generic method to Util\Strings and also rewrite all other findingd
*/ */
public static function unescape($s) public static function unescape(string $s): string
{ {
$ret = htmlspecialchars_decode($s, ENT_QUOTES); return htmlspecialchars_decode($s, ENT_QUOTES);
return $ret;
} }
/** /**
* apply escape() to all values of array $val, recursively * Apply escape() to all values of array $val, recursively
* *
* @param array $val * @param array|bool|string $val Value of type bool, array or string
* @return array|string * @return array|string Returns array if array provided or string in other cases
* @todo Move this generic method to Util\Strings
*/ */
public static function arrayEscape($val) public static function arrayEscape($val)
{ {

View file

@ -81,7 +81,7 @@ class Notifier
$uid = $message['uid']; $uid = $message['uid'];
$recipients[] = $message['contact-id']; $recipients[] = $message['contact-id'];
$mail = ActivityPub\Transmitter::ItemArrayFromMail($target_id); $mail = ActivityPub\Transmitter::getItemArrayFromMail($target_id);
$inboxes = ActivityPub\Transmitter::fetchTargetInboxes($mail, $uid, true); $inboxes = ActivityPub\Transmitter::fetchTargetInboxes($mail, $uid, true);
foreach ($inboxes as $inbox => $receivers) { foreach ($inboxes as $inbox => $receivers) {
$ap_contacts = array_merge($ap_contacts, $receivers); $ap_contacts = array_merge($ap_contacts, $receivers);

View file

@ -33,7 +33,7 @@ class ExtendedPDO extends PDO
/** /**
* @var array Database drivers that support SAVEPOINT * statements. * @var array Database drivers that support SAVEPOINT * statements.
*/ */
protected static $_supportedDrivers = ["pgsql", "mysql"]; protected static $_supportedDrivers = ['pgsql', 'mysql'];
/** /**
* @var int the current transaction depth * @var int the current transaction depth
@ -80,9 +80,9 @@ class ExtendedPDO extends PDO
/** /**
* Commit current transaction * Commit current transaction
* *
* @return bool|void * @return bool
*/ */
public function commit() public function commit(): bool
{ {
// We don't want to "really" commit something, so skip the most outer hierarchy // We don't want to "really" commit something, so skip the most outer hierarchy
if ($this->_transactionDepth <= 1 && $this->hasSavepoint()) { if ($this->_transactionDepth <= 1 && $this->hasSavepoint()) {
@ -92,28 +92,29 @@ class ExtendedPDO extends PDO
$this->_transactionDepth--; $this->_transactionDepth--;
$this->exec("RELEASE SAVEPOINT LEVEL{$this->_transactionDepth}"); return $this->exec("RELEASE SAVEPOINT LEVEL{$this->_transactionDepth}");
} }
/** /**
* Rollback current transaction, * Rollback current transaction,
* *
* @throws PDOException if there is no transaction started * @throws PDOException if there is no transaction started
* @return bool|void * @return bool Whether rollback was successful
*/ */
public function rollBack() public function rollback(): bool
{ {
$this->_transactionDepth--; $this->_transactionDepth--;
if($this->_transactionDepth <= 0 || !$this->hasSavepoint()) { if ($this->_transactionDepth <= 0 || !$this->hasSavepoint()) {
$this->_transactionDepth = 0; $this->_transactionDepth = 0;
try { try {
parent::rollBack(); return parent::rollBack();
} catch (PDOException $e) { } catch (PDOException $e) {
// this shouldn't happen, but it does ... // this shouldn't happen, but it does ...
} }
} else { } else {
$this->exec("ROLLBACK TO SAVEPOINT LEVEL{$this->_transactionDepth}"); return $this->exec("ROLLBACK TO SAVEPOINT LEVEL{$this->_transactionDepth}");
} }
return false;
} }
} }

View file

@ -47,7 +47,7 @@ class StaticDatabase extends Database
* *
* @return bool|void * @return bool|void
*/ */
public function connect() public function connect(): bool
{ {
if (!is_null($this->connection) && $this->connected()) { if (!is_null($this->connection) && $this->connected()) {
return true; return true;
@ -81,7 +81,7 @@ class StaticDatabase extends Database
} }
/** Mock for locking tables */ /** Mock for locking tables */
public function lock($table) public function lock($table): bool
{ {
if ($this->_locked) { if ($this->_locked) {
return false; return false;
@ -94,7 +94,7 @@ class StaticDatabase extends Database
} }
/** Mock for unlocking tables */ /** Mock for unlocking tables */
public function unlock() public function unlock(): bool
{ {
// See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html // See here: https://dev.mysql.com/doc/refman/5.7/en/lock-tables-and-transactions.html
$this->performCommit(); $this->performCommit();
@ -110,7 +110,7 @@ class StaticDatabase extends Database
* *
* @return bool Was the command executed successfully? * @return bool Was the command executed successfully?
*/ */
public function commit() public function commit(): bool
{ {
if (!$this->performCommit()) { if (!$this->performCommit()) {
return false; return false;

View file

@ -55,9 +55,6 @@ class DBATest extends DatabaseTest
self::assertTrue(DBA::exists('config', [])); self::assertTrue(DBA::exists('config', []));
self::assertFalse(DBA::exists('notable', [])); self::assertFalse(DBA::exists('notable', []));
self::assertTrue(DBA::exists('config', null));
self::assertFalse(DBA::exists('notable', null));
self::assertTrue(DBA::exists('config', ['k' => 'hostname'])); self::assertTrue(DBA::exists('config', ['k' => 'hostname']));
self::assertFalse(DBA::exists('config', ['k' => 'nonsense'])); self::assertFalse(DBA::exists('config', ['k' => 'nonsense']));
} }

View file

@ -45,7 +45,6 @@ class DBStructureTest extends DatabaseTest
*/ */
public function testExists() { public function testExists() {
self::assertTrue(DBStructure::existsTable('config')); self::assertTrue(DBStructure::existsTable('config'));
self::assertFalse(DBStructure::existsTable('notatable')); self::assertFalse(DBStructure::existsTable('notatable'));
self::assertTrue(DBStructure::existsColumn('config', ['k'])); self::assertTrue(DBStructure::existsColumn('config', ['k']));

View file

@ -113,22 +113,18 @@ class StringsTest extends TestCase
'input' => '', 'input' => '',
'valid' => false, 'valid' => false,
], ],
'nullHex' => [
'input' => null,
'valid' => false,
],
]; ];
} }
/** /**
* Tests if the string is a valid hexadecimal value * Tests if the string is a valid hexadecimal value
* *
* @param string|null $input * @param string $input Input string
* @param bool $valid * @param bool $valid Whether testing on valid or invalid
* *
* @dataProvider dataIsHex * @dataProvider dataIsHex
*/ */
public function testIsHex(string $input = null, bool $valid = false) public function testIsHex(string $input, bool $valid = false)
{ {
self::assertEquals($valid, Strings::isHex($input)); self::assertEquals($valid, Strings::isHex($input));
} }

View file

@ -79,7 +79,7 @@ if (!empty($_REQUEST['scheme'])) {
$scheme = $_REQUEST['scheme']; $scheme = $_REQUEST['scheme'];
} }
$scheme = Strings::sanitizeFilePathItem($scheme); $scheme = Strings::sanitizeFilePathItem($scheme ?? '');
if (($scheme) && ($scheme != '---')) { if (($scheme) && ($scheme != '---')) {
if (file_exists('view/theme/frio/scheme/' . $scheme . '.php')) { if (file_exists('view/theme/frio/scheme/' . $scheme . '.php')) {