From fd239ebf7bebe8cee9c4f58a4b8b48c953c426ef Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Thu, 3 Sep 2015 22:18:25 +0200 Subject: [PATCH 1/4] Try to repair OStatus subscriptions --- include/follow.php | 8 ++++-- include/items.php | 2 +- include/onepoll.php | 12 ++++++++- mod/contacts.php | 34 ++++++++++++++++++++++--- mod/repair_ostatus.php | 57 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 106 insertions(+), 7 deletions(-) create mode 100755 mod/repair_ostatus.php diff --git a/include/follow.php b/include/follow.php index 10ce4f667..217b9d07b 100644 --- a/include/follow.php +++ b/include/follow.php @@ -170,6 +170,11 @@ function new_contact($uid,$url,$interactive = false) { dbesc($ret['network']) ); + if(!count($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(count($r)) { // update contact if($r[0]['rel'] == CONTACT_IS_FOLLOWER || ($network === NETWORK_DIASPORA && $r[0]['rel'] == CONTACT_IS_SHARING)) { @@ -180,7 +185,6 @@ function new_contact($uid,$url,$interactive = false) { intval($uid) ); } - } else { @@ -285,7 +289,7 @@ function new_contact($uid,$url,$interactive = false) { // pull feed and consume it, which should subscribe to the hub. - proc_run('php',"include/poller.php","$contact_id"); + proc_run('php',"include/onepoll.php","$contact_id", "force"); // create a follow slap diff --git a/include/items.php b/include/items.php index cc03a7764..5915e2ece 100644 --- a/include/items.php +++ b/include/items.php @@ -4300,7 +4300,7 @@ function subscribe_to_hub($url,$importer,$contact,$hubmode = 'subscribe') { logger('subscribe_to_hub: ' . $hubmode . ' ' . $contact['name'] . ' to hub ' . $url . ' endpoint: ' . $push_url . ' with verifier ' . $verify_token); - if(! strlen($contact['hub-verify'])) { + if(!strlen($contact['hub-verify']) OR ($contact['hub-verify'] != $verify_token)) { $r = q("UPDATE `contact` SET `hub-verify` = '%s' WHERE `id` = %d", dbesc($verify_token), intval($contact['id']) diff --git a/include/onepoll.php b/include/onepoll.php index 90d018524..1fc861afa 100644 --- a/include/onepoll.php +++ b/include/onepoll.php @@ -53,6 +53,9 @@ function onepoll_run(&$argv, &$argc){ if(($argc > 1) && (intval($argv[1]))) $contact_id = intval($argv[1]); + if(($argc > 2) && ($argv[2] == "force")) + $force = true; + if(! $contact_id) { logger('onepoll: no contact'); return; @@ -595,8 +598,10 @@ function onepoll_run(&$argv, &$argc){ return; } - consume_feed($xml,$importer,$contact,$hub,1,1); + logger("Consume feed of contact ".$contact['id']); + + consume_feed($xml,$importer,$contact,$hub,1,1); // do it twice. Ensures that children of parents which may be later in the stream aren't tossed @@ -609,6 +614,11 @@ function onepoll_run(&$argv, &$argc){ if(($contact['network'] === NETWORK_OSTATUS || $contact['network'] == NETWORK_FEED) && (! $contact['hub-verify'])) $hub_update = true; + if ($force) + $hub_update = true; + + logger("Contact ".$contact['id']." returned hub: ".$hub." Network: ".$contact['network']." Relation: ".$contact['rel']." Update: ".$hub_update); + if((strlen($hub)) && ($hub_update) && (($contact['rel'] != CONTACT_IS_FOLLOWER) || $contact['network'] == NETWORK_FEED) ) { logger('poller: hub ' . $hubmode . ' : ' . $hub . ' contact name : ' . $contact['name'] . ' local user : ' . $importer['name']); $hubs = explode(',', $hub); diff --git a/mod/contacts.php b/mod/contacts.php index 826630d30..89154eded 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -206,15 +206,36 @@ function contacts_post(&$a) { /*contact actions*/ function _contact_update($contact_id) { - // pull feed and consume it, which should subscribe to the hub. - proc_run('php',"include/poller.php","$contact_id"); + $r = q("SELECT `uid`, `url`, `network` FROM `contact` WHERE `id` = %d", intval($contact_id)); + if (!$r) + return; + + $uid = $r[0]["uid"]; + + if ($uid != local_user()) + return; + + if ($r[0]["network"] == NETWORK_OSTATUS) { + $result = new_contact($uid, $r[0]["url"], false); + + if ($result['success']) + $r = q("UPDATE `contact` SET `subhub` = 1 WHERE `id` = %d", + intval($contact_id)); + } else + // pull feed and consume it, which should subscribe to the hub. + proc_run('php',"include/onepoll.php","$contact_id", "force"); } function _contact_update_profile($contact_id) { - $r = q("SELECT `url`, `network` FROM `contact` WHERE `id` = %d", intval($contact_id)); + $r = q("SELECT `uid`, `url`, `network` FROM `contact` WHERE `id` = %d", intval($contact_id)); if (!$r) return; + $uid = $r[0]["uid"]; + + if ($uid != local_user()) + return; + $data = probe_url($r[0]["url"]); // "Feed" is mostly a sign of communication problems @@ -225,6 +246,13 @@ function _contact_update_profile($contact_id) { "poco", "network", "alias", "pubkey"); $update = array(); + if ($data["network"] == NETWORK_OSTATUS) { + $result = new_contact($uid, $data["url"], false); + + if ($result['success']) + $update["subhub"] = true; + } + foreach($updatefields AS $field) if (isset($data[$field]) AND ($data[$field] != "")) $update[$field] = $data[$field]; diff --git a/mod/repair_ostatus.php b/mod/repair_ostatus.php new file mode 100755 index 000000000..5a8554dff --- /dev/null +++ b/mod/repair_ostatus.php @@ -0,0 +1,57 @@ +".t("Resubsribing to OStatus contacts").""; + + $uid = local_user(); + + $a = get_app(); + + $counter = intval($_REQUEST['counter']); + + $r = q("SELECT COUNT(*) AS `total` FROM `contact` WHERE + `uid` = %d AND `network` = '%s' AND `rel` IN (%d, %d)", + intval($uid), + dbesc(NETWORK_OSTATUS), + intval(CONTACT_IS_FRIEND), + intval(CONTACT_IS_SHARING)); + + if (!$r) + return($o.t("Error")); + + $total = $r[0]["total"]; + + $r = q("SELECT `url` FROM `contact` WHERE + `uid` = %d AND `network` = '%s' AND `rel` IN (%d, %d) + ORDER BY `url` + LIMIT %d, 1", + intval($uid), + dbesc(NETWORK_OSTATUS), + intval(CONTACT_IS_FRIEND), + intval(CONTACT_IS_SHARING), ++$counter); + + if (!$r) { + $o .= t("Done"); + return $o; + } + + $o .= "

".$counter."/".$total.": ".$r[0]["url"]."

"; + + $o .= "

".t("Keep this window open until done.")."

"; + + $result = new_contact($uid,$r[0]["url"],true); + + $a->page['htmlhead'] = ''; + + return $o; +} From 635e92249aa8e729b6ba2f741c2cdf5f20627441 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Thu, 3 Sep 2015 22:24:57 +0200 Subject: [PATCH 2/4] Bugfix: The first contact was never repaired --- mod/repair_ostatus.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mod/repair_ostatus.php b/mod/repair_ostatus.php index 5a8554dff..06e34a63e 100755 --- a/mod/repair_ostatus.php +++ b/mod/repair_ostatus.php @@ -38,7 +38,7 @@ function repair_ostatus_content(&$a) { intval($uid), dbesc(NETWORK_OSTATUS), intval(CONTACT_IS_FRIEND), - intval(CONTACT_IS_SHARING), ++$counter); + intval(CONTACT_IS_SHARING), $counter++); if (!$r) { $o .= t("Done"); From 3cccb5ecb1cd010435bfc5058159d7ac9d958dcd Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 5 Sep 2015 04:54:48 +0200 Subject: [PATCH 3/4] The repair option is added to the settings --- include/notifier.php | 10 +++++++--- mod/settings.php | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/include/notifier.php b/include/notifier.php index 84ed9884a..002b3c8d7 100644 --- a/include/notifier.php +++ b/include/notifier.php @@ -295,7 +295,7 @@ function notifier_run(&$argv, &$argc){ $relay_to_owner = false; if($relay_to_owner) { - logger('notifier: followup', LOGGER_DEBUG); + logger('notifier: followup '.$target_item["guid"], LOGGER_DEBUG); // local followup to remote post $followup = true; $public_message = false; // not public @@ -331,6 +331,8 @@ function notifier_run(&$argv, &$argc){ } else { $followup = false; + logger('Distributing directly '.$target_item["guid"], LOGGER_DEBUG); + // don't send deletions onward for other people's stuff if($target_item['deleted'] && (! intval($target_item['wall']))) { @@ -378,7 +380,7 @@ function notifier_run(&$argv, &$argc){ } if (count($url_recipients)) - logger('notifier: url_recipients ' . print_r($url_recipients,true)); + logger('notifier: '.$target_item["guid"].' url_recipients ' . print_r($url_recipients,true)); $conversants = array_unique($conversants); @@ -394,6 +396,8 @@ function notifier_run(&$argv, &$argc){ // We have not only to look at the parent, since it could be a Friendica thread. if (($thr_parent AND ($thr_parent[0]['network'] == NETWORK_OSTATUS)) OR ($parent['network'] == NETWORK_OSTATUS)) { + logger('Some parent is OStatus for '.$target_item["guid"], LOGGER_DEBUG); + // Send a salmon notification to every person we mentioned in the post $arr = explode(',',$target_item['tag']); foreach($arr as $x) { @@ -650,7 +654,7 @@ function notifier_run(&$argv, &$argc){ if($contact['self']) continue; - logger("Deliver to ".$contact['url'], LOGGER_DEBUG); + logger("Deliver ".$target_item["guid"]." to ".$contact['url'], LOGGER_DEBUG); // 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. diff --git a/mod/settings.php b/mod/settings.php index 3a07e714d..3d1e88ebc 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -770,6 +770,8 @@ function settings_content(&$a) { $settings_connectors .= ''.t('If you receive a message from an unknown OStatus user, this option decides what to do. If it is checked, a new contact will be created for every unknown user.').''; $settings_connectors .= ''; + $settings_connectors .= '

'.t("Repair OStatus subscriptions").'

'; + /* // Deactivated by now - it doesn't seem to work reliable $legacy_contact = get_pconfig(local_user(), 'system', 'ostatus_legacy_contact'); From cecbc587291649f1e89e28dfdd9abd96f93b40ca Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Sat, 5 Sep 2015 10:32:10 +0200 Subject: [PATCH 4/4] Mass-subscribing to OStatus contacts is enabled again --- mod/ostatus_subscribe.php | 78 +++++++++++++++++++++++++++++++++++++++ mod/settings.php | 12 +++--- 2 files changed, 84 insertions(+), 6 deletions(-) create mode 100644 mod/ostatus_subscribe.php diff --git a/mod/ostatus_subscribe.php b/mod/ostatus_subscribe.php new file mode 100644 index 000000000..c950e9700 --- /dev/null +++ b/mod/ostatus_subscribe.php @@ -0,0 +1,78 @@ +".t("Subsribing to OStatus contacts").""; + + $uid = local_user(); + + $a = get_app(); + + $counter = intval($_REQUEST['counter']); + + if (get_pconfig($uid, "ostatus", "legacy_friends") == "") { + + if ($_REQUEST["url"] == "") + return $o.t("No contact provided."); + + $contact = probe_url($_REQUEST["url"]); + + if (!$contact) + return $o.t("Couldn't fetch information for contact."); + + $api = $contact["baseurl"]."/api/"; + + // Fetching friends + $data = z_fetch_url($api."statuses/friends.json?screen_name=".$contact["nick"]); + + if (!$data["success"]) + return $o.t("Couldn't fetch friends for contact."); + + set_pconfig($uid, "ostatus", "legacy_friends", $data["body"]); + } + + $friends = json_decode(get_pconfig($uid, "ostatus", "legacy_friends")); + + $total = sizeof($friends); + + if ($counter >= $total) { + $a->page['htmlhead'] = ''; + del_pconfig($uid, "ostatus", "legacy_friends"); + del_pconfig($uid, "ostatus", "legacy_contact"); + $o .= t("Done"); + return $o; + } + + $friend = $friends[$counter++]; + + $url = $friend->statusnet_profile_url; + + $o .= "

".$counter."/".$total.": ".$url; + + $data = probe_url($url); + if ($data["network"] == NETWORK_OSTATUS) { + $result = new_contact($uid,$url,true); + if ($result["success"]) + $o .= " - ".t("success"); + else + $o .= " - ".t("failed"); + } else + $o .= " - ".t("ignored"); + + $o .= "

"; + + $o .= "

".t("Keep this window open until done.")."

"; + + $a->page['htmlhead'] = ''; + + return $o; +} diff --git a/mod/settings.php b/mod/settings.php index 3d1e88ebc..a985985c7 100644 --- a/mod/settings.php +++ b/mod/settings.php @@ -189,7 +189,7 @@ function settings_post(&$a) { if(x($_POST, 'general-submit')) { set_pconfig(local_user(), 'system', 'no_intelligent_shortening', intval($_POST['no_intelligent_shortening'])); set_pconfig(local_user(), 'system', 'ostatus_autofriend', intval($_POST['snautofollow'])); - //set_pconfig(local_user(), 'system', 'ostatus_legacy_contact', $_POST['legacy_contact']); + set_pconfig(local_user(), 'ostatus', 'legacy_contact', $_POST['legacy_contact']); } elseif(x($_POST, 'imap-submit')) { $mail_server = ((x($_POST,'mail_server')) ? $_POST['mail_server'] : ''); @@ -770,18 +770,18 @@ function settings_content(&$a) { $settings_connectors .= ''.t('If you receive a message from an unknown OStatus user, this option decides what to do. If it is checked, a new contact will be created for every unknown user.').''; $settings_connectors .= ''; - $settings_connectors .= '

'.t("Repair OStatus subscriptions").'

'; + $legacy_contact = get_pconfig(local_user(), 'ostatus', 'legacy_contact'); - /* - // Deactivated by now - it doesn't seem to work reliable - $legacy_contact = get_pconfig(local_user(), 'system', 'ostatus_legacy_contact'); + if ($legacy_contact != "") + $a->page['htmlhead'] = ''; $settings_connectors .= '
'; $settings_connectors .= ''; $settings_connectors .= ''; $settings_connectors .= ''.t('If you enter your old GNU Social/Statusnet account name here (in the format user@domain.tld), your contacts will be added automatically. The field will be emptied when done.').''; $settings_connectors .= '
'; - */ + + $settings_connectors .= '

'.t("Repair OStatus subscriptions").'

'; $settings_connectors .= '
';