Merge pull request #3783 from annando/diaspora-migration
Diaspora: Support account migration
This commit is contained in:
commit
fd81a90eb8
6 changed files with 81 additions and 24 deletions
|
@ -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.
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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",
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in a new issue