Merge pull request #3783 from annando/diaspora-migration

Diaspora: Support account migration
This commit is contained in:
Tobias Diekershoff 2017-10-13 12:59:47 +02:00 committed by GitHub
commit fd81a90eb8
6 changed files with 81 additions and 24 deletions

View file

@ -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: 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. 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. 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.

View file

@ -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. 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. 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. 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. Nach dem Umzug wird dein Account auf dem alten Server nicht mehr zuverlässig funktionieren und sollte deshalb gelöscht werden.

View file

@ -508,6 +508,9 @@ function delivery_run(&$argv, &$argc){
logger('diaspora retract: '.$loc); logger('diaspora retract: '.$loc);
Diaspora::send_retraction($target_item,$owner,$contact,$public_message); Diaspora::send_retraction($target_item,$owner,$contact,$public_message);
break; break;
} elseif ($relocate) {
Diaspora::sendAccountMigration($owner, $contact, $uid);
break;
} elseif ($followup) { } elseif ($followup) {
// send comments and likes to owner to relay // send comments and likes to owner to relay
logger('diaspora followup: '.$loc); logger('diaspora followup: '.$loc);

View file

@ -11,6 +11,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\Config; use Friendica\Core\Config;
use Friendica\Core\PConfig;
require_once 'include/items.php'; require_once 'include/items.php';
require_once 'include/bb2diaspora.php'; require_once 'include/bb2diaspora.php';
@ -2958,6 +2959,32 @@ class Diaspora {
return $return_code; 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 * @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 * @param int $uid The user id
*
* @return array The profile data
*/ */
public static function send_profile($uid, $recips = false) { private static function createProfileData($uid) {
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;
$r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.*, `user`.`prvkey` AS `uprvkey`, `contact`.`addr` $r = q("SELECT `profile`.`uid` AS `profile_uid`, `profile`.* , `user`.*, `user`.`prvkey` AS `uprvkey`, `contact`.`addr`
FROM `profile` FROM `profile`
INNER JOIN `user` ON `profile`.`uid` = `user`.`uid` INNER JOIN `user` ON `profile`.`uid` = `user`.`uid`
@ -3675,8 +3690,9 @@ class Diaspora {
intval($uid) intval($uid)
); );
if (!$r) if (!$r) {
return; return array();
}
$profile = $r[0]; $profile = $r[0];
@ -3714,7 +3730,7 @@ class Diaspora {
$tags = trim($tags); $tags = trim($tags);
} }
$message = array("author" => $handle, return array("author" => $handle,
"first_name" => $first, "first_name" => $first,
"last_name" => $last, "last_name" => $last,
"image_url" => $large, "image_url" => $large,
@ -3727,6 +3743,29 @@ class Diaspora {
"searchable" => $searchable, "searchable" => $searchable,
"nsfw" => "false", "nsfw" => "false",
"tag_string" => $tags); "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) { foreach ($recips as $recip) {
logger("Send updated profile data for user ".$uid." to contact ".$recip["id"], LOGGER_DEBUG); logger("Send updated profile data for user ".$uid." to contact ".$recip["id"], LOGGER_DEBUG);

View file

@ -149,7 +149,8 @@ function notifier_run(&$argv, &$argc){
$relocate = true; $relocate = true;
$uid = $item_id; $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 { } else {
// find ancestors // find ancestors
$r = q("SELECT * FROM `item` WHERE `id` = %d AND visible = 1 AND moderated = 0 LIMIT 1", $r = q("SELECT * FROM `item` WHERE `id` = %d AND visible = 1 AND moderated = 0 LIMIT 1",

View file

@ -2,6 +2,7 @@
use Friendica\App; use Friendica\App;
use Friendica\Core\System; use Friendica\Core\System;
use Friendica\Core\PConfig;
require_once("include/Photo.php"); require_once("include/Photo.php");
define("IMPORT_DEBUG", False); define("IMPORT_DEBUG", False);
@ -124,6 +125,12 @@ function import_account(App $a, $file) {
$oldaddr = str_replace('http://', '@', normalise_link($oldbaseurl)); $oldaddr = str_replace('http://', '@', normalise_link($oldbaseurl));
$newaddr = str_replace('http://', '@', normalise_link($newbaseurl)); $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']; $olduid = $account['user']['uid'];
unset($account['user']['uid']); unset($account['user']['uid']);
@ -146,6 +153,8 @@ function import_account(App $a, $file) {
$newuid = last_insert_id(); $newuid = last_insert_id();
//~ $newuid = 1; //~ $newuid = 1;
PConfig::set($newuid, 'system', 'previous_addr', $old_handle);
// Generate a new guid for the account. Otherwise there will be problems with diaspora // Generate a new guid for the account. Otherwise there will be problems with diaspora
q("UPDATE `user` SET `guid` = '%s' WHERE `uid` = %d", q("UPDATE `user` SET `guid` = '%s' WHERE `uid` = %d",
dbesc(generate_user_guid()), intval($newuid)); dbesc(generate_user_guid()), intval($newuid));
@ -183,6 +192,7 @@ function import_account(App $a, $file) {
switch ($contact['network']) { switch ($contact['network']) {
case NETWORK_DFRN: case NETWORK_DFRN:
case NETWORK_DIASPORA:
// send relocate message (below) // send relocate message (below)
break; break;
case NETWORK_ZOT: case NETWORK_ZOT: