This commit is contained in:
friendica 2012-11-06 01:10:36 -08:00
commit 776552226b
25 changed files with 869 additions and 293 deletions

View file

@ -3,7 +3,7 @@
require_once("boot.php");
function cronhooks_run($argv, $argc){
function cronhooks_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)) {

View file

@ -232,8 +232,9 @@ function q($sql) {
if($db && $db->connected) {
$stmt = vsprintf($sql,$args);
//logger("dba: q: $stmt", LOGGER_ALL);
if($stmt === false)
logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true));
logger('dba: vsprintf error: ' . print_r(debug_backtrace(),true), LOGGER_DEBUG);
return $db->q($stmt);
}

View file

@ -3,7 +3,7 @@ require_once("boot.php");
require_once('include/queue_fn.php');
require_once('include/html2plain.php');
function delivery_run($argv, $argc){
function delivery_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)){

View file

@ -1,7 +1,7 @@
<?php
require_once("boot.php");
function directory_run($argv, $argc){
function directory_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)) {

View file

@ -2,7 +2,7 @@
require_once("boot.php");
function expire_run($argv, $argc){
function expire_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)) {

View file

@ -4,7 +4,7 @@ require_once("boot.php");
require_once('include/Scrape.php');
require_once('include/socgraph.php');
function gprobe_run($argv, $argc){
function gprobe_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)) {

View file

@ -2168,9 +2168,10 @@ function consume_feed($xml,$importer,&$contact, &$hub, $datedir = 0, $pass = 0)
}
function local_delivery($importer,$data) {
$a = get_app();
logger(__function__, LOGGER_TRACE);
if($importer['readonly']) {
// We aren't receiving stuff from this person. But we will quietly ignore them
// rather than a blatant "go away" message.
@ -2305,7 +2306,7 @@ function local_delivery($importer,$data) {
}
/*
// Currently unsupported - needs a lot of work
$reloc = $feed->get_feed_tags( NAMESPACE_DFRN, 'relocate' );
if(isset($reloc[0]['child'][NAMESPACE_DFRN])) {
@ -2315,23 +2316,79 @@ function local_delivery($importer,$data) {
$newloc['cid'] = $importer['id'];
$newloc['name'] = notags(unxmlify($base['name'][0]['data']));
$newloc['photo'] = notags(unxmlify($base['photo'][0]['data']));
$newloc['thumb'] = notags(unxmlify($base['thumb'][0]['data']));
$newloc['micro'] = notags(unxmlify($base['micro'][0]['data']));
$newloc['url'] = notags(unxmlify($base['url'][0]['data']));
$newloc['request'] = notags(unxmlify($base['request'][0]['data']));
$newloc['confirm'] = notags(unxmlify($base['confirm'][0]['data']));
$newloc['notify'] = notags(unxmlify($base['notify'][0]['data']));
$newloc['poll'] = notags(unxmlify($base['poll'][0]['data']));
$newloc['site-pubkey'] = notags(unxmlify($base['site-pubkey'][0]['data']));
$newloc['pubkey'] = notags(unxmlify($base['pubkey'][0]['data']));
$newloc['prvkey'] = notags(unxmlify($base['prvkey'][0]['data']));
$newloc['sitepubkey'] = notags(unxmlify($base['sitepubkey'][0]['data']));
/** relocated user must have original key pair */
/*$newloc['pubkey'] = notags(unxmlify($base['pubkey'][0]['data']));
$newloc['prvkey'] = notags(unxmlify($base['prvkey'][0]['data']));*/
logger("items:relocate contact ".print_r($newloc, true).print_r($importer, true), LOGGER_DEBUG);
// update contact
$r = q("SELECT photo, url FROM contact WHERE id=%d AND uid=%d;",
intval($importer['id']),
intval($importer['importer_uid']));
if ($r === false)
return 1;
$old = $r[0];
$x = q("UPDATE contact SET
name = '%s',
photo = '%s',
thumb = '%s',
micro = '%s',
url = '%s',
request = '%s',
confirm = '%s',
notify = '%s',
poll = '%s',
`site-pubkey` = '%s'
WHERE id=%d AND uid=%d;",
dbesc($newloc['name']),
dbesc($newloc['photo']),
dbesc($newloc['thumb']),
dbesc($newloc['micro']),
dbesc($newloc['url']),
dbesc($newloc['request']),
dbesc($newloc['confirm']),
dbesc($newloc['notify']),
dbesc($newloc['poll']),
dbesc($newloc['sitepubkey']),
intval($importer['id']),
intval($importer['importer_uid']));
if ($x === false)
return 1;
// update items
$fields = array(
'owner-link' => array($old['url'], $newloc['url']),
'author-link' => array($old['url'], $newloc['url']),
'owner-avatar' => array($old['photo'], $newloc['photo']),
'author-avatar' => array($old['photo'], $newloc['photo']),
);
foreach ($fields as $n=>$f){
$x = q("UPDATE item SET `%s`='%s' WHERE `%s`='%s' AND uid=%d",
$n, dbesc($f[1]),
$n, dbesc($f[0]),
intval($importer['importer_uid']));
if ($x === false)
return 1;
}
// TODO
// merge with current record, current contents have priority
// update record, set url-updated
// update profile photos
// schedule a scan?
return 0;
}
*/
// handle friend suggestion notification

View file

@ -1,5 +1,4 @@
<?php
require_once("boot.php");
require_once('include/queue_fn.php');
require_once('include/html2plain.php');
@ -43,7 +42,7 @@ require_once('include/html2plain.php');
*/
function notifier_run($argv, $argc){
function notifier_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)){
@ -89,6 +88,7 @@ function notifier_run($argv, $argc){
$expire = false;
$mail = false;
$fsuggest = false;
$relocate = false;
$top_level = false;
$recipients = array();
$url_recipients = array();
@ -136,11 +136,15 @@ function notifier_run($argv, $argc){
}
elseif($cmd === 'removeme') {
$r = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($item_id));
if (! $r)
return;
$user = $r[0];
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `self` = 1 LIMIT 1", intval($item_id));
if (! $r)
return;
$self = $r[0];
$r = q("SELECT * FROM `contact` WHERE `self` = 0 AND `uid` = %d", intval($item_id));
if(! count($r))
if(! $r)
return;
require_once('include/Contact.php');
foreach($r as $contact) {
@ -148,8 +152,12 @@ function notifier_run($argv, $argc){
}
return;
}
elseif($cmd === 'relocate') {
$normal_mode = false;
$relocate = true;
$uid = $item_id;
}
else {
// find ancestors
$r = q("SELECT * FROM `item` WHERE `id` = %d and visible = 1 and moderated = 0 LIMIT 1",
intval($item_id)
@ -214,7 +222,7 @@ function notifier_run($argv, $argc){
// fill this in with a single salmon slap if applicable
$slap = '';
if(! ($mail || $fsuggest)) {
if(! ($mail || $fsuggest || $relocate)) {
require_once('include/group.php');
@ -418,6 +426,45 @@ function notifier_run($argv, $argc){
);
}
elseif($relocate) {
$public_message = false; // suggestions are not public
$sugg_template = get_markup_template('atom_relocate.tpl');
/* get site pubkey. this could be a new installation with no site keys*/
$pubkey = get_config('system','site_pubkey');
if(! $pubkey) {
$res = new_keypair(1024);
set_config('system','site_prvkey', $res['prvkey']);
set_config('system','site_pubkey', $res['pubkey']);
}
$rp = q("SELECT `resource-id` , `scale`, type FROM `photo`
WHERE `profile` = 1 AND `uid` = %d ORDER BY scale;", $uid);
$photos = array();
$ext = Photo::supportedTypes();
foreach($rp as $p){
$photos[$p['scale']] = $a->get_baseurl().'/photo/'.$p['resource-id'].'-'.$p['scale'].'.'.$ext[$p['type']];
}
unset($rp, $ext);
$atom .= replace_macros($sugg_template, array(
'$name' => xmlify($owner['name']),
'$photo' => xmlify($photos[4]),
'$thumb' => xmlify($photos[5]),
'$micro' => xmlify($photos[6]),
'$url' => xmlify($owner['url']),
'$request' => xmlify($owner['request']),
'$confirm' => xmlify($owner['confirm']),
'$notify' => xmlify($owner['notify']),
'$poll' => xmlify($owner['poll']),
'$sitepubkey' => xmlify(get_config('system','site_pubkey')),
//'$pubkey' => xmlify($owner['pubkey']),
//'$prvkey' => xmlify($owner['prvkey']),
));
$recipients_relocate = q("SELECT * FROM contact WHERE uid = %d AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN);
unset($photos);
}
else {
if($followup) {
foreach($items as $item) { // there is only one item
@ -493,9 +540,12 @@ function notifier_run($argv, $argc){
else
$recip_str = implode(', ', $recipients);
$r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ",
dbesc($recip_str)
);
if ($relocate)
$r = $recipients_relocate;
else
$r = q("SELECT * FROM `contact` WHERE `id` IN ( %s ) AND `blocked` = 0 AND `pending` = 0 ",
dbesc($recip_str)
);
require_once('include/salmon.php');
@ -507,7 +557,7 @@ function notifier_run($argv, $argc){
if(count($r)) {
foreach($r as $contact) {
if((! $mail) && (! $fsuggest) && (! $followup) && (! $contact['self'])) {
if((! $mail) && (! $fsuggest) && (! $followup) && (!$relocate) && (! $contact['self'])) {
if(($contact['network'] === NETWORK_DIASPORA) && ($public_message))
continue;
q("insert into deliverq ( `cmd`,`item`,`contact` ) values ('%s', %d, %d )",
@ -544,7 +594,7 @@ function notifier_run($argv, $argc){
// potentially more than one recipient. Start a new process and space them out a bit.
// we will deliver single recipient types of message and email recipients here.
if((! $mail) && (! $fsuggest) && (! $followup)) {
if((! $mail) && (! $fsuggest) && (!$relocate) && (! $followup)) {
$this_batch[] = $contact['id'];
@ -559,7 +609,7 @@ function notifier_run($argv, $argc){
$deliver_status = 0;
logger("main delivery by notifier: followup=$followup mail=$mail fsuggest=$fsuggest");
logger("main delivery by notifier: followup=$followup mail=$mail fsuggest=$fsuggest relocate=$relocate");
switch($contact['network']) {
case NETWORK_DFRN:
@ -916,6 +966,7 @@ function notifier_run($argv, $argc){
return;
}
if (array_search(__file__,get_included_files())===0){
notifier_run($argv,$argc);
killme();

View file

@ -2,7 +2,7 @@
require_once("boot.php");
function onepoll_run($argv, $argc){
function onepoll_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)) {

View file

@ -3,7 +3,7 @@
require_once("boot.php");
function poller_run($argv, $argc){
function poller_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)) {

View file

@ -2,7 +2,7 @@
require_once("boot.php");
require_once('include/queue_fn.php');
function queue_run($argv, $argc){
function queue_run(&$argv, &$argc){
global $a, $db;
if(is_null($a)){

237
include/uimport.php Normal file
View file

@ -0,0 +1,237 @@
<?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 relocate message (below)
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);
}
}
// send relocate messages
proc_run('php', 'include/notifier.php', 'relocate' , $newuid);
info(t("Done. You can now login with your username and password"));
goaway( $a->get_baseurl() ."/login");
}