diff --git a/doc/Move-Account.md b/doc/Move-Account.md index ef8509d8c1..c34a93e949 100644 --- a/doc/Move-Account.md +++ b/doc/Move-Account.md @@ -21,9 +21,11 @@ Friendica will recreate your account on the new server, with your contacts and g A message is sent to Friendica contacts, to inform them about your move: If your contacts are runnning on an updated server, your details on their side will be automatically updated. -GNU Social/Diaspora contacts +GNU Social contacts --- -Contacts on GNU Social or Diaspora will be archived, as we can't inform them about your move. +Contacts on GNU Social will be archived, as we can't inform them about your move. You should ask them to remove your contact from their lists and re-add you, and you should do the same with their contact. -Support for the Diaspora account moving is scheduled for the 3.6 release of Friendica. +Diaspora contacts +--- +Newer Diaspora servers are able to process "account migration" messages. diff --git a/doc/de/Move-Account.md b/doc/de/Move-Account.md index 14de05438c..1b0c7eb8fb 100644 --- a/doc/de/Move-Account.md +++ b/doc/de/Move-Account.md @@ -26,7 +26,9 @@ Friendica wird nun deinen Account auf dem neuen Server wiederherstellen, mit all An deine Friendica Kontakte wird außerdem eine Nachricht gesendet um sie über deine neue Adresse zu informieren. Wenn deine Kontakte ihren Account auf einem aktuellen Server haben werden deine Kontaktdetails automatisch aktualisiert. -Kontakte auf GNU Social oder Diaspora werden archiviert, da wir ihnen keine Information über deinen Umzug zukommen lassen können. +Neuere Diaspora Server unterstützen ebenfalls eine Umzugsbenachrichtigung. + +Kontakte auf GNU Social werden archiviert, da wir ihnen keine Information über deinen Umzug zukommen lassen können. Du solltest sie persönlich anschreiben deinen Eintrag aus ihren Kontaktlisten zu entfernen und dich neu hinzuzufügen, anschließend solltest du da gleiche mit ihren Accounts tun. Nach dem Umzug wird dein Account auf dem alten Server nicht mehr zuverlässig funktionieren und sollte deshalb gelöscht werden. diff --git a/include/delivery.php b/include/delivery.php index f95caed295..cddc9cb004 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -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, $contact, $uid); + break; } elseif ($followup) { // send comments and likes to owner to relay logger('diaspora followup: '.$loc); diff --git a/include/diaspora.php b/include/diaspora.php index 16bce93e11..2e165a05b5 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -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,32 @@ class Diaspora { return $return_code; } + /** + * @brief sends an account migration + * + * @param array $owner the array of the item owner + * @param array $contact Target of the communication + * @param int $uid User ID + * + * @return int The result of the transmission + */ + public static function sendAccountMigration($owner, $contact, $uid) { + + $old_handle = PConfig::get($uid, 'system', 'previous_addr'); + $profile = self::createProfileData($uid); + + $signed_text = 'AccountMigration:'.$old_handle.':'.$profile['author']; + $signature = base64_encode(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 +3675,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 +3690,9 @@ class Diaspora { intval($uid) ); - if (!$r) - return; + if (!$r) { + return array(); + } $profile = $r[0]; @@ -3714,7 +3730,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 +3743,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); diff --git a/include/notifier.php b/include/notifier.php index e5e49cf300..e5ead46e36 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -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", diff --git a/include/uimport.php b/include/uimport.php index 359fc90673..442df94460 100644 --- a/include/uimport.php +++ b/include/uimport.php @@ -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: