X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=include%2Fapi.php;h=0f7fa85bdde551dcdb0c2a4ccdfb19e3b254d3fc;hb=4f07ebb52faa5be4625b4cfece5dd366f746a547;hp=3bae11e57d87221977c24cadfb0a21321544e367;hpb=3ea9b0680a0c8ff218ee42046405e6bc80c57719;p=friendica.git diff --git a/include/api.php b/include/api.php index 3bae11e57d..0f7fa85bdd 100644 --- a/include/api.php +++ b/include/api.php @@ -12,8 +12,10 @@ 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\L10n; +use Friendica\Core\Logger; use Friendica\Core\NotificationsManager; use Friendica\Core\PConfig; use Friendica\Core\Protocol; @@ -46,7 +48,6 @@ use Friendica\Util\XML; require_once 'include/conversation.php'; require_once 'mod/share.php'; require_once 'mod/item.php'; -require_once 'include/security.php'; require_once 'mod/wall_upload.php'; define('API_METHOD_ANY', '*'); @@ -96,9 +97,9 @@ function api_source() return "Twidere"; } - logger("Unrecognized user-agent ".$_SERVER['HTTP_USER_AGENT'], LOGGER_DEBUG); + Logger::log("Unrecognized user-agent ".$_SERVER['HTTP_USER_AGENT'], Logger::DEBUG); } else { - logger("Empty user-agent", LOGGER_DEBUG); + Logger::log("Empty user-agent", Logger::DEBUG); } return "api"; @@ -180,7 +181,7 @@ function api_login(App $a) var_dump($consumer, $token); die(); } catch (Exception $e) { - logger($e); + Logger::log($e); } // workaround for HTTP-auth in CGI mode @@ -194,7 +195,7 @@ function api_login(App $a) } if (!x($_SERVER, 'PHP_AUTH_USER')) { - logger('API_login: ' . print_r($_SERVER, true), LOGGER_DEBUG); + Logger::log('API_login: ' . print_r($_SERVER, true), Logger::DEBUG); header('WWW-Authenticate: Basic realm="Friendica"'); throw new UnauthorizedException("This API requires login"); } @@ -235,14 +236,14 @@ function api_login(App $a) } if (!DBA::isResult($record)) { - logger('API_login failure: ' . print_r($_SERVER, true), LOGGER_DEBUG); + Logger::log('API_login failure: ' . print_r($_SERVER, true), Logger::DEBUG); header('WWW-Authenticate: Basic realm="Friendica"'); //header('HTTP/1.0 401 Unauthorized'); //die('This api requires login'); throw new UnauthorizedException("This API requires login"); } - authenticate_success($record); + Authentication::setAuthenticatedSessionForUser($record); $_SESSION["allow_api"] = true; @@ -308,19 +309,19 @@ function api_call(App $a) api_login($a); } - logger('API call for ' . $a->user['username'] . ': ' . $a->query_string); - logger('API parameters: ' . print_r($_REQUEST, true)); + Logger::log('API call for ' . $a->user['username'] . ': ' . $a->query_string); + Logger::log('API parameters: ' . print_r($_REQUEST, true)); $stamp = microtime(true); $return = call_user_func($info['func'], $type); $duration = (float) (microtime(true) - $stamp); - logger("API call duration: " . round($duration, 2) . "\t" . $a->query_string, LOGGER_DEBUG); + Logger::log("API call duration: " . round($duration, 2) . "\t" . $a->query_string, Logger::DEBUG); if (Config::get("system", "profiler")) { $duration = microtime(true)-$a->performance["start"]; /// @TODO round() really everywhere? - logger( + 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), @@ -334,7 +335,7 @@ function api_call(App $a) + $a->performance["network"] + $a->performance["file"]), 2), round($duration, 2) ), - LOGGER_DEBUG + Logger::DEBUG ); if (Config::get("rendertime", "callstack")) { @@ -375,7 +376,7 @@ function api_call(App $a) $o .= $func . ": " . $time . "\n"; } } - logger($o, LOGGER_DEBUG); + Logger::log($o, Logger::DEBUG); } } @@ -412,7 +413,7 @@ function api_call(App $a) } } - logger('API call not implemented: ' . $a->query_string); + Logger::log('API call not implemented: ' . $a->query_string); throw new NotImplementedException(); } catch (HTTPException $e) { header("HTTP/1.1 {$e->httpcode} {$e->httpdesc}"); @@ -521,7 +522,7 @@ function api_get_user(App $a, $contact_id = null) $extra_query = ""; $url = ""; - logger("api_get_user: Fetching user data for user ".$contact_id, LOGGER_DEBUG); + Logger::log("api_get_user: Fetching user data for user ".$contact_id, Logger::DEBUG); // Searching for contact URL if (!is_null($contact_id) && (intval($contact_id) == 0)) { @@ -605,7 +606,7 @@ function api_get_user(App $a, $contact_id = null) } } - logger("api_get_user: user ".$user, LOGGER_DEBUG); + Logger::log("api_get_user: user ".$user, Logger::DEBUG); if (!$user) { if (api_user() === false) { @@ -617,7 +618,7 @@ function api_get_user(App $a, $contact_id = null) } } - logger('api_user: ' . $extra_query . ', user: ' . $user); + Logger::log('api_user: ' . $extra_query . ', user: ' . $user); // user info $uinfo = q( @@ -761,7 +762,7 @@ function api_get_user(App $a, $contact_id = null) 'statusnet_blocking' => false, 'notifications' => false, /// @TODO old way? - //'statusnet_profile_url' => System::baseUrl()."/contacts/".$uinfo[0]['cid'], + //'statusnet_profile_url' => System::baseUrl()."/contact/".$uinfo[0]['cid'], 'statusnet_profile_url' => $uinfo[0]['url'], 'uid' => intval($uinfo[0]['uid']), 'cid' => intval($uinfo[0]['cid']), @@ -819,7 +820,7 @@ function api_item_get_user(App $a, $item) $status_user["protected"] = defaults($item, 'private', 0); if (defaults($item, 'thr-parent', '') == defaults($item, 'uri', '')) { - $owner_user = api_get_user($a, defaults($item, 'author-id', null)); + $owner_user = api_get_user($a, defaults($item, 'owner-id', null)); } else { $owner_user = $status_user; } @@ -1033,7 +1034,7 @@ function api_statuses_mediap($type) $a = get_app(); if (api_user() === false) { - logger('api_statuses_update: no user'); + Logger::log('api_statuses_update: no user'); throw new ForbiddenException(); } $user_info = api_get_user($a); @@ -1045,7 +1046,7 @@ function api_statuses_mediap($type) //$txt = urldecode(requestdata('status')); if ((strpos($txt, '<') !== false) || (strpos($txt, '>') !== false)) { - $txt = html2bb_video($txt); + $txt = HTML::toBBCodeVideo($txt); $config = HTMLPurifier_Config::createDefault(); $config->set('Cache.DefinitionImpl', null); $purifier = new HTMLPurifier($config); @@ -1059,10 +1060,10 @@ function api_statuses_mediap($type) // now that we have the img url in bbcode we can add it to the status and insert the wall item. $_REQUEST['body'] = $txt . "\n\n" . '[url=' . $picture["albumpage"] . '][img]' . $picture["preview"] . "[/img][/url]"; - item_post($a); + $item_id = item_post($a); - // this should output the last post (the one we just posted). - return api_status_show($type); + // output the post that we just posted. + return api_status_show($type, $item_id); } /// @TODO move this to top of file or somewhere better! @@ -1078,11 +1079,10 @@ api_register_func('api/statuses/mediap', 'api_statuses_mediap', true, API_METHOD */ function api_statuses_update($type) { - $a = get_app(); if (api_user() === false) { - logger('api_statuses_update: no user'); + Logger::log('api_statuses_update: no user'); throw new ForbiddenException(); } @@ -1092,7 +1092,7 @@ function api_statuses_update($type) if (requestdata('htmlstatus')) { $txt = requestdata('htmlstatus'); if ((strpos($txt, '<') !== false) || (strpos($txt, '>') !== false)) { - $txt = html2bb_video($txt); + $txt = HTML::toBBCodeVideo($txt); $config = HTMLPurifier_Config::createDefault(); $config->set('Cache.DefinitionImpl', null); @@ -1132,11 +1132,11 @@ function api_statuses_update($type) if ($throttle_day > 0) { $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60); - $condition = ["`uid` = ? AND `wall` AND `created` > ? AND `id` = `parent`", api_user(), $datefrom]; - $posts_day = DBA::count('item', $condition); + $condition = ["`uid` = ? AND `wall` AND `created` > ?", api_user(), $datefrom]; + $posts_day = DBA::count('thread', $condition); if ($posts_day > $throttle_day) { - logger('Daily posting limit reached for user '.api_user(), LOGGER_DEBUG); + Logger::log('Daily posting limit reached for user '.api_user(), Logger::DEBUG); // die(api_error($type, L10n::t("Daily posting limit of %d posts reached. The post was rejected.", $throttle_day)); throw new TooManyRequestsException(L10n::tt("Daily posting limit of %d post reached. The post was rejected.", "Daily posting limit of %d posts reached. The post was rejected.", $throttle_day)); } @@ -1146,11 +1146,11 @@ function api_statuses_update($type) if ($throttle_week > 0) { $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*7); - $condition = ["`uid` = ? AND `wall` AND `created` > ? AND `id` = `parent`", api_user(), $datefrom]; - $posts_week = DBA::count('item', $condition); + $condition = ["`uid` = ? AND `wall` AND `created` > ?", api_user(), $datefrom]; + $posts_week = DBA::count('thread', $condition); if ($posts_week > $throttle_week) { - logger('Weekly posting limit reached for user '.api_user(), LOGGER_DEBUG); + Logger::log('Weekly posting limit reached for user '.api_user(), Logger::DEBUG); // die(api_error($type, L10n::t("Weekly posting limit of %d posts reached. The post was rejected.", $throttle_week))); throw new TooManyRequestsException(L10n::tt("Weekly posting limit of %d post reached. The post was rejected.", "Weekly posting limit of %d posts reached. The post was rejected.", $throttle_week)); } @@ -1160,11 +1160,11 @@ function api_statuses_update($type) if ($throttle_month > 0) { $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*30); - $condition = ["`uid` = ? AND `wall` AND `created` > ? AND `id` = `parent`", api_user(), $datefrom]; - $posts_month = DBA::count('item', $condition); + $condition = ["`uid` = ? AND `wall` AND `created` > ?", api_user(), $datefrom]; + $posts_month = DBA::count('thread', $condition); if ($posts_month > $throttle_month) { - logger('Monthly posting limit reached for user '.api_user(), LOGGER_DEBUG); + Logger::log('Monthly posting limit reached for user '.api_user(), Logger::DEBUG); // die(api_error($type, L10n::t("Monthly posting limit of %d posts reached. The post was rejected.", $throttle_month)); throw new TooManyRequestsException(L10n::t("Monthly posting limit of %d post reached. The post was rejected.", "Monthly posting limit of %d posts reached. The post was rejected.", $throttle_month)); } @@ -1203,10 +1203,10 @@ function api_statuses_update($type) } // call out normal post function - item_post($a); + $item_id = item_post($a); - // this should output the last post (the one we just posted). - return api_status_show($type); + // output the post that we just posted. + return api_status_show($type, $item_id); } /// @TODO move to top of file or somewhere better @@ -1224,7 +1224,7 @@ function api_media_upload() $a = get_app(); if (api_user() === false) { - logger('no user'); + Logger::log('no user'); throw new ForbiddenException(); } @@ -1249,7 +1249,7 @@ function api_media_upload() "h" => $media["height"], "image_type" => $media["type"]]; - logger("Media uploaded: " . print_r($returndata, true), LOGGER_DEBUG); + Logger::log("Media uploaded: " . print_r($returndata, true), Logger::DEBUG); return ["media" => $returndata]; } @@ -1263,13 +1263,13 @@ api_register_func('api/media/upload', 'api_media_upload', true, API_METHOD_POST) * * @return array|string */ -function api_status_show($type) +function api_status_show($type, $item_id = 0) { $a = get_app(); $user_info = api_get_user($a); - logger('api_status_show: user_info: '.print_r($user_info, true), LOGGER_DEBUG); + Logger::log('api_status_show: user_info: '.print_r($user_info, true), Logger::DEBUG); if ($type == "raw") { $privacy_sql = "AND NOT `private`"; @@ -1277,9 +1277,14 @@ function api_status_show($type) $privacy_sql = ""; } - // get last public wall message - $condition = ['owner-id' => $user_info['pid'], 'uid' => api_user(), - 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT]]; + if (!empty($item_id)) { + // Get the item with the given id + $condition = ['id' => $item_id]; + } else { + // get last public wall message + $condition = ['owner-id' => $user_info['pid'], 'uid' => api_user(), + 'gravity' => [GRAVITY_PARENT, GRAVITY_COMMENT]]; + } $lastwall = Item::selectFirst(Item::ITEM_FIELDLIST, $condition, ['order' => ['id' => true]]); if (DBA::isResult($lastwall)) { @@ -1331,16 +1336,16 @@ function api_status_show($type) } if ($status_info["source"] == 'web') { - $status_info["source"] = ContactSelector::networkToName($lastwall['network'], $user_info['url']); - } elseif (ContactSelector::networkToName($lastwall['network'], $user_info['url']) != $status_info["source"]) { - $status_info["source"] = trim($status_info["source"].' ('.ContactSelector::networkToName($lastwall['network'], $user_info['url']).')'); + $status_info["source"] = ContactSelector::networkToName($lastwall['network'], $lastwall['author-link']); + } elseif (ContactSelector::networkToName($lastwall['network'], $lastwall['author-link']) != $status_info["source"]) { + $status_info["source"] = trim($status_info["source"].' ('.ContactSelector::networkToName($lastwall['network'], $lastwall['author-link']).')'); } // "uid" and "self" are only needed for some internal stuff, so remove it from here unset($status_info["user"]["uid"]); unset($status_info["user"]["self"]); - logger('status_info: '.print_r($status_info, true), LOGGER_DEBUG); + Logger::log('status_info: '.print_r($status_info, true), Logger::DEBUG); if ($type == "raw") { return $status_info; @@ -1406,11 +1411,11 @@ function api_users_show($type) } if ($user_info["status"]["source"] == 'web') { - $user_info["status"]["source"] = ContactSelector::networkToName($lastwall['network'], $user_info['url']); + $user_info["status"]["source"] = ContactSelector::networkToName($lastwall['network'], $lastwall['author-link']); } if (ContactSelector::networkToName($lastwall['network'], $user_info['url']) != $user_info["status"]["source"]) { - $user_info["status"]["source"] = trim($user_info["status"]["source"] . ' (' . ContactSelector::networkToName($lastwall['network'], $user_info['url']) . ')'); + $user_info["status"]["source"] = trim($user_info["status"]["source"] . ' (' . ContactSelector::networkToName($lastwall['network'], $lastwall['author-link']) . ')'); } } @@ -1820,7 +1825,7 @@ function api_statuses_show($type) $id = intval(defaults($a->argv, 4, 0)); } - logger('API: api_statuses_show: ' . $id); + Logger::log('API: api_statuses_show: ' . $id); $conversation = !empty($_REQUEST['conversation']); @@ -1902,7 +1907,7 @@ function api_conversation_show($type) $id = intval(defaults($a->argv, 4, 0)); } - logger('API: api_conversation_show: '.$id); + Logger::log('API: api_conversation_show: '.$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]); @@ -1973,7 +1978,7 @@ function api_statuses_repeat($type) $id = intval(defaults($a->argv, 4, 0)); } - logger('API: api_statuses_repeat: '.$id); + Logger::log('API: api_statuses_repeat: '.$id); $fields = ['body', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink']; $item = Item::selectFirst($fields, ['id' => $id, 'private' => false]); @@ -1996,14 +2001,14 @@ function api_statuses_repeat($type) $_REQUEST["source"] = api_source(); } - item_post($a); + $item_id = item_post($a); } else { throw new ForbiddenException(); } - // this should output the last post (the one we just posted). + // output the post that we just posted. $called_api = []; - return api_status_show($type); + return api_status_show($type, $item_id); } /// @TODO move to top of file or somewhere better @@ -2038,7 +2043,7 @@ function api_statuses_destroy($type) $id = intval(defaults($a->argv, 4, 0)); } - logger('API: api_statuses_destroy: '.$id); + Logger::log('API: api_statuses_destroy: '.$id); $ret = api_statuses_show($type); @@ -2133,11 +2138,11 @@ function api_statuses_user_timeline($type) throw new ForbiddenException(); } - logger( + Logger::log( "api_statuses_user_timeline: api_user: ". api_user() . "\nuser_info: ".print_r($user_info, true) . "\n_REQUEST: ".print_r($_REQUEST, true), - LOGGER_DEBUG + Logger::DEBUG ); $since_id = x($_REQUEST, 'since_id') ? $_REQUEST['since_id'] : 0; @@ -2290,7 +2295,7 @@ function api_favorites($type) // in friendica starred item are private // return favorites only for self - logger('api_favorites: self:' . $user_info['self']); + Logger::log('api_favorites: self:' . $user_info['self']); if ($user_info['self'] == 0) { $ret = []; @@ -2347,7 +2352,7 @@ function api_format_messages($item, $recipient, $sender) // standard meta information $ret = [ 'id' => $item['id'], - 'sender_id' => $sender['id'] , + 'sender_id' => $sender['id'], 'text' => "", 'recipient_id' => $recipient['id'], 'created_at' => api_date(defaults($item, 'created', DateTimeFormat::utcNow())), @@ -2728,7 +2733,7 @@ function api_contactlink_to_array($txt) * likes => int count, * dislikes => int count */ -function api_format_items_activities(&$item, $type = "json") +function api_format_items_activities($item, $type = "json") { $a = get_app(); @@ -2743,13 +2748,13 @@ function api_format_items_activities(&$item, $type = "json") $condition = ['uid' => $item['uid'], 'thr-parent' => $item['uri']]; $ret = Item::selectForUser($item['uid'], ['author-id', 'verb'], $condition); - while ($item = Item::fetch($ret)) { + while ($parent_item = Item::fetch($ret)) { // not used as result should be structured like other user data //builtin_activity_puller($i, $activities); // get user data and add it to the array of the activity - $user = api_get_user($a, $item['author-id']); - switch ($item['verb']) { + $user = api_get_user($a, $parent_item['author-id']); + switch ($parent_item['verb']) { case ACTIVITY_LIKE: $activities['like'][] = $user; break; @@ -2889,7 +2894,7 @@ function api_format_items($r, $user_info, $filter_user = false, $type = "json") 'in_reply_to_screen_name' => $in_reply_to['screen_name'], $geo => null, 'favorited' => $item['starred'] ? true : false, - 'user' => $status_user , + 'user' => $status_user, 'friendica_owner' => $owner_user, 'friendica_private' => $item['private'] == 1, //'entities' => NULL, @@ -2908,9 +2913,9 @@ function api_format_items($r, $user_info, $filter_user = false, $type = "json") } if ($status["source"] == 'web') { - $status["source"] = ContactSelector::networkToName($item['network'], $user_info['url']); - } elseif (ContactSelector::networkToName($item['network'], $user_info['url']) != $status["source"]) { - $status["source"] = trim($status["source"].' ('.ContactSelector::networkToName($item['network'], $user_info['url']).')'); + $status["source"] = ContactSelector::networkToName($item['network'], $item['author-link']); + } elseif (ContactSelector::networkToName($item['network'], $item['author-link']) != $status["source"]) { + $status["source"] = trim($status["source"].' ('.ContactSelector::networkToName($item['network'], $item['author-link']).')'); } if ($item["id"] == $item["parent"]) { @@ -3340,7 +3345,7 @@ function api_statusnet_config($type) $a = get_app(); $name = Config::get('config', 'sitename'); - $server = $a->get_hostname(); + $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'; @@ -3397,7 +3402,7 @@ api_register_func('api/statusnet/version', 'api_statusnet_version', false); */ function api_ff_ids($type) { - if (! api_user()) { + if (!api_user()) { throw new ForbiddenException(); } @@ -3625,6 +3630,84 @@ function api_direct_messages_destroy($type) /// @TODO move to top of file or somewhere better api_register_func('api/direct_messages/destroy', 'api_direct_messages_destroy', true, API_METHOD_DELETE); +/** + * Unfollow Contact + * + * @brief unfollow contact + * + * @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 + */ +function api_friendships_destroy($type) +{ + $uid = api_user(); + + if ($uid === false) { + throw new ForbiddenException(); + } + + $contact_id = defaults($_REQUEST, 'user_id'); + + if (empty($contact_id)) { + Logger::log("No user_id specified", Logger::DEBUG); + throw new BadRequestException("no user_id specified"); + } + + // Get Contact by given id + $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); + throw new NotFoundException("no contact found to given ID"); + } + + $url = $contact["url"]; + + $condition = ["`uid` = ? AND (`rel` = ? OR `rel` = ?) AND (`nurl` = ? OR `alias` = ? OR `alias` = ?)", + $uid, Contact::SHARING, Contact::FRIEND, normalise_link($url), + normalise_link($url), $url]; + $contact = DBA::selectFirst('contact', [], $condition); + + if (!DBA::isResult($contact)) { + Logger::log("Not following Contact", Logger::DEBUG); + throw new NotFoundException("Not following Contact"); + } + + if (!in_array($contact['network'], Protocol::NATIVE_SUPPORT)) { + Logger::log("Not supported", Logger::DEBUG); + throw new ExpectationFailedException("Not supported"); + } + + $dissolve = ($contact['rel'] == Contact::SHARING); + + $owner = User::getOwnerDataById($uid); + if ($owner) { + Contact::terminateFriendship($owner, $contact, $dissolve); + } + else { + Logger::log("No owner found", Logger::DEBUG); + throw new NotFoundException("Error Processing Request"); + } + + // Sharing-only contacts get deleted as there no relationship any more + if ($dissolve) { + Contact::remove($contact['id']); + } else { + DBA::update('contact', ['rel' => Contact::FOLLOWER], ['id' => $contact['id']]); + } + + // "uid" and "self" are only needed for some internal stuff, so remove it from here + unset($contact["uid"]); + unset($contact["self"]); + + // Set screen_name since Twidere requests it + $contact["screen_name"] = $contact["nick"]; + + return api_format_data("friendships-destroy", $type, ['user' => $contact]); +} +api_register_func('api/friendships/destroy', 'api_friendships_destroy', true, API_METHOD_POST); + /** * * @param string $type Return type (atom, rss, xml, json) @@ -4403,10 +4486,10 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ if ($imagedata) { $filetype = $imagedata['mime']; } - logger( + Logger::log( "File upload src: " . $src . " - filename: " . $filename . " - size: " . $filesize . " - type: " . $filetype, - LOGGER_DEBUG + Logger::DEBUG ); // check if there was a php upload error @@ -4423,7 +4506,7 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ // create Photo instance with the data of the image $imagedata = @file_get_contents($src); $Image = new Image($imagedata, $filetype); - if (! $Image->isValid()) { + if (!$Image->isValid()) { throw new InternalServerErrorException("unable to process image data"); } @@ -4433,12 +4516,12 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ // check max length of images on server $max_length = Config::get('system', 'max_image_length'); - if (! $max_length) { + if (!$max_length) { $max_length = MAX_IMAGE_LENGTH; } if ($max_length > 0) { $Image->scaleDown($max_length); - logger("File upload: Scaling picture to new size " . $max_length, LOGGER_DEBUG); + Logger::log("File upload: Scaling picture to new size " . $max_length, Logger::DEBUG); } $width = $Image->getWidth(); $height = $Image->getHeight(); @@ -4448,57 +4531,57 @@ function save_media_to_database($mediatype, $media, $type, $album, $allow_cid, $ if ($mediatype == "photo") { // upload normal image (scales 0, 1, 2) - logger("photo upload: starting new photo upload", LOGGER_DEBUG); + Logger::log("photo upload: starting new photo upload", Logger::DEBUG); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 0, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); - if (! $r) { - logger("photo upload: image upload with scale 0 (original size) failed"); + if (!$r) { + Logger::log("photo upload: image upload with scale 0 (original size) failed"); } if ($width > 640 || $height > 640) { $Image->scaleDown(640); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 1, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); - if (! $r) { - logger("photo upload: image upload with scale 1 (640x640) failed"); + if (!$r) { + Logger::log("photo upload: image upload with scale 1 (640x640) failed"); } } if ($width > 320 || $height > 320) { $Image->scaleDown(320); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 2, 0, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); - if (! $r) { - logger("photo upload: image upload with scale 2 (320x320) failed"); + if (!$r) { + Logger::log("photo upload: image upload with scale 2 (320x320) failed"); } } - logger("photo upload: new photo upload ended", LOGGER_DEBUG); + Logger::log("photo upload: new photo upload ended", Logger::DEBUG); } elseif ($mediatype == "profileimage") { // upload profile image (scales 4, 5, 6) - logger("photo upload: starting new profile image upload", LOGGER_DEBUG); + Logger::log("photo upload: starting new profile image upload", Logger::DEBUG); - if ($width > 175 || $height > 175) { - $Image->scaleDown(175); + if ($width > 300 || $height > 300) { + $Image->scaleDown(300); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 4, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); - if (! $r) { - logger("photo upload: profile image upload with scale 4 (175x175) failed"); + if (!$r) { + Logger::log("photo upload: profile image upload with scale 4 (300x300) failed"); } } if ($width > 80 || $height > 80) { $Image->scaleDown(80); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 5, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); - if (! $r) { - logger("photo upload: profile image upload with scale 5 (80x80) failed"); + if (!$r) { + Logger::log("photo upload: profile image upload with scale 5 (80x80) failed"); } } if ($width > 48 || $height > 48) { $Image->scaleDown(48); $r = Photo::store($Image, local_user(), $visitor, $hash, $filename, $album, 6, $profile, $allow_cid, $allow_gid, $deny_cid, $deny_gid, $desc); - if (! $r) { - logger("photo upload: profile image upload with scale 6 (48x48) failed"); + if (!$r) { + Logger::log("photo upload: profile image upload with scale 6 (48x48) failed"); } } $Image->__destruct(); - logger("photo upload: new profile image upload ended", LOGGER_DEBUG); + Logger::log("photo upload: new profile image upload ended", Logger::DEBUG); } if (isset($r) && $r) { @@ -4530,7 +4613,7 @@ function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $f $owner_record = DBA::selectFirst('contact', [], ['uid' => api_user(), 'self' => true]); $arr = []; - $arr['guid'] = System::createGUID(32); + $arr['guid'] = System::createUUID(); $arr['uid'] = intval(api_user()); $arr['uri'] = $uri; $arr['parent-uri'] = $uri; @@ -4725,9 +4808,10 @@ function api_friendica_remoteauth() 'sec' => $sec, 'expire' => time() + 45]; DBA::insert('profile_check', $fields); - logger($contact['name'] . ' ' . $sec, LOGGER_DEBUG); + Logger::log($contact['name'] . ' ' . $sec, Logger::DEBUG); $dest = ($url ? '&destination_url=' . $url : ''); - goaway( + + System::externalRedirect( $contact['poll'] . '?dfrn_id=' . $dfrn_id . '&dfrn_version=' . DFRN_PROTOCOL_VERSION . '&type=profile&sec=' . $sec . $dest @@ -4745,77 +4829,86 @@ function api_share_as_retweet(&$item) { $body = trim($item["body"]); - if (Diaspora::isReshare($body, false)===false) { - return false; + if (Diaspora::isReshare($body, false) === false) { + if ($item['author-id'] == $item['owner-id']) { + return false; + } else { + // Reshares from OStatus, ActivityPub and Twitter + $reshared_item = $item; + $reshared_item['owner-id'] = $reshared_item['author-id']; + $reshared_item['owner-link'] = $reshared_item['author-link']; + $reshared_item['owner-name'] = $reshared_item['author-name']; + $reshared_item['owner-avatar'] = $reshared_item['author-avatar']; + return $reshared_item; + } } /// @TODO "$1" should maybe mean '$1' ? $attributes = preg_replace("/\[share(.*?)\]\s?(.*?)\s?\[\/share\]\s?/ism", "$1", $body); /* - * Skip if there is no shared message in there - * we already checked this in diaspora::isReshare() - * but better one more than one less... - */ - if ($body == $attributes) { + * Skip if there is no shared message in there + * we already checked this in diaspora::isReshare() + * but better one more than one less... + */ + if (($body == $attributes) || empty($attributes)) { return false; } - // build the fake reshared item $reshared_item = $item; $author = ""; preg_match("/author='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $author = html_entity_decode($matches[1], ENT_QUOTES, 'UTF-8'); } preg_match('/author="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $author = $matches[1]; } $profile = ""; preg_match("/profile='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $profile = $matches[1]; } preg_match('/profile="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $profile = $matches[1]; } $avatar = ""; preg_match("/avatar='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $avatar = $matches[1]; } preg_match('/avatar="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $avatar = $matches[1]; } $link = ""; preg_match("/link='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $link = $matches[1]; } preg_match('/link="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $link = $matches[1]; } $posted = ""; preg_match("/posted='(.*?)'/ism", $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $posted = $matches[1]; } preg_match('/posted="(.*?)"/ism', $attributes, $matches); - if ($matches[1] != "") { + if (!empty($matches[1])) { $posted = $matches[1]; } @@ -4963,7 +5056,7 @@ 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'])) { - logger('this message should never appear: id: '.$item['id'].' similar to reply-to: '.$in_reply_to['status_id'], LOGGER_DEBUG); + Logger::log('this message should never appear: id: '.$item['id'].' similar to reply-to: '.$in_reply_to['status_id'], Logger::DEBUG); $in_reply_to['status_id'] = null; $in_reply_to['user_id'] = null; $in_reply_to['status_id_str'] = null;