From 65d235017c3536762fd0766976c60337aaac59cb Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Wed, 17 Oct 2012 11:13:01 -0400 Subject: [PATCH 1/6] move account. first step. export basic account data as json import basic account data in db (dbs must be at same schema version) --- include/dba.php | 2 +- include/uimport.php | 235 ++++++++++++++++++++++++++++++++++++++++++++ mod/register.php | 6 +- mod/uexport.php | 183 ++++++++++++++++++++++++++++------ mod/uimport.php | 50 ++++++++++ view/register.tpl | 1 + view/uexport.tpl | 9 ++ view/uimport.tpl | 11 +++ 8 files changed, 465 insertions(+), 32 deletions(-) create mode 100644 include/uimport.php create mode 100644 mod/uimport.php create mode 100644 view/uexport.tpl create mode 100644 view/uimport.tpl diff --git a/include/dba.php b/include/dba.php index 8d224b570f..63b75c4948 100644 --- a/include/dba.php +++ b/include/dba.php @@ -233,7 +233,7 @@ function q($sql) { if($db && $db->connected) { $stmt = vsprintf($sql,$args); 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); } diff --git a/include/uimport.php b/include/uimport.php new file mode 100644 index 0000000000..0de6652401 --- /dev/null +++ b/include/uimport.php @@ -0,0 +1,235 @@ +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 "
"; 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");
+    
+    
+}
\ No newline at end of file
diff --git a/mod/register.php b/mod/register.php
index a8fa100c8f..208f97bcb6 100644
--- a/mod/register.php
+++ b/mod/register.php
@@ -42,6 +42,7 @@ function register_post(&$a) {
 		$verified = 0;
 		break;
 	}
+    
 
 	require_once('include/user.php');
 
@@ -234,7 +235,7 @@ function register_content(&$a) {
 			'$yes_selected' => ' checked="checked" ',
 			'$no_selected'  => '',
 			'$str_yes'      => t('Yes'),
-			'$str_no'       => t('No')
+			'$str_no'       => t('No'),
 		));
 	}
 
@@ -275,7 +276,8 @@ function register_content(&$a) {
 		'$email'     => $email,
 		'$nickname'  => $nickname,
 		'$license'   => $license,
-		'$sitename'  => $a->get_hostname()
+		'$sitename'  => $a->get_hostname(),
+      
 	));
 	return $o;
 
diff --git a/mod/uexport.php b/mod/uexport.php
index e1fb22855a..f216f551fa 100644
--- a/mod/uexport.php
+++ b/mod/uexport.php
@@ -1,46 +1,174 @@
  t('Account settings'),
+			'url' 	=> $a->get_baseurl(true).'/settings',
+			'selected'	=> '',
+		),	
+		array(
+			'label'	=> t('Display settings'),
+			'url' 	=> $a->get_baseurl(true).'/settings/display',
+			'selected'	=>'',
+		),	
+		
+		array(
+			'label'	=> t('Connector settings'),
+			'url' 	=> $a->get_baseurl(true).'/settings/connectors',
+			'selected'	=> '',
+		),
+		array(
+			'label'	=> t('Plugin settings'),
+			'url' 	=> $a->get_baseurl(true).'/settings/addon',
+			'selected'	=> '',
+		),
+		array(
+			'label' => t('Connected apps'),
+			'url' => $a->get_baseurl(true) . '/settings/oauth',
+			'selected' => '',
+		),
+		array(
+			'label' => t('Export personal data'),
+			'url' => $a->get_baseurl(true) . '/uexport',
+			'selected' => 'active'
+		),
+		array(
+			'label' => t('Remove account'),
+			'url' => $a->get_baseurl(true) . '/removeme',
+			'selected' => ''
+		)
 	);
+	
+	$tabtpl = get_markup_template("generic_links_widget.tpl");
+	$a->page['aside'] = replace_macros($tabtpl, array(
+		'$title' => t('Settings'),
+		'$class' => 'settings-widget',
+		'$items' => $tabs,
+	));
+}
+
+function uexport_content(&$a){
+    
+    if ($a->argc > 1) {
+        header("Content-type: application/json");
+        header('Content-Disposition: attachment; filename="'.$a->user['nickname'].'.'.$a->argv[1].'"');
+        switch($a->argv[1]) {
+            case "backup": uexport_all($a); killme(); break;
+            case "account": uexport_account($a); killme(); break;
+            default:
+                killme();
+        }
+    }
+
+    /**
+      * options shown on "Export personal data" page
+      * list of array( 'link url', 'link text', 'help text' )
+      */
+    $options = array(
+            array('/uexport/account',t('Export account'),t('Export your account info and contacts. Use this to make a backup of your account and/or to move it to another server.')),
+            array('/uexport/backup',t('Export all'),t('Export your accout info, contacts and all your items as json. Could be a very big file, and could take a lot of time. Use this to make a full backup of your account (photos are not exported)')),
+    );
+    call_hooks('uexport_options', $options);
+        
+    $tpl = get_markup_template("uexport.tpl");
+    return replace_macros($tpl, array(
+        '$baseurl' => $a->get_baseurl(),
+        '$title' => t('Export personal data'),
+        '$options' => $options
+    ));
+    
+    
+}
+
+function _uexport_multirow($query) {
+	$result = array();
+	$r = q($query);
+	if(count($r)) {
+		foreach($r as $rr){
+            $p = array();
+			foreach($rr as $k => $v)
+				$p[$k] = $v;
+            $result[] = $p;
+        }
+	}
+    return $result;
+}
+
+function _uexport_row($query) {
+	$result = array();
+	$r = q($query);
 	if(count($r)) {
 		foreach($r as $rr)
 			foreach($rr as $k => $v)
-				$user[$k] = $v;
+				$result[$k] = $v;
 
 	}
-	$contact = array();
-	$r = q("SELECT * FROM `contact` WHERE `uid` = %d ",
-		intval(local_user())
+    return $result;
+}
+
+
+function uexport_account($a){
+
+	$user = _uexport_row(
+        sprintf( "SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval(local_user()) )
 	);
-	if(count($r)) {
-		foreach($r as $rr)
-			foreach($rr as $k => $v)
-				$contact[][$k] = $v;
-
-	}
-
-	$profile = array();
-	$r = q("SELECT * FROM `profile` WHERE `uid` = %d ",
-		intval(local_user())
+    
+	$contact = _uexport_multirow(
+        sprintf( "SELECT * FROM `contact` WHERE `uid` = %d ",intval(local_user()) )
 	);
-	if(count($r)) {
-		foreach($r as $rr)
-			foreach($rr as $k => $v)
-				$profile[][$k] = $v;
-	}
 
-	$output = array('user' => $user, 'contact' => $contact, 'profile' => $profile );
 
-	header("Content-type: application/json");
+	$profile =_uexport_multirow(
+        sprintf( "SELECT * FROM `profile` WHERE `uid` = %d ", intval(local_user()) )
+	);
+
+    $photo = _uexport_multirow(
+        sprintf( "SELECT * FROM photo WHERE uid = %d AND profile = 1", intval(local_user()) )
+    );
+    foreach ($photo as &$p) $p['data'] = bin2hex($p['data']);
+
+    $pconfig = _uexport_multirow(
+        sprintf( "SELECT * FROM pconfig WHERE uid = %d",intval(local_user()) )
+    );
+
+    $group = _uexport_multirow(
+        sprintf( "SELECT * FROM group WHERE uid = %d",intval(local_user()) )
+    );
+    
+    $group_member = _uexport_multirow(
+        sprintf( "SELECT * FROM group_member WHERE uid = %d",intval(local_user()) )
+    );
+
+	$output = array(
+        'version' => FRIENDICA_VERSION,
+        'schema' => DB_UPDATE_VERSION,
+        'baseurl' => $a->get_baseurl(),
+        'user' => $user, 
+        'contact' => $contact, 
+        'profile' => $profile, 
+        'photo' => $photo,
+        'pconfig' => $pconfig,
+        'group' => $group,
+        'group_member' => $group_member,
+    );
+
+    //echo "
"; var_dump(json_encode($output)); killme();
 	echo json_encode($output);
 
+}
+
+/**
+ * echoes account data and items as separated json, one per line
+ */
+function uexport_all(&$a) {
+    
+    uexport_account($a);
+
 	$r = q("SELECT count(*) as `total` FROM `item` WHERE `uid` = %d ",
 		intval(local_user())
 	);
@@ -66,7 +194,4 @@ function uexport_init(&$a) {
 		echo json_encode($output);
 	}
 
-
-	killme();
-
 }
\ No newline at end of file
diff --git a/mod/uimport.php b/mod/uimport.php
new file mode 100644
index 0000000000..f5f7366f59
--- /dev/null
+++ b/mod/uimport.php
@@ -0,0 +1,50 @@
+config['register_policy']) {
+        case REGISTER_OPEN:
+            $blocked = 0;
+            $verified = 1;
+            break;
+
+        case REGISTER_APPROVE:
+            $blocked = 1;
+            $verified = 0;
+            break;
+
+        default:
+        case REGISTER_CLOSED:
+            if((! x($_SESSION,'authenticated') && (! x($_SESSION,'administrator')))) {
+                notice( t('Permission denied.') . EOL );
+                return;
+            }
+            $blocked = 1;
+            $verified = 0;
+            break;
+	}
+    
+    if (x($_FILES,'accountfile')){
+        // TODO: pass $blocked / $verified, send email to admin on REGISTER_APPROVE
+        import_account($a, $_FILES['accountfile']);
+        return;
+    }
+}
+
+function uimport_content(&$a) {
+    $tpl = get_markup_template("uimport.tpl");
+    return replace_macros($tpl, array(
+        '$regbutt' => t('Import'),
+        '$import' => array(
+            'title' => t("Move account"),
+            'text' => t("You can move here an account from another Friendica server. 
+ You need to export your account form the old server and upload it here. We will create here your old account with all your contacts. We will try also to inform you friends that you moved here.
+ This feature is experimental. We can't move here contacts from ostatus network (statusnet/identi.ca) or from diaspora"), + 'field' => array('accountfile', t('Account file'),'', t('To export your accont, go to "Settings->Export your porsonal data" and select "Export account"')), + ), + )); +} diff --git a/view/register.tpl b/view/register.tpl index 8ce1d20acb..7cf11881ad 100644 --- a/view/register.tpl +++ b/view/register.tpl @@ -55,6 +55,7 @@
+ $license diff --git a/view/uexport.tpl b/view/uexport.tpl new file mode 100644 index 0000000000..30d11d58e0 --- /dev/null +++ b/view/uexport.tpl @@ -0,0 +1,9 @@ +

$title

+ + +{{ for $options as $o }} +
+
$o.1
+
$o.2
+
+{{ endfor }} \ No newline at end of file diff --git a/view/uimport.tpl b/view/uimport.tpl new file mode 100644 index 0000000000..fb34addd4e --- /dev/null +++ b/view/uimport.tpl @@ -0,0 +1,11 @@ +
+

$import.title

+

$import.text

+ {{inc field_custom.tpl with $field=$import.field }}{{ endinc }} + + +
+ +
+
+
\ No newline at end of file From dbc6cbe024cabde32bcd75bf5f065ca5e273d18f Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Mon, 29 Oct 2012 17:48:08 +0100 Subject: [PATCH 2/6] moveme: send and receive DFRN "relocate" message (WIP) --- include/items.php | 58 ++++++++++++++++++++++++++++++++++++++---- include/notifier.php | 38 ++++++++++++++++++++++++--- include/uimport.php | 8 +++--- view/atom_relocate.tpl | 17 +++++++++++++ 4 files changed, 110 insertions(+), 11 deletions(-) create mode 100644 view/atom_relocate.tpl diff --git a/include/items.php b/include/items.php index 9203f663cf..0ca385c44a 100755 --- a/include/items.php +++ b/include/items.php @@ -2305,7 +2305,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 +2315,71 @@ 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['pubkey'] = notags(unxmlify($base['pubkey'][0]['data'])); + $newloc['prvkey'] = notags(unxmlify($base['prvkey'][0]['data']));*/ + log("items:relocate contact ".print_r($newloc, true), LOGGER_DEBUG); + + // update contact + $r = q("SELECT photo, url FROM contact WHERE WHERE id=%d AND uid=%d;", + intval($importer['importer_uid']), + intval($importer['id'])); + $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['site-pubkey']), + intval($importer['importer_uid']), + intval($importer['id'])); + + // 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'])); + // 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 diff --git a/include/notifier.php b/include/notifier.php index 171b55fc37..88c90a856f 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -89,6 +89,7 @@ function notifier_run($argv, $argc){ $expire = false; $mail = false; $fsuggest = false; + $relocate = false; $top_level = false; $recipients = array(); $url_recipients = array(); @@ -134,6 +135,11 @@ function notifier_run($argv, $argc){ $recipients[] = $suggest[0]['cid']; $item = $suggest[0]; } + elseif($cmd === 'relocate') { + $normal_mode = false; + $relocate = true; + $uid = $item_id; + } else { // find ancestors @@ -404,6 +410,29 @@ function notifier_run($argv, $argc){ ); } + elseif($relocate) { + $public_message = false; // suggestions are not public + + $sugg_template = get_markup_template('atom_relocate.tpl'); + + $atom .= replace_macros($sugg_template, array( + '$name' => xmlfy($owner['name']), + '$photo' => xmlfy($owner['photo']), + '$thumb' => xmlfy($owner['thumb']), + '$micro' => xmlfy($owner['micro']), + '$url' => xmlfy($owner['url']), + '$request' => xmlfy($owner['request']), + '$confirm' => xmlfy($owner['confirm']), + '$notify' => xmlfy($owner['notify']), + '$poll' => xmlfy($owner['poll']), + '$site-pubkey' => xmlfy(get_config('system','site_pubkey')), + //'$pubkey' => xmlfy($owner['pubkey']), + //'$prvkey' => xmlfy($owner['prvkey']), + )); + $recipients_relocate = q("SELECT * FROM contacts WHERE uid = %d AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN); + + + } else { if($followup) { foreach($items as $item) { // there is only one item @@ -479,9 +508,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'); diff --git a/include/uimport.php b/include/uimport.php index 0de6652401..9427931687 100644 --- a/include/uimport.php +++ b/include/uimport.php @@ -125,7 +125,7 @@ function import_account(&$a, $file) { if ($contact['uid'] == $olduid && $contact['self'] == '0') { switch ($contact['network']){ case NETWORK_DFRN: - // send moved message + // send relocate message (below) break; case NETWORK_ZOT: // TODO handle zot network @@ -226,10 +226,12 @@ function import_account(&$a, $file) { 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"); -} \ No newline at end of file +} diff --git a/view/atom_relocate.tpl b/view/atom_relocate.tpl new file mode 100644 index 0000000000..f7f8db97b1 --- /dev/null +++ b/view/atom_relocate.tpl @@ -0,0 +1,17 @@ + + + + $url + $name + $photo + $thumb + $micro + $request + $confirm + $notify + $poll + $site-pubkey + + + + From 1a3a5ee8d9e4e1f6b07c7736fab3e004b26046af Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Wed, 31 Oct 2012 17:13:45 +0100 Subject: [PATCH 3/6] moveme: first successful relocated user --- .gitignore | 53 +++++++++++++++++++++--------------------- boot.php | 14 +++++++++-- include/dba.php | 1 + include/delivery.php | 2 +- include/items.php | 35 +++++++++++++++++----------- include/notifier.php | 46 +++++++++++++++++++++--------------- include/uimport.php | 2 +- mod/dfrn_notify.php | 2 +- view/atom_relocate.tpl | 2 +- 9 files changed, 93 insertions(+), 64 deletions(-) diff --git a/.gitignore b/.gitignore index 5fe71a7a87..358114a444 100644 --- a/.gitignore +++ b/.gitignore @@ -1,26 +1,27 @@ -favicon.* -.htconfig.php -\#* -include/jquery-1.4.2.min.js -*.log -*.out -*.version* -favicon.* -home.html -addon -*~ - -#ignore documentation, it should be newly built -doc/api - -#ignore reports, should be generted with every build -report/ - -#ignore config files from eclipse, we don't want IDE files in our repository -.project -.buildpath -.externalToolBuilders -.settings -#ignore OSX .DS_Store files -.DS_Store - +favicon.* +.htconfig.php +\#* +include/jquery-1.4.2.min.js +*.log +*.out +*.version* +favicon.* +home.html +addon +*~ + +#ignore documentation, it should be newly built +doc/api + +#ignore reports, should be generted with every build +report/ + +#ignore config files from eclipse, we don't want IDE files in our repository +.project +.buildpath +.externalToolBuilders +.settings +#ignore OSX .DS_Store files +.DS_Store + +/nbproject/private/ \ No newline at end of file diff --git a/boot.php b/boot.php index ad6c29b828..71304e53e2 100644 --- a/boot.php +++ b/boot.php @@ -385,7 +385,7 @@ if(! class_exists('App')) { function __construct() { - global $default_timezone; + global $default_timezone, $argv, $argc; $this->timezone = ((x($default_timezone)) ? $default_timezone : 'UTC'); @@ -428,6 +428,9 @@ if(! class_exists('App')) { if(isset($path) && strlen($path) && ($path != $this->path)) $this->path = $path; } + if (is_array($argv) && $argc>1 && !x($_SERVER,'SERVER_NAME') && substr(end($argv), 0, 4)=="http" ) { + $this->set_baseurl(array_pop($argv) ); + } set_include_path( "include/$this->hostname" . PATH_SEPARATOR @@ -436,6 +439,7 @@ if(! class_exists('App')) { . 'library/phpsec' . PATH_SEPARATOR . 'library/langdet' . PATH_SEPARATOR . '.' ); + if((x($_SERVER,'QUERY_STRING')) && substr($_SERVER['QUERY_STRING'],0,2) === "q=") { $this->query_string = substr($_SERVER['QUERY_STRING'],2); @@ -1501,9 +1505,15 @@ if(! function_exists('proc_run')) { if(count($args) && $args[0] === 'php') $args[0] = ((x($a->config,'php_path')) && (strlen($a->config['php_path'])) ? $a->config['php_path'] : 'php'); - for($x = 0; $x < count($args); $x ++) + + // add baseurl to args. cli scripts can't construct it + $args[] = $a->get_baseurl(); + + for($x = 0; $x < count($args); $x ++) $args[$x] = escapeshellarg($args[$x]); + + $cmdline = implode($args," "); if(get_config('system','proc_windows')) proc_close(proc_open('cmd /c start /b ' . $cmdline,array(),$foo)); diff --git a/include/dba.php b/include/dba.php index 63b75c4948..9f2dab5191 100644 --- a/include/dba.php +++ b/include/dba.php @@ -232,6 +232,7 @@ 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_DEBUG); return $db->q($stmt); diff --git a/include/delivery.php b/include/delivery.php index 14226e4fba..d879deedb5 100644 --- a/include/delivery.php +++ b/include/delivery.php @@ -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)){ diff --git a/include/items.php b/include/items.php index 0ca385c44a..4266734842 100755 --- a/include/items.php +++ b/include/items.php @@ -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. @@ -2322,16 +2323,19 @@ function local_delivery($importer,$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['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']));*/ - log("items:relocate contact ".print_r($newloc, true), LOGGER_DEBUG); + logger("items:relocate contact ".print_r($newloc, true).print_r($importer, true), LOGGER_DEBUG); // update contact - $r = q("SELECT photo, url FROM contact WHERE WHERE id=%d AND uid=%d;", - intval($importer['importer_uid']), - intval($importer['id'])); + $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 @@ -2344,7 +2348,7 @@ function local_delivery($importer,$data) { confirm = '%s', notify = '%s', poll = '%s', - site-pubkey = '%s' + `site-pubkey` = '%s' WHERE id=%d AND uid=%d;", dbesc($newloc['name']), dbesc($newloc['photo']), @@ -2355,10 +2359,12 @@ function local_delivery($importer,$data) { dbesc($newloc['confirm']), dbesc($newloc['notify']), dbesc($newloc['poll']), - dbesc($newloc['site-pubkey']), - intval($importer['importer_uid']), - intval($importer['id'])); - + 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']), @@ -2366,12 +2372,15 @@ function local_delivery($importer,$data) { 'owner-avatar' => array($old['photo'], $newloc['photo']), 'author-avatar' => array($old['photo'], $newloc['photo']), ); - foreach ($fields as $n=>$f) + 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 diff --git a/include/notifier.php b/include/notifier.php index 88c90a856f..1d2c26fb2d 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -1,5 +1,4 @@ xmlfy($owner['name']), - '$photo' => xmlfy($owner['photo']), - '$thumb' => xmlfy($owner['thumb']), - '$micro' => xmlfy($owner['micro']), - '$url' => xmlfy($owner['url']), - '$request' => xmlfy($owner['request']), - '$confirm' => xmlfy($owner['confirm']), - '$notify' => xmlfy($owner['notify']), - '$poll' => xmlfy($owner['poll']), - '$site-pubkey' => xmlfy(get_config('system','site_pubkey')), - //'$pubkey' => xmlfy($owner['pubkey']), - //'$prvkey' => xmlfy($owner['prvkey']), + '$name' => xmlify($owner['name']), + '$photo' => xmlify($owner['photo']), + '$thumb' => xmlify($owner['thumb']), + '$micro' => xmlify($owner['micro']), + '$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 contacts WHERE uid = %d AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN); - + $recipients_relocate = q("SELECT * FROM contact WHERE uid = %d AND self = 0 AND network = '%s'" , intval($uid), NETWORK_DFRN); } else { @@ -525,7 +532,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 )", @@ -562,7 +569,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']; @@ -577,7 +584,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: @@ -934,6 +941,7 @@ function notifier_run($argv, $argc){ return; } + if (array_search(__file__,get_included_files())===0){ notifier_run($argv,$argc); killme(); diff --git a/include/uimport.php b/include/uimport.php index 9427931687..e43f331dc9 100644 --- a/include/uimport.php +++ b/include/uimport.php @@ -228,7 +228,7 @@ function import_account(&$a, $file) { } // send relocate messages - proc_run('php', 'include/notifier.php', 'relocate' , $newuid); + //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"); diff --git a/mod/dfrn_notify.php b/mod/dfrn_notify.php index e55da55722..b50602b6bd 100644 --- a/mod/dfrn_notify.php +++ b/mod/dfrn_notify.php @@ -6,7 +6,7 @@ require_once('include/event.php'); function dfrn_notify_post(&$a) { - + logger(__function__, LOGGER_TRACE); $dfrn_id = ((x($_POST,'dfrn_id')) ? notags(trim($_POST['dfrn_id'])) : ''); $dfrn_version = ((x($_POST,'dfrn_version')) ? (float) $_POST['dfrn_version'] : 2.0); $challenge = ((x($_POST,'challenge')) ? notags(trim($_POST['challenge'])) : ''); diff --git a/view/atom_relocate.tpl b/view/atom_relocate.tpl index f7f8db97b1..3976a0037f 100644 --- a/view/atom_relocate.tpl +++ b/view/atom_relocate.tpl @@ -10,7 +10,7 @@ $confirm $notify $poll - $site-pubkey + $sitepubkey From aa20042bece6cf45bee7c943968fc175d0a73a35 Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Mon, 5 Nov 2012 09:18:55 +0100 Subject: [PATCH 4/6] moveme: fix contact photos --- include/notifier.php | 18 +++++++++++++----- view/atom_relocate.tpl | 4 ++-- 2 files changed, 15 insertions(+), 7 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index 1d2c26fb2d..c78d2f1a76 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -42,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)){ @@ -422,12 +422,20 @@ function notifier_run($argv, $argc){ 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($owner['photo']), - '$thumb' => xmlify($owner['thumb']), - '$micro' => xmlify($owner['micro']), + '$photo' => xmlify($photos[4]), + '$thumb' => xmlify($photos[5]), + '$micro' => xmlify($photos[6]), '$url' => xmlify($owner['url']), '$request' => xmlify($owner['request']), '$confirm' => xmlify($owner['confirm']), @@ -438,7 +446,7 @@ function notifier_run($argv, $argc){ //'$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) { diff --git a/view/atom_relocate.tpl b/view/atom_relocate.tpl index 3976a0037f..f7db934d7a 100644 --- a/view/atom_relocate.tpl +++ b/view/atom_relocate.tpl @@ -4,8 +4,8 @@ $url $name $photo - $thumb - $micro + $thumb + $micro $request $confirm $notify From 385ee5a86207106408a20a3d2ec6dbeb3a313238 Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Mon, 5 Nov 2012 09:28:54 +0100 Subject: [PATCH 5/6] pass $argv & $argc as reference to *_run() functions. --- include/cronhooks.php | 2 +- include/directory.php | 2 +- include/expire.php | 2 +- include/gprobe.php | 2 +- include/onepoll.php | 2 +- include/poller.php | 2 +- include/queue.php | 2 +- util/po2php.php | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/include/cronhooks.php b/include/cronhooks.php index 37541f013e..27cf642b22 100644 --- a/include/cronhooks.php +++ b/include/cronhooks.php @@ -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)) { diff --git a/include/directory.php b/include/directory.php index 45386183c6..356118bb08 100644 --- a/include/directory.php +++ b/include/directory.php @@ -1,7 +1,7 @@ \n\n"; From cef5afc53d5cdc8604449aac4f687866d03cec02 Mon Sep 17 00:00:00 2001 From: Fabrixxm Date: Mon, 5 Nov 2012 04:15:09 -0500 Subject: [PATCH 6/6] moveme: remove debug comment --- include/uimport.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/include/uimport.php b/include/uimport.php index e43f331dc9..9427931687 100644 --- a/include/uimport.php +++ b/include/uimport.php @@ -228,7 +228,7 @@ function import_account(&$a, $file) { } // send relocate messages - //proc_run('php', 'include/notifier.php', 'relocate' , $newuid); + 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");