Merge pull request #2671 from annando/1607-diaspora-soapbox-connect

Bugfix: Diaspora connect requests to soapbox account work now
This commit is contained in:
Tobias Diekershoff 2016-07-10 13:55:56 +02:00 committed by GitHub
commit 26098fa263
6 changed files with 69 additions and 15 deletions

View file

@ -38,7 +38,7 @@ define ( 'FRIENDICA_PLATFORM', 'Friendica');
define ( 'FRIENDICA_CODENAME', 'Asparagus'); define ( 'FRIENDICA_CODENAME', 'Asparagus');
define ( 'FRIENDICA_VERSION', '3.5-dev' ); define ( 'FRIENDICA_VERSION', '3.5-dev' );
define ( 'DFRN_PROTOCOL_VERSION', '2.23' ); define ( 'DFRN_PROTOCOL_VERSION', '2.23' );
define ( 'DB_UPDATE_VERSION', 1198 ); define ( 'DB_UPDATE_VERSION', 1199 );
/** /**
* @brief Constant with a HTML line break. * @brief Constant with a HTML line break.

View file

@ -1,6 +1,6 @@
-- ------------------------------------------ -- ------------------------------------------
-- Friendica 3.5-dev (Asparagus) -- Friendica 3.5-dev (Asparagus)
-- DB_UPDATE_VERSION 1198 -- DB_UPDATE_VERSION 1199
-- ------------------------------------------ -- ------------------------------------------
@ -234,6 +234,7 @@ CREATE TABLE IF NOT EXISTS `event` (
-- --
CREATE TABLE IF NOT EXISTS `fcontact` ( CREATE TABLE IF NOT EXISTS `fcontact` (
`id` int(10) unsigned NOT NULL auto_increment, `id` int(10) unsigned NOT NULL auto_increment,
`guid` varchar(255) NOT NULL DEFAULT '',
`url` varchar(255) NOT NULL DEFAULT '', `url` varchar(255) NOT NULL DEFAULT '',
`name` varchar(255) NOT NULL DEFAULT '', `name` varchar(255) NOT NULL DEFAULT '',
`photo` varchar(255) NOT NULL DEFAULT '', `photo` varchar(255) NOT NULL DEFAULT '',

View file

@ -568,6 +568,7 @@ function db_definition() {
$database["fcontact"] = array( $database["fcontact"] = array(
"fields" => array( "fields" => array(
"id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"), "id" => array("type" => "int(10) unsigned", "not null" => "1", "extra" => "auto_increment", "primary" => "1"),
"guid" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "name" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),
"photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""),

View file

@ -432,6 +432,8 @@ class diaspora {
$type = $element->getName(); $type = $element->getName();
$orig_type = $type; $orig_type = $type;
logger("Got message type ".$type.": ".$msg["message"], LOGGER_DATA);
// All retractions are handled identically from now on. // All retractions are handled identically from now on.
// In the new version there will only be "retraction". // In the new version there will only be "retraction".
if (in_array($type, array("signed_retraction", "relayable_retraction"))) if (in_array($type, array("signed_retraction", "relayable_retraction")))
@ -568,6 +570,9 @@ class diaspora {
$d = strtotime($person["updated"]." +00:00"); $d = strtotime($person["updated"]." +00:00");
if ($d < strtotime("now - 14 days")) if ($d < strtotime("now - 14 days"))
$update = true; $update = true;
if ($person["guid"] == "")
$update = true;
} }
if (!$person OR $update) { if (!$person OR $update) {
@ -601,6 +606,7 @@ class diaspora {
`request` = '%s', `request` = '%s',
`nick` = '%s', `nick` = '%s',
`addr` = '%s', `addr` = '%s',
`guid` = '%s',
`batch` = '%s', `batch` = '%s',
`notify` = '%s', `notify` = '%s',
`poll` = '%s', `poll` = '%s',
@ -614,6 +620,7 @@ class diaspora {
dbesc($arr["request"]), dbesc($arr["request"]),
dbesc($arr["nick"]), dbesc($arr["nick"]),
dbesc($arr["addr"]), dbesc($arr["addr"]),
dbesc($arr["guid"]),
dbesc($arr["batch"]), dbesc($arr["batch"]),
dbesc($arr["notify"]), dbesc($arr["notify"]),
dbesc($arr["poll"]), dbesc($arr["poll"]),
@ -625,7 +632,7 @@ class diaspora {
dbesc($arr["network"]) dbesc($arr["network"])
); );
} else { } else {
$r = q("INSERT INTO `fcontact` (`url`,`name`,`photo`,`request`,`nick`,`addr`, $r = q("INSERT INTO `fcontact` (`url`,`name`,`photo`,`request`,`nick`,`addr`, `guid`,
`batch`, `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated`) `batch`, `notify`,`poll`,`confirm`,`network`,`alias`,`pubkey`,`updated`)
VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')", VALUES ('%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s','%s')",
dbesc($arr["url"]), dbesc($arr["url"]),
@ -634,6 +641,7 @@ class diaspora {
dbesc($arr["request"]), dbesc($arr["request"]),
dbesc($arr["nick"]), dbesc($arr["nick"]),
dbesc($arr["addr"]), dbesc($arr["addr"]),
dbesc($arr["guid"]),
dbesc($arr["batch"]), dbesc($arr["batch"]),
dbesc($arr["notify"]), dbesc($arr["notify"]),
dbesc($arr["poll"]), dbesc($arr["poll"]),
@ -1838,10 +1846,26 @@ class diaspora {
// That makes us friends. // That makes us friends.
if ($contact) { if ($contact) {
if ($following AND $sharing) { if ($following AND $sharing) {
logger("Author ".$author." (Contact ".$contact["id"].") wants to have a bidirectional conection.", LOGGER_DEBUG);
self::receive_request_make_friend($importer, $contact); self::receive_request_make_friend($importer, $contact);
// refetch the contact array
$contact = self::contact_by_handle($importer["uid"],$author);
// If we are now friends, we are sending a share message.
// Normally we needn't to do so, but the first message could have been vanished.
if (in_array($contact["rel"], array(CONTACT_IS_FRIEND, CONTACT_IS_FOLLOWER))) {
$u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"]));
if($u) {
logger("Sending share message to author ".$author." - Contact: ".$contact["id"]." - User: ".$importer["uid"], LOGGER_DEBUG);
$ret = self::send_share($u[0], $contact);
}
}
return true; return true;
} else /// @todo Handle all possible variations of adding and retracting of permissions } else { /// @todo Handle all possible variations of adding and retracting of permissions
logger("Author ".$author." (Contact ".$contact["id"].") wants to change the relationship: Following: ".$following." - sharing: ".$sharing. "(By now unsupported)", LOGGER_DEBUG);
return false; return false;
}
} }
if (!$following AND $sharing AND in_array($importer["page-flags"], array(PAGE_SOAPBOX, PAGE_NORMAL))) { if (!$following AND $sharing AND in_array($importer["page-flags"], array(PAGE_SOAPBOX, PAGE_NORMAL))) {
@ -1850,6 +1874,12 @@ class diaspora {
} elseif (!$following AND !$sharing) { } elseif (!$following AND !$sharing) {
logger("Author ".$author." doesn't want anything - and we don't know the author. Request is ignored.", LOGGER_DEBUG); logger("Author ".$author." doesn't want anything - and we don't know the author. Request is ignored.", LOGGER_DEBUG);
return false; return false;
} elseif (!$following AND $sharing) {
logger("Author ".$author." wants to share with us.", LOGGER_DEBUG);
} elseif ($following AND $sharing) {
logger("Author ".$author." wants to have a bidirectional conection.", LOGGER_DEBUG);
} elseif ($following AND !$sharing) {
logger("Author ".$author." wants to listen to us.", LOGGER_DEBUG);
} }
$ret = self::person_by_handle($author); $ret = self::person_by_handle($author);
@ -1889,6 +1919,8 @@ class diaspora {
return; return;
} }
logger("Author ".$author." was added as contact number ".$contact_record["id"].".", LOGGER_DEBUG);
$def_gid = get_default_group($importer['uid'], $ret["network"]); $def_gid = get_default_group($importer['uid'], $ret["network"]);
if(intval($def_gid)) if(intval($def_gid))
@ -1898,6 +1930,8 @@ class diaspora {
if($importer["page-flags"] == PAGE_NORMAL) { if($importer["page-flags"] == PAGE_NORMAL) {
logger("Sending intra message for author ".$author.".", LOGGER_DEBUG);
$hash = random_string().(string)time(); // Generate a confirm_key $hash = random_string().(string)time(); // Generate a confirm_key
$ret = q("INSERT INTO `intro` (`uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime`) $ret = q("INSERT INTO `intro` (`uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime`)
@ -1914,6 +1948,8 @@ class diaspora {
// automatic friend approval // automatic friend approval
logger("Does an automatic friend approval for author ".$author.".", LOGGER_DEBUG);
update_contact_avatar($contact_record["photo"],$importer["uid"],$contact_record["id"]); update_contact_avatar($contact_record["photo"],$importer["uid"],$contact_record["id"]);
// technically they are sharing with us (CONTACT_IS_SHARING), // technically they are sharing with us (CONTACT_IS_SHARING),
@ -1942,8 +1978,13 @@ class diaspora {
); );
$u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"])); $u = q("SELECT * FROM `user` WHERE `uid` = %d LIMIT 1", intval($importer["uid"]));
if($u) if($u) {
logger("Sending share message (Relation: ".$new_relation.") to author ".$author." - Contact: ".$contact_record["id"]." - User: ".$importer["uid"], LOGGER_DEBUG);
$ret = self::send_share($u[0], $contact_record); $ret = self::send_share($u[0], $contact_record);
// Send the profile data, maybe it weren't transmitted before
self::send_profile($importer["uid"], array($contact_record));
}
} }
return true; return true;
@ -2623,6 +2664,10 @@ class diaspora {
logger('message: '.$msg, LOGGER_DATA); logger('message: '.$msg, LOGGER_DATA);
logger('send guid '.$guid, LOGGER_DEBUG); logger('send guid '.$guid, LOGGER_DEBUG);
// Fallback if the private key wasn't transmitted in the expected field
if ($owner['uprvkey'] == "")
$owner['uprvkey'] = $owner['prvkey'];
$slap = self::build_message($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch); $slap = self::build_message($msg, $owner, $contact, $owner['uprvkey'], $contact['pubkey'], $public_batch);
if ($spool) { if ($spool) {
@ -2649,6 +2694,8 @@ class diaspora {
$message = array("sender_handle" => self::my_handle($owner), $message = array("sender_handle" => self::my_handle($owner),
"recipient_handle" => $contact["addr"]); "recipient_handle" => $contact["addr"]);
logger("Send share ".print_r($message, true), LOGGER_DEBUG);
return self::build_and_transmit($owner, $contact, "request", $message); return self::build_and_transmit($owner, $contact, "request", $message);
} }
@ -2666,6 +2713,8 @@ class diaspora {
"diaspora_handle" => self::my_handle($owner), "diaspora_handle" => self::my_handle($owner),
"type" => "Person"); "type" => "Person");
logger("Send unshare ".print_r($message, true), LOGGER_DEBUG);
return self::build_and_transmit($owner, $contact, "retraction", $message); return self::build_and_transmit($owner, $contact, "retraction", $message);
} }
@ -3152,17 +3201,18 @@ class diaspora {
* *
* @param int $uid The user id * @param int $uid The user id
*/ */
public static function send_profile($uid) { public static function send_profile($uid, $recips = false) {
if (!$uid) if (!$uid)
return; return;
$recips = q("SELECT `id`,`name`,`network`,`pubkey`,`notify` FROM `contact` WHERE `network` = '%s' if (!$recips)
AND `uid` = %d AND `rel` != %d", $recips = q("SELECT `id`,`name`,`network`,`pubkey`,`notify` FROM `contact` WHERE `network` = '%s'
dbesc(NETWORK_DIASPORA), AND `uid` = %d AND `rel` != %d",
intval($uid), dbesc(NETWORK_DIASPORA),
intval(CONTACT_IS_SHARING) intval($uid),
); intval(CONTACT_IS_SHARING)
);
if (!$recips) if (!$recips)
return; return;
@ -3226,8 +3276,10 @@ class diaspora {
"searchable" => $searchable, "searchable" => $searchable,
"tag_string" => $tags); "tag_string" => $tags);
foreach($recips as $recip) foreach($recips as $recip) {
logger("Send updated profile data for user ".$uid." to contact ".$recip["id"], LOGGER_DEBUG);
self::build_and_transmit($profile, $recip, "profile", $message, false, "", true); self::build_and_transmit($profile, $recip, "profile", $message, false, "", true);
}
} }
/** /**

View file

@ -134,7 +134,7 @@ function notifier_run(&$argv, &$argc){
} elseif($cmd === 'removeme') { } elseif($cmd === 'removeme') {
$r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`, $r = q("SELECT `contact`.*, `user`.`pubkey` AS `upubkey`, `user`.`prvkey` AS `uprvkey`,
`user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`, `user`.`timezone`, `user`.`nickname`, `user`.`sprvkey`, `user`.`spubkey`,
`user`.`page-flags`, `user`.`prvnets` `user`.`page-flags`, `user`.`prvnets`, `user`.`guid`
FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid` FROM `contact` INNER JOIN `user` ON `user`.`uid` = `contact`.`uid`
WHERE `contact`.`uid` = %d AND `contact`.`self` LIMIT 1", WHERE `contact`.`uid` = %d AND `contact`.`self` LIMIT 1",
intval($item_id)); intval($item_id));

View file

@ -1,6 +1,6 @@
<?php <?php
define('UPDATE_VERSION' , 1198); define('UPDATE_VERSION' , 1199);
/** /**
* *