]> git.mxchange.org Git - friendica.git/commitdiff
Diaspora: Support account migration
authorMichael <heluecht@pirati.ca>
Fri, 13 Oct 2017 09:22:05 +0000 (09:22 +0000)
committerMichael <heluecht@pirati.ca>
Fri, 13 Oct 2017 09:22:05 +0000 (09:22 +0000)
include/delivery.php
include/diaspora.php
include/notifier.php
include/uimport.php

index f95caed295f8bef2820cd8356675ee9fd913b53f..46ff74a708c8916b7386700da8cc3de62ff70fb8 100644 (file)
@@ -508,6 +508,9 @@ function delivery_run(&$argv, &$argc){
                                        logger('diaspora retract: '.$loc);
                                        Diaspora::send_retraction($target_item,$owner,$contact,$public_message);
                                        break;
+                               } elseif ($relocate) {
+                                       Diaspora::sendAccountMigration($owner, $uid);
+                                       break;
                                } elseif ($followup) {
                                        // send comments and likes to owner to relay
                                        logger('diaspora followup: '.$loc);
index 16bce93e11de08a4b57c95ba7c0a871a781b613a..686963ed89b716ff96dbc58d2bb60eeffced54ce 100644 (file)
@@ -11,6 +11,7 @@
 use Friendica\App;
 use Friendica\Core\System;
 use Friendica\Core\Config;
+use Friendica\Core\PConfig;
 
 require_once 'include/items.php';
 require_once 'include/bb2diaspora.php';
@@ -2958,6 +2959,31 @@ class Diaspora {
                return $return_code;
        }
 
+       /**
+        * @brief sends an "unshare"
+        *
+        * @param array $owner the array of the item owner
+        * @param array $contact Target of the communication
+        *
+        * @return int The result of the transmission
+        */
+       public static function sendAccountMigration($owner, $uid) {
+
+               $old_handle = PConfig::get($uid, 'system', 'previous_addr');
+               $profile = self::createProfileData($uid);
+
+               $signed_text = 'AccountMigration:'.$old_handle.':'.$profile['author'];
+               $signature = rsa_sign($signed_text, $owner["uprvkey"], "sha256");
+
+               $message = array("author" => $old_handle,
+                               "profile" => $profile,
+                               "signature" => $signature);
+
+               logger("Send account migration ".print_r($message, true), LOGGER_DEBUG);
+
+               return self::build_and_transmit($owner, $contact, "account_migration", $message);
+       }
+
        /**
         * @brief Sends a "share" message
         *
@@ -3648,25 +3674,13 @@ class Diaspora {
        }
 
        /**
-        * @brief Sends profile data
+        * @brief Create profile data
         *
         * @param int $uid The user id
+        *
+        * @return array The profile data
         */
-       public static function send_profile($uid, $recips = false) {
-
-               if (!$uid)
-                       return;
-
-               if (!$recips)
-                       $recips = q("SELECT `id`,`name`,`network`,`pubkey`,`notify` FROM `contact` WHERE `network` = '%s'
-                               AND `uid` = %d AND `rel` != %d",
-                               dbesc(NETWORK_DIASPORA),
-                               intval($uid),
-                               intval(CONTACT_IS_SHARING)
-                       );
-               if (!$recips)
-                       return;
-
+       private static function createProfileData($uid) {
                $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.*, `user`.`prvkey` AS `uprvkey`, `contact`.`addr`
                        FROM `profile`
                        INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
@@ -3675,8 +3689,9 @@ class Diaspora {
                        intval($uid)
                );
 
-               if (!$r)
-                       return;
+               if (!$r) {
+                       return array();
+               }
 
                $profile = $r[0];
 
@@ -3714,7 +3729,7 @@ class Diaspora {
                        $tags = trim($tags);
                }
 
-               $message = array("author" => $handle,
+               return array("author" => $handle,
                                "first_name" => $first,
                                "last_name" => $last,
                                "image_url" => $large,
@@ -3727,6 +3742,29 @@ class Diaspora {
                                "searchable" => $searchable,
                                "nsfw" => "false",
                                "tag_string" => $tags);
+       }
+
+       /**
+        * @brief Sends profile data
+        *
+        * @param int $uid The user id
+        */
+       public static function send_profile($uid, $recips = false) {
+
+               if (!$uid)
+                       return;
+
+               if (!$recips)
+                       $recips = q("SELECT `id`,`name`,`network`,`pubkey`,`notify` FROM `contact` WHERE `network` = '%s'
+                               AND `uid` = %d AND `rel` != %d",
+                               dbesc(NETWORK_DIASPORA),
+                               intval($uid),
+                               intval(CONTACT_IS_SHARING)
+                       );
+               if (!$recips)
+                       return;
+
+               $message = self::createProfileData($uid);
 
                foreach ($recips as $recip) {
                        logger("Send updated profile data for user ".$uid." to contact ".$recip["id"], LOGGER_DEBUG);
index e5e49cf3005fd23d0687b2a6b0fdf2933f059fed..e5ead46e36296e0c74a6cb9c55348c0cb324b8d7 100644 (file)
@@ -149,7 +149,8 @@ function notifier_run(&$argv, &$argc){
                $relocate = true;
                $uid = $item_id;
 
-               $recipients_relocate = q("SELECT * FROM contact WHERE uid = %d  AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN);
+               $recipients_relocate = q("SELECT * FROM `contact` WHERE `uid` = %d AND NOT `self` AND `network` IN ('%s', '%s')",
+                                       intval($uid), NETWORK_DFRN, NETWORK_DIASPORA);
        } else {
                // find ancestors
                $r = q("SELECT * FROM `item` WHERE `id` = %d AND visible = 1 AND moderated = 0 LIMIT 1",
index 359fc90673d083a5e317bfda4a415a4b905900ca..442df94460777cb5ef555982929d4c80786ed9bc 100644 (file)
@@ -2,6 +2,7 @@
 
 use Friendica\App;
 use Friendica\Core\System;
+use Friendica\Core\PConfig;
 
 require_once("include/Photo.php");
 define("IMPORT_DEBUG", False);
@@ -124,6 +125,12 @@ function import_account(App $a, $file) {
        $oldaddr = str_replace('http://', '@', normalise_link($oldbaseurl));
        $newaddr = str_replace('http://', '@', normalise_link($newbaseurl));
 
+       if (!empty($account['profile']['addr'])) {
+               $old_handle = $account['profile']['addr'];
+       } else {
+               $old_handle = $account['user']['nickname'].$oldaddr;
+       }
+
        $olduid = $account['user']['uid'];
 
        unset($account['user']['uid']);
@@ -146,6 +153,8 @@ function import_account(App $a, $file) {
        $newuid = last_insert_id();
        //~ $newuid = 1;
 
+       PConfig::set($newuid, 'system', 'previous_addr', $old_handle);
+
        // Generate a new guid for the account. Otherwise there will be problems with diaspora
        q("UPDATE `user` SET `guid` = '%s' WHERE `uid` = %d",
                dbesc(generate_user_guid()), intval($newuid));
@@ -183,6 +192,7 @@ function import_account(App $a, $file) {
 
                        switch ($contact['network']) {
                                case NETWORK_DFRN:
+                               case NETWORK_DIASPORA:
                                        //  send relocate message (below)
                                        break;
                                case NETWORK_ZOT: