<?php
/**
- *
- * Module: dfrn_request
+ * @file mod/dfrn_request.php
+ * @brief Module: dfrn_request
*
* Purpose: Handles communication associated with the issuance of
* friend requests.
*
+ * @see PDF with dfrn specs: https://github.com/friendica/friendica/blob/master/spec/dfrn2.pdf
+ * You also find a graphic which describes the confirmation process at
+ * https://github.com/friendica/friendica/blob/master/spec/dfrn2_contact_request.png
*/
require_once('include/enotify.php');
require_once('include/Scrape.php');
+require_once('include/Probe.php');
+require_once('include/group.php');
-if(! function_exists('dfrn_request_init')) {
function dfrn_request_init(&$a) {
if($a->argc > 1)
profile_load($a,$which);
return;
-}}
+}
/**
* After logging in, we click 'submit' to approve the linkage.
*
*/
-
-if(! function_exists('dfrn_request_post')) {
function dfrn_request_post(&$a) {
if(($a->argc != 2) || (! count($a->profile))) {
}
- /**
+ /*
*
* Scenario 2: We've introduced ourself to another cell, then have been returned to our own cell
* to confirm the request, and then we've clicked submit (perhaps after logging in).
if((x($_POST,'localconfirm')) && ($_POST['localconfirm'] == 1)) {
- /**
+ /*
* Ensure this is a valid request
*/
$confirm_key = ((x($_POST,'confirm_key')) ? $_POST['confirm_key'] : "");
$hidden = ((x($_POST,'hidden-contact')) ? intval($_POST['hidden-contact']) : 0);
$contact_record = null;
+ $blocked = 1;
+ $pending = 1;
if(x($dfrn_url)) {
- /**
+ /*
* Lookup the contact based on their URL (which is the only unique thing we have at the moment)
*/
- $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND (`url` = '%s' OR `nurl` = '%s') AND `self` = 0 LIMIT 1",
+ $r = q("SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND NOT `self` LIMIT 1",
intval(local_user()),
- dbesc($dfrn_url),
dbesc(normalise_link($dfrn_url))
);
- if(count($r)) {
+ if(dbm::is_result($r)) {
if(strlen($r[0]['dfrn-id'])) {
- /**
+ /*
* We don't need to be here. It has already happened.
*/
}
else {
- /**
+ /*
* Scrape the other site's profile page to pick up the dfrn links, key, fn, and photo
*/
- $parms = scrape_dfrn($dfrn_url);
+ $parms = Probe::profile($dfrn_url);
if(! count($parms)) {
notice( t('Profile location is not valid or does not contain profile information.') . EOL );
notice( t('Warning: profile location has no identifiable owner name.') . EOL );
if(! x($parms,'photo'))
notice( t('Warning: profile location has no profile photo.') . EOL );
- $invalid = validate_dfrn($parms);
+ $invalid = Probe::valid_dfrn($parms);
if($invalid) {
notice( sprintf( tt("%d required parameter was not found at the given location",
"%d required parameters were not found at the given location",
$dfrn_request = $parms['dfrn-request'];
- /********* Escape the entire array ********/
+ $photo = $parms["photo"];
+
+ // Escape the entire array
dbesc_array($parms);
- /******************************************/
- /**
+ /*
* Create a contact record on our site for the other person
*/
$r = q("INSERT INTO `contact` ( `uid`, `created`,`url`, `nurl`, `addr`, `name`, `nick`, `photo`, `site-pubkey`,
- `request`, `confirm`, `notify`, `poll`, `poco`, `network`, `aes_allow`, `hidden`)
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d)",
+ `request`, `confirm`, `notify`, `poll`, `poco`, `network`, `aes_allow`, `hidden`, `blocked`, `pending`)
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s' , '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d, %d, %d)",
intval(local_user()),
datetime_convert(),
dbesc($dfrn_url),
$parms['dfrn-poco'],
dbesc(NETWORK_DFRN),
intval($aes_allow),
- intval($hidden)
+ intval($hidden),
+ intval($blocked),
+ intval($pending)
);
}
info( t("Introduction complete.") . EOL);
}
- $r = q("select id from contact where uid = %d and url = '%s' and `site-pubkey` = '%s' limit 1",
+ $r = q("SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `site-pubkey` = '%s' LIMIT 1",
intval(local_user()),
dbesc($dfrn_url),
$parms['key'] // this was already escaped
);
- if(count($r)) {
- $g = q("select def_gid from user where uid = %d limit 1",
- intval(local_user())
- );
- if($g && intval($g[0]['def_gid'])) {
- require_once('include/group.php');
- group_add_member(local_user(),'',$r[0]['id'],$g[0]['def_gid']);
- }
+ if(dbm::is_result($r)) {
+ $def_gid = get_default_group(local_user(), $r[0]["network"]);
+ if(intval($def_gid))
+ group_add_member(local_user(), '', $r[0]['id'], $def_gid);
+
+ if (isset($photo))
+ update_contact_avatar($photo, local_user(), $r[0]["id"], true);
+
$forwardurl = $a->get_baseurl()."/contacts/".$r[0]['id'];
} else
$forwardurl = $a->get_baseurl()."/contacts";
- /**
+ /*
* Allow the blocked remote notification to complete
*/
return; // NOTREACHED
}
- /**
+ /*
* Otherwise:
*
* Scenario 1:
$contact_record = null;
$failed = false;
$parms = null;
+ $blocked = 1;
+ $pending = 1;
if( x($_POST,'dfrn_url')) {
- /**
+ /*
* Block friend request spam
*/
dbesc(datetime_convert('UTC','UTC','now - 24 hours')),
intval($uid)
);
- if(count($r) > $maxreq) {
+ if(dbm::is_result($r) > $maxreq) {
notice( sprintf( t('%s has received too many connection requests today.'), $a->profile['name']) . EOL);
notice( t('Spam protection measures have been invoked.') . EOL);
notice( t('Friends are advised to please try again in 24 hours.') . EOL);
}
}
- /**
+ /*
*
* Cleanup old introductions that remain blocked.
* Also remove the contact record, but only if there is no existing relationship
AND `intro`.`datetime` < UTC_TIMESTAMP() - INTERVAL 30 MINUTE ",
dbesc(NETWORK_MAIL2)
);
- if(count($r)) {
+ if(dbm::is_result($r)) {
foreach($r as $rr) {
if(! $rr['rel']) {
q("DELETE FROM `contact` WHERE `id` = %d",
}
}
- /**
+ /*
*
* Cleanup any old email intros - which will have a greater lifetime
*/
AND `intro`.`datetime` < UTC_TIMESTAMP() - INTERVAL 3 DAY ",
dbesc(NETWORK_MAIL2)
);
- if(count($r)) {
+ if(dbm::is_result($r)) {
foreach($r as $rr) {
if(! $rr['rel']) {
q("DELETE FROM `contact` WHERE `id` = %d",
$nurl = normalise_url($host);
$poll = 'email ' . random_string();
$notify = 'smtp ' . random_string();
- $blocked = 1;
- $pending = 1;
$network = NETWORK_MAIL2;
$rel = CONTACT_IS_FOLLOWER;
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
intval($uid)
);
- if(! count($r)) {
+ if(! dbm::is_result($r)) {
notice( t('This account has not been configured for email. Request failed.') . EOL);
return;
intval($rel)
);
- $r = q("select id from contact where poll = '%s' and uid = %d limit 1",
+ $r = q("SELECT `id`, `network` FROM `contact` WHERE `poll` = '%s' AND `uid` = %d LIMIT 1",
dbesc($poll),
intval($uid)
);
- if(count($r)) {
+ if(dbm::is_result($r)) {
$contact_id = $r[0]['id'];
- $g = q("select def_gid from user where uid = %d limit 1",
- intval($uid)
- );
- if($g && intval($g[0]['def_gid'])) {
- require_once('include/group.php');
- group_add_member($uid,'',$contact_id,$g[0]['def_gid']);
- }
+ $def_gid = get_default_group($uid, $r[0]["network"]);
+ if (intval($def_gid))
+ group_add_member($uid, '', $contact_id, $def_gid);
$photo = avatar_img($addr);
$network = $data["network"];
// Canonicalise email-style profile locator
- $url = webfinger_dfrn($url,$hcard);
+ $url = Probe::webfinger_dfrn($url,$hcard);
if (substr($url,0,5) === 'stat:') {
require_once('include/Scrape.php');
- $parms = scrape_dfrn(($hcard) ? $hcard : $url);
+ $parms = Probe::profile(($hcard) ? $hcard : $url);
if(! count($parms)) {
notice( t('Profile location is not valid or does not contain profile information.') . EOL );
notice( t('Warning: profile location has no identifiable owner name.') . EOL );
if(! x($parms,'photo'))
notice( t('Warning: profile location has no profile photo.') . EOL );
- $invalid = validate_dfrn($parms);
+ $invalid = Probe::valid_dfrn($parms);
if($invalid) {
notice( sprintf( tt("%d required parameter was not found at the given location",
"%d required parameters were not found at the given location",
$parms['url'] = $url;
$parms['issued-id'] = $issued_id;
-
+ $photo = $parms["photo"];
dbesc_array($parms);
$r = q("INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `name`, `nick`, `issued-id`, `photo`, `site-pubkey`,
- `request`, `confirm`, `notify`, `poll`, `poco`, `network` )
- VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s' )",
+ `request`, `confirm`, `notify`, `poll`, `poco`, `network`, `blocked`, `pending` )
+ VALUES ( %d, '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', '%s', %d, %d )",
intval($uid),
dbesc(datetime_convert()),
$parms['url'],
- dbesc(normalise_link($parms['url'])),
+ dbesc(normalise_link($url)),
$parms['addr'],
$parms['fn'],
$parms['nick'],
$parms['dfrn-notify'],
$parms['dfrn-poll'],
$parms['dfrn-poco'],
- dbesc(NETWORK_DFRN)
+ dbesc(NETWORK_DFRN),
+ intval($blocked),
+ intval($pending)
);
// find the contact record we just created
$parms['url'],
$parms['issued-id']
);
- if(count($r))
+ if(dbm::is_result($r)) {
$contact_record = $r[0];
+ update_contact_avatar($photo, $uid, $contact_record["id"], true);
+ }
}
}
// END $network === NETWORK_DFRN
} elseif (($network != NETWORK_PHANTOM) AND ($url != "")) {
- /**
+ /*
*
* Substitute our user's feed URL into $url template
* Send the subscriber home to subscribe
}
} return;
-}}
-
-
+}
-if(! function_exists('dfrn_request_content')) {
function dfrn_request_content(&$a) {
if(($a->argc != 2) || (! count($a->profile)))
$auto_confirm = false;
- if(count($r)) {
+ if(dbm::is_result($r)) {
if(($r[0]['page-flags'] != PAGE_NORMAL) && ($r[0]['page-flags'] != PAGE_PRVGROUP))
$auto_confirm = true;
}
else {
- /**
+ /*
* Normal web request. Display our user's introduction form.
*/
}
- /**
+ /*
* Try to auto-fill the profile address
*/
$target_addr = $a->profile['nickname'] . '@' . substr(z_root(), strpos(z_root(),'://') + 3 );
- /**
+ /*
*
* The auto_request form only has the profile address
* because nobody is going to read the comments and
else
$tpl = get_markup_template('auto_request.tpl');
- // TODO This .= triggers an E_NOTICE, really needed?
- $page_desc .= t("Please enter your 'Identity Address' from one of the following supported communications networks:");
+ $page_desc = t("Please enter your 'Identity Address' from one of the following supported communications networks:");
// see if we are allowed to have NETWORK_MAIL2 contacts
$r = q("SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1",
intval($a->profile['uid'])
);
- if(! count($r))
+ if(! dbm::is_result($r))
$mail_disabled = 1;
}
get_server()
);
- // TODO This .= triggers an E_NOTICE, really needed?
- $o .= replace_macros($tpl,array(
+ $o = replace_macros($tpl,array(
'$header' => t('Friend/Connection Request'),
'$desc' => t('Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca'),
'$pls_answer' => t('Please answer the following:'),
}
return; // Somebody is fishing.
-}}
+}