From a8d3a4d218b9c844b7a5d4134fb7f27d64be559d Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 20 Oct 2018 09:02:10 -0400 Subject: [PATCH 1/7] Add missing L10n::popLang calls --- include/enotify.php | 3 +++ src/Database/DBStructure.php | 1 + 2 files changed, 4 insertions(+) diff --git a/include/enotify.php b/include/enotify.php index 6d8cef879..5665f485f 100644 --- a/include/enotify.php +++ b/include/enotify.php @@ -134,6 +134,7 @@ function notification($params) $thread = Item::selectFirstThreadForUser($params['uid'] ,['ignored'], ['iid' => $parent_id]); if (DBA::isResult($thread) && $thread["ignored"]) { logger("Thread ".$parent_id." will be ignored", LOGGER_DEBUG); + L10n::popLang(); return; } @@ -628,6 +629,7 @@ function notification($params) '$content_allowed' => $content_allowed, ]); + L10n::popLang(); // use the Emailer class to send the message return Emailer::send( [ @@ -643,6 +645,7 @@ function notification($params) ); } + L10n::popLang(); return false; } diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index f8fc1651c..db775b59c 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -90,6 +90,7 @@ class DBStructure 'body' => $body, 'language' => $lang] ); + L10n::popLang(); } //try the logger From 4ffcb77554d70623b2bf27dbbb9b6868a65dd87a Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 20 Oct 2018 09:02:35 -0400 Subject: [PATCH 2/7] Simplify L10n::t + sprintf instances --- src/Database/DBStructure.php | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/Database/DBStructure.php b/src/Database/DBStructure.php index db775b59c..50566dc87 100644 --- a/src/Database/DBStructure.php +++ b/src/Database/DBStructure.php @@ -77,10 +77,9 @@ class DBStructure The friendica developers released update %s recently, but when I tried to install it, something went terribly wrong. This needs to be fixed soon and I can't do it alone. Please contact a - friendica developer if you can not help me on your own. My database might be invalid.")); - $body = L10n::t("The error message is\n[pre]%s[/pre]"); - $preamble = sprintf($preamble, $update_id); - $body = sprintf($body, $error_message); + friendica developer if you can not help me on your own. My database might be invalid.", + $update_id)); + $body = L10n::t("The error message is\n[pre]%s[/pre]", $error_message); notification([ 'uid' => $admin['uid'], From 5326cc0c2edab855271aafb44133e4843903cfe0 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 20 Oct 2018 22:34:26 -0400 Subject: [PATCH 3/7] Add Friendica\LegacyModule class --- src/LegacyModule.php | 73 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 src/LegacyModule.php diff --git a/src/LegacyModule.php b/src/LegacyModule.php new file mode 100644 index 000000000..4b0371edb --- /dev/null +++ b/src/LegacyModule.php @@ -0,0 +1,73 @@ + + */ +class LegacyModule extends BaseModule +{ + /** + * The module name, which is the name of the file (without the .php suffix) + * It's used to check for existence of the module functions. + * + * @var string + */ + private static $moduleName = ''; + + /** + * The only method that needs to be called, with the module/addon file name. + * + * @param string $file_path + */ + public static function setModuleFile($file_path) + { + if (!file_exists($file_path)) { + throw new Exception(Core\L10n::t('Legacy module file not found: %s', $file_path)); + } + + self::$moduleName = basename($file_path, '.php'); + + require_once $file_path; + } + + public static function init() + { + self::runModuleFunction('init'); + } + + public static function content() + { + return self::runModuleFunction('content'); + } + + public static function post() + { + self::runModuleFunction('post'); + } + + public static function afterpost() + { + self::runModuleFunction('afterpost'); + } + + /** + * Runs the module function designated by the provided suffix if it exists, the BaseModule method otherwise + * + * @param string $function_suffix + * @return string + */ + private static function runModuleFunction($function_suffix) + { + $function_name = static::$moduleName . '_' . $function_suffix; + + if (\function_exists($function_name)) { + return $function_name(self::getApp()); + } else { + return parent::{$function_suffix}(); + } + } +} From b27ff9d2b72647b34eae5fc01d98f0ea64122445 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 20 Oct 2018 22:34:55 -0400 Subject: [PATCH 4/7] Remove direct module function calls in index.php --- index.php | 37 ++++++++++--------------------------- 1 file changed, 10 insertions(+), 27 deletions(-) diff --git a/index.php b/index.php index 884b06732..c834688ff 100644 --- a/index.php +++ b/index.php @@ -260,6 +260,8 @@ if (strlen($a->module)) { } else { include_once "addon/{$a->module}/{$a->module}.php"; if (function_exists($a->module . '_module')) { + Friendica\LegacyModule::setModuleFile("addon/{$a->module}/{$a->module}.php"); + $a->module_class = 'Friendica\\LegacyModule'; $a->module_loaded = true; } } @@ -273,10 +275,11 @@ if (strlen($a->module)) { /** * If not, next look for a 'standard' program module in the 'mod' directory + * We emulate a Module class through the LegacyModule class */ - if (! $a->module_loaded && file_exists("mod/{$a->module}.php")) { - include_once "mod/{$a->module}.php"; + Friendica\LegacyModule::setModuleFile("mod/{$a->module}.php"); + $a->module_class = 'Friendica\\LegacyModule'; $a->module_loaded = true; } @@ -336,16 +339,11 @@ if ($a->module_loaded) { Addon::callHooks($a->module . '_mod_init', $placeholder); - if ($a->module_class) { - call_user_func([$a->module_class, 'init']); - } else if (function_exists($a->module . '_init')) { - $func = $a->module . '_init'; - $func($a); - } + call_user_func([$a->module_class, 'init']); // "rawContent" is especially meant for technical endpoints. // This endpoint doesn't need any theme initialization or other comparable stuff. - if (!$a->error && $a->module_class) { + if (!$a->error) { call_user_func([$a->module_class, 'rawContent']); } @@ -356,34 +354,19 @@ if ($a->module_loaded) { if (! $a->error && $_SERVER['REQUEST_METHOD'] === 'POST') { Addon::callHooks($a->module . '_mod_post', $_POST); - if ($a->module_class) { - call_user_func([$a->module_class, 'post']); - } else if (function_exists($a->module . '_post')) { - $func = $a->module . '_post'; - $func($a); - } + call_user_func([$a->module_class, 'post']); } if (! $a->error) { Addon::callHooks($a->module . '_mod_afterpost', $placeholder); - if ($a->module_class) { - call_user_func([$a->module_class, 'afterpost']); - } else if (function_exists($a->module . '_afterpost')) { - $func = $a->module . '_afterpost'; - $func($a); - } + call_user_func([$a->module_class, 'afterpost']); } if (! $a->error) { $arr = ['content' => $a->page['content']]; Addon::callHooks($a->module . '_mod_content', $arr); $a->page['content'] = $arr['content']; - if ($a->module_class) { - $arr = ['content' => call_user_func([$a->module_class, 'content'])]; - } else if (function_exists($a->module . '_content')) { - $func = $a->module . '_content'; - $arr = ['content' => $func($a)]; - } + $arr = ['content' => call_user_func([$a->module_class, 'content'])]; Addon::callHooks($a->module . '_mod_aftercontent', $arr); $a->page['content'] .= $arr['content']; } From 1a37224910d241fa3d6e239dcec24f7d95f41ab7 Mon Sep 17 00:00:00 2001 From: Hypolite Petovan Date: Sat, 20 Oct 2018 22:42:04 -0400 Subject: [PATCH 5/7] Change file_exists to is_readable in LegacyModule --- src/LegacyModule.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/LegacyModule.php b/src/LegacyModule.php index 4b0371edb..737101b5c 100644 --- a/src/LegacyModule.php +++ b/src/LegacyModule.php @@ -25,7 +25,7 @@ class LegacyModule extends BaseModule */ public static function setModuleFile($file_path) { - if (!file_exists($file_path)) { + if (!is_readable($file_path)) { throw new Exception(Core\L10n::t('Legacy module file not found: %s', $file_path)); } From c4cc7a4afbeeb908e660bc53f62c05e018981232 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 21 Oct 2018 05:41:40 +0000 Subject: [PATCH 6/7] The limit for dbclean is now configurable --- config/config.ini.php | 7 ++++++- src/Worker/DBClean.php | 4 ++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/config/config.ini.php b/config/config.ini.php index ea3df52cb..a324e709e 100644 --- a/config/config.ini.php +++ b/config/config.ini.php @@ -121,9 +121,14 @@ db_loglimit_index_high = 0 ; dbclean_expire_conversation (Integer) ; When DBClean is enabled, any entry in the conversation table will be deleted after this many days. -; These data are normally needed only for debugging purposes and they are safe to delete. +: This data is used for ActivityPub, so it shouldn't be lower than the average duration of a discussion. dbclean_expire_conversation = 90 +; dbclean-expire-limit (Integer) +; This defines the number of items that are to be deleted in a single call. +; Reduce this value when you are getting memory issues. +dbclean-expire-limit = 1000 + ; diaspora_test (Boolean) ; For development only. Disables the message transfer. diaspora_test = false diff --git a/src/Worker/DBClean.php b/src/Worker/DBClean.php index ca0da954c..dba9cfd4c 100644 --- a/src/Worker/DBClean.php +++ b/src/Worker/DBClean.php @@ -63,7 +63,7 @@ class DBClean { $count = 0; // We split the deletion in many small tasks - $limit = 1000; + $limit = Config::get('system', 'dbclean-expire-limit', 1000); // Get the expire days for step 8 and 9 $days = Config::get('system', 'dbclean-expire-days', 0); @@ -275,7 +275,7 @@ class DBClean { OR (`item`.`file` != '') OR (`item`.`event-id` != '') OR (`item`.`attach` != '') OR `item`.`wall` OR `item`.`origin`) AND `item`.`parent` = `thread`.`iid`) - ORDER BY `thread`.`iid` LIMIT 1000", $days, $last_id); + ORDER BY `thread`.`iid` LIMIT ?", $days, $last_id, $limit); $count = DBA::numRows($r); if ($count > 0) { logger("found expired threads: ".$count); From 1c54c27784f92faf3f4a2276e625ddc80aabfd8c Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 21 Oct 2018 06:10:24 +0000 Subject: [PATCH 7/7] Bugfix: We hadn't deliverd AP posts to all intended receivers --- src/Protocol/ActivityPub/Transmitter.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Protocol/ActivityPub/Transmitter.php b/src/Protocol/ActivityPub/Transmitter.php index 2291b68e9..7295408d8 100644 --- a/src/Protocol/ActivityPub/Transmitter.php +++ b/src/Protocol/ActivityPub/Transmitter.php @@ -476,7 +476,7 @@ class Transmitter foreach ($permissions[$element] as $receiver) { if ($receiver == $item_profile['followers']) { - $inboxes = self::fetchTargetInboxesforUser($uid, $personal); + $inboxes = array_merge($inboxes, self::fetchTargetInboxesforUser($uid, $personal)); } else { $profile = APContact::getByURL($receiver, false); if (!empty($profile)) {