]> git.mxchange.org Git - friendica.git/commitdiff
Merge pull request #4596 from annando/attachment-encode
authorHypolite Petovan <mrpetovan@gmail.com>
Wed, 14 Mar 2018 22:59:25 +0000 (18:59 -0400)
committerGitHub <noreply@github.com>
Wed, 14 Mar 2018 22:59:25 +0000 (18:59 -0400)
Attachment encode

14 files changed:
boot.php
database.sql
include/conversation.php
include/items.php
include/text.php
index.php
mod/ostatus_subscribe.php
mod/pubsub.php
mod/settings.php
src/Database/DBStructure.php
src/Protocol/OStatus.php
src/Util/Network.php
view/templates/settings/connectors.tpl
view/theme/frio/templates/settings/connectors.tpl

index b8b9b0ec288de70711f7cbec8e6d4fd0da7ea743..caf645c0486c80521d7c31964d2d5f7a4b2acf25 100644 (file)
--- a/boot.php
+++ b/boot.php
@@ -39,7 +39,7 @@ define('FRIENDICA_PLATFORM',     'Friendica');
 define('FRIENDICA_CODENAME',     'Asparagus');
 define('FRIENDICA_VERSION',      '3.6-rc');
 define('DFRN_PROTOCOL_VERSION',  '2.23');
-define('DB_UPDATE_VERSION',      1255);
+define('DB_UPDATE_VERSION',      1256);
 define('NEW_UPDATE_ROUTINE_VERSION', 1170);
 
 /**
index 4275c38315ccf26cd82c81b1df9dbcd3c93614de..181e9e804a00d73f01014629d24b95b59442d06f 100644 (file)
@@ -1,6 +1,6 @@
 -- ------------------------------------------
--- Friendica 3.6-dev (Asparagus)
--- DB_UPDATE_VERSION 1255
+-- Friendica 3.6-rc (Asparagus)
+-- DB_UPDATE_VERSION 1256
 -- ------------------------------------------
 
 
@@ -466,6 +466,7 @@ CREATE TABLE IF NOT EXISTS `item` (
        `author-link` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `author-avatar` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `title` varchar(255) NOT NULL DEFAULT '' COMMENT '',
+       `content-warning` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `body` mediumtext COMMENT '',
        `app` varchar(255) NOT NULL DEFAULT '' COMMENT '',
        `verb` varchar(100) NOT NULL DEFAULT '' COMMENT '',
index dc99a831968dfb214c3b0ffdefde45416232460d..0fc43fb090abca4173e1cad9d232097b0dabf354 100644 (file)
@@ -445,7 +445,7 @@ These Fields are not added below (yet). They are here to for bug search.
        return "`item`.`author-id`, `item`.`author-link`, `item`.`author-name`, `item`.`author-avatar`,
                `item`.`owner-id`, `item`.`owner-link`, `item`.`owner-name`, `item`.`owner-avatar`,
                `item`.`contact-id`, `item`.`uid`, `item`.`id`, `item`.`parent`,
-               `item`.`uri`, `item`.`thr-parent`, `item`.`parent-uri`,
+               `item`.`uri`, `item`.`thr-parent`, `item`.`parent-uri`, `item`.`content-warning`,
                `item`.`commented`, `item`.`created`, `item`.`edited`, `item`.`received`,
                `item`.`verb`, `item`.`object-type`, `item`.`postopts`, `item`.`plink`,
                `item`.`guid`, `item`.`wall`, `item`.`private`, `item`.`starred`,
index b46e0d6a6214a2527ad7e446e20443af9bfedba3..af13898b2496d3f48d440314626a9f7b4fb37b2f 100644 (file)
@@ -290,7 +290,7 @@ function subscribe_to_hub($url, $importer, $contact, $hubmode = 'subscribe') {
                return;
        }
 
-       $push_url = Config::get('system','url') . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id'];
+       $push_url = System::baseUrl() . '/pubsub/' . $r[0]['nickname'] . '/' . $contact['id'];
 
        // Use a single verify token, even if multiple hubs
        $verify_token = ((strlen($contact['hub-verify'])) ? $contact['hub-verify'] : random_string());
index 1474b8bf09a230f439cd920552818c505e0b57f2..0aeaa7203be2a384f0a06d525dfc79bad5490b60 100644 (file)
@@ -1182,6 +1182,11 @@ function put_item_in_cache(&$item, $update = false)
                // I'm not sure if we should store it permanently, so we save the old value.
                $body = $item["body"];
 
+               // Add the content warning
+               if (!empty($item['content-warning'])) {
+                       $item["body"] = $item['content-warning'] . '[spoiler]' . $item["body"] . '[/spoiler]';
+               }
+
                $a = get_app();
                redir_private_images($a, $item);
 
index ef84400990198b36bfe6c43ce0c530fdeaa22219..ca7b4217a7fec420e92e56b030257ba2bac55845 100644 (file)
--- a/index.php
+++ b/index.php
@@ -72,7 +72,7 @@ if (!$install) {
        if (Config::get('system', 'force_ssl') && ($a->get_scheme() == "http")
                && (intval(Config::get('system', 'ssl_policy')) == SSL_POLICY_FULL)
                && (substr(System::baseUrl(), 0, 8) == "https://")
-       ) {
+               && ($_SERVER['REQUEST_METHOD'] == 'GET')) {
                header("HTTP/1.1 302 Moved Temporarily");
                header("Location: " . System::baseUrl() . "/" . $a->query_string);
                exit();
index 07f4647e69caed04160a948b1b8cb10f73eab288..e8ba144a1633a7b2e5d30d4a35ffb502096eab73 100644 (file)
@@ -29,12 +29,14 @@ function ostatus_subscribe_content(App $a) {
        if (PConfig::get($uid, "ostatus", "legacy_friends") == "") {
 
                if ($_REQUEST["url"] == "") {
+                       PConfig::delete($uid, "ostatus", "legacy_contact");
                        return $o.L10n::t("No contact provided.");
                }
 
                $contact = Probe::uri($_REQUEST["url"]);
 
                if (!$contact) {
+                       PConfig::delete($uid, "ostatus", "legacy_contact");
                        return $o.L10n::t("Couldn't fetch information for contact.");
                }
 
@@ -44,6 +46,7 @@ function ostatus_subscribe_content(App $a) {
                $data = Network::curl($api."statuses/friends.json?screen_name=".$contact["nick"]);
 
                if (!$data["success"]) {
+                       PConfig::delete($uid, "ostatus", "legacy_contact");
                        return $o.L10n::t("Couldn't fetch friends for contact.");
                }
 
index 1cee91f4db1ef927fe7c9bea04ffaa2175cd539b..a68b222ec4bbbcfd2d876b663c275ea571242fcf 100644 (file)
 
 use Friendica\App;
 use Friendica\Database\DBM;
+use Friendica\Protocol\OStatus;
 
-function hub_return($valid,$body) {
+require_once('include/security.php');
+require_once('include/items.php');
 
-       if($valid) {
-               header($_SERVER["SERVER_PROTOCOL"] . ' 200 ' . 'OK');
+function hub_return($valid, $body)
+{
+       if ($valid) {
+               header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK');
                echo $body;
-               killme();
-       }
-       else {
-               header($_SERVER["SERVER_PROTOCOL"] . ' 404 ' . 'Not Found');
-               killme();
+       } else {
+               header($_SERVER["SERVER_PROTOCOL"] . ' 404 Not Found');
        }
-
-       // NOTREACHED
+       killme();
 }
 
 // when receiving an XML feed, always return OK
 
-function hub_post_return() {
-
-       header($_SERVER["SERVER_PROTOCOL"] . ' 200 ' . 'OK');
+function hub_post_return()
+{
+       header($_SERVER["SERVER_PROTOCOL"] . ' 200 OK');
        killme();
-
 }
 
-
-
-function pubsub_init(App $a) {
-
+function pubsub_init(App $a)
+{
        $nick       = (($a->argc > 1) ? notags(trim($a->argv[1])) : '');
        $contact_id = (($a->argc > 2) ? intval($a->argv[2])       : 0 );
 
-       if($_SERVER['REQUEST_METHOD'] === 'GET') {
+       if ($_SERVER['REQUEST_METHOD'] === 'GET') {
+               $hub_mode      = notags(trim(defaults($_GET, 'hub_mode', '')));
+               $hub_topic     = notags(trim(defaults($_GET, 'hub_topic', '')));
+               $hub_challenge = notags(trim(defaults($_GET, 'hub_challenge', '')));
+               $hub_lease     = notags(trim(defaults($_GET, 'hub_lease_seconds', '')));
+               $hub_verify    = notags(trim(defaults($_GET, 'hub_verify_token', '')));
 
-               $hub_mode      = ((x($_GET,'hub_mode'))          ? notags(trim($_GET['hub_mode']))          : '');
-               $hub_topic     = ((x($_GET,'hub_topic'))         ? notags(trim($_GET['hub_topic']))         : '');
-               $hub_challenge = ((x($_GET,'hub_challenge'))     ? notags(trim($_GET['hub_challenge']))     : '');
-               $hub_lease     = ((x($_GET,'hub_lease_seconds')) ? notags(trim($_GET['hub_lease_seconds'])) : '');
-               $hub_verify    = ((x($_GET,'hub_verify_token'))  ? notags(trim($_GET['hub_verify_token']))  : '');
-
-               logger('pubsub: Subscription from ' . $_SERVER['REMOTE_ADDR']);
-               logger('pubsub: data: ' . print_r($_GET,true), LOGGER_DATA);
+               logger('Subscription from ' . $_SERVER['REMOTE_ADDR'] . ' Mode: ' . $hub_mode . ' Nick: ' . $nick);
+               logger('Data: ' . print_r($_GET,true), LOGGER_DATA);
 
                $subscribe = (($hub_mode === 'subscribe') ? 1 : 0);
 
-               $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1",
-                       dbesc($nick)
-               );
-               if (! DBM::is_result($r)) {
-                       logger('pubsub: local account not found: ' . $nick);
+               $owner = dba::selectFirst('user', ['uid'], ['nickname' => $nick, 'account_expired' => false, 'account_removed' => false]);
+               if (!DBM::is_result($owner)) {
+                       logger('Local account not found: ' . $nick);
                        hub_return(false, '');
                }
 
+               $condition = ['uid' => $owner['uid'], 'id' => $contact_id, 'blocked' => false, 'pending' => false];
 
-               $owner = $r[0];
-
-               $sql_extra = ((strlen($hub_verify)) ? sprintf(" AND `hub-verify` = '%s' ", dbesc($hub_verify)) : '');
+               if (!empty($hub_verify)) {
+                       $condition['hub-verify'] = $hub_verify;
+               }
 
-               $r = q("SELECT * FROM `contact` WHERE `id` = %d AND `uid` = %d
-                       AND `blocked` = 0 AND `pending` = 0 $sql_extra LIMIT 1",
-                       intval($contact_id),
-                       intval($owner['uid'])
-               );
-               if (! DBM::is_result($r)) {
-                       logger('pubsub: contact '.$contact_id.' not found.');
+               $contact = dba::selectFirst('contact', ['id', 'poll'], $condition);
+               if (!DBM::is_result($contact)) {
+                       logger('Contact ' . $contact_id . ' not found.');
                        hub_return(false, '');
                }
 
-               if ($hub_topic)
-                       if(! link_compare($hub_topic,$r[0]['poll'])) {
-                               logger('pubsub: hub topic ' . $hub_topic . ' != ' . $r[0]['poll']);
-                               // should abort but let's humour them.
-                       }
-
-               $contact = $r[0];
+               if (!empty($hub_topic) && !link_compare($hub_topic, $contact['poll'])) {
+                       logger('Hub topic ' . $hub_topic . ' != ' . $contact['poll']);
+                       hub_return(false, '');
+               }
 
                // We must initiate an unsubscribe request with a verify_token.
                // Don't allow outsiders to unsubscribe us.
 
-               if($hub_mode === 'unsubscribe') {
-                       if(! strlen($hub_verify)) {
-                               logger('pubsub: bogus unsubscribe');
-                               hub_return(false, '');
-                       }
-                       logger('pubsub: unsubscribe success');
+               if (($hub_mode === 'unsubscribe') && empty($hub_verify)) {
+                       logger('Bogus unsubscribe');
+                       hub_return(false, '');
                }
 
-               if ($hub_mode)
-                       $r = q("UPDATE `contact` SET `subhub` = %d WHERE `id` = %d",
-                               intval($subscribe),
-                               intval($contact['id'])
-                       );
-
+               if (!empty($hub_mode)) {
+                       dba::update('contact', ['subhub' => $subscribe], ['id' => $contact['id']]);
+                       logger($hub_mode . ' success for contact ' . $contact_id . '.');
+               }
                hub_return(true, $hub_challenge);
        }
 }
 
-require_once('include/security.php');
-
-function pubsub_post(App $a) {
-
+function pubsub_post(App $a)
+{
        $xml = file_get_contents('php://input');
 
-       logger('pubsub: feed arrived from ' . $_SERVER['REMOTE_ADDR'] . ' for ' .  $a->cmd );
-       logger('pubsub: user-agent: ' . $_SERVER['HTTP_USER_AGENT'] );
-       logger('pubsub: data: ' . $xml, LOGGER_DATA);
-
-//     if(! stristr($xml,'<?xml')) {
-//             logger('pubsub_post: bad xml');
-//             hub_post_return();
-//     }
+       logger('Feed arrived from ' . $_SERVER['REMOTE_ADDR'] . ' for ' .  $a->cmd . ' with user-agent: ' . $_SERVER['HTTP_USER_AGENT']);
+       logger('Data: ' . $xml, LOGGER_DATA);
 
        $nick       = (($a->argc > 1) ? notags(trim($a->argv[1])) : '');
        $contact_id = (($a->argc > 2) ? intval($a->argv[2])       : 0 );
 
-       $r = q("SELECT * FROM `user` WHERE `nickname` = '%s' AND `account_expired` = 0 AND `account_removed` = 0 LIMIT 1",
-               dbesc($nick)
-       );
-       if (! DBM::is_result($r)) {
+       $importer = dba::selectFirst('user', [], ['nickname' => $nick, 'account_expired' => false, 'account_removed' => false]);
+       if (!DBM::is_result($importer)) {
                hub_post_return();
        }
 
-       $importer = $r[0];
+       $condition = ['id' => $contact_id, 'uid' => $importer['uid'], 'subhub' => true, 'blocked' => false];
+       $contact = dba::selectFirst('contact', [], $condition);
 
-       $r = q("SELECT * FROM `contact` WHERE `subhub` AND `id` = %d AND `uid` = %d
-               AND (`rel` = %d OR `rel` = %d OR network = '%s') AND NOT `blocked` LIMIT 1",
-               intval($contact_id),
-               intval($importer['uid']),
-               intval(CONTACT_IS_SHARING),
-               intval(CONTACT_IS_FRIEND),
-               dbesc(NETWORK_FEED)
-       );
+       if (!DBM::is_result($contact)) {
+               $author = OStatus::salmonAuthor($xml, $importer);
+               if (!empty($author['contact-id'])) {
+                       $condition = ['id' => $author['contact-id'], 'uid' => $importer['uid'], 'subhub' => true, 'blocked' => false];
+                       $contact = dba::selectFirst('contact', [], $condition);
+                       logger('No record for ' . $nick .' with contact id ' . $contact_id . ' - using '.$author['contact-id'].' instead.');
+               }
+               if (!DBM::is_result($contact)) {
+                       logger('Contact ' . $author["author-link"] . ' (' . $contact_id . ') for user ' . $nick . " wasn't found - ignored. XML: " . $xml);
+                       hub_post_return();
+               }
+       }
 
-       if (! DBM::is_result($r)) {
-               logger('pubsub: no contact record for "'.$nick.' ('.$contact_id.')" - ignored. '.$xml);
+       if (!in_array($contact['rel'], [CONTACT_IS_SHARING, CONTACT_IS_FRIEND]) && ($contact['network'] != NETWORK_FEED)) {
+               logger('Contact ' . $contact['id'] . ' is not expected to share with us - ignored.');
                hub_post_return();
        }
 
-       $contact = $r[0];
-
-       // we have no way to match Diaspora guid's with atom post id's and could get duplicates.
-       // we'll assume that direct delivery is robust (and this is a bad assumption, but the duplicates are messy).
-
-       if($r[0]['network'] === NETWORK_DIASPORA)
+       // We import feeds from OStatus, Friendica and ATOM/RSS.
+       /// @todo Check if Friendica posts really arrive here - otherwise we can discard some stuff
+       if (!in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DFRN, NETWORK_FEED])) {
                hub_post_return();
+       }
 
+       logger('Import item for ' . $nick . ' from ' . $contact['nick'] . ' (' . $contact['id'] . ')');
        $feedhub = '';
+       consume_feed($xml, $importer, $contact, $feedhub);
 
-       require_once('include/items.php');
-
-       consume_feed($xml,$importer,$contact,$feedhub,1,1);
-
-       // do it a second time so that any children find their parents.
-
-       consume_feed($xml,$importer,$contact,$feedhub,1,2);
+       // do it a second time for DFRN so that any children find their parents.
+       if ($contact['network'] === NETWORK_DFRN) {
+               consume_feed($xml, $importer, $contact, $feedhub);
+       }
 
        hub_post_return();
-
 }
index b2dc37324c919bc52554ee83445af7c2bab82934..5fd67afa127fae34d03946e5bd7966a9ce668053 100644 (file)
@@ -207,8 +207,7 @@ function settings_post(App $a)
                return;
        }
 
-       if (($a->argc > 1) && ($a->argv[1] == 'connectors'))
-       {
+       if (($a->argc > 1) && ($a->argv[1] == 'connectors')) {
                check_form_security_token_redirectOnErr('/settings/connectors', 'settings_connectors');
 
                if (x($_POST, 'general-submit')) {
index f4a88871d7a0c8032b5f874232c51f3ba28e637f..a1ef3374f9d6833ae41c103c61d99047522a307c 100644 (file)
@@ -1143,6 +1143,7 @@ class DBStructure
                                                "author-link" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
                                                "author-avatar" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
                                                "title" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
+                                               "content-warning" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
                                                "body" => ["type" => "mediumtext", "comment" => ""],
                                                "app" => ["type" => "varchar(255)", "not null" => "1", "default" => "", "comment" => ""],
                                                "verb" => ["type" => "varchar(100)", "not null" => "1", "default" => "", "comment" => ""],
index fed5cca98dd0d3a132ba8840d81ec03b31f06532..26909102f78e7230bd36c7c9db2e268b2c41230d 100644 (file)
@@ -246,13 +246,12 @@ class OStatus
                $xpath->registerNamespace('ostatus', NAMESPACE_OSTATUS);
                $xpath->registerNamespace('statusnet', NAMESPACE_STATUSNET);
 
-               $entries = $xpath->query('/atom:entry');
+               $contact = ["id" => 0];
 
-               foreach ($entries as $entry) {
-                       // fetch the author
-                       $author = self::fetchAuthor($xpath, $entry, $importer, $contact, true);
-                       return $author;
-               }
+               // Fetch the first author
+               $authordata = $xpath->query('//author')->item(0);
+               $author = self::fetchAuthor($xpath, $authordata, $importer, $contact, true);
+               return $author;
        }
 
        /**
@@ -661,8 +660,9 @@ class OStatus
                // Mastodon Content Warning
                if (($item["verb"] == ACTIVITY_POST) && $xpath->evaluate('boolean(atom:summary)', $entry)) {
                        $clear_text = $xpath->query('atom:summary/text()', $entry)->item(0)->nodeValue;
-
-                       $item["body"] = html2bbcode($clear_text) . '[spoiler]' . $item["body"] . '[/spoiler]';
+                       if (!empty($clear_text)) {
+                               $item['content-warning'] = html2bbcode($clear_text);
+                       }
                }
 
                if (($self != '') && empty($item['protocol'])) {
index c9955f800f40252d588504590016d266f2024a36..d25b799242e052bc4b3406c2b873bca97a166ee8 100644 (file)
@@ -217,7 +217,7 @@ class Network
 
                        $newurl = $curl_info['redirect_url'];
 
-                       if (($new_location_info['path'] == '') && ( $new_location_info['host'] != '')) {
+                       if (($new_location_info['path'] == '') && ($new_location_info['host'] != '')) {
                                $newurl = $new_location_info['scheme'] . '://' . $new_location_info['host'] . $old_location_info['path'];
                        }
 
@@ -229,6 +229,11 @@ class Network
                        if (strpos($newurl, '/') === 0) {
                                $newurl = $old_location_info["scheme"]."://".$old_location_info["host"].$newurl;
                        }
+                       $old_location_query = @parse_url($url, PHP_URL_QUERY);
+
+                       if ($old_location_query != '') {
+                               $newurl .= '?' . $old_location_query;
+                       }
 
                        if (filter_var($newurl, FILTER_VALIDATE_URL)) {
                                $redirects++;
index 58306fb2799e9a3dd3c07382b6988754300468c3..83ebd74f5fb19d68bd64d0c92063b2239f23f344 100644 (file)
@@ -22,7 +22,7 @@
 
        <p><a href="{{$repair_ostatus_url}}">{{$repair_ostatus_text}}</a></p>
 
-       <div class="settings-submit-wrapper" ><input type="submit" name="general-submit" class="settings-submit" value="{{$submit}}" /></div>
+       <div class="settings-submit-wrapper" ><input type="submit" id="general-submit" name="general-submit" class="settings-submit" value="{{$submit}}" /></div>
 </div>
 <div class="clear"></div>
 
index c388a6e25d75ad6d8a1f2105007f31cfb4ed8fae..e5d21158c250d7eb86720a05148636bb8885fae3 100644 (file)
@@ -28,7 +28,7 @@
                                                <p><a href="{{$repair_ostatus_url}}">{{$repair_ostatus_text}}</a></p>
 
                                                <div class="form-group pull-right settings-submit-wrapper" >
-                                                       <button type="submit" name="submit" class="btn btn-primary" value="{{$submit|escape:'html'}}">{{$submit}}</button>
+                                                       <button type="submit" id="general-submit" name="general-submit" class="btn btn-primary" value="{{$submit|escape:'html'}}">{{$submit}}</button>
                                                </div>
                                                <div class="clear"></div>
                                        </div>
@@ -67,4 +67,4 @@
 {{/if}}
 
        </form>
-</div>
\ No newline at end of file
+</div>