use Friendica\Content\Feature;
use Friendica\Content\Text\BBCode;
use Friendica\Content\Text\HTML;
-use Friendica\Core\Addon;
use Friendica\Core\Authentication;
use Friendica\Core\Config;
+use Friendica\Core\Hook;
use Friendica\Core\L10n;
use Friendica\Core\Logger;
use Friendica\Core\NotificationsManager;
use Friendica\Util\Strings;
use Friendica\Util\XML;
-require_once 'include/conversation.php';
require_once 'mod/share.php';
require_once 'mod/item.php';
require_once 'mod/wall_upload.php';
define('API_METHOD_POST', 'POST,PUT');
define('API_METHOD_DELETE', 'POST,DELETE');
+define('API_LOG_PREFIX', 'API {action} - ');
+
$API = [];
$called_api = [];
*/
function api_user()
{
- if (x($_SESSION, 'allow_api')) {
+ if (!empty($_SESSION['allow_api'])) {
return local_user();
}
return "Twidere";
}
- Logger::log("Unrecognized user-agent ".$_SERVER['HTTP_USER_AGENT'], Logger::DEBUG);
+ Logger::info(API_LOG_PREFIX . 'Unrecognized user-agent', ['module' => 'api', 'action' => 'source', 'http_user_agent' => $_SERVER['HTTP_USER_AGENT']]);
} else {
- Logger::log("Empty user-agent", Logger::DEBUG);
+ Logger::info(API_LOG_PREFIX . 'Empty user-agent', ['module' => 'api', 'action' => 'source']);
}
return "api";
list($consumer, $token) = $oauth1->verify_request($request);
if (!is_null($token)) {
$oauth1->loginUser($token->uid);
- Addon::callHooks('logged_in', $a->user);
+ Hook::callAll('logged_in', $a->user);
return;
}
echo __FILE__.__LINE__.__FUNCTION__ . "<pre>";
var_dump($consumer, $token);
die();
} catch (Exception $e) {
- Logger::log($e);
+ Logger::warning(API_LOG_PREFIX . 'error', ['module' => 'api', 'action' => 'login', 'exception' => $e->getMessage()]);
}
// workaround for HTTP-auth in CGI mode
- if (x($_SERVER, 'REDIRECT_REMOTE_USER')) {
- $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6)) ;
+ if (!empty($_SERVER['REDIRECT_REMOTE_USER'])) {
+ $userpass = base64_decode(substr($_SERVER["REDIRECT_REMOTE_USER"], 6));
if (strlen($userpass)) {
list($name, $password) = explode(':', $userpass);
$_SERVER['PHP_AUTH_USER'] = $name;
}
}
- if (!x($_SERVER, 'PHP_AUTH_USER')) {
- Logger::log('API_login: ' . print_r($_SERVER, true), Logger::DEBUG);
+ if (empty($_SERVER['PHP_AUTH_USER'])) {
+ Logger::debug(API_LOG_PREFIX . 'failed', ['module' => 'api', 'action' => 'login', 'parameters' => $_SERVER]);
header('WWW-Authenticate: Basic realm="Friendica"');
throw new UnauthorizedException("This API requires login");
}
* Addons should never set 'authenticated' except to indicate success - as hooks may be chained
* and later addons should not interfere with an earlier one that succeeded.
*/
- Addon::callHooks('authenticate', $addon_auth);
+ Hook::callAll('authenticate', $addon_auth);
if ($addon_auth['authenticated'] && count($addon_auth['user_record'])) {
$record = $addon_auth['user_record'];
}
if (!DBA::isResult($record)) {
- Logger::log('API_login failure: ' . print_r($_SERVER, true), Logger::DEBUG);
+ Logger::debug(API_LOG_PREFIX . 'failed', ['module' => 'api', 'action' => 'login', 'parameters' => $_SERVER]);
header('WWW-Authenticate: Basic realm="Friendica"');
//header('HTTP/1.0 401 Unauthorized');
//die('This api requires login');
$_SESSION["allow_api"] = true;
- Addon::callHooks('logged_in', $a->user);
+ Hook::callAll('logged_in', $a->user);
}
/**
api_login($a);
}
- Logger::log('API call for ' . $a->user['username'] . ': ' . $a->query_string);
- Logger::log('API parameters: ' . print_r($_REQUEST, true));
+ Logger::info(API_LOG_PREFIX . 'username {username}', ['module' => 'api', 'action' => 'call', 'username' => $a->user['username']]);
+ Logger::debug(API_LOG_PREFIX . 'parameters', ['module' => 'api', 'action' => 'call', 'parameters' => $_REQUEST]);
$stamp = microtime(true);
$return = call_user_func($info['func'], $type);
$duration = (float) (microtime(true) - $stamp);
- Logger::log("API call duration: " . round($duration, 2) . "\t" . $a->query_string, Logger::DEBUG);
+
+ Logger::info(API_LOG_PREFIX . 'username {username}', ['module' => 'api', 'action' => 'call', 'username' => $a->user['username'], 'duration' => round($duration, 2)]);
if (Config::get("system", "profiler")) {
$duration = microtime(true)-$a->performance["start"];
/// @TODO round() really everywhere?
- Logger::log(
- parse_url($a->query_string, PHP_URL_PATH) . ": " . sprintf(
- "Database: %s/%s, Cache %s/%s, Network: %s, I/O: %s, Other: %s, Total: %s",
- round($a->performance["database"] - $a->performance["database_write"], 3),
- round($a->performance["database_write"], 3),
- round($a->performance["cache"], 3),
- round($a->performance["cache_write"], 3),
- round($a->performance["network"], 2),
- round($a->performance["file"], 2),
- round($duration - ($a->performance["database"]
- + $a->performance["cache"] + $a->performance["cache_write"]
- + $a->performance["network"] + $a->performance["file"]), 2),
- round($duration, 2)
- ),
- Logger::DEBUG
+ Logger::debug(
+ API_LOG_PREFIX . 'performance',
+ [
+ 'module' => 'api',
+ 'action' => 'call',
+ 'database_read' => round($a->performance["database"] - $a->performance["database_write"], 3),
+ 'database_write' => round($a->performance["database_write"], 3),
+ 'cache_read' => round($a->performance["cache"], 3),
+ 'cache_write' => round($a->performance["cache_write"], 3),
+ 'network_io' => round($a->performance["network"], 2),
+ 'file_io' => round($a->performance["file"], 2),
+ 'other_io' => round($duration - ($a->performance["database"]
+ + $a->performance["cache"] + $a->performance["cache_write"]
+ + $a->performance["network"] + $a->performance["file"]), 2),
+ 'total' => round($duration, 2)
+ ]
);
if (Config::get("rendertime", "callstack")) {
$o .= $func . ": " . $time . "\n";
}
}
- Logger::log($o, Logger::DEBUG);
+ Logger::debug(API_LOG_PREFIX . $o, ['module' => 'api', 'action' => 'call']);
}
}
case "json":
header("Content-Type: application/json");
$json = json_encode(end($return));
- if (x($_GET, 'callback')) {
+ if (!empty($_GET['callback'])) {
$json = $_GET['callback'] . "(" . $json . ")";
}
$return = $json;
}
}
- Logger::log('API call not implemented: ' . $a->query_string);
+ Logger::warning(API_LOG_PREFIX . 'not implemented', ['module' => 'api', 'action' => 'call']);
throw new NotImplementedException();
} catch (HTTPException $e) {
header("HTTP/1.1 {$e->httpcode} {$e->httpdesc}");
*/
function api_error($type, $e)
{
- $a = get_app();
+ $a = \get_app();
$error = ($e->getMessage() !== "" ? $e->getMessage() : $e->httpdesc);
/// @TODO: https://dev.twitter.com/overview/api/response-codes
$extra_query = "";
$url = "";
- Logger::log("api_get_user: Fetching user data for user ".$contact_id, Logger::DEBUG);
+ Logger::info(API_LOG_PREFIX . 'Fetching data for user {user}', ['module' => 'api', 'action' => 'get_user', 'user' => $contact_id]);
// Searching for contact URL
if (!is_null($contact_id) && (intval($contact_id) == 0)) {
}
}
- if (is_null($user) && x($_GET, 'user_id')) {
+ if (is_null($user) && !empty($_GET['user_id'])) {
$user = DBA::escape(api_unique_id_to_nurl($_GET['user_id']));
if ($user == "") {
$extra_query .= "AND `contact`.`uid`=" . intval(api_user());
}
}
- if (is_null($user) && x($_GET, 'screen_name')) {
+ if (is_null($user) && !empty($_GET['screen_name'])) {
$user = DBA::escape($_GET['screen_name']);
$extra_query = "AND `contact`.`nick` = '%s' ";
if (api_user() !== false) {
}
}
- if (is_null($user) && x($_GET, 'profileurl')) {
+ if (is_null($user) && !empty($_GET['profileurl'])) {
$user = DBA::escape(Strings::normaliseLink($_GET['profileurl']));
$extra_query = "AND `contact`.`nurl` = '%s' ";
if (api_user() !== false) {
}
}
- Logger::log("api_get_user: user ".$user, Logger::DEBUG);
+ Logger::info(API_LOG_PREFIX . 'getting user {user}', ['module' => 'api', 'action' => 'get_user', 'user' => $user]);
if (!$user) {
if (api_user() === false) {
}
}
- Logger::log('api_user: ' . $extra_query . ', user: ' . $user);
+ Logger::info(API_LOG_PREFIX . 'found user {user}', ['module' => 'api', 'action' => 'get_user', 'user' => $user, 'extra_query' => $extra_query]);
// user info
$uinfo = q(
$contact = DBA::selectFirst('contact', [], ['uid' => 0, 'nurl' => Strings::normaliseLink($url)]);
if (DBA::isResult($contact)) {
- $network_name = ContactSelector::networkToName($contact['network'], $contact['url']);
-
// If no nick where given, extract it from the address
if (($contact['nick'] == "") || ($contact['name'] == $contact['nick'])) {
$contact['nick'] = api_get_nick($contact["url"]);
'id_str' => (string) $contact["id"],
'name' => $contact["name"],
'screen_name' => (($contact['nick']) ? $contact['nick'] : $contact['name']),
- 'location' => ($contact["location"] != "") ? $contact["location"] : $network_name,
+ 'location' => ($contact["location"] != "") ? $contact["location"] : ContactSelector::networkToName($contact['network'], $contact['url']),
'description' => $contact["about"],
'profile_image_url' => $contact["micro"],
'profile_image_url_https' => $contact["micro"],
$uinfo[0]['nick'] = api_get_nick($uinfo[0]["url"]);
}
- $network_name = ContactSelector::networkToName($uinfo[0]['network'], $uinfo[0]['url']);
-
$pcontact_id = Contact::getIdForURL($uinfo[0]['url'], 0, true);
if (!empty($profile['about'])) {
} elseif (!empty($uinfo[0]["location"])) {
$location = $uinfo[0]["location"];
} else {
- $location = $network_name;
+ $location = ContactSelector::networkToName($uinfo[0]['network'], $uinfo[0]['url']);
}
$ret = [
$ret = $data;
break;
}
-
return $ret;
}
function api_account_verify_credentials($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
unset($_REQUEST["screen_name"]);
unset($_GET["screen_name"]);
- $skip_status = (x($_REQUEST, 'skip_status')?$_REQUEST['skip_status'] : false);
+ $skip_status = defaults($_REQUEST, 'skip_status', false);
$user_info = api_get_user($a);
*/
function requestdata($k)
{
- if (x($_POST, $k)) {
+ if (!empty($_POST[$k])) {
return $_POST[$k];
}
- if (x($_GET, $k)) {
+ if (!empty($_GET[$k])) {
return $_GET[$k];
}
return null;
*/
function api_statuses_mediap($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
Logger::log('api_statuses_update: no user');
*/
function api_statuses_update($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
Logger::log('api_statuses_update: no user');
}
}
- if (x($_FILES, 'media')) {
+ if (!empty($_FILES['media'])) {
// upload the image if we have one
$picture = wall_upload_post($a, false);
if (is_array($picture)) {
$_REQUEST['api_source'] = true;
- if (!x($_REQUEST, "source")) {
+ if (empty($_REQUEST['source'])) {
$_REQUEST["source"] = api_source();
}
*/
function api_media_upload()
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
Logger::log('no user');
api_get_user($a);
- if (!x($_FILES, 'media')) {
+ if (empty($_FILES['media'])) {
// Output error
throw new BadRequestException("No media.");
}
$returndata["media_id_string"] = (string)$media["id"];
$returndata["size"] = $media["size"];
$returndata["image"] = ["w" => $media["width"],
- "h" => $media["height"],
- "image_type" => $media["type"]];
+ "h" => $media["height"],
+ "image_type" => $media["type"],
+ "friendica_preview_url" => $media["preview"]];
Logger::log("Media uploaded: " . print_r($returndata, true), Logger::DEBUG);
*/
function api_status_show($type, $item_id = 0)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
*/
function api_users_show($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
*/
function api_users_search($type)
{
- $a = get_app();
+ $a = \get_app();
$userlist = [];
- if (x($_GET, 'q')) {
+ if (!empty($_GET['q'])) {
$r = q("SELECT id FROM `contact` WHERE `uid` = 0 AND `name` = '%s'", DBA::escape($_GET["q"]));
if (!DBA::isResult($r)) {
*/
function api_search($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
- if (api_user() === false || $user_info === false) {
- throw new ForbiddenException();
- }
-
- $data = [];
+ if (api_user() === false || $user_info === false) { throw new ForbiddenException(); }
- if (!x($_REQUEST, 'q')) {
- throw new BadRequestException("q parameter is required.");
- }
+ if (empty($_REQUEST['q'])) { throw new BadRequestException('q parameter is required.'); }
+
+ $searchTerm = trim(rawurldecode($_REQUEST['q']));
- if (x($_REQUEST, 'rpp')) {
+ $data = [];
+ $data['status'] = [];
+ $count = 15;
+ $exclude_replies = !empty($_REQUEST['exclude_replies']);
+ if (!empty($_REQUEST['rpp'])) {
$count = $_REQUEST['rpp'];
- } elseif (x($_REQUEST, 'count')) {
+ } elseif (!empty($_REQUEST['count'])) {
$count = $_REQUEST['count'];
- } else {
- $count = 15;
}
-
- $since_id = (x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0);
- $max_id = (x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0);
- $page = (x($_REQUEST, 'page') ? $_REQUEST['page'] - 1 : 0);
-
+
+ $since_id = defaults($_REQUEST, 'since_id', 0);
+ $max_id = defaults($_REQUEST, 'max_id', 0);
+ $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] - 1 : 0);
$start = $page * $count;
+ $params = ['order' => ['id' => true], 'limit' => [$start, $count]];
+ if (preg_match('/^#(\w+)$/', $searchTerm, $matches) === 1 && isset($matches[1])) {
+ $searchTerm = $matches[1];
+ $condition = ["`oid` > ?
+ AND (`uid` = 0 OR (`uid` = ? AND NOT `global`))
+ AND `otype` = ? AND `type` = ? AND `term` = ?",
+ $since_id, local_user(), TERM_OBJ_POST, TERM_HASHTAG, $searchTerm];
+ if ($max_id > 0) {
+ $condition[0] .= ' AND `oid` <= ?';
+ $condition[] = $max_id;
+ }
+ $terms = DBA::select('term', ['oid'], $condition, []);
+ $itemIds = [];
+ while ($term = DBA::fetch($terms)) {
+ $itemIds[] = $term['oid'];
+ }
+ DBA::close($terms);
- $condition = ["`gravity` IN (?, ?) AND `item`.`id` > ?
- AND (`item`.`uid` = 0 OR (`item`.`uid` = ? AND NOT `item`.`global`))
- AND `item`.`body` LIKE CONCAT('%',?,'%')",
- GRAVITY_PARENT, GRAVITY_COMMENT, $since_id, api_user(), $_REQUEST['q']];
+ if (empty($itemIds)) {
+ return api_format_data('statuses', $type, $data);
+ }
- if ($max_id > 0) {
- $condition[0] .= " AND `item`.`id` <= ?";
- $condition[] = $max_id;
+ $preCondition = ['`id` IN (' . implode(', ', $itemIds) . ')'];
+ if ($exclude_replies) {
+ $preCondition[] = '`id` = `parent`';
+ }
+
+ $condition = [implode(' AND ', $preCondition)];
+ } else {
+ $condition = ["`id` > ?
+ " . ($exclude_replies ? " AND `id` = `parent` " : ' ') . "
+ AND (`uid` = 0 OR (`uid` = ? AND NOT `global`))
+ AND `body` LIKE CONCAT('%',?,'%')",
+ $since_id, api_user(), $_REQUEST['q']];
+ if ($max_id > 0) {
+ $condition[0] .= ' AND `id` <= ?';
+ $condition[] = $max_id;
+ }
}
- $params = ['order' => ['id' => true], 'limit' => [$start, $count]];
$statuses = Item::selectForUser(api_user(), [], $condition, $params);
$data['status'] = api_format_items(Item::inArray($statuses), $user_info);
- return api_format_data("statuses", $type, $data);
+ bindComments($data['status']);
+
+ return api_format_data('statuses', $type, $data);
}
/// @TODO move to top of file or somewhere better
*/
function api_statuses_home_timeline($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
// get last network messages
// params
- $count = (x($_REQUEST, 'count') ? $_REQUEST['count'] : 20);
- $page = (x($_REQUEST, 'page') ? $_REQUEST['page'] - 1 : 0);
+ $count = defaults($_REQUEST, 'count', 20);
+ $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] - 1 : 0);
if ($page < 0) {
$page = 0;
}
- $since_id = (x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0);
- $max_id = (x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0);
- //$since_id = 0;//$since_id = (x($_REQUEST, 'since_id')?$_REQUEST['since_id'] : 0);
- $exclude_replies = (x($_REQUEST, 'exclude_replies') ? 1 : 0);
- $conversation_id = (x($_REQUEST, 'conversation_id') ? $_REQUEST['conversation_id'] : 0);
+ $since_id = defaults($_REQUEST, 'since_id', 0);
+ $max_id = defaults($_REQUEST, 'max_id', 0);
+ $exclude_replies = !empty($_REQUEST['exclude_replies']);
+ $conversation_id = defaults($_REQUEST, 'conversation_id', 0);
$start = $page * $count;
$condition[0] .= " AND `item`.`id` <= ?";
$condition[] = $max_id;
}
- if ($exclude_replies > 0) {
+ if ($exclude_replies) {
$condition[0] .= ' AND `item`.`parent` = `item`.`id`';
}
if ($conversation_id > 0) {
Item::update(['unseen' => false], ['unseen' => true, 'id' => $idarray]);
}
}
+
+ bindComments($ret);
$data = ['status' => $ret];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
break;
return api_format_data("statuses", $type, $data);
}
+
/// @TODO move to top of file or somewhere better
api_register_func('api/statuses/home_timeline', 'api_statuses_home_timeline', true);
api_register_func('api/statuses/friends_timeline', 'api_statuses_home_timeline', true);
*/
function api_statuses_public_timeline($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
// get last network messages
// params
- $count = (x($_REQUEST, 'count') ? $_REQUEST['count'] : 20);
- $page = (x($_REQUEST, 'page') ? $_REQUEST['page'] -1 : 0);
+ $count = defaults($_REQUEST, 'count', 20);
+ $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] -1 : 0);
if ($page < 0) {
$page = 0;
}
- $since_id = (x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0);
- $max_id = (x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0);
- //$since_id = 0;//$since_id = (x($_REQUEST, 'since_id')?$_REQUEST['since_id'] : 0);
- $exclude_replies = (x($_REQUEST, 'exclude_replies') ? 1 : 0);
- $conversation_id = (x($_REQUEST, 'conversation_id') ? $_REQUEST['conversation_id'] : 0);
+ $since_id = defaults($_REQUEST, 'since_id', 0);
+ $max_id = defaults($_REQUEST, 'max_id', 0);
+ $exclude_replies = (!empty($_REQUEST['exclude_replies']) ? 1 : 0);
+ $conversation_id = defaults($_REQUEST, 'conversation_id', 0);
$start = $page * $count;
- $sql_extra = '';
if ($exclude_replies && !$conversation_id) {
$condition = ["`gravity` IN (?, ?) AND `iid` > ? AND NOT `private` AND `wall` AND NOT `user`.`hidewall`",
$ret = api_format_items($r, $user_info, false, $type);
+ bindComments($ret);
+
$data = ['status' => $ret];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
break;
*/
function api_statuses_networkpublic_timeline($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
throw new ForbiddenException();
}
- $since_id = x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0;
- $max_id = x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0;
+ $since_id = defaults($_REQUEST, 'since_id', 0);
+ $max_id = defaults($_REQUEST, 'max_id', 0);
// pagination
- $count = x($_REQUEST, 'count') ? $_REQUEST['count'] : 20;
- $page = x($_REQUEST, 'page') ? $_REQUEST['page'] : 1;
+ $count = defaults($_REQUEST, 'count', 20);
+ $page = defaults($_REQUEST, 'page', 1);
if ($page < 1) {
$page = 1;
}
$ret = api_format_items(Item::inArray($statuses), $user_info, false, $type);
+ bindComments($ret);
+
$data = ['status' => $ret];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
break;
*/
function api_statuses_show($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
*/
function api_conversation_show($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
$id = intval(defaults($a->argv, 4, 0));
}
- Logger::log('API: api_conversation_show: '.$id);
+ Logger::info(API_LOG_PREFIX . '{subaction}', ['module' => 'api', 'action' => 'conversation', 'subaction' => 'show', 'id' => $id]);
// try to fetch the item for the local user - or the public item, if there is no local one
$item = Item::selectFirst(['parent-uri'], ['id' => $id]);
{
global $called_api;
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
$_REQUEST['profile_uid'] = api_user();
$_REQUEST['api_source'] = true;
- if (!x($_REQUEST, "source")) {
+ if (empty($_REQUEST['source'])) {
$_REQUEST["source"] = api_source();
}
*/
function api_statuses_destroy($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
*/
function api_statuses_mentions($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
$data = ['status' => $ret];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
break;
*/
function api_statuses_user_timeline($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
Logger::DEBUG
);
- $since_id = x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0;
- $max_id = x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0;
- $exclude_replies = x($_REQUEST, 'exclude_replies') ? 1 : 0;
- $conversation_id = x($_REQUEST, 'conversation_id') ? $_REQUEST['conversation_id'] : 0;
+ $since_id = defaults($_REQUEST, 'since_id', 0);
+ $max_id = defaults($_REQUEST, 'max_id', 0);
+ $exclude_replies = !empty($_REQUEST['exclude_replies']);
+ $conversation_id = defaults($_REQUEST, 'conversation_id', 0);
// pagination
- $count = x($_REQUEST, 'count') ? $_REQUEST['count'] : 20;
- $page = x($_REQUEST, 'page') ? $_REQUEST['page'] : 1;
+ $count = defaults($_REQUEST, 'count', 20);
+ $page = defaults($_REQUEST, 'page', 1);
if ($page < 1) {
$page = 1;
}
$condition[0] .= ' AND `item`.`wall` ';
}
- if ($exclude_replies > 0) {
+ if ($exclude_replies) {
$condition[0] .= ' AND `item`.`parent` = `item`.`id`';
}
$ret = api_format_items(Item::inArray($statuses), $user_info, true, $type);
+ bindComments($ret);
+
$data = ['status' => $ret];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
break;
*/
function api_favorites_create_destroy($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
$data = ['status' => $ret];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
+ break;
}
return api_format_data("status", $type, $data);
{
global $called_api;
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
// in friendica starred item are private
// return favorites only for self
- Logger::log('api_favorites: self:' . $user_info['self']);
+ Logger::info(API_LOG_PREFIX . 'for {self}', ['module' => 'api', 'action' => 'favorites', 'self' => $user_info['self']]);
if ($user_info['self'] == 0) {
$ret = [];
} else {
// params
- $since_id = (x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0);
- $max_id = (x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0);
- $count = (x($_GET, 'count') ? $_GET['count'] : 20);
- $page = (x($_REQUEST, 'page') ? $_REQUEST['page'] -1 : 0);
+ $since_id = defaults($_REQUEST, 'since_id', 0);
+ $max_id = defaults($_REQUEST, 'max_id', 0);
+ $count = defaults($_GET, 'count', 20);
+ $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] -1 : 0);
if ($page < 0) {
$page = 0;
}
$ret = api_format_items(Item::inArray($statuses), $user_info, false, $type);
}
+ bindComments($ret);
+
$data = ['status' => $ret];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
+ break;
}
return api_format_data("statuses", $type, $data);
}
//don't send title to regular StatusNET requests to avoid confusing these apps
- if (x($_GET, 'getText')) {
+ if (!empty($_GET['getText'])) {
$ret['title'] = $item['title'];
if ($_GET['getText'] == 'html') {
$ret['text'] = BBCode::convert($item['body'], false);
} else {
$ret['text'] = $item['title'] . "\n" . HTML::toPlaintext(BBCode::convert(api_clean_plain_items($item['body']), false, 2, true), 0);
}
- if (x($_GET, 'getUserObjects') && $_GET['getUserObjects'] == 'false') {
+ if (!empty($_GET['getUserObjects']) && $_GET['getUserObjects'] == 'false') {
unset($ret['sender']);
unset($ret['recipient']);
}
*/
function api_get_entitities(&$text, $bbcode)
{
- $include_entities = strtolower(x($_REQUEST, 'include_entities') ? $_REQUEST['include_entities'] : "false");
+ $include_entities = strtolower(defaults($_REQUEST, 'include_entities', "false"));
if ($include_entities != "true") {
preg_match_all("/\[img](.*?)\[\/img\]/ism", $bbcode, $images);
*/
function api_format_items_activities($item, $type = "json")
{
- $a = get_app();
+ $a = \get_app();
$activities = [
'like' => [],
*/
function api_format_items($r, $user_info, $filter_user = false, $type = "json")
{
- $a = get_app();
+ $a = \get_app();
$ret = [];
- foreach ($r as $item) {
+ foreach ((array)$r as $item) {
localize_item($item);
list($status_user, $owner_user) = api_item_get_user($a, $item);
*/
function api_lists_ownerships($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
*/
function api_lists_statuses($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
}
// params
- $count = (x($_REQUEST, 'count') ? $_REQUEST['count'] : 20);
- $page = (x($_REQUEST, 'page') ? $_REQUEST['page'] - 1 : 0);
+ $count = defaults($_REQUEST, 'count', 20);
+ $page = (!empty($_REQUEST['page']) ? $_REQUEST['page'] - 1 : 0);
if ($page < 0) {
$page = 0;
}
- $since_id = (x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0);
- $max_id = (x($_REQUEST, 'max_id') ? $_REQUEST['max_id'] : 0);
- $exclude_replies = (x($_REQUEST, 'exclude_replies') ? 1 : 0);
- $conversation_id = (x($_REQUEST, 'conversation_id') ? $_REQUEST['conversation_id'] : 0);
+ $since_id = defaults($_REQUEST, 'since_id', 0);
+ $max_id = defaults($_REQUEST, 'max_id', 0);
+ $exclude_replies = (!empty($_REQUEST['exclude_replies']) ? 1 : 0);
+ $conversation_id = defaults($_REQUEST, 'conversation_id', 0);
$start = $page * $count;
$data = ['status' => $items];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
break;
*/
function api_statuses_f($qtype)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
}
// pagination
- $count = x($_GET, 'count') ? $_GET['count'] : 20;
- $page = x($_GET, 'page') ? $_GET['page'] : 1;
+ $count = defaults($_GET, 'count', 20);
+ $page = defaults($_GET, 'page', 1);
if ($page < 1) {
$page = 1;
}
$user_info = api_get_user($a);
- if (x($_GET, 'cursor') && $_GET['cursor'] == 'undefined') {
+ if (!empty($_GET['cursor']) && $_GET['cursor'] == 'undefined') {
/* this is to stop Hotot to load friends multiple times
* I'm not sure if I'm missing return something or
* is a bug in hotot. Workaround, meantime
*/
function api_statusnet_config($type)
{
- $a = get_app();
+ $a = \get_app();
$name = Config::get('config', 'sitename');
$server = $a->getHostName();
throw new ForbiddenException();
}
- $a = get_app();
+ $a = \get_app();
api_get_user($a);
*/
function api_direct_messages_new($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
$replyto = '';
$sub = '';
- if (x($_REQUEST, 'replyto')) {
+ if (!empty($_REQUEST['replyto'])) {
$r = q(
'SELECT `parent-uri`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d',
intval(api_user()),
$replyto = $r[0]['parent-uri'];
$sub = $r[0]['title'];
} else {
- if (x($_REQUEST, 'title')) {
+ if (!empty($_REQUEST['title'])) {
$sub = $_REQUEST['title'];
} else {
$sub = ((strlen($_POST['text'])>10) ? substr($_POST['text'], 0, 10)."...":$_POST['text']);
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $sender);
+ break;
}
return api_format_data("direct-messages", $type, $data);
*/
function api_direct_messages_destroy($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
//required
- $id = (x($_REQUEST, 'id') ? $_REQUEST['id'] : 0);
+ $id = defaults($_REQUEST, 'id', 0);
// optional
- $parenturi = (x($_REQUEST, 'friendica_parenturi') ? $_REQUEST['friendica_parenturi'] : "");
- $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false");
+ $parenturi = defaults($_REQUEST, 'friendica_parenturi', "");
+ $verbose = (!empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false");
/// @todo optional parameter 'include_entities' from Twitter API not yet implemented
$uid = $user_info['uid'];
/**
* Unfollow Contact
*
- * @brief unfollow contact
+ * @brief unfollow contact
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
$contact_id = defaults($_REQUEST, 'user_id');
if (empty($contact_id)) {
- Logger::log("No user_id specified", Logger::DEBUG);
+ Logger::notice(API_LOG_PREFIX . 'No user_id specified', ['module' => 'api', 'action' => 'friendships_destroy']);
throw new BadRequestException("no user_id specified");
}
$contact = DBA::selectFirst('contact', ['url'], ['id' => $contact_id, 'uid' => 0, 'self' => false]);
if(!DBA::isResult($contact)) {
- Logger::log("No contact found for ID" . $contact_id, Logger::DEBUG);
+ Logger::notice(API_LOG_PREFIX . 'No contact found for ID {contact}', ['module' => 'api', 'action' => 'friendships_destroy', 'contact' => $contact_id]);
throw new NotFoundException("no contact found to given ID");
}
$contact = DBA::selectFirst('contact', [], $condition);
if (!DBA::isResult($contact)) {
- Logger::log("Not following Contact", Logger::DEBUG);
+ Logger::notice(API_LOG_PREFIX . 'Not following contact', ['module' => 'api', 'action' => 'friendships_destroy']);
throw new NotFoundException("Not following Contact");
}
if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) {
- Logger::log("Not supported", Logger::DEBUG);
+ Logger::notice(API_LOG_PREFIX . 'Not supported for {network}', ['module' => 'api', 'action' => 'friendships_destroy', 'network' => $contact['network']]);
throw new ExpectationFailedException("Not supported");
}
Contact::terminateFriendship($owner, $contact, $dissolve);
}
else {
- Logger::log("No owner found", Logger::DEBUG);
+ Logger::notice(API_LOG_PREFIX . 'No owner {uid} found', ['module' => 'api', 'action' => 'friendships_destroy', 'uid' => $uid]);
throw new NotFoundException("Error Processing Request");
}
*/
function api_direct_messages_box($type, $box, $verbose)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
}
$data = ['direct_message' => $ret];
switch ($type) {
case "atom":
+ break;
case "rss":
$data = api_rss_extra($a, $data, $user_info);
+ break;
}
return api_format_data("direct-messages", $type, $data);
*/
function api_direct_messages_sentbox($type)
{
- $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false");
+ $verbose = !empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false";
return api_direct_messages_box($type, "sentbox", $verbose);
}
*/
function api_direct_messages_inbox($type)
{
- $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false");
+ $verbose = !empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false";
return api_direct_messages_box($type, "inbox", $verbose);
}
*/
function api_direct_messages_all($type)
{
- $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false");
+ $verbose = !empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false";
return api_direct_messages_box($type, "all", $verbose);
}
*/
function api_direct_messages_conversation($type)
{
- $verbose = (x($_GET, 'friendica_verbose') ? strtolower($_GET['friendica_verbose']) : "false");
+ $verbose = !empty($_GET['friendica_verbose']) ? strtolower($_GET['friendica_verbose']) : "false";
return api_direct_messages_box($type, "conversation", $verbose);
}
$r = $oauth1->fetch_request_token(OAuthRequest::from_request());
} catch (Exception $e) {
echo "error=" . OAuthUtil::urlencode_rfc3986($e->getMessage());
- killme();
+ exit();
}
echo $r;
- killme();
+ exit();
}
/**
$r = $oauth1->fetch_access_token(OAuthRequest::from_request());
} catch (Exception $e) {
echo "error=". OAuthUtil::urlencode_rfc3986($e->getMessage());
- killme();
+ exit();
}
echo $r;
- killme();
+ exit();
}
/// @TODO move to top of file or somewhere better
throw new ForbiddenException();
}
// input params
- $album = (x($_REQUEST, 'album') ? $_REQUEST['album'] : "");
+ $album = defaults($_REQUEST, 'album', "");
// we do not allow calls without album string
if ($album == "") {
}
// now let's delete all photos from the album
- $result = DBA::delete('photo', ['uid' => api_user(), 'album' => $album]);
+ $result = Photo::delete(['uid' => api_user(), 'album' => $album]);
// return success of deletion or error message
if ($result) {
throw new ForbiddenException();
}
// input params
- $album = (x($_REQUEST, 'album') ? $_REQUEST['album'] : "");
- $album_new = (x($_REQUEST, 'album_new') ? $_REQUEST['album_new'] : "");
+ $album = defaults($_REQUEST, 'album', "");
+ $album_new = defaults($_REQUEST, 'album_new', "");
// we do not allow calls without album string
if ($album == "") {
throw new BadRequestException("no new albumname specified");
}
// check if album is existing
- if (!DBA::exists('photo', ['uid' => api_user(), 'album' => $album])) {
+ if (!Photo::exists(['uid' => api_user(), 'album' => $album])) {
throw new BadRequestException("album not available");
}
// now let's update all photos to the albumname
- $result = DBA::update('photo', ['album' => $album_new], ['uid' => api_user(), 'album' => $album]);
+ $result = Photo::update(['album' => $album_new], ['uid' => api_user(), 'album' => $album]);
// return success of updating or error message
if ($result) {
throw new ForbiddenException();
}
// input params
- $photo_id = (x($_REQUEST, 'photo_id') ? $_REQUEST['photo_id'] : null);
- $desc = (x($_REQUEST, 'desc') ? $_REQUEST['desc'] : (array_key_exists('desc', $_REQUEST) ? "" : null)); // extra check necessary to distinguish between 'not provided' and 'empty string'
- $album = (x($_REQUEST, 'album') ? $_REQUEST['album'] : null);
- $album_new = (x($_REQUEST, 'album_new') ? $_REQUEST['album_new'] : null);
- $allow_cid = (x($_REQUEST, 'allow_cid') ? $_REQUEST['allow_cid'] : (array_key_exists('allow_cid', $_REQUEST) ? " " : null));
- $deny_cid = (x($_REQUEST, 'deny_cid') ? $_REQUEST['deny_cid'] : (array_key_exists('deny_cid', $_REQUEST) ? " " : null));
- $allow_gid = (x($_REQUEST, 'allow_gid') ? $_REQUEST['allow_gid'] : (array_key_exists('allow_gid', $_REQUEST) ? " " : null));
- $deny_gid = (x($_REQUEST, 'deny_gid') ? $_REQUEST['deny_gid'] : (array_key_exists('deny_gid', $_REQUEST) ? " " : null));
- $visibility = (x($_REQUEST, 'visibility') ? (($_REQUEST['visibility'] == "true" || $_REQUEST['visibility'] == 1) ? true : false) : false);
+ $photo_id = defaults($_REQUEST, 'photo_id', null);
+ $desc = defaults($_REQUEST, 'desc', (array_key_exists('desc', $_REQUEST) ? "" : null)) ; // extra check necessary to distinguish between 'not provided' and 'empty string'
+ $album = defaults($_REQUEST, 'album', null);
+ $album_new = defaults($_REQUEST, 'album_new', null);
+ $allow_cid = defaults($_REQUEST, 'allow_cid', (array_key_exists('allow_cid', $_REQUEST) ? " " : null));
+ $deny_cid = defaults($_REQUEST, 'deny_cid' , (array_key_exists('deny_cid' , $_REQUEST) ? " " : null));
+ $allow_gid = defaults($_REQUEST, 'allow_gid', (array_key_exists('allow_gid', $_REQUEST) ? " " : null));
+ $deny_gid = defaults($_REQUEST, 'deny_gid' , (array_key_exists('deny_gid' , $_REQUEST) ? " " : null));
+ $visibility = !empty($_REQUEST['visibility']) && $_REQUEST['visibility'] !== "false";
// do several checks on input parameters
// we do not allow calls without album string
$mode = "create";
// error if no media posted in create-mode
- if (!x($_FILES, 'media')) {
+ if (empty($_FILES['media'])) {
// Output error
throw new BadRequestException("no media data submitted");
}
} else {
$mode = "update";
- // check if photo is existing in database
- $r = q(
- "SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s' AND `album` = '%s'",
- intval(api_user()),
- DBA::escape($photo_id),
- DBA::escape($album)
- );
- if (!DBA::isResult($r)) {
+ // check if photo is existing in databasei
+ if (!Photo::exists(['resource-id' => $photo_id, 'uid' => api_user(), 'album' => $album])) {
throw new BadRequestException("photo not available");
}
}
// now let's do the changes in update-mode
if ($mode == "update") {
- $sql_extra = "";
+ $updated_fields = [];
if (!is_null($desc)) {
- $sql_extra .= (($sql_extra != "") ? " ," : "") . "`desc` = '$desc'";
+ $updated_fields['desc'] = $desc;
}
if (!is_null($album_new)) {
- $sql_extra .= (($sql_extra != "") ? " ," : "") . "`album` = '$album_new'";
+ $updated_fields['album'] = $album_new;
}
if (!is_null($allow_cid)) {
$allow_cid = trim($allow_cid);
- $sql_extra .= (($sql_extra != "") ? " ," : "") . "`allow_cid` = '$allow_cid'";
+ $updated_fields['allow_cid'] = $allow_cid;
}
if (!is_null($deny_cid)) {
$deny_cid = trim($deny_cid);
- $sql_extra .= (($sql_extra != "") ? " ," : "") . "`deny_cid` = '$deny_cid'";
+ $updated_fields['deny_cid'] = $deny_cid;
}
if (!is_null($allow_gid)) {
$allow_gid = trim($allow_gid);
- $sql_extra .= (($sql_extra != "") ? " ," : "") . "`allow_gid` = '$allow_gid'";
+ $updated_fields['allow_gid'] = $allow_gid;
}
if (!is_null($deny_gid)) {
$deny_gid = trim($deny_gid);
- $sql_extra .= (($sql_extra != "") ? " ," : "") . "`deny_gid` = '$deny_gid'";
+ $updated_fields['deny_gid'] = $deny_gid;
}
$result = false;
- if ($sql_extra != "") {
+ if (count($updated_fields) > 0) {
$nothingtodo = false;
- $result = q(
- "UPDATE `photo` SET %s, `edited`='%s' WHERE `uid` = %d AND `resource-id` = '%s' AND `album` = '%s'",
- $sql_extra,
- DateTimeFormat::utcNow(), // update edited timestamp
- intval(api_user()),
- DBA::escape($photo_id),
- DBA::escape($album)
- );
+ $result = Photo::update($updated_fields, ['uid' => api_user(), 'resource-id' => $photo_id, 'album' => $album]);
} else {
$nothingtodo = true;
}
- if (x($_FILES, 'media')) {
+ if (!empty($_FILES['media'])) {
$nothingtodo = false;
$media = $_FILES['media'];
$data = save_media_to_database("photo", $media, $type, $album, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $desc, 0, $visibility, $photo_id);
throw new ForbiddenException();
}
// input params
- $photo_id = (x($_REQUEST, 'photo_id') ? $_REQUEST['photo_id'] : null);
+ $photo_id = defaults($_REQUEST, 'photo_id', null);
// do several checks on input parameters
// we do not allow calls without photo id
throw new BadRequestException("no photo_id specified");
}
// check if photo is existing in database
- $r = q(
- "SELECT `id` FROM `photo` WHERE `uid` = %d AND `resource-id` = '%s'",
- intval(api_user()),
- DBA::escape($photo_id)
- );
- if (!DBA::isResult($r)) {
+ $r = Photo::exists(['resource-id' => $photo_id, 'uid' => api_user()]);
+ if (!$r) {
throw new BadRequestException("photo not available");
}
// now we can perform on the deletion of the photo
- $result = DBA::delete('photo', ['uid' => api_user(), 'resource-id' => $photo_id]);
+ $result = Photo::delete(['uid' => api_user(), 'resource-id' => $photo_id]);
// return success of deletion or error message
if ($result) {
if (api_user() === false) {
throw new ForbiddenException();
}
- if (!x($_REQUEST, 'photo_id')) {
+ if (empty($_REQUEST['photo_id'])) {
throw new BadRequestException("No photo id.");
}
- $scale = (x($_REQUEST, 'scale') ? intval($_REQUEST['scale']) : false);
+ $scale = (!empty($_REQUEST['scale']) ? intval($_REQUEST['scale']) : false);
$photo_id = $_REQUEST['photo_id'];
// prepare json/xml output with data from database for the requested photo
$profile_id = defaults($_REQUEST, 'profile_id', 0);
// error if image data is missing
- if (!x($_FILES, 'image')) {
+ if (empty($_FILES['image'])) {
throw new BadRequestException("no media data submitted");
}
// get mediadata from image or media (Twitter call api/account/update_profile_image provides image)
$media = null;
- if (x($_FILES, 'image')) {
+ if (!empty($_FILES['image'])) {
$media = $_FILES['image'];
- } elseif (x($_FILES, 'media')) {
+ } elseif (!empty($_FILES['media'])) {
$media = $_FILES['media'];
}
// save new profile image
// change specified profile or all profiles to the new resource-id
if ($is_default_profile) {
$condition = ["`profile` AND `resource-id` != ? AND `uid` = ?", $data['photo']['id'], api_user()];
- DBA::update('photo', ['profile' => false], $condition);
+ Photo::update(['profile' => false], $condition);
} else {
$fields = ['photo' => System::baseUrl() . '/photo/' . $data['photo']['id'] . '-4.' . $filetype,
'thumb' => System::baseUrl() . '/photo/' . $data['photo']['id'] . '-5.' . $filetype];
Contact::updateSelfFromUserID(api_user(), true);
// Update global directory in background
- $url = System::baseUrl() . '/profile/' . get_app()->user['nickname'];
+ $url = System::baseUrl() . '/profile/' . \get_app()->user['nickname'];
if ($url && strlen(Config::get('system', 'directory'))) {
Worker::add(PRIORITY_LOW, "Directory", $url);
}
*/
function prepare_photo_data($type, $scale, $photo_id)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if ($user_info === false) {
*/
function api_friendica_remoteauth()
{
- $url = (x($_GET, 'url') ? $_GET['url'] : '');
- $c_url = (x($_GET, 'c_url') ? $_GET['c_url'] : '');
+ $url = defaults($_GET, 'url', '');
+ $c_url = defaults($_GET, 'c_url', '');
if ($url === '' || $c_url === '') {
throw new BadRequestException("Wrong parameters.");
'sec' => $sec, 'expire' => time() + 45];
DBA::insert('profile_check', $fields);
- Logger::log($contact['name'] . ' ' . $sec, Logger::DEBUG);
+ Logger::info(API_LOG_PREFIX . 'for contact {contact}', ['module' => 'api', 'action' => 'friendica_remoteauth', 'contact' => $contact['name'], 'hey' => $sec]);
$dest = ($url ? '&destination_url=' . $url : '');
System::externalRedirect(
}
$reshared_item["body"] = $shared_body;
+ $reshared_item["author-id"] = Contact::getIdForURL($profile, 0, true);
$reshared_item["author-name"] = $author;
$reshared_item["author-link"] = $profile;
$reshared_item["author-avatar"] = $avatar;
// https://github.com/friendica/friendica/issues/1010
// This is a bugfix for that.
if (intval($in_reply_to['status_id']) == intval($item['id'])) {
- Logger::log('this message should never appear: id: '.$item['id'].' similar to reply-to: '.$in_reply_to['status_id'], Logger::DEBUG);
+ Logger::warning(API_LOG_PREFIX . 'ID {id} is similar to reply-to {reply-to}', ['module' => 'api', 'action' => 'in_reply_to', 'id' => $item['id'], 'reply-to' => $in_reply_to['status_id']]);
$in_reply_to['status_id'] = null;
$in_reply_to['user_id'] = null;
$in_reply_to['status_id_str'] = null;
*/
function api_clean_plain_items($text)
{
- $include_entities = strtolower(x($_REQUEST, 'include_entities') ? $_REQUEST['include_entities'] : "false");
+ $include_entities = strtolower(defaults($_REQUEST, 'include_entities', "false"));
$text = BBCode::cleanPictureLinks($text);
$URLSearchString = "^\[\]";
*/
function api_friendica_group_show($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
- $gid = (x($_REQUEST, 'gid') ? $_REQUEST['gid'] : 0);
+ $gid = defaults($_REQUEST, 'gid', 0);
$uid = $user_info['uid'];
// get data of the specified group id or all groups if not specified
*/
function api_friendica_group_delete($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
- $gid = (x($_REQUEST, 'gid') ? $_REQUEST['gid'] : 0);
- $name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
+ $gid = defaults($_REQUEST, 'gid', 0);
+ $name = defaults($_REQUEST, 'name', "");
$uid = $user_info['uid'];
// error if no gid specified
*/
function api_lists_destroy($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
- $gid = (x($_REQUEST, 'list_id') ? $_REQUEST['list_id'] : 0);
+ $gid = defaults($_REQUEST, 'list_id', 0);
$uid = $user_info['uid'];
// error if no gid specified
*/
function api_friendica_group_create($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
- $name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
+ $name = defaults($_REQUEST, 'name', "");
$uid = $user_info['uid'];
$json = json_decode($_POST['json'], true);
$users = $json['user'];
*/
function api_lists_create($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
- $name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
+ $name = defaults($_REQUEST, 'name', "");
$uid = $user_info['uid'];
$success = group_create($name, $uid);
*/
function api_friendica_group_update($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
$uid = $user_info['uid'];
- $gid = (x($_REQUEST, 'gid') ? $_REQUEST['gid'] : 0);
- $name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
+ $gid = defaults($_REQUEST, 'gid', 0);
+ $name = defaults($_REQUEST, 'name', "");
$json = json_decode($_POST['json'], true);
$users = $json['user'];
*/
function api_lists_update($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
- $gid = (x($_REQUEST, 'list_id') ? $_REQUEST['list_id'] : 0);
- $name = (x($_REQUEST, 'name') ? $_REQUEST['name'] : "");
+ $gid = defaults($_REQUEST, 'list_id', 0);
+ $name = defaults($_REQUEST, 'name', "");
$uid = $user_info['uid'];
// error if no gid specified
*/
function api_friendica_activity($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
$verb = strtolower($a->argv[3]);
$verb = preg_replace("|\..*$|", "", $verb);
- $id = (x($_REQUEST, 'id') ? $_REQUEST['id'] : 0);
+ $id = defaults($_REQUEST, 'id', 0);
$res = Item::performLike($id, $verb);
*/
function api_friendica_notification($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
$notes = $xmlnotes;
}
-
return api_format_data("notes", $type, ['note' => $notes]);
}
*/
function api_friendica_notification_seen($type)
{
- $a = get_app();
+ $a = \get_app();
$user_info = api_get_user($a);
if (api_user() === false || $user_info === false) {
throw new BadRequestException("Invalid argument count");
}
- $id = (x($_REQUEST, 'id') ? intval($_REQUEST['id']) : 0);
+ $id = (!empty($_REQUEST['id']) ? intval($_REQUEST['id']) : 0);
$nm = new NotificationsManager();
$note = $nm->getByID($id);
*/
function api_friendica_direct_messages_setseen($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
}
// params
$user_info = api_get_user($a);
$uid = $user_info['uid'];
- $id = (x($_REQUEST, 'id') ? $_REQUEST['id'] : 0);
+ $id = defaults($_REQUEST, 'id', 0);
// return error if id is zero
if ($id == "") {
*/
function api_friendica_direct_messages_search($type, $box = "")
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
// params
$user_info = api_get_user($a);
- $searchstring = (x($_REQUEST, 'searchstring') ? $_REQUEST['searchstring'] : "");
+ $searchstring = defaults($_REQUEST, 'searchstring', "");
$uid = $user_info['uid'];
// error if no searchstring specified
*/
function api_friendica_profile_show($type)
{
- $a = get_app();
+ $a = \get_app();
if (api_user() === false) {
throw new ForbiddenException();
}
// input params
- $profile_id = (x($_REQUEST, 'profile_id') ? $_REQUEST['profile_id'] : 0);
+ $profile_id = defaults($_REQUEST, 'profile_id', 0);
// retrieve general information about profiles for user
$multi_profiles = Feature::isEnabled(api_user(), 'multi_profiles');
/// @TODO move to top of file or somewhere better
api_register_func('api/saved_searches/list', 'api_saved_searches_list', true);
+/*
+ * Bind comment numbers(friendica_comments: Int) on each statuses page of *_timeline / favorites / search
+ *
+ * @brief Number of comments
+ *
+ * @param object $data [Status, Status]
+ *
+ * @return void
+ */
+function bindComments(&$data)
+{
+ if (count($data) == 0) {
+ return;
+ }
+
+ $ids = [];
+ $comments = [];
+ foreach ($data as $item) {
+ $ids[] = $item['id'];
+ }
+
+ $idStr = DBA::escape(implode(', ', $ids));
+ $sql = "SELECT `parent`, COUNT(*) as comments FROM `item` WHERE `parent` IN ($idStr) AND `deleted` = ? AND `gravity`= ? GROUP BY `parent`";
+ $items = DBA::p($sql, 0, GRAVITY_COMMENT);
+ $itemsData = DBA::toArray($items);
+
+ foreach ($itemsData as $item) {
+ $comments[$item['parent']] = $item['comments'];
+ }
+
+ foreach ($data as $idx => $item) {
+ $id = $item['id'];
+ $data[$idx]['friendica_comments'] = isset($comments[$id]) ? $comments[$id] : 0;
+ }
+}
+
/*
@TODO Maybe open to implement?
To.Do: