2011-10-26 23:09:03 -04:00
< ? php
2016-10-03 23:48:01 -04:00
// See here for a documentation for portable contacts:
// https://web.archive.org/web/20160405005550/http://portablecontacts.net/draft-spec.html
2011-10-26 23:09:03 -04:00
2017-01-09 07:14:25 -05:00
function poco_init ( App $a ) {
2015-01-09 18:34:08 -05:00
require_once ( " include/bbcode.php " );
2011-10-26 23:09:03 -04:00
2011-11-28 18:11:59 -05:00
$system_mode = false ;
2015-05-31 19:50:27 -04:00
if ( intval ( get_config ( 'system' , 'block_public' )) || ( get_config ( 'system' , 'block_local_dir' )))
2011-11-28 18:11:59 -05:00
http_status_exit ( 401 );
2011-10-26 23:09:03 -04:00
if ( $a -> argc > 1 ) {
$user = notags ( trim ( $a -> argv [ 1 ]));
}
2011-11-28 18:11:59 -05:00
if ( ! x ( $user )) {
2015-01-05 16:44:55 -05:00
$c = q ( " SELECT * FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1 " );
2016-12-20 09:37:27 -05:00
if ( ! dbm :: is_result ( $c )) {
2011-11-28 18:11:59 -05:00
http_status_exit ( 401 );
2016-12-20 09:37:27 -05:00
}
2011-11-28 18:11:59 -05:00
$system_mode = true ;
}
2011-10-27 03:57:19 -04:00
$format = (( $_GET [ 'format' ]) ? $_GET [ 'format' ] : 'json' );
2011-10-26 23:09:03 -04:00
$justme = false ;
2015-01-27 02:01:37 -05:00
$global = false ;
2011-10-26 23:09:03 -04:00
2017-03-13 10:57:11 -04:00
if ( $a -> argc > 1 && $a -> argv [ 1 ] === '@server' ) {
// List of all servers that this server knows
2017-03-04 06:04:00 -05:00
$ret = poco_serverlist ();
header ( 'Content-type: application/json' );
echo json_encode ( $ret );
killme ();
}
2017-03-13 10:57:11 -04:00
if ( $a -> argc > 1 && $a -> argv [ 1 ] === '@global' ) {
// List of all profiles that this server recently had data from
2015-01-27 02:01:37 -05:00
$global = true ;
$update_limit = date ( " Y-m-d H:i:s " , time () - 30 * 86400 );
}
2017-03-13 10:57:11 -04:00
if ( $a -> argc > 2 && $a -> argv [ 2 ] === '@me' ) {
2011-10-26 23:09:03 -04:00
$justme = true ;
2017-03-13 10:57:11 -04:00
}
if ( $a -> argc > 3 && $a -> argv [ 3 ] === '@all' ) {
2011-10-26 23:09:03 -04:00
$justme = false ;
2017-03-13 10:57:11 -04:00
}
if ( $a -> argc > 3 && $a -> argv [ 3 ] === '@self' ) {
2011-10-26 23:09:03 -04:00
$justme = true ;
2017-03-13 10:57:11 -04:00
}
if ( $a -> argc > 4 && intval ( $a -> argv [ 4 ]) && $justme == false )
2011-10-26 23:09:03 -04:00
$cid = intval ( $a -> argv [ 4 ]);
2017-03-13 10:57:11 -04:00
}
2011-10-26 23:09:03 -04:00
2015-01-27 02:01:37 -05:00
if ( ! $system_mode AND ! $global ) {
2011-11-28 18:11:59 -05:00
$r = q ( " SELECT `user`.*,`profile`.`hide-friends` from user left join profile on `user`.`uid` = `profile`.`uid`
where `user` . `nickname` = '%s' and `profile` . `is-default` = 1 limit 1 " ,
dbesc ( $user )
);
2016-12-13 04:44:13 -05:00
if ( ! dbm :: is_result ( $r ) || $r [ 0 ][ 'hidewall' ] || $r [ 0 ][ 'hide-friends' ])
2011-11-28 18:11:59 -05:00
http_status_exit ( 404 );
2011-10-26 23:09:03 -04:00
2011-11-28 18:11:59 -05:00
$user = $r [ 0 ];
}
2011-10-26 23:09:03 -04:00
if ( $justme )
2015-01-05 16:44:55 -05:00
$sql_extra = " AND `contact`.`self` = 1 " ;
2015-01-25 10:40:20 -05:00
// else
// $sql_extra = " AND `contact`.`self` = 0 ";
2011-10-26 23:09:03 -04:00
if ( $cid )
2015-01-05 16:44:55 -05:00
$sql_extra = sprintf ( " AND `contact`.`id` = %d " , intval ( $cid ));
2011-10-26 23:09:03 -04:00
2015-01-27 02:01:37 -05:00
if ( x ( $_GET , 'updatedSince' ))
$update_limit = date ( " Y-m-d H:i:s " , strtotime ( $_GET [ 'updatedSince' ]));
if ( $global ) {
2016-01-06 08:13:59 -05:00
$r = q ( " SELECT count(*) AS `total` FROM `gcontact` WHERE `updated` >= '%s' AND `updated` >= `last_failure` AND NOT `hide` AND `network` IN ('%s', '%s', '%s') " ,
2015-01-27 02:01:37 -05:00
dbesc ( $update_limit ),
2015-07-24 01:23:57 -04:00
dbesc ( NETWORK_DFRN ),
dbesc ( NETWORK_DIASPORA ),
dbesc ( NETWORK_OSTATUS )
2015-01-27 02:01:37 -05:00
);
} elseif ( $system_mode ) {
2015-10-31 05:32:01 -04:00
$r = q ( " SELECT count(*) AS `total` FROM `contact` WHERE `self` = 1
AND `uid` IN ( SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1 ) " );
2015-01-27 02:01:37 -05:00
} else {
2015-01-05 16:44:55 -05:00
$r = q ( " SELECT count(*) AS `total` FROM `contact` WHERE `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 AND `archive` = 0
2015-07-25 04:50:00 -04:00
AND ( `success_update` >= `failure_update` OR `last-item` >= `failure_update` )
AND `network` IN ( '%s' , '%s' , '%s' , '%s' ) $sql_extra " ,
2015-01-05 16:44:55 -05:00
intval ( $user [ 'uid' ]),
dbesc ( NETWORK_DFRN ),
dbesc ( NETWORK_DIASPORA ),
2015-01-08 01:59:20 -05:00
dbesc ( NETWORK_OSTATUS ),
dbesc ( NETWORK_STATUSNET )
2011-11-28 18:11:59 -05:00
);
}
2016-12-14 03:41:33 -05:00
if ( dbm :: is_result ( $r ))
2011-10-26 23:09:03 -04:00
$totalResults = intval ( $r [ 0 ][ 'total' ]);
else
$totalResults = 0 ;
$startIndex = intval ( $_GET [ 'startIndex' ]);
if ( ! $startIndex )
$startIndex = 0 ;
$itemsPerPage = (( x ( $_GET , 'count' ) && intval ( $_GET [ 'count' ])) ? intval ( $_GET [ 'count' ]) : $totalResults );
2015-01-27 02:01:37 -05:00
if ( $global ) {
2015-07-25 06:05:27 -04:00
logger ( " Start global query " , LOGGER_DEBUG );
2016-01-06 08:13:59 -05:00
$r = q ( " SELECT * FROM `gcontact` WHERE `updated` > '%s' AND NOT `hide` AND `network` IN ('%s', '%s', '%s') AND `updated` > `last_failure`
2015-07-25 06:05:27 -04:00
ORDER BY `updated` DESC LIMIT % d , % d " ,
2015-01-27 02:01:37 -05:00
dbesc ( $update_limit ),
dbesc ( NETWORK_DFRN ),
2015-07-24 01:23:57 -04:00
dbesc ( NETWORK_DIASPORA ),
dbesc ( NETWORK_OSTATUS ),
2015-01-27 02:01:37 -05:00
intval ( $startIndex ),
intval ( $itemsPerPage )
);
} elseif ( $system_mode ) {
2015-07-25 06:05:27 -04:00
logger ( " Start system mode query " , LOGGER_DEBUG );
2016-10-03 23:48:01 -04:00
$r = q ( " SELECT `contact`.*, `profile`.`about` AS `pabout`, `profile`.`locality` AS `plocation`, `profile`.`pub_keywords`,
`profile` . `gender` AS `pgender` , `profile` . `address` AS `paddress` , `profile` . `region` AS `pregion` ,
`profile` . `postal-code` AS `ppostalcode` , `profile` . `country-name` AS `pcountry` , `user` . `account-type`
2015-01-25 07:19:37 -05:00
FROM `contact` INNER JOIN `profile` ON `profile` . `uid` = `contact` . `uid`
2016-10-03 23:48:01 -04:00
INNER JOIN `user` ON `user` . `uid` = `contact` . `uid`
2015-10-31 05:32:01 -04:00
WHERE `self` = 1 AND `profile` . `is-default`
2015-01-24 18:19:59 -05:00
AND `contact` . `uid` IN ( SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1 ) LIMIT % d , % d " ,
2011-11-28 18:11:59 -05:00
intval ( $startIndex ),
intval ( $itemsPerPage )
);
2015-01-27 02:01:37 -05:00
} else {
2015-07-25 06:05:27 -04:00
logger ( " Start query for user " . $user [ 'nickname' ], LOGGER_DEBUG );
2015-01-05 16:44:55 -05:00
$r = q ( " SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 AND `archive` = 0
2015-07-25 04:50:00 -04:00
AND ( `success_update` >= `failure_update` OR `last-item` >= `failure_update` )
AND `network` IN ( '%s' , '%s' , '%s' , '%s' ) $sql_extra LIMIT % d , % d " ,
2011-11-28 18:11:59 -05:00
intval ( $user [ 'uid' ]),
2015-01-05 16:44:55 -05:00
dbesc ( NETWORK_DFRN ),
dbesc ( NETWORK_DIASPORA ),
dbesc ( NETWORK_OSTATUS ),
2015-01-08 01:59:20 -05:00
dbesc ( NETWORK_STATUSNET ),
2011-11-28 18:11:59 -05:00
intval ( $startIndex ),
intval ( $itemsPerPage )
);
}
2015-07-25 06:05:27 -04:00
logger ( " Query done " , LOGGER_DEBUG );
2015-01-27 02:01:37 -05:00
2011-10-27 03:57:19 -04:00
$ret = array ();
if ( x ( $_GET , 'sorted' ))
2015-01-27 02:01:37 -05:00
$ret [ 'sorted' ] = false ;
2011-10-27 03:57:19 -04:00
if ( x ( $_GET , 'filtered' ))
2015-01-27 02:01:37 -05:00
$ret [ 'filtered' ] = false ;
if ( x ( $_GET , 'updatedSince' ) AND ! $global )
$ret [ 'updatedSince' ] = false ;
2011-10-27 03:57:19 -04:00
2015-02-15 04:52:45 -05:00
$ret [ 'startIndex' ] = ( int ) $startIndex ;
$ret [ 'itemsPerPage' ] = ( int ) $itemsPerPage ;
$ret [ 'totalResults' ] = ( int ) $totalResults ;
2011-10-27 03:57:19 -04:00
$ret [ 'entry' ] = array ();
$fields_ret = array (
'id' => false ,
'displayName' => false ,
'urls' => false ,
2015-01-04 13:19:47 -05:00
'updated' => false ,
2011-10-27 07:38:33 -04:00
'preferredUsername' => false ,
2015-01-08 01:59:20 -05:00
'photos' => false ,
2015-01-09 18:34:08 -05:00
'aboutMe' => false ,
'currentLocation' => false ,
2015-01-25 07:19:37 -05:00
'network' => false ,
'gender' => false ,
2015-02-04 04:43:30 -05:00
'tags' => false ,
2015-02-15 04:52:45 -05:00
'address' => false ,
2016-10-03 23:48:01 -04:00
'contactType' => false ,
2015-02-15 04:52:45 -05:00
'generation' => false
2011-10-26 23:09:03 -04:00
);
2011-10-27 03:57:19 -04:00
if (( ! x ( $_GET , 'fields' )) || ( $_GET [ 'fields' ] === '@all' ))
2011-10-27 04:54:52 -04:00
foreach ( $fields_ret as $k => $v )
$fields_ret [ $k ] = true ;
2011-10-27 03:57:19 -04:00
else {
$fields_req = explode ( ',' , $_GET [ 'fields' ]);
foreach ( $fields_req as $f )
$fields_ret [ trim ( $f )] = true ;
}
if ( is_array ( $r )) {
2016-12-14 03:41:33 -05:00
if ( dbm :: is_result ( $r )) {
2016-12-20 15:15:53 -05:00
foreach ( $r as $rr ) {
2015-02-15 04:52:45 -05:00
if ( ! isset ( $rr [ 'generation' ])) {
if ( $global )
$rr [ 'generation' ] = 3 ;
elseif ( $system_mode )
$rr [ 'generation' ] = 1 ;
else
$rr [ 'generation' ] = 2 ;
}
2015-01-24 18:19:59 -05:00
if (( $rr [ 'about' ] == " " ) AND isset ( $rr [ 'pabout' ]))
$rr [ 'about' ] = $rr [ 'pabout' ];
2015-02-04 04:43:30 -05:00
if ( $rr [ 'location' ] == " " ) {
if ( isset ( $rr [ 'plocation' ]))
$rr [ 'location' ] = $rr [ 'plocation' ];
if ( isset ( $rr [ 'pregion' ]) AND ( $rr [ 'pregion' ] != " " )) {
if ( $rr [ 'location' ] != " " )
$rr [ 'location' ] .= " , " ;
$rr [ 'location' ] .= $rr [ 'pregion' ];
}
if ( isset ( $rr [ 'pcountry' ]) AND ( $rr [ 'pcountry' ] != " " )) {
if ( $rr [ 'location' ] != " " )
$rr [ 'location' ] .= " , " ;
$rr [ 'location' ] .= $rr [ 'pcountry' ];
}
}
2015-01-24 18:19:59 -05:00
2015-01-25 07:19:37 -05:00
if (( $rr [ 'gender' ] == " " ) AND isset ( $rr [ 'pgender' ]))
$rr [ 'gender' ] = $rr [ 'pgender' ];
if (( $rr [ 'keywords' ] == " " ) AND isset ( $rr [ 'pub_keywords' ]))
$rr [ 'keywords' ] = $rr [ 'pub_keywords' ];
2016-10-03 23:48:01 -04:00
if ( isset ( $rr [ 'account-type' ]))
$rr [ 'contact-type' ] = $rr [ 'account-type' ];
2015-07-25 06:05:27 -04:00
$about = Cache :: get ( " about: " . $rr [ 'updated' ] . " : " . $rr [ 'nurl' ]);
if ( is_null ( $about )) {
$about = bbcode ( $rr [ 'about' ], false , false );
Cache :: set ( " about: " . $rr [ 'updated' ] . " : " . $rr [ 'nurl' ], $about );
}
2015-10-06 00:56:31 -04:00
// Non connected persons can only see the keywords of a Diaspora account
if ( $rr [ 'network' ] == NETWORK_DIASPORA ) {
$rr [ 'location' ] = " " ;
$about = " " ;
$rr [ 'gender' ] = " " ;
}
2011-10-27 03:57:19 -04:00
$entry = array ();
if ( $fields_ret [ 'id' ])
2015-02-15 04:52:45 -05:00
$entry [ 'id' ] = ( int ) $rr [ 'id' ];
2011-10-27 03:57:19 -04:00
if ( $fields_ret [ 'displayName' ])
$entry [ 'displayName' ] = $rr [ 'name' ];
2015-01-09 18:34:08 -05:00
if ( $fields_ret [ 'aboutMe' ])
2015-07-25 06:05:27 -04:00
$entry [ 'aboutMe' ] = $about ;
2015-01-09 18:34:08 -05:00
if ( $fields_ret [ 'currentLocation' ])
$entry [ 'currentLocation' ] = $rr [ 'location' ];
2015-01-25 07:19:37 -05:00
if ( $fields_ret [ 'gender' ])
$entry [ 'gender' ] = $rr [ 'gender' ];
2015-02-15 04:52:45 -05:00
if ( $fields_ret [ 'generation' ])
$entry [ 'generation' ] = ( int ) $rr [ 'generation' ];
2011-12-18 03:14:34 -05:00
if ( $fields_ret [ 'urls' ]) {
2011-10-31 23:39:04 -04:00
$entry [ 'urls' ] = array ( array ( 'value' => $rr [ 'url' ], 'type' => 'profile' ));
2011-12-18 03:21:01 -05:00
if ( $rr [ 'addr' ] && ( $rr [ 'network' ] !== NETWORK_MAIL ))
2015-01-04 13:19:47 -05:00
$entry [ 'urls' ][] = array ( 'value' => 'acct:' . $rr [ 'addr' ], 'type' => 'webfinger' );
2011-12-18 03:22:44 -05:00
}
2011-10-27 03:57:19 -04:00
if ( $fields_ret [ 'preferredUsername' ])
$entry [ 'preferredUsername' ] = $rr [ 'nick' ];
2015-01-04 13:19:47 -05:00
if ( $fields_ret [ 'updated' ]) {
2015-01-27 02:01:37 -05:00
if ( ! $global ) {
$entry [ 'updated' ] = $rr [ 'success_update' ];
2015-01-04 13:19:47 -05:00
2015-01-27 02:01:37 -05:00
if ( $rr [ 'name-date' ] > $entry [ 'updated' ])
$entry [ 'updated' ] = $rr [ 'name-date' ];
2015-01-04 13:19:47 -05:00
2015-01-27 02:01:37 -05:00
if ( $rr [ 'uri-date' ] > $entry [ 'updated' ])
$entry [ 'updated' ] = $rr [ 'uri-date' ];
2015-01-04 13:19:47 -05:00
2015-01-27 02:01:37 -05:00
if ( $rr [ 'avatar-date' ] > $entry [ 'updated' ])
$entry [ 'updated' ] = $rr [ 'avatar-date' ];
} else
$entry [ 'updated' ] = $rr [ 'updated' ];
2015-01-04 13:19:47 -05:00
$entry [ 'updated' ] = date ( " c " , strtotime ( $entry [ 'updated' ]));
}
2011-10-27 03:57:19 -04:00
if ( $fields_ret [ 'photos' ])
2011-10-31 23:39:04 -04:00
$entry [ 'photos' ] = array ( array ( 'value' => $rr [ 'photo' ], 'type' => 'profile' ));
2015-01-08 01:59:20 -05:00
if ( $fields_ret [ 'network' ]) {
$entry [ 'network' ] = $rr [ 'network' ];
if ( $entry [ 'network' ] == NETWORK_STATUSNET )
$entry [ 'network' ] = NETWORK_OSTATUS ;
2015-01-09 18:34:08 -05:00
if (( $entry [ 'network' ] == " " ) AND ( $rr [ 'self' ]))
$entry [ 'network' ] = NETWORK_DFRN ;
2015-01-08 01:59:20 -05:00
}
2015-01-25 07:19:37 -05:00
if ( $fields_ret [ 'tags' ]) {
$tags = str_replace ( " , " , " " , $rr [ 'keywords' ]);
$tags = explode ( " " , $tags );
$cleaned = array ();
foreach ( $tags as $tag ) {
$tag = trim ( strtolower ( $tag ));
if ( $tag != " " )
$cleaned [] = $tag ;
}
$entry [ 'tags' ] = array ( $cleaned );
}
2015-02-04 04:43:30 -05:00
if ( $fields_ret [ 'address' ]) {
$entry [ 'address' ] = array ();
// Deactivated. It just reveals too much data. (Although its from the default profile)
//if (isset($rr['paddress']))
// $entry['address']['streetAddress'] = $rr['paddress'];
if ( isset ( $rr [ 'plocation' ]))
$entry [ 'address' ][ 'locality' ] = $rr [ 'plocation' ];
if ( isset ( $rr [ 'pregion' ]))
$entry [ 'address' ][ 'region' ] = $rr [ 'pregion' ];
// See above
//if (isset($rr['ppostalcode']))
// $entry['address']['postalCode'] = $rr['ppostalcode'];
if ( isset ( $rr [ 'pcountry' ]))
$entry [ 'address' ][ 'country' ] = $rr [ 'pcountry' ];
}
2015-01-25 07:19:37 -05:00
2016-10-03 23:48:01 -04:00
if ( $fields_ret [ 'contactType' ])
$entry [ 'contactType' ] = intval ( $rr [ 'contact-type' ]);
2011-10-27 03:57:19 -04:00
$ret [ 'entry' ][] = $entry ;
}
2017-03-04 06:04:00 -05:00
} else
2011-10-27 03:57:19 -04:00
$ret [ 'entry' ][] = array ();
2017-03-04 06:04:00 -05:00
} else
2011-10-27 03:57:19 -04:00
http_status_exit ( 500 );
2011-10-26 23:09:03 -04:00
2015-07-25 06:05:27 -04:00
logger ( " End of poco " , LOGGER_DEBUG );
2011-10-27 03:57:19 -04:00
if ( $format === 'xml' ) {
header ( 'Content-type: text/xml' );
2012-12-25 13:48:02 -05:00
echo replace_macros ( get_markup_template ( 'poco_xml.tpl' ), array_xmlify ( array ( '$response' => $ret )));
2013-01-29 21:36:10 -05:00
killme ();
2011-10-27 03:57:19 -04:00
}
if ( $format === 'json' ) {
header ( 'Content-type: application/json' );
echo json_encode ( $ret );
2015-01-04 13:19:47 -05:00
killme ();
2017-03-04 06:04:00 -05:00
} else
2011-10-27 03:57:19 -04:00
http_status_exit ( 500 );
2011-10-26 23:09:03 -04:00
2016-02-07 09:11:34 -05:00
2012-12-22 14:57:29 -05:00
}