]> git.mxchange.org Git - friendica.git/blobdiff - src/Protocol/DFRN.php
Merge pull request #7738 from annando/clean-url
[friendica.git] / src / Protocol / DFRN.php
index 44cd21c391f1f38adf98cb9e93a023ee54a232c6..7dee12b56ca498d0bdb61f9c177a0f774b59859c 100644 (file)
@@ -11,6 +11,7 @@ namespace Friendica\Protocol;
 use DOMDocument;
 use DOMXPath;
 use Friendica\App;
+use Friendica\App\BaseURL;
 use Friendica\Content\OEmbed;
 use Friendica\Content\Text\BBCode;
 use Friendica\Content\Text\HTML;
@@ -19,6 +20,7 @@ use Friendica\Core\Hook;
 use Friendica\Core\Logger;
 use Friendica\Core\Protocol;
 use Friendica\Core\System;
+use Friendica\Core\Session;
 use Friendica\Database\DBA;
 use Friendica\Model\Contact;
 use Friendica\Model\Conversation;
@@ -29,8 +31,8 @@ use Friendica\Model\Mail;
 use Friendica\Model\PermissionSet;
 use Friendica\Model\Profile;
 use Friendica\Model\User;
+use Friendica\Network\Probe;
 use Friendica\Object\Image;
-use Friendica\Util\BaseURL;
 use Friendica\Util\Crypto;
 use Friendica\Util\DateTimeFormat;
 use Friendica\Util\Network;
@@ -1456,7 +1458,7 @@ class DFRN
                $dest_url = ($public_batch ? $contact["batch"] : $contact["notify"]);
 
                if (empty($dest_url)) {
-                       Logger::info('Empty destination', ['contact' => $contact]);
+                       Logger::info('Empty destination', ['public' => $public_batch, 'contact' => $contact]);
                        return -24;
                }
 
@@ -1693,13 +1695,12 @@ class DFRN
                                'location' => $contact['location'], 'addr' => $contact['addr'], 'keywords' => $contact['keywords'],
                                'bdyear' => $contact['bdyear'], 'bd' => $contact['bd'], 'hidden' => $contact['hidden'],
                                'xmpp' => $contact['xmpp'], 'name-date' => DateTimeFormat::utc($contact['name-date']),
-                               'uri-date' => DateTimeFormat::utc($contact['uri-date'])];
+                               'unsearchable' => $contact['hidden'], 'uri-date' => DateTimeFormat::utc($contact['uri-date'])];
 
                        DBA::update('contact', $fields, ['id' => $contact['id'], 'network' => $contact['network']], $contact_old);
 
                        // Update the public contact. Don't set the "hidden" value, this is used differently for public contacts
                        unset($fields['hidden']);
-                       $fields['unsearchable'] = $hide;
                        $condition = ['uid' => 0, 'nurl' => Strings::normaliseLink($contact_old['url'])];
                        DBA::update('contact', $fields, $condition, true);
 
@@ -2177,7 +2178,7 @@ class DFRN
                if (($entrytype == DFRN::TOP_LEVEL) && !empty($importer['id'])) {
                        // The filling of the the "contact" variable is done for legcy reasons
                        // The functions below are partly used by ostatus.php as well - where we have this variable
-                       $contact = Contact::select([], ['id' => $importer['id']]);
+                       $contact = Contact::selectFirst([], ['id' => $importer['id']]);
 
                        // Big question: Do we need these functions? They were part of the "consume_feed" function.
                        // This function once was responsible for DFRN and OStatus.
@@ -2848,115 +2849,6 @@ class DFRN
                return 200;
        }
 
-       /**
-        * @param App    $a            App
-        * @param string $contact_nick contact nickname
-        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
-        */
-       public static function autoRedir(App $a, $contact_nick)
-       {
-               // prevent looping
-               if (!empty($_REQUEST['redir'])) {
-                       Logger::log('autoRedir might be looping because redirect has been redirected', Logger::DEBUG);
-                       // looping prevention also appears to sometimes prevent authentication for images
-                       // because browser may have multiple connections open and load an image on a connection
-                       // whose session wasn't updated when a previous redirect authenticated
-                       // Leaving commented in case looping reappears
-                       //return;
-               }
-
-               if ((! $contact_nick) || ($contact_nick === $a->user['nickname'])) {
-                       return;
-               }
-
-               if (local_user()) {
-                       // We need to find out if $contact_nick is a user on this hub, and if so, if I
-                       // am a contact of that user. However, that user may have other contacts with the
-                       // same nickname as me on other hubs or other networks. Exclude these by requiring
-                       // that the contact have a local URL. I will be the only person with my nickname at
-                       // this URL, so if a result is found, then I am a contact of the $contact_nick user.
-                       //
-                       // We also have to make sure that I'm a legitimate contact--I'm not blocked or pending.
-
-                       $baseurl = System::baseUrl();
-                       $domain_st = strpos($baseurl, "://");
-                       if ($domain_st === false) {
-                               return;
-                       }
-                       $baseurl = substr($baseurl, $domain_st + 3);
-                       $nurl = Strings::normaliseLink($baseurl);
-
-                       $r = User::getByNickname($contact_nick, ["uid"]);
-                       $contact_uid = $r["uid"];
-
-                       /// @todo Why is there a query for "url" *and* "nurl"? Especially this normalising is strange.
-                       $r = q("SELECT `id` FROM `contact` WHERE `uid` = (SELECT `uid` FROM `user` WHERE `nickname` = '%s' LIMIT 1)
-                                       AND `nick` = '%s' AND NOT `self` AND (`url` LIKE '%%%s%%' OR `nurl` LIKE '%%%s%%') AND NOT `blocked` AND NOT `pending` LIMIT 1",
-                               DBA::escape($contact_nick),
-                               DBA::escape($a->user['nickname']),
-                               DBA::escape($baseurl),
-                               DBA::escape($nurl)
-                       );
-                       if ((! DBA::isResult($r))) {
-                               return;
-                       }
-                       // test if redirect authentication already succeeded
-                       // Note that "contact" in the sense used in the $contact_nick argument to this function
-                       // and the sense in the $remote[]["cid"] in the session are opposite.
-                       // In the session variable the user currently fetching is the contact
-                       // while $contact_nick is the nick of tho user who owns the stuff being fetched.
-                       foreach (\Friendica\Core\Session::get('remote', []) as $visitor) {
-                               if ($visitor['uid'] == $contact_uid && $visitor['cid'] == $r[0]['id']) {
-                                       return;
-                               }
-                       }
-
-                       $r = q("SELECT * FROM contact WHERE nick = '%s'
-                                       AND network = '%s' AND uid = %d  AND url LIKE '%%%s%%' LIMIT 1",
-                               DBA::escape($contact_nick),
-                               DBA::escape(Protocol::DFRN),
-                               intval(local_user()),
-                               DBA::escape($baseurl)
-                       );
-                       if (! DBA::isResult($r)) {
-                               return;
-                       }
-
-                       $cid = $r[0]['id'];
-
-                       $dfrn_id = (($r[0]['issued-id']) ? $r[0]['issued-id'] : $r[0]['dfrn-id']);
-
-                       if ($r[0]['duplex'] && $r[0]['issued-id']) {
-                               $orig_id = $r[0]['issued-id'];
-                               $dfrn_id = '1:' . $orig_id;
-                       }
-                       if ($r[0]['duplex'] && $r[0]['dfrn-id']) {
-                               $orig_id = $r[0]['dfrn-id'];
-                               $dfrn_id = '0:' . $orig_id;
-                       }
-
-                       // ensure that we've got a valid ID. There may be some edge cases with forums and non-duplex mode
-                       // that may have triggered some of the "went to {profile/intro} and got an RSS feed" issues
-
-                       if (strlen($dfrn_id) < 3) {
-                               return;
-                       }
-
-                       $sec = Strings::getRandomHex();
-
-                       DBA::insert('profile_check', ['uid' => local_user(), 'cid' => $cid, 'dfrn_id' => $dfrn_id, 'sec' => $sec, 'expire' => time() + 45]);
-
-                       $url = curPageURL();
-
-                       Logger::log('auto_redir: ' . $r[0]['name'] . ' ' . $sec, Logger::DEBUG);
-                       $dest = (($url) ? '&destination_url=' . $url : '');
-                       System::externalRedirect($r[0]['poll'] . '?dfrn_id=' . $dfrn_id
-                               . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest);
-               }
-
-               return;
-       }
-
        /**
         * @brief Returns the activity verb
         *
@@ -3042,4 +2934,19 @@ class DFRN
 
                return (strcmp($existing_edited, $update_edited) < 0);
        }
+
+       /**
+        * Checks if the given contact url does support DFRN
+        *
+        * @param string  $url    profile url
+        * @param boolean $update Update the profile
+        * @return boolean
+        * @throws \Friendica\Network\HTTPException\InternalServerErrorException
+        * @throws \ImagickException
+        */
+       public static function isSupportedByContactUrl($url, $update = false)
+       {
+               $probe = Probe::uri($url, Protocol::DFRN, 0, !$update);
+               return $probe['network'] == Protocol::DFRN;
+       }
 }