]> git.mxchange.org Git - friendica.git/blobdiff - src/Worker/OnePoll.php
Ward againt contact_id = 0 in UpdateContact worker
[friendica.git] / src / Worker / OnePoll.php
index 99d5054ca3b8727ed9077d3410abdeb1f749e62c..462c90e2f716b9647f9559d152dfa9f7ae37b82d 100644 (file)
@@ -1,6 +1,6 @@
 <?php
 /**
- * @copyright Copyright (C) 2010-2021, the Friendica project
+ * @copyright Copyright (C) 2010-2022, the Friendica project
  *
  * @license GNU AGPL version 3 or any later version
  *
@@ -23,13 +23,16 @@ namespace Friendica\Worker;
 
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
+use Friendica\Core\System;
 use Friendica\Database\DBA;
 use Friendica\DI;
 use Friendica\Model\Contact;
+use Friendica\Model\Conversation;
 use Friendica\Model\Item;
 use Friendica\Model\Post;
 use Friendica\Model\User;
-use Friendica\Network\HTTPClientOptions;
+use Friendica\Network\HTTPClient\Client\HttpClientAccept;
+use Friendica\Network\HTTPClient\Client\HttpClientOptions;
 use Friendica\Protocol\Activity;
 use Friendica\Protocol\ActivityPub;
 use Friendica\Protocol\Email;
@@ -39,11 +42,11 @@ use Friendica\Util\Strings;
 
 class OnePoll
 {
-       public static function execute($contact_id = 0, $command = '')
+       public static function execute(int $contact_id = 0, string $command = '')
        {
-               Logger::notice('Start polling/probing contact', ['id' => $contact_id]);
+               Logger::notice('Start polling/probing contact', ['id' => $contact_id, 'command' => $command]);
 
-               $force = ($command == "force");
+               $force = ($command == 'force');
 
                if (empty($contact_id)) {
                        Logger::notice('no contact provided');
@@ -101,7 +104,7 @@ class OnePoll
 
                if ($success) {
                        self::updateContact($contact, ['failed' => false, 'last-update' => $updated, 'success_update' => $updated]);
-                       Contact::unmarkForArchival($contact);   
+                       Contact::unmarkForArchival($contact);
                } else {
                        self::updateContact($contact, ['failed' => true, 'last-update' => $updated, 'failure_update' => $updated]);
                        Contact::markForArchival($contact);
@@ -116,6 +119,8 @@ class OnePoll
         *
         * @param array $contact The personal contact entry
         * @param array $fields  The fields that are updated
+        *
+        * @return void
         * @throws \Exception
         */
        private static function updateContact(array $contact, array $fields)
@@ -144,7 +149,7 @@ class OnePoll
         * @return bool   Success
         * @throws \Exception
         */
-       private static function pollFeed(array $contact, $importer)
+       private static function pollFeed(array $contact, array $importer): bool
        {
                // Are we allowed to import from this person?
                if ($contact['rel'] == Contact::FOLLOWER || $contact['blocked']) {
@@ -152,8 +157,8 @@ class OnePoll
                        return false;
                }
 
-               $cookiejar = tempnam(get_temppath(), 'cookiejar-onepoll-');
-               $curlResult = DI::httpClient()->get($contact['poll'], [HTTPClientOptions::COOKIEJAR => $cookiejar]);
+               $cookiejar = tempnam(System::getTempPath(), 'cookiejar-onepoll-');
+               $curlResult = DI::httpClient()->get($contact['poll'], HttpClientAccept::FEED_XML, [HttpClientOptions::COOKIEJAR => $cookiejar]);
                unlink($cookiejar);
 
                if ($curlResult->isTimeout()) {
@@ -172,7 +177,7 @@ class OnePoll
                        return false;
                }
 
-               Logger::notice('Consume feed of contact', ['id' => $contact['id'], 'url' => $contact['poll']]);
+               Logger::notice('Consume feed of contact', ['id' => $contact['id'], 'url' => $contact['poll'], 'Content-Type' => $curlResult->getHeader('Content-Type')]);
 
                return !empty(Feed::import($xml, $importer, $contact));
        }
@@ -183,9 +188,11 @@ class OnePoll
         * @param  array   $contact      The personal contact entry
         * @param  integer $importer_uid The UID of the importer
         * @param  string  $updated      The updated date
+        *
+        * @return bool Success
         * @throws \Exception
         */
-       private static function pollMail(array $contact, $importer_uid, $updated)
+       private static function pollMail(array $contact, int $importer_uid, string $updated): bool
        {
                Logger::info('Fetching mails', ['addr' => $contact['addr']]);
 
@@ -231,29 +238,32 @@ class OnePoll
                        $metas = Email::messageMeta($mbox, implode(',', $msgs));
 
                        if (count($metas) != count($msgs)) {
-                               Logger::log("for " . $mailconf['user'] . " there are ". count($msgs) . " messages but received " . count($metas) . " metas", Logger::DEBUG);
+                               Logger::info("for " . $mailconf['user'] . " there are ". count($msgs) . " messages but received " . count($metas) . " metas");
                        } else {
                                $msgs = array_combine($msgs, $metas);
 
                                foreach ($msgs as $msg_uid => $meta) {
                                        Logger::info('Parsing mail', ['message-uid' => $msg_uid]);
 
-                                       $datarray = [];
-                                       $datarray['uid'] = $importer_uid;
-                                       $datarray['contact-id'] = $contact['id'];
-                                       $datarray['verb'] = Activity::POST;
-                                       $datarray['object-type'] = Activity\ObjectType::NOTE;
-                                       $datarray['network'] = Protocol::MAIL;
-                                       // $meta = Email::messageMeta($mbox, $msg_uid);
-
+                                       $datarray = [
+                                               'uid'         => $importer_uid,
+                                               'contact-id'  => $contact['id'],
+                                               'verb'        => Activity::POST,
+                                               'object-type' => Activity\ObjectType::NOTE,
+                                               'network'     => Protocol::MAIL,
+                                               'protocol'    => Conversation::PARCEL_IMAP,
+                                               'direction'   => Conversation::PULL,
+                                       ];
                                        $datarray['thr-parent'] = $datarray['uri'] = Email::msgid2iri(trim($meta->message_id, '<>'));
 
+                                       // $meta = Email::messageMeta($mbox, $msg_uid);
+
                                        // Have we seen it before?
                                        $fields = ['deleted', 'id'];
                                        $condition = ['uid' => $importer_uid, 'uri' => $datarray['uri']];
                                        $item = Post::selectFirst($fields, $condition);
                                        if (DBA::isResult($item)) {
-                                               Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user']." UID: ".$importer_uid." URI: ".$datarray['uri'],Logger::DEBUG);
+                                               Logger::info('Mail: Seen before ' . $msg_uid . ' for ' . $mailconf['user'] . ' UID: ' . $importer_uid . ' URI: ' . $datarray['uri']);
 
                                                // Only delete when mails aren't automatically moved or deleted
                                                if (($mailconf['action'] != 1) && ($mailconf['action'] != 3))
@@ -264,20 +274,23 @@ class OnePoll
 
                                                switch ($mailconf['action']) {
                                                        case 0:
-                                                               Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user'].". Doing nothing.", Logger::DEBUG);
+                                                               Logger::info('Mail: Seen before ' . $msg_uid . ' for ' . $mailconf['user'] . '. Doing nothing.');
                                                                break;
+
                                                        case 1:
-                                                               Logger::log("Mail: Deleting ".$msg_uid." for ".$mailconf['user']);
+                                                               Logger::notice('Mail: Deleting ' . $msg_uid . ' for ' . $mailconf['user']);
                                                                imap_delete($mbox, $msg_uid, FT_UID);
                                                                break;
+
                                                        case 2:
-                                                               Logger::log("Mail: Mark as seen ".$msg_uid." for ".$mailconf['user']);
+                                                               Logger::notice('Mail: Mark as seen ' . $msg_uid . ' for ' . $mailconf['user']);
                                                                imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
                                                                break;
+
                                                        case 3:
-                                                               Logger::log("Mail: Moving ".$msg_uid." to ".$mailconf['movetofolder']." for ".$mailconf['user']);
+                                                               Logger::notice('Mail: Moving ' . $msg_uid . ' to ' . $mailconf['movetofolder'] . ' for ' . $mailconf['user']);
                                                                imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
-                                                               if ($mailconf['movetofolder'] != "") {
+                                                               if ($mailconf['movetofolder'] != '') {
                                                                        imap_mail_move($mbox, $msg_uid, $mailconf['movetofolder'], FT_UID);
                                                                }
                                                                break;
@@ -316,18 +329,18 @@ class OnePoll
                                                        $datarray['title'] .= $subpart->text;
                                                }
                                        }
-                                       $datarray['title'] = Strings::escapeTags(trim($datarray['title']));
+                                       $datarray['title'] = trim($datarray['title']);
 
                                        //$datarray['title'] = Strings::escapeTags(trim($meta->subject));
                                        $datarray['created'] = DateTimeFormat::utc($meta->date);
 
                                        // Is it a reply?
-                                       $reply = ((substr(strtolower($datarray['title']), 0, 3) == "re:") ||
-                                               (substr(strtolower($datarray['title']), 0, 3) == "re-") ||
-                                               ($raw_refs != ""));
+                                       $reply = ((substr(strtolower($datarray['title']), 0, 3) == 're:') ||
+                                               (substr(strtolower($datarray['title']), 0, 3) == 're-') ||
+                                               ($raw_refs != ''));
 
                                        // Remove Reply-signs in the subject
-                                       $datarray['title'] = self::RemoveReply($datarray['title']);
+                                       $datarray['title'] = self::removeReply($datarray['title']);
 
                                        // If it seems to be a reply but a header couldn't be found take the last message with matching subject
                                        if (empty($datarray['thr-parent']) && $reply) {
@@ -369,11 +382,11 @@ class OnePoll
                                        }
 
                                        $datarray['author-name'] = $fromname;
-                                       $datarray['author-link'] = "mailto:".$frommail;
+                                       $datarray['author-link'] = 'mailto:' . $frommail;
                                        $datarray['author-avatar'] = $contact['photo'];
 
                                        $datarray['owner-name'] = $contact['name'];
-                                       $datarray['owner-link'] = "mailto:".$contact['addr'];
+                                       $datarray['owner-link'] = 'mailto:' . $contact['addr'];
                                        $datarray['owner-avatar'] = $contact['photo'];
 
                                        if (empty($datarray['thr-parent']) || ($datarray['thr-parent'] === $datarray['uri'])) {
@@ -387,30 +400,33 @@ class OnePoll
 
                                        $datarray = Email::getMessage($mbox, $msg_uid, $reply, $datarray);
                                        if (empty($datarray['body'])) {
-                                               Logger::log("Mail: can't fetch msg ".$msg_uid." for ".$mailconf['user']);
+                                               Logger::warning('Cannot fetch mail', ['msg-id' => $msg_uid, 'uid' => $mailconf['user']]);
                                                continue;
                                        }
 
-                                       Logger::log("Mail: Importing ".$msg_uid." for ".$mailconf['user']);
+                                       Logger::notice('Mail: Importing ' . $msg_uid . ' for ' . $mailconf['user']);
 
                                        Item::insert($datarray);
 
                                        switch ($mailconf['action']) {
                                                case 0:
-                                                       Logger::log("Mail: Seen before ".$msg_uid." for ".$mailconf['user'].". Doing nothing.", Logger::DEBUG);
+                                                       Logger::info('Mail: Seen before ' . $msg_uid . ' for ' . $mailconf['user'] . '. Doing nothing.');
                                                        break;
+
                                                case 1:
-                                                       Logger::log("Mail: Deleting ".$msg_uid." for ".$mailconf['user']);
+                                                       Logger::notice('Mail: Deleting ' . $msg_uid . ' for ' . $mailconf['user']);
                                                        imap_delete($mbox, $msg_uid, FT_UID);
                                                        break;
+
                                                case 2:
-                                                       Logger::log("Mail: Mark as seen ".$msg_uid." for ".$mailconf['user']);
+                                                       Logger::notice('Mail: Mark as seen ' . $msg_uid . ' for ' . $mailconf['user']);
                                                        imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
                                                        break;
+
                                                case 3:
-                                                       Logger::log("Mail: Moving ".$msg_uid." to ".$mailconf['movetofolder']." for ".$mailconf['user']);
+                                                       Logger::notice('Mail: Moving ' . $msg_uid . ' to ' . $mailconf['movetofolder'] . ' for ' . $mailconf['user']);
                                                        imap_setflag_full($mbox, $msg_uid, "\\Seen", ST_UID);
-                                                       if ($mailconf['movetofolder'] != "") {
+                                                       if ($mailconf['movetofolder'] != '') {
                                                                imap_mail_move($mbox, $msg_uid, $mailconf['movetofolder'], FT_UID);
                                                        }
                                                        break;
@@ -428,9 +444,9 @@ class OnePoll
                return true;
        }
 
-       private static function RemoveReply($subject)
+       private static function removeReply(string $subject): string
        {
-               while (in_array(strtolower(substr($subject, 0, 3)), ["re:", "aw:"])) {
+               while (in_array(strtolower(substr($subject, 0, 3)), ['re:', 'aw:'])) {
                        $subject = trim(substr($subject, 4));
                }
 
@@ -442,9 +458,11 @@ class OnePoll
         * @param array  $importer
         * @param array  $contact
         * @param string $hubmode
+        *
+        * @return bool Success
         * @throws \Friendica\Network\HTTPException\InternalServerErrorException
         */
-       private static function subscribeToHub(string $url, array $importer, array $contact, string $hubmode = 'subscribe')
+       private static function subscribeToHub(string $url, array $importer, array $contact, string $hubmode = 'subscribe'): bool
        {
                $push_url = DI::baseUrl() . '/pubsub/' . $importer['nick'] . '/' . $contact['id'];