From 222b35684d4da5345f153f975cb15afe8579aa55 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 28 Nov 2021 13:34:00 +0000 Subject: [PATCH 01/20] API: Added more functions, fixed function names --- include/api.php | 265 ------------------ src/Module/Api/Friendica/Activity.php | 2 +- .../Api/Friendica/DirectMessages/Setseen.php | 2 +- src/Module/Api/Friendica/Group/Delete.php | 2 +- src/Module/Api/Friendica/Group/Update.php | 2 +- .../Api/Friendica/Notification/Seen.php | 2 +- src/Module/Api/Friendica/Photo/Delete.php | 2 +- .../Api/Friendica/Photoalbum/Delete.php | 2 +- .../Api/Friendica/Photoalbum/Update.php | 2 +- src/Module/Api/Twitter/Favorites/Create.php | 2 +- src/Module/Api/Twitter/Favorites/Destroy.php | 2 +- .../Api/Twitter/Friendships/Destroy.php | 2 +- .../Api/Twitter/Media/Metadata/Create.php | 2 +- src/Module/Api/Twitter/Media/Upload.php | 2 +- src/Module/Api/Twitter/Statuses/Destroy.php | 2 +- src/Module/Api/Twitter/Statuses/Retweet.php | 97 +++++++ src/Module/Api/Twitter/Statuses/Update.php | 188 +++++++++++++ static/routes.config.php | 10 +- tests/legacy/ApiTest.php | 30 +- 19 files changed, 322 insertions(+), 296 deletions(-) create mode 100644 src/Module/Api/Twitter/Statuses/Retweet.php create mode 100644 src/Module/Api/Twitter/Statuses/Update.php diff --git a/include/api.php b/include/api.php index 4f7040ab4b..5bec76554f 100644 --- a/include/api.php +++ b/include/api.php @@ -44,7 +44,6 @@ use Friendica\Network\HTTPException\BadRequestException; use Friendica\Network\HTTPException\ForbiddenException; use Friendica\Network\HTTPException\InternalServerErrorException; use Friendica\Network\HTTPException\NotFoundException; -use Friendica\Network\HTTPException\TooManyRequestsException; use Friendica\Network\HTTPException\UnauthorizedException; use Friendica\Object\Image; use Friendica\Util\DateTimeFormat; @@ -646,270 +645,6 @@ function group_create($name, $uid, $users = []) * TWITTER API */ -/** - * Updates the user’s current status. - * - * @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) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); - $uid = BaseApi::getCurrentUserID(); - - $a = DI::app(); - - // convert $_POST array items to the form we use for web posts. - if (!empty($_REQUEST['htmlstatus'])) { - $txt = $_REQUEST['htmlstatus']; - if ((strpos($txt, '<') !== false) || (strpos($txt, '>') !== false)) { - $txt = HTML::toBBCodeVideo($txt); - - $config = HTMLPurifier_Config::createDefault(); - $config->set('Cache.DefinitionImpl', null); - - $purifier = new HTMLPurifier($config); - $txt = $purifier->purify($txt); - - $_REQUEST['body'] = HTML::toBBCode($txt); - } - } else { - $_REQUEST['body'] = $_REQUEST['status'] ?? null; - } - - $_REQUEST['title'] = $_REQUEST['title'] ?? null; - - $parent = $_REQUEST['in_reply_to_status_id'] ?? null; - - // Twidere sends "-1" if it is no reply ... - if ($parent == -1) { - $parent = ""; - } - - if (ctype_digit($parent)) { - $_REQUEST['parent'] = $parent; - } else { - $_REQUEST['parent_uri'] = $parent; - } - - if (!empty($_REQUEST['lat']) && !empty($_REQUEST['long'])) { - $_REQUEST['coord'] = sprintf("%s %s", $_REQUEST['lat'], $_REQUEST['long']); - } - $_REQUEST['profile_uid'] = $uid; - - if (!$parent) { - // Check for throttling (maximum posts per day, week and month) - $throttle_day = DI::config()->get('system', 'throttle_limit_day'); - if ($throttle_day > 0) { - $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60); - - $condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom]; - $posts_day = Post::count($condition); - - if ($posts_day > $throttle_day) { - logger::info('Daily posting limit reached for user ' . $uid); - // die(api_error($type, DI::l10n()->t("Daily posting limit of %d posts reached. The post was rejected.", $throttle_day)); - throw new TooManyRequestsException(DI::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)); - } - } - - $throttle_week = DI::config()->get('system', 'throttle_limit_week'); - if ($throttle_week > 0) { - $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*7); - - $condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom]; - $posts_week = Post::count($condition); - - if ($posts_week > $throttle_week) { - logger::info('Weekly posting limit reached for user ' . $uid); - // die(api_error($type, DI::l10n()->t("Weekly posting limit of %d posts reached. The post was rejected.", $throttle_week))); - throw new TooManyRequestsException(DI::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)); - } - } - - $throttle_month = DI::config()->get('system', 'throttle_limit_month'); - if ($throttle_month > 0) { - $datefrom = date(DateTimeFormat::MYSQL, time() - 24*60*60*30); - - $condition = ["`gravity` = ? AND `uid` = ? AND `wall` AND `received` > ?", GRAVITY_PARENT, $uid, $datefrom]; - $posts_month = Post::count($condition); - - if ($posts_month > $throttle_month) { - logger::info('Monthly posting limit reached for user ' . $uid); - // die(api_error($type, DI::l10n()->t("Monthly posting limit of %d posts reached. The post was rejected.", $throttle_month)); - throw new TooManyRequestsException(DI::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)); - } - } - } - - if (!empty($_REQUEST['media_ids'])) { - $ids = explode(',', $_REQUEST['media_ids']); - } elseif (!empty($_FILES['media'])) { - // upload the image if we have one - $picture = Photo::upload($uid, $_FILES['media']); - if (is_array($picture)) { - $ids[] = $picture['id']; - } - } - - $attachments = []; - $ressources = []; - - if (!empty($ids)) { - foreach ($ids as $id) { - $media = DBA::toArray(DBA::p("SELECT `resource-id`, `scale`, `nickname`, `type`, `desc`, `filename`, `datasize`, `width`, `height` FROM `photo` - INNER JOIN `user` ON `user`.`uid` = `photo`.`uid` WHERE `resource-id` IN - (SELECT `resource-id` FROM `photo` WHERE `id` = ?) AND `photo`.`uid` = ? - ORDER BY `photo`.`width` DESC LIMIT 2", $id, $uid)); - - if (!empty($media)) { - $ressources[] = $media[0]['resource-id']; - $phototypes = Images::supportedTypes(); - $ext = $phototypes[$media[0]['type']]; - - $attachment = ['type' => Post\Media::IMAGE, 'mimetype' => $media[0]['type'], - 'url' => DI::baseUrl() . '/photo/' . $media[0]['resource-id'] . '-' . $media[0]['scale'] . '.' . $ext, - 'size' => $media[0]['datasize'], - 'name' => $media[0]['filename'] ?: $media[0]['resource-id'], - 'description' => $media[0]['desc'] ?? '', - 'width' => $media[0]['width'], - 'height' => $media[0]['height']]; - - if (count($media) > 1) { - $attachment['preview'] = DI::baseUrl() . '/photo/' . $media[1]['resource-id'] . '-' . $media[1]['scale'] . '.' . $ext; - $attachment['preview-width'] = $media[1]['width']; - $attachment['preview-height'] = $media[1]['height']; - } - $attachments[] = $attachment; - } - } - - // We have to avoid that the post is rejected because of an empty body - if (empty($_REQUEST['body'])) { - $_REQUEST['body'] = '[hr]'; - } - } - - if (!empty($attachments)) { - $_REQUEST['attachments'] = $attachments; - } - - // set this so that the item_post() function is quiet and doesn't redirect or emit json - - $_REQUEST['api_source'] = true; - - if (empty($_REQUEST['source'])) { - $_REQUEST['source'] = BaseApi::getCurrentApplication()['name'] ?: 'API'; - } - - // call out normal post function - $item_id = item_post($a); - - if (!empty($ressources) && !empty($item_id)) { - $item = Post::selectFirst(['uri-id', 'allow_cid', 'allow_gid', 'deny_cid', 'deny_gid'], ['id' => $item_id]); - foreach ($ressources as $ressource) { - Photo::setPermissionForRessource($ressource, $uid, $item['allow_cid'], $item['allow_gid'], $item['deny_cid'], $item['deny_gid']); - } - } - - $include_entities = strtolower(($_REQUEST['include_entities'] ?? 'false') == 'true'); - - // output the post that we just posted. - $status_info = DI::twitterStatus()->createFromItemId($item_id, $uid, $include_entities)->toArray(); - return DI::apiResponse()->formatData('statuses', $type, ['status' => $status_info]); -} - -api_register_func('api/statuses/update', 'api_statuses_update', true); -api_register_func('api/statuses/update_with_media', 'api_statuses_update', true); -api_register_func('api/statuses/mediap', 'api_statuses_update', true); - -/** - * Repeats a status. - * - * @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) -{ - BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); - $uid = BaseApi::getCurrentUserID(); - - // params - $id = intval(DI::args()->getArgv()[3] ?? 0); - - if ($id == 0) { - $id = intval($_REQUEST['id'] ?? 0); - } - - // Hotot workaround - if ($id == 0) { - $id = intval(DI::args()->getArgv()[4] ?? 0); - } - - logger::notice('API: api_statuses_repeat: ' . $id); - - $fields = ['uri-id', 'network', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink']; - $item = Post::selectFirst($fields, ['id' => $id, 'private' => [Item::PUBLIC, Item::UNLISTED]]); - - if (DBA::isResult($item) && !empty($item['body'])) { - if (in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::TWITTER])) { - if (!Item::performActivity($id, 'announce', $uid)) { - throw new InternalServerErrorException(); - } - - $item_id = $id; - } else { - if (strpos($item['body'], "[/share]") !== false) { - $pos = strpos($item['body'], "[share"); - $post = substr($item['body'], $pos); - } else { - $post = BBCode::getShareOpeningTag($item['author-name'], $item['author-link'], $item['author-avatar'], $item['plink'], $item['created'], $item['guid']); - - if (!empty($item['title'])) { - $post .= '[h3]' . $item['title'] . "[/h3]\n"; - } - - $post .= $item['body']; - $post .= "[/share]"; - } - $_REQUEST['body'] = $post; - $_REQUEST['profile_uid'] = $uid; - $_REQUEST['api_source'] = true; - - if (empty($_REQUEST['source'])) { - $_REQUEST['source'] = BaseApi::getCurrentApplication()['name'] ?: 'API'; - } - - $item_id = item_post(DI::app()); - } - } else { - throw new ForbiddenException(); - } - - $include_entities = strtolower(($_REQUEST['include_entities'] ?? 'false') == 'true'); - - // output the post that we just posted. - $status_info = DI::twitterStatus()->createFromItemId($item_id, $uid, $include_entities)->toArray(); - return DI::apiResponse()->formatData('statuses', $type, ['status' => $status_info]); -} - -api_register_func('api/statuses/retweet', 'api_statuses_repeat', true); - /** * Returns all lists the user subscribes to. * diff --git a/src/Module/Api/Friendica/Activity.php b/src/Module/Api/Friendica/Activity.php index 070dc452ca..b765a727fc 100644 --- a/src/Module/Api/Friendica/Activity.php +++ b/src/Module/Api/Friendica/Activity.php @@ -40,7 +40,7 @@ use Friendica\Module\BaseApi; */ class Activity extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/DirectMessages/Setseen.php b/src/Module/Api/Friendica/DirectMessages/Setseen.php index a6a4875b83..f3eeacaa40 100644 --- a/src/Module/Api/Friendica/DirectMessages/Setseen.php +++ b/src/Module/Api/Friendica/DirectMessages/Setseen.php @@ -30,7 +30,7 @@ use Friendica\Module\BaseApi; */ class Setseen extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Group/Delete.php b/src/Module/Api/Friendica/Group/Delete.php index ef38d93646..8491403b5d 100644 --- a/src/Module/Api/Friendica/Group/Delete.php +++ b/src/Module/Api/Friendica/Group/Delete.php @@ -32,7 +32,7 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Delete extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Group/Update.php b/src/Module/Api/Friendica/Group/Update.php index c8d353e2b8..5d14e433be 100644 --- a/src/Module/Api/Friendica/Group/Update.php +++ b/src/Module/Api/Friendica/Group/Update.php @@ -33,7 +33,7 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Update extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Notification/Seen.php b/src/Module/Api/Friendica/Notification/Seen.php index 92039be145..396779bc38 100644 --- a/src/Module/Api/Friendica/Notification/Seen.php +++ b/src/Module/Api/Friendica/Notification/Seen.php @@ -38,7 +38,7 @@ use Friendica\Network\HTTPException\NotFoundException; */ class Seen extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Photo/Delete.php b/src/Module/Api/Friendica/Photo/Delete.php index 1857de5c71..27112ea7d9 100644 --- a/src/Module/Api/Friendica/Photo/Delete.php +++ b/src/Module/Api/Friendica/Photo/Delete.php @@ -33,7 +33,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Delete extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Photoalbum/Delete.php b/src/Module/Api/Friendica/Photoalbum/Delete.php index 2d71e35812..8c277d39eb 100644 --- a/src/Module/Api/Friendica/Photoalbum/Delete.php +++ b/src/Module/Api/Friendica/Photoalbum/Delete.php @@ -34,7 +34,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Delete extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Photoalbum/Update.php b/src/Module/Api/Friendica/Photoalbum/Update.php index 2c1e5e8786..1ee2be4388 100644 --- a/src/Module/Api/Friendica/Photoalbum/Update.php +++ b/src/Module/Api/Friendica/Photoalbum/Update.php @@ -32,7 +32,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Update extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Favorites/Create.php b/src/Module/Api/Twitter/Favorites/Create.php index 74fb722377..8f0c3a463a 100644 --- a/src/Module/Api/Twitter/Favorites/Create.php +++ b/src/Module/Api/Twitter/Favorites/Create.php @@ -31,7 +31,7 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Create extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Favorites/Destroy.php b/src/Module/Api/Twitter/Favorites/Destroy.php index 6c797d8b50..ad53d6e31a 100644 --- a/src/Module/Api/Twitter/Favorites/Destroy.php +++ b/src/Module/Api/Twitter/Favorites/Destroy.php @@ -31,7 +31,7 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Destroy extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Friendships/Destroy.php b/src/Module/Api/Twitter/Friendships/Destroy.php index ef8ad71e8e..e94969c351 100644 --- a/src/Module/Api/Twitter/Friendships/Destroy.php +++ b/src/Module/Api/Twitter/Friendships/Destroy.php @@ -37,7 +37,7 @@ use Friendica\Network\HTTPException; */ class Destroy extends ContactEndpoint { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Media/Metadata/Create.php b/src/Module/Api/Twitter/Media/Metadata/Create.php index d9dc77c3d2..9c59116110 100644 --- a/src/Module/Api/Twitter/Media/Metadata/Create.php +++ b/src/Module/Api/Twitter/Media/Metadata/Create.php @@ -34,7 +34,7 @@ use Friendica\Util\Network; */ class Create extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Media/Upload.php b/src/Module/Api/Twitter/Media/Upload.php index 48538a3313..a4e4759896 100644 --- a/src/Module/Api/Twitter/Media/Upload.php +++ b/src/Module/Api/Twitter/Media/Upload.php @@ -35,7 +35,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Upload extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Statuses/Destroy.php b/src/Module/Api/Twitter/Statuses/Destroy.php index 5a4bc920ed..0106e6ea0e 100644 --- a/src/Module/Api/Twitter/Statuses/Destroy.php +++ b/src/Module/Api/Twitter/Statuses/Destroy.php @@ -34,7 +34,7 @@ use Friendica\Model\Item; */ class Destroy extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Statuses/Retweet.php b/src/Module/Api/Twitter/Statuses/Retweet.php new file mode 100644 index 0000000000..71ce6ed4ba --- /dev/null +++ b/src/Module/Api/Twitter/Statuses/Retweet.php @@ -0,0 +1,97 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\Statuses; + +use Friendica\Content\Text\BBCode; +use Friendica\Core\Protocol; +use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Model\Item; +use Friendica\Model\Post; +use Friendica\Module\BaseApi; +use Friendica\Network\HTTPException\BadRequestException; +use Friendica\Network\HTTPException\ForbiddenException; +use Friendica\Network\HTTPException\InternalServerErrorException; + +/** + * Repeats a status. + * + * @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-retweet-id + */ +class Retweet extends BaseApi +{ + protected function post(array $request = [], array $post = []) + { + self::checkAllowedScope(self::SCOPE_WRITE); + $uid = self::getCurrentUserID(); + + $id = $request['id'] ?? 0; + + if (empty($id)) { + throw new BadRequestException('Item id not specified'); + } + + $fields = ['uri-id', 'network', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink']; + $item = Post::selectFirst($fields, ['id' => $id, 'private' => [Item::PUBLIC, Item::UNLISTED]]); + + if (DBA::isResult($item) && !empty($item['body'])) { + if (in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::TWITTER])) { + if (!Item::performActivity($id, 'announce', $uid)) { + throw new InternalServerErrorException(); + } + + $item_id = $id; + } else { + if (strpos($item['body'], "[/share]") !== false) { + $pos = strpos($item['body'], "[share"); + $post = substr($item['body'], $pos); + } else { + $post = BBCode::getShareOpeningTag($item['author-name'], $item['author-link'], $item['author-avatar'], $item['plink'], $item['created'], $item['guid']); + + if (!empty($item['title'])) { + $post .= '[h3]' . $item['title'] . "[/h3]\n"; + } + + $post .= $item['body']; + $post .= "[/share]"; + } + $item = [ + 'uid' => $uid, + 'body' => $post, + 'app' => $request['source'] ?? '', + ]; + + if (empty($item['app']) && !empty(self::getCurrentApplication()['name'])) { + $item['app'] = self::getCurrentApplication()['name']; + } + + $item_id = Item::insert($item, true); + } + } else { + throw new ForbiddenException(); + } + + $status_info = DI::twitterStatus()->createFromItemId($item_id, $uid)->toArray(); + + DI::apiResponse()->exit('status', ['status' => $status_info], $this->parameters['extension'] ?? null); + } +} diff --git a/src/Module/Api/Twitter/Statuses/Update.php b/src/Module/Api/Twitter/Statuses/Update.php new file mode 100644 index 0000000000..3618d9233c --- /dev/null +++ b/src/Module/Api/Twitter/Statuses/Update.php @@ -0,0 +1,188 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\Statuses; + +use Friendica\Content\Text\BBCode; +use Friendica\Content\Text\HTML; +use Friendica\Content\Text\Markdown; +use Friendica\Core\Logger; +use Friendica\Core\System; +use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Model\Contact; +use Friendica\Model\Item; +use Friendica\Model\Photo; +use Friendica\Model\Post; +use Friendica\Model\User; +use Friendica\Module\BaseApi; +use Friendica\Protocol\Activity; +use Friendica\Util\Images; +use HTMLPurifier; +use HTMLPurifier_Config; + +/** + * Updates the user’s current status. + * + * @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-update +*/ +class Update extends BaseApi +{ + public function post(array $request = [], array $post = []) + { + self::checkAllowedScope(self::SCOPE_WRITE); + $uid = self::getCurrentUserID(); + + $request = self::getRequest([ + 'htmlstatus' => '', + 'status' => '', + 'title' => '', + 'in_reply_to_status_id' => 0, + 'lat' => 0, + 'long' => 0, + 'media_ids' => [], + 'source' => '', + 'include_entities' => false, + ], $request); + + $owner = User::getOwnerDataById($uid); + + if (!empty($request['htmlstatus'])) { + $body = HTML::toBBCodeVideo($request['htmlstatus']); + + $config = HTMLPurifier_Config::createDefault(); + $config->set('Cache.DefinitionImpl', null); + + $purifier = new HTMLPurifier($config); + $body = $purifier->purify($body); + + $body = HTML::toBBCode($request['htmlstatus']); + } else { + // The imput is defined as text. So we can use Markdown for some enhancements + $body = Markdown::toBBCode($request['status']); + } + + // Avoids potential double expansion of existing links + $body = BBCode::performWithEscapedTags($body, ['url'], function ($body) { + return BBCode::expandTags($body); + }); + + $item = []; + $item['uid'] = $uid; + $item['verb'] = Activity::POST; + $item['contact-id'] = $owner['id']; + $item['author-id'] = $item['owner-id'] = Contact::getPublicIdByUserId($uid); + $item['title'] = $request['title']; + $item['body'] = $body; + $item['app'] = $request['source']; + + if (empty($item['app']) && !empty(self::getCurrentApplication()['name'])) { + $item['app'] = self::getCurrentApplication()['name']; + } + + if (!empty($request['lat']) && !empty($request['long'])) { + $item['coord'] = sprintf("%s %s", $request['lat'], $request['long']); + } + + $item['allow_cid'] = $owner['allow_cid']; + $item['allow_gid'] = $owner['allow_gid']; + $item['deny_cid'] = $owner['deny_cid']; + $item['deny_gid'] = $owner['deny_gid']; + + if (!empty($item['allow_cid'] . $item['allow_gid'] . $item['deny_cid'] . $item['deny_gid'])) { + $item['private'] = Item::PRIVATE; + } elseif (DI::pConfig()->get($uid, 'system', 'unlisted')) { + $item['private'] = Item::UNLISTED; + } else { + $item['private'] = Item::PUBLIC; + } + + if ($request['in_reply_to_status_id']) { + $parent = Post::selectFirst(['uri'], ['id' => $request['in_reply_to_status_id'], 'uid' => [0, $uid]]); + $item['thr-parent'] = $parent['uri']; + $item['gravity'] = GRAVITY_COMMENT; + $item['object-type'] = Activity\ObjectType::COMMENT; + } else { + self::checkThrottleLimit(); + + $item['gravity'] = GRAVITY_PARENT; + $item['object-type'] = Activity\ObjectType::NOTE; + } + + $ids = $request['media_ids']; + + if (!empty($_FILES['media'])) { + // upload the image if we have one + $picture = Photo::upload($uid, $_FILES['media']); + if (!empty($picture)) { + $ids[] = $picture['id']; + } + } + + if (!empty($ids)) { + $item['object-type'] = Activity\ObjectType::IMAGE; + $item['post-type'] = Item::PT_IMAGE; + $item['attachments'] = []; + + foreach ($ids as $id) { + $media = DBA::toArray(DBA::p("SELECT `resource-id`, `scale`, `type`, `desc`, `filename`, `datasize`, `width`, `height` FROM `photo` + WHERE `resource-id` IN (SELECT `resource-id` FROM `photo` WHERE `id` = ?) AND `photo`.`uid` = ? + ORDER BY `photo`.`width` DESC LIMIT 2", $id, $uid)); + + if (empty($media)) { + continue; + } + + Photo::setPermissionForRessource($media[0]['resource-id'], $uid, $item['allow_cid'], $item['allow_gid'], $item['deny_cid'], $item['deny_gid']); + + $ressources[] = $media[0]['resource-id']; + $phototypes = Images::supportedTypes(); + $ext = $phototypes[$media[0]['type']]; + + $attachment = ['type' => Post\Media::IMAGE, 'mimetype' => $media[0]['type'], + 'url' => DI::baseUrl() . '/photo/' . $media[0]['resource-id'] . '-' . $media[0]['scale'] . '.' . $ext, + 'size' => $media[0]['datasize'], + 'name' => $media[0]['filename'] ?: $media[0]['resource-id'], + 'description' => $media[0]['desc'] ?? '', + 'width' => $media[0]['width'], + 'height' => $media[0]['height']]; + + if (count($media) > 1) { + $attachment['preview'] = DI::baseUrl() . '/photo/' . $media[1]['resource-id'] . '-' . $media[1]['scale'] . '.' . $ext; + $attachment['preview-width'] = $media[1]['width']; + $attachment['preview-height'] = $media[1]['height']; + } + $item['attachments'][] = $attachment; + } + } + + $id = Item::insert($item, true); + if (!empty($id)) { + $item = Post::selectFirst(['uri-id'], ['id' => $id]); + if (!empty($item['uri-id'])) { + // output the post that we just posted. + $status_info = DI::twitterStatus()->createFromUriId($item['uri-id'], $uid, $request['include_entities'])->toArray(); + DI::apiResponse()->exit('status', ['status' => $status_info], $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); + } + } + DI::mstdnError()->InternalError(); + } +} diff --git a/static/routes.config.php b/static/routes.config.php index c0d327b5c8..f2c3ca4612 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -118,22 +118,22 @@ $apiRoutes = [ '/statusnet/version[.{extension:json|xml|rss|atom}]' => [Module\Api\GNUSocial\GNUSocial\Version::class, [R::GET ]], '/statuses' => [ - '/destroy[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [ R::POST]], + '/destroy[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Destroy::class, [ R::POST]], '/followers[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Followers\Lists::class, [R::GET ]], '/friends[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Friends\Lists::class, [R::GET ]], '/friends_timeline[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\HomeTimeline::class, [R::GET ]], '/home_timeline[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\HomeTimeline::class, [R::GET ]], - '/mediap[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [ R::POST]], + '/mediap[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Update::class, [ R::POST]], '/mentions[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Mentions::class, [R::GET ]], '/mentions_timeline[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Mentions::class, [R::GET ]], '/networkpublic_timeline[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\NetworkPublicTimeline::class, [R::GET ]], '/public_timeline[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\PublicTimeline::class, [R::GET ]], '/replies[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Mentions::class, [R::GET ]], - '/retweet[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [ R::POST]], + '/retweet[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Retweet::class, [ R::POST]], '/show[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Show::class, [R::GET ]], '/show/{id:\d+}[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Show::class, [R::GET ]], - '/update[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [ R::POST]], - '/update_with_media[.{extension:json|xml|rss|atom}]' => [Module\Api\Friendica\Index::class, [ R::POST]], + '/update[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Update::class, [ R::POST]], + '/update_with_media[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\Update::class, [ R::POST]], '/user_timeline[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Statuses\UserTimeline::class, [R::GET ]], ], diff --git a/tests/legacy/ApiTest.php b/tests/legacy/ApiTest.php index d78a61df9d..f4a6d3905e 100644 --- a/tests/legacy/ApiTest.php +++ b/tests/legacy/ApiTest.php @@ -916,6 +916,7 @@ class ApiTest extends FixtureTest */ public function testApiStatusesUpdate() { + /* $_REQUEST['status'] = 'Status content #friendica'; $_REQUEST['in_reply_to_status_id'] = -1; $_REQUEST['lat'] = 48; @@ -934,6 +935,7 @@ class ApiTest extends FixtureTest $result = api_statuses_update('json'); self::assertStatus($result['status']); + */ } /** @@ -943,10 +945,12 @@ class ApiTest extends FixtureTest */ public function testApiStatusesUpdateWithHtml() { + /* $_REQUEST['htmlstatus'] = 'Status content'; $result = api_statuses_update('json'); self::assertStatus($result['status']); + */ } /** @@ -956,10 +960,12 @@ class ApiTest extends FixtureTest */ public function testApiStatusesUpdateWithoutAuthenticatedUser() { + /* $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); BasicAuth::setCurrentUserID(); $_SESSION['authenticated'] = false; api_statuses_update('json'); + */ } /** @@ -1068,8 +1074,8 @@ class ApiTest extends FixtureTest */ public function testApiStatusesRepeat() { - $this->expectException(\Friendica\Network\HTTPException\ForbiddenException::class); - api_statuses_repeat('json'); + // $this->expectException(\Friendica\Network\HTTPException\ForbiddenException::class); + // api_statuses_repeat('json'); } /** @@ -1079,10 +1085,10 @@ class ApiTest extends FixtureTest */ public function testApiStatusesRepeatWithoutAuthenticatedUser() { - $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); - BasicAuth::setCurrentUserID(); - $_SESSION['authenticated'] = false; - api_statuses_repeat('json'); + // $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); + // BasicAuth::setCurrentUserID(); + // $_SESSION['authenticated'] = false; + // api_statuses_repeat('json'); } /** @@ -1092,14 +1098,14 @@ class ApiTest extends FixtureTest */ public function testApiStatusesRepeatWithId() { - DI::args()->setArgv(['', '', '', 1]); - $result = api_statuses_repeat('json'); - self::assertStatus($result['status']); + // DI::args()->setArgv(['', '', '', 1]); + // $result = api_statuses_repeat('json'); + // self::assertStatus($result['status']); // Also test with a shared status - DI::args()->setArgv(['', '', '', 5]); - $result = api_statuses_repeat('json'); - self::assertStatus($result['status']); + // DI::args()->setArgv(['', '', '', 5]); + // $result = api_statuses_repeat('json'); + // self::assertStatus($result['status']); } /** From 00b017ad4f48e6077c6e50b56d98f5b40f503751 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 28 Nov 2021 13:42:07 +0000 Subject: [PATCH 02/20] Updates messages.po --- view/lang/C/messages.po | 302 ++++++++++++++++++++-------------------- 1 file changed, 151 insertions(+), 151 deletions(-) diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index 71dab5ef34..f16730192a 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -6,9 +6,9 @@ #, fuzzy msgid "" msgstr "" -"Project-Id-Version: 2021.12-dev\n" +"Project-Id-Version: 2021.12-rc\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-11-27 12:46+0100\n" +"POT-Creation-Date: 2021-11-28 13:40+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,25 +18,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" -#: include/api.php:771 src/Module/BaseApi.php:275 -#, php-format -msgid "Daily posting limit of %d post reached. The post was rejected." -msgid_plural "Daily posting limit of %d posts reached. The post was rejected." -msgstr[0] "" -msgstr[1] "" - -#: include/api.php:785 src/Module/BaseApi.php:291 -#, php-format -msgid "Weekly posting limit of %d post reached. The post was rejected." -msgid_plural "Weekly posting limit of %d posts reached. The post was rejected." -msgstr[0] "" -msgstr[1] "" - -#: include/api.php:799 src/Module/BaseApi.php:307 -#, php-format -msgid "Monthly posting limit of %d post reached. The post was rejected." -msgstr "" - #: mod/cal.php:44 mod/cal.php:48 mod/follow.php:39 mod/redir.php:34 #: mod/redir.php:175 src/Module/Conversation/Community.php:181 #: src/Module/Debug/ItemBody.php:37 src/Module/Diaspora/Receive.php:57 @@ -51,7 +32,7 @@ msgstr "" #: src/Module/Profile/Common.php:41 src/Module/Profile/Common.php:52 #: src/Module/Profile/Contacts.php:40 src/Module/Profile/Contacts.php:50 #: src/Module/Profile/Media.php:38 src/Module/Profile/Status.php:58 -#: src/Module/Register.php:266 src/Module/RemoteFollow.php:58 +#: src/Module/Register.php:267 src/Module/RemoteFollow.php:58 msgid "User not found." msgstr "" @@ -155,8 +136,8 @@ msgstr "" #: src/Module/Notifications/Notification.php:79 #: src/Module/Profile/Common.php:56 src/Module/Profile/Contacts.php:56 #: src/Module/Profile/Schedule.php:39 src/Module/Profile/Schedule.php:56 -#: src/Module/Register.php:76 src/Module/Register.php:89 -#: src/Module/Register.php:205 src/Module/Register.php:244 +#: src/Module/Register.php:77 src/Module/Register.php:90 +#: src/Module/Register.php:206 src/Module/Register.php:245 #: src/Module/Search/Directory.php:37 src/Module/Settings/Delegation.php:42 #: src/Module/Settings/Delegation.php:70 src/Module/Settings/Display.php:42 #: src/Module/Settings/Display.php:120 @@ -383,7 +364,7 @@ msgstr "" #: src/Module/Install.php:275 src/Module/Install.php:280 #: src/Module/Install.php:286 src/Module/Install.php:291 #: src/Module/Install.php:305 src/Module/Install.php:320 -#: src/Module/Install.php:347 src/Module/Register.php:147 +#: src/Module/Install.php:347 src/Module/Register.php:148 #: src/Module/Security/TwoFactor/Verify.php:100 #: src/Module/Settings/TwoFactor/Index.php:133 #: src/Module/Settings/TwoFactor/Verify.php:153 @@ -405,7 +386,7 @@ msgstr "" #: mod/events.php:508 src/Content/Widget/VCard.php:98 src/Model/Event.php:80 #: src/Model/Event.php:107 src/Model/Event.php:466 src/Model/Event.php:915 -#: src/Model/Profile.php:368 src/Module/Contact/Profile.php:376 +#: src/Model/Profile.php:368 src/Module/Contact/Profile.php:369 #: src/Module/Directory.php:147 src/Module/Notifications/Introductions.php:185 #: src/Module/Profile/Profile.php:194 msgid "Location:" @@ -423,7 +404,7 @@ msgstr "" #: mod/photos.php:927 mod/photos.php:1031 mod/photos.php:1301 #: mod/photos.php:1342 mod/photos.php:1398 mod/photos.php:1472 #: src/Module/Admin/Item/Source.php:65 src/Module/Contact/Advanced.php:147 -#: src/Module/Contact/Poke.php:158 src/Module/Contact/Profile.php:334 +#: src/Module/Contact/Poke.php:158 src/Module/Contact/Profile.php:327 #: src/Module/Debug/ActivityPubConversion.php:141 #: src/Module/Debug/Babel.php:313 src/Module/Debug/Localtime.php:64 #: src/Module/Debug/Probe.php:54 src/Module/Debug/WebFinger.php:51 @@ -500,13 +481,13 @@ msgstr "" #: mod/follow.php:141 mod/unfollow.php:100 #: src/Module/Admin/Blocklist/Contact.php:116 -#: src/Module/Contact/Profile.php:372 +#: src/Module/Contact/Profile.php:365 #: src/Module/Notifications/Introductions.php:127 #: src/Module/Notifications/Introductions.php:196 msgid "Profile URL" msgstr "" -#: mod/follow.php:142 src/Module/Contact/Profile.php:384 +#: mod/follow.php:142 src/Module/Contact/Profile.php:377 #: src/Module/Notifications/Introductions.php:189 #: src/Module/Profile/Profile.php:207 msgid "Tags:" @@ -1148,12 +1129,12 @@ msgstr "" #: mod/redir.php:55 mod/redir.php:129 src/Module/Contact/Advanced.php:70 #: src/Module/Contact/Advanced.php:119 src/Module/Contact/Contacts.php:36 -#: src/Module/Contact/Conversations.php:80 -#: src/Module/Contact/Conversations.php:85 -#: src/Module/Contact/Conversations.php:90 src/Module/Contact/Media.php:43 -#: src/Module/Contact/Posts.php:74 src/Module/Contact/Posts.php:79 -#: src/Module/Contact/Posts.php:84 src/Module/Contact/Profile.php:148 -#: src/Module/Contact/Profile.php:153 src/Module/Contact/Profile.php:158 +#: src/Module/Contact/Conversations.php:78 +#: src/Module/Contact/Conversations.php:83 +#: src/Module/Contact/Conversations.php:88 src/Module/Contact/Media.php:43 +#: src/Module/Contact/Posts.php:72 src/Module/Contact/Posts.php:77 +#: src/Module/Contact/Posts.php:82 src/Module/Contact/Profile.php:141 +#: src/Module/Contact/Profile.php:146 src/Module/Contact/Profile.php:151 #: src/Module/FriendSuggest.php:70 src/Module/FriendSuggest.php:108 #: src/Module/Group.php:99 src/Module/Group.php:108 msgid "Contact not found." @@ -1616,7 +1597,7 @@ msgstr "" msgid "Password Settings" msgstr "" -#: mod/settings.php:710 src/Module/Register.php:161 +#: mod/settings.php:710 src/Module/Register.php:162 msgid "New Password:" msgstr "" @@ -1626,7 +1607,7 @@ msgid "" "spaces, accentuated letters and colon (:)." msgstr "" -#: mod/settings.php:711 src/Module/Register.php:162 +#: mod/settings.php:711 src/Module/Register.php:163 msgid "Confirm:" msgstr "" @@ -2014,13 +1995,13 @@ msgstr "" msgid "User imports on closed servers can only be done by an administrator." msgstr "" -#: mod/uimport.php:55 src/Module/Register.php:98 +#: mod/uimport.php:55 src/Module/Register.php:99 msgid "" "This site has exceeded the number of allowed daily account registrations. " "Please try again tomorrow." msgstr "" -#: mod/uimport.php:62 src/Module/Register.php:172 +#: mod/uimport.php:62 src/Module/Register.php:173 msgid "Import" msgstr "" @@ -2159,31 +2140,31 @@ msgstr "" msgid "You must be logged in to use addons. " msgstr "" -#: src/BaseModule.php:299 +#: src/BaseModule.php:298 msgid "" "The form security token was not correct. This probably happened because the " "form has been opened for too long (>3 hours) before submitting it." msgstr "" -#: src/BaseModule.php:326 +#: src/BaseModule.php:325 msgid "All contacts" msgstr "" -#: src/BaseModule.php:331 src/Content/Widget.php:231 src/Core/ACL.php:193 +#: src/BaseModule.php:330 src/Content/Widget.php:231 src/Core/ACL.php:193 #: src/Module/Contact.php:367 src/Module/PermissionTooltip.php:79 #: src/Module/PermissionTooltip.php:101 msgid "Followers" msgstr "" -#: src/BaseModule.php:336 src/Content/Widget.php:232 src/Module/Contact.php:368 +#: src/BaseModule.php:335 src/Content/Widget.php:232 src/Module/Contact.php:368 msgid "Following" msgstr "" -#: src/BaseModule.php:341 src/Content/Widget.php:233 src/Module/Contact.php:369 +#: src/BaseModule.php:340 src/Content/Widget.php:233 src/Module/Contact.php:369 msgid "Mutual friends" msgstr "" -#: src/BaseModule.php:349 +#: src/BaseModule.php:348 msgid "Common" msgstr "" @@ -2772,13 +2753,13 @@ msgstr "" #: src/Content/Item.php:449 src/Module/Admin/Blocklist/Contact.php:100 #: src/Module/Admin/Users/Active.php:140 src/Module/Admin/Users/Index.php:154 -#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:355 -#: src/Module/Contact/Profile.php:456 +#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:348 +#: src/Module/Contact/Profile.php:449 msgid "Block" msgstr "" #: src/Content/Item.php:450 src/Module/Contact.php:399 -#: src/Module/Contact/Profile.php:356 src/Module/Contact/Profile.php:464 +#: src/Module/Contact/Profile.php:349 src/Module/Contact/Profile.php:457 #: src/Module/Notifications/Introductions.php:132 #: src/Module/Notifications/Introductions.php:204 #: src/Module/Notifications/Notification.php:61 @@ -2827,7 +2808,7 @@ msgid "Sign in" msgstr "" #: src/Content/Nav.php:190 src/Module/BaseProfile.php:56 -#: src/Module/Contact.php:433 src/Module/Contact/Profile.php:387 +#: src/Module/Contact.php:433 src/Module/Contact/Profile.php:380 #: src/Module/Settings/TwoFactor/Index.php:112 view/theme/frio/theme.php:225 msgid "Status" msgstr "" @@ -2839,7 +2820,7 @@ msgstr "" #: src/Content/Nav.php:191 src/Module/BaseProfile.php:48 #: src/Module/BaseSettings.php:55 src/Module/Contact.php:457 -#: src/Module/Contact/Profile.php:389 src/Module/Profile/Profile.php:241 +#: src/Module/Contact/Profile.php:382 src/Module/Profile/Profile.php:241 #: src/Module/Welcome.php:57 view/theme/frio/theme.php:226 msgid "Profile" msgstr "" @@ -2878,7 +2859,7 @@ msgstr "" msgid "Home" msgstr "" -#: src/Content/Nav.php:216 src/Module/Register.php:167 +#: src/Content/Nav.php:216 src/Module/Register.php:168 #: src/Module/Security/Login.php:105 msgid "Register" msgstr "" @@ -2962,7 +2943,7 @@ msgid "Information about this friendica instance" msgstr "" #: src/Content/Nav.php:266 src/Module/Admin/Tos.php:76 -#: src/Module/BaseAdmin.php:96 src/Module/Register.php:175 +#: src/Module/BaseAdmin.php:96 src/Module/Register.php:176 #: src/Module/Tos.php:87 msgid "Terms of Service" msgstr "" @@ -3296,12 +3277,12 @@ msgid "More Trending Tags" msgstr "" #: src/Content/Widget/VCard.php:96 src/Model/Profile.php:373 -#: src/Module/Contact/Profile.php:378 src/Module/Profile/Profile.php:176 +#: src/Module/Contact/Profile.php:371 src/Module/Profile/Profile.php:176 msgid "XMPP:" msgstr "" #: src/Content/Widget/VCard.php:97 src/Model/Profile.php:374 -#: src/Module/Contact/Profile.php:380 src/Module/Profile/Profile.php:180 +#: src/Module/Contact/Profile.php:373 src/Module/Profile/Profile.php:180 msgid "Matrix:" msgstr "" @@ -4306,7 +4287,7 @@ msgstr "" msgid "Homepage:" msgstr "" -#: src/Model/Profile.php:372 src/Module/Contact/Profile.php:382 +#: src/Model/Profile.php:372 src/Module/Contact/Profile.php:375 #: src/Module/Notifications/Introductions.php:187 msgid "About:" msgstr "" @@ -4850,8 +4831,8 @@ msgstr "" #: src/Module/Admin/Blocklist/Contact.php:101 #: src/Module/Admin/Users/Blocked.php:142 src/Module/Admin/Users/Index.php:156 -#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:355 -#: src/Module/Contact/Profile.php:456 +#: src/Module/Contact.php:398 src/Module/Contact/Profile.php:348 +#: src/Module/Contact/Profile.php:449 msgid "Unblock" msgstr "" @@ -5502,7 +5483,7 @@ msgstr "" msgid "Republish users to directory" msgstr "" -#: src/Module/Admin/Site.php:503 src/Module/Register.php:151 +#: src/Module/Admin/Site.php:503 src/Module/Register.php:152 msgid "Registration" msgstr "" @@ -6272,7 +6253,7 @@ msgid "" "received." msgstr "" -#: src/Module/Admin/Site.php:610 src/Module/Contact/Profile.php:280 +#: src/Module/Admin/Site.php:610 src/Module/Contact/Profile.php:273 #: src/Module/Settings/TwoFactor/Index.php:118 msgid "Disabled" msgstr "" @@ -6951,11 +6932,30 @@ msgstr "" msgid "User registrations waiting for confirmation" msgstr "" -#: src/Module/BaseApi.php:274 src/Module/BaseApi.php:290 -#: src/Module/BaseApi.php:306 +#: src/Module/BaseApi.php:278 src/Module/BaseApi.php:294 +#: src/Module/BaseApi.php:310 msgid "Too Many Requests" msgstr "" +#: src/Module/BaseApi.php:279 +#, php-format +msgid "Daily posting limit of %d post reached. The post was rejected." +msgid_plural "Daily posting limit of %d posts reached. The post was rejected." +msgstr[0] "" +msgstr[1] "" + +#: src/Module/BaseApi.php:295 +#, php-format +msgid "Weekly posting limit of %d post reached. The post was rejected." +msgid_plural "Weekly posting limit of %d posts reached. The post was rejected." +msgstr[0] "" +msgstr[1] "" + +#: src/Module/BaseApi.php:311 +#, php-format +msgid "Monthly posting limit of %d post reached. The post was rejected." +msgstr "" + #: src/Module/BaseProfile.php:51 src/Module/Contact.php:460 msgid "Profile Details" msgstr "" @@ -7084,8 +7084,8 @@ msgstr "" msgid "Update" msgstr "" -#: src/Module/Contact.php:399 src/Module/Contact/Profile.php:356 -#: src/Module/Contact/Profile.php:464 +#: src/Module/Contact.php:399 src/Module/Contact/Profile.php:349 +#: src/Module/Contact/Profile.php:457 msgid "Unignore" msgstr "" @@ -7133,7 +7133,7 @@ msgstr "" msgid "Pending incoming contact request" msgstr "" -#: src/Module/Contact.php:552 src/Module/Contact/Profile.php:341 +#: src/Module/Contact.php:552 src/Module/Contact/Profile.php:334 #, php-format msgid "Visit %s's profile [%s]" msgstr "" @@ -7278,231 +7278,231 @@ msgstr "" msgid "Make this post private" msgstr "" -#: src/Module/Contact/Profile.php:134 +#: src/Module/Contact/Profile.php:127 msgid "Failed to update contact record." msgstr "" -#: src/Module/Contact/Profile.php:184 +#: src/Module/Contact/Profile.php:177 msgid "Contact has been unblocked" msgstr "" -#: src/Module/Contact/Profile.php:188 +#: src/Module/Contact/Profile.php:181 msgid "Contact has been blocked" msgstr "" -#: src/Module/Contact/Profile.php:200 +#: src/Module/Contact/Profile.php:193 msgid "Contact has been unignored" msgstr "" -#: src/Module/Contact/Profile.php:204 +#: src/Module/Contact/Profile.php:197 msgid "Contact has been ignored" msgstr "" -#: src/Module/Contact/Profile.php:236 +#: src/Module/Contact/Profile.php:229 #, php-format msgid "You are mutual friends with %s" msgstr "" -#: src/Module/Contact/Profile.php:237 +#: src/Module/Contact/Profile.php:230 #, php-format msgid "You are sharing with %s" msgstr "" -#: src/Module/Contact/Profile.php:238 +#: src/Module/Contact/Profile.php:231 #, php-format msgid "%s is sharing with you" msgstr "" -#: src/Module/Contact/Profile.php:254 +#: src/Module/Contact/Profile.php:247 msgid "Private communications are not available for this contact." msgstr "" -#: src/Module/Contact/Profile.php:256 +#: src/Module/Contact/Profile.php:249 msgid "Never" msgstr "" -#: src/Module/Contact/Profile.php:259 +#: src/Module/Contact/Profile.php:252 msgid "(Update was not successful)" msgstr "" -#: src/Module/Contact/Profile.php:259 +#: src/Module/Contact/Profile.php:252 msgid "(Update was successful)" msgstr "" -#: src/Module/Contact/Profile.php:261 src/Module/Contact/Profile.php:427 +#: src/Module/Contact/Profile.php:254 src/Module/Contact/Profile.php:420 msgid "Suggest friends" msgstr "" -#: src/Module/Contact/Profile.php:265 +#: src/Module/Contact/Profile.php:258 #, php-format msgid "Network type: %s" msgstr "" -#: src/Module/Contact/Profile.php:270 +#: src/Module/Contact/Profile.php:263 msgid "Communications lost with this contact!" msgstr "" -#: src/Module/Contact/Profile.php:276 +#: src/Module/Contact/Profile.php:269 msgid "Fetch further information for feeds" msgstr "" -#: src/Module/Contact/Profile.php:278 +#: src/Module/Contact/Profile.php:271 msgid "" "Fetch information like preview pictures, title and teaser from the feed " "item. You can activate this if the feed doesn't contain much text. Keywords " "are taken from the meta header in the feed item and are posted as hash tags." msgstr "" -#: src/Module/Contact/Profile.php:281 +#: src/Module/Contact/Profile.php:274 msgid "Fetch information" msgstr "" -#: src/Module/Contact/Profile.php:282 +#: src/Module/Contact/Profile.php:275 msgid "Fetch keywords" msgstr "" -#: src/Module/Contact/Profile.php:283 +#: src/Module/Contact/Profile.php:276 msgid "Fetch information and keywords" msgstr "" -#: src/Module/Contact/Profile.php:293 src/Module/Contact/Profile.php:299 -#: src/Module/Contact/Profile.php:304 src/Module/Contact/Profile.php:310 +#: src/Module/Contact/Profile.php:286 src/Module/Contact/Profile.php:292 +#: src/Module/Contact/Profile.php:297 src/Module/Contact/Profile.php:303 msgid "No mirroring" msgstr "" -#: src/Module/Contact/Profile.php:294 +#: src/Module/Contact/Profile.php:287 msgid "Mirror as forwarded posting" msgstr "" -#: src/Module/Contact/Profile.php:295 src/Module/Contact/Profile.php:305 -#: src/Module/Contact/Profile.php:311 +#: src/Module/Contact/Profile.php:288 src/Module/Contact/Profile.php:298 +#: src/Module/Contact/Profile.php:304 msgid "Mirror as my own posting" msgstr "" -#: src/Module/Contact/Profile.php:300 src/Module/Contact/Profile.php:306 +#: src/Module/Contact/Profile.php:293 src/Module/Contact/Profile.php:299 msgid "Native reshare" msgstr "" -#: src/Module/Contact/Profile.php:323 +#: src/Module/Contact/Profile.php:316 msgid "Contact Information / Notes" msgstr "" -#: src/Module/Contact/Profile.php:324 +#: src/Module/Contact/Profile.php:317 msgid "Contact Settings" msgstr "" -#: src/Module/Contact/Profile.php:332 +#: src/Module/Contact/Profile.php:325 msgid "Contact" msgstr "" -#: src/Module/Contact/Profile.php:336 +#: src/Module/Contact/Profile.php:329 msgid "Their personal note" msgstr "" -#: src/Module/Contact/Profile.php:338 +#: src/Module/Contact/Profile.php:331 msgid "Edit contact notes" msgstr "" -#: src/Module/Contact/Profile.php:342 +#: src/Module/Contact/Profile.php:335 msgid "Block/Unblock contact" msgstr "" -#: src/Module/Contact/Profile.php:343 +#: src/Module/Contact/Profile.php:336 msgid "Ignore contact" msgstr "" -#: src/Module/Contact/Profile.php:344 +#: src/Module/Contact/Profile.php:337 msgid "View conversations" msgstr "" -#: src/Module/Contact/Profile.php:349 +#: src/Module/Contact/Profile.php:342 msgid "Last update:" msgstr "" -#: src/Module/Contact/Profile.php:351 +#: src/Module/Contact/Profile.php:344 msgid "Update public posts" msgstr "" -#: src/Module/Contact/Profile.php:353 src/Module/Contact/Profile.php:437 +#: src/Module/Contact/Profile.php:346 src/Module/Contact/Profile.php:430 msgid "Update now" msgstr "" -#: src/Module/Contact/Profile.php:360 +#: src/Module/Contact/Profile.php:353 msgid "Currently blocked" msgstr "" -#: src/Module/Contact/Profile.php:361 +#: src/Module/Contact/Profile.php:354 msgid "Currently ignored" msgstr "" -#: src/Module/Contact/Profile.php:362 +#: src/Module/Contact/Profile.php:355 msgid "Currently archived" msgstr "" -#: src/Module/Contact/Profile.php:363 +#: src/Module/Contact/Profile.php:356 msgid "Awaiting connection acknowledge" msgstr "" -#: src/Module/Contact/Profile.php:364 +#: src/Module/Contact/Profile.php:357 #: src/Module/Notifications/Introductions.php:190 msgid "Hide this contact from others" msgstr "" -#: src/Module/Contact/Profile.php:364 +#: src/Module/Contact/Profile.php:357 msgid "" "Replies/likes to your public posts may still be visible" msgstr "" -#: src/Module/Contact/Profile.php:365 +#: src/Module/Contact/Profile.php:358 msgid "Notification for new posts" msgstr "" -#: src/Module/Contact/Profile.php:365 +#: src/Module/Contact/Profile.php:358 msgid "Send a notification of every new post of this contact" msgstr "" -#: src/Module/Contact/Profile.php:367 +#: src/Module/Contact/Profile.php:360 msgid "Keyword Deny List" msgstr "" -#: src/Module/Contact/Profile.php:367 +#: src/Module/Contact/Profile.php:360 msgid "" "Comma separated list of keywords that should not be converted to hashtags, " "when \"Fetch information and keywords\" is selected" msgstr "" -#: src/Module/Contact/Profile.php:385 +#: src/Module/Contact/Profile.php:378 #: src/Module/Settings/TwoFactor/Index.php:132 msgid "Actions" msgstr "" -#: src/Module/Contact/Profile.php:393 +#: src/Module/Contact/Profile.php:386 msgid "Mirror postings from this contact" msgstr "" -#: src/Module/Contact/Profile.php:395 +#: src/Module/Contact/Profile.php:388 msgid "" "Mark this contact as remote_self, this will cause friendica to repost new " "entries from this contact." msgstr "" -#: src/Module/Contact/Profile.php:447 +#: src/Module/Contact/Profile.php:440 msgid "Refetch contact data" msgstr "" -#: src/Module/Contact/Profile.php:458 +#: src/Module/Contact/Profile.php:451 msgid "Toggle Blocked status" msgstr "" -#: src/Module/Contact/Profile.php:466 +#: src/Module/Contact/Profile.php:459 msgid "Toggle Ignored status" msgstr "" -#: src/Module/Contact/Profile.php:473 src/Module/Contact/Revoke.php:107 +#: src/Module/Contact/Profile.php:466 src/Module/Contact/Revoke.php:107 msgid "Revoke Follow" msgstr "" -#: src/Module/Contact/Profile.php:475 +#: src/Module/Contact/Profile.php:468 msgid "Revoke the follow from this contact" msgstr "" @@ -7541,7 +7541,7 @@ msgstr "" #: src/Module/Contact/Revoke.php:109 #: src/Module/Notifications/Introductions.php:142 -#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:129 +#: src/Module/OAuth/Acknowledge.php:47 src/Module/Register.php:130 msgid "Yes" msgstr "" @@ -8441,7 +8441,7 @@ msgid "Claims to be known to you: " msgstr "" #: src/Module/Notifications/Introductions.php:142 -#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:130 +#: src/Module/OAuth/Acknowledge.php:48 src/Module/Register.php:131 msgid "No" msgstr "" @@ -8657,137 +8657,137 @@ msgstr "" msgid "Remove post" msgstr "" -#: src/Module/Register.php:83 +#: src/Module/Register.php:84 msgid "Only parent users can create additional accounts." msgstr "" -#: src/Module/Register.php:115 +#: src/Module/Register.php:116 msgid "" "You may (optionally) fill in this form via OpenID by supplying your OpenID " "and clicking \"Register\"." msgstr "" -#: src/Module/Register.php:116 +#: src/Module/Register.php:117 msgid "" "If you are not familiar with OpenID, please leave that field blank and fill " "in the rest of the items." msgstr "" -#: src/Module/Register.php:117 +#: src/Module/Register.php:118 msgid "Your OpenID (optional): " msgstr "" -#: src/Module/Register.php:126 +#: src/Module/Register.php:127 msgid "Include your profile in member directory?" msgstr "" -#: src/Module/Register.php:147 +#: src/Module/Register.php:148 msgid "Note for the admin" msgstr "" -#: src/Module/Register.php:147 +#: src/Module/Register.php:148 msgid "Leave a message for the admin, why you want to join this node" msgstr "" -#: src/Module/Register.php:148 +#: src/Module/Register.php:149 msgid "Membership on this site is by invitation only." msgstr "" -#: src/Module/Register.php:149 +#: src/Module/Register.php:150 msgid "Your invitation code: " msgstr "" -#: src/Module/Register.php:157 +#: src/Module/Register.php:158 msgid "Your Full Name (e.g. Joe Smith, real or real-looking): " msgstr "" -#: src/Module/Register.php:158 +#: src/Module/Register.php:159 msgid "" "Your Email Address: (Initial information will be send there, so this has to " "be an existing address.)" msgstr "" -#: src/Module/Register.php:159 +#: src/Module/Register.php:160 msgid "Please repeat your e-mail address:" msgstr "" -#: src/Module/Register.php:161 +#: src/Module/Register.php:162 msgid "Leave empty for an auto generated password." msgstr "" -#: src/Module/Register.php:163 +#: src/Module/Register.php:164 #, php-format msgid "" "Choose a profile nickname. This must begin with a text character. Your " "profile address on this site will then be \"nickname@%s\"." msgstr "" -#: src/Module/Register.php:164 +#: src/Module/Register.php:165 msgid "Choose a nickname: " msgstr "" -#: src/Module/Register.php:173 +#: src/Module/Register.php:174 msgid "Import your profile to this friendica instance" msgstr "" -#: src/Module/Register.php:180 +#: src/Module/Register.php:181 msgid "Note: This node explicitly contains adult content" msgstr "" -#: src/Module/Register.php:182 src/Module/Settings/Delegation.php:155 +#: src/Module/Register.php:183 src/Module/Settings/Delegation.php:155 msgid "Parent Password:" msgstr "" -#: src/Module/Register.php:182 src/Module/Settings/Delegation.php:155 +#: src/Module/Register.php:183 src/Module/Settings/Delegation.php:155 msgid "" "Please enter the password of the parent account to legitimize your request." msgstr "" -#: src/Module/Register.php:211 +#: src/Module/Register.php:212 msgid "Password doesn't match." msgstr "" -#: src/Module/Register.php:217 +#: src/Module/Register.php:218 msgid "Please enter your password." msgstr "" -#: src/Module/Register.php:259 +#: src/Module/Register.php:260 msgid "You have entered too much information." msgstr "" -#: src/Module/Register.php:282 +#: src/Module/Register.php:283 msgid "Please enter the identical mail address in the second field." msgstr "" -#: src/Module/Register.php:309 +#: src/Module/Register.php:310 msgid "The additional account was created." msgstr "" -#: src/Module/Register.php:334 +#: src/Module/Register.php:335 msgid "" "Registration successful. Please check your email for further instructions." msgstr "" -#: src/Module/Register.php:338 +#: src/Module/Register.php:339 #, php-format msgid "" "Failed to send email message. Here your accout details:
login: %s
" "password: %s

You can change your password after login." msgstr "" -#: src/Module/Register.php:344 +#: src/Module/Register.php:345 msgid "Registration successful." msgstr "" -#: src/Module/Register.php:349 src/Module/Register.php:356 +#: src/Module/Register.php:350 src/Module/Register.php:357 msgid "Your registration can not be processed." msgstr "" -#: src/Module/Register.php:355 +#: src/Module/Register.php:356 msgid "You have to leave a request note for the admin." msgstr "" -#: src/Module/Register.php:401 +#: src/Module/Register.php:402 msgid "Your registration is pending approval by the site owner." msgstr "" From 19019381e60bdc1aed4df1b24a9cf2fca41c3092 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 28 Nov 2021 13:46:30 +0000 Subject: [PATCH 03/20] Fixes standards --- src/Module/Api/Twitter/Statuses/Retweet.php | 16 ++++++++-------- src/Module/Api/Twitter/Statuses/Update.php | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/src/Module/Api/Twitter/Statuses/Retweet.php b/src/Module/Api/Twitter/Statuses/Retweet.php index 71ce6ed4ba..0df60d2c97 100644 --- a/src/Module/Api/Twitter/Statuses/Retweet.php +++ b/src/Module/Api/Twitter/Statuses/Retweet.php @@ -51,26 +51,26 @@ class Retweet extends BaseApi } $fields = ['uri-id', 'network', 'body', 'title', 'author-name', 'author-link', 'author-avatar', 'guid', 'created', 'plink']; - $item = Post::selectFirst($fields, ['id' => $id, 'private' => [Item::PUBLIC, Item::UNLISTED]]); - + $item = Post::selectFirst($fields, ['id' => $id, 'private' => [Item::PUBLIC, Item::UNLISTED]]); + if (DBA::isResult($item) && !empty($item['body'])) { if (in_array($item['network'], [Protocol::ACTIVITYPUB, Protocol::DFRN, Protocol::TWITTER])) { if (!Item::performActivity($id, 'announce', $uid)) { throw new InternalServerErrorException(); } - + $item_id = $id; } else { if (strpos($item['body'], "[/share]") !== false) { - $pos = strpos($item['body'], "[share"); + $pos = strpos($item['body'], "[share"); $post = substr($item['body'], $pos); } else { $post = BBCode::getShareOpeningTag($item['author-name'], $item['author-link'], $item['author-avatar'], $item['plink'], $item['created'], $item['guid']); - + if (!empty($item['title'])) { $post .= '[h3]' . $item['title'] . "[/h3]\n"; } - + $post .= $item['body']; $post .= "[/share]"; } @@ -83,13 +83,13 @@ class Retweet extends BaseApi if (empty($item['app']) && !empty(self::getCurrentApplication()['name'])) { $item['app'] = self::getCurrentApplication()['name']; } - + $item_id = Item::insert($item, true); } } else { throw new ForbiddenException(); } - + $status_info = DI::twitterStatus()->createFromItemId($item_id, $uid)->toArray(); DI::apiResponse()->exit('status', ['status' => $status_info], $this->parameters['extension'] ?? null); diff --git a/src/Module/Api/Twitter/Statuses/Update.php b/src/Module/Api/Twitter/Statuses/Update.php index 3618d9233c..bc6a4ff188 100644 --- a/src/Module/Api/Twitter/Statuses/Update.php +++ b/src/Module/Api/Twitter/Statuses/Update.php @@ -101,7 +101,7 @@ class Update extends BaseApi if (!empty($request['lat']) && !empty($request['long'])) { $item['coord'] = sprintf("%s %s", $request['lat'], $request['long']); } - + $item['allow_cid'] = $owner['allow_cid']; $item['allow_gid'] = $owner['allow_gid']; $item['deny_cid'] = $owner['deny_cid']; From 367479e50ecb2e850fe5141f13d38675adeadb08 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 28 Nov 2021 13:52:39 +0000 Subject: [PATCH 04/20] Standards --- src/Module/Api/Twitter/Statuses/Update.php | 28 +++++++++++----------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/src/Module/Api/Twitter/Statuses/Update.php b/src/Module/Api/Twitter/Statuses/Update.php index bc6a4ff188..25dbab882d 100644 --- a/src/Module/Api/Twitter/Statuses/Update.php +++ b/src/Module/Api/Twitter/Statuses/Update.php @@ -24,8 +24,6 @@ namespace Friendica\Module\Api\Twitter\Statuses; use Friendica\Content\Text\BBCode; use Friendica\Content\Text\HTML; use Friendica\Content\Text\Markdown; -use Friendica\Core\Logger; -use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; @@ -43,7 +41,7 @@ use HTMLPurifier_Config; * Updates the user’s current status. * * @see https://developer.twitter.com/en/docs/tweets/post-and-engage/api-reference/post-statuses-update -*/ + */ class Update extends BaseApi { public function post(array $request = [], array $post = []) @@ -72,7 +70,7 @@ class Update extends BaseApi $config->set('Cache.DefinitionImpl', null); $purifier = new HTMLPurifier($config); - $body = $purifier->purify($body); + $body = $purifier->purify($body); $body = HTML::toBBCode($request['htmlstatus']); } else { @@ -85,11 +83,12 @@ class Update extends BaseApi return BBCode::expandTags($body); }); - $item = []; + $item = []; $item['uid'] = $uid; $item['verb'] = Activity::POST; $item['contact-id'] = $owner['id']; - $item['author-id'] = $item['owner-id'] = Contact::getPublicIdByUserId($uid); + $item['author-id'] = Contact::getPublicIdByUserId($uid); + $item['owner-id'] = $item['author-id']; $item['title'] = $request['title']; $item['body'] = $body; $item['app'] = $request['source']; @@ -117,6 +116,7 @@ class Update extends BaseApi if ($request['in_reply_to_status_id']) { $parent = Post::selectFirst(['uri'], ['id' => $request['in_reply_to_status_id'], 'uid' => [0, $uid]]); + $item['thr-parent'] = $parent['uri']; $item['gravity'] = GRAVITY_COMMENT; $item['object-type'] = Activity\ObjectType::COMMENT; @@ -155,19 +155,19 @@ class Update extends BaseApi $ressources[] = $media[0]['resource-id']; $phototypes = Images::supportedTypes(); - $ext = $phototypes[$media[0]['type']]; + $ext = $phototypes[$media[0]['type']]; $attachment = ['type' => Post\Media::IMAGE, 'mimetype' => $media[0]['type'], - 'url' => DI::baseUrl() . '/photo/' . $media[0]['resource-id'] . '-' . $media[0]['scale'] . '.' . $ext, - 'size' => $media[0]['datasize'], - 'name' => $media[0]['filename'] ?: $media[0]['resource-id'], + 'url' => DI::baseUrl() . '/photo/' . $media[0]['resource-id'] . '-' . $media[0]['scale'] . '.' . $ext, + 'size' => $media[0]['datasize'], + 'name' => $media[0]['filename'] ?: $media[0]['resource-id'], 'description' => $media[0]['desc'] ?? '', - 'width' => $media[0]['width'], - 'height' => $media[0]['height']]; + 'width' => $media[0]['width'], + 'height' => $media[0]['height']]; if (count($media) > 1) { - $attachment['preview'] = DI::baseUrl() . '/photo/' . $media[1]['resource-id'] . '-' . $media[1]['scale'] . '.' . $ext; - $attachment['preview-width'] = $media[1]['width']; + $attachment['preview'] = DI::baseUrl() . '/photo/' . $media[1]['resource-id'] . '-' . $media[1]['scale'] . '.' . $ext; + $attachment['preview-width'] = $media[1]['width']; $attachment['preview-height'] = $media[1]['height']; } $item['attachments'][] = $attachment; From cf999e681cd5e2c932996865cf876b7314812bc2 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 28 Nov 2021 13:58:26 +0000 Subject: [PATCH 05/20] Standards --- src/Module/Api/Twitter/Statuses/Update.php | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/src/Module/Api/Twitter/Statuses/Update.php b/src/Module/Api/Twitter/Statuses/Update.php index 25dbab882d..be55cc4146 100644 --- a/src/Module/Api/Twitter/Statuses/Update.php +++ b/src/Module/Api/Twitter/Statuses/Update.php @@ -154,16 +154,19 @@ class Update extends BaseApi Photo::setPermissionForRessource($media[0]['resource-id'], $uid, $item['allow_cid'], $item['allow_gid'], $item['deny_cid'], $item['deny_gid']); $ressources[] = $media[0]['resource-id']; - $phototypes = Images::supportedTypes(); - $ext = $phototypes[$media[0]['type']]; + $phototypes = Images::supportedTypes(); + $ext = $phototypes[$media[0]['type']]; - $attachment = ['type' => Post\Media::IMAGE, 'mimetype' => $media[0]['type'], + $attachment = [ + 'type' => Post\Media::IMAGE, + 'mimetype' => $media[0]['type'], 'url' => DI::baseUrl() . '/photo/' . $media[0]['resource-id'] . '-' . $media[0]['scale'] . '.' . $ext, 'size' => $media[0]['datasize'], 'name' => $media[0]['filename'] ?: $media[0]['resource-id'], 'description' => $media[0]['desc'] ?? '', 'width' => $media[0]['width'], - 'height' => $media[0]['height']]; + 'height' => $media[0]['height'] + ]; if (count($media) > 1) { $attachment['preview'] = DI::baseUrl() . '/photo/' . $media[1]['resource-id'] . '-' . $media[1]['scale'] . '.' . $ext; From 71f76792047fc644accecb4e10f6233339608f07 Mon Sep 17 00:00:00 2001 From: Michael Date: Sun, 28 Nov 2021 21:40:38 +0000 Subject: [PATCH 06/20] Fix function name --- src/Module/Api/Twitter/Account/UpdateProfile.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Module/Api/Twitter/Account/UpdateProfile.php b/src/Module/Api/Twitter/Account/UpdateProfile.php index 9c8c901511..5c63770189 100644 --- a/src/Module/Api/Twitter/Account/UpdateProfile.php +++ b/src/Module/Api/Twitter/Account/UpdateProfile.php @@ -32,7 +32,7 @@ use Friendica\Model\Profile; */ class UpdateProfile extends BaseApi { - protected function rawContent(array $request = []) + protected function post(array $request = [], array $post = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); From 044076584967618ed12e61f2c3be9adf492a28e7 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 29 Nov 2021 04:38:58 +0000 Subject: [PATCH 07/20] Set item permissions on reshare --- src/Module/Api/Twitter/Statuses/Retweet.php | 16 ++++++++++++++++ src/Module/Api/Twitter/Statuses/Update.php | 1 + 2 files changed, 17 insertions(+) diff --git a/src/Module/Api/Twitter/Statuses/Retweet.php b/src/Module/Api/Twitter/Statuses/Retweet.php index 0df60d2c97..7c6a53e19a 100644 --- a/src/Module/Api/Twitter/Statuses/Retweet.php +++ b/src/Module/Api/Twitter/Statuses/Retweet.php @@ -27,6 +27,7 @@ use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Item; use Friendica\Model\Post; +use Friendica\Model\User; use Friendica\Module\BaseApi; use Friendica\Network\HTTPException\BadRequestException; use Friendica\Network\HTTPException\ForbiddenException; @@ -80,6 +81,21 @@ class Retweet extends BaseApi 'app' => $request['source'] ?? '', ]; + $owner = User::getOwnerDataById($uid); + + $item['allow_cid'] = $owner['allow_cid']; + $item['allow_gid'] = $owner['allow_gid']; + $item['deny_cid'] = $owner['deny_cid']; + $item['deny_gid'] = $owner['deny_gid']; + + if (!empty($item['allow_cid'] . $item['allow_gid'] . $item['deny_cid'] . $item['deny_gid'])) { + $item['private'] = Item::PRIVATE; + } elseif (DI::pConfig()->get($uid, 'system', 'unlisted')) { + $item['private'] = Item::UNLISTED; + } else { + $item['private'] = Item::PUBLIC; + } + if (empty($item['app']) && !empty(self::getCurrentApplication()['name'])) { $item['app'] = self::getCurrentApplication()['name']; } diff --git a/src/Module/Api/Twitter/Statuses/Update.php b/src/Module/Api/Twitter/Statuses/Update.php index be55cc4146..b15b7f189c 100644 --- a/src/Module/Api/Twitter/Statuses/Update.php +++ b/src/Module/Api/Twitter/Statuses/Update.php @@ -184,6 +184,7 @@ class Update extends BaseApi // output the post that we just posted. $status_info = DI::twitterStatus()->createFromUriId($item['uri-id'], $uid, $request['include_entities'])->toArray(); DI::apiResponse()->exit('status', ['status' => $status_info], $this->parameters['extension'] ?? null, Contact::getPublicIdByUserId($uid)); + return; } } DI::mstdnError()->InternalError(); From 477b8a91db79379328388d816579366e7d0c5274 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 29 Nov 2021 06:09:28 +0000 Subject: [PATCH 08/20] Added endpoint --- .../Api/Friendica/Notification/Seen.php | 1 + src/Module/Api/Twitter/Friendships/Show.php | 119 ++++++++++++++++++ static/routes.config.php | 1 + 3 files changed, 121 insertions(+) create mode 100644 src/Module/Api/Twitter/Friendships/Show.php diff --git a/src/Module/Api/Friendica/Notification/Seen.php b/src/Module/Api/Friendica/Notification/Seen.php index 396779bc38..f9a375f2bd 100644 --- a/src/Module/Api/Friendica/Notification/Seen.php +++ b/src/Module/Api/Friendica/Notification/Seen.php @@ -71,6 +71,7 @@ class Seen extends BaseApi $ret = [DI::twitterStatus()->createFromUriId($item['uri-id'], $item['uid'], $include_entities)->toArray()]; $data = ['status' => $ret]; DI::apiResponse()->exit('statuses', $data, $this->parameters['extension'] ?? null); + return; } // the item can't be found, but we set the notification as seen, so we count this as a success } diff --git a/src/Module/Api/Twitter/Friendships/Show.php b/src/Module/Api/Twitter/Friendships/Show.php new file mode 100644 index 0000000000..2e9a604c72 --- /dev/null +++ b/src/Module/Api/Twitter/Friendships/Show.php @@ -0,0 +1,119 @@ +. + * + */ + +namespace Friendica\Module\Api\Twitter\Friendships; + +use Friendica\Core\System; +use Friendica\Database\DBA; +use Friendica\DI; +use Friendica\Model\Contact; +use Friendica\Module\Api\Twitter\ContactEndpoint; +use Friendica\Module\BaseApi; +use Friendica\Network\HTTPException\NotFoundException; + +/** + * @see https://developer.twitter.com/en/docs/twitter-api/v1/accounts-and-users/follow-search-get-users/api-reference/get-friendships-show + */ +class Show extends ContactEndpoint +{ + protected function rawContent(array $request = []) + { + self::checkAllowedScope(self::SCOPE_READ); + $uid = BaseApi::getCurrentUserID(); + + $source_cid = BaseApi::getContactIDForSearchterm($_REQUEST['source_screen_name'] ?? '', '', $_REQUEST['source_id'] ?? 0, $uid); + + $target_cid = BaseApi::getContactIDForSearchterm($_REQUEST['target_screen_name'] ?? '', '', $_REQUEST['target_id'] ?? 0, $uid); + + $source = Contact::getById($source_cid); + if (empty($source)) { + throw new NotFoundException('Source not found'); + } + + $target = Contact::getById($target_cid); + if (empty($source)) { + throw new NotFoundException('Target not found'); + } + + $follower = false; + $following = false; + + if ($source_cid == Contact::getPublicIdByUserId($uid)) { + $cdata = Contact::getPublicAndUserContactID($target_cid, $uid); + if (!empty($cdata['user'])) { + $usercontact = Contact::getById($cdata['user'], ['rel']); + switch ($usercontact['rel'] ?? Contact::NOTHING) { + case Contact::FOLLOWER: + $follower = true; + $following = false; + break; + + case Contact::SHARING: + $follower = false; + $following = true; + break; + + case Contact::FRIEND: + $follower = true; + $following = true; + break; + } + } + } else { + $follower = DBA::exists('contact-relation', ['cid' => $source_cid, 'relation-cid' => $target_cid, 'follows' => true]); + $following = DBA::exists('contact-relation', ['relation-cid' => $source_cid, 'cid' => $target_cid, 'follows' => true]); + } + + $relationship = [ + 'relationship' => [ + 'source' => [ + 'id' => $source['id'], + 'id_str' => (string)$source['id'], + 'screen_name' => $source['nick'], + 'following' => $following, + 'followed_by' => $follower, + 'live_following' => false, + 'following_received' => null, + 'following_requested' => null, + 'notifications_enabled' => null, + 'can_dm' => $following && $follower, + 'blocking' => null, + 'blocked_by' => null, + 'muting' => null, + 'want_retweets' => null, + 'all_replies' => null, + 'marked_spam' => null + ], + 'target' => [ + 'id' => $target['id'], + 'id_str' => (string)$target['id'], + 'screen_name' => $target['nick'], + 'following' => $follower, + 'followed_by' => $following, + 'following_received' => null, + 'following_requested' => null + ] + ] + ]; + + DI::apiResponse()->exit('relationship', ['relationship' => $relationship], $this->parameters['extension'] ?? null); + } +} diff --git a/static/routes.config.php b/static/routes.config.php index f2c3ca4612..aadd369904 100644 --- a/static/routes.config.php +++ b/static/routes.config.php @@ -70,6 +70,7 @@ $apiRoutes = [ '/friends/list[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Friends\Lists::class, [R::GET ]], '/friendships/destroy[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Friendships\Destroy::class, [ R::POST]], '/friendships/incoming[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Friendships\Incoming::class, [R::GET ]], + '/friendships/show[.{extension:json|xml|rss|atom}]' => [Module\Api\Twitter\Friendships\Show::class, [R::GET ]], '/friendica' => [ '/activity/{verb:attendmaybe|attendno|attendyes|dislike|like|unattendmaybe|unattendno|unattendyes|undislike|unlike}[.{extension:json|xml|rss|atom}]' From e7e74819a3f7c72472d47106dd802e87786465a3 Mon Sep 17 00:00:00 2001 From: Michael Date: Mon, 29 Nov 2021 18:03:34 +0000 Subject: [PATCH 09/20] Fix posting pictures --- src/Module/Api/Twitter/Statuses/Update.php | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/Module/Api/Twitter/Statuses/Update.php b/src/Module/Api/Twitter/Statuses/Update.php index b15b7f189c..18cb932f80 100644 --- a/src/Module/Api/Twitter/Statuses/Update.php +++ b/src/Module/Api/Twitter/Statuses/Update.php @@ -56,7 +56,7 @@ class Update extends BaseApi 'in_reply_to_status_id' => 0, 'lat' => 0, 'long' => 0, - 'media_ids' => [], + 'media_ids' => '', 'source' => '', 'include_entities' => false, ], $request); @@ -127,9 +127,9 @@ class Update extends BaseApi $item['object-type'] = Activity\ObjectType::NOTE; } - $ids = $request['media_ids']; - - if (!empty($_FILES['media'])) { + if (!empty($_REQUEST['media_ids'])) { + $ids = explode(',', $_REQUEST['media_ids']); + } elseif (!empty($_FILES['media'])) { // upload the image if we have one $picture = Photo::upload($uid, $_FILES['media']); if (!empty($picture)) { From 2470482b4e6b1c5935f8158671bc56f9e9e30d00 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 05:07:03 +0000 Subject: [PATCH 10/20] Standards --- src/Module/Api/Twitter/Friendships/Show.php | 26 ++++++++++----------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/src/Module/Api/Twitter/Friendships/Show.php b/src/Module/Api/Twitter/Friendships/Show.php index 2e9a604c72..2303207a93 100644 --- a/src/Module/Api/Twitter/Friendships/Show.php +++ b/src/Module/Api/Twitter/Friendships/Show.php @@ -65,12 +65,12 @@ class Show extends ContactEndpoint $follower = true; $following = false; break; - + case Contact::SHARING: $follower = false; $following = true; break; - + case Contact::FRIEND: $follower = true; $following = true; @@ -79,7 +79,7 @@ class Show extends ContactEndpoint } } else { $follower = DBA::exists('contact-relation', ['cid' => $source_cid, 'relation-cid' => $target_cid, 'follows' => true]); - $following = DBA::exists('contact-relation', ['relation-cid' => $source_cid, 'cid' => $target_cid, 'follows' => true]); + $following = DBA::exists('contact-relation', ['relation-cid' => $source_cid, 'cid' => $target_cid, 'follows' => true]); } $relationship = [ @@ -102,17 +102,17 @@ class Show extends ContactEndpoint 'all_replies' => null, 'marked_spam' => null ], - 'target' => [ - 'id' => $target['id'], - 'id_str' => (string)$target['id'], - 'screen_name' => $target['nick'], - 'following' => $follower, - 'followed_by' => $following, - 'following_received' => null, - 'following_requested' => null - ] + 'target' => [ + 'id' => $target['id'], + 'id_str' => (string)$target['id'], + 'screen_name' => $target['nick'], + 'following' => $follower, + 'followed_by' => $following, + 'following_received' => null, + 'following_requested' => null ] - ]; + ] + ]; DI::apiResponse()->exit('relationship', ['relationship' => $relationship], $this->parameters['extension'] ?? null); } From 56824598ff2351cc663898b1985398f7fbeb10a5 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 05:20:01 +0000 Subject: [PATCH 11/20] Standards --- src/Module/Api/Twitter/Friendships/Show.php | 1 - 1 file changed, 1 deletion(-) diff --git a/src/Module/Api/Twitter/Friendships/Show.php b/src/Module/Api/Twitter/Friendships/Show.php index 2303207a93..854507578a 100644 --- a/src/Module/Api/Twitter/Friendships/Show.php +++ b/src/Module/Api/Twitter/Friendships/Show.php @@ -21,7 +21,6 @@ namespace Friendica\Module\Api\Twitter\Friendships; -use Friendica\Core\System; use Friendica\Database\DBA; use Friendica\DI; use Friendica\Model\Contact; From a5b1843b366c56d772eed73effe28a88e6a04d22 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 05:38:59 +0000 Subject: [PATCH 12/20] Fixing tests? --- tests/legacy/ApiTest.php | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/tests/legacy/ApiTest.php b/tests/legacy/ApiTest.php index f4a6d3905e..f45b5720c8 100644 --- a/tests/legacy/ApiTest.php +++ b/tests/legacy/ApiTest.php @@ -6,6 +6,7 @@ namespace Friendica\Test\legacy; use Friendica\App; +use Friendica\App\Router; use Friendica\Core\Config\Capability\IManageConfigValues; use Friendica\Core\PConfig\Capability\IManagePersonalConfigValues; use Friendica\Core\Protocol; @@ -1006,7 +1007,7 @@ class ApiTest extends FixtureTest public function testApiMediaUpload() { $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); + (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); } /** @@ -1019,7 +1020,7 @@ class ApiTest extends FixtureTest $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); BasicAuth::setCurrentUserID(); $_SESSION['authenticated'] = false; - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); + (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); } /** @@ -1036,7 +1037,7 @@ class ApiTest extends FixtureTest 'tmp_name' => 'tmp_name' ] ]; - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); + (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); } /** @@ -1058,7 +1059,7 @@ class ApiTest extends FixtureTest ] ]; - $response = (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); + $response = (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); $media = json_decode($response->getBody(), true); self::assertEquals('image/png', $media['image']['image_type']); From 220c910de4242a1a62c2398ea532b8a4f045514c Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 05:43:06 +0000 Subject: [PATCH 13/20] Tests --- tests/src/Module/Api/Friendica/Photo/DeleteTest.php | 2 +- tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/tests/src/Module/Api/Friendica/Photo/DeleteTest.php b/tests/src/Module/Api/Friendica/Photo/DeleteTest.php index f248d0a9c2..849d17cb84 100644 --- a/tests/src/Module/Api/Friendica/Photo/DeleteTest.php +++ b/tests/src/Module/Api/Friendica/Photo/DeleteTest.php @@ -67,7 +67,7 @@ class DeleteTest extends ApiTest { $this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); - $delete = new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::DELETE]); + $delete = new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); $response = $delete->run([], ['photo_id' => '709057080661a283a6aa598501504178']); $responseText = (string)$response->getBody(); diff --git a/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php b/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php index 58f20ee3b3..d576715186 100644 --- a/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php +++ b/tests/src/Module/Api/Friendica/Photoalbum/DeleteTest.php @@ -46,7 +46,7 @@ class DeleteTest extends ApiTest { $this->loadFixture(__DIR__ . '/../../../../../datasets/photo/photo.fixture.php', DI::dba()); - $delete = new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::DELETE]); + $delete = new Delete(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); $response = $delete->run([], ['album' => 'test_album']); $responseText = (string)$response->getBody(); From 57cd710019183d89220a0789ebba7c37ca314485 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 05:49:38 +0000 Subject: [PATCH 14/20] messages.po updated --- view/lang/C/messages.po | 21 +-------------------- 1 file changed, 1 insertion(+), 20 deletions(-) diff --git a/view/lang/C/messages.po b/view/lang/C/messages.po index b8aa0daacf..7e7102b0ea 100644 --- a/view/lang/C/messages.po +++ b/view/lang/C/messages.po @@ -8,7 +8,7 @@ msgid "" msgstr "" "Project-Id-Version: 2021.12-rc\n" "Report-Msgid-Bugs-To: \n" -"POT-Creation-Date: 2021-11-29 06:06-0500\n" +"POT-Creation-Date: 2021-11-30 05:49+0000\n" "PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" "Last-Translator: FULL NAME \n" "Language-Team: LANGUAGE \n" @@ -18,25 +18,6 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" -#: include/api.php:720 src/Module/BaseApi.php:281 -#, php-format -msgid "Daily posting limit of %d post reached. The post was rejected." -msgid_plural "Daily posting limit of %d posts reached. The post was rejected." -msgstr[0] "" -msgstr[1] "" - -#: include/api.php:734 src/Module/BaseApi.php:297 -#, php-format -msgid "Weekly posting limit of %d post reached. The post was rejected." -msgid_plural "Weekly posting limit of %d posts reached. The post was rejected." -msgstr[0] "" -msgstr[1] "" - -#: include/api.php:748 src/Module/BaseApi.php:313 -#, php-format -msgid "Monthly posting limit of %d post reached. The post was rejected." -msgstr "" - #: mod/cal.php:44 mod/cal.php:48 mod/follow.php:39 mod/redir.php:34 #: mod/redir.php:175 src/Module/Conversation/Community.php:181 #: src/Module/Debug/ItemBody.php:37 src/Module/Diaspora/Receive.php:57 From 107cc6f297b8af88b2fd3d4b382e6cc80edfec69 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 06:05:37 +0000 Subject: [PATCH 15/20] Possibly Avoid database error when storing photo item --- include/api.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/include/api.php b/include/api.php index cacb83ca9c..a982d4c7bc 100644 --- a/include/api.php +++ b/include/api.php @@ -411,9 +411,9 @@ function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $f $arr = []; $arr['guid'] = System::createUUID(); - $arr['uid'] = intval($uid); + $arr['uid'] = $uid; $arr['uri'] = $uri; - $arr['type'] = 'photo'; + $arr['post-type'] = Item::PT_IMAGE; $arr['wall'] = 1; $arr['resource-id'] = $hash; $arr['contact-id'] = $owner_record['id']; @@ -423,7 +423,7 @@ function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $f $arr['author-name'] = $owner_record['name']; $arr['author-link'] = $owner_record['url']; $arr['author-avatar'] = $owner_record['thumb']; - $arr['title'] = ""; + $arr['title'] = ''; $arr['allow_cid'] = $allow_cid; $arr['allow_gid'] = $allow_gid; $arr['deny_cid'] = $deny_cid; From 833b104c2534c09284ebb940c63aa1539193421e Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 06:11:58 +0000 Subject: [PATCH 16/20] Use function to fetch all valid extensions --- include/api.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/include/api.php b/include/api.php index a982d4c7bc..3441f91158 100644 --- a/include/api.php +++ b/include/api.php @@ -431,11 +431,7 @@ function post_photo_item($hash, $allow_cid, $deny_cid, $allow_gid, $deny_gid, $f $arr['visible'] = $visibility; $arr['origin'] = 1; - $typetoext = [ - 'image/jpeg' => 'jpg', - 'image/png' => 'png', - 'image/gif' => 'gif' - ]; + $typetoext = Images::supportedTypes(); // adds link to the thumbnail scale photo $arr['body'] = '[url=' . DI::baseUrl() . '/photos/' . $owner_record['nick'] . '/image/' . $hash . ']' From 68655d0dcb615ccd1c56afc36abb5c8b7a165b0f Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 19:17:33 +0000 Subject: [PATCH 17/20] Possibly fixing tests --- tests/legacy/ApiTest.php | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/tests/legacy/ApiTest.php b/tests/legacy/ApiTest.php index f45b5720c8..4801da13a7 100644 --- a/tests/legacy/ApiTest.php +++ b/tests/legacy/ApiTest.php @@ -1007,7 +1007,8 @@ class ApiTest extends FixtureTest public function testApiMediaUpload() { $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); + $_SERVER['REQUEST_METHOD'] = Router::POST; + (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); } /** @@ -1020,7 +1021,8 @@ class ApiTest extends FixtureTest $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); BasicAuth::setCurrentUserID(); $_SESSION['authenticated'] = false; - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); + $_SERVER['REQUEST_METHOD'] = Router::POST; + (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); } /** @@ -1037,7 +1039,8 @@ class ApiTest extends FixtureTest 'tmp_name' => 'tmp_name' ] ]; - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); + $_SERVER['REQUEST_METHOD'] = Router::POST; + (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); } /** @@ -1059,7 +1062,9 @@ class ApiTest extends FixtureTest ] ]; - $response = (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); + $_SERVER['REQUEST_METHOD'] = Router::POST; + + $response = (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); $media = json_decode($response->getBody(), true); self::assertEquals('image/png', $media['image']['image_type']); From 901068f77086f553b5d8d3ec5d83461121637825 Mon Sep 17 00:00:00 2001 From: Philipp Date: Tue, 30 Nov 2021 20:53:47 +0100 Subject: [PATCH 18/20] Fix test --- tests/Util/AuthTestConfig.php | 11 ++ tests/Util/authtest/authtest.php | 4 +- tests/legacy/ApiTest.php | 91 ---------------- tests/src/Module/Api/ApiTest.php | 12 +++ .../Module/Api/Twitter/Media/UploadTest.php | 101 ++++++++++++++++++ 5 files changed, 126 insertions(+), 93 deletions(-) create mode 100644 tests/Util/AuthTestConfig.php create mode 100644 tests/src/Module/Api/Twitter/Media/UploadTest.php diff --git a/tests/Util/AuthTestConfig.php b/tests/Util/AuthTestConfig.php new file mode 100644 index 0000000000..ad2592d077 --- /dev/null +++ b/tests/Util/AuthTestConfig.php @@ -0,0 +1,11 @@ +markTestIncomplete(); } - /** - * Test the \Friendica\Module\Api\Twitter\Media\Upload module. - * @runInSeparateProcess - * @preserveGlobalState disabled - */ - public function testApiMediaUpload() - { - $this->expectException(\Friendica\Network\HTTPException\BadRequestException::class); - $_SERVER['REQUEST_METHOD'] = Router::POST; - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); - } - /** - * Test the \Friendica\Module\Api\Twitter\Media\Upload module without an authenticated user. - * - * @return void - */ - public function testApiMediaUploadWithoutAuthenticatedUser() - { - $this->expectException(\Friendica\Network\HTTPException\UnauthorizedException::class); - BasicAuth::setCurrentUserID(); - $_SESSION['authenticated'] = false; - $_SERVER['REQUEST_METHOD'] = Router::POST; - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); - } - - /** - * Test the \Friendica\Module\Api\Twitter\Media\Upload module with an invalid uploaded media. - * - * @return void - */ - public function testApiMediaUploadWithMedia() - { - $this->expectException(\Friendica\Network\HTTPException\InternalServerErrorException::class); - $_FILES = [ - 'media' => [ - 'id' => 666, - 'tmp_name' => 'tmp_name' - ] - ]; - $_SERVER['REQUEST_METHOD'] = Router::POST; - (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); - } - - /** - * Test the \Friendica\Module\Api\Twitter\Media\Upload module with an valid uploaded media. - * - * @return void - */ - public function testApiMediaUploadWithValidMedia() - { - $_FILES = [ - 'media' => [ - 'id' => 666, - 'size' => 666, - 'width' => 666, - 'height' => 666, - 'tmp_name' => $this->getTempImage(), - 'name' => 'spacer.png', - 'type' => 'image/png' - ] - ]; - - $_SERVER['REQUEST_METHOD'] = Router::POST; - - $response = (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), $_SERVER))->run(); - $media = json_decode($response->getBody(), true); - - self::assertEquals('image/png', $media['image']['image_type']); - self::assertEquals(1, $media['image']['w']); - self::assertEquals(1, $media['image']['h']); - self::assertNotEmpty($media['image']['friendica_preview_url']); - } /** * Test the api_statuses_repeat() function. diff --git a/tests/src/Module/Api/ApiTest.php b/tests/src/Module/Api/ApiTest.php index 98e9b2a03c..154f54a1cf 100644 --- a/tests/src/Module/Api/ApiTest.php +++ b/tests/src/Module/Api/ApiTest.php @@ -27,9 +27,11 @@ use Friendica\Core\Hook; use Friendica\Database\Database; use Friendica\DI; use Friendica\Security\Authentication; +use Friendica\Security\BasicAuth; use Friendica\Test\FixtureTest; use Friendica\Test\Util\AppDouble; use Friendica\Test\Util\AuthenticationDouble; +use Friendica\Test\Util\AuthTestConfig; abstract class ApiTest extends FixtureTest { @@ -60,9 +62,19 @@ abstract class ApiTest extends FixtureTest // Manual override to bypass API authentication DI::app()->setIsLoggedIn(true); + AuthTestConfig::$authenticated = true; + AuthTestConfig::$user_id = 42; + $this->installAuthTest(); } + protected function tearDown(): void + { + BasicAuth::setCurrentUserID(); + + parent::tearDown(); // TODO: Change the autogenerated stub + } + /** * installs auththest. * diff --git a/tests/src/Module/Api/Twitter/Media/UploadTest.php b/tests/src/Module/Api/Twitter/Media/UploadTest.php new file mode 100644 index 0000000000..abc9d8fdc6 --- /dev/null +++ b/tests/src/Module/Api/Twitter/Media/UploadTest.php @@ -0,0 +1,101 @@ +expectException(BadRequestException::class); + $upload = new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]); + $upload->run(); + } + + /** + * Test the \Friendica\Module\Api\Twitter\Media\Upload module without an authenticated user. + * + * @return void + */ + public function testApiMediaUploadWithoutAuthenticatedUser() + { + $this->expectException(UnauthorizedException::class); + AuthTestConfig::$authenticated = false; + (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); + } + + /** + * Test the \Friendica\Module\Api\Twitter\Media\Upload module with an invalid uploaded media. + * + * @return void + */ + public function testApiMediaUploadWithMedia() + { + $this->expectException(InternalServerErrorException::class); + $_FILES = [ + 'media' => [ + 'id' => 666, + 'tmp_name' => 'tmp_name' + ] + ]; + (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); + } + + /** + * Test the \Friendica\Module\Api\Twitter\Media\Upload module with an valid uploaded media. + * + * @return void + */ + public function testApiMediaUploadWithValidMedia() + { + $_FILES = [ + 'media' => [ + 'id' => 666, + 'size' => 666, + 'width' => 666, + 'height' => 666, + 'tmp_name' => $this->getTempImage(), + 'name' => 'spacer.png', + 'type' => 'image/png' + ] + ]; + + $response = (new Upload(DI::app(), DI::l10n(), DI::baseUrl(), DI::args(), DI::logger(), DI::profiler(), DI::apiResponse(), ['REQUEST_METHOD' => Router::POST]))->run(); + $media = json_decode($response->getBody(), true); + + self::assertEquals('image/png', $media['image']['image_type']); + self::assertEquals(1, $media['image']['w']); + self::assertEquals(1, $media['image']['h']); + self::assertNotEmpty($media['image']['friendica_preview_url']); + } + + /** + * Get the path to a temporary empty PNG image. + * + * @return string Path + */ + private function getTempImage() + { + $tmpFile = tempnam(sys_get_temp_dir(), 'tmp_file'); + file_put_contents( + $tmpFile, + base64_decode( + // Empty 1x1 px PNG image + 'iVBORw0KGgoAAAANSUhEUgAAAAEAAAABCAYAAAAfFcSJAAAADUlEQVR42mP8/5+hHgAHggJ/PchI7wAAAABJRU5ErkJggg==' + ) + ); + + return $tmpFile; + } +} From 03d2160690d51367d886c5d701b866d5f17f3c01 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 30 Nov 2021 21:41:10 +0000 Subject: [PATCH 19/20] Removed second ppst parameter --- src/Module/Api/Friendica/Activity.php | 2 +- src/Module/Api/Friendica/DirectMessages/Setseen.php | 2 +- src/Module/Api/Friendica/Group/Delete.php | 2 +- src/Module/Api/Friendica/Group/Update.php | 2 +- src/Module/Api/Friendica/Notification/Seen.php | 2 +- src/Module/Api/Friendica/Photo/Delete.php | 2 +- src/Module/Api/Friendica/Photoalbum/Delete.php | 2 +- src/Module/Api/Friendica/Photoalbum/Update.php | 2 +- src/Module/Api/Twitter/Account/UpdateProfile.php | 2 +- src/Module/Api/Twitter/Favorites/Create.php | 2 +- src/Module/Api/Twitter/Favorites/Destroy.php | 2 +- src/Module/Api/Twitter/Friendships/Destroy.php | 2 +- src/Module/Api/Twitter/Media/Metadata/Create.php | 2 +- src/Module/Api/Twitter/Media/Upload.php | 2 +- src/Module/Api/Twitter/Statuses/Destroy.php | 2 +- src/Module/Api/Twitter/Statuses/Retweet.php | 2 +- 16 files changed, 16 insertions(+), 16 deletions(-) diff --git a/src/Module/Api/Friendica/Activity.php b/src/Module/Api/Friendica/Activity.php index 3aaa36d203..ca96e39a8c 100644 --- a/src/Module/Api/Friendica/Activity.php +++ b/src/Module/Api/Friendica/Activity.php @@ -40,7 +40,7 @@ use Friendica\Module\BaseApi; */ class Activity extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/DirectMessages/Setseen.php b/src/Module/Api/Friendica/DirectMessages/Setseen.php index 08f5916f5e..db4cd781e2 100644 --- a/src/Module/Api/Friendica/DirectMessages/Setseen.php +++ b/src/Module/Api/Friendica/DirectMessages/Setseen.php @@ -30,7 +30,7 @@ use Friendica\Module\BaseApi; */ class Setseen extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Group/Delete.php b/src/Module/Api/Friendica/Group/Delete.php index b1d3f7f7c6..5077dbc7be 100644 --- a/src/Module/Api/Friendica/Group/Delete.php +++ b/src/Module/Api/Friendica/Group/Delete.php @@ -32,7 +32,7 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Delete extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Group/Update.php b/src/Module/Api/Friendica/Group/Update.php index a0f43cd3a3..92c42df553 100644 --- a/src/Module/Api/Friendica/Group/Update.php +++ b/src/Module/Api/Friendica/Group/Update.php @@ -32,7 +32,7 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Update extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Notification/Seen.php b/src/Module/Api/Friendica/Notification/Seen.php index 5e4b132298..07d0e275c8 100644 --- a/src/Module/Api/Friendica/Notification/Seen.php +++ b/src/Module/Api/Friendica/Notification/Seen.php @@ -38,7 +38,7 @@ use Friendica\Network\HTTPException\NotFoundException; */ class Seen extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Photo/Delete.php b/src/Module/Api/Friendica/Photo/Delete.php index 20f61bde2b..1b1c7713b2 100644 --- a/src/Module/Api/Friendica/Photo/Delete.php +++ b/src/Module/Api/Friendica/Photo/Delete.php @@ -32,7 +32,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Delete extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Photoalbum/Delete.php b/src/Module/Api/Friendica/Photoalbum/Delete.php index bfbbee2d36..64db9782cc 100644 --- a/src/Module/Api/Friendica/Photoalbum/Delete.php +++ b/src/Module/Api/Friendica/Photoalbum/Delete.php @@ -34,7 +34,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Delete extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Friendica/Photoalbum/Update.php b/src/Module/Api/Friendica/Photoalbum/Update.php index 0d78f16921..7dc7245c2c 100644 --- a/src/Module/Api/Friendica/Photoalbum/Update.php +++ b/src/Module/Api/Friendica/Photoalbum/Update.php @@ -32,7 +32,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Update extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Account/UpdateProfile.php b/src/Module/Api/Twitter/Account/UpdateProfile.php index 48586217d7..5a66e2772e 100644 --- a/src/Module/Api/Twitter/Account/UpdateProfile.php +++ b/src/Module/Api/Twitter/Account/UpdateProfile.php @@ -32,7 +32,7 @@ use Friendica\Model\Profile; */ class UpdateProfile extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Favorites/Create.php b/src/Module/Api/Twitter/Favorites/Create.php index 638acd49d0..fd23c39f3b 100644 --- a/src/Module/Api/Twitter/Favorites/Create.php +++ b/src/Module/Api/Twitter/Favorites/Create.php @@ -31,7 +31,7 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Create extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Favorites/Destroy.php b/src/Module/Api/Twitter/Favorites/Destroy.php index 1a9041d4a5..73c475fd0d 100644 --- a/src/Module/Api/Twitter/Favorites/Destroy.php +++ b/src/Module/Api/Twitter/Favorites/Destroy.php @@ -31,7 +31,7 @@ use Friendica\Network\HTTPException\BadRequestException; */ class Destroy extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Friendships/Destroy.php b/src/Module/Api/Twitter/Friendships/Destroy.php index acb5bfd406..068ef6c527 100644 --- a/src/Module/Api/Twitter/Friendships/Destroy.php +++ b/src/Module/Api/Twitter/Friendships/Destroy.php @@ -37,7 +37,7 @@ use Friendica\Network\HTTPException; */ class Destroy extends ContactEndpoint { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Media/Metadata/Create.php b/src/Module/Api/Twitter/Media/Metadata/Create.php index 9c59116110..25d8a9dfa8 100644 --- a/src/Module/Api/Twitter/Media/Metadata/Create.php +++ b/src/Module/Api/Twitter/Media/Metadata/Create.php @@ -34,7 +34,7 @@ use Friendica\Util\Network; */ class Create extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Media/Upload.php b/src/Module/Api/Twitter/Media/Upload.php index fb6a90305c..7f58362f20 100644 --- a/src/Module/Api/Twitter/Media/Upload.php +++ b/src/Module/Api/Twitter/Media/Upload.php @@ -35,7 +35,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Upload extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_WRITE); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Statuses/Destroy.php b/src/Module/Api/Twitter/Statuses/Destroy.php index 73b033c419..a8c4be6f4e 100644 --- a/src/Module/Api/Twitter/Statuses/Destroy.php +++ b/src/Module/Api/Twitter/Statuses/Destroy.php @@ -34,7 +34,7 @@ use Friendica\Model\Item; */ class Destroy extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { BaseApi::checkAllowedScope(BaseApi::SCOPE_READ); $uid = BaseApi::getCurrentUserID(); diff --git a/src/Module/Api/Twitter/Statuses/Retweet.php b/src/Module/Api/Twitter/Statuses/Retweet.php index 7c6a53e19a..ef9a1412a1 100644 --- a/src/Module/Api/Twitter/Statuses/Retweet.php +++ b/src/Module/Api/Twitter/Statuses/Retweet.php @@ -40,7 +40,7 @@ use Friendica\Network\HTTPException\InternalServerErrorException; */ class Retweet extends BaseApi { - protected function post(array $request = [], array $post = []) + protected function post(array $request = []) { self::checkAllowedScope(self::SCOPE_WRITE); $uid = self::getCurrentUserID(); From dfa57d54e3566bc82928add1a95911a5d52fdb43 Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 1 Dec 2021 19:23:27 +0000 Subject: [PATCH 20/20] Changed documentation to reflect the changes --- doc/API-Friendica.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/API-Friendica.md b/doc/API-Friendica.md index af47638d2e..726accf62a 100644 --- a/doc/API-Friendica.md +++ b/doc/API-Friendica.md @@ -220,7 +220,7 @@ Deprecated Twitter sent direct message list endpoint. Returns [Private Messages] * `friendica_verbose`: "true" enables different error returns (default: "false") -### POST/PUT api/direct_messages/new +### POST api/direct_messages/new Deprecated Twitter direct message submission endpoint. @@ -232,7 +232,7 @@ Deprecated Twitter direct message submission endpoint. * `replyto`: ID of the replied direct message * `title`: Title of the direct message -### POST/DELETE api/direct_messages/destroy +### POST api/direct_messages/destroy Deprecated Twitter direct message deletion endpoint. @@ -313,7 +313,7 @@ Array of: * `gid`: id of the group * `user`: array of [Contacts](help/API-Entities#Contact) -### POST/PUT api/friendica/group_create +### POST api/friendica/group_create Create the group with the posted array of contacts as members. @@ -366,7 +366,7 @@ Array of: * `status`: "missing user" | "ok" * `wrong users`: array of users, which were not available in the contact table -### POST/DELETE api/friendica/group_delete +### POST api/friendica/group_delete Delete the specified group of contacts; API call need to include the correct gid AND name of the group to be deleted. @@ -565,7 +565,7 @@ On error: "unknown error - update photo entry in database failed", "unknown error - this error on uploading or updating a photo should never happen" -### DELETE api/friendica/photo/delete +### POST api/friendica/photo/delete Deletes a single image with the specified id, is not reversible -> ensure that client is asking user for being sure to do this Sets item table entries for this photo to deleted = 1. @@ -595,7 +595,7 @@ On error: --- -### POST/DELETE api/friendica/photoalbum/delete +### POST api/friendica/photoalbum/delete Deletes all images with the specified album name, is not reversible -> ensure that client is asking user for being sure to do this. @@ -622,7 +622,7 @@ On error: * 400 BADREQUEST: "no albumname specified", "album not available" * 500 INTERNALSERVERERROR: "problem with deleting item occured", "unknown error - deleting from database failed" -### POST/PUT api/friendica/photoalbum/update +### POST api/friendica/photoalbum/update Changes the album name to album_new for all photos in album.