+ }
+
+ if ($parent_guid != '') {
+ return "https://".substr($addr,strpos($addr,"@")+1)."/posts/".$parent_guid."#".$guid;
+ } else {
+ return "https://".substr($addr,strpos($addr,"@")+1)."/posts/".$guid;
+ }
+ }
+
+ /**
+ * @brief Receives account migration
+ *
+ * @param array $importer Array of the importer user
+ * @param object $data The message object
+ *
+ * @return bool Success
+ */
+ private static function receiveAccountMigration($importer, $data) {
+ $old_handle = notags(unxmlify($data->author));
+ $new_handle = notags(unxmlify($data->profile->author));
+ $signature = notags(unxmlify($data->signature));
+
+ $contact = self::contact_by_handle($importer["uid"], $old_handle);
+ if (!$contact) {
+ logger("cannot find contact for sender: ".$old_handle." and user ".$importer["uid"]);
+ return false;
+ }
+
+ logger("Got migration for ".$old_handle.", to ".$new_handle." with user ".$importer["uid"]);
+
+ // Check signature
+ $signed_text = 'AccountMigration:'.$old_handle.':'.$new_handle;
+ $key = self::key($old_handle);
+ if (!rsa_verify($signed_text, $signature, $key, "sha256")) {
+ logger('No valid signature for migration.');
+ return false;
+ }
+
+ // Update the profile
+ self::receive_profile($importer, $data->profile);
+
+ // change the technical stuff in contact and gcontact
+ $data = Probe::uri($new_handle);
+ if ($data['network'] == NETWORK_PHANTOM) {
+ logger('Account for '.$new_handle." couldn't be probed.");
+ return false;
+ }
+
+ $fields = array('url' => $data['url'], 'nurl' => normalise_link($data['url']),
+ 'name' => $data['name'], 'nick' => $data['nick'],
+ 'addr' => $data['addr'], 'batch' => $data['batch'],
+ 'notify' => $data['notify'], 'poll' => $data['poll'],
+ 'network' => $data['network']);
+
+ dba::update('contact', $fields, array('addr' => $old_handle));
+
+ $fields = array('url' => $data['url'], 'nurl' => normalise_link($data['url']),
+ 'name' => $data['name'], 'nick' => $data['nick'],
+ 'addr' => $data['addr'], 'connect' => $data['addr'],
+ 'notify' => $data['notify'], 'photo' => $data['photo'],
+ 'server_url' => $data['baseurl'], 'network' => $data['network']);
+
+ dba::update('gcontact', $fields, array('addr' => $old_handle));
+
+ logger('Contacts are updated.');
+
+ // update items
+ /// @todo This is an extreme performance killer
+ $fields = array(
+ 'owner-link' => array($contact["url"], $data["url"]),
+ 'author-link' => array($contact["url"], $data["url"]),
+ );
+ foreach ($fields as $n=>$f) {
+ $r = q("SELECT `id` FROM `item` WHERE `%s` = '%s' AND `uid` = %d LIMIT 1",
+ $n, dbesc($f[0]),
+ intval($importer["uid"]));
+
+ if (dbm::is_result($r)) {
+ $x = q("UPDATE `item` SET `%s` = '%s' WHERE `%s` = '%s' AND `uid` = %d",
+ $n, dbesc($f[1]),
+ $n, dbesc($f[0]),
+ intval($importer["uid"]));
+
+ if ($x === false) {
+ return false;
+ }
+ }
+ }