mirror of
https://github.com/friendica/friendica
synced 2024-12-23 12:00:16 +00:00
65d235017c
export basic account data as json import basic account data in db (dbs must be at same schema version)
235 lines
No EOL
7.7 KiB
PHP
235 lines
No EOL
7.7 KiB
PHP
<?php
|
|
/**
|
|
* import account file exported from mod/uexport
|
|
* args:
|
|
* $a App Friendica App Class
|
|
* $file Array array from $_FILES
|
|
*/
|
|
require_once("include/Photo.php");
|
|
define("IMPORT_DEBUG", False);
|
|
|
|
function last_insert_id(){
|
|
global $db;
|
|
if (IMPORT_DEBUG) return 1;
|
|
if($db->mysqli){
|
|
$thedb = $db->getdb();
|
|
return $thedb->insert_id;
|
|
} else {
|
|
return mysql_insert_id();
|
|
}
|
|
}
|
|
|
|
function last_error(){
|
|
global $db;
|
|
return $db->error;
|
|
}
|
|
|
|
function db_import_assoc($table, $arr){
|
|
if (IMPORT_DEBUG) return true;
|
|
if (isset($arr['id'])) unset($arr['id']);
|
|
$cols = implode("`,`", array_map('dbesc', array_keys($arr)));
|
|
$vals = implode("','", array_map('dbesc', array_values($arr)));
|
|
$query = "INSERT INTO `$table` (`$cols`) VALUES ('$vals')";
|
|
logger("uimport: $query",LOGGER_TRACE);
|
|
return q($query);
|
|
}
|
|
|
|
function import_cleanup($newuid) {
|
|
q("DELETE FROM `user` WHERE uid = %d", $newuid);
|
|
q("DELETE FROM `contact` WHERE uid = %d", $newuid);
|
|
q("DELETE FROM `profile` WHERE uid = %d", $newuid);
|
|
q("DELETE FROM `photo` WHERE uid = %d", $newuid);
|
|
q("DELETE FROM `group` WHERE uid = %d", $newuid);
|
|
q("DELETE FROM `group_member` WHERE uid = %d", $newuid);
|
|
q("DELETE FROM `pconfig` WHERE uid = %d", $newuid);
|
|
|
|
}
|
|
|
|
function import_account(&$a, $file) {
|
|
logger("Start user import from ".$file['tmp_name']);
|
|
/*
|
|
STEPS
|
|
1. checks
|
|
2. replace old baseurl with new baseurl
|
|
3. import data (look at user id and contacts id)
|
|
4. archive non-dfrn contacts
|
|
5. send message to dfrn contacts
|
|
*/
|
|
|
|
$account = json_decode(file_get_contents($file['tmp_name']), true);
|
|
if ($account===null) {
|
|
notice(t("Error decoding account file"));
|
|
return;
|
|
}
|
|
|
|
|
|
if (!x($account, 'version')) {
|
|
notice(t("Error! No version data in file! This is not a Friendica account file?"));
|
|
return;
|
|
}
|
|
|
|
if ($account['schema'] != DB_UPDATE_VERSION) {
|
|
notice(t("Error! I can't import this file: DB schema version is not compatible."));
|
|
return;
|
|
}
|
|
|
|
|
|
$oldbaseurl = $account['baseurl'];
|
|
$newbaseurl = $a->get_baseurl();
|
|
$olduid = $account['user']['uid'];
|
|
|
|
unset($account['user']['uid']);
|
|
foreach($account['user'] as $k => &$v) {
|
|
$v = str_replace($oldbaseurl, $newbaseurl, $v);
|
|
}
|
|
|
|
|
|
// import user
|
|
$r = db_import_assoc('user', $account['user']);
|
|
if ($r===false) {
|
|
//echo "<pre>"; var_dump($r, $query, mysql_error()); killme();
|
|
logger("uimport:insert user : ERROR : ".last_error(), LOGGER_NORMAL);
|
|
notice(t("User creation error"));
|
|
return;
|
|
}
|
|
$newuid = last_insert_id();
|
|
//~ $newuid = 1;
|
|
|
|
|
|
|
|
foreach($account['profile'] as &$profile) {
|
|
foreach($profile as $k=>&$v) {
|
|
$v = str_replace($oldbaseurl, $newbaseurl, $v);
|
|
foreach(array("profile","avatar") as $k)
|
|
$v = str_replace($newbaseurl."/photo/".$k."/".$olduid.".jpg", $newbaseurl."/photo/".$k."/".$newuid.".jpg", $v);
|
|
}
|
|
$profile['uid'] = $newuid;
|
|
$r = db_import_assoc('profile', $profile);
|
|
if ($r===false) {
|
|
logger("uimport:insert profile ".$profile['profile-name']." : ERROR : ".last_error(), LOGGER_NORMAL);
|
|
info(t("User profile creation error"));
|
|
import_cleanup($newuid);
|
|
return;
|
|
}
|
|
}
|
|
|
|
$errorcount=0;
|
|
foreach($account['contact'] as &$contact) {
|
|
if ($contact['uid'] == $olduid && $contact['self'] == '1'){
|
|
foreach($contact as $k=>&$v) {
|
|
$v = str_replace($oldbaseurl, $newbaseurl, $v);
|
|
foreach(array("profile","avatar","micro") as $k)
|
|
$v = str_replace($newbaseurl."/photo/".$k."/".$olduid.".jpg", $newbaseurl."/photo/".$k."/".$newuid.".jpg", $v);
|
|
}
|
|
}
|
|
if ($contact['uid'] == $olduid && $contact['self'] == '0') {
|
|
switch ($contact['network']){
|
|
case NETWORK_DFRN:
|
|
// send moved message
|
|
break;
|
|
case NETWORK_ZOT:
|
|
// TODO handle zot network
|
|
break;
|
|
case NETWORK_MAIL2:
|
|
// TODO ?
|
|
break;
|
|
case NETWORK_FEED:
|
|
case NETWORK_MAIL:
|
|
// Nothing to do
|
|
break;
|
|
default:
|
|
// archive other contacts
|
|
$contact['archive'] = "1";
|
|
}
|
|
}
|
|
$contact['uid'] = $newuid;
|
|
$r = db_import_assoc('contact', $contact);
|
|
if ($r===false) {
|
|
logger("uimport:insert contact ".$contact['nick'].",".$contact['network']." : ERROR : ".last_error(), LOGGER_NORMAL);
|
|
$errorcount++;
|
|
} else {
|
|
$contact['newid'] = last_insert_id();
|
|
}
|
|
}
|
|
if ($errorcount>0) {
|
|
notice( sprintf(tt("%d contact not imported", "%d contacts not imported", $errorcount), $errorcount) );
|
|
}
|
|
|
|
foreach($account['group'] as &$group) {
|
|
$group['uid'] = $newuid;
|
|
$r = db_import_assoc('group', $group);
|
|
if ($r===false) {
|
|
logger("uimport:insert group ".$group['name']." : ERROR : ".last_error(), LOGGER_NORMAL);
|
|
} else {
|
|
$group['newid'] = last_insert_id();
|
|
}
|
|
}
|
|
|
|
foreach($account['group_member'] as &$group_member) {
|
|
$group_member['uid'] = $newuid;
|
|
|
|
$import = 0;
|
|
foreach($account['group'] as $group) {
|
|
if ($group['id'] == $group_member['gid'] && isset($group['newid'])) {
|
|
$group_member['gid'] = $group['newid'];
|
|
$import++;
|
|
break;
|
|
}
|
|
}
|
|
foreach($account['contact'] as $contact) {
|
|
if ($contact['id'] == $group_member['contact-id'] && isset($contact['newid'])) {
|
|
$group_member['contact-id'] = $contact['newid'];
|
|
$import++;
|
|
break;
|
|
}
|
|
}
|
|
if ($import==2) {
|
|
$r = db_import_assoc('group_member', $group_member);
|
|
if ($r===false) {
|
|
logger("uimport:insert group member ".$group_member['id']." : ERROR : ".last_error(), LOGGER_NORMAL);
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
foreach($account['photo'] as &$photo) {
|
|
$photo['uid'] = $newuid;
|
|
$photo['data'] = hex2bin($photo['data']);
|
|
|
|
$p = new Photo($photo['data'], $photo['type']);
|
|
$r = $p->store(
|
|
$photo['uid'],
|
|
$photo['contact-id'], //0
|
|
$photo['resource-id'],
|
|
$photo['filename'],
|
|
$photo['album'],
|
|
$photo['scale'],
|
|
$photo['profile'], //1
|
|
$photo['allow_cid'],
|
|
$photo['allow_gid'],
|
|
$photo['deny_cid'],
|
|
$photo['deny_gid']
|
|
);
|
|
|
|
if ($r===false) {
|
|
logger("uimport:insert photo ".$photo['resource-id'].",". $photo['scale']. " : ERROR : ".last_error(), LOGGER_NORMAL);
|
|
}
|
|
}
|
|
|
|
foreach($account['pconfig'] as &$pconfig) {
|
|
$pconfig['uid'] = $newuid;
|
|
$r = db_import_assoc('pconfig', $pconfig);
|
|
if ($r===false) {
|
|
logger("uimport:insert pconfig ".$pconfig['id']. " : ERROR : ".last_error(), LOGGER_NORMAL);
|
|
}
|
|
}
|
|
|
|
|
|
info(t("Done. You can now login with your username and password"));
|
|
goaway( $a->get_baseurl() ."/login");
|
|
|
|
|
|
} |