Merge pull request #10527 from annando/api

API: Support for deprecated API endpoints and OAuth removal
This commit is contained in:
Hypolite Petovan 2021-07-20 21:50:54 -04:00 committed by GitHub
commit 1e6031fc23
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
13 changed files with 75 additions and 58 deletions

View file

@ -2,6 +2,7 @@ Version 2021.09 (unreleased)
Friendica Core
Simplified the proxy mechanism. The proxy cache directory (/proxy) can now be removed [annando]
DFRN is now always handled with the Diaspora transport layer. The legacy DFRN transport layer is removed [annando]
Legacy OAuth server is removed [annando]
Version 2021.07 (2021-07-04)
Friendica Core

View file

@ -30,8 +30,6 @@ These endpoints use the [Friendica API entities](help/API-Entities).
- POST api/friendships/destroy
- GET api/friends/ids
- GET/POST api/help/test
- POST api/oauth/access_token
- POST api/oauth/request_token
- GET api/search
- GET api/statuses/show/:id
- POST api/statuses/destroy/:id
@ -67,6 +65,8 @@ These endpoints use the [Friendica API entities](help/API-Entities).
- blocks/exists
- blocks/blocking
- oauth/authorize
- oauth/access_token
- oauth/request_token
- statusnet/groups/timeline
- statusnet/groups/show
- statusnet/groups/create

View file

@ -93,9 +93,11 @@ These endpoints use the [Mastodon API entities](https://docs.joinmastodon.org/en
- [`POST /api/v1/notifications/clear`](https://docs.joinmastodon.org/methods/notifications/)
- [`POST /api/v1/notifications/:id/dismiss`](https://docs.joinmastodon.org/methods/notifications/)
- [`GET /api/v1/preferences`](https://docs.joinmastodon.org/methods/accounts/preferences/)
- [`GET /api/v1/search`](https://docs.joinmastodon.org/methods/search/)
- [`POST /api/v1/statuses`](https://docs.joinmastodon.org/methods/statuses/)
- [`GET /api/v1/statuses/:id`](https://docs.joinmastodon.org/methods/statuses/)
- [`DELETE /api/v1/statuses/:id`](https://docs.joinmastodon.org/methods/statuses/)
- [`GET /api/v1/statuses/:id/card`](https://docs.joinmastodon.org/methods/statuses/)
- [`GET /api/v1/statuses/:id/context`](https://docs.joinmastodon.org/methods/statuses/)
- [`GET /api/v1/statuses/:id/reblogged_by`](https://docs.joinmastodon.org/methods/statuses/)
- [`GET /api/v1/statuses/:id/favourited_by`](https://docs.joinmastodon.org/methods/statuses/)

View file

@ -619,10 +619,6 @@ Here is a complete list of all hook callbacks with file locations (as of 24-Sep-
Hook::callAll('jot_tool', $jotplugins);
### src/Network/FKOAuth1.php
Hook::callAll('logged_in', $a->user);
### src/Render/FriendicaSmartyEngine.php
Hook::callAll("template_vars", $arr);

View file

@ -20,9 +20,7 @@ Using an invalid method results in HTTP error 405 "Method Not Allowed".
### Authentication
Friendica supports basic HTTP Auth and OAuth 1 to authenticate the user to the APIs.
OAuth settings can be added by the user in web UI under [/settings/oauth/](/settings/oauth/).
Friendica supports basic HTTP Auth and OAuth to authenticate the user to the APIs.
### Errors

View file

@ -174,7 +174,7 @@ function api_register_func($path, $func, $auth = false, $method = API_METHOD_ANY
}
/**
* Log in user via OAuth1 or Simple HTTP Auth.
* Log in user via Simple HTTP Auth.
* Simple Auth allow username in form of <pre>user@server</pre>, ignoring server part
*
* @param App $a App

View file

@ -79,7 +79,7 @@ class Status extends BaseFactory
'thr-parent-id', 'parent-author-id', 'language', 'uri', 'plink', 'private', 'vid', 'gravity'];
$item = Post::selectFirst($fields, ['uri-id' => $uriId, 'uid' => [0, $uid]], ['order' => ['uid' => true]]);
if (!$item) {
throw new HTTPException\NotFoundException('Item with URI ID ' . $uriId . 'not found' . ($uid ? ' for user ' . $uid : '.'));
throw new HTTPException\NotFoundException('Item with URI ID ' . $uriId . ' not found' . ($uid ? ' for user ' . $uid : '.'));
}
$account = $this->mstdnAccountFactory->createFromContactId($item['author-id']);

View file

@ -58,7 +58,7 @@ class Search extends BaseApi
'offset' => 0, // Offset in search results. Used for pagination. Defaults to 0.
'following' => false, // Only include accounts that the user is following. Defaults to false.
]);
if (empty($request['q'])) {
DI::mstdnError()->UnprocessableEntity();
}
@ -74,7 +74,7 @@ class Search extends BaseApi
$result['statuses'] = self::searchStatuses($uid, $request['q'], $request['account_id'], $request['max_id'], $request['min_id'], $limit, $request['offset']);
}
if ((empty($request['type']) || ($request['type'] == 'hashtags')) && (strpos($request['q'], '@') == false)) {
$result['hashtags'] = self::searchHashtags($request['q'], $request['exclude_unreviewed'], $limit, $request['offset']);
$result['hashtags'] = self::searchHashtags($request['q'], $request['exclude_unreviewed'], $limit, $request['offset'], $parameters['version']);
}
System::jsonExit($result);
@ -175,7 +175,7 @@ class Search extends BaseApi
return $statuses;
}
private static function searchHashtags(string $q, bool $exclude_unreviewed, int $limit, int $offset)
private static function searchHashtags(string $q, bool $exclude_unreviewed, int $limit, int $offset, int $version)
{
$q = ltrim($q, '#');
@ -187,7 +187,11 @@ class Search extends BaseApi
$hashtags = [];
foreach ($tags as $tag) {
$hashtags[] = new \Friendica\Object\Api\Mastodon\Tag(DI::baseUrl(), $tag);
if ($version == 1) {
$hashtags[] = $tag['name'];
} else {
$hashtags[] = new \Friendica\Object\Api\Mastodon\Tag(DI::baseUrl(), $tag);
}
}
return $hashtags;

View file

@ -0,0 +1,57 @@
<?php
/**
* @copyright Copyright (C) 2010-2021, the Friendica project
*
* @license GNU AGPL version 3 or any later version
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <https://www.gnu.org/licenses/>.
*
*/
namespace Friendica\Module\Api\Mastodon\Statuses;
use Friendica\Core\System;
use Friendica\DI;
use Friendica\Model\Post;
use Friendica\Module\BaseApi;
use Friendica\Network\HTTPException;
/**
* @see https://docs.joinmastodon.org/methods/statuses/
*/
class Card extends BaseApi
{
/**
* @param array $parameters
* @throws \Friendica\Network\HTTPException\InternalServerErrorException
*/
public static function rawContent(array $parameters = [])
{
$uid = self::getCurrentUserID();
if (empty($parameters['id'])) {
DI::mstdnError()->UnprocessableEntity();
}
$id = $parameters['id'];
if (!Post::exists(['uri-id' => $id, 'uid' => [0, $uid]])) {
throw new HTTPException\NotFoundException('Item with URI ID ' . $id . ' not found' . ($uid ? ' for user ' . $uid : '.'));
}
$card = DI::mstdnCard()->createFromUriId($id);
System::jsonExit($card->toArray());
}
}

View file

@ -131,6 +131,7 @@ return [
'/scheduled_statuses/{id:\d+}' => [Module\Api\Mastodon\Unimplemented::class, [R::GET, R::PUT, R::DELETE]], // not supported
'/statuses' => [Module\Api\Mastodon\Statuses::class, [ R::POST]],
'/statuses/{id:\d+}' => [Module\Api\Mastodon\Statuses::class, [R::GET, R::DELETE]],
'/statuses/{id:\d+}/card' => [Module\Api\Mastodon\Statuses\Card::class, [R::GET ]],
'/statuses/{id:\d+}/context' => [Module\Api\Mastodon\Statuses\Context::class, [R::GET ]],
'/statuses/{id:\d+}/reblogged_by' => [Module\Api\Mastodon\Statuses\RebloggedBy::class, [R::GET ]],
'/statuses/{id:\d+}/favourited_by' => [Module\Api\Mastodon\Statuses\FavouritedBy::class, [R::GET ]],
@ -154,7 +155,7 @@ return [
'/timelines/tag/{hashtag}' => [Module\Api\Mastodon\Timelines\Tag::class, [R::GET ]],
'/trends' => [Module\Api\Mastodon\Trends::class, [R::GET ]],
],
'/v2' => [
'/v{version:\d+}' => [
'/search' => [Module\Api\Mastodon\Search::class, [R::GET ]],
],
'/friendica' => [

View file

@ -1,5 +0,0 @@
<h1>{{$title}}</h1>
<p>{{$info}}</p>
<code>{{$code}}</code>

View file

@ -1,18 +0,0 @@
<h1>{{$title}}</h1>
<form method="POST">
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
{{include file="field_input.tpl" field=$name}}
{{include file="field_input.tpl" field=$key}}
{{include file="field_input.tpl" field=$secret}}
{{include file="field_input.tpl" field=$redirect}}
{{include file="field_input.tpl" field=$icon}}
<div class="settings-submit-wrapper">
<input type="submit" name="submit" class="settings-submit" value="{{$submit}}" />
<!-- <input type="submit" name="cancel" class="settings-submit" value="{{$cancel}}" /> -->
</div>
</form>

View file

@ -1,19 +0,0 @@
<div class="generic-page-wrapper">
<h2 class="heading">{{$title}}</h2>
<form method="POST">
<input type='hidden' name='form_security_token' value='{{$form_security_token}}'>
{{include file="field_input.tpl" field=$name}}
{{include file="field_input.tpl" field=$key}}
{{include file="field_input.tpl" field=$secret}}
{{include file="field_input.tpl" field=$redirect}}
{{include file="field_input.tpl" field=$icon}}
<div class="form-group pull-right settings-submit-wrapper">
<button type="submit" name="submit" class="btn btn-primary" value="{{$submit}}">{{$submit}}</button>
</div>
<div class="clear"></div>
</form>
</div>