forked from AkkomaGang/akkoma
Merge branch 'develop' of https://git.pleroma.social/pleroma/pleroma into develop
This commit is contained in:
commit
292ddf730c
151 changed files with 1279 additions and 175 deletions
4
.gitignore
vendored
4
.gitignore
vendored
|
@ -54,3 +54,7 @@ pleroma.iml
|
|||
|
||||
# asdf
|
||||
.tool-versions
|
||||
|
||||
# Editor temp files
|
||||
/*~
|
||||
/*#
|
|
@ -37,13 +37,13 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||
- **Breaking:** AdminAPI `GET /api/pleroma/admin/instances/:instance/statuses` changed response format and added the number of total users posts.
|
||||
- Admin API: Reports now ordered by newest
|
||||
- Pleroma API: `GET /api/v1/pleroma/chats` is deprecated in favor of `GET /api/v2/pleroma/chats`.
|
||||
- Pleroma API: Reroute `/api/pleroma/*` to `/api/v1/pleroma/*`
|
||||
|
||||
</details>
|
||||
|
||||
### Added
|
||||
|
||||
- Reports now generate notifications for admins and mods.
|
||||
- Experimental websocket-based federation between Pleroma instances.
|
||||
- Support for local-only statuses.
|
||||
- Support pagination of blocks and mutes.
|
||||
- Account backup.
|
||||
|
@ -59,6 +59,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||
- Ability to define custom HTTP headers per each frontend
|
||||
- MRF (`NoEmptyPolicy`): New MRF Policy which will deny empty statuses or statuses of only mentions from being created by local users
|
||||
- New users will receive a simple email confirming their registration if no other emails will be dispatched. (e.g., Welcome, Confirmation, or Approval Required)
|
||||
- The `application` metadata returned with statuses is no longer hardcoded. Apps that want to display these details will now have valid data for new posts after this change.
|
||||
|
||||
<details>
|
||||
<summary>API Changes</summary>
|
||||
|
@ -74,6 +75,7 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
|
|||
- Mastodon API: Home, public, hashtag & list timelines accept `only_media`, `remote` & `local` parameters for filtration.
|
||||
- Mastodon API: `/api/v1/accounts/:id` & `/api/v1/mutes` endpoints accept `with_relationships` parameter and return filled `pleroma.relationship` field.
|
||||
- Mastodon API: Endpoint to remove a conversation (`DELETE /api/v1/conversations/:id`).
|
||||
- Mastodon API: `expires_in` in the scheduled post `params` field on `/api/v1/statuses` and `/api/v1/scheduled_statuses/:id` endpoints.
|
||||
</details>
|
||||
|
||||
### Fixed
|
||||
|
|
|
@ -38,7 +38,7 @@
|
|||
external_user_synchronization: false,
|
||||
static_dir: "test/instance_static/"
|
||||
|
||||
config :pleroma, :activitypub, sign_object_fetches: false
|
||||
config :pleroma, :activitypub, sign_object_fetches: false, follow_handshake_timeout: 0
|
||||
|
||||
# Configure your database
|
||||
config :pleroma, Pleroma.Repo,
|
||||
|
|
|
@ -17,7 +17,7 @@ Feel free to contact us to be added to this list!
|
|||
- Features: MastoAPI
|
||||
|
||||
### Whalebird
|
||||
- Homepage: <https://whalebird.org/>
|
||||
- Homepage: <https://whalebird.social/>
|
||||
- Source Code: <https://github.com/h3poteto/whalebird-desktop>
|
||||
- Contact: [@h3poteto@pleroma.io](https://pleroma.io/users/h3poteto)
|
||||
- Platforms: Windows, Mac, Linux
|
||||
|
|
|
@ -49,7 +49,7 @@ To add configuration to your config file, you can copy it from the base config.
|
|||
* `attachment_links`: Set to true to enable automatically adding attachment link text to statuses.
|
||||
* `max_report_comment_size`: The maximum size of the report comment (Default: `1000`).
|
||||
* `safe_dm_mentions`: If set to true, only mentions at the beginning of a post will be used to address people in direct messages. This is to prevent accidental mentioning of people when talking about them (e.g. "@friend hey i really don't like @enemy"). Default: `false`.
|
||||
* `healthcheck`: If set to true, system data will be shown on ``/api/pleroma/healthcheck``.
|
||||
* `healthcheck`: If set to true, system data will be shown on ``/api/v1/pleroma/healthcheck``.
|
||||
* `remote_post_retention_days`: The default amount of days to retain remote posts when pruning the database.
|
||||
* `user_bio_length`: A user bio maximum length (default: `5000`).
|
||||
* `user_name_length`: A user name maximum length (default: `100`).
|
||||
|
@ -225,7 +225,7 @@ config :pleroma, :mrf_user_allowlist, %{
|
|||
|
||||
This can be used to configure a keyword list that keeps the configuration data for any kind of frontend. By default, settings for `pleroma_fe` and `masto_fe` are configured. You can find the documentation for `pleroma_fe` configuration into [Pleroma-FE configuration and customization for instance administrators](/frontend/CONFIGURATION/#options).
|
||||
|
||||
Frontends can access these settings at `/api/pleroma/frontend_configurations`
|
||||
Frontends can access these settings at `/api/v1/pleroma/frontend_configurations`
|
||||
|
||||
To add your own configuration for PleromaFE, use it like this:
|
||||
|
||||
|
@ -848,13 +848,13 @@ config :pleroma, :admin_token, "somerandomtoken"
|
|||
You can then do
|
||||
|
||||
```shell
|
||||
curl "http://localhost:4000/api/pleroma/admin/users/invites?admin_token=somerandomtoken"
|
||||
curl "http://localhost:4000/api/v1/pleroma/admin/users/invites?admin_token=somerandomtoken"
|
||||
```
|
||||
|
||||
or
|
||||
|
||||
```shell
|
||||
curl -H "X-Admin-Token: somerandomtoken" "http://localhost:4000/api/pleroma/admin/users/invites"
|
||||
curl -H "X-Admin-Token: somerandomtoken" "http://localhost:4000/api/v1/pleroma/admin/users/invites"
|
||||
```
|
||||
|
||||
Warning: it's discouraged to use this feature because of the associated security risk: static / rarely changed instance-wide token is much weaker compared to email-password pair of a real admin user; consider using HTTP Basic Auth or OAuth-based authentication instead.
|
||||
|
|
|
@ -2,7 +2,9 @@
|
|||
|
||||
Authentication is required and the user must be an admin.
|
||||
|
||||
## `GET /api/pleroma/admin/users`
|
||||
The `/api/v1/pleroma/admin/*` path is backwards compatible with `/api/pleroma/admin/*` (`/api/pleroma/admin/*` will be deprecated in the future).
|
||||
|
||||
## `GET /api/v1/pleroma/admin/users`
|
||||
|
||||
### List users
|
||||
|
||||
|
@ -23,7 +25,7 @@ Authentication is required and the user must be an admin.
|
|||
- *optional* `actor_types`: **[string]** actor type list (`Person`, `Service`, `Application`)
|
||||
- *optional* `name`: **string** user display name
|
||||
- *optional* `email`: **string** user email
|
||||
- Example: `https://mypleroma.org/api/pleroma/admin/users?query=john&filters=local,active&page=1&page_size=10&tags[]=some_tag&tags[]=another_tag&name=display_name&email=email@example.com`
|
||||
- Example: `https://mypleroma.org/api/v1/pleroma/admin/users?query=john&filters=local,active&page=1&page_size=10&tags[]=some_tag&tags[]=another_tag&name=display_name&email=email@example.com`
|
||||
- Response:
|
||||
|
||||
```json
|
||||
|
@ -52,7 +54,7 @@ Authentication is required and the user must be an admin.
|
|||
}
|
||||
```
|
||||
|
||||
## DEPRECATED `DELETE /api/pleroma/admin/users`
|
||||
## DEPRECATED `DELETE /api/v1/pleroma/admin/users`
|
||||
|
||||
### Remove a user
|
||||
|
||||
|
@ -60,7 +62,7 @@ Authentication is required and the user must be an admin.
|
|||
- `nickname`
|
||||
- Response: User’s nickname
|
||||
|
||||
## `DELETE /api/pleroma/admin/users`
|
||||
## `DELETE /api/v1/pleroma/admin/users`
|
||||
|
||||
### Remove a user
|
||||
|
||||
|
@ -81,7 +83,7 @@ Authentication is required and the user must be an admin.
|
|||
]
|
||||
- Response: User’s nickname
|
||||
|
||||
## `POST /api/pleroma/admin/users/follow`
|
||||
## `POST /api/v1/pleroma/admin/users/follow`
|
||||
|
||||
### Make a user follow another user
|
||||
|
||||
|
@ -91,7 +93,7 @@ Authentication is required and the user must be an admin.
|
|||
- Response:
|
||||
- "ok"
|
||||
|
||||
## `POST /api/pleroma/admin/users/unfollow`
|
||||
## `POST /api/v1/pleroma/admin/users/unfollow`
|
||||
|
||||
### Make a user unfollow another user
|
||||
|
||||
|
@ -101,7 +103,7 @@ Authentication is required and the user must be an admin.
|
|||
- Response:
|
||||
- "ok"
|
||||
|
||||
## `PATCH /api/pleroma/admin/users/:nickname/toggle_activation`
|
||||
## `PATCH /api/v1/pleroma/admin/users/:nickname/toggle_activation`
|
||||
|
||||
### Toggle user activation
|
||||
|
||||
|
@ -117,7 +119,7 @@ Authentication is required and the user must be an admin.
|
|||
}
|
||||
```
|
||||
|
||||
## `PUT /api/pleroma/admin/users/tag`
|
||||
## `PUT /api/v1/pleroma/admin/users/tag`
|
||||
|
||||
### Tag a list of users
|
||||
|
||||
|
@ -125,7 +127,7 @@ Authentication is required and the user must be an admin.
|
|||
- `nicknames` (array)
|
||||
- `tags` (array)
|
||||
|
||||
## `DELETE /api/pleroma/admin/users/tag`
|
||||
## `DELETE /api/v1/pleroma/admin/users/tag`
|
||||
|
||||
### Untag a list of users
|
||||
|
||||
|
@ -133,7 +135,7 @@ Authentication is required and the user must be an admin.
|
|||
- `nicknames` (array)
|
||||
- `tags` (array)
|
||||
|
||||
## `GET /api/pleroma/admin/users/:nickname/permission_group`
|
||||
## `GET /api/v1/pleroma/admin/users/:nickname/permission_group`
|
||||
|
||||
### Get user user permission groups membership
|
||||
|
||||
|
@ -147,7 +149,7 @@ Authentication is required and the user must be an admin.
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/users/:nickname/permission_group/:permission_group`
|
||||
## `GET /api/v1/pleroma/admin/users/:nickname/permission_group/:permission_group`
|
||||
|
||||
Note: Available `:permission_group` is currently moderator and admin. 404 is returned when the permission group doesn’t exist.
|
||||
|
||||
|
@ -163,7 +165,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
}
|
||||
```
|
||||
|
||||
## DEPRECATED `POST /api/pleroma/admin/users/:nickname/permission_group/:permission_group`
|
||||
## DEPRECATED `POST /api/v1/pleroma/admin/users/:nickname/permission_group/:permission_group`
|
||||
|
||||
### Add user to permission group
|
||||
|
||||
|
@ -172,7 +174,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
- On failure: `{"error": "…"}`
|
||||
- On success: JSON of the user
|
||||
|
||||
## `POST /api/pleroma/admin/users/permission_group/:permission_group`
|
||||
## `POST /api/v1/pleroma/admin/users/permission_group/:permission_group`
|
||||
|
||||
### Add users to permission group
|
||||
|
||||
|
@ -182,9 +184,9 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
- On failure: `{"error": "…"}`
|
||||
- On success: JSON of the user
|
||||
|
||||
## DEPRECATED `DELETE /api/pleroma/admin/users/:nickname/permission_group/:permission_group`
|
||||
## DEPRECATED `DELETE /api/v1/pleroma/admin/users/:nickname/permission_group/:permission_group`
|
||||
|
||||
## `DELETE /api/pleroma/admin/users/:nickname/permission_group/:permission_group`
|
||||
## `DELETE /api/v1/pleroma/admin/users/:nickname/permission_group/:permission_group`
|
||||
|
||||
### Remove user from permission group
|
||||
|
||||
|
@ -194,7 +196,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
- On success: JSON of the user
|
||||
- Note: An admin cannot revoke their own admin status.
|
||||
|
||||
## `DELETE /api/pleroma/admin/users/permission_group/:permission_group`
|
||||
## `DELETE /api/v1/pleroma/admin/users/permission_group/:permission_group`
|
||||
|
||||
### Remove users from permission group
|
||||
|
||||
|
@ -205,7 +207,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
- On success: JSON of the user
|
||||
- Note: An admin cannot revoke their own admin status.
|
||||
|
||||
## `PATCH /api/pleroma/admin/users/activate`
|
||||
## `PATCH /api/v1/pleroma/admin/users/activate`
|
||||
|
||||
### Activate user
|
||||
|
||||
|
@ -223,7 +225,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
}
|
||||
```
|
||||
|
||||
## `PATCH /api/pleroma/admin/users/deactivate`
|
||||
## `PATCH /api/v1/pleroma/admin/users/deactivate`
|
||||
|
||||
### Deactivate user
|
||||
|
||||
|
@ -241,7 +243,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
}
|
||||
```
|
||||
|
||||
## `PATCH /api/pleroma/admin/users/approve`
|
||||
## `PATCH /api/v1/pleroma/admin/users/approve`
|
||||
|
||||
### Approve user
|
||||
|
||||
|
@ -259,7 +261,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/users/:nickname_or_id`
|
||||
## `GET /api/v1/pleroma/admin/users/:nickname_or_id`
|
||||
|
||||
### Retrive the details of a user
|
||||
|
||||
|
@ -269,7 +271,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
- On failure: `Not found`
|
||||
- On success: JSON of the user
|
||||
|
||||
## `GET /api/pleroma/admin/users/:nickname_or_id/statuses`
|
||||
## `GET /api/v1/pleroma/admin/users/:nickname_or_id/statuses`
|
||||
|
||||
### Retrive user's latest statuses
|
||||
|
||||
|
@ -293,7 +295,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/instances/:instance/statuses`
|
||||
## `GET /api/v1/pleroma/admin/instances/:instance/statuses`
|
||||
|
||||
### Retrive instance's latest statuses
|
||||
|
||||
|
@ -317,7 +319,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/statuses`
|
||||
## `GET /api/v1/pleroma/admin/statuses`
|
||||
|
||||
### Retrives all latest statuses
|
||||
|
||||
|
@ -330,7 +332,7 @@ Note: Available `:permission_group` is currently moderator and admin. 404 is ret
|
|||
- On failure: `Not found`
|
||||
- On success: JSON array of user's latest statuses
|
||||
|
||||
## `GET /api/pleroma/admin/relay`
|
||||
## `GET /api/v1/pleroma/admin/relay`
|
||||
|
||||
### List Relays
|
||||
|
||||
|
@ -346,7 +348,7 @@ Response:
|
|||
]
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/relay`
|
||||
## `POST /api/v1/pleroma/admin/relay`
|
||||
|
||||
### Follow a Relay
|
||||
|
||||
|
@ -362,7 +364,7 @@ Response:
|
|||
{"actor": "https://example.com/relay", "followed_back": true}
|
||||
```
|
||||
|
||||
## `DELETE /api/pleroma/admin/relay`
|
||||
## `DELETE /api/v1/pleroma/admin/relay`
|
||||
|
||||
### Unfollow a Relay
|
||||
|
||||
|
@ -378,7 +380,7 @@ Response:
|
|||
{"https://example.com/relay"}
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/users/invite_token`
|
||||
## `POST /api/v1/pleroma/admin/users/invite_token`
|
||||
|
||||
### Create an account registration invite token
|
||||
|
||||
|
@ -399,7 +401,7 @@ Response:
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/users/invites`
|
||||
## `GET /api/v1/pleroma/admin/users/invites`
|
||||
|
||||
### Get a list of generated invites
|
||||
|
||||
|
@ -424,7 +426,7 @@ Response:
|
|||
}
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/users/revoke_invite`
|
||||
## `POST /api/v1/pleroma/admin/users/revoke_invite`
|
||||
|
||||
### Revoke invite by token
|
||||
|
||||
|
@ -445,7 +447,7 @@ Response:
|
|||
}
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/users/email_invite`
|
||||
## `POST /api/v1/pleroma/admin/users/email_invite`
|
||||
|
||||
### Sends registration invite via email
|
||||
|
||||
|
@ -466,7 +468,7 @@ Response:
|
|||
]
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/users/:nickname/password_reset`
|
||||
## `GET /api/v1/pleroma/admin/users/:nickname/password_reset`
|
||||
|
||||
### Get a password reset token for a given nickname
|
||||
|
||||
|
@ -477,11 +479,11 @@ Response:
|
|||
```json
|
||||
{
|
||||
"token": "base64 reset token",
|
||||
"link": "https://pleroma.social/api/pleroma/password_reset/url-encoded-base64-token"
|
||||
"link": "https://pleroma.social/api/v1/pleroma/password_reset/url-encoded-base64-token"
|
||||
}
|
||||
```
|
||||
|
||||
## `PATCH /api/pleroma/admin/users/force_password_reset`
|
||||
## `PATCH /api/v1/pleroma/admin/users/force_password_reset`
|
||||
|
||||
### Force passord reset for a user with a given nickname
|
||||
|
||||
|
@ -489,7 +491,7 @@ Response:
|
|||
- `nicknames`
|
||||
- Response: none (code `204`)
|
||||
|
||||
## PUT `/api/pleroma/admin/users/disable_mfa`
|
||||
## PUT `/api/v1/pleroma/admin/users/disable_mfa`
|
||||
|
||||
### Disable mfa for user's account.
|
||||
|
||||
|
@ -497,7 +499,7 @@ Response:
|
|||
- `nickname`
|
||||
- Response: User’s nickname
|
||||
|
||||
## `GET /api/pleroma/admin/users/:nickname/credentials`
|
||||
## `GET /api/v1/pleroma/admin/users/:nickname/credentials`
|
||||
|
||||
### Get the user's email, password, display and settings-related fields
|
||||
|
||||
|
@ -545,7 +547,7 @@ Response:
|
|||
}
|
||||
```
|
||||
|
||||
## `PATCH /api/pleroma/admin/users/:nickname/credentials`
|
||||
## `PATCH /api/v1/pleroma/admin/users/:nickname/credentials`
|
||||
|
||||
### Change the user's email, password, display and settings-related fields
|
||||
|
||||
|
@ -596,7 +598,7 @@ Status: 404
|
|||
{"error": "Not found"}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/reports`
|
||||
## `GET /api/v1/pleroma/admin/reports`
|
||||
|
||||
### Get a list of reports
|
||||
|
||||
|
@ -756,17 +758,17 @@ Status: 404
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/grouped_reports`
|
||||
## `GET /api/v1/pleroma/admin/grouped_reports`
|
||||
|
||||
### Get a list of reports, grouped by status
|
||||
|
||||
- Params: none
|
||||
- On success: JSON, returns a list of reports, where:
|
||||
- `date`: date of the latest report
|
||||
- `account`: the user who has been reported (see `/api/pleroma/admin/reports` for reference)
|
||||
- `status`: reported status (see `/api/pleroma/admin/reports` for reference)
|
||||
- `actors`: users who had reported this status (see `/api/pleroma/admin/reports` for reference)
|
||||
- `reports`: reports (see `/api/pleroma/admin/reports` for reference)
|
||||
- `account`: the user who has been reported (see `/api/v1/pleroma/admin/reports` for reference)
|
||||
- `status`: reported status (see `/api/v1/pleroma/admin/reports` for reference)
|
||||
- `actors`: users who had reported this status (see `/api/v1/pleroma/admin/reports` for reference)
|
||||
- `reports`: reports (see `/api/v1/pleroma/admin/reports` for reference)
|
||||
|
||||
```json
|
||||
"reports": [
|
||||
|
@ -780,7 +782,7 @@ Status: 404
|
|||
]
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/reports/:id`
|
||||
## `GET /api/v1/pleroma/admin/reports/:id`
|
||||
|
||||
### Get an individual report
|
||||
|
||||
|
@ -792,7 +794,7 @@ Status: 404
|
|||
- 404 Not Found `"Not found"`
|
||||
- On success: JSON, Report object (see above)
|
||||
|
||||
## `PATCH /api/pleroma/admin/reports`
|
||||
## `PATCH /api/v1/pleroma/admin/reports`
|
||||
|
||||
### Change the state of one or multiple reports
|
||||
|
||||
|
@ -823,7 +825,7 @@ Status: 404
|
|||
|
||||
- On success: `204`, empty response
|
||||
|
||||
## `POST /api/pleroma/admin/reports/:id/notes`
|
||||
## `POST /api/v1/pleroma/admin/reports/:id/notes`
|
||||
|
||||
### Create report note
|
||||
|
||||
|
@ -835,7 +837,7 @@ Status: 404
|
|||
- 400 Bad Request `"Invalid parameters"` when `status` is missing
|
||||
- On success: `204`, empty response
|
||||
|
||||
## `DELETE /api/pleroma/admin/reports/:report_id/notes/:id`
|
||||
## `DELETE /api/v1/pleroma/admin/reports/:report_id/notes/:id`
|
||||
|
||||
### Delete report note
|
||||
|
||||
|
@ -847,7 +849,7 @@ Status: 404
|
|||
- 400 Bad Request `"Invalid parameters"` when `status` is missing
|
||||
- On success: `204`, empty response
|
||||
|
||||
## `GET /api/pleroma/admin/statuses/:id`
|
||||
## `GET /api/v1/pleroma/admin/statuses/:id`
|
||||
|
||||
### Show status by id
|
||||
|
||||
|
@ -858,7 +860,7 @@ Status: 404
|
|||
- 404 Not Found `"Not Found"`
|
||||
- On success: JSON, Mastodon Status entity
|
||||
|
||||
## `PUT /api/pleroma/admin/statuses/:id`
|
||||
## `PUT /api/v1/pleroma/admin/statuses/:id`
|
||||
|
||||
### Change the scope of an individual reported status
|
||||
|
||||
|
@ -873,7 +875,7 @@ Status: 404
|
|||
- 404 Not Found `"Not found"`
|
||||
- On success: JSON, Mastodon Status entity
|
||||
|
||||
## `DELETE /api/pleroma/admin/statuses/:id`
|
||||
## `DELETE /api/v1/pleroma/admin/statuses/:id`
|
||||
|
||||
### Delete an individual reported status
|
||||
|
||||
|
@ -885,7 +887,7 @@ Status: 404
|
|||
- 404 Not Found `"Not found"`
|
||||
- On success: 200 OK `{}`
|
||||
|
||||
## `GET /api/pleroma/admin/restart`
|
||||
## `GET /api/v1/pleroma/admin/restart`
|
||||
|
||||
### Restarts pleroma application
|
||||
|
||||
|
@ -900,7 +902,7 @@ Status: 404
|
|||
{}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/need_reboot`
|
||||
## `GET /api/v1/pleroma/admin/need_reboot`
|
||||
|
||||
### Returns the flag whether the pleroma should be restarted
|
||||
|
||||
|
@ -913,7 +915,7 @@ Status: 404
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/config`
|
||||
## `GET /api/v1/pleroma/admin/config`
|
||||
|
||||
### Get list of merged default settings with saved in database.
|
||||
|
||||
|
@ -940,7 +942,7 @@ Status: 404
|
|||
}
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/config`
|
||||
## `POST /api/v1/pleroma/admin/config`
|
||||
|
||||
### Update config settings
|
||||
|
||||
|
@ -1089,7 +1091,7 @@ config :quack,
|
|||
}
|
||||
```
|
||||
|
||||
## ` GET /api/pleroma/admin/config/descriptions`
|
||||
## ` GET /api/v1/pleroma/admin/config/descriptions`
|
||||
|
||||
### Get JSON with config descriptions.
|
||||
Loads json generated from `config/descriptions.exs`.
|
||||
|
@ -1122,7 +1124,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
}]
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/moderation_log`
|
||||
## `GET /api/v1/pleroma/admin/moderation_log`
|
||||
|
||||
### Get moderation log
|
||||
|
||||
|
@ -1152,7 +1154,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
]
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/reload_emoji`
|
||||
## `POST /api/v1/pleroma/admin/reload_emoji`
|
||||
|
||||
### Reload the instance's custom emoji
|
||||
|
||||
|
@ -1160,7 +1162,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
- Params: None
|
||||
- Response: JSON, "ok" and 200 status
|
||||
|
||||
## `PATCH /api/pleroma/admin/users/confirm_email`
|
||||
## `PATCH /api/v1/pleroma/admin/users/confirm_email`
|
||||
|
||||
### Confirm users' emails
|
||||
|
||||
|
@ -1168,7 +1170,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
- `nicknames`
|
||||
- Response: Array of user nicknames
|
||||
|
||||
## `PATCH /api/pleroma/admin/users/resend_confirmation_email`
|
||||
## `PATCH /api/v1/pleroma/admin/users/resend_confirmation_email`
|
||||
|
||||
### Resend confirmation email
|
||||
|
||||
|
@ -1176,13 +1178,13 @@ Loads json generated from `config/descriptions.exs`.
|
|||
- `nicknames`
|
||||
- Response: Array of user nicknames
|
||||
|
||||
## `GET /api/pleroma/admin/stats`
|
||||
## `GET /api/v1/pleroma/admin/stats`
|
||||
|
||||
### Stats
|
||||
|
||||
- Query Params:
|
||||
- *optional* `instance`: **string** instance hostname (without protocol) to get stats for
|
||||
- Example: `https://mypleroma.org/api/pleroma/admin/stats?instance=lain.com`
|
||||
- Example: `https://mypleroma.org/api/v1/pleroma/admin/stats?instance=lain.com`
|
||||
|
||||
- Response:
|
||||
|
||||
|
@ -1197,7 +1199,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/oauth_app`
|
||||
## `GET /api/v1/pleroma/admin/oauth_app`
|
||||
|
||||
### List OAuth app
|
||||
|
||||
|
@ -1229,7 +1231,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
```
|
||||
|
||||
|
||||
## `POST /api/pleroma/admin/oauth_app`
|
||||
## `POST /api/v1/pleroma/admin/oauth_app`
|
||||
|
||||
### Create OAuth App
|
||||
|
||||
|
@ -1262,7 +1264,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
}
|
||||
```
|
||||
|
||||
## `PATCH /api/pleroma/admin/oauth_app/:id`
|
||||
## `PATCH /api/v1/pleroma/admin/oauth_app/:id`
|
||||
|
||||
### Update OAuth App
|
||||
|
||||
|
@ -1287,7 +1289,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
}
|
||||
```
|
||||
|
||||
## `DELETE /api/pleroma/admin/oauth_app/:id`
|
||||
## `DELETE /api/v1/pleroma/admin/oauth_app/:id`
|
||||
|
||||
### Delete OAuth App
|
||||
|
||||
|
@ -1298,7 +1300,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
- On failure:
|
||||
- 400 Bad Request `"Invalid parameters"` when `status` is missing
|
||||
|
||||
## `GET /api/pleroma/admin/media_proxy_caches`
|
||||
## `GET /api/v1/pleroma/admin/media_proxy_caches`
|
||||
|
||||
### Get a list of all banned MediaProxy URLs in Cachex
|
||||
|
||||
|
@ -1322,7 +1324,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/media_proxy_caches/delete`
|
||||
## `POST /api/v1/pleroma/admin/media_proxy_caches/delete`
|
||||
|
||||
### Remove a banned MediaProxy URL from Cachex
|
||||
|
||||
|
@ -1337,7 +1339,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/media_proxy_caches/purge`
|
||||
## `POST /api/v1/pleroma/admin/media_proxy_caches/purge`
|
||||
|
||||
### Purge a MediaProxy URL
|
||||
|
||||
|
@ -1353,7 +1355,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
|
||||
```
|
||||
|
||||
## GET /api/pleroma/admin/users/:nickname/chats
|
||||
## GET /api/v1/pleroma/admin/users/:nickname/chats
|
||||
|
||||
### List a user's chats
|
||||
|
||||
|
@ -1382,7 +1384,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
]
|
||||
```
|
||||
|
||||
## GET /api/pleroma/admin/chats/:chat_id
|
||||
## GET /api/v1/pleroma/admin/chats/:chat_id
|
||||
|
||||
### View a single chat
|
||||
|
||||
|
@ -1409,7 +1411,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
}
|
||||
```
|
||||
|
||||
## GET /api/pleroma/admin/chats/:chat_id/messages
|
||||
## GET /api/v1/pleroma/admin/chats/:chat_id/messages
|
||||
|
||||
### List the messages in a chat
|
||||
|
||||
|
@ -1447,7 +1449,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
]
|
||||
```
|
||||
|
||||
## DELETE /api/pleroma/admin/chats/:chat_id/messages/:message_id
|
||||
## DELETE /api/v1/pleroma/admin/chats/:chat_id/messages/:message_id
|
||||
|
||||
### Delete a single message
|
||||
|
||||
|
@ -1474,7 +1476,7 @@ Loads json generated from `config/descriptions.exs`.
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/instance_document/:document_name`
|
||||
## `GET /api/v1/pleroma/admin/instance_document/:document_name`
|
||||
|
||||
### Get an instance document
|
||||
|
||||
|
@ -1488,7 +1490,7 @@ Returns the content of the document
|
|||
<h1>Instance panel</h1>
|
||||
```
|
||||
|
||||
## `PATCH /api/pleroma/admin/instance_document/:document_name`
|
||||
## `PATCH /api/v1/pleroma/admin/instance_document/:document_name`
|
||||
- Params:
|
||||
- `file` (the file to be uploaded, using multipart form data.)
|
||||
|
||||
|
@ -1504,7 +1506,7 @@ Returns the content of the document
|
|||
}
|
||||
```
|
||||
|
||||
## `DELETE /api/pleroma/admin/instance_document/:document_name`
|
||||
## `DELETE /api/v1/pleroma/admin/instance_document/:document_name`
|
||||
|
||||
### Delete an instance document
|
||||
|
||||
|
@ -1516,7 +1518,7 @@ Returns the content of the document
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/admin/frontends
|
||||
## `GET /api/v1/pleroma/admin/frontends
|
||||
|
||||
### List available frontends
|
||||
|
||||
|
@ -1541,7 +1543,7 @@ Returns the content of the document
|
|||
]
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/admin/frontends/install`
|
||||
## `POST /api/v1/pleroma/admin/frontends/install`
|
||||
|
||||
### Install a frontend
|
||||
|
||||
|
|
|
@ -39,6 +39,12 @@ Has these additional fields under the `pleroma` object:
|
|||
- `emoji_reactions`: A list with emoji / reaction maps. The format is `{name: "☕", count: 1, me: true}`. Contains no information about the reacting users, for that use the `/statuses/:id/reactions` endpoint.
|
||||
- `parent_visible`: If the parent of this post is visible to the user or not.
|
||||
|
||||
## Scheduled statuses
|
||||
|
||||
Has these additional fields in `params`:
|
||||
|
||||
- `expires_in`: the number of seconds the posted activity should expire in.
|
||||
|
||||
## Media Attachments
|
||||
|
||||
Has these additional fields under the `pleroma` object:
|
||||
|
@ -92,12 +98,12 @@ Has these additional fields under the `pleroma` object:
|
|||
- `hide_followers_count`: boolean, true when the user has follower stat hiding enabled
|
||||
- `hide_follows_count`: boolean, true when the user has follow stat hiding enabled
|
||||
- `settings_store`: A generic map of settings for frontends. Opaque to the backend. Only returned in `/api/v1/accounts/verify_credentials` and `/api/v1/accounts/update_credentials`
|
||||
- `chat_token`: The token needed for Pleroma chat. Only returned in `/api/v1/accounts/verify_credentials`
|
||||
- `chat_token`: The token needed for Pleroma shoutbox. Only returned in `/api/v1/accounts/verify_credentials`
|
||||
- `deactivated`: boolean, true when the user is deactivated
|
||||
- `allow_following_move`: boolean, true when the user allows automatically follow moved following accounts
|
||||
- `unread_conversation_count`: The count of unread conversations. Only returned to the account owner.
|
||||
- `unread_notifications_count`: The count of unread notifications. Only returned to the account owner.
|
||||
- `notification_settings`: object, can be absent. See `/api/pleroma/notification_settings` for the parameters/keys returned.
|
||||
- `notification_settings`: object, can be absent. See `/api/v1/pleroma/notification_settings` for the parameters/keys returned.
|
||||
- `accepts_chat_messages`: boolean, but can be null if we don't have that information about a user
|
||||
- `favicon`: nullable URL string, Favicon image of the user's instance
|
||||
|
||||
|
|
|
@ -4,7 +4,9 @@ Requests that require it can be authenticated with [an OAuth token](https://tool
|
|||
|
||||
Request parameters can be passed via [query strings](https://en.wikipedia.org/wiki/Query_string) or as [form data](https://www.w3.org/TR/html401/interact/forms.html). Files must be uploaded as `multipart/form-data`.
|
||||
|
||||
## `/api/pleroma/emoji`
|
||||
The `/api/v1/pleroma/*` path is backwards compatible with `/api/pleroma/*` (`/api/pleroma/*` will be deprecated in the future).
|
||||
|
||||
## `/api/v1/pleroma/emoji`
|
||||
### Lists the custom emoji on that server.
|
||||
* Method: `GET`
|
||||
* Authentication: not required
|
||||
|
@ -35,7 +37,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
```
|
||||
* Note: Same data as Mastodon API’s `/api/v1/custom_emojis` but in a different format
|
||||
|
||||
## `/api/pleroma/follow_import`
|
||||
## `/api/v1/pleroma/follow_import`
|
||||
### Imports your follows, for example from a Mastodon CSV file.
|
||||
* Method: `POST`
|
||||
* Authentication: required
|
||||
|
@ -44,7 +46,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
* Response: HTTP 200 on success, 500 on error
|
||||
* Note: Users that can't be followed are silently skipped.
|
||||
|
||||
## `/api/pleroma/blocks_import`
|
||||
## `/api/v1/pleroma/blocks_import`
|
||||
### Imports your blocks.
|
||||
* Method: `POST`
|
||||
* Authentication: required
|
||||
|
@ -52,7 +54,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
* `list`: STRING or FILE containing a whitespace-separated list of accounts to block
|
||||
* Response: HTTP 200 on success, 500 on error
|
||||
|
||||
## `/api/pleroma/mutes_import`
|
||||
## `/api/v1/pleroma/mutes_import`
|
||||
### Imports your mutes.
|
||||
* Method: `POST`
|
||||
* Authentication: required
|
||||
|
@ -60,7 +62,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
* `list`: STRING or FILE containing a whitespace-separated list of accounts to mute
|
||||
* Response: HTTP 200 on success, 500 on error
|
||||
|
||||
## `/api/pleroma/captcha`
|
||||
## `/api/v1/pleroma/captcha`
|
||||
### Get a new captcha
|
||||
* Method: `GET`
|
||||
* Authentication: not required
|
||||
|
@ -68,7 +70,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
* Response: Provider specific JSON, the only guaranteed parameter is `type`
|
||||
* Example response: `{"type": "kocaptcha", "token": "whatever", "url": "https://captcha.kotobank.ch/endpoint", "seconds_valid": 300}`
|
||||
|
||||
## `/api/pleroma/delete_account`
|
||||
## `/api/v1/pleroma/delete_account`
|
||||
### Delete an account
|
||||
* Method `POST`
|
||||
* Authentication: required
|
||||
|
@ -77,7 +79,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
* Response: JSON. Returns `{"status": "success"}` if the deletion was successful, `{"error": "[error message]"}` otherwise
|
||||
* Example response: `{"error": "Invalid password."}`
|
||||
|
||||
## `/api/pleroma/disable_account`
|
||||
## `/api/v1/pleroma/disable_account`
|
||||
### Disable an account
|
||||
* Method `POST`
|
||||
* Authentication: required
|
||||
|
@ -86,21 +88,21 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
* Response: JSON. Returns `{"status": "success"}` if the account was successfully disabled, `{"error": "[error message]"}` otherwise
|
||||
* Example response: `{"error": "Invalid password."}`
|
||||
|
||||
## `/api/pleroma/accounts/mfa`
|
||||
## `/api/v1/pleroma/accounts/mfa`
|
||||
#### Gets current MFA settings
|
||||
* method: `GET`
|
||||
* Authentication: required
|
||||
* OAuth scope: `read:security`
|
||||
* Response: JSON. Returns `{"enabled": "false", "totp": false }`
|
||||
|
||||
## `/api/pleroma/accounts/mfa/setup/totp`
|
||||
## `/api/v1/pleroma/accounts/mfa/setup/totp`
|
||||
#### Pre-setup the MFA/TOTP method
|
||||
* method: `GET`
|
||||
* Authentication: required
|
||||
* OAuth scope: `write:security`
|
||||
* Response: JSON. Returns `{"key": [secret_key], "provisioning_uri": "[qr code uri]" }` when successful, otherwise returns HTTP 422 `{"error": "error_msg"}`
|
||||
|
||||
## `/api/pleroma/accounts/mfa/confirm/totp`
|
||||
## `/api/v1/pleroma/accounts/mfa/confirm/totp`
|
||||
#### Confirms & enables MFA/TOTP support for user account.
|
||||
* method: `POST`
|
||||
* Authentication: required
|
||||
|
@ -111,7 +113,7 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
* Response: JSON. Returns `{}` if the enable was successful, HTTP 422 `{"error": "[error message]"}` otherwise
|
||||
|
||||
|
||||
## `/api/pleroma/accounts/mfa/totp`
|
||||
## `/api/v1/pleroma/accounts/mfa/totp`
|
||||
#### Disables MFA/TOTP method for user account.
|
||||
* method: `DELETE`
|
||||
* Authentication: required
|
||||
|
@ -121,14 +123,14 @@ Request parameters can be passed via [query strings](https://en.wikipedia.org/wi
|
|||
* Response: JSON. Returns `{}` if the disable was successful, HTTP 422 `{"error": "[error message]"}` otherwise
|
||||
* Example response: `{"error": "Invalid password."}`
|
||||
|
||||
## `/api/pleroma/accounts/mfa/backup_codes`
|
||||
## `/api/v1/pleroma/accounts/mfa/backup_codes`
|
||||
#### Generstes backup codes MFA for user account.
|
||||
* method: `GET`
|
||||
* Authentication: required
|
||||
* OAuth scope: `write:security`
|
||||
* Response: JSON. Returns `{"codes": codes}`when successful, otherwise HTTP 422 `{"error": "[error message]"}`
|
||||
|
||||
## `/api/pleroma/admin/`
|
||||
## `/api/v1/pleroma/admin/`
|
||||
See [Admin-API](admin_api.md)
|
||||
|
||||
## `/api/v1/pleroma/notifications/read`
|
||||
|
@ -298,7 +300,7 @@ See [Admin-API](admin_api.md)
|
|||
* Note: Behaves exactly the same as `POST /api/v1/upload`.
|
||||
Can only accept images - any attempt to upload non-image files will be met with `HTTP 415 Unsupported Media Type`.
|
||||
|
||||
## `/api/pleroma/notification_settings`
|
||||
## `/api/v1/pleroma/notification_settings`
|
||||
### Updates user notification settings
|
||||
* Method `PUT`
|
||||
* Authentication: required
|
||||
|
@ -307,7 +309,7 @@ See [Admin-API](admin_api.md)
|
|||
* `hide_notification_contents`: BOOLEAN field. When set to true, it removes the contents of a message from the push notification.
|
||||
* Response: JSON. Returns `{"status": "success"}` if the update was successful, otherwise returns `{"error": "error_msg"}`
|
||||
|
||||
## `/api/pleroma/healthcheck`
|
||||
## `/api/v1/pleroma/healthcheck`
|
||||
### Healthcheck endpoint with additional system data.
|
||||
* Method `GET`
|
||||
* Authentication: not required
|
||||
|
@ -325,7 +327,7 @@ See [Admin-API](admin_api.md)
|
|||
}
|
||||
```
|
||||
|
||||
## `/api/pleroma/change_email`
|
||||
## `/api/v1/pleroma/change_email`
|
||||
### Change account email
|
||||
* Method `POST`
|
||||
* Authentication: required
|
||||
|
@ -378,7 +380,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* Params: None
|
||||
* Response: JSON, returns a list of Mastodon Conversation entities that were marked as read (200 - healthy, 503 unhealthy).
|
||||
|
||||
## `GET /api/pleroma/emoji/pack?name=:name`
|
||||
## `GET /api/v1/pleroma/emoji/pack?name=:name`
|
||||
|
||||
### Get pack.json for the pack
|
||||
|
||||
|
@ -397,7 +399,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
}
|
||||
```
|
||||
|
||||
## `POST /api/pleroma/emoji/pack?name=:name`
|
||||
## `POST /api/v1/pleroma/emoji/pack?name=:name`
|
||||
|
||||
### Creates an empty pack
|
||||
|
||||
|
@ -407,7 +409,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* `name`: pack name
|
||||
* Response: JSON, "ok" and 200 status or 409 if the pack with that name already exists
|
||||
|
||||
## `PATCH /api/pleroma/emoji/pack?name=:name`
|
||||
## `PATCH /api/v1/pleroma/emoji/pack?name=:name`
|
||||
|
||||
### Updates (replaces) pack metadata
|
||||
|
||||
|
@ -425,7 +427,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* Response: JSON, updated "metadata" section of the pack and 200 status or 400 if there was a
|
||||
problem with the new metadata (the error is specified in the "error" part of the response JSON)
|
||||
|
||||
## `DELETE /api/pleroma/emoji/pack?name=:name`
|
||||
## `DELETE /api/v1/pleroma/emoji/pack?name=:name`
|
||||
|
||||
### Delete a custom emoji pack
|
||||
|
||||
|
@ -435,7 +437,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* `name`: pack name
|
||||
* Response: JSON, "ok" and 200 status or 500 if there was an error deleting the pack
|
||||
|
||||
## `GET /api/pleroma/emoji/packs/import`
|
||||
## `GET /api/v1/pleroma/emoji/packs/import`
|
||||
|
||||
### Imports packs from filesystem
|
||||
|
||||
|
@ -444,7 +446,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* Params: None
|
||||
* Response: JSON, returns a list of imported packs.
|
||||
|
||||
## `GET /api/pleroma/emoji/packs/remote`
|
||||
## `GET /api/v1/pleroma/emoji/packs/remote`
|
||||
|
||||
### Make request to another instance for packs list
|
||||
|
||||
|
@ -456,7 +458,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* `page_size`: page size for packs (default 50)
|
||||
* Response: JSON with the pack list, hashmap with pack name and pack contents
|
||||
|
||||
## `POST /api/pleroma/emoji/packs/download`
|
||||
## `POST /api/v1/pleroma/emoji/packs/download`
|
||||
|
||||
### Download pack from another instance
|
||||
|
||||
|
@ -469,7 +471,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* Response: JSON, "ok" with 200 status if the pack was downloaded, or 500 if there were
|
||||
errors downloading the pack
|
||||
|
||||
## `POST /api/pleroma/emoji/packs/files?name=:name`
|
||||
## `POST /api/v1/pleroma/emoji/packs/files?name=:name`
|
||||
|
||||
### Add new file to the pack
|
||||
|
||||
|
@ -482,7 +484,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* `filename`: (*optional*) new emoji file name. If not specified will be taken from original filename.
|
||||
* Response: JSON, list of files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message.
|
||||
|
||||
## `PATCH /api/pleroma/emoji/packs/files?name=:name`
|
||||
## `PATCH /api/v1/pleroma/emoji/packs/files?name=:name`
|
||||
|
||||
### Update emoji file from pack
|
||||
|
||||
|
@ -496,7 +498,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* `force`: (*optional*) with true value to overwrite existing emoji with new shortcode
|
||||
* Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message.
|
||||
|
||||
## `DELETE /api/pleroma/emoji/packs/files?name=:name`
|
||||
## `DELETE /api/v1/pleroma/emoji/packs/files?name=:name`
|
||||
|
||||
### Delete emoji file from pack
|
||||
|
||||
|
@ -507,7 +509,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
* `shortcode`: emoji file shortcode
|
||||
* Response: JSON, list with updated files for updated pack (hashmap -> shortcode => filename) with status 200, either error status with error message.
|
||||
|
||||
## `GET /api/pleroma/emoji/packs`
|
||||
## `GET /api/v1/pleroma/emoji/packs`
|
||||
|
||||
### Lists local custom emoji packs
|
||||
|
||||
|
@ -528,7 +530,7 @@ The status posting endpoint takes an additional parameter, `in_reply_to_conversa
|
|||
}
|
||||
```
|
||||
|
||||
## `GET /api/pleroma/emoji/packs/archive?name=:name`
|
||||
## `GET /api/v1/pleroma/emoji/packs/archive?name=:name`
|
||||
|
||||
### Requests a local pack archive from the instance
|
||||
|
||||
|
|
|
@ -150,7 +150,7 @@ su pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate"
|
|||
# su pleroma -s $SHELL -lc "./bin/pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/"
|
||||
|
||||
# Start the instance to verify that everything is working as expected
|
||||
su pleroma -s $SHELL -lc "export $(cat /opt/pleroma/config/pleroma.env); ./bin/pleroma daemon"
|
||||
su pleroma -s $SHELL -lc "./bin/pleroma daemon"
|
||||
|
||||
# Wait for about 20 seconds and query the instance endpoint, if it shows your uri, name and email correctly, you are configured correctly
|
||||
sleep 20 && curl http://localhost:4000/api/v1/instance
|
||||
|
|
|
@ -20,7 +20,8 @@ defmodule Mix.Tasks.Pleroma.Ecto.Rollback do
|
|||
start: :boolean,
|
||||
quiet: :boolean,
|
||||
log_sql: :boolean,
|
||||
migrations_path: :string
|
||||
migrations_path: :string,
|
||||
env: :string
|
||||
]
|
||||
|
||||
@moduledoc """
|
||||
|
@ -59,7 +60,7 @@ def run(args \\ []) do
|
|||
level = Logger.level()
|
||||
Logger.configure(level: :info)
|
||||
|
||||
if Pleroma.Config.get(:env) == :test do
|
||||
if opts[:env] == "test" do
|
||||
Logger.info("Rollback succesfully")
|
||||
else
|
||||
{:ok, _, _} =
|
||||
|
|
|
@ -97,13 +97,13 @@ def start(_type, _args) do
|
|||
Pleroma.Stats,
|
||||
Pleroma.JobQueueMonitor,
|
||||
{Majic.Pool, [name: Pleroma.MajicPool, pool_size: Config.get([:majic_pool, :size], 2)]},
|
||||
{Oban, Config.get(Oban)}
|
||||
{Oban, Config.get(Oban)},
|
||||
Pleroma.Web.Endpoint
|
||||
] ++
|
||||
task_children(@mix_env) ++
|
||||
dont_run_in_test(@mix_env) ++
|
||||
chat_child(chat_enabled?()) ++
|
||||
[
|
||||
Pleroma.Web.Endpoint,
|
||||
Pleroma.Gopher.Server
|
||||
]
|
||||
|
||||
|
|
|
@ -18,7 +18,8 @@ defmodule Pleroma.Constants do
|
|||
"emoji",
|
||||
"context_id",
|
||||
"deleted_activity_id",
|
||||
"pleroma_internal"
|
||||
"pleroma_internal",
|
||||
"generator"
|
||||
]
|
||||
)
|
||||
|
||||
|
|
|
@ -23,7 +23,11 @@ def start_link(_) do
|
|||
|
||||
@impl true
|
||||
def init(_args) do
|
||||
{:ok, nil, {:continue, :calculate_stats}}
|
||||
if Pleroma.Config.get(:env) != :test do
|
||||
{:ok, nil, {:continue, :calculate_stats}}
|
||||
else
|
||||
{:ok, calculate_stat_data()}
|
||||
end
|
||||
end
|
||||
|
||||
@doc "Performs update stats"
|
||||
|
|
|
@ -11,7 +11,8 @@ defmodule Pleroma.Upload.Filter.Exiftool do
|
|||
|
||||
@spec filter(Pleroma.Upload.t()) :: {:ok, any()} | {:error, String.t()}
|
||||
|
||||
# webp is not compatible with exiftool at this time
|
||||
# Formats not compatible with exiftool at this time
|
||||
def filter(%Pleroma.Upload{content_type: "image/heic"}), do: {:ok, :noop}
|
||||
def filter(%Pleroma.Upload{content_type: "image/webp"}), do: {:ok, :noop}
|
||||
|
||||
def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
|
||||
|
@ -21,8 +22,8 @@ def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
|
|||
{error, 1} -> {:error, error}
|
||||
end
|
||||
rescue
|
||||
_e in ErlangError ->
|
||||
{:error, "exiftool command not found"}
|
||||
e in ErlangError ->
|
||||
{:error, "#{__MODULE__}: #{inspect(e)}"}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -44,8 +44,8 @@ def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
|
|||
Filter.Mogrify.do_filter(file, [Enum.random(@filters)])
|
||||
{:ok, :filtered}
|
||||
rescue
|
||||
_e in ErlangError ->
|
||||
{:error, "mogrify command not found"}
|
||||
e in ErlangError ->
|
||||
{:error, "#{__MODULE__}: #{inspect(e)}"}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -14,8 +14,8 @@ def filter(%Pleroma.Upload{tempfile: file, content_type: "image" <> _}) do
|
|||
do_filter(file, Pleroma.Config.get!([__MODULE__, :args]))
|
||||
{:ok, :filtered}
|
||||
rescue
|
||||
_e in ErlangError ->
|
||||
{:error, "mogrify command not found"}
|
||||
e in ErlangError ->
|
||||
{:error, "#{__MODULE__}: #{inspect(e)}"}
|
||||
end
|
||||
end
|
||||
|
||||
|
|
|
@ -147,6 +147,7 @@ defmodule Pleroma.User do
|
|||
field(:shared_inbox, :string)
|
||||
field(:accepts_chat_messages, :boolean, default: nil)
|
||||
field(:last_active_at, :naive_datetime)
|
||||
field(:disclose_client, :boolean, default: true)
|
||||
|
||||
embeds_one(
|
||||
:notification_settings,
|
||||
|
@ -513,7 +514,8 @@ def update_changeset(struct, params \\ %{}) do
|
|||
:pleroma_settings_store,
|
||||
:is_discoverable,
|
||||
:actor_type,
|
||||
:accepts_chat_messages
|
||||
:accepts_chat_messages,
|
||||
:disclose_client
|
||||
]
|
||||
)
|
||||
|> unique_constraint(:nickname)
|
||||
|
|
|
@ -63,7 +63,8 @@ defp skip_plug(conn, plug_modules) do
|
|||
|
||||
# Executed just before actual controller action, invokes before-action hooks (callbacks)
|
||||
defp action(conn, params) do
|
||||
with %{halted: false} = conn <- maybe_drop_authentication_if_oauth_check_ignored(conn),
|
||||
with %{halted: false} = conn <-
|
||||
maybe_drop_authentication_if_oauth_check_ignored(conn),
|
||||
%{halted: false} = conn <- maybe_perform_public_or_authenticated_check(conn),
|
||||
%{halted: false} = conn <- maybe_perform_authenticated_check(conn),
|
||||
%{halted: false} = conn <- maybe_halt_on_missing_oauth_scopes_check(conn) do
|
||||
|
@ -232,4 +233,16 @@ defmacro __using__(which) when is_atom(which) do
|
|||
def base_url do
|
||||
Pleroma.Web.Endpoint.url()
|
||||
end
|
||||
|
||||
# TODO: Change to Phoenix.Router.routes/1 for Phoenix 1.6.0+
|
||||
def get_api_routes do
|
||||
Pleroma.Web.Router.__routes__()
|
||||
|> Enum.reject(fn r -> r.plug == Pleroma.Web.Fallback.RedirectController end)
|
||||
|> Enum.map(fn r ->
|
||||
r.path
|
||||
|> String.split("/", trim: true)
|
||||
|> List.first()
|
||||
end)
|
||||
|> Enum.uniq()
|
||||
end
|
||||
end
|
||||
|
|
|
@ -70,19 +70,33 @@ def cast_data(data) do
|
|||
|> changeset(data)
|
||||
end
|
||||
|
||||
defp fix_url(%{"url" => url} = data) when is_list(url) do
|
||||
attachment =
|
||||
Enum.find(url, fn x ->
|
||||
mime_type = x["mimeType"] || x["mediaType"] || ""
|
||||
defp find_attachment(url) do
|
||||
mpeg_url =
|
||||
Enum.find(url, fn
|
||||
%{"mediaType" => mime_type, "tag" => tags} when is_list(tags) ->
|
||||
mime_type == "application/x-mpegURL"
|
||||
|
||||
is_map(x) and String.starts_with?(mime_type, ["video/", "audio/"])
|
||||
_ ->
|
||||
false
|
||||
end)
|
||||
|
||||
link_element =
|
||||
Enum.find(url, fn x ->
|
||||
mime_type = x["mimeType"] || x["mediaType"] || ""
|
||||
url
|
||||
|> Enum.concat(mpeg_url["tag"] || [])
|
||||
|> Enum.find(fn
|
||||
%{"mediaType" => mime_type} -> String.starts_with?(mime_type, ["video/", "audio/"])
|
||||
%{"mimeType" => mime_type} -> String.starts_with?(mime_type, ["video/", "audio/"])
|
||||
_ -> false
|
||||
end)
|
||||
end
|
||||
|
||||
is_map(x) and mime_type == "text/html"
|
||||
defp fix_url(%{"url" => url} = data) when is_list(url) do
|
||||
attachment = find_attachment(url)
|
||||
|
||||
link_element =
|
||||
Enum.find(url, fn
|
||||
%{"mediaType" => "text/html"} -> true
|
||||
%{"mimeType" => "text/html"} -> true
|
||||
_ -> false
|
||||
end)
|
||||
|
||||
data
|
||||
|
|
|
@ -136,11 +136,11 @@ def notes_delete_operation do
|
|||
}
|
||||
end
|
||||
|
||||
defp report_state do
|
||||
def report_state do
|
||||
%Schema{type: :string, enum: ["open", "closed", "resolved"]}
|
||||
end
|
||||
|
||||
defp id_param do
|
||||
def id_param do
|
||||
Operation.parameter(:id, :path, FlakeID, "Report ID",
|
||||
example: "9umDrYheeY451cQnEe",
|
||||
required: true
|
||||
|
|
|
@ -0,0 +1,97 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.ApiSpec.PleromaReportOperation do
|
||||
alias OpenApiSpex.Operation
|
||||
alias OpenApiSpex.Schema
|
||||
alias Pleroma.Web.ApiSpec.Admin.ReportOperation
|
||||
alias Pleroma.Web.ApiSpec.Schemas.Account
|
||||
alias Pleroma.Web.ApiSpec.Schemas.ApiError
|
||||
alias Pleroma.Web.ApiSpec.Schemas.FlakeID
|
||||
alias Pleroma.Web.ApiSpec.Schemas.Status
|
||||
|
||||
def open_api_operation(action) do
|
||||
operation = String.to_existing_atom("#{action}_operation")
|
||||
apply(__MODULE__, operation, [])
|
||||
end
|
||||
|
||||
def index_operation do
|
||||
%Operation{
|
||||
tags: ["Reports"],
|
||||
summary: "Get a list of your own reports",
|
||||
operationId: "PleromaAPI.ReportController.index",
|
||||
security: [%{"oAuth" => ["read:reports"]}],
|
||||
parameters: [
|
||||
Operation.parameter(
|
||||
:state,
|
||||
:query,
|
||||
ReportOperation.report_state(),
|
||||
"Filter by report state"
|
||||
),
|
||||
Operation.parameter(
|
||||
:limit,
|
||||
:query,
|
||||
%Schema{type: :integer},
|
||||
"The number of records to retrieve"
|
||||
),
|
||||
Operation.parameter(
|
||||
:page,
|
||||
:query,
|
||||
%Schema{type: :integer, default: 1},
|
||||
"Page number"
|
||||
),
|
||||
Operation.parameter(
|
||||
:page_size,
|
||||
:query,
|
||||
%Schema{type: :integer, default: 50},
|
||||
"Number number of log entries per page"
|
||||
)
|
||||
],
|
||||
responses: %{
|
||||
200 =>
|
||||
Operation.response("Response", "application/json", %Schema{
|
||||
type: :object,
|
||||
properties: %{
|
||||
total: %Schema{type: :integer},
|
||||
reports: %Schema{
|
||||
type: :array,
|
||||
items: report()
|
||||
}
|
||||
}
|
||||
}),
|
||||
404 => Operation.response("Not Found", "application/json", ApiError)
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
def show_operation do
|
||||
%Operation{
|
||||
tags: ["Reports"],
|
||||
summary: "Get an individual report",
|
||||
operationId: "PleromaAPI.ReportController.show",
|
||||
parameters: [ReportOperation.id_param()],
|
||||
security: [%{"oAuth" => ["read:reports"]}],
|
||||
responses: %{
|
||||
200 => Operation.response("Report", "application/json", report()),
|
||||
404 => Operation.response("Not Found", "application/json", ApiError)
|
||||
}
|
||||
}
|
||||
end
|
||||
|
||||
# Copied from ReportOperation.report with removing notes
|
||||
defp report do
|
||||
%Schema{
|
||||
type: :object,
|
||||
properties: %{
|
||||
id: FlakeID,
|
||||
state: ReportOperation.report_state(),
|
||||
account: Account,
|
||||
actor: Account,
|
||||
content: %Schema{type: :string},
|
||||
created_at: %Schema{type: :string, format: :"date-time"},
|
||||
statuses: %Schema{type: :array, items: Status}
|
||||
}
|
||||
}
|
||||
end
|
||||
end
|
|
@ -30,7 +30,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ScheduledStatus do
|
|||
visibility: %Schema{allOf: [VisibilityScope], nullable: true},
|
||||
scheduled_at: %Schema{type: :string, format: :"date-time", nullable: true},
|
||||
poll: StatusOperation.poll_params(),
|
||||
in_reply_to_id: %Schema{type: :string, nullable: true}
|
||||
in_reply_to_id: %Schema{type: :string, nullable: true},
|
||||
expires_in: %Schema{type: :integer, nullable: true}
|
||||
}
|
||||
}
|
||||
},
|
||||
|
@ -46,7 +47,8 @@ defmodule Pleroma.Web.ApiSpec.Schemas.ScheduledStatus do
|
|||
scheduled_at: nil,
|
||||
poll: nil,
|
||||
idempotency: nil,
|
||||
in_reply_to_id: nil
|
||||
in_reply_to_id: nil,
|
||||
expires_in: nil
|
||||
},
|
||||
media_attachments: [Attachment.schema().example]
|
||||
}
|
||||
|
|
|
@ -23,9 +23,10 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
|
|||
application: %Schema{
|
||||
description: "The application used to post this status",
|
||||
type: :object,
|
||||
nullable: true,
|
||||
properties: %{
|
||||
name: %Schema{type: :string},
|
||||
website: %Schema{type: :string, nullable: true, format: :uri}
|
||||
website: %Schema{type: :string, format: :uri}
|
||||
}
|
||||
},
|
||||
bookmarked: %Schema{type: :boolean, description: "Have you bookmarked this status?"},
|
||||
|
@ -291,7 +292,7 @@ defmodule Pleroma.Web.ApiSpec.Schemas.Status do
|
|||
"url" => "http://localhost:4001/users/nick6",
|
||||
"username" => "nick6"
|
||||
},
|
||||
"application" => %{"name" => "Web", "website" => nil},
|
||||
"application" => nil,
|
||||
"bookmarked" => false,
|
||||
"card" => nil,
|
||||
"content" => "foobar",
|
||||
|
|
|
@ -190,6 +190,7 @@ defp object(draft) do
|
|||
Utils.make_note_data(draft)
|
||||
|> Map.put("emoji", emoji)
|
||||
|> Map.put("source", draft.status)
|
||||
|> Map.put("generator", draft.params[:generator])
|
||||
|
||||
%__MODULE__{draft | object: object}
|
||||
end
|
||||
|
|
26
lib/pleroma/web/fallback/legacy_pleroma_api_rerouter_plug.ex
Normal file
26
lib/pleroma/web/fallback/legacy_pleroma_api_rerouter_plug.ex
Normal file
|
@ -0,0 +1,26 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.Fallback.LegacyPleromaApiRerouterPlug do
|
||||
alias Pleroma.Web.Endpoint
|
||||
alias Pleroma.Web.Fallback.RedirectController
|
||||
|
||||
def init(opts), do: opts
|
||||
|
||||
def call(%{path_info: ["api", "pleroma" | path_info_rest]} = conn, _opts) do
|
||||
new_path_info = ["api", "v1", "pleroma" | path_info_rest]
|
||||
new_request_path = Enum.join(new_path_info, "/")
|
||||
|
||||
conn
|
||||
|> Map.merge(%{
|
||||
path_info: new_path_info,
|
||||
request_path: new_request_path
|
||||
})
|
||||
|> Endpoint.call(conn.params)
|
||||
end
|
||||
|
||||
def call(conn, _opts) do
|
||||
RedirectController.api_not_implemented(conn, %{})
|
||||
end
|
||||
end
|
|
@ -21,6 +21,7 @@ defmodule Pleroma.Web.MastodonAPI.StatusController do
|
|||
alias Pleroma.Web.CommonAPI
|
||||
alias Pleroma.Web.MastodonAPI.AccountView
|
||||
alias Pleroma.Web.MastodonAPI.ScheduledActivityView
|
||||
alias Pleroma.Web.OAuth.Token
|
||||
alias Pleroma.Web.Plugs.OAuthScopesPlug
|
||||
alias Pleroma.Web.Plugs.RateLimiter
|
||||
|
||||
|
@ -138,7 +139,9 @@ def create(
|
|||
_
|
||||
)
|
||||
when not is_nil(scheduled_at) do
|
||||
params = Map.put(params, :in_reply_to_status_id, params[:in_reply_to_id])
|
||||
params =
|
||||
Map.put(params, :in_reply_to_status_id, params[:in_reply_to_id])
|
||||
|> put_application(conn)
|
||||
|
||||
attrs = %{
|
||||
params: Map.new(params, fn {key, value} -> {to_string(key), value} end),
|
||||
|
@ -162,7 +165,9 @@ def create(
|
|||
|
||||
# Creates a regular status
|
||||
def create(%{assigns: %{user: user}, body_params: %{status: _} = params} = conn, _) do
|
||||
params = Map.put(params, :in_reply_to_status_id, params[:in_reply_to_id])
|
||||
params =
|
||||
Map.put(params, :in_reply_to_status_id, params[:in_reply_to_id])
|
||||
|> put_application(conn)
|
||||
|
||||
with {:ok, activity} <- CommonAPI.post(user, params) do
|
||||
try_render(conn, "show.json",
|
||||
|
@ -414,4 +419,15 @@ def bookmarks(%{assigns: %{user: user}} = conn, params) do
|
|||
as: :activity
|
||||
)
|
||||
end
|
||||
|
||||
defp put_application(params, %{assigns: %{token: %Token{user: %User{} = user} = token}} = _conn) do
|
||||
if user.disclose_client do
|
||||
%{client_name: client_name, website: website} = Repo.preload(token, :app).app
|
||||
Map.put(params, :generator, %{type: "Application", name: client_name, url: website})
|
||||
else
|
||||
Map.put(params, :generator, nil)
|
||||
end
|
||||
end
|
||||
|
||||
defp put_application(params, _), do: Map.put(params, :generator, nil)
|
||||
end
|
||||
|
|
|
@ -37,7 +37,8 @@ defp status_params(params) do
|
|||
visibility: params["visibility"],
|
||||
scheduled_at: params["scheduled_at"],
|
||||
poll: params["poll"],
|
||||
in_reply_to_id: params["in_reply_to_id"]
|
||||
in_reply_to_id: params["in_reply_to_id"],
|
||||
expires_in: params["expires_in"]
|
||||
}
|
||||
|> Pleroma.Maps.put_if_present(:media_ids, params["media_ids"])
|
||||
end
|
||||
|
|
|
@ -124,16 +124,16 @@ def render(
|
|||
) do
|
||||
user = CommonAPI.get_user(activity.data["actor"])
|
||||
created_at = Utils.to_masto_date(activity.data["published"])
|
||||
activity_object = Object.normalize(activity, fetch: false)
|
||||
object = Object.normalize(activity, fetch: false)
|
||||
|
||||
reblogged_parent_activity =
|
||||
if opts[:parent_activities] do
|
||||
Activity.Queries.find_by_object_ap_id(
|
||||
opts[:parent_activities],
|
||||
activity_object.data["id"]
|
||||
object.data["id"]
|
||||
)
|
||||
else
|
||||
Activity.create_by_object_ap_id(activity_object.data["id"])
|
||||
Activity.create_by_object_ap_id(object.data["id"])
|
||||
|> Activity.with_preloaded_bookmark(opts[:for])
|
||||
|> Activity.with_set_thread_muted_field(opts[:for])
|
||||
|> Repo.one()
|
||||
|
@ -142,7 +142,7 @@ def render(
|
|||
reblog_rendering_opts = Map.put(opts, :activity, reblogged_parent_activity)
|
||||
reblogged = render("show.json", reblog_rendering_opts)
|
||||
|
||||
favorited = opts[:for] && opts[:for].ap_id in (activity_object.data["likes"] || [])
|
||||
favorited = opts[:for] && opts[:for].ap_id in (object.data["likes"] || [])
|
||||
|
||||
bookmarked = Activity.get_bookmark(reblogged_parent_activity, opts[:for]) != nil
|
||||
|
||||
|
@ -154,8 +154,8 @@ def render(
|
|||
|
||||
%{
|
||||
id: to_string(activity.id),
|
||||
uri: activity_object.data["id"],
|
||||
url: activity_object.data["id"],
|
||||
uri: object.data["id"],
|
||||
url: object.data["id"],
|
||||
account:
|
||||
AccountView.render("show.json", %{
|
||||
user: user,
|
||||
|
@ -180,10 +180,7 @@ def render(
|
|||
media_attachments: reblogged[:media_attachments] || [],
|
||||
mentions: mentions,
|
||||
tags: reblogged[:tags] || [],
|
||||
application: %{
|
||||
name: "Web",
|
||||
website: nil
|
||||
},
|
||||
application: build_application(object.data["generator"]),
|
||||
language: nil,
|
||||
emojis: [],
|
||||
pleroma: %{
|
||||
|
@ -348,10 +345,7 @@ def render("show.json", %{activity: %{data: %{"object" => _object}} = activity}
|
|||
poll: render(PollView, "show.json", object: object, for: opts[:for]),
|
||||
mentions: mentions,
|
||||
tags: build_tags(tags),
|
||||
application: %{
|
||||
name: "Web",
|
||||
website: nil
|
||||
},
|
||||
application: build_application(object.data["generator"]),
|
||||
language: nil,
|
||||
emojis: build_emojis(object.data["emoji"]),
|
||||
pleroma: %{
|
||||
|
@ -540,4 +534,10 @@ defp build_emoji_map(emoji, users, current_user) do
|
|||
me: !!(current_user && current_user.ap_id in users)
|
||||
}
|
||||
end
|
||||
|
||||
@spec build_application(map() | nil) :: map() | nil
|
||||
defp build_application(%{"type" => _type, "name" => name, "url" => url}),
|
||||
do: %{name: name, website: url}
|
||||
|
||||
defp build_application(_), do: nil
|
||||
end
|
||||
|
|
46
lib/pleroma/web/pleroma_api/controllers/report_controller.ex
Normal file
46
lib/pleroma/web/pleroma_api/controllers/report_controller.ex
Normal file
|
@ -0,0 +1,46 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.PleromaAPI.ReportController do
|
||||
use Pleroma.Web, :controller
|
||||
|
||||
alias Pleroma.Activity
|
||||
alias Pleroma.Web.ActivityPub.Utils
|
||||
alias Pleroma.Web.AdminAPI.Report
|
||||
|
||||
action_fallback(Pleroma.Web.MastodonAPI.FallbackController)
|
||||
plug(Pleroma.Web.ApiSpec.CastAndValidate)
|
||||
plug(Pleroma.Web.Plugs.OAuthScopesPlug, %{scopes: ["read:reports"]})
|
||||
|
||||
defdelegate open_api_operation(action), to: Pleroma.Web.ApiSpec.PleromaReportOperation
|
||||
|
||||
@doc "GET /api/v0/pleroma/reports"
|
||||
def index(%{assigns: %{user: user}, body_params: params} = conn, _) do
|
||||
params =
|
||||
params
|
||||
|> Map.put(:actor_id, user.ap_id)
|
||||
|
||||
reports = Utils.get_reports(params, Map.get(params, :page, 1), Map.get(params, :size, 20))
|
||||
|
||||
render(conn, "index.json", %{reports: reports, for: user})
|
||||
end
|
||||
|
||||
@doc "GET /api/v0/pleroma/reports/:id"
|
||||
def show(%{assigns: %{user: user}} = conn, %{id: id}) do
|
||||
with %Activity{} = report <- Activity.get_report(id),
|
||||
true <- report.actor == user.ap_id,
|
||||
%{} = report_info <- Report.extract_report_info(report) do
|
||||
render(conn, "show.json", Map.put(report_info, :for, user))
|
||||
else
|
||||
false ->
|
||||
{:error, :not_found}
|
||||
|
||||
nil ->
|
||||
{:error, :not_found}
|
||||
|
||||
e ->
|
||||
{:error, inspect(e)}
|
||||
end
|
||||
end
|
||||
end
|
55
lib/pleroma/web/pleroma_api/views/report_view.ex
Normal file
55
lib/pleroma/web/pleroma_api/views/report_view.ex
Normal file
|
@ -0,0 +1,55 @@
|
|||
# Pleroma: A lightweight social networking server
|
||||
# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
|
||||
defmodule Pleroma.Web.PleromaAPI.ReportView do
|
||||
use Pleroma.Web, :view
|
||||
|
||||
alias Pleroma.HTML
|
||||
alias Pleroma.Web.AdminAPI.Report
|
||||
alias Pleroma.Web.CommonAPI.Utils
|
||||
alias Pleroma.Web.MastodonAPI.AccountView
|
||||
alias Pleroma.Web.MastodonAPI.StatusView
|
||||
|
||||
def render("index.json", %{reports: reports, for: for_user}) do
|
||||
%{
|
||||
reports:
|
||||
reports[:items]
|
||||
|> Enum.map(&Report.extract_report_info/1)
|
||||
|> Enum.map(&render(__MODULE__, "show.json", Map.put(&1, :for, for_user))),
|
||||
total: reports[:total]
|
||||
}
|
||||
end
|
||||
|
||||
def render("show.json", %{
|
||||
report: report,
|
||||
user: actor,
|
||||
account: account,
|
||||
statuses: statuses,
|
||||
for: for_user
|
||||
}) do
|
||||
created_at = Utils.to_masto_date(report.data["published"])
|
||||
|
||||
content =
|
||||
unless is_nil(report.data["content"]) do
|
||||
HTML.filter_tags(report.data["content"])
|
||||
else
|
||||
nil
|
||||
end
|
||||
|
||||
%{
|
||||
id: report.id,
|
||||
account: AccountView.render("show.json", %{user: account, for: for_user}),
|
||||
actor: AccountView.render("show.json", %{user: actor, for: for_user}),
|
||||
content: content,
|
||||
created_at: created_at,
|
||||
statuses:
|
||||
StatusView.render("index.json", %{
|
||||
activities: statuses,
|
||||
as: :activity,
|
||||
for: for_user
|
||||
}),
|
||||
state: report.data["state"]
|
||||
}
|
||||
end
|
||||
end
|
|
@ -10,6 +10,8 @@ defmodule Pleroma.Web.Plugs.FrontendStatic do
|
|||
"""
|
||||
@behaviour Plug
|
||||
|
||||
@api_routes Pleroma.Web.get_api_routes()
|
||||
|
||||
def file_path(path, frontend_type \\ :primary) do
|
||||
if configuration = Pleroma.Config.get([:frontends, frontend_type]) do
|
||||
instance_static_path = Pleroma.Config.get([:instance, :static_dir], "instance/static")
|
||||
|
@ -34,7 +36,8 @@ def init(opts) do
|
|||
end
|
||||
|
||||
def call(conn, opts) do
|
||||
with false <- invalid_path?(conn.path_info),
|
||||
with false <- api_route?(conn.path_info),
|
||||
false <- invalid_path?(conn.path_info),
|
||||
frontend_type <- Map.get(opts, :frontend_type, :primary),
|
||||
path when not is_nil(path) <- file_path("", frontend_type) do
|
||||
call_static(conn, opts, path)
|
||||
|
@ -52,6 +55,10 @@ defp invalid_path?([h | _], _match) when h in [".", "..", ""], do: true
|
|||
defp invalid_path?([h | t], match), do: String.contains?(h, match) or invalid_path?(t)
|
||||
defp invalid_path?([], _match), do: false
|
||||
|
||||
defp api_route?([h | _]) when h in @api_routes, do: true
|
||||
defp api_route?([_ | t]), do: api_route?(t)
|
||||
defp api_route?([]), do: false
|
||||
|
||||
defp call_static(conn, opts, from) do
|
||||
opts = Map.put(opts, :from, from)
|
||||
Plug.Static.call(conn, opts)
|
||||
|
|
|
@ -140,7 +140,7 @@ defmodule Pleroma.Web.Router do
|
|||
plug(Pleroma.Web.Plugs.MappedSignatureToIdentityPlug)
|
||||
end
|
||||
|
||||
scope "/api/pleroma", Pleroma.Web.TwitterAPI do
|
||||
scope "/api/v1/pleroma", Pleroma.Web.TwitterAPI do
|
||||
pipe_through(:pleroma_api)
|
||||
|
||||
get("/password_reset/:token", PasswordController, :reset, as: :reset_password)
|
||||
|
@ -150,12 +150,12 @@ defmodule Pleroma.Web.Router do
|
|||
get("/healthcheck", UtilController, :healthcheck)
|
||||
end
|
||||
|
||||
scope "/api/pleroma", Pleroma.Web do
|
||||
scope "/api/v1/pleroma", Pleroma.Web do
|
||||
pipe_through(:pleroma_api)
|
||||
post("/uploader_callback/:upload_path", UploaderController, :callback)
|
||||
end
|
||||
|
||||
scope "/api/pleroma/admin", Pleroma.Web.AdminAPI do
|
||||
scope "/api/v1/pleroma/admin", Pleroma.Web.AdminAPI do
|
||||
pipe_through(:admin_api)
|
||||
|
||||
put("/users/disable_mfa", AdminAPIController, :disable_mfa)
|
||||
|
@ -259,7 +259,7 @@ defmodule Pleroma.Web.Router do
|
|||
post("/backups", AdminAPIController, :create_backup)
|
||||
end
|
||||
|
||||
scope "/api/pleroma/emoji", Pleroma.Web.PleromaAPI do
|
||||
scope "/api/v1/pleroma/emoji", Pleroma.Web.PleromaAPI do
|
||||
scope "/pack" do
|
||||
pipe_through(:admin_api)
|
||||
|
||||
|
@ -368,6 +368,12 @@ defmodule Pleroma.Web.Router do
|
|||
get("/statuses/:id/reactions", EmojiReactionController, :index)
|
||||
end
|
||||
|
||||
scope "/api/v0/pleroma", Pleroma.Web.PleromaAPI do
|
||||
pipe_through(:authenticated_api)
|
||||
get("/reports", ReportController, :index)
|
||||
get("/reports/:id", ReportController, :show)
|
||||
end
|
||||
|
||||
scope "/api/v1/pleroma", Pleroma.Web.PleromaAPI do
|
||||
scope [] do
|
||||
pipe_through(:authenticated_api)
|
||||
|
@ -809,6 +815,7 @@ defmodule Pleroma.Web.Router do
|
|||
scope "/", Pleroma.Web.Fallback do
|
||||
get("/registration/:token", RedirectController, :registration_page)
|
||||
get("/:maybe_nickname_or_id", RedirectController, :redirector_with_meta)
|
||||
match(:*, "/api/pleroma*path", LegacyPleromaApiRerouterPlug, [])
|
||||
get("/api*path", RedirectController, :api_not_implemented)
|
||||
get("/*path", RedirectController, :redirector_with_preload)
|
||||
|
||||
|
|
|
@ -4,7 +4,7 @@ defmodule Pleroma.Repo.Migrations.AddDefaultTextSearchConfig do
|
|||
def change do
|
||||
execute("DO $$
|
||||
BEGIN
|
||||
execute 'ALTER DATABASE '||current_database()||' SET default_text_search_config = ''english'' ';
|
||||
execute 'ALTER DATABASE \"'||current_database()||'\" SET default_text_search_config = ''english'' ';
|
||||
END
|
||||
$$;")
|
||||
end
|
||||
|
|
|
@ -0,0 +1,9 @@
|
|||
defmodule Pleroma.Repo.Migrations.AddDiscloseClientToUsers do
|
||||
use Ecto.Migration
|
||||
|
||||
def change do
|
||||
alter table(:users) do
|
||||
add(:disclose_client, :boolean, default: true)
|
||||
end
|
||||
end
|
||||
end
|
|
@ -1 +1 @@
|
|||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,user-scalable=no"><!--server-generated-meta--><link rel=icon type=image/png href=/favicon.png><link href=/static/css/app.9a4c5ede37b2f0230836.css rel=stylesheet></head><body class=hidden><noscript>To use Pleroma, please enable JavaScript.</noscript><div id=app></div><script type=text/javascript src=/static/js/vendors~app.3b02e2e5bd8cdca42216.js></script><script type=text/javascript src=/static/js/app.c6b8a1c86149ed63e6ff.js></script></body></html>
|
||||
<!DOCTYPE html><html lang=en><head><meta charset=utf-8><meta name=viewport content="width=device-width,initial-scale=1,user-scalable=no"><!--server-generated-meta--><link rel=icon type=image/png href=/favicon.png><link href=/static/css/app.9a4c5ede37b2f0230836.css rel=stylesheet></head><body class=hidden><noscript>To use Pleroma, please enable JavaScript.</noscript><div id=app></div><script type=text/javascript src=/static/js/vendors~app.102a26590d3ba87dd908.js></script><script type=text/javascript src=/static/js/app.2e518bb8cf82de7a72b0.js></script></body></html>
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/14.8e7c0873d041b34efd84.js
Normal file
BIN
priv/static/static/js/14.8e7c0873d041b34efd84.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/14.8e7c0873d041b34efd84.js.map
Normal file
BIN
priv/static/static/js/14.8e7c0873d041b34efd84.js.map
Normal file
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/15.349c342e2fe7e9e0fe01.js.map
Normal file
BIN
priv/static/static/js/15.349c342e2fe7e9e0fe01.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/16.cf210505237c2a0040dd.js.map
Normal file
BIN
priv/static/static/js/16.cf210505237c2a0040dd.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/17.fe52ece512025177a3b8.js.map
Normal file
BIN
priv/static/static/js/17.fe52ece512025177a3b8.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/18.c0d447ff77030482a94c.js
Normal file
BIN
priv/static/static/js/18.c0d447ff77030482a94c.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/18.c0d447ff77030482a94c.js.map
Normal file
BIN
priv/static/static/js/18.c0d447ff77030482a94c.js.map
Normal file
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/19.9b0c21b72dedc1b244bd.js.map
Normal file
BIN
priv/static/static/js/19.9b0c21b72dedc1b244bd.js.map
Normal file
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/2.80ae75b951121aacd208.js
Normal file
BIN
priv/static/static/js/2.80ae75b951121aacd208.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/2.80ae75b951121aacd208.js.map
Normal file
BIN
priv/static/static/js/2.80ae75b951121aacd208.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/20.fee3cd69d629f271e653.js
Normal file
BIN
priv/static/static/js/20.fee3cd69d629f271e653.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/20.fee3cd69d629f271e653.js.map
Normal file
BIN
priv/static/static/js/20.fee3cd69d629f271e653.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/21.9b5434a9d2b0b07a3038.js
Normal file
BIN
priv/static/static/js/21.9b5434a9d2b0b07a3038.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/21.9b5434a9d2b0b07a3038.js.map
Normal file
BIN
priv/static/static/js/21.9b5434a9d2b0b07a3038.js.map
Normal file
Binary file not shown.
BIN
priv/static/static/js/22.132b7fba6bee9817b39f.js
Normal file
BIN
priv/static/static/js/22.132b7fba6bee9817b39f.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/22.132b7fba6bee9817b39f.js.map
Normal file
BIN
priv/static/static/js/22.132b7fba6bee9817b39f.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/23.63b95894e9f0eb300da0.js.map
Normal file
BIN
priv/static/static/js/23.63b95894e9f0eb300da0.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/24.10dc1eadca8b0bc15e20.js.map
Normal file
BIN
priv/static/static/js/24.10dc1eadca8b0bc15e20.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/25.e2e834e1b024960e0087.js.map
Normal file
BIN
priv/static/static/js/25.e2e834e1b024960e0087.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/26.74667f919f7bad826ea0.js
Normal file
BIN
priv/static/static/js/26.74667f919f7bad826ea0.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/26.74667f919f7bad826ea0.js.map
Normal file
BIN
priv/static/static/js/26.74667f919f7bad826ea0.js.map
Normal file
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/27.0af03540f78df63eddca.js.map
Normal file
BIN
priv/static/static/js/27.0af03540f78df63eddca.js.map
Normal file
Binary file not shown.
Binary file not shown.
BIN
priv/static/static/js/28.599a889517f15c01b27e.js
Normal file
BIN
priv/static/static/js/28.599a889517f15c01b27e.js
Normal file
Binary file not shown.
BIN
priv/static/static/js/28.599a889517f15c01b27e.js.map
Normal file
BIN
priv/static/static/js/28.599a889517f15c01b27e.js.map
Normal file
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue