DFRN: The relationship between contacts can now be changed afterwards

This commit is contained in:
Michael 2018-03-16 06:43:10 +00:00
parent ba03991294
commit 59dd353464
4 changed files with 44 additions and 42 deletions

View file

@ -581,7 +581,7 @@ function contacts_content(App $a)
$follow = ''; $follow = '';
$follow_text = ''; $follow_text = '';
if (in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS])) { if (in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_DFRN])) {
if ($contact['rel'] == CONTACT_IS_FOLLOWER) { if ($contact['rel'] == CONTACT_IS_FOLLOWER) {
$follow = System::baseUrl(true) . "/follow?url=" . urlencode($contact["url"]); $follow = System::baseUrl(true) . "/follow?url=" . urlencode($contact["url"]);
$follow_text = L10n::t("Connect/Follow"); $follow_text = L10n::t("Connect/Follow");

View file

@ -9,6 +9,7 @@ use Friendica\Core\System;
use Friendica\Model\Contact; use Friendica\Model\Contact;
use Friendica\Model\Profile; use Friendica\Model\Profile;
use Friendica\Network\Probe; use Friendica\Network\Probe;
use Friendica\Database\DBM;
function follow_post(App $a) { function follow_post(App $a) {
@ -60,20 +61,21 @@ function follow_content(App $a) {
$submit = L10n::t('Submit Request'); $submit = L10n::t('Submit Request');
// There is a current issue. It seems as if you can't start following a Friendica that is following you // Don't try to add a pending contact
// With Diaspora this works - but Friendica is special, it seems ... $r = q("SELECT `pending` FROM `contact` WHERE `uid` = %d AND ((`rel` != %d) OR (`network` = '%s')) AND
$r = q("SELECT `url` FROM `contact` WHERE `uid` = %d AND ((`rel` != %d) OR (`network` = '%s')) AND
(`nurl` = '%s' OR `alias` = '%s' OR `alias` = '%s') AND (`nurl` = '%s' OR `alias` = '%s' OR `alias` = '%s') AND
`network` != '%s' LIMIT 1", `network` != '%s' LIMIT 1",
intval(local_user()), dbesc(CONTACT_IS_FOLLOWER), dbesc(NETWORK_DFRN), dbesc(normalise_link($url)), intval(local_user()), dbesc(CONTACT_IS_FOLLOWER), dbesc(NETWORK_DFRN), dbesc(normalise_link($url)),
dbesc(normalise_link($url)), dbesc($url), dbesc(NETWORK_STATUSNET)); dbesc(normalise_link($url)), dbesc($url), dbesc(NETWORK_STATUSNET));
if ($r) { if ($r) {
if ($r[0]['pending']) {
notice(L10n::t('You already added this contact.').EOL); notice(L10n::t('You already added this contact.').EOL);
$submit = ""; $submit = "";
//goaway($_SESSION['return_url']); //goaway($_SESSION['return_url']);
// NOTREACHED // NOTREACHED
} }
}
$ret = Probe::uri($url); $ret = Probe::uri($url);
@ -102,7 +104,7 @@ function follow_content(App $a) {
$ret["url"] = $ret["addr"]; $ret["url"] = $ret["addr"];
} }
if ($ret['network'] === NETWORK_DFRN) { if (($ret['network'] === NETWORK_DFRN) && !DBM::is_result($r)) {
$request = $ret["request"]; $request = $ret["request"];
$tpl = get_markup_template('dfrn_request.tpl'); $tpl = get_markup_template('dfrn_request.tpl');
} else { } else {

View file

@ -33,7 +33,7 @@ function unfollow_post(App $a)
if (!DBM::is_result($contact)) { if (!DBM::is_result($contact)) {
notice(L10n::t("Contact wasn't found or can't be unfollowed.")); notice(L10n::t("Contact wasn't found or can't be unfollowed."));
} else { } else {
if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DIASPORA])) { if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DIASPORA, NETWORK_DFRN])) {
$r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid` $r = q("SELECT `contact`.*, `user`.* FROM `contact` INNER JOIN `user` ON `contact`.`uid` = `user`.`uid`
WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1", WHERE `user`.`uid` = %d AND `contact`.`self` LIMIT 1",
intval($uid) intval($uid)
@ -75,7 +75,7 @@ function unfollow_content(App $a)
// NOTREACHED // NOTREACHED
} }
if (!in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS])) { if (!in_array($contact['network'], [NETWORK_DIASPORA, NETWORK_OSTATUS, NETWORK_DFRN])) {
notice(L10n::t("Unfollowing is currently not supported by your network.").EOL); notice(L10n::t("Unfollowing is currently not supported by your network.").EOL);
$submit = ""; $submit = "";
// NOTREACHED // NOTREACHED

View file

@ -173,20 +173,20 @@ class Contact extends BaseObject
*/ */
public static function terminateFriendship(array $user, array $contact) public static function terminateFriendship(array $user, array $contact)
{ {
if ($contact['network'] === NETWORK_OSTATUS) { if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DFRN])) {
// create an unfollow slap // create an unfollow slap
$item = []; $item = [];
$item['verb'] = NAMESPACE_OSTATUS . "/unfollow"; $item['verb'] = NAMESPACE_OSTATUS . "/unfollow";
$item['follow'] = $contact["url"]; $item['follow'] = $contact["url"];
$slap = OStatus::salmon($item, $user); $slap = OStatus::salmon($item, $user);
if ((x($contact, 'notify')) && (strlen($contact['notify']))) { if (!empty($contact['notify'])) {
Salmon::slapper($user, $contact['notify'], $slap); Salmon::slapper($user, $contact['notify'], $slap);
} }
} elseif ($contact['network'] === NETWORK_DIASPORA) { } elseif ($contact['network'] == NETWORK_DIASPORA) {
Diaspora::sendUnshare($user, $contact); Diaspora::sendUnshare($user, $contact);
} elseif ($contact['network'] === NETWORK_DFRN) { //} elseif ($contact['network'] === NETWORK_DFRN) {
DFRN::deliver($user, $contact, 'placeholder', 1); // DFRN::deliver($user, $contact, 'placeholder', 1);
} }
} }
@ -1168,7 +1168,26 @@ class Contact extends BaseObject
return result; return result;
} }
if ($ret['network'] === NETWORK_DFRN) { // check if we already have a contact
// the poll url is more reliable than the profile url, as we may have
// indirect links or webfinger links
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` IN ('%s', '%s') AND `network` = '%s' AND NOT `pending` LIMIT 1",
intval($uid),
dbesc($ret['poll']),
dbesc(normalise_link($ret['poll'])),
dbesc($ret['network'])
);
if (!DBM::is_result($r)) {
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` = '%s' AND NOT `pending` LIMIT 1",
intval($uid),
dbesc(normalise_link($url)),
dbesc($ret['network'])
);
}
if (($ret['network'] === NETWORK_DFRN) && !DBM::is_result($r)) {
if ($interactive) { if ($interactive) {
if (strlen($a->path)) { if (strlen($a->path)) {
$myaddr = bin2hex(System::baseUrl() . '/profile/' . $a->user['nickname']); $myaddr = bin2hex(System::baseUrl() . '/profile/' . $a->user['nickname']);
@ -1180,7 +1199,7 @@ class Contact extends BaseObject
// NOTREACHED // NOTREACHED
} }
} elseif (Config::get('system', 'dfrn_only')) { } elseif (Config::get('system', 'dfrn_only') && ($ret['network'] != NETWORK_DFRN)) {
$result['message'] = L10n::t('This site is not configured to allow communications with other networks.') . EOL; $result['message'] = L10n::t('This site is not configured to allow communications with other networks.') . EOL;
$result['message'] != L10n::t('No compatible communication protocols or feeds were discovered.') . EOL; $result['message'] != L10n::t('No compatible communication protocols or feeds were discovered.') . EOL;
return $result; return $result;
@ -1230,25 +1249,6 @@ class Contact extends BaseObject
$writeable = 1; $writeable = 1;
} }
// check if we already have a contact
// the poll url is more reliable than the profile url, as we may have
// indirect links or webfinger links
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `poll` IN ('%s', '%s') AND `network` = '%s' LIMIT 1",
intval($uid),
dbesc($ret['poll']),
dbesc(normalise_link($ret['poll'])),
dbesc($ret['network'])
);
if (!DBM::is_result($r)) {
$r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND `network` = '%s' LIMIT 1",
intval($uid),
dbesc(normalise_link($url)),
dbesc($ret['network'])
);
}
if (DBM::is_result($r)) { if (DBM::is_result($r)) {
// update contact // update contact
$new_relation = (($r[0]['rel'] == CONTACT_IS_FOLLOWER) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING); $new_relation = (($r[0]['rel'] == CONTACT_IS_FOLLOWER) ? CONTACT_IS_FRIEND : CONTACT_IS_SHARING);
@ -1309,16 +1309,16 @@ class Contact extends BaseObject
); );
if (DBM::is_result($r)) { if (DBM::is_result($r)) {
if (($contact['network'] == NETWORK_OSTATUS) && (strlen($contact['notify']))) { if (in_array($contact['network'], [NETWORK_OSTATUS, NETWORK_DFRN])) {
// create a follow slap // create a follow slap
$item = []; $item = [];
$item['verb'] = ACTIVITY_FOLLOW; $item['verb'] = ACTIVITY_FOLLOW;
$item['follow'] = $contact["url"]; $item['follow'] = $contact["url"];
$slap = OStatus::salmon($item, $r[0]); $slap = OStatus::salmon($item, $r[0]);
if (!empty($contact['notify'])) {
Salmon::slapper($r[0], $contact['notify'], $slap); Salmon::slapper($r[0], $contact['notify'], $slap);
} }
} elseif ($contact['network'] == NETWORK_DIASPORA) {
if ($contact['network'] == NETWORK_DIASPORA) {
$ret = Diaspora::sendShare($a->user, $contact); $ret = Diaspora::sendShare($a->user, $contact);
logger('share returns: ' . $ret); logger('share returns: ' . $ret);
} }