2011-10-27 05:09:03 +02:00
< ? php
function poco_init ( & $a ) {
2015-01-10 00:34:08 +01:00
require_once ( " include/bbcode.php " );
2011-10-27 05:09:03 +02:00
2011-11-29 00:11:59 +01:00
$system_mode = false ;
2015-06-01 01:50:27 +02:00
if ( intval ( get_config ( 'system' , 'block_public' )) || ( get_config ( 'system' , 'block_local_dir' )))
2011-11-29 00:11:59 +01:00
http_status_exit ( 401 );
2011-10-27 05:09:03 +02:00
if ( $a -> argc > 1 ) {
$user = notags ( trim ( $a -> argv [ 1 ]));
}
2011-11-29 00:11:59 +01:00
if ( ! x ( $user )) {
2015-01-05 22:44:55 +01:00
$c = q ( " SELECT * FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1 " );
2011-11-29 00:11:59 +01:00
if ( ! count ( $c ))
http_status_exit ( 401 );
$system_mode = true ;
}
2011-10-27 09:57:19 +02:00
$format = (( $_GET [ 'format' ]) ? $_GET [ 'format' ] : 'json' );
2011-10-27 05:09:03 +02:00
$justme = false ;
2015-01-27 08:01:37 +01:00
$global = false ;
2011-10-27 05:09:03 +02:00
2015-01-27 08:01:37 +01:00
if ( $a -> argc > 1 && $a -> argv [ 1 ] === '@global' ) {
$global = true ;
$update_limit = date ( " Y-m-d H:i:s " , time () - 30 * 86400 );
}
2011-10-27 05:09:03 +02:00
if ( $a -> argc > 2 && $a -> argv [ 2 ] === '@me' )
$justme = true ;
if ( $a -> argc > 3 && $a -> argv [ 3 ] === '@all' )
$justme = false ;
if ( $a -> argc > 3 && $a -> argv [ 3 ] === '@self' )
$justme = true ;
if ( $a -> argc > 4 && intval ( $a -> argv [ 4 ]) && $justme == false )
$cid = intval ( $a -> argv [ 4 ]);
2015-01-05 22:44:55 +01:00
2011-10-27 05:09:03 +02:00
2015-01-27 08:01:37 +01:00
if ( ! $system_mode AND ! $global ) {
2011-11-29 00:11:59 +01: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 )
);
if ( ! count ( $r ) || $r [ 0 ][ 'hidewall' ] || $r [ 0 ][ 'hide-friends' ])
http_status_exit ( 404 );
2011-10-27 05:09:03 +02:00
2011-11-29 00:11:59 +01:00
$user = $r [ 0 ];
}
2011-10-27 05:09:03 +02:00
if ( $justme )
2015-01-05 22:44:55 +01:00
$sql_extra = " AND `contact`.`self` = 1 " ;
2015-01-25 16:40:20 +01:00
// else
// $sql_extra = " AND `contact`.`self` = 0 ";
2011-10-27 05:09:03 +02:00
if ( $cid )
2015-01-05 22:44:55 +01:00
$sql_extra = sprintf ( " AND `contact`.`id` = %d " , intval ( $cid ));
2011-10-27 05:09:03 +02:00
2015-01-27 08:01:37 +01:00
if ( x ( $_GET , 'updatedSince' ))
$update_limit = date ( " Y-m-d H:i:s " , strtotime ( $_GET [ 'updatedSince' ]));
if ( $global ) {
2016-01-06 14:13:59 +01: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 08:01:37 +01:00
dbesc ( $update_limit ),
2015-07-24 07:23:57 +02:00
dbesc ( NETWORK_DFRN ),
dbesc ( NETWORK_DIASPORA ),
dbesc ( NETWORK_OSTATUS )
2015-01-27 08:01:37 +01:00
);
} elseif ( $system_mode ) {
2015-10-31 10:32:01 +01: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 08:01:37 +01:00
} else {
2015-01-05 22:44:55 +01: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 10:50:00 +02:00
AND ( `success_update` >= `failure_update` OR `last-item` >= `failure_update` )
AND `network` IN ( '%s' , '%s' , '%s' , '%s' ) $sql_extra " ,
2015-01-05 22:44:55 +01:00
intval ( $user [ 'uid' ]),
dbesc ( NETWORK_DFRN ),
dbesc ( NETWORK_DIASPORA ),
2015-01-08 07:59:20 +01:00
dbesc ( NETWORK_OSTATUS ),
dbesc ( NETWORK_STATUSNET )
2011-11-29 00:11:59 +01:00
);
}
2011-10-27 05:09:03 +02:00
if ( count ( $r ))
$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 08:01:37 +01:00
if ( $global ) {
2015-07-25 12:05:27 +02:00
logger ( " Start global query " , LOGGER_DEBUG );
2016-01-06 14:13:59 +01: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 12:05:27 +02:00
ORDER BY `updated` DESC LIMIT % d , % d " ,
2015-01-27 08:01:37 +01:00
dbesc ( $update_limit ),
dbesc ( NETWORK_DFRN ),
2015-07-24 07:23:57 +02:00
dbesc ( NETWORK_DIASPORA ),
dbesc ( NETWORK_OSTATUS ),
2015-01-27 08:01:37 +01:00
intval ( $startIndex ),
intval ( $itemsPerPage )
);
} elseif ( $system_mode ) {
2015-07-25 12:05:27 +02:00
logger ( " Start system mode query " , LOGGER_DEBUG );
2015-02-04 10:43:30 +01: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`
2015-01-25 13:19:37 +01:00
FROM `contact` INNER JOIN `profile` ON `profile` . `uid` = `contact` . `uid`
2015-10-31 10:32:01 +01:00
WHERE `self` = 1 AND `profile` . `is-default`
2015-01-25 00:19:59 +01:00
AND `contact` . `uid` IN ( SELECT `uid` FROM `pconfig` WHERE `cat` = 'system' AND `k` = 'suggestme' AND `v` = 1 ) LIMIT % d , % d " ,
2011-11-29 00:11:59 +01:00
intval ( $startIndex ),
intval ( $itemsPerPage )
);
2015-01-27 08:01:37 +01:00
} else {
2015-07-25 12:05:27 +02:00
logger ( " Start query for user " . $user [ 'nickname' ], LOGGER_DEBUG );
2015-01-05 22:44:55 +01:00
$r = q ( " SELECT * FROM `contact` WHERE `uid` = %d AND `blocked` = 0 AND `pending` = 0 AND `hidden` = 0 AND `archive` = 0
2015-07-25 10:50:00 +02: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-29 00:11:59 +01:00
intval ( $user [ 'uid' ]),
2015-01-05 22:44:55 +01:00
dbesc ( NETWORK_DFRN ),
dbesc ( NETWORK_DIASPORA ),
dbesc ( NETWORK_OSTATUS ),
2015-01-08 07:59:20 +01:00
dbesc ( NETWORK_STATUSNET ),
2011-11-29 00:11:59 +01:00
intval ( $startIndex ),
intval ( $itemsPerPage )
);
}
2015-07-25 12:05:27 +02:00
logger ( " Query done " , LOGGER_DEBUG );
2015-01-27 08:01:37 +01:00
2011-10-27 09:57:19 +02:00
$ret = array ();
if ( x ( $_GET , 'sorted' ))
2015-01-27 08:01:37 +01:00
$ret [ 'sorted' ] = false ;
2011-10-27 09:57:19 +02:00
if ( x ( $_GET , 'filtered' ))
2015-01-27 08:01:37 +01:00
$ret [ 'filtered' ] = false ;
if ( x ( $_GET , 'updatedSince' ) AND ! $global )
$ret [ 'updatedSince' ] = false ;
2011-10-27 09:57:19 +02:00
2015-02-15 10:52:45 +01:00
$ret [ 'startIndex' ] = ( int ) $startIndex ;
$ret [ 'itemsPerPage' ] = ( int ) $itemsPerPage ;
$ret [ 'totalResults' ] = ( int ) $totalResults ;
2011-10-27 09:57:19 +02:00
$ret [ 'entry' ] = array ();
$fields_ret = array (
'id' => false ,
'displayName' => false ,
'urls' => false ,
2015-01-04 19:19:47 +01:00
'updated' => false ,
2011-10-27 13:38:33 +02:00
'preferredUsername' => false ,
2015-01-08 07:59:20 +01:00
'photos' => false ,
2015-01-10 00:34:08 +01:00
'aboutMe' => false ,
'currentLocation' => false ,
2015-01-25 13:19:37 +01:00
'network' => false ,
'gender' => false ,
2015-02-04 10:43:30 +01:00
'tags' => false ,
2015-02-15 10:52:45 +01:00
'address' => false ,
'generation' => false
2011-10-27 05:09:03 +02:00
);
2011-10-27 09:57:19 +02:00
if (( ! x ( $_GET , 'fields' )) || ( $_GET [ 'fields' ] === '@all' ))
2011-10-27 10:54:52 +02:00
foreach ( $fields_ret as $k => $v )
$fields_ret [ $k ] = true ;
2011-10-27 09:57:19 +02:00
else {
$fields_req = explode ( ',' , $_GET [ 'fields' ]);
foreach ( $fields_req as $f )
$fields_ret [ trim ( $f )] = true ;
}
if ( is_array ( $r )) {
if ( count ( $r )) {
foreach ( $r as $rr ) {
2015-02-15 10:52:45 +01:00
if ( ! isset ( $rr [ 'generation' ])) {
if ( $global )
$rr [ 'generation' ] = 3 ;
elseif ( $system_mode )
$rr [ 'generation' ] = 1 ;
else
$rr [ 'generation' ] = 2 ;
}
2016-01-28 01:26:19 +01:00
if ( $rr [ " avatar " ] == " " )
$rr [ " avatar " ] = $rr [ " photo " ];
2015-01-25 00:19:59 +01:00
if (( $rr [ 'about' ] == " " ) AND isset ( $rr [ 'pabout' ]))
$rr [ 'about' ] = $rr [ 'pabout' ];
2015-02-04 10:43:30 +01: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-25 00:19:59 +01:00
2015-01-25 13:19:37 +01: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' ];
2015-07-25 12:05:27 +02: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 06:56:31 +02: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 09:57:19 +02:00
$entry = array ();
if ( $fields_ret [ 'id' ])
2015-02-15 10:52:45 +01:00
$entry [ 'id' ] = ( int ) $rr [ 'id' ];
2011-10-27 09:57:19 +02:00
if ( $fields_ret [ 'displayName' ])
$entry [ 'displayName' ] = $rr [ 'name' ];
2015-01-10 00:34:08 +01:00
if ( $fields_ret [ 'aboutMe' ])
2015-07-25 12:05:27 +02:00
$entry [ 'aboutMe' ] = $about ;
2015-01-10 00:34:08 +01:00
if ( $fields_ret [ 'currentLocation' ])
$entry [ 'currentLocation' ] = $rr [ 'location' ];
2015-01-25 13:19:37 +01:00
if ( $fields_ret [ 'gender' ])
$entry [ 'gender' ] = $rr [ 'gender' ];
2015-02-15 10:52:45 +01:00
if ( $fields_ret [ 'generation' ])
$entry [ 'generation' ] = ( int ) $rr [ 'generation' ];
2011-12-18 09:14:34 +01:00
if ( $fields_ret [ 'urls' ]) {
2011-11-01 04:39:04 +01:00
$entry [ 'urls' ] = array ( array ( 'value' => $rr [ 'url' ], 'type' => 'profile' ));
2011-12-18 09:21:01 +01:00
if ( $rr [ 'addr' ] && ( $rr [ 'network' ] !== NETWORK_MAIL ))
2015-01-04 19:19:47 +01:00
$entry [ 'urls' ][] = array ( 'value' => 'acct:' . $rr [ 'addr' ], 'type' => 'webfinger' );
2011-12-18 09:22:44 +01:00
}
2011-10-27 09:57:19 +02:00
if ( $fields_ret [ 'preferredUsername' ])
$entry [ 'preferredUsername' ] = $rr [ 'nick' ];
2015-01-04 19:19:47 +01:00
if ( $fields_ret [ 'updated' ]) {
2015-01-27 08:01:37 +01:00
if ( ! $global ) {
$entry [ 'updated' ] = $rr [ 'success_update' ];
2015-01-04 19:19:47 +01:00
2015-01-27 08:01:37 +01:00
if ( $rr [ 'name-date' ] > $entry [ 'updated' ])
$entry [ 'updated' ] = $rr [ 'name-date' ];
2015-01-04 19:19:47 +01:00
2015-01-27 08:01:37 +01:00
if ( $rr [ 'uri-date' ] > $entry [ 'updated' ])
$entry [ 'updated' ] = $rr [ 'uri-date' ];
2015-01-04 19:19:47 +01:00
2015-01-27 08:01:37 +01:00
if ( $rr [ 'avatar-date' ] > $entry [ 'updated' ])
$entry [ 'updated' ] = $rr [ 'avatar-date' ];
} else
$entry [ 'updated' ] = $rr [ 'updated' ];
2015-01-04 19:19:47 +01:00
$entry [ 'updated' ] = date ( " c " , strtotime ( $entry [ 'updated' ]));
}
2011-10-27 09:57:19 +02:00
if ( $fields_ret [ 'photos' ])
2016-01-28 01:26:19 +01:00
$entry [ 'photos' ] = array ( array ( 'value' => $rr [ 'avatar' ], 'type' => 'profile' ));
2015-01-08 07:59:20 +01:00
if ( $fields_ret [ 'network' ]) {
$entry [ 'network' ] = $rr [ 'network' ];
if ( $entry [ 'network' ] == NETWORK_STATUSNET )
$entry [ 'network' ] = NETWORK_OSTATUS ;
2015-01-10 00:34:08 +01:00
if (( $entry [ 'network' ] == " " ) AND ( $rr [ 'self' ]))
$entry [ 'network' ] = NETWORK_DFRN ;
2015-01-08 07:59:20 +01:00
}
2015-01-25 13:19:37 +01: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 10:43:30 +01: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 13:19:37 +01:00
2011-10-27 09:57:19 +02:00
$ret [ 'entry' ][] = $entry ;
}
2011-10-27 05:09:03 +02:00
}
2011-10-27 09:57:19 +02:00
else
$ret [ 'entry' ][] = array ();
2011-10-27 05:09:03 +02:00
}
2011-10-27 09:57:19 +02:00
else
http_status_exit ( 500 );
2011-10-27 05:09:03 +02:00
2015-07-25 12:05:27 +02:00
logger ( " End of poco " , LOGGER_DEBUG );
2011-10-27 09:57:19 +02:00
if ( $format === 'xml' ) {
header ( 'Content-type: text/xml' );
2012-12-25 19:48:02 +01:00
echo replace_macros ( get_markup_template ( 'poco_xml.tpl' ), array_xmlify ( array ( '$response' => $ret )));
2013-01-30 03:36:10 +01:00
killme ();
2011-10-27 09:57:19 +02:00
}
if ( $format === 'json' ) {
header ( 'Content-type: application/json' );
echo json_encode ( $ret );
2015-01-04 19:19:47 +01:00
killme ();
2011-10-27 09:57:19 +02:00
}
else
http_status_exit ( 500 );
2011-10-27 05:09:03 +02:00
2012-12-22 20:57:29 +01:00
}