use Friendica\Network\FKOAuth1;
use Friendica\Network\HTTPException;
use Friendica\Network\HTTPException\BadRequestException;
+use Friendica\Network\HTTPException\ExpectationFailedException;
use Friendica\Network\HTTPException\ForbiddenException;
use Friendica\Network\HTTPException\InternalServerErrorException;
use Friendica\Network\HTTPException\MethodNotAllowedException;
define('API_METHOD_POST', 'POST,PUT');
define('API_METHOD_DELETE', 'POST,DELETE');
+define('API_LOG_PREFIX', 'API {action} - ');
+
$API = [];
$called_api = [];
* @brief Get source name from API client
*
* @return string
- * Client source name, default to "api" if unset/unknown
+ * Client source name, default to "api" if unset/unknown
+ * @throws Exception
*/
function api_source()
{
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";
*
* @param string $str Source date, as UTC
* @return string Date in UTC formatted as "D M d H:i:s +0000 Y"
+ * @throws Exception
*/
function api_date($str)
{
*
* @brief Login API user
*
- * @param object $a App
- * @hook 'authenticate'
- * array $addon_auth
- * 'username' => username from login form
- * 'password' => password from login form
- * 'authenticated' => return status,
- * 'user_record' => return authenticated user record
- * @hook 'logged_in'
- * array $user logged user record
+ * @param App $a App
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
+ * @hook 'authenticate'
+ * array $addon_auth
+ * 'username' => username from login form
+ * 'password' => password from login form
+ * 'authenticated' => return status,
+ * 'user_record' => return authenticated user record
+ * @hook 'logged_in'
+ * array $user logged user record
*/
function api_login(App $a)
{
var_dump($consumer, $token);
die();
} catch (Exception $e) {
- Logger::warning('API {action}: error', ['module' => 'api', 'action' => 'login', 'exception' => $e->getMessage()]);
+ Logger::warning(API_LOG_PREFIX . 'error', ['module' => 'api', 'action' => 'login', 'exception' => $e->getMessage()]);
}
// workaround for HTTP-auth in CGI mode
}
if (empty($_SERVER['PHP_AUTH_USER'])) {
- Logger::debug('API {action}: failed', ['module' => 'api', 'action' => 'login', 'parameters' => $_SERVER]);
+ 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");
}
}
if (!DBA::isResult($record)) {
- Logger::debug('API {action}: failed', ['module' => 'api', 'action' => 'login', 'parameters' => $_SERVER]);
+ 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');
*
* @brief Main API entry point
*
- * @param object $a App
+ * @param App $a App
* @return string|array API call result
+ * @throws Exception
*/
function api_call(App $a)
{
api_login($a);
}
- Logger::info('API {action}', ['module' => 'api', 'action' => 'call', 'username' => $a->user['username']]);
- Logger::debug('API {action} parameters', ['module' => 'api', 'action' => 'call', 'parameters' => $_REQUEST]);
+ 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::info('API {action} for {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::debug(
- 'API {action} 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 = "Database Read:\n";
- foreach ($a->callstack["database"] as $func => $time) {
- $time = round($time, 3);
- if ($time > 0) {
- $o .= $func . ": " . $time . "\n";
- }
- }
- $o .= "\nDatabase Write:\n";
- foreach ($a->callstack["database_write"] as $func => $time) {
- $time = round($time, 3);
- if ($time > 0) {
- $o .= $func . ": " . $time . "\n";
- }
- }
-
- $o = "Cache Read:\n";
- foreach ($a->callstack["cache"] as $func => $time) {
- $time = round($time, 3);
- if ($time > 0) {
- $o .= $func . ": " . $time . "\n";
- }
- }
- $o .= "\nCache Write:\n";
- foreach ($a->callstack["cache_write"] as $func => $time) {
- $time = round($time, 3);
- if ($time > 0) {
- $o .= $func . ": " . $time . "\n";
- }
- }
+ Logger::info(API_LOG_PREFIX . 'username {username}', ['module' => 'api', 'action' => 'call', 'username' => $a->user['username'], 'duration' => round($duration, 2)]);
- $o .= "\nNetwork:\n";
- foreach ($a->callstack["network"] as $func => $time) {
- $time = round($time, 3);
- if ($time > 0) {
- $o .= $func . ": " . $time . "\n";
- }
- }
- Logger::debug($o, ['module' => 'api', 'action' => 'call']);
- }
- }
+ $a->getProfiler()->saveLog($a->getLogger(), API_LOG_PREFIX . 'performance');
if (false === $return) {
/*
}
}
- Logger::warning('API {action} not implemented', ['module' => 'api', 'action' => 'call']);
+ 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}");
/**
* @brief Set values for RSS template
*
- * @param App $a
+ * @param App $a
* @param array $arr Array to be passed to template
* @param array $user_info User info
* @return array
- * @todo find proper type-hints
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
+ * @todo find proper type-hints
*/
function api_rss_extra(App $a, $arr, $user_info)
{
*
* @param int $id Contact id
* @return bool|string
- * Contact url or False if contact id is unknown
+ * Contact url or False if contact id is unknown
+ * @throws Exception
*/
function api_unique_id_to_nurl($id)
{
/**
* @brief Get user info array.
*
- * @param object $a App
+ * @param App $a App
* @param int|string $contact_id Contact ID or URL
+ * @return array|bool
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_get_user(App $a, $contact_id = null)
{
$extra_query = "";
$url = "";
- Logger::info('API {action}: Fetching data for user {user}', ['module' => 'api', 'action' => 'get_user', 'user' => $contact_id]);
+ 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)) {
}
}
- Logger::info('API {action}: getting user {user}', ['module' => 'api', 'action' => 'get_user', 'user' => $user]);
+ Logger::info(API_LOG_PREFIX . 'getting user {user}', ['module' => 'api', 'action' => 'get_user', 'user' => $user]);
if (!$user) {
if (api_user() === false) {
}
}
- Logger::info('API {action}: found user {user}', ['module' => 'api', 'action' => 'get_user', 'user' => $user, 'extra_query' => $extra_query]);
+ Logger::info(API_LOG_PREFIX . 'found user {user}', ['module' => 'api', 'action' => 'get_user', 'user' => $user, 'extra_query' => $extra_query]);
// user info
$uinfo = q(
/**
* @brief return api-formatted array for item's author and owner
*
- * @param object $a App
- * @param array $item item from db
+ * @param App $a App
+ * @param array $item item from db
* @return array(array:author, array:owner)
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_item_get_user(App $a, $item)
{
/**
* @brief walks recursively through an array with the possibility to change value and key
*
- * @param array $array The array to walk through
- * @param string $callback The callback function
+ * @param array $array The array to walk through
+ * @param callable $callback The callback function
*
* @return array the transformed array
*/
* @param string $type Return type (atom, rss, xml, json)
* @param array $data JSON style array
*
- * @return (string|array) XML data or JSON data
+ * @return array|string (string|array) XML data or JSON data
*/
function api_format_data($root_element, $type, $data)
{
/**
* Returns an HTTP 200 OK response code and a representation of the requesting user if authentication was successful;
* returns a 401 status code and an error message if not.
+ *
* @see https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/get-account-verify_credentials
*
* @param string $type Return type (atom, rss, xml, json)
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_account_verify_credentials($type)
{
* Get data from $_POST or $_GET
*
* @param string $k
+ * @return null
*/
function requestdata($k)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_statuses_mediap($type)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws TooManyRequestsException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-update
*/
function api_statuses_update($type)
* Uploads an image to Friendica.
*
* @return array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/media/upload-media/api-reference/post-media-upload
*/
function api_media_upload()
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @param int $item_id
* @return array|string
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_status_show($type, $item_id = 0)
{
Logger::log('api_status_show: user_info: '.print_r($user_info, true), Logger::DEBUG);
- if ($type == "raw") {
- $privacy_sql = "AND NOT `private`";
- } else {
- $privacy_sql = "";
- }
-
if (!empty($item_id)) {
// Get the item with the given id
$condition = ['id' => $item_id];
$condition = ['owner-id' => $user_info['pid'], 'uid' => api_user(),
'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT]];
}
+
+ if ($type == "raw") {
+ $condition['private'] = false;
+ }
+
$lastwall = Item::selectFirst(Item::ITEM_FIELDLIST, $condition, ['order' => ['id' => true]]);
if (DBA::isResult($lastwall)) {
* The author's most recent status will be returned inline.
*
* @param string $type Return type (atom, rss, xml, json)
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-show
*/
function api_users_show($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-users-search
*/
function api_users_search($type)
* @param string $type Return format: json or xml
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
* @throws NotFoundException if the results are empty.
+ * @throws UnauthorizedException
*/
function api_users_lookup($type)
{
*
* @return array|string
* @throws BadRequestException if the "q" parameter is missing.
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_search($type)
{
if (api_user() === false || $user_info === false) { throw new ForbiddenException(); }
- if (empty($_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']));
$data = [];
/**
* Returns the most recent statuses posted by the user and the users they follow.
*
- * @see https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-home_timeline
+ * @see https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-home_timeline
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @todo Optional parameters
* @todo Add reply info
*/
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_statuses_public_timeline($type)
{
*
* @param string $type Return format: json, xml, atom, rss
* @return array|string
+ * @throws BadRequestException
* @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_statuses_networkpublic_timeline($type)
{
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/get-statuses-show-id
*/
function api_statuses_show($type)
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @todo nothing to say?
*/
function api_conversation_show($type)
$id = intval(defaults($a->argv, 4, 0));
}
- Logger::info('API: {action} - {subaction}', ['module' => 'api', 'action' => 'conversation', 'subaction' => 'show', 'id' => $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]);
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-retweet-id
*/
function api_statuses_repeat($type)
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-destroy-id
*/
function api_statuses_destroy($type)
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see http://developer.twitter.com/doc/get/statuses/mentions
*/
function api_statuses_mentions($type)
*
* @param string $type Either "json" or "xml"
* @return string|array
+ * @throws BadRequestException
* @throws ForbiddenException
- * @see https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
+ * @see https://developer.twitter.com/en/docs/tweets/timelines/api-reference/get-statuses-user_timeline
*/
function api_statuses_user_timeline($type)
{
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://web.archive.org/web/20131019055350/https://dev.twitter.com/docs/api/1/post/favorites/create/%3Aid
*/
function api_favorites_create_destroy($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_favorites($type)
{
// in friendica starred item are private
// return favorites only for self
- Logger::info('API: {action}', ['module' => 'api', 'action' => '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 = [];
* @param array $sender
*
* @return array
+ * @throws InternalServerErrorException
*/
function api_format_messages($item, $recipient, $sender)
{
* @param array $item
*
* @return array
+ * @throws InternalServerErrorException
*/
function api_convert_item($item)
{
* @param string $body
*
* @return array
+ * @throws InternalServerErrorException
*/
function api_get_attachments(&$body)
{
* @param string $bbcode
*
* @return array
+ * @throws InternalServerErrorException
* @todo Links at the first character of the post
*/
function api_get_entitities(&$text, $bbcode)
$entities["media"][] = [
"id" => $start+1,
- "id_str" => (string)$start+1,
+ "id_str" => (string) ($start + 1),
"indices" => [$start, $start+strlen($url)],
"media_url" => Strings::normaliseLink($media_url),
"media_url_https" => $media_url,
/**
* @brief return likes, dislikes and attend status for item
*
- * @param array $item array
+ * @param array $item array
* @param string $type Return type (atom, rss, xml, json)
*
* @return array
- * likes => int count,
- * dislikes => int count
+ * likes => int count,
+ * dislikes => int count
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_format_items_activities($item, $type = "json")
{
/**
* @brief return data from profiles
*
- * @param array $profile_row array containing data from db table 'profile'
+ * @param array $profile_row array containing data from db table 'profile'
* @return array
+ * @throws InternalServerErrorException
*/
function api_format_items_profiles($profile_row)
{
/**
* @brief format items to be returned by api
*
- * @param array $r array of items
+ * @param array $r array of items
* @param array $user_info
* @param bool $filter_user filter items by $user_info
- * @param string $type Return type (atom, rss, xml, json)
+ * @param string $type Return type (atom, rss, xml, json)
+ * @return array
+ * @throws BadRequestException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_format_items($r, $user_info, $filter_user = false, $type = "json")
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws Exception
*/
function api_account_rate_limit_status($type)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/accounts-and-users/create-manage-lists/api-reference/get-lists-ownerships
*/
function api_lists_ownerships($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/accounts-and-users/create-manage-lists/api-reference/get-lists-ownerships
*/
function api_lists_statuses($type)
*
* @param string $qtype Either "friends" or "followers"
* @return boolean|array
+ * @throws BadRequestException
* @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_statuses_f($qtype)
{
/**
* Returns the user's friends.
*
- * @brief Returns the list of friends of the provided user
+ * @brief Returns the list of friends of the provided user
*
* @deprecated By Twitter API in favor of friends/list
*
* @param string $type Either "json" or "xml"
* @return boolean|string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
*/
function api_statuses_friends($type)
{
/**
* Returns the user's followers.
*
- * @brief Returns the list of followers of the provided user
+ * @brief Returns the list of followers of the provided user
*
* @deprecated By Twitter API in favor of friends/list
*
* @param string $type Either "json" or "xml"
* @return boolean|string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
*/
function api_statuses_followers($type)
{
* @param string $type Either "json" or "xml"
*
* @return boolean|string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
*/
function api_blocks_list($type)
{
* @param string $type Either "json" or "xml"
*
* @return boolean|string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
*/
function api_friendships_incoming($type)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws InternalServerErrorException
*/
function api_statusnet_config($type)
{
$server = $a->getHostName();
$logo = System::baseUrl() . '/images/friendica-64.png';
$email = Config::get('config', 'admin_email');
- $closed = intval(Config::get('config', 'register_policy')) === REGISTER_CLOSED ? 'true' : 'false';
+ $closed = intval(Config::get('config', 'register_policy')) === \Friendica\Module\Register::CLOSED ? 'true' : 'false';
$private = Config::get('system', 'block_public') ? 'true' : 'false';
$textlimit = (string) Config::get('config', 'api_import_size', Config::get('config', 'max_import_size', 200000));
$ssl = Config::get('system', 'have_ssl') ? 'true' : 'false';
*
* @param string $type Return type (atom, rss, xml, json)
*
+ * @return array|string|void
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @todo use api_format_data() to return data
*/
function api_ff_ids($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
* @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-friends-ids
*/
function api_friends_ids($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
* @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/get-followers-ids
*/
function api_followers_ids($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws NotFoundException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/new-message
*/
function api_direct_messages_new($type)
}
$replyto = '';
- $sub = '';
if (!empty($_REQUEST['replyto'])) {
$r = q(
'SELECT `parent-uri`, `title` FROM `mail` WHERE `uid`=%d AND `id`=%d',
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
- * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/delete-message
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
+ * @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/delete-message
*/
function api_direct_messages_destroy($type)
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
- * @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/post-friendships-destroy.html
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws NotFoundException
+ * @see https://developer.twitter.com/en/docs/accounts-and-users/follow-search-get-users/api-reference/post-friendships-destroy.html
*/
function api_friendships_destroy($type)
{
$uid = api_user();
- $a = get_app();
if ($uid === false) {
throw new ForbiddenException();
$contact_id = defaults($_REQUEST, 'user_id');
if (empty($contact_id)) {
- Logger::notice('API {action} - No user_id specified', ['module' => 'api', 'action' => 'friendships_destroy']);
+ 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::notice('API {action} - No contact found for ID {contact}', ['module' => 'api', 'action' => 'friendships_destroy', 'contact' => $contact_id]);
+ 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::notice('API {action} - Not following contact', ['module' => 'api', 'action' => 'friendships_destroy']);
+ 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::notice('API {action} - Not supported for {network}', ['module' => 'api', 'action' => 'friendships_destroy', 'network' => $contact['network']]);
+ 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::notice('API {action} - No owner {uid} found', ['module' => 'api', 'action' => 'friendships_destroy', 'uid' => $uid]);
+ Logger::notice(API_LOG_PREFIX . 'No owner {uid} found', ['module' => 'api', 'action' => 'friendships_destroy', 'uid' => $uid]);
throw new NotFoundException("Error Processing Request");
}
* @param string $verbose
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_direct_messages_box($type, $box, $verbose)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
* @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-sent-message
*/
function api_direct_messages_sentbox($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
* @see https://developer.twitter.com/en/docs/direct-messages/sending-and-receiving/api-reference/get-messages
*/
function api_direct_messages_inbox($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
*/
function api_direct_messages_all($type)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
*/
function api_direct_messages_conversation($type)
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws InternalServerErrorException
*/
function api_fr_photoalbum_delete($type)
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws InternalServerErrorException
*/
function api_fr_photoalbum_update($type)
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
+ * @throws ForbiddenException
+ * @throws InternalServerErrorException
*/
function api_fr_photos_list($type)
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws NotFoundException
*/
function api_fr_photo_create_update($type)
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws InternalServerErrorException
*/
function api_fr_photo_delete($type)
{
if (api_user() === false) {
throw new ForbiddenException();
}
+
// input params
$photo_id = defaults($_REQUEST, 'photo_id', null);
if ($photo_id == null) {
throw new BadRequestException("no photo_id specified");
}
+
// check if photo is existing in database
- $r = Photo::exists(['resource-id' => $photo_id, 'uid' => api_user()]);
- if (!$r) {
+ if (!Photo::exists(['resource-id' => $photo_id, 'uid' => api_user()])) {
throw new BadRequestException("photo not available");
}
+
// now we can perform on the deletion of the photo
$result = Photo::delete(['uid' => api_user(), 'resource-id' => $photo_id]);
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws InternalServerErrorException
+ * @throws NotFoundException
*/
function api_fr_photo_detail($type)
{
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
*
* @return string|array
- * @see https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile_image
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws NotFoundException
+ * @see https://developer.twitter.com/en/docs/accounts-and-users/manage-account-settings/api-reference/post-account-update_profile_image
*/
function api_account_update_profile_image($type)
{
$condition = ["`profile` AND `resource-id` != ? AND `uid` = ?", $data['photo']['id'], api_user()];
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];
+ $fields = ['photo' => System::baseUrl() . '/photo/' . $data['photo']['id'] . '-4.' . $fileext,
+ 'thumb' => System::baseUrl() . '/photo/' . $data['photo']['id'] . '-5.' . $fileext];
DBA::update('profile', $fields, ['id' => $_REQUEST['profile'], 'uid' => api_user()]);
}
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_account_update_profile($type)
{
/**
*
* @param string $acl_string
+ * @return bool
+ * @throws Exception
*/
function check_acl_input($acl_string)
{
* @param integer $profile
* @param boolean $visibility
* @param string $photo_id
+ * @return array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws NotFoundException
*/
function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $desc, $profile = 0, $visibility = false, $photo_id = null)
{
* @param string $deny_gid
* @param string $filetype
* @param boolean $visibility
+ * @throws InternalServerErrorException
*/
function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $filetype, $visibility = false)
{
* @param string $photo_id
*
* @return array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws NotFoundException
+ * @throws UnauthorizedException
*/
function prepare_photo_data($type, $scale, $photo_id)
{
'sec' => $sec, 'expire' => time() + 45];
DBA::insert('profile_check', $fields);
- $a = get_app();
- Logger::info('API: {action}', ['module' => 'api', 'action' => 'friendica_remoteauth', 'contact' => $contact['name'], 'hey' => $sec]);
+ 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(
*
* @param array $item Sharer item
* @return array|false Shared item or false if not a reshare
+ * @throws ImagickException
+ * @throws InternalServerErrorException
*/
function api_share_as_retweet(&$item)
{
* @param string $profile
*
* @return string|false
+ * @throws InternalServerErrorException
* @todo remove trailing junk from profile url
* @todo pump.io check has to check the website
*/
* @param array $item
*
* @return array
+ * @throws Exception
*/
function api_in_reply_to($item)
{
// https://github.com/friendica/friendica/issues/1010
// This is a bugfix for that.
if (intval($in_reply_to['status_id']) == intval($item['id'])) {
- $a = get_app();
- Logger::warning('API {action}: 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']]);
+ 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;
* @param string $text
*
* @return string
+ * @throws InternalServerErrorException
*/
function api_clean_plain_items($text)
{
* @param string $body The original body
*
* @return string Cleaned body
+ * @throws InternalServerErrorException
*/
function api_clean_attachments($body)
{
*
* @param array $contacts
*
- * @return array
+ * @return void
*/
function api_best_nickname(&$contacts)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_friendica_group_show($type)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_friendica_group_delete($type)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/accounts-and-users/create-manage-lists/api-reference/post-lists-destroy
*/
function api_lists_destroy($type)
* Add a new group to the database.
*
* @param string $name Group name
- * @param int $uid User ID
+ * @param int $uid User ID
* @param array $users List of users to add to the group
*
* @return array
+ * @throws BadRequestException
*/
function group_create($name, $uid, $users = [])
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_friendica_group_create($type)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/accounts-and-users/create-manage-lists/api-reference/post-lists-create
*/
function api_lists_create($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_friendica_group_update($type)
{
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
* @see https://developer.twitter.com/en/docs/accounts-and-users/create-manage-lists/api-reference/post-lists-update
*/
function api_lists_update($type)
* @param string $type Return type (atom, rss, xml, json)
*
* @return array|string
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
*/
function api_friendica_activity($type)
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
-*/
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws InternalServerErrorException
+ */
function api_friendica_notification($type)
{
$a = \get_app();
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_friendica_notification_seen($type)
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array (success result=ok, error result=error with error message)
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_friendica_direct_messages_setseen($type)
{
/**
* @brief search for direct_messages containing a searchstring through api
*
- * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
+ * @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @param string $box
* @return string|array (success: success=true if found and search_result contains found messages,
* success=false if nothing was found, search_result='nothing found',
- * error: result=error with error message)
+ * error: result=error with error message)
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_friendica_direct_messages_search($type, $box = "")
{
*
* @param string $type Known types are 'atom', 'rss', 'xml' and 'json'
* @return string|array
+ * @throws BadRequestException
+ * @throws ForbiddenException
+ * @throws ImagickException
+ * @throws InternalServerErrorException
+ * @throws UnauthorizedException
*/
function api_friendica_profile_show($type)
{
* @param string $type Return format: json or xml
*
* @return string|array
+ * @throws Exception
*/
function api_saved_searches_list($type)
{