From 3546d0aabe9ee7db4ecdeddfb18138fbff5d5c7b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roland=20H=C3=A4der?= Date: Sat, 16 Jul 2022 07:25:46 +0200 Subject: [PATCH 1/7] This class has already been "imported". --- tests/src/Core/Config/Cache/ConfigFileLoaderTest.php | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/tests/src/Core/Config/Cache/ConfigFileLoaderTest.php b/tests/src/Core/Config/Cache/ConfigFileLoaderTest.php index b956e558ef..43decf1057 100644 --- a/tests/src/Core/Config/Cache/ConfigFileLoaderTest.php +++ b/tests/src/Core/Config/Cache/ConfigFileLoaderTest.php @@ -174,7 +174,7 @@ class ConfigFileLoaderTest extends MockedTest ->at($this->root) ->setContent(file_get_contents($file)); - $configFileLoader = new \Friendica\Core\Config\Util\ConfigFileLoader( + $configFileLoader = new ConfigFileLoader( $this->root->url(), $this->root->url() . DIRECTORY_SEPARATOR . Config::CONFIG_DIR, $this->root->url() . DIRECTORY_SEPARATOR . Config::STATIC_DIR @@ -228,7 +228,7 @@ class ConfigFileLoaderTest extends MockedTest ->at($this->root->getChild('addon')->getChild('test')->getChild('config')) ->setContent(file_get_contents($file)); - $configFileLoader = new \Friendica\Core\Config\Util\ConfigFileLoader( + $configFileLoader = new ConfigFileLoader( $this->root->url(), $this->root->url() . DIRECTORY_SEPARATOR . Config::CONFIG_DIR, $this->root->url() . DIRECTORY_SEPARATOR . Config::STATIC_DIR @@ -265,7 +265,7 @@ class ConfigFileLoaderTest extends MockedTest ->at($this->root->getChild('config')) ->setContent(file_get_contents($fileDir . 'B.config.php')); - $configFileLoader = new \Friendica\Core\Config\Util\ConfigFileLoader( + $configFileLoader = new ConfigFileLoader( $this->root->url(), $this->root->url() . DIRECTORY_SEPARATOR . Config::CONFIG_DIR, $this->root->url() . DIRECTORY_SEPARATOR . Config::STATIC_DIR @@ -299,7 +299,7 @@ class ConfigFileLoaderTest extends MockedTest ->at($this->root->getChild('config')) ->setContent(file_get_contents($fileDir . 'B.ini.php')); - $configFileLoader = new \Friendica\Core\Config\Util\ConfigFileLoader( + $configFileLoader = new ConfigFileLoader( $this->root->url(), $this->root->url() . DIRECTORY_SEPARATOR . Config::CONFIG_DIR, $this->root->url() . DIRECTORY_SEPARATOR . Config::STATIC_DIR @@ -333,7 +333,7 @@ class ConfigFileLoaderTest extends MockedTest ->at($this->root->getChild('config')) ->setContent(file_get_contents($fileDir . 'B.ini.php')); - $configFileLoader = new \Friendica\Core\Config\Util\ConfigFileLoader( + $configFileLoader = new ConfigFileLoader( $this->root->url(), $this->root->url() . DIRECTORY_SEPARATOR . Config::CONFIG_DIR, $this->root->url() . DIRECTORY_SEPARATOR . Config::STATIC_DIR From ce7af4edb85db92b1440c77e247a7e5c34049496 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roland=20H=C3=A4der?= Date: Sat, 16 Jul 2022 07:43:29 +0200 Subject: [PATCH 2/7] All these methods need to return an integer (0=Success) or otherwise doExecute() will return NULL. --- src/Console/ServerBlock.php | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Console/ServerBlock.php b/src/Console/ServerBlock.php index 38ae35d105..c25b57ae79 100644 --- a/src/Console/ServerBlock.php +++ b/src/Console/ServerBlock.php @@ -118,6 +118,9 @@ HELP; foreach ($blocklist as $domain) { fputcsv($fp, $domain); } + + // Success + return 0; } /** * Imports a list of domains and a reason for the block from a CSV @@ -130,6 +133,7 @@ HELP; $filename = $this->getArgument(1); $currBlockList = $config->get('system', 'blocklist', []); $newBlockList = []; + if (($fp = fopen($filename, 'r')) !== false) { while (($data = fgetcsv($fp, 1000, ',')) !== false) { $domain = $data[0]; @@ -146,11 +150,13 @@ HELP; $newBlockList[] = $data; } } + foreach ($currBlockList as $blocked) { if (!in_array($blocked, $newBlockList)) { $newBlockList[] = $blocked; } } + if ($config->set('system', 'blocklist', $newBlockList)) { $this->out(sprintf("Entries from %s that were not blocked before are now blocked", $filename)); return 0; @@ -158,7 +164,6 @@ HELP; $this->out(sprintf("Couldn't save '%s' as blocked server", $domain)); return 1; } - } else { throw new Exception(sprintf('The file "%s" could not be opened for importing', $filename)); } @@ -178,6 +183,9 @@ HELP; $table->addRow($domain); } $this->out($table->getTable()); + + // Success + return 0; } /** From cb7f52cc6a3b21476ed7fa44af34e46486d28038 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roland=20H=C3=A4der?= Date: Sat, 16 Jul 2022 12:18:08 +0200 Subject: [PATCH 3/7] Fixed: - $item is the proper array here, - see https://github.com/friendica/friendica/issues/11632#issuecomment-1186119430 --- src/Protocol/OStatus.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Protocol/OStatus.php b/src/Protocol/OStatus.php index 36dbb06c84..1efbb0bf39 100644 --- a/src/Protocol/OStatus.php +++ b/src/Protocol/OStatus.php @@ -1168,7 +1168,7 @@ class OStatus break; default: - Logger::warning('Unsupported rel=' . $attribute['rel'] . ', href=' . $attribute['href'] . ', object-type=' . $attribute['object-type']); + Logger::warning('Unsupported rel=' . $attribute['rel'] . ', href=' . $attribute['href'] . ', object-type=' . $item['object-type']); } } } From 3f7c98fd37e46b98ea7155f5d604eb9ce69cf285 Mon Sep 17 00:00:00 2001 From: Philipp Date: Sun, 17 Jul 2022 02:26:46 +0200 Subject: [PATCH 4/7] Fix CI / CD woodpecker pipeline - Combination of `labels` and `matrix`-build is broken --- .woodpecker/.continuous-deployment.yml | 9 ++------- .woodpecker/.releaser.yml | 9 ++------- 2 files changed, 4 insertions(+), 14 deletions(-) diff --git a/.woodpecker/.continuous-deployment.yml b/.woodpecker/.continuous-deployment.yml index 5a29fe6129..a486228c7e 100644 --- a/.woodpecker/.continuous-deployment.yml +++ b/.woodpecker/.continuous-deployment.yml @@ -1,8 +1,3 @@ -matrix: - include: - - PHP_MAJOR_VERSION: 7.4 - PHP_VERSION: 7.4.18 - depends_on: - phpunit - code_standards_check @@ -33,7 +28,7 @@ pipeline: settings: backend: "filesystem" restore: true - cache_key: "{{ .Repo.Name }}_php${PHP_MAJOR_VERSION}_{{ arch }}_{{ os }}" + cache_key: "{{ .Repo.Name }}_php7.4_{{ arch }}_{{ os }}" archive_format: "gzip" mount: - '.composer' @@ -44,7 +39,7 @@ pipeline: branch: [ develop, '*-rc' ] event: push composer_install: - image: friendicaci/php${PHP_MAJOR_VERSION}:php${PHP_VERSION} + image: friendicaci/php7.4:php7.4.18 commands: - export COMPOSER_HOME=.composer - composer validate diff --git a/.woodpecker/.releaser.yml b/.woodpecker/.releaser.yml index 5b56a6e1db..d254b81997 100644 --- a/.woodpecker/.releaser.yml +++ b/.woodpecker/.releaser.yml @@ -1,8 +1,3 @@ -matrix: - include: - - PHP_MAJOR_VERSION: 7.4 - PHP_VERSION: 7.4.18 - depends_on: - phpunit - code_standards_check @@ -31,7 +26,7 @@ pipeline: settings: backend: "filesystem" restore: true - cache_key: "{{ .Repo.Name }}_php${PHP_MAJOR_VERSION}_{{ arch }}_{{ os }}" + cache_key: "{{ .Repo.Name }}_php7.4_{{ arch }}_{{ os }}" archive_format: "gzip" mount: - '.composer' @@ -42,7 +37,7 @@ pipeline: branch: stable event: tag composer_install: - image: friendicaci/php${PHP_MAJOR_VERSION}:php${PHP_VERSION} + image: friendicaci/php7.4:php7.4.18 commands: - export COMPOSER_HOME=.composer - composer validate From 2ddf37f32d821c07d2dee1191def1c97c9b4fd4b Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 17 Jul 2022 11:47:12 +0000 Subject: [PATCH 5/7] Emergency fixes to fix a bunch of fatal errors --- src/Model/Contact.php | 6 +++--- src/Protocol/ActivityPub/Processor.php | 2 +- src/Protocol/DFRN.php | 4 ++-- src/Protocol/Diaspora.php | 13 +++++++------ src/Protocol/Email.php | 13 +++++++------ src/Util/XML.php | 12 +++++++----- 6 files changed, 27 insertions(+), 23 deletions(-) diff --git a/src/Model/Contact.php b/src/Model/Contact.php index 5d1e92f4bc..a6bb882e86 100644 --- a/src/Model/Contact.php +++ b/src/Model/Contact.php @@ -359,7 +359,7 @@ class Contact * @throws HTTPException\InternalServerErrorException * @throws \ImagickException */ - public static function isFollowerByURL(string $url, uid $uid): bool + public static function isFollowerByURL(string $url, int $uid): bool { $cid = self::getIdForURL($url, $uid); @@ -1169,11 +1169,11 @@ class Contact * @throws HTTPException\InternalServerErrorException * @throws \ImagickException */ - public static function getIdForURL(string $url, int $uid = 0, $update = null, array $default = []): int + public static function getIdForURL(string $url = null, int $uid = 0, $update = null, array $default = []): int { $contact_id = 0; - if ($url == '') { + if (empty($url)) { Logger::notice('Empty url, quitting', ['url' => $url, 'user' => $uid, 'default' => $default]); return 0; } diff --git a/src/Protocol/ActivityPub/Processor.php b/src/Protocol/ActivityPub/Processor.php index cc869e00ee..c6420436e8 100644 --- a/src/Protocol/ActivityPub/Processor.php +++ b/src/Protocol/ActivityPub/Processor.php @@ -900,7 +900,7 @@ class Processor } // Store send a follow request for every reshare - but only when the item had been stored - if ($stored && ($item['private'] != Item::PRIVATE) && ($item['gravity'] == GRAVITY_PARENT) && ($item['author-link'] != $item['owner-link'])) { + if ($stored && ($item['private'] != Item::PRIVATE) && ($item['gravity'] == GRAVITY_PARENT) && !empty($item['author-link']) && ($item['author-link'] != $item['owner-link'])) { $author = APContact::getByURL($item['owner-link'], false); // We send automatic follow requests for reshared messages. (We don't need though for forum posts) if ($author['type'] != 'Group') { diff --git a/src/Protocol/DFRN.php b/src/Protocol/DFRN.php index edd6c1450e..625afb215a 100644 --- a/src/Protocol/DFRN.php +++ b/src/Protocol/DFRN.php @@ -48,10 +48,10 @@ use Friendica\Network\Probe; use Friendica\Util\Crypto; use Friendica\Util\DateTimeFormat; use Friendica\Util\Images; -use Friendica\Util\Network; use Friendica\Util\Proxy; use Friendica\Util\Strings; use Friendica\Util\XML; +use GuzzleHttp\Psr7\Uri; /** * This class contain functions to create and send DFRN XML files @@ -1013,7 +1013,7 @@ class DFRN $path_parts = explode('/', $parts['path']); array_pop($path_parts); $parts['path'] = implode('/', $path_parts); - $contact['batch'] = Network::unparseURL($parts); + $contact['batch'] = Uri::fromParts($parts); } $dest_url = ($public_batch ? $contact['batch'] : $contact['notify']); diff --git a/src/Protocol/Diaspora.php b/src/Protocol/Diaspora.php index 838d405505..6d3c23dad6 100644 --- a/src/Protocol/Diaspora.php +++ b/src/Protocol/Diaspora.php @@ -50,6 +50,7 @@ use Friendica\Util\Network; use Friendica\Util\Strings; use Friendica\Util\XML; use Friendica\Worker\Delivery; +use GuzzleHttp\Psr7\Uri; use SimpleXMLElement; /** @@ -755,14 +756,14 @@ class Diaspora * @throws \Friendica\Network\HTTPException\InternalServerErrorException * @throws \ImagickException */ - private static function key(string $handle): string + private static function key(string $handle = null): string { $handle = strval($handle); Logger::notice("Fetching diaspora key for: " . $handle); $fcontact = FContact::getByURL($handle); - if ($fcontact) { + if (!empty($fcontact['pubkey'])) { return $fcontact['pubkey']; } @@ -1417,7 +1418,7 @@ class Diaspora $parts = parse_url($person['url']); unset($parts['path']); - $host_url = Network::unparseURL($parts); + $host_url = Uri::fromParts($parts); return $host_url . '/objects/' . $guid; } @@ -4006,12 +4007,12 @@ class Diaspora /** * Sends profile data * - * @param int $uid The user id - * @param bool $recips optional, default false + * @param int $uid The user id + * @param array $recips optional, default empty array * @return void * @throws \Exception */ - public static function sendProfile(int $uid, bool $recips = false) + public static function sendProfile(int $uid, array $recips = []) { if (!$uid) { return; diff --git a/src/Protocol/Email.php b/src/Protocol/Email.php index 7584518449..79ad16ed2f 100644 --- a/src/Protocol/Email.php +++ b/src/Protocol/Email.php @@ -115,13 +115,13 @@ class Email } /** - * @param Connection|resource $mbox mailbox - * @param integer $uid user id + * @param Connection|resource $mbox mailbox + * @param string $sequence * @return mixed */ - public static function messageMeta($mbox, int $uid) + public static function messageMeta($mbox, string $sequence) { - $ret = (($mbox && $uid) ? @imap_fetch_overview($mbox, $uid, FT_UID) : [[]]); // POSSIBLE CLEANUP --> array(array()) is probably redundant now + $ret = (($mbox && $sequence) ? @imap_fetch_overview($mbox, $sequence, FT_UID) : [[]]); // POSSIBLE CLEANUP --> array(array()) is probably redundant now return (count($ret)) ? $ret : []; } @@ -296,6 +296,7 @@ class Email } return $x; } + return ''; } /** @@ -571,7 +572,7 @@ class Email * @param string $message Unfiltered message * @return string Message with no signature */ - private static function removeSig(string $message): string + private static function removeSig(string $message): array { $sigpos = strrpos($message, "\n-- \n"); $quotepos = strrpos($message, "[/quote]"); @@ -662,7 +663,7 @@ class Email return implode("\n", $lines); } - private static function convertQuote(strng $body, string $reply): string + private static function convertQuote(string $body, string $reply): string { // Convert Quotes $arrbody = explode("\n", trim($body)); diff --git a/src/Util/XML.php b/src/Util/XML.php index 0424400a82..e87122dc7c 100644 --- a/src/Util/XML.php +++ b/src/Util/XML.php @@ -42,9 +42,9 @@ class XML * @param bool $remove_header Should the XML header be removed or not? * @param array $namespaces List of namespaces * @param bool $root interally used parameter. Mustn't be used from outside. - * @return void + * @return string */ - public static function fromArray(array $array, &$xml, bool $remove_header = false, array $namespaces = [], bool $root = true) + public static function fromArray(array $array, &$xml, bool $remove_header = false, array $namespaces = [], bool $root = true): string { if ($root) { foreach ($array as $key => $value) { @@ -130,6 +130,7 @@ class XML self::fromArray($value, $element, $remove_header, $namespaces, false); } } + return ''; } /** @@ -142,7 +143,7 @@ class XML */ public static function copy(&$source, &$target, string $elementname) { - if (count($source->children()) == 0) { + if (is_string($source) && count($source->children()) == 0) { $target->addChild($elementname, self::escape($source)); } else { $child = $target->addChild($elementname); @@ -184,9 +185,9 @@ class XML * @param array $attributes Array containing the attributes * @return void */ - public static function addElement(DOMDocument $doc, DOMElement &$parent, string $element, string $value = '', array $attributes = []) + public static function addElement(DOMDocument $doc, DOMElement &$parent, string $element, string $value = null, array $attributes = []) { - $element = self::createElement($doc, $element, $value, $attributes); + $element = self::createElement($doc, $element, $value ?? '', $attributes); $parent->appendChild($element); } @@ -273,6 +274,7 @@ class XML return []; } + $parent = []; libxml_use_internal_errors(true); libxml_clear_errors(); From 6882e70024dcbc9916c94244799de92ef6121557 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 17 Jul 2022 13:00:34 +0000 Subject: [PATCH 6/7] Match the documentation --- src/Protocol/Email.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Protocol/Email.php b/src/Protocol/Email.php index 79ad16ed2f..577760a253 100644 --- a/src/Protocol/Email.php +++ b/src/Protocol/Email.php @@ -570,7 +570,7 @@ class Email * Removes signature from message * * @param string $message Unfiltered message - * @return string Message with no signature + * @return array Message array with no signature (elements "body" and "sig") */ private static function removeSig(string $message): array { From 9a4be84853d37da2e7ca581b153efa7a9036c0e3 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 17 Jul 2022 13:13:14 +0000 Subject: [PATCH 7/7] Only check for string value --- src/Util/XML.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Util/XML.php b/src/Util/XML.php index e87122dc7c..e371ea3cd6 100644 --- a/src/Util/XML.php +++ b/src/Util/XML.php @@ -136,14 +136,14 @@ class XML /** * Copies an XML object * - * @param object $source The XML source - * @param object $target The XML target - * @param string $elementname Name of the XML element of the target + * @param object|string $source The XML source + * @param object $target The XML target + * @param string $elementname Name of the XML element of the target * @return void */ public static function copy(&$source, &$target, string $elementname) { - if (is_string($source) && count($source->children()) == 0) { + if (is_string($source)) { $target->addChild($elementname, self::escape($source)); } else { $child = $target->addChild($elementname);