+
+ /**
+ * Check a prospective item array against user-level permissions
+ *
+ * @param array $item Expected keys: uri, gravity, and
+ * author-link if is author-id is set,
+ * owner-link if is owner-id is set,
+ * causer-link if is causer-id is set.
+ * @param int $user_id Local user ID
+ * @return bool
+ * @throws \Exception
+ */
+ protected static function isAllowedByUser(array $item, int $user_id)
+ {
+ if (!empty($item['author-id']) && Contact\User::isBlocked($item['author-id'], $user_id)) {
+ Logger::notice('Author is blocked by user', ['author-link' => $item['author-link'], 'uid' => $user_id, 'item-uri' => $item['uri']]);
+ return false;
+ }
+
+ if (!empty($item['owner-id']) && Contact\User::isBlocked($item['owner-id'], $user_id)) {
+ Logger::notice('Owner is blocked by user', ['owner-link' => $item['owner-link'], 'uid' => $user_id, 'item-uri' => $item['uri']]);
+ return false;
+ }
+
+ // The causer is set during a thread completion, for example because of a reshare. It countains the responsible actor.
+ if (!empty($item['causer-id']) && Contact\User::isBlocked($item['causer-id'], $user_id)) {
+ Logger::notice('Causer is blocked by user', ['causer-link' => $item['causer-link'] ?? $item['causer-id'], 'uid' => $user_id, 'item-uri' => $item['uri']]);
+ return false;
+ }
+
+ if (!empty($item['causer-id']) && ($item['gravity'] === GRAVITY_PARENT) && Contact\User::isIgnored($item['causer-id'], $user_id)) {
+ Logger::notice('Causer is ignored by user', ['causer-link' => $item['causer-link'] ?? $item['causer-id'], 'uid' => $user_id, 'item-uri' => $item['uri']]);
+ return false;
+ }
+
+ return true;
+ }