2010-07-01 23:48:07 +00:00
< ? php
2010-12-15 00:34:49 +00:00
/**
2016-11-28 00:13:47 +00:00
* @ file mod / dfrn_request . php
* @ brief Module : dfrn_request
2010-12-15 00:34:49 +00:00
*
* Purpose : Handles communication associated with the issuance of
* friend requests .
*
2016-11-28 00:13:47 +00:00
* @ see PDF with dfrn specs : https :// github . com / friendica / friendica / blob / master / spec / dfrn2 . pdf
2016-11-29 18:57:30 +00:00
* You also find a graphic which describes the confirmation process at
* https :// github . com / friendica / friendica / blob / master / spec / dfrn2_contact_request . png
2010-12-15 00:34:49 +00:00
*/
2017-04-30 04:07:00 +00:00
use Friendica\App ;
2017-05-07 18:44:30 +00:00
use Friendica\Network\Probe ;
2017-05-07 18:45:19 +00:00
2017-05-07 18:40:23 +00:00
require_once 'include/enotify.php' ;
2017-05-07 18:45:19 +00:00
require_once 'include/probe.php' ;
2017-05-07 18:40:23 +00:00
require_once 'include/group.php' ;
2014-09-06 15:28:46 +00:00
2017-01-09 12:12:54 +00:00
function dfrn_request_init ( App $a ) {
2010-07-01 23:48:07 +00:00
2017-03-21 16:02:59 +00:00
if ( $a -> argc > 1 )
2010-07-01 23:48:07 +00:00
$which = $a -> argv [ 1 ];
2010-12-12 22:33:04 +00:00
profile_load ( $a , $which );
2010-07-01 23:48:07 +00:00
return ;
2016-11-28 00:13:47 +00:00
}
2010-07-01 23:48:07 +00:00
2010-12-15 00:34:49 +00:00
/**
* Function : dfrn_request_post
*
* Purpose :
* Handles multiple scenarios .
*
* Scenario 1 :
* Clicking 'submit' on a friend request page .
*
* Scenario 2 :
* Following Scenario 1 , we are brought back to our home site
* in order to link our friend request with our own server cell .
* After logging in , we click 'submit' to approve the linkage .
*
*/
2017-01-09 12:12:54 +00:00
function dfrn_request_post ( App $a ) {
2010-07-01 23:48:07 +00:00
2017-03-21 16:02:59 +00:00
if (( $a -> argc != 2 ) || ( ! count ( $a -> profile ))) {
2016-03-01 13:42:55 +00:00
logger ( 'Wrong count of argc or profiles: argc=' . $a -> argc . ',profile()=' . count ( $a -> profile ));
2010-07-01 23:48:07 +00:00
return ;
2016-03-01 13:42:55 +00:00
}
2010-07-01 23:48:07 +00:00
2017-03-21 16:02:59 +00:00
if ( x ( $_POST , 'cancel' )) {
2011-08-02 04:02:25 +00:00
goaway ( z_root ());
2014-09-06 15:28:46 +00:00
}
2010-07-01 23:48:07 +00:00
2010-07-06 04:39:55 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
*
* Scenario 2 : We ' ve introduced ourself to another cell , then have been returned to our own cell
2014-09-06 15:28:46 +00:00
* to confirm the request , and then we ' ve clicked submit ( perhaps after logging in ) .
2010-12-15 00:34:49 +00:00
* That brings us here :
*
*/
2010-07-01 23:48:07 +00:00
2017-03-21 16:02:59 +00:00
if (( x ( $_POST , 'localconfirm' )) && ( $_POST [ 'localconfirm' ] == 1 )) {
2010-07-06 04:39:55 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
* Ensure this is a valid request
*/
2017-03-21 16:02:59 +00:00
if ( local_user () && ( $a -> user [ 'nickname' ] == $a -> argv [ 1 ]) && ( x ( $_POST , 'dfrn_url' ))) {
2010-07-06 04:39:55 +00:00
2010-07-01 23:48:07 +00:00
2010-12-15 00:34:49 +00:00
$dfrn_url = notags ( trim ( $_POST [ 'dfrn_url' ]));
$aes_allow = ((( x ( $_POST , 'aes_allow' )) && ( $_POST [ 'aes_allow' ] == 1 )) ? 1 : 0 );
2010-07-22 09:13:39 +00:00
$confirm_key = (( x ( $_POST , 'confirm_key' )) ? $_POST [ 'confirm_key' ] : " " );
2012-05-30 01:43:56 +00:00
$hidden = (( x ( $_POST , 'hidden-contact' )) ? intval ( $_POST [ 'hidden-contact' ]) : 0 );
2010-07-22 09:13:39 +00:00
$contact_record = null ;
2016-11-29 02:08:46 +00:00
$blocked = 1 ;
$pending = 1 ;
2014-03-11 22:52:32 +00:00
2017-03-21 16:02:59 +00:00
if ( x ( $dfrn_url )) {
2010-12-15 00:34:49 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
* Lookup the contact based on their URL ( which is the only unique thing we have at the moment )
*/
2014-03-11 22:52:32 +00:00
2016-11-28 00:13:47 +00:00
$r = q ( " SELECT * FROM `contact` WHERE `uid` = %d AND `nurl` = '%s' AND NOT `self` LIMIT 1 " ,
2016-11-28 14:30:36 +00:00
intval ( local_user ()),
2012-03-15 04:58:54 +00:00
dbesc ( normalise_link ( $dfrn_url ))
2010-07-06 04:39:55 +00:00
);
2014-03-11 22:52:32 +00:00
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $r )) {
2017-03-21 16:02:59 +00:00
if ( strlen ( $r [ 0 ][ 'dfrn-id' ])) {
2010-12-15 00:34:49 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
* We don ' t need to be here . It has already happened .
*/
2010-07-28 02:27:14 +00:00
notice ( t ( " This introduction has already been accepted. " ) . EOL );
2010-07-22 09:13:39 +00:00
return ;
}
else
$contact_record = $r [ 0 ];
}
2013-12-02 19:30:24 +00:00
2017-03-21 16:02:59 +00:00
if ( is_array ( $contact_record )) {
2013-12-02 19:30:24 +00:00
$r = q ( " UPDATE `contact` SET `ret-aes` = %d, hidden = %d WHERE `id` = %d " ,
2010-07-22 09:13:39 +00:00
intval ( $aes_allow ),
2012-05-30 01:43:56 +00:00
intval ( $hidden ),
2010-07-22 09:13:39 +00:00
intval ( $contact_record [ 'id' ])
);
2010-07-06 04:39:55 +00:00
}
else {
2013-12-02 19:30:24 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
* Scrape the other site ' s profile page to pick up the dfrn links , key , fn , and photo
*/
2016-07-04 06:05:30 +00:00
$parms = Probe :: profile ( $dfrn_url );
2014-08-20 22:56:21 +00:00
2016-12-20 16:43:46 +00:00
if ( ! count ( $parms )) {
2010-07-28 02:27:14 +00:00
notice ( t ( 'Profile location is not valid or does not contain profile information.' ) . EOL );
2010-07-06 04:39:55 +00:00
return ;
}
2010-07-22 09:13:39 +00:00
else {
2016-12-20 16:43:46 +00:00
if ( ! x ( $parms , 'fn' )) {
2010-07-28 02:27:14 +00:00
notice ( t ( 'Warning: profile location has no identifiable owner name.' ) . EOL );
2016-12-20 16:43:46 +00:00
}
if ( ! x ( $parms , 'photo' )) {
2010-07-28 02:27:14 +00:00
notice ( t ( 'Warning: profile location has no profile photo.' ) . EOL );
2016-12-20 16:43:46 +00:00
}
2017-05-08 14:19:10 +00:00
$invalid = Probe :: validDfrn ( $parms );
2016-12-20 16:43:46 +00:00
if ( $invalid ) {
2011-03-10 23:22:21 +00:00
notice ( sprintf ( tt ( " %d required parameter was not found at the given location " ,
" %d required parameters were not found at the given location " ,
$invalid ), $invalid ) . EOL );
2010-07-22 09:13:39 +00:00
return ;
}
}
2010-07-01 23:48:07 +00:00
2010-07-22 09:13:39 +00:00
$dfrn_request = $parms [ 'dfrn-request' ];
2010-07-06 04:39:55 +00:00
2016-06-25 11:56:55 +00:00
$photo = $parms [ " photo " ];
2016-11-28 00:13:47 +00:00
// Escape the entire array
2017-01-28 12:19:04 +00:00
dbm :: esc_array ( $parms );
2010-12-15 00:34:49 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
* Create a contact record on our site for the other person
*/
2010-07-06 04:39:55 +00:00
2015-11-25 17:46:02 +00:00
$r = q ( " INSERT INTO `contact` ( `uid`, `created`,`url`, `nurl`, `addr`, `name`, `nick`, `photo`, `site-pubkey`,
2016-11-29 02:08:46 +00:00
`request` , `confirm` , `notify` , `poll` , `poco` , `network` , `aes_allow` , `hidden` , `blocked` , `pending` )
2016-11-29 14:52:12 +00:00
VALUES ( % d , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , % d , % d , % d , % d ) " ,
2010-10-18 21:34:59 +00:00
intval ( local_user ()),
2010-07-22 09:13:39 +00:00
datetime_convert (),
dbesc ( $dfrn_url ),
2011-11-01 23:08:07 +00:00
dbesc ( normalise_link ( $dfrn_url )),
2015-11-25 17:46:02 +00:00
$parms [ 'addr' ],
2010-07-22 09:13:39 +00:00
$parms [ 'fn' ],
2010-10-23 08:20:26 +00:00
$parms [ 'nick' ],
2010-07-22 09:13:39 +00:00
$parms [ 'photo' ],
$parms [ 'key' ],
$parms [ 'dfrn-request' ],
$parms [ 'dfrn-confirm' ],
$parms [ 'dfrn-notify' ],
$parms [ 'dfrn-poll' ],
2011-11-01 03:39:04 +00:00
$parms [ 'dfrn-poco' ],
2011-08-18 23:47:45 +00:00
dbesc ( NETWORK_DFRN ),
2012-05-30 01:43:56 +00:00
intval ( $aes_allow ),
2016-11-29 02:08:46 +00:00
intval ( $hidden ),
intval ( $blocked ),
intval ( $pending )
2010-07-22 09:13:39 +00:00
);
}
2010-07-06 04:39:55 +00:00
2016-12-20 20:15:53 +00:00
if ( $r ) {
2011-05-23 09:39:57 +00:00
info ( t ( " Introduction complete. " ) . EOL );
2010-07-22 09:13:39 +00:00
}
2016-03-06 12:15:27 +00:00
$r = q ( " SELECT `id`, `network` FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `site-pubkey` = '%s' LIMIT 1 " ,
2012-06-12 08:13:09 +00:00
intval ( local_user ()),
2012-06-12 23:17:34 +00:00
dbesc ( $dfrn_url ),
2012-06-12 08:13:09 +00:00
$parms [ 'key' ] // this was already escaped
);
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $r )) {
2016-03-06 12:15:27 +00:00
$def_gid = get_default_group ( local_user (), $r [ 0 ][ " network " ]);
2017-03-21 16:02:59 +00:00
if ( intval ( $def_gid ))
2016-03-06 12:15:27 +00:00
group_add_member ( local_user (), '' , $r [ 0 ][ 'id' ], $def_gid );
2016-04-13 20:21:23 +00:00
2016-06-25 11:56:55 +00:00
if ( isset ( $photo ))
update_contact_avatar ( $photo , local_user (), $r [ 0 ][ " id " ], true );
2016-12-19 13:26:13 +00:00
$forwardurl = App :: get_baseurl () . " /contacts/ " . $r [ 0 ][ 'id' ];
2016-12-20 09:44:27 +00:00
} else {
2016-12-19 13:26:13 +00:00
$forwardurl = App :: get_baseurl () . " /contacts " ;
2016-12-20 09:44:27 +00:00
}
2012-06-12 08:13:09 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
* Allow the blocked remote notification to complete
*/
2010-07-01 23:48:07 +00:00
2016-12-20 09:44:27 +00:00
if ( is_array ( $contact_record )) {
2010-07-22 09:13:39 +00:00
$dfrn_request = $contact_record [ 'request' ];
2016-12-20 09:44:27 +00:00
}
2010-07-01 23:48:07 +00:00
2016-12-20 09:44:27 +00:00
if ( strlen ( $dfrn_request ) && strlen ( $confirm_key )) {
2011-03-30 22:04:18 +00:00
$s = fetch_url ( $dfrn_request . '?confirm_key=' . $confirm_key );
2016-12-20 09:44:27 +00:00
}
2014-08-20 22:56:21 +00:00
2010-12-15 00:34:49 +00:00
// (ignore reply, nothing we can do it failed)
2014-09-01 14:55:16 +00:00
// Old: goaway(zrl($dfrn_url));
goaway ( $forwardurl );
2010-07-22 09:13:39 +00:00
return ; // NOTREACHED
2010-07-06 04:39:55 +00:00
2010-07-22 09:13:39 +00:00
}
2010-07-06 04:39:55 +00:00
2010-07-01 23:48:07 +00:00
}
2010-07-22 09:13:39 +00:00
// invalid/bogus request
2010-09-14 00:12:54 +00:00
notice ( t ( 'Unrecoverable protocol error.' ) . EOL );
2011-08-02 04:02:25 +00:00
goaway ( z_root ());
2010-07-22 09:13:39 +00:00
return ; // NOTREACHED
2010-07-01 23:48:07 +00:00
}
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
* Otherwise :
2014-09-06 15:28:46 +00:00
*
2010-12-15 00:34:49 +00:00
* Scenario 1 :
2014-09-06 15:28:46 +00:00
* We are the requestee . A person from a remote cell has made an introduction
* on our profile web page and clicked submit . We will use their DFRN - URL to
* figure out how to contact their cell .
2010-12-15 00:34:49 +00:00
*
* Scrape the originating DFRN - URL for everything we need . Create a contact record
* and an introduction to show our user next time he / she logs in .
* Finally redirect back to the requestor so that their site can record the request .
2014-09-06 15:28:46 +00:00
* If our user ( the requestee ) later confirms this request , a record of it will need
* to exist on the requestor ' s cell in order for the confirmation process to complete ..
2010-12-15 00:34:49 +00:00
*
* It ' s possible that neither the requestor or the requestee are logged in at the moment ,
* and the requestor does not yet have any credentials to the requestee profile .
*
* Who is the requestee ? We ' ve already loaded their profile which means their nickname should be
* in $a -> argv [ 1 ] and we should have their complete info in $a -> profile .
*
*/
2010-07-01 23:48:07 +00:00
2017-03-21 16:02:59 +00:00
if ( ! ( is_array ( $a -> profile ) && count ( $a -> profile ))) {
2010-09-02 00:26:02 +00:00
notice ( t ( 'Profile unavailable.' ) . EOL );
2010-07-22 09:13:39 +00:00
return ;
}
2010-12-20 08:27:00 +00:00
$nickname = $a -> profile [ 'nickname' ];
$notify_flags = $a -> profile [ 'notify-flags' ];
$uid = $a -> profile [ 'uid' ];
$maxreq = intval ( $a -> profile [ 'maxreq' ]);
2010-07-06 04:39:55 +00:00
$contact_record = null ;
2010-12-20 08:27:00 +00:00
$failed = false ;
$parms = null ;
2016-11-29 14:52:12 +00:00
$blocked = 1 ;
$pending = 1 ;
2010-07-01 23:48:07 +00:00
2017-03-21 16:02:59 +00:00
if ( x ( $_POST , 'dfrn_url' )) {
2010-07-01 23:48:07 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-20 08:27:00 +00:00
* Block friend request spam
*/
2017-03-21 16:02:59 +00:00
if ( $maxreq ) {
2010-12-20 08:27:00 +00:00
$r = q ( " SELECT * FROM `intro` WHERE `datetime` > '%s' AND `uid` = %d " ,
dbesc ( datetime_convert ( 'UTC' , 'UTC' , 'now - 24 hours' )),
intval ( $uid )
);
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $r ) && count ( $r ) > $maxreq ) {
2011-03-10 23:22:21 +00:00
notice ( sprintf ( t ( '%s has received too many connection requests today.' ), $a -> profile [ 'name' ]) . EOL );
2010-12-20 08:27:00 +00:00
notice ( t ( 'Spam protection measures have been invoked.' ) . EOL );
notice ( t ( 'Friends are advised to please try again in 24 hours.' ) . EOL );
return ;
2014-09-06 15:28:46 +00:00
}
2010-12-20 08:27:00 +00:00
}
2016-11-28 00:13:47 +00:00
/*
2011-01-07 08:24:08 +00:00
*
2014-09-06 15:28:46 +00:00
* Cleanup old introductions that remain blocked .
2011-01-07 08:24:08 +00:00
* Also remove the contact record , but only if there is no existing relationship
2011-12-12 07:33:56 +00:00
* Do not remove email contacts as these may be awaiting email verification
*/
2014-09-06 15:28:46 +00:00
$r = q ( " SELECT `intro`.*, `intro`.`id` AS `iid`, `contact`.`id` AS `cid`, `contact`.`rel`
2011-12-12 07:33:56 +00:00
FROM `intro` LEFT JOIN `contact` on `intro` . `contact-id` = `contact` . `id`
2014-09-06 15:28:46 +00:00
WHERE `intro` . `blocked` = 1 AND `contact` . `self` = 0
2011-12-12 07:33:56 +00:00
AND `contact` . `network` != '%s'
AND `intro` . `datetime` < UTC_TIMESTAMP () - INTERVAL 30 MINUTE " ,
2012-04-11 02:15:52 +00:00
dbesc ( NETWORK_MAIL2 )
2011-12-12 07:33:56 +00:00
);
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $r )) {
2016-12-20 20:15:53 +00:00
foreach ( $r as $rr ) {
2017-03-21 16:02:59 +00:00
if ( ! $rr [ 'rel' ]) {
2017-01-29 13:57:03 +00:00
q ( " DELETE FROM `contact` WHERE `id` = %d AND NOT `self` " ,
2011-12-12 07:33:56 +00:00
intval ( $rr [ 'cid' ])
);
}
2014-03-11 22:52:32 +00:00
q ( " DELETE FROM `intro` WHERE `id` = %d " ,
2011-12-12 07:33:56 +00:00
intval ( $rr [ 'iid' ])
);
}
}
2016-11-28 00:13:47 +00:00
/*
2011-01-07 08:24:08 +00:00
*
2011-12-12 07:33:56 +00:00
* Cleanup any old email intros - which will have a greater lifetime
2011-01-07 08:24:08 +00:00
*/
2014-03-11 22:52:32 +00:00
$r = q ( " SELECT `intro`.*, `intro`.`id` AS `iid`, `contact`.`id` AS `cid`, `contact`.`rel`
2011-01-07 08:24:08 +00:00
FROM `intro` LEFT JOIN `contact` on `intro` . `contact-id` = `contact` . `id`
2014-03-11 22:52:32 +00:00
WHERE `intro` . `blocked` = 1 AND `contact` . `self` = 0
2011-12-12 07:33:56 +00:00
AND `contact` . `network` = '%s'
AND `intro` . `datetime` < UTC_TIMESTAMP () - INTERVAL 3 DAY " ,
2012-04-11 02:15:52 +00:00
dbesc ( NETWORK_MAIL2 )
2011-12-12 07:33:56 +00:00
);
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $r )) {
2016-12-20 20:15:53 +00:00
foreach ( $r as $rr ) {
2017-03-21 16:02:59 +00:00
if ( ! $rr [ 'rel' ]) {
2017-01-29 13:57:03 +00:00
q ( " DELETE FROM `contact` WHERE `id` = %d AND NOT `self` " ,
2011-01-07 08:24:08 +00:00
intval ( $rr [ 'cid' ])
);
}
2014-03-11 22:52:32 +00:00
q ( " DELETE FROM `intro` WHERE `id` = %d " ,
2011-01-07 08:24:08 +00:00
intval ( $rr [ 'iid' ])
);
}
}
2012-04-11 02:15:52 +00:00
$email_follow = ( x ( $_POST , 'email_follow' ) ? intval ( $_POST [ 'email_follow' ]) : 0 );
$real_name = ( x ( $_POST , 'realname' ) ? notags ( trim ( $_POST [ 'realname' ])) : '' );
2011-12-12 07:33:56 +00:00
2010-07-01 23:48:07 +00:00
$url = trim ( $_POST [ 'dfrn_url' ]);
2017-03-21 16:02:59 +00:00
if ( ! strlen ( $url )) {
2010-07-28 02:27:14 +00:00
notice ( t ( " Invalid locator " ) . EOL );
2010-07-06 04:39:55 +00:00
return ;
}
2011-09-07 01:06:19 +00:00
$hcard = '' ;
2010-07-20 02:09:58 +00:00
2017-03-21 16:02:59 +00:00
if ( $email_follow ) {
2012-04-11 02:15:52 +00:00
2017-03-21 16:02:59 +00:00
if ( ! validate_email ( $url )) {
2012-04-11 02:15:52 +00:00
notice ( t ( 'Invalid email address.' ) . EOL );
return ;
}
$addr = $url ;
$name = ( $realname ) ? $realname : $addr ;
$nick = substr ( $addr , 0 , strpos ( $addr , '@' ));
$url = 'http://' . substr ( $addr , strpos ( $addr , '@' ) + 1 );
$nurl = normalise_url ( $host );
$poll = 'email ' . random_string ();
$notify = 'smtp ' . random_string ();
$network = NETWORK_MAIL2 ;
$rel = CONTACT_IS_FOLLOWER ;
$mail_disabled = (( function_exists ( 'imap_open' ) && ( ! get_config ( 'system' , 'imap_disabled' ))) ? 0 : 1 );
2017-03-21 16:02:59 +00:00
if ( get_config ( 'system' , 'dfrn_only' ))
2012-04-11 02:15:52 +00:00
$mail_disabled = 1 ;
2017-03-21 16:02:59 +00:00
if ( ! $mail_disabled ) {
2012-04-11 02:15:52 +00:00
$failed = false ;
$r = q ( " SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1 " ,
intval ( $uid )
);
2012-12-23 10:47:14 +00:00
2016-12-20 09:10:33 +00:00
if ( ! dbm :: is_result ( $r )) {
2012-04-11 02:15:52 +00:00
notice ( t ( 'This account has not been configured for email. Request failed.' ) . EOL );
return ;
}
}
2012-04-23 12:16:57 +00:00
$r = q ( " insert into contact ( uid, created, addr, name, nick, url, nurl, poll, notify, blocked, pending, network, rel )
values ( % d , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , '%s' , % d , % d , '%s' , % d ) " ,
intval ( $uid ),
dbesc ( datetime_convert ()),
dbesc ( $addr ),
dbesc ( $name ),
dbesc ( $nick ),
dbesc ( $url ),
dbesc ( $nurl ),
dbesc ( $poll ),
dbesc ( $notify ),
intval ( $blocked ),
intval ( $pending ),
dbesc ( $network ),
intval ( $rel )
);
2012-04-11 02:15:52 +00:00
2016-03-06 12:15:27 +00:00
$r = q ( " SELECT `id`, `network` FROM `contact` WHERE `poll` = '%s' AND `uid` = %d LIMIT 1 " ,
2012-04-23 12:16:57 +00:00
dbesc ( $poll ),
intval ( $uid )
);
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $r )) {
2012-04-23 12:16:57 +00:00
$contact_id = $r [ 0 ][ 'id' ];
2016-03-06 12:15:27 +00:00
$def_gid = get_default_group ( $uid , $r [ 0 ][ " network " ]);
2016-04-13 20:21:23 +00:00
if ( intval ( $def_gid ))
2016-03-06 12:15:27 +00:00
group_add_member ( $uid , '' , $contact_id , $def_gid );
2012-05-18 05:44:52 +00:00
2012-04-23 12:16:57 +00:00
$photo = avatar_img ( $addr );
2014-09-06 15:28:46 +00:00
$r = q ( " UPDATE `contact` SET
`photo` = '%s' ,
2012-04-23 12:16:57 +00:00
`thumb` = '%s' ,
2014-09-06 15:28:46 +00:00
`micro` = '%s' ,
`name-date` = '%s' ,
`uri-date` = '%s' ,
`avatar-date` = '%s' ,
2012-04-23 12:16:57 +00:00
`hidden` = 0 ,
2013-12-02 19:30:24 +00:00
WHERE `id` = % d
2012-04-23 12:16:57 +00:00
" ,
dbesc ( $photos [ 0 ]),
dbesc ( $photos [ 1 ]),
dbesc ( $photos [ 2 ]),
dbesc ( datetime_convert ()),
dbesc ( datetime_convert ()),
dbesc ( datetime_convert ()),
intval ( $contact_id )
);
}
2012-04-24 01:28:33 +00:00
// contact is created. Now create an introduction
2012-04-11 02:15:52 +00:00
2012-04-24 01:28:33 +00:00
$hash = random_string ();
2012-04-11 02:15:52 +00:00
2016-12-15 09:11:25 +00:00
$r = q ( " INSERT INTO `intro` ( `uid`, `contact-id`, knowyou, note, hash, datetime, blocked )
2016-09-20 20:18:35 +00:00
VALUES ( % d , % d , % d , '%s' , '%s' , '%s' , % d ) " ,
2012-04-24 01:28:33 +00:00
intval ( $uid ),
intval ( $contact_id ),
(( x ( $_POST , 'knowyou' ) && ( $_POST [ 'knowyou' ] == 1 )) ? 1 : 0 ),
dbesc ( notags ( trim ( $_POST [ 'dfrn-request-message' ]))),
dbesc ( $hash ),
dbesc ( datetime_convert ()),
1
);
2014-08-20 22:56:21 +00:00
2012-04-24 01:28:33 +00:00
// Next send an email verify form to the requestor.
2012-04-11 02:15:52 +00:00
2016-01-01 16:49:07 +00:00
} else {
2015-12-28 02:14:38 +00:00
// Detect the network
$data = probe_url ( $url );
$network = $data [ " network " ];
2012-04-11 02:15:52 +00:00
2015-12-28 02:14:38 +00:00
// Canonicalise email-style profile locator
2017-05-08 14:19:10 +00:00
$url = Probe :: webfingerDfrn ( $url , $hcard );
2012-04-11 02:15:52 +00:00
2016-01-01 16:49:07 +00:00
if ( substr ( $url , 0 , 5 ) === 'stat:' ) {
// Every time we detect the remote subscription we define this as OStatus.
// We do this even if it is not OStatus.
// we only need to pass this through another section of the code.
if ( $network != NETWORK_DIASPORA )
$network = NETWORK_OSTATUS ;
2010-11-10 02:24:35 +00:00
2016-01-01 16:49:07 +00:00
$url = substr ( $url , 5 );
} else
$network = NETWORK_DFRN ;
2010-07-08 14:03:25 +00:00
}
2010-07-06 04:39:55 +00:00
2016-12-14 15:36:32 +00:00
logger ( 'dfrn_request: url: ' . $url . ',network=' . $network , LOGGER_DEBUG );
2017-03-21 16:02:59 +00:00
if ( $network === NETWORK_DFRN ) {
2014-09-06 15:28:46 +00:00
$ret = q ( " SELECT * FROM `contact` WHERE `uid` = %d AND `url` = '%s' AND `self` = 0 LIMIT 1 " ,
2010-10-13 02:32:15 +00:00
intval ( $uid ),
dbesc ( $url )
2010-07-06 04:39:55 +00:00
);
2010-09-14 00:12:54 +00:00
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $ret )) {
2017-03-21 16:02:59 +00:00
if ( strlen ( $ret [ 0 ][ 'issued-id' ])) {
2010-10-13 02:32:15 +00:00
notice ( t ( 'You have already introduced yourself here.' ) . EOL );
return ;
}
2017-03-21 16:02:59 +00:00
elseif ( $ret [ 0 ][ 'rel' ] == CONTACT_IS_FRIEND ) {
2011-03-10 23:22:21 +00:00
notice ( sprintf ( t ( 'Apparently you are already friends with %s.' ), $a -> profile [ 'name' ]) . EOL );
2010-10-18 03:04:17 +00:00
return ;
}
2010-10-13 02:32:15 +00:00
else {
$contact_record = $ret [ 0 ];
$parms = array ( 'dfrn-request' => $ret [ 0 ][ 'request' ]);
}
2010-09-14 00:12:54 +00:00
}
2010-10-18 03:04:17 +00:00
2010-10-13 02:32:15 +00:00
$issued_id = random_string ();
2017-03-21 16:02:59 +00:00
if ( is_array ( $contact_record )) {
2010-10-13 02:32:15 +00:00
// There is a contact record but no issued-id, so this
// is a reciprocal introduction from a known contact
2013-12-02 19:30:24 +00:00
$r = q ( " UPDATE `contact` SET `issued-id` = '%s' WHERE `id` = %d " ,
2010-10-13 02:32:15 +00:00
dbesc ( $issued_id ),
intval ( $contact_record [ 'id' ])
);
2010-07-01 23:48:07 +00:00
}
else {
2016-12-20 16:43:46 +00:00
if ( ! validate_url ( $url )) {
2010-10-13 02:32:15 +00:00
notice ( t ( 'Invalid profile URL.' ) . EOL );
2016-12-19 13:26:13 +00:00
goaway ( App :: get_baseurl () . '/' . $a -> cmd );
2010-10-13 02:32:15 +00:00
return ; // NOTREACHED
}
2010-07-01 23:48:07 +00:00
2016-12-20 16:43:46 +00:00
if ( ! allowed_url ( $url )) {
2010-10-13 02:32:15 +00:00
notice ( t ( 'Disallowed profile URL.' ) . EOL );
2016-12-19 13:26:13 +00:00
goaway ( App :: get_baseurl () . '/' . $a -> cmd );
2010-10-13 02:32:15 +00:00
return ; // NOTREACHED
2010-07-01 23:48:07 +00:00
}
2014-09-06 15:28:46 +00:00
2017-04-26 04:23:01 +00:00
if ( blocked_url ( $url )) {
2017-04-26 02:45:56 +00:00
notice ( t ( 'Blocked domain' ) . EOL );
goaway ( App :: get_baseurl () . '/' . $a -> cmd );
return ; // NOTREACHED
}
2010-07-01 23:48:07 +00:00
2016-07-04 06:05:30 +00:00
$parms = Probe :: profile (( $hcard ) ? $hcard : $url );
2010-10-13 02:32:15 +00:00
2016-12-20 16:43:46 +00:00
if ( ! count ( $parms )) {
2010-10-13 02:32:15 +00:00
notice ( t ( 'Profile location is not valid or does not contain profile information.' ) . EOL );
2016-12-19 13:26:13 +00:00
goaway ( App :: get_baseurl () . '/' . $a -> cmd );
2010-10-13 02:32:15 +00:00
}
else {
2016-12-20 16:43:46 +00:00
if ( ! x ( $parms , 'fn' )) {
2010-10-13 02:32:15 +00:00
notice ( t ( 'Warning: profile location has no identifiable owner name.' ) . EOL );
2016-12-20 16:43:46 +00:00
}
if ( ! x ( $parms , 'photo' )) {
2010-10-13 02:32:15 +00:00
notice ( t ( 'Warning: profile location has no profile photo.' ) . EOL );
2016-12-20 16:43:46 +00:00
}
2017-05-08 14:19:10 +00:00
$invalid = Probe :: validDfrn ( $parms );
2016-12-20 16:43:46 +00:00
if ( $invalid ) {
2011-03-10 23:22:21 +00:00
notice ( sprintf ( tt ( " %d required parameter was not found at the given location " ,
" %d required parameters were not found at the given location " ,
$invalid ), $invalid ) . EOL );
2014-09-06 15:28:46 +00:00
2010-10-13 02:32:15 +00:00
return ;
}
}
2010-07-01 23:48:07 +00:00
2010-10-13 02:32:15 +00:00
$parms [ 'url' ] = $url ;
$parms [ 'issued-id' ] = $issued_id ;
2016-06-25 11:56:55 +00:00
$photo = $parms [ " photo " ];
2010-07-06 04:39:55 +00:00
2017-01-28 12:19:04 +00:00
dbm :: esc_array ( $parms );
2015-11-25 17:46:02 +00:00
$r = q ( " INSERT INTO `contact` ( `uid`, `created`, `url`, `nurl`, `addr`, `name`, `nick`, `issued-id`, `photo`, `site-pubkey`,
2016-11-29 14:52:12 +00:00
`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 ) " ,
2010-07-06 04:39:55 +00:00
intval ( $uid ),
2011-11-01 23:08:07 +00:00
dbesc ( datetime_convert ()),
2010-07-06 04:39:55 +00:00
$parms [ 'url' ],
2016-06-25 11:56:55 +00:00
dbesc ( normalise_link ( $url )),
2015-11-25 17:46:02 +00:00
$parms [ 'addr' ],
2010-10-13 02:32:15 +00:00
$parms [ 'fn' ],
2010-10-23 08:20:26 +00:00
$parms [ 'nick' ],
2010-10-13 02:32:15 +00:00
$parms [ 'issued-id' ],
$parms [ 'photo' ],
$parms [ 'key' ],
$parms [ 'dfrn-request' ],
$parms [ 'dfrn-confirm' ],
$parms [ 'dfrn-notify' ],
2011-08-18 23:47:45 +00:00
$parms [ 'dfrn-poll' ],
2011-11-01 03:39:04 +00:00
$parms [ 'dfrn-poco' ],
2016-11-29 14:52:12 +00:00
dbesc ( NETWORK_DFRN ),
intval ( $blocked ),
intval ( $pending )
2010-07-06 04:39:55 +00:00
);
2010-07-01 23:48:07 +00:00
2010-10-13 02:32:15 +00:00
// find the contact record we just created
2016-12-20 09:44:27 +00:00
if ( $r ) {
2014-03-11 22:52:32 +00:00
$r = q ( " SELECT `id` FROM `contact`
2010-10-13 02:32:15 +00:00
WHERE `uid` = % d AND `url` = '%s' AND `issued-id` = '%s' LIMIT 1 " ,
intval ( $uid ),
$parms [ 'url' ],
$parms [ 'issued-id' ]
);
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $r )) {
2010-10-13 02:32:15 +00:00
$contact_record = $r [ 0 ];
2016-06-25 11:56:55 +00:00
update_contact_avatar ( $photo , $uid , $contact_record [ " id " ], true );
}
2010-10-13 02:32:15 +00:00
}
2013-12-02 19:30:24 +00:00
2010-10-13 02:32:15 +00:00
}
2016-12-20 09:44:27 +00:00
if ( $r === false ) {
2010-10-13 02:32:15 +00:00
notice ( t ( 'Failed to update contact record.' ) . EOL );
return ;
}
2010-07-01 23:48:07 +00:00
2010-10-13 02:32:15 +00:00
$hash = random_string () . ( string ) time (); // Generate a confirm_key
2013-12-02 19:30:24 +00:00
2016-12-20 09:44:27 +00:00
if ( is_array ( $contact_record )) {
2010-10-13 02:32:15 +00:00
$ret = q ( " INSERT INTO `intro` ( `uid`, `contact-id`, `blocked`, `knowyou`, `note`, `hash`, `datetime`)
VALUES ( % d , % d , 1 , % d , '%s' , '%s' , '%s' ) " ,
intval ( $uid ),
intval ( $contact_record [ 'id' ]),
(( x ( $_POST , 'knowyou' ) && ( $_POST [ 'knowyou' ] == 1 )) ? 1 : 0 ),
dbesc ( notags ( trim ( $_POST [ 'dfrn-request-message' ]))),
dbesc ( $hash ),
dbesc ( datetime_convert ())
);
}
2014-08-20 22:56:21 +00:00
2010-10-18 03:04:17 +00:00
// This notice will only be seen by the requestor if the requestor and requestee are on the same server.
2010-07-01 23:48:07 +00:00
2016-12-20 09:44:27 +00:00
if ( ! $failed ) {
2011-05-23 09:39:57 +00:00
info ( t ( 'Your introduction has been sent.' ) . EOL );
2016-12-20 09:44:27 +00:00
}
2010-07-01 23:48:07 +00:00
2010-10-13 02:32:15 +00:00
// "Homecoming" - send the requestor back to their site to record the introduction.
2010-07-01 23:48:07 +00:00
2016-12-19 13:26:13 +00:00
$dfrn_url = bin2hex ( App :: get_baseurl () . '/profile/' . $nickname );
2010-10-13 02:32:15 +00:00
$aes_allow = (( function_exists ( 'openssl_encrypt' )) ? 1 : 0 );
2010-07-01 23:48:07 +00:00
2014-09-06 15:28:46 +00:00
goaway ( $parms [ 'dfrn-request' ] . " ?dfrn_url= $dfrn_url "
. '&dfrn_version=' . DFRN_PROTOCOL_VERSION
. '&confirm_key=' . $hash
2010-10-13 02:32:15 +00:00
. (( $aes_allow ) ? " &aes_allow=1 " : " " )
);
// NOTREACHED
2011-08-18 23:47:45 +00:00
// END $network === NETWORK_DFRN
2017-06-08 02:00:59 +00:00
} elseif (( $network != NETWORK_PHANTOM ) && ( $url != " " )) {
2014-09-06 15:28:46 +00:00
2016-11-28 00:13:47 +00:00
/*
2010-12-15 00:34:49 +00:00
*
* Substitute our user ' s feed URL into $url template
* Send the subscriber home to subscribe
*
*/
2010-10-13 02:32:15 +00:00
2015-12-28 02:14:38 +00:00
// Diaspora needs the uri in the format user@domain.tld
// Diaspora will support the remote subscription in a future version
if ( $network == NETWORK_DIASPORA ) {
$uri = $nickname . '@' . $a -> get_hostname ();
if ( $a -> get_path ())
$uri .= '/' . $a -> get_path ();
$uri = urlencode ( $uri );
2016-12-20 09:44:27 +00:00
} else {
2016-12-19 13:26:13 +00:00
$uri = App :: get_baseurl () . '/profile/' . $nickname ;
2016-12-20 09:44:27 +00:00
}
2015-12-28 02:14:38 +00:00
$url = str_replace ( '{uri}' , $uri , $url );
2010-10-13 02:32:15 +00:00
goaway ( $url );
// NOTREACHED
2015-12-28 02:14:38 +00:00
// END $network != NETWORK_PHANTOM
} else {
notice ( t ( " Remote subscription can't be done for your network. Please subscribe directly on your system. " ) . EOL );
return ;
2010-10-13 02:32:15 +00:00
}
2010-07-01 23:48:07 +00:00
2010-10-13 02:32:15 +00:00
} return ;
2016-11-28 00:13:47 +00:00
}
2010-07-22 09:13:39 +00:00
2017-01-09 12:12:54 +00:00
function dfrn_request_content ( App $a ) {
2010-07-01 23:48:07 +00:00
2016-12-20 09:44:27 +00:00
if (( $a -> argc != 2 ) || ( ! count ( $a -> profile ))) {
2010-07-01 23:48:07 +00:00
return " " ;
2016-12-20 09:44:27 +00:00
}
2010-07-01 23:48:07 +00:00
// "Homecoming". Make sure we're logged in to this site as the correct user. Then offer a confirm button
// to send us to the post section to record the introduction.
2016-12-20 09:44:27 +00:00
if ( x ( $_GET , 'dfrn_url' )) {
2010-07-01 23:48:07 +00:00
2016-12-20 09:44:27 +00:00
if ( ! local_user ()) {
2011-05-23 09:39:57 +00:00
info ( t ( " Please login to confirm introduction. " ) . EOL );
2011-01-07 07:41:14 +00:00
/* setup the return URL to come back to this page if they use openid */
2014-10-22 07:32:24 +00:00
$_SESSION [ 'return_url' ] = $a -> query_string ;
2010-07-01 23:48:07 +00:00
return login ();
}
2014-09-06 15:28:46 +00:00
// Edge case, but can easily happen in the wild. This person is authenticated,
2010-07-01 23:48:07 +00:00
// but not as the person who needs to deal with this request.
2010-07-22 09:13:39 +00:00
if ( $a -> user [ 'nickname' ] != $a -> argv [ 1 ]) {
2010-07-28 02:27:14 +00:00
notice ( t ( " Incorrect identity currently logged in. Please login to <strong>this</strong> profile. " ) . EOL );
2010-07-01 23:48:07 +00:00
return login ();
}
2010-07-22 09:13:39 +00:00
$dfrn_url = notags ( trim ( hex2bin ( $_GET [ 'dfrn_url' ])));
2010-07-01 23:48:07 +00:00
$aes_allow = ((( x ( $_GET , 'aes_allow' )) && ( $_GET [ 'aes_allow' ] == 1 )) ? 1 : 0 );
$confirm_key = ( x ( $_GET , 'confirm_key' ) ? $_GET [ 'confirm_key' ] : " " );
2015-04-08 22:10:21 +00:00
// Checking fastlane for validity
2017-06-08 02:00:59 +00:00
if ( x ( $_SESSION , " fastlane " ) && ( normalise_link ( $_SESSION [ " fastlane " ]) == normalise_link ( $dfrn_url ))) {
2015-04-08 22:10:21 +00:00
$_POST [ " dfrn_url " ] = $dfrn_url ;
$_POST [ " confirm_key " ] = $confirm_key ;
$_POST [ " localconfirm " ] = 1 ;
$_POST [ " hidden-contact " ] = 0 ;
$_POST [ " submit " ] = t ( 'Confirm' );
dfrn_request_post ( $a );
killme ();
return ; // NOTREACHED
}
2011-05-11 11:37:13 +00:00
$tpl = get_markup_template ( " dfrn_req_confirm.tpl " );
$o = replace_macros ( $tpl , array (
2010-07-01 23:48:07 +00:00
'$dfrn_url' => $dfrn_url ,
'$aes_allow' => (( $aes_allow ) ? '<input type="hidden" name="aes_allow" value="1" />' : " " ),
2012-05-30 01:43:56 +00:00
'$hidethem' => t ( 'Hide this contact' ),
'$hidechecked' => '' ,
2010-07-01 23:48:07 +00:00
'$confirm_key' => $confirm_key ,
2011-04-07 06:03:54 +00:00
'$welcome' => sprintf ( t ( 'Welcome home %s.' ), $a -> user [ 'username' ]),
'$please' => sprintf ( t ( 'Please confirm your introduction/connection request to %s.' ), $dfrn_url ),
'$submit' => t ( 'Confirm' ),
2010-07-01 23:48:07 +00:00
'$uid' => $_SESSION [ 'uid' ],
2010-07-21 03:48:08 +00:00
'$nickname' => $a -> user [ 'nickname' ],
2010-07-01 23:48:07 +00:00
'dfrn_rawurl' => $_GET [ 'dfrn_url' ]
));
return $o ;
}
2017-03-21 16:02:59 +00:00
elseif (( x ( $_GET , 'confirm_key' )) && strlen ( $_GET [ 'confirm_key' ])) {
2010-07-22 09:13:39 +00:00
// we are the requestee and it is now safe to send our user their introduction,
2014-09-06 15:28:46 +00:00
// We could just unblock it, but first we have to jump through a few hoops to
// send an email, or even to find out if we need to send an email.
2010-07-22 09:13:39 +00:00
$intro = q ( " SELECT * FROM `intro` WHERE `hash` = '%s' LIMIT 1 " ,
dbesc ( $_GET [ 'confirm_key' ])
);
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $intro )) {
2016-05-01 12:24:44 +00:00
2010-07-22 09:13:39 +00:00
$r = q ( " SELECT `contact`.*, `user`.* FROM `contact` LEFT JOIN `user` ON `contact`.`uid` = `user`.`uid`
WHERE `contact` . `id` = % d LIMIT 1 " ,
intval ( $intro [ 0 ][ 'contact-id' ])
);
2010-10-18 03:04:17 +00:00
$auto_confirm = false ;
2016-12-14 08:41:33 +00:00
if ( dbm :: is_result ( $r )) {
2017-03-21 16:02:59 +00:00
if (( $r [ 0 ][ 'page-flags' ] != PAGE_NORMAL ) && ( $r [ 0 ][ 'page-flags' ] != PAGE_PRVGROUP ))
2014-03-11 22:52:32 +00:00
$auto_confirm = true ;
2011-12-26 23:47:40 +00:00
2017-03-21 16:02:59 +00:00
if ( ! $auto_confirm ) {
2014-09-06 15:28:46 +00:00
2011-12-26 23:47:40 +00:00
notification ( array (
'type' => NOTIFY_INTRO ,
'notify_flags' => $r [ 0 ][ 'notify-flags' ],
'language' => $r [ 0 ][ 'language' ],
'to_name' => $r [ 0 ][ 'username' ],
'to_email' => $r [ 0 ][ 'email' ],
2012-02-18 10:57:42 +00:00
'uid' => $r [ 0 ][ 'uid' ],
2016-12-19 13:26:13 +00:00
'link' => App :: get_baseurl () . '/notifications/intros' ,
2011-12-26 23:47:40 +00:00
'source_name' => (( strlen ( stripslashes ( $r [ 0 ][ 'name' ]))) ? stripslashes ( $r [ 0 ][ 'name' ]) : t ( '[Name Withheld]' )),
'source_link' => $r [ 0 ][ 'url' ],
2012-01-04 04:26:20 +00:00
'source_photo' => $r [ 0 ][ 'photo' ],
'verb' => ACTIVITY_REQ_FRIEND ,
'otype' => 'intro'
2010-07-22 09:13:39 +00:00
));
}
2011-12-26 23:47:40 +00:00
2017-03-21 16:02:59 +00:00
if ( $auto_confirm ) {
2017-05-07 18:40:23 +00:00
require_once 'mod/dfrn_confirm.php' ;
2010-10-18 03:04:17 +00:00
$handsfree = array (
2016-12-14 08:56:27 +00:00
'uid' => $r [ 0 ][ 'uid' ],
'node' => $r [ 0 ][ 'nickname' ],
'dfrn_id' => $r [ 0 ][ 'issued-id' ],
2010-10-18 03:04:17 +00:00
'intro_id' => $intro [ 0 ][ 'id' ],
2016-12-14 08:56:27 +00:00
'duplex' => (( $r [ 0 ][ 'page-flags' ] == PAGE_FREELOVE ) ? 1 : 0 ),
2012-04-30 11:11:42 +00:00
'activity' => intval ( get_pconfig ( $r [ 0 ][ 'uid' ], 'system' , 'post_newfriend' ))
2010-10-18 03:04:17 +00:00
);
dfrn_confirm_post ( $a , $handsfree );
}
2010-07-22 09:13:39 +00:00
}
2017-03-21 16:02:59 +00:00
if ( ! $auto_confirm ) {
2010-07-01 23:48:07 +00:00
2010-10-18 03:04:17 +00:00
// If we are auto_confirming, this record will have already been nuked
// in dfrn_confirm_post()
2013-12-02 19:30:24 +00:00
$r = q ( " UPDATE `intro` SET `blocked` = 0 WHERE `hash` = '%s' " ,
2010-10-18 03:04:17 +00:00
dbesc ( $_GET [ 'confirm_key' ])
);
}
2010-07-22 09:13:39 +00:00
}
2011-08-18 23:47:45 +00:00
2010-07-22 09:13:39 +00:00
killme ();
return ; // NOTREACHED
}
else {
2011-01-01 21:12:31 +00:00
2016-11-28 00:13:47 +00:00
/*
2011-01-01 21:12:31 +00:00
* Normal web request . Display our user ' s introduction form .
*/
2014-09-06 15:28:46 +00:00
2017-03-21 16:02:59 +00:00
if (( get_config ( 'system' , 'block_public' )) && ( ! local_user ()) && ( ! remote_user ())) {
if ( ! get_config ( 'system' , 'local_block' )) {
2012-09-07 03:17:50 +00:00
notice ( t ( 'Public access denied.' ) . EOL );
return ;
}
2011-04-22 02:12:22 +00:00
}
2016-11-28 00:13:47 +00:00
/*
2011-01-01 21:12:31 +00:00
* Try to auto - fill the profile address
*/
2014-08-20 22:56:21 +00:00
// At first look if an address was provided
// Otherwise take the local address
2017-06-08 02:00:59 +00:00
if ( x ( $_GET , 'addr' ) && ( $_GET [ 'addr' ] != " " )) {
2014-08-20 22:56:21 +00:00
$myaddr = hex2bin ( $_GET [ 'addr' ]);
2017-06-08 02:00:59 +00:00
} elseif ( x ( $_GET , 'address' ) && ( $_GET [ 'address' ] != " " )) {
2014-08-20 22:56:21 +00:00
$myaddr = $_GET [ 'address' ];
2016-12-19 13:26:13 +00:00
} elseif ( local_user ()) {
2016-12-20 16:43:46 +00:00
if ( strlen ( $a -> path )) {
2016-12-19 13:26:13 +00:00
$myaddr = App :: get_baseurl () . '/profile/' . $a -> user [ 'nickname' ];
2016-12-19 13:26:13 +00:00
} else {
2011-08-02 04:02:25 +00:00
$myaddr = $a -> user [ 'nickname' ] . '@' . substr ( z_root (), strpos ( z_root (), '://' ) + 3 );
2011-01-01 21:12:31 +00:00
}
2016-12-19 13:26:13 +00:00
} else {
2016-12-20 16:43:46 +00:00
// last, try a zrl
2012-04-27 23:23:25 +00:00
$myaddr = get_my_url ();
2016-12-20 16:43:46 +00:00
}
2012-04-27 23:23:25 +00:00
2011-09-06 01:34:30 +00:00
$target_addr = $a -> profile [ 'nickname' ] . '@' . substr ( z_root (), strpos ( z_root (), '://' ) + 3 );
2016-11-28 00:13:47 +00:00
/*
2011-01-01 21:12:31 +00:00
*
* The auto_request form only has the profile address
2014-09-06 15:28:46 +00:00
* because nobody is going to read the comments and
2011-01-01 21:12:31 +00:00
* it doesn ' t matter if they know you or not .
*
*/
2016-12-20 16:43:46 +00:00
if ( $a -> profile [ 'page-flags' ] == PAGE_NORMAL ) {
2011-05-11 11:37:13 +00:00
$tpl = get_markup_template ( 'dfrn_request.tpl' );
2016-12-19 13:26:13 +00:00
} else {
2011-05-11 11:37:13 +00:00
$tpl = get_markup_template ( 'auto_request.tpl' );
2016-12-20 16:43:46 +00:00
}
2011-01-01 21:12:31 +00:00
2016-03-01 17:28:06 +00:00
$page_desc = t ( " Please enter your 'Identity Address' from one of the following supported communications networks: " );
2012-03-13 22:40:16 +00:00
2012-03-15 04:58:54 +00:00
// see if we are allowed to have NETWORK_MAIL2 contacts
$mail_disabled = (( function_exists ( 'imap_open' ) && ( ! get_config ( 'system' , 'imap_disabled' ))) ? 0 : 1 );
2016-12-19 13:26:13 +00:00
if ( get_config ( 'system' , 'dfrn_only' )) {
2012-03-15 04:58:54 +00:00
$mail_disabled = 1 ;
2016-12-19 13:26:13 +00:00
}
2012-03-15 04:58:54 +00:00
2016-12-19 13:26:13 +00:00
if ( ! $mail_disabled ) {
2012-03-15 04:58:54 +00:00
$r = q ( " SELECT * FROM `mailacct` WHERE `uid` = %d LIMIT 1 " ,
intval ( $a -> profile [ 'uid' ])
);
2016-12-20 09:10:33 +00:00
if ( ! dbm :: is_result ( $r )) {
2012-03-15 04:58:54 +00:00
$mail_disabled = 1 ;
2016-12-20 09:10:33 +00:00
}
2012-03-15 04:58:54 +00:00
}
2014-08-20 22:56:21 +00:00
// "coming soon" is disabled for now
//$emailnet = (($mail_disabled) ? '' : t("<strike>Connect as an email follower</strike> \x28Coming soon\x29"));
$emailnet = " " ;
2012-03-13 22:40:16 +00:00
2015-08-26 17:17:41 +00:00
$invite_desc = sprintf (
t ( 'If you are not yet a member of the free social web, <a href="%s/siteinfo">follow this link to find a public Friendica site and join us today</a>.' ),
get_server ()
);
2011-09-06 01:34:30 +00:00
2016-03-01 17:28:06 +00:00
$o = replace_macros ( $tpl , array (
2010-12-17 03:38:52 +00:00
'$header' => t ( 'Friend/Connection Request' ),
2011-11-01 03:39:04 +00:00
'$desc' => t ( 'Examples: jojo@demo.friendica.com, http://demo.friendica.com/profile/jojo, testuser@identi.ca' ),
2010-12-17 03:38:52 +00:00
'$pls_answer' => t ( 'Please answer the following:' ),
2017-04-08 14:57:24 +00:00
'$does_know_you' => array ( 'knowyou' , sprintf ( t ( 'Does %s know you?' ), $a -> profile [ 'name' ]), false , '' , array ( t ( 'No' ), t ( 'Yes' ))),
2014-08-20 22:56:21 +00:00
/* '$does_know' => sprintf ( t ( 'Does %s know you?' ), $a -> profile [ 'name' ]),
2010-12-17 03:38:52 +00:00
'$yes' => t ( 'Yes' ),
2014-08-20 22:56:21 +00:00
'$no' => t ( 'No' ), */
2010-12-17 03:38:52 +00:00
'$add_note' => t ( 'Add a personal note:' ),
2011-09-06 01:34:30 +00:00
'$page_desc' => $page_desc ,
2012-02-19 18:44:30 +00:00
'$friendica' => t ( 'Friendica' ),
2011-06-09 04:06:02 +00:00
'$statusnet' => t ( 'StatusNet/Federated Social Web' ),
2011-09-06 01:34:30 +00:00
'$diaspora' => t ( 'Diaspora' ),
2012-04-01 23:18:03 +00:00
'$diasnote' => sprintf ( t ( ' - please do not use this form. Instead, enter %s into your Diaspora search bar.' ), $target_addr ),
2011-04-15 03:37:42 +00:00
'$your_address' => t ( 'Your Identity Address:' ),
2012-03-13 22:40:16 +00:00
'$invite_desc' => $invite_desc ,
'$emailnet' => $emailnet ,
2010-12-17 03:38:52 +00:00
'$submit' => t ( 'Submit Request' ),
'$cancel' => t ( 'Cancel' ),
2010-10-26 04:52:30 +00:00
'$nickname' => $a -> argv [ 1 ],
'$name' => $a -> profile [ 'name' ],
'$myaddr' => $myaddr
));
2010-07-22 09:13:39 +00:00
return $o ;
2010-07-01 23:48:07 +00:00
}
2010-07-28 02:27:14 +00:00
2010-07-22 09:13:39 +00:00
return ; // Somebody is fishing.
2016-11-28 00:13:47 +00:00
}