Compare commits

...

40 commits

Author SHA1 Message Date
f1e836b183 Fix typo in installation/akkoma.service 2023-03-10 15:51:56 +00:00
08dfce98be Merge branch 'develop' of akkoma.dev:AkkomaGang/akkoma into develop 2023-03-10 03:51:45 +00:00
b2112302ce Add more information about failed verifications 2023-03-10 03:51:24 +00:00
964a855319 Display Quote posts in the api features list to allow external clients to enable compatibility with it. (#496)
Expose quote posting in the api as a feature.

Copies what the quote post PR for pleroma does to allow external clients to enable and disable features based on the feature-set of the instance.

As far as I am aware, akkoma doesn't allow you to disable quote posting, so this doesn't need anything fancy and it's just a hard on switch.

I tried to get one for the bubble tl to work also, but I'm not quite sure how to do it so that it switches off the feature when the bubble tl is disabled. I would argue that it could and ideally should be done as well though.

I also discovered a pretty tame bug in the testing of it, that deleting the DB entry for the bubble tl does not stop the bubble TL from actually working and it will continue to display the panel on the about page, I'll just leave it as a note here.

Reviewed-on: AkkomaGang/akkoma#496
Co-authored-by: foxing <foxing@noreply.akkoma>
Co-committed-by: foxing <foxing@noreply.akkoma>
2023-03-09 20:40:28 +00:00
8a4437d2be Allow expires_at in filter requests
Fixes #492
2023-03-09 19:13:14 +00:00
87d5e5b06a Allow moderators to get the admin scope again
Fixes #463
2023-03-08 17:39:35 +00:00
c8add9d1dc Merge pull request 'fix invalid proxy_hide_header in example config' (#472) from flisk/akkoma:remote-media-docs-fix into develop
Reviewed-on: AkkomaGang/akkoma#472
2023-03-02 11:19:46 +00:00
d43c8080d0 Merge pull request 'updating docs: start akko first, then upgrade frontend' (#486) from flisk/akkoma:fix-updating-docs into develop
Reviewed-on: AkkomaGang/akkoma#486
2023-03-02 11:18:12 +00:00
df03d64dc5 Merge pull request 'Reblog content should be ""' (#489) from masto4-reboost into develop
Reviewed-on: AkkomaGang/akkoma#489
2023-03-02 11:16:26 +00:00
b88e6560e0 Reblog content should be ""
Fixes #450
2023-03-02 11:04:27 +00:00
1ab0b3a0e2 match nginx config to install config and extend docs a bit 2023-02-26 23:58:55 +01:00
cb28b8f0fe updating docs: start akko first, then upgrade frontend 2023-02-26 23:42:28 +01:00
531a550184 fix invalid proxy_hide_header in example config 2023-02-26 23:25:46 +01:00
45a11aa20f add changelog entry for MFM 2023-02-26 22:12:31 +00:00
f56e3098ef Merge branch 'delete_orphaned_activities' into develop 2023-02-26 22:11:30 +00:00
fd1dc87eb4 Merge pull request 'update backwards compat notice in admin_api.md' (#473) from flisk/akkoma:update-admin-api-docs into develop
Reviewed-on: AkkomaGang/akkoma#473
2023-02-26 22:01:57 +00:00
7bd80ccf07 Merge pull request 'update prometheus docs' (#474) from flisk/akkoma:update-prometheus-docs into develop
Reviewed-on: AkkomaGang/akkoma#474
2023-02-26 22:00:12 +00:00
f7211459ef Merge pull request 'Rename index for faster database restore' (#455) from ilja/akkoma:rename_index_for_faster_restore into develop
Reviewed-on: AkkomaGang/akkoma#455
2023-02-26 21:58:56 +00:00
fc842aa7c7 Merge pull request 'Docs: Change docs README for new way of building docs' (#448) from ilja/akkoma:improve_readme_from_docs into develop
Reviewed-on: AkkomaGang/akkoma#448
2023-02-26 21:49:42 +00:00
08d49fba7d fine then no fun allowed, y'all don't deserve it 2023-02-26 21:25:57 +00:00
ilja
328b4d93b7 Changelog + remove some unneeded comments from the tests 2023-02-26 14:43:19 +01:00
ilja
c1c962e1a8 Add docs for pleroma_ctl database prune_objects --prune-orphaned-activities
I also added extra info on VACUUM FULL
2023-02-26 14:41:50 +01:00
ilja
57eef6d764 prune_objects can prune orphaned activities who reference an array of objects
E.g. Flag activities have an array of objects

We prune the activity when NONE of the objects can be found

Note that the cost of finding and deleting these is ~4x higher than finding and deleting the non-array ones

Only string:
Delete on activities  (cost=506573.48..506580.38 rows=0 width=0)

Only Array:
Delete on activities  (cost=3570359.68..4276365.34 rows=0 width=0)

(They are still executed separately, so the total cost is the sum of the two)
2023-02-26 14:41:50 +01:00
ilja
a7ec6e039c prune_objects can prune orphaned activities
We add an option to also prune remote activities who don't have existing objects any more they reference.
Rn, we only check for activities who only reference one object, not an array or embeded object.
2023-02-26 14:41:50 +01:00
ilja
3b634dcbe7 Remove the note about activities_visibility_index
We renamed another index is the previous commit so that this work-around isn't needed any more
2023-02-26 14:38:14 +01:00
ilja
8b2adc4fb4 Rename users_ap_id_COALESCE_follower_address_index for faster db restoration
By default Postgresql first restores the data and then the indexes when dumping and restoring the database.
Restoring index activities_visibility_index took a very long time.
users_ap_id_COALESCE_follower_address_index was later added because having this could speed up the restoration tremendously.
The problem now is that restoration apparently happens in alphabetical order, so this new index wasn't created yet
by the time activities_visibility_index needed it.
There were several work-arounds which included more complex steps during backup/restore.
By renaming this index, it should be restored first and thus activities_visibility_index can make use of it.
This speeds up restoration significantly without requiring more complex or unexpected steps from people.
2023-02-26 14:33:17 +01:00
9f34294332 Add changelog entry 2023-02-23 11:07:59 +00:00
d3089ec399 Ensure we can update contentMap on update 2023-02-23 11:00:55 +00:00
f22c6e4108 Merge pull request 'Update docs about clients' (#484) from mahito1594/akkoma:docs/update-clients-info into develop
Reviewed-on: AkkomaGang/akkoma#484
2023-02-22 15:44:00 +00:00
3f03f1df9c docs: update URL hosting husky's sourse code 2023-02-22 22:50:18 +09:00
9dc3f8fcdc docs: remark that Pinafore is now unmaintained 2023-02-22 22:43:17 +09:00
3744789710 Merge pull request 'update healthcheck route in locale string' (#475) from flisk/akkoma:update-healthcheck-route-reference into develop
Reviewed-on: AkkomaGang/akkoma#475
2023-02-21 09:44:55 +00:00
ea30d22dfe Merge pull request 'Interpret \n as newline for MFM' (#478) from ilja/akkoma:newline_remains_newline_in_mfm into develop
Reviewed-on: AkkomaGang/akkoma#478
2023-02-21 09:43:15 +00:00
ilja
b4952a81fe Interpret \n as newline for MFM
Markdown doesn't generally consider `\n` a newline,
but Misskey does for MFM.

Now we do to for MFM (and not for Markdown) :)
2023-02-18 19:56:11 +01:00
292f0444d0 update healthcheck route in locale string 2023-02-18 14:59:46 +01:00
a18b5755b4 run mix gettext.extract
seems like this hasn't been run in a while. putting this in a separate
commit so the changes i'm about to make don't get drowned in all of this
stuff.
2023-02-18 14:58:35 +01:00
da4c87b226 update prometheus docs 2023-02-18 14:39:22 +01:00
439ec49137 update backwards compat notice in admin_api.md 2023-02-18 14:37:12 +01:00
ilja
7f8932304f typo + remove unneeded file 2023-02-02 14:37:45 +01:00
ilja
e74e1efe1c Change docs README for new way of building docs
Docs used to be a separate repo who cloned pleroma and pelroma-fe.
Now the docs are just the BE docs and completely part of the Akkoma repo.
I moved back to using venv because that's what I used and cleaner imo since it keeps everything nice in the repo.
(Iirc virtualenv stored things in the Home folder or smthng)
2023-01-26 15:42:53 +01:00
39 changed files with 2555 additions and 2104 deletions

1
.gitignore vendored
View file

@ -73,6 +73,7 @@ pleroma.iml
# Generated documentation
docs/site
docs/venv
# docker stuff
docker-db

View file

@ -4,6 +4,20 @@ All notable changes to this project will be documented in this file.
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/).
## Unreleased
## Fixed
- Allowed contentMap to be updated on edit
### Changed
- Restoring the database from a dump now goes much faster without need for work-arounds
### Added
- Extend the mix task `prune_objects` with option `--prune-orphaned-activities` to also prune orphaned activities, allowing to reclaim even more database space
### Removed
- Possibility of using the `style` parameter on `span` elements. This will break certain MFM parameters.
## 2023.02
### Added

View file

@ -1,7 +0,0 @@
all: install
pipenv run mkdocs build
install:
pipenv install
clean:
rm -rf docs

View file

@ -790,7 +790,7 @@
%{
key: :healthcheck,
type: :boolean,
description: "If enabled, system data will be shown on `/api/pleroma/healthcheck`"
description: "If enabled, system data will be shown on `/api/v1/pleroma/healthcheck`"
},
%{
key: :remote_post_retention_days,

View file

@ -2,33 +2,27 @@
You don't need to build and test the docs as long as you make sure the syntax is correct. But in case you do want to build the docs, feel free to do so.
You'll need to install mkdocs for which you can check the [mkdocs installation guide](https://www.mkdocs.org/#installation). Generally it's best to install it using `pip`. You'll also need to install the correct dependencies.
```sh
# Make sure you're in the same directory as this README
# From the root of the Akkoma repo, you'll need to do
cd docs
### Example using a Debian based distro
# Optionally use a virtual environment
python3 -m venv venv
source venv/bin/activate
#### 1. Install pipenv and dependencies
# Install dependencies
pip install -r requirements.txt
```shell
pip install pipenv
pipenv sync
# Run an http server who rebuilds when files change
# Accessable on http://127.0.0.1:8000
mkdocs serve
# Build the docs
# The static html pages will have been created in the folder "site"
# You can serve them from a server by pointing your server software (nginx, apache...) to this location
mkdocs build
# To get out of the virtual environment, you do
deactivate
```
#### 2. (Optional) Activate the virtual environment
Since dependencies are installed in a virtual environment, you can't use them directly. To use them you should either prefix the command with `pipenv run`, or activate the virtual environment for current shell by executing `pipenv shell` once.
#### 3. Build the docs using the script
```shell
[pipenv run] make all
```
#### 4. Serve the files
A folder `site` containing the static html pages will have been created. You can serve them from a server by pointing your server software (nginx, apache...) to this location. During development, you can run locally with
```shell
[pipenv run] mkdocs serve
```
This handles setting up an http server and rebuilding when files change. You can then access the docs on <http://127.0.0.1:8000>

View file

@ -21,7 +21,6 @@ Replaces embedded objects with references to them in the `objects` table. Only n
mix pleroma.database remove_embedded_objects [option ...]
```
### Options
- `--vacuum` - run `VACUUM FULL` after the embedded objects are replaced with their references
@ -29,8 +28,11 @@ Replaces embedded objects with references to them in the `objects` table. Only n
This will prune remote posts older than 90 days (configurable with [`config :pleroma, :instance, remote_post_retention_days`](../../configuration/cheatsheet.md#instance)) from the database. Pruned posts may be refetched in some cases.
!!! note
The disk space will only be reclaimed after a proper vacuum. By default Postgresql does this for you on a regular basis, but if your instance has been running for a long time and there are many rows deleted, it may be advantageous to use `VACUUM FULL` (e.g. by using the `--vacuum` option).
!!! danger
The disk space will only be reclaimed after `VACUUM FULL`. You may run out of disk space during the execution of the task or vacuuming if you don't have about 1/3rds of the database size free.
You may run out of disk space during the execution of the task or vacuuming if you don't have about 1/3rds of the database size free. Vacuum causes a substantial increase in I/O traffic, and may lead to a degraded experience while it is running.
=== "OTP"
@ -46,9 +48,10 @@ This will prune remote posts older than 90 days (configurable with [`config :ple
### Options
- `--keep-threads` - don't prune posts when they are part of a thread where at least one post has seen local interaction (e.g. one of the posts is a local post, or is favourited by a local user, or has been repeated by a local user...)
- `--keep-non-public` - keep non-public posts like DM's and followers-only, even if they are remote
- `--vacuum` - run `VACUUM FULL` after the objects are pruned
- `--keep-threads` - Don't prune posts when they are part of a thread where at least one post has seen local interaction (e.g. one of the posts is a local post, or is favourited by a local user, or has been repeated by a local user...). It also wont delete posts when at least one of the posts in that thread is kept (e.g. because one of the posts has seen recent activity).
- `--keep-non-public` - Keep non-public posts like DM's and followers-only, even if they are remote.
- `--prune-orphaned-activities` - Also prune orphaned activities afterwards. Activities are things like Like, Create, Announce, Flag (aka reports)... They can significantly help reduce the database size.
- `--vacuum` - Run `VACUUM FULL` after the objects are pruned. This should not be used on a regular basis, but is useful if your instance has been running for a long time before pruning.
## Create a conversation for all existing DMs
@ -96,6 +99,9 @@ Can be safely re-run
## Vacuum the database
!!! note
By default Postgresql has an autovacuum deamon running. While the tasks described here can help in some cases, they shouldn't be needed on a regular basis. See [the Postgresql docs on vacuuming](https://www.postgresql.org/docs/current/sql-vacuum.html) for more information on this.
### Analyze
Running an `analyze` vacuum job can improve performance by updating statistics used by the query planner. **It is safe to cancel this.**

View file

@ -21,33 +21,15 @@
6. Restore the database schema and akkoma role using either of the following options
* You can use the original `setup_db.psql` if you have it[²]: `sudo -Hu postgres psql -f config/setup_db.psql`.
* Or recreate the database and user yourself (replace the password with the one you find in the config file) `sudo -Hu postgres psql -c "CREATE USER akkoma WITH ENCRYPTED PASSWORD '<database-password-wich-you-can-find-in-your-config-file>'; CREATE DATABASE akkoma OWNER akkoma;"`.
7. Now restore the Akkoma instance's data into the empty database schema[¹][³]: `sudo -Hu postgres pg_restore -d akkoma -v -1 </path/to/backup_location/akkoma.pgdump>`
8. If you installed a newer Akkoma version, you should run `MIX_ENV=prod mix ecto.migrate`[]. This task performs database migrations, if there were any.
7. Now restore the Akkoma instance's data into the empty database schema[¹]: `sudo -Hu postgres pg_restore -d akkoma -v -1 </path/to/backup_location/akkoma.pgdump>`
8. If you installed a newer Akkoma version, you should run `MIX_ENV=prod mix ecto.migrate`[³]. This task performs database migrations, if there were any.
9. Restart the Akkoma service.
10. Run `sudo -Hu postgres vacuumdb --all --analyze-in-stages`. This will quickly generate the statistics so that postgres can properly plan queries.
11. If setting up on a new server configure Nginx by using the `installation/akkoma.nginx` config sample or reference the Akkoma installation guide for your OS which contains the Nginx configuration instructions.
[¹]: We assume the database name and user are both "akkoma". If not, you can find the correct name in your config files.
[²]: You can recreate the `config/setup_db.psql` by running the `mix pleroma.instance gen` task again. You can ignore most of the questions, but make the database user, name, and password the same as found in your backed up config file. This will also create a new `config/generated_config.exs` file which you may delete as it is not needed.
[³]: `pg_restore` will add data before adding indexes. The indexes are added in alphabetical order. There's one index, `activities_visibility_index` which may take a long time because it can't make use of an index that's only added later. You can significantly speed up restoration by skipping this index and add it afterwards. For that, you can do the following (we assume the akkoma.pgdump is in the directory you're running the commands):
```sh
pg_restore -l akkoma.pgdump > db.list
# Comment out the step for creating activities_visibility_index by adding a semi colon at the start of the line
sed -i -E 's/(.*activities_visibility_index.*)/;\1/' db.list
# We restore the database using the db.list list-file
sudo -Hu postgres pg_restore -L db.list -d akkoma -v -1 akkoma.pgdump
# You can see the sql statement with which to create the index using
grep -Eao 'CREATE INDEX activities_visibility_index.*' akkoma.pgdump
# Then create the index manually
# Make sure that the command to create is correct! You never know it has changed since writing this guide
sudo -Hu postgres psql -d pleroma_ynh -c "CREATE INDEX activities_visibility_index ON public.activities USING btree (public.activity_visibility(actor, recipients, data), id DESC NULLS LAST) WHERE ((data ->> 'type'::text) = 'Create'::text);"
```
[⁴]: Prefix with `MIX_ENV=prod` to run it using the production config file.
[³]: Prefix with `MIX_ENV=prod` to run it using the production config file.
## Remove

View file

@ -26,11 +26,11 @@ su -s "$SHELL" akkoma
# Run database migrations
./bin/pleroma_ctl migrate
# Update frontend(s). See Frontend Configuration doc for more information.
./bin/pleroma_ctl frontend install pleroma-fe --ref stable
# Start akkoma
./bin/pleroma daemon # or using the system service manager (e.g. systemctl start akkoma)
# Update frontend(s). See Frontend Configuration doc for more information.
./bin/pleroma_ctl frontend install pleroma-fe --ref stable
```
If you selected an alternate flavour on installation,
@ -59,9 +59,9 @@ sudo systemctl stop akkoma
# Run database migrations
mix ecto.migrate
# Update Pleroma-FE frontend to latest stable. For other Frontends see Frontend Configration doc for more information.
mix pleroma.frontend install pleroma-fe --ref stable
# Start akkoma (replace with your system service manager's equivalent if different)
sudo systemctl start akkoma
# Update Pleroma-FE frontend to latest stable. For other Frontends see Frontend Configuration doc for more information.
mix pleroma.frontend install pleroma-fe --ref stable
```

View file

@ -25,7 +25,7 @@ Apps listed here might not support all of Akkoma's features.
- Features: MastoAPI, Streaming Ready, Moderation, Text Formatting
### Husky
- Source code: <https://git.sr.ht/~captainepoch/husky>
- Source code: <https://codeberg.org/husky/husky>
- Contact: [@captainepoch@stereophonic.space](https://stereophonic.space/captainepoch)
- Platforms: Android
- Features: MastoAPI, No Streaming, Emoji Reactions, Text Formatting, FE Stickers
@ -45,10 +45,10 @@ Apps listed here might not support all of Akkoma's features.
## Alternative Web Interfaces
### Pinafore
- Note: Pinafore is unmaintained (See [the author's original article](https://nolanlawson.com/2023/01/09/retiring-pinafore/) for details)
- Homepage: <https://pinafore.social/>
- Source Code: <https://github.com/nolanlawson/pinafore>
- Contact: [@pinafore@mastodon.technology](https://mastodon.technology/users/pinafore)
- Note: Pleroma support is a secondary goal
- Features: MastoAPI, No Streaming
### Sengi

View file

@ -6,33 +6,46 @@ as soon as the post is received by your instance.
## Nginx
```
proxy_cache_path /long/term/storage/path/akkoma-media-cache levels=1:2
keys_zone=akkoma_media_cache:10m inactive=1y use_temp_path=off;
The following are excerpts from the [suggested nginx config](../../../installation/nginx/akkoma.nginx) that demonstrates the necessary config for the media proxy to work.
A `proxy_cache_path` must be defined, for example:
```
proxy_cache_path /long/term/storage/path/akkoma-media-cache levels=1:2
keys_zone=akkoma_media_cache:10m inactive=1y use_temp_path=off;
```
The `proxy_cache_path` must then be configured for use with media proxy paths:
```
location ~ ^/(media|proxy) {
proxy_cache akkoma_media_cache;
slice 1m;
proxy_cache_key $host$uri$is_args$args$slice_range;
proxy_set_header Range $slice_range;
proxy_http_version 1.1;
proxy_cache_valid 206 301 302 304 1h;
proxy_cache_valid 200 1y;
proxy_cache_use_stale error timeout invalid_header updating;
proxy_cache_valid 200 206 301 304 1h;
proxy_cache_lock on;
proxy_ignore_client_abort on;
proxy_buffering on;
chunked_transfer_encoding on;
proxy_ignore_headers Cache-Control Expires;
proxy_hide_header Cache-Control Expires;
proxy_pass http://127.0.0.1:4000;
proxy_pass http://phoenix;
}
}
```
Ensure that `proxy_http_version 1.1;` is set for the above `location` block. In the suggested config, this is already the case.
## Akkoma
Add to your `prod.secret.exs`:
### File-based Configuration
If you're using static file configuration, add the `MediaProxyWarmingPolicy` to your MRF policies. For example:
```
config :pleroma, :mrf,
policies: [Pleroma.Web.ActivityPub.MRF.MediaProxyWarmingPolicy]
```
### Database Configuration
In the admin interface, add `MediaProxyWarmingPolicy` to the `Policies` option under `Settings``MRF`.

View file

@ -2,7 +2,7 @@
Authentication is required and the user must be an admin.
The `/api/v1/pleroma/admin/*` path is backwards compatible with `/api/pleroma/admin/*` (`/api/pleroma/admin/*` will be deprecated in the future).
Backwards-compatibility for admin API endpoints without version prefixes (`/api/pleroma/admin/*`) has been removed as of Akkoma 3.6.0. Please use `/api/v1/pleroma/admin/*` instead.
## `GET /api/v1/pleroma/admin/users`

View file

@ -5,27 +5,16 @@ Akkoma includes support for exporting metrics via the [prometheus_ex](https://gi
Config example:
```
config :prometheus, Pleroma.Web.Endpoint.MetricsExporter,
enabled: true,
auth: {:basic, "myusername", "mypassword"},
ip_whitelist: ["127.0.0.1"],
path: "/api/pleroma/app_metrics",
format: :text
config :pleroma, :instance,
export_prometheus_metrics: true
```
* `enabled` (Akkoma extension) enables the endpoint
* `ip_whitelist` (Akkoma extension) could be used to restrict access only to specified IPs
* `auth` sets the authentication (`false` for no auth; configurable to HTTP Basic Auth, see [prometheus-plugs](https://github.com/deadtrickster/prometheus-plugs#exporting) documentation)
* `format` sets the output format (`:text` or `:protobuf`)
* `path` sets the path to app metrics page
## `/api/pleroma/app_metrics`
## `/api/v1/akkoma/metrics`
### Exports Prometheus application metrics
* Method: `GET`
* Authentication: not required by default (see configuration options above)
* Authentication: required
* Params: none
* Response: text
@ -37,7 +26,7 @@ The following is a config example to use with [Grafana](https://grafana.com)
```
- job_name: 'beam'
metrics_path: /api/pleroma/app_metrics
metrics_path: /api/v1/akkoma/metrics
scheme: https
static_configs:
- targets: ['otp.akkoma.dev']

View file

@ -7,7 +7,7 @@ ExecReload=/bin/kill $MAINPID
Restart=on-failure
; Uncomment this if you're on Arch Linux
; Evironment="PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl"
; Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/bin:/usr/bin/site_perl:/usr/bin/vendor_perl:/usr/bin/core_perl"
; Name of the user that runs the Akkoma service.
User=akkoma

View file

@ -69,7 +69,8 @@ def run(["prune_objects" | args]) do
strict: [
vacuum: :boolean,
keep_threads: :boolean,
keep_non_public: :boolean
keep_non_public: :boolean,
prune_orphaned_activities: :boolean
]
)
@ -94,6 +95,21 @@ def run(["prune_objects" | args]) do
log_message
end
log_message =
if Keyword.get(options, :prune_orphaned_activities) do
log_message <> ", pruning orphaned activities"
else
log_message
end
log_message =
if Keyword.get(options, :vacuum) do
log_message <>
", doing a full vacuum (you shouldn't do this as a recurring maintanance task)"
else
log_message
end
Logger.info(log_message)
if Keyword.get(options, :keep_threads) do
@ -155,14 +171,49 @@ def run(["prune_objects" | args]) do
end
|> Repo.delete_all(timeout: :infinity)
prune_hashtags_query = """
if Keyword.get(options, :prune_orphaned_activities) do
# Prune activities who link to a single object
"""
delete from public.activities
where id in (
select a.id from public.activities a
left join public.objects o on a.data ->> 'object' = o.data ->> 'id'
left join public.activities a2 on a.data ->> 'object' = a2.data ->> 'id'
left join public.users u on a.data ->> 'object' = u.ap_id
where not a.local
and jsonb_typeof(a."data" -> 'object') = 'string'
and o.id is null
and a2.id is null
and u.id is null
)
"""
|> Repo.query([], timeout: :infinity)
# Prune activities who link to an array of objects
"""
delete from public.activities
where id in (
select a.id from public.activities a
join json_array_elements_text((a."data" -> 'object')::json) as j on jsonb_typeof(a."data" -> 'object') = 'array'
left join public.objects o on j.value = o.data ->> 'id'
left join public.activities a2 on j.value = a2.data ->> 'id'
left join public.users u on j.value = u.ap_id
group by a.id
having max(o.data ->> 'id') is null
and max(a2.data ->> 'id') is null
and max(u.ap_id) is null
)
"""
|> Repo.query([], timeout: :infinity)
end
"""
DELETE FROM hashtags AS ht
WHERE NOT EXISTS (
SELECT 1 FROM hashtags_objects hto
WHERE ht.id = hto.hashtag_id)
"""
Repo.query(prune_hashtags_query)
|> Repo.query()
if Keyword.get(options, :vacuum) do
Maintenance.vacuum("full")

View file

@ -38,7 +38,8 @@ defmodule Pleroma.Constants do
"summary",
"sensitive",
"attachment",
"generator"
"generator",
"contentMap"
]
)

View file

@ -124,8 +124,8 @@ def mentions_escape(text, options \\ []) do
end
end
def markdown_to_html(text) do
Earmark.as_html!(text, %Earmark.Options{compact_output: true})
def markdown_to_html(text, opts \\ %{}) do
Earmark.as_html!(text, %Earmark.Options{compact_output: true} |> Map.merge(opts))
end
def html_escape({text, mentions, hashtags}, type) do

View file

@ -2077,10 +2077,14 @@ def parse_bio(bio, user) when is_binary(bio) and bio != "" do
# TODO: get profile URLs other than user.ap_id
profile_urls = [user.ap_id]
bio
|> CommonUtils.format_input("text/plain",
CommonUtils.format_input(bio, "text/plain",
mentions_format: :full,
rel: &RelMe.maybe_put_rel_me(&1, profile_urls)
rel: fn link ->
case RelMe.maybe_put_rel_me(link, profile_urls) do
"me" -> "me"
_ -> nil
end
end
)
|> elem(0)
end

View file

@ -104,9 +104,9 @@ defp remote_mention_resolver(
end
end
# https://github.com/misskey-dev/misskey/pull/8787
# Misskey has an awful tendency to drop all custom formatting when it sends remotely
# So this basically reprocesses their MFM source
# See https://akkoma.dev/FoundKeyGang/FoundKey/issues/343
# Misskey/Foundkey drops some of the custom formatting when it sends remotely
# So this basically reprocesses the MFM source
defp fix_misskey_content(
%{"source" => %{"mediaType" => "text/x.misskeymarkdown", "content" => content}} = object
)
@ -121,6 +121,8 @@ defp fix_misskey_content(
Map.put(object, "content", linked)
end
# See https://github.com/misskey-dev/misskey/pull/8787
# This is for compatibility with older Misskey instances
defp fix_misskey_content(%{"_misskey_content" => content} = object) when is_binary(content) do
mention_handler = fn nick, buffer, opts, acc ->
remote_mention_resolver(object, nick, buffer, opts, acc)

View file

@ -225,6 +225,12 @@ defp update_request do
type: :integer,
description:
"Number of seconds from now the filter should expire. Otherwise, null for a filter that doesn't expire."
},
expires_at: %Schema{
nullable: true,
type: :string,
description:
"When the filter should no longer be applied. String (ISO 8601 Datetime), or null if the filter does not expire."
}
},
required: [:phrase, :context],

View file

@ -289,7 +289,7 @@ def format_input(text, "text/html", options) do
def format_input(text, "text/x.misskeymarkdown", options) do
text
|> Formatter.markdown_to_html()
|> Formatter.markdown_to_html(%{breaks: true})
|> MfmParser.Parser.parse()
|> MfmParser.Encoder.to_html()
|> Formatter.linkify(options)

View file

@ -65,6 +65,7 @@ def features do
"shareable_emoji_packs",
"multifetch",
"pleroma:api/v1/notifications:include_types_filter",
"quote_posting",
"editing",
if Config.get([:media_proxy, :enabled]) do
"media_proxy"

View file

@ -183,7 +183,7 @@ def render(
in_reply_to_id: nil,
in_reply_to_account_id: nil,
reblog: reblogged,
content: reblogged[:content] || "",
content: "",
created_at: created_at,
reblogs_count: 0,
replies_count: 0,

View file

@ -71,6 +71,8 @@ def validate(scopes, app_scopes, _user) do
"""
def filter_admin_scopes(scopes, %Pleroma.User{is_admin: true}), do: scopes
def filter_admin_scopes(scopes, %Pleroma.User{is_moderator: true}), do: scopes
def filter_admin_scopes(scopes, _user) do
drop_scopes = OAuthScopesPlug.filter_descendants(scopes, ["admin"])
Enum.reject(scopes, fn scope -> Enum.member?(drop_scopes, scope) end)

View file

@ -116,6 +116,8 @@ defp csp_string(conn) do
script_src = "script-src 'self' '#{nonce_tag}'"
script_src = if Mix.env() == :dev, do: [script_src, " 'unsafe-eval'"], else: script_src
report = if report_uri, do: ["report-uri ", report_uri, ";report-to csp-endpoint"]
insecure = if scheme == "https", do: "upgrade-insecure-requests"

View file

@ -37,15 +37,18 @@ defp parse_url(url) do
end
def maybe_put_rel_me("http" <> _ = target_page, profile_urls) when is_list(profile_urls) do
{:ok, rel_me_hrefs} = parse(target_page)
true = Enum.any?(rel_me_hrefs, fn x -> x in profile_urls end)
"me"
with {:parse, {:ok, rel_me_hrefs}} <- {:parse, parse(target_page)},
{:link_match, true} <-
{:link_match, Enum.any?(rel_me_hrefs, fn x -> x in profile_urls end)} do
"me"
else
e -> {:error, {:could_not_verify, target_page, e}}
end
rescue
_ -> nil
e -> {:error, {:could_not_fetch, target_page, e}}
end
def maybe_put_rel_me(_, _) do
nil
{:error, :invalid_url}
end
end

View file

@ -19,6 +19,7 @@
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/js/features/getting_started.js'>
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/js/features/compose.js'>
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/js/features/home_timeline.js'>
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/js/features/public_timeline.js'>
<link rel='preload' as='script' crossorigin='anonymous' href='/packs/js/features/notifications.js'>
<script crossorigin='anonymous' src="/packs/js/application.js"></script>

File diff suppressed because it is too large Load diff

View file

@ -10,176 +10,266 @@
msgid ""
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:122
#, elixir-autogen, elixir-format
msgid "%{name} - %{count} is not a multiple of %{multiple}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:131
#, elixir-autogen, elixir-format
msgid "%{name} - %{value} is larger than exclusive maximum %{max}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:140
#, elixir-autogen, elixir-format
msgid "%{name} - %{value} is larger than inclusive maximum %{max}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:149
#, elixir-autogen, elixir-format
msgid "%{name} - %{value} is smaller than exclusive minimum %{min}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:158
#, elixir-autogen, elixir-format
msgid "%{name} - %{value} is smaller than inclusive minimum %{min}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:102
#, elixir-autogen, elixir-format
msgid "%{name} - Array items must be unique."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:114
#, elixir-autogen, elixir-format
msgid "%{name} - Array length %{length} is larger than maxItems: %{}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:106
#, elixir-autogen, elixir-format
msgid "%{name} - Array length %{length} is smaller than minItems: %{min}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:166
#, elixir-autogen, elixir-format
msgid "%{name} - Invalid %{type}. Got: %{value}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:174
#, elixir-autogen, elixir-format
msgid "%{name} - Invalid format. Expected %{format}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:51
#, elixir-autogen, elixir-format
msgid "%{name} - Invalid schema.type. Got: %{type}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:178
#, elixir-autogen, elixir-format
msgid "%{name} - Invalid value for enum."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:95
#, elixir-autogen, elixir-format
msgid "%{name} - String length is larger than maxLength: %{length}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:88
#, elixir-autogen, elixir-format
msgid "%{name} - String length is smaller than minLength: %{length}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:63
#, elixir-autogen, elixir-format
msgid "%{name} - null value where %{type} expected."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:60
#, elixir-autogen, elixir-format
msgid "%{name} - null value."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:182
#, elixir-autogen, elixir-format
msgid "Failed to cast to any schema in %{polymorphic_type}"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:71
#, elixir-autogen, elixir-format
msgid "Failed to cast value as %{invalid_schema}. Value must be castable using `allOf` schemas listed."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:84
#, elixir-autogen, elixir-format
msgid "Failed to cast value to one of: %{failed_schemas}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:78
#, elixir-autogen, elixir-format
msgid "Failed to cast value using any of: %{failed_schemas}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:212
#, elixir-autogen, elixir-format
msgid "Invalid value for header: %{name}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:204
#, elixir-autogen, elixir-format
msgid "Missing field: %{name}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:208
#, elixir-autogen, elixir-format
msgid "Missing header: %{name}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:196
#, elixir-autogen, elixir-format
msgid "No value provided for required discriminator `%{field}`."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:216
#, elixir-autogen, elixir-format
msgid "Object property count %{property_count} is greater than maxProperties: %{max_properties}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:224
#, elixir-autogen, elixir-format
msgid "Object property count %{property_count} is less than minProperties: %{min_properties}"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/static_fe/static_fe/error.html.eex:2
msgid "Oops"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:188
#, elixir-autogen, elixir-format
msgid "Unexpected field: %{name}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:200
#, elixir-autogen, elixir-format
msgid "Unknown schema: %{name}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/api_spec/render_error.ex:192
#, elixir-autogen, elixir-format
msgid "Value used as discriminator for `%{field}` matches no schemas."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:43
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:37
#, elixir-autogen, elixir-format
msgid "announces"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:44
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:38
#, elixir-autogen, elixir-format
msgid "likes"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:42
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:36
#, elixir-autogen, elixir-format
msgid "replies"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/embed/show.html.eex:27
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:22
#, elixir-autogen, elixir-format
msgid "sensitive media"
msgstr ""
#: lib/pleroma/web/templates/layout/static_fe.html.eex:29
#, elixir-autogen, elixir-format
msgid "About %{instance}"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:24
#, elixir-autogen, elixir-format
msgid "Admin"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:30
#, elixir-autogen, elixir-format
msgid "Bot"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/conversation.html.eex:3
#, elixir-autogen, elixir-format
msgid "Conversation"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:59
#, elixir-autogen, elixir-format
msgid "Edited %{timeago}"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/error.html.eex:3
#, elixir-autogen, elixir-format
msgid "Error"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:56
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:91
#, elixir-autogen, elixir-format
msgid "Followers"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:52
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:84
#, elixir-autogen, elixir-format
msgid "Following"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:53
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:57
#, elixir-autogen, elixir-format
msgid "Hidden"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/_attachment.html.eex:4
#, elixir-autogen, elixir-format
msgid "Hover to show content"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:97
#, elixir-autogen, elixir-format
msgid "Media"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:27
#, elixir-autogen, elixir-format
msgid "Moderator"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:48
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:73
#, elixir-autogen, elixir-format
msgid "Posts"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:46
#, elixir-autogen, elixir-format
msgid "Reply to"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/_notice.html.eex:67
#, elixir-autogen, elixir-format
msgid "Show content"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:102
#, elixir-autogen, elixir-format
msgid "Show newer"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:140
#, elixir-autogen, elixir-format
msgid "Show older"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:78
#, elixir-autogen, elixir-format
msgid "With Replies"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:127
#, elixir-autogen, elixir-format
msgid "repeated"
msgstr ""

View file

@ -89,376 +89,363 @@ msgstr ""
msgid "must be equal to %{number}"
msgstr ""
#: lib/pleroma/web/common_api.ex:503
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:523
msgid "Account not found"
msgstr ""
#: lib/pleroma/web/common_api.ex:263
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:316
msgid "Already voted"
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:427
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:402
msgid "Bad request"
msgstr ""
#: lib/pleroma/web/controller_helper.ex:105
#, elixir-autogen, elixir-format
#: lib/pleroma/web/controller_helper.ex:97
#: lib/pleroma/web/controller_helper.ex:103
msgid "Can't display this activity"
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:334
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:325
msgid "Can't find user"
msgstr ""
#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:61
#, elixir-autogen, elixir-format
#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:80
msgid "Can't get favorites"
msgstr ""
#: lib/pleroma/web/common_api/utils.ex:473
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:482
msgid "Cannot post an empty status without attachments"
msgstr ""
#: lib/pleroma/web/common_api/utils.ex:461
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:441
msgid "Comment must be up to %{max_size} characters"
msgstr ""
#: lib/pleroma/config_db.ex:199
#, elixir-autogen, elixir-format
#: lib/pleroma/config_db.ex:200
msgid "Config with params %{params} not found"
msgstr ""
#: lib/pleroma/web/common_api.ex:114
#: lib/pleroma/web/common_api.ex:118
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:167
#: lib/pleroma/web/common_api.ex:171
msgid "Could not delete"
msgstr ""
#: lib/pleroma/web/common_api.ex:164
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:217
msgid "Could not favorite"
msgstr ""
#: lib/pleroma/web/common_api.ex:201
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:254
msgid "Could not unfavorite"
msgstr ""
#: lib/pleroma/web/common_api.ex:149
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:202
msgid "Could not unrepeat"
msgstr ""
#: lib/pleroma/web/common_api.ex:510
#: lib/pleroma/web/common_api.ex:519
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:530
#: lib/pleroma/web/common_api.ex:539
msgid "Could not update state"
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:245
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:205
msgid "Error."
msgstr ""
#: lib/pleroma/web/twitter_api/twitter_api.ex:104
#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:105
msgid "Invalid CAPTCHA"
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:143
#: lib/pleroma/web/o_auth/o_auth_controller.ex:660
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:144
#: lib/pleroma/web/o_auth/o_auth_controller.ex:631
msgid "Invalid credentials"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:42
#, elixir-autogen, elixir-format
msgid "Invalid credentials."
msgstr ""
#: lib/pleroma/web/common_api.ex:284
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:337
msgid "Invalid indices"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:29
#, elixir-autogen, elixir-format
msgid "Invalid parameters"
msgstr ""
#: lib/pleroma/web/common_api/utils.ex:369
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:349
msgid "Invalid password."
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:264
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:255
msgid "Invalid request"
msgstr ""
#: lib/pleroma/web/twitter_api/twitter_api.ex:107
#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:108
msgid "Kocaptcha service unavailable"
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:139
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:140
msgid "Missing parameters"
msgstr ""
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:151
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:177
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:219
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:477
msgid "No such conversation"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:171
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:197
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:239
msgid "No such permission_group"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:515
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:502
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:11
#: lib/pleroma/web/feed/tag_controller.ex:16
#: lib/pleroma/web/feed/user_controller.ex:69
#: lib/pleroma/web/o_status/o_status_controller.ex:132
#: lib/pleroma/web/plugs/uploaded_media.ex:84
#: lib/pleroma/web/feed/user_controller.ex:70
#: lib/pleroma/web/o_status/o_status_controller.ex:135
#: lib/pleroma/web/plugs/uploaded_media.ex:83
#, elixir-autogen, elixir-format
msgid "Not found"
msgstr ""
#: lib/pleroma/web/common_api.ex:255
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:308
msgid "Poll's author can't vote"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:477
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:20
#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:39
#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:51
#: lib/pleroma/web/mastodon_api/controllers/poll_controller.ex:52
#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:326
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:71
#, elixir-autogen, elixir-format
msgid "Record not found"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:35
#: lib/pleroma/web/feed/user_controller.ex:78
#: lib/pleroma/web/feed/user_controller.ex:79
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:42
#: lib/pleroma/web/o_status/o_status_controller.ex:138
#: lib/pleroma/web/o_status/o_status_controller.ex:141
#, elixir-autogen, elixir-format
msgid "Something went wrong"
msgstr ""
#: lib/pleroma/web/common_api/activity_draft.ex:156
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/activity_draft.ex:143
msgid "The message visibility must be direct"
msgstr ""
#: lib/pleroma/web/common_api/utils.ex:483
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:492
msgid "The status is over the character limit"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_public_or_authenticated_plug.ex:36
#, elixir-autogen, elixir-format
msgid "This resource requires authentication."
msgstr ""
#: lib/pleroma/web/plugs/rate_limiter.ex:214
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/rate_limiter.ex:208
msgid "Throttled"
msgstr ""
#: lib/pleroma/web/common_api.ex:285
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:338
msgid "Too many choices"
msgstr ""
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:248
#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:268
msgid "You can't revoke your own admin status."
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:267
#: lib/pleroma/web/o_auth/o_auth_controller.ex:358
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:243
#: lib/pleroma/web/o_auth/o_auth_controller.ex:333
msgid "Your account is currently disabled"
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:229
#: lib/pleroma/web/o_auth/o_auth_controller.ex:381
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:205
#: lib/pleroma/web/o_auth/o_auth_controller.ex:356
msgid "Your login is missing a confirmed e-mail address"
msgstr ""
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:390
#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:403
msgid "can't read inbox of %{nickname} as %{as_nickname}"
msgstr ""
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:489
#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:502
msgid "can't update outbox of %{nickname} as %{as_nickname}"
msgstr ""
#: lib/pleroma/web/common_api.ex:455
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:475
msgid "conversation is already muted"
msgstr ""
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:508
#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:521
msgid "error"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:34
#, elixir-autogen, elixir-format
msgid "mascots can only be images"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:63
#, elixir-autogen, elixir-format
msgid "not found"
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:462
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:437
msgid "Bad OAuth request."
msgstr ""
#: lib/pleroma/web/twitter_api/twitter_api.ex:113
#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:114
msgid "CAPTCHA already used"
msgstr ""
#: lib/pleroma/web/twitter_api/twitter_api.ex:110
#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:111
msgid "CAPTCHA expired"
msgstr ""
#: lib/pleroma/web/plugs/uploaded_media.ex:56
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/uploaded_media.ex:57
msgid "Failed"
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:478
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:453
msgid "Failed to authenticate: %{message}."
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:509
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:484
msgid "Failed to set up user account."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/o_auth_scopes_plug.ex:37
#, elixir-autogen, elixir-format
msgid "Insufficient permissions: %{permissions}."
msgstr ""
#: lib/pleroma/web/plugs/uploaded_media.ex:98
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/uploaded_media.ex:111
msgid "Internal Error"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/fallback_controller.ex:22
#: lib/pleroma/web/o_auth/fallback_controller.ex:29
#, elixir-autogen, elixir-format
msgid "Invalid Username/Password"
msgstr ""
#: lib/pleroma/web/twitter_api/twitter_api.ex:116
#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:117
msgid "Invalid answer data"
msgstr ""
#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:130
#, elixir-autogen, elixir-format
#: lib/pleroma/web/nodeinfo/nodeinfo_controller.ex:33
msgid "Nodeinfo schema version not handled"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:194
msgid "This action is outside the authorized scopes"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/fallback_controller.ex:14
#, elixir-autogen, elixir-format
msgid "Unknown error, please check the details and try again."
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:158
#: lib/pleroma/web/o_auth/o_auth_controller.ex:204
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:136
#: lib/pleroma/web/o_auth/o_auth_controller.ex:180
msgid "Unlisted redirect_uri."
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:458
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:433
msgid "Unsupported OAuth provider: %{provider}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/uploaders/uploader.ex:74
#, elixir-autogen, elixir-format
msgid "Uploader callback timeout"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/uploader_controller.ex:23
#, elixir-autogen, elixir-format
msgid "bad request"
msgstr ""
#: lib/pleroma/web/twitter_api/twitter_api.ex:101
#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:102
msgid "CAPTCHA Error"
msgstr ""
#: lib/pleroma/web/common_api.ex:213
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:266
msgid "Could not add reaction emoji"
msgstr ""
#: lib/pleroma/web/common_api.ex:224
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api.ex:277
msgid "Could not remove reaction emoji"
msgstr ""
#: lib/pleroma/web/twitter_api/twitter_api.ex:127
#, elixir-autogen, elixir-format
#: lib/pleroma/web/twitter_api/twitter_api.ex:128
msgid "Invalid CAPTCHA (Missing parameter: %{name})"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/list_controller.ex:96
#, elixir-autogen, elixir-format
msgid "List not found"
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:150
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:151
msgid "Missing parameter: %{name}"
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:256
#: lib/pleroma/web/o_auth/o_auth_controller.ex:371
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:232
#: lib/pleroma/web/o_auth/o_auth_controller.ex:346
msgid "Password reset is required"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/tests/auth_test_controller.ex:9
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/announcement_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/chat_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/config_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/fallback_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/frontend_controller.ex:6
@ -471,6 +458,9 @@ msgstr ""
#: lib/pleroma/web/admin_api/controllers/report_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/status_controller.ex:6
#: lib/pleroma/web/admin_api/controllers/user_controller.ex:6
#: lib/pleroma/web/akkoma_api/controllers/frontend_settings_controller.ex:2
#: lib/pleroma/web/akkoma_api/controllers/metrics_controller.ex:2
#: lib/pleroma/web/akkoma_api/controllers/translation_controller.ex:2
#: lib/pleroma/web/controller_helper.ex:6
#: lib/pleroma/web/embed_controller.ex:6
#: lib/pleroma/web/fallback/redirect_controller.ex:6
@ -478,6 +468,7 @@ msgstr ""
#: lib/pleroma/web/feed/user_controller.ex:6
#: lib/pleroma/web/mailer/subscription_controller.ex:6
#: lib/pleroma/web/manifest_controller.ex:6
#: lib/pleroma/web/masto_fe_controller.ex:6
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:6
#: lib/pleroma/web/mastodon_api/controllers/announcement_controller.ex:6
#: lib/pleroma/web/mastodon_api/controllers/app_controller.ex:11
@ -502,6 +493,7 @@ msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/status_controller.ex:6
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:7
#: lib/pleroma/web/mastodon_api/controllers/suggestion_controller.ex:6
#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:3
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:6
#: lib/pleroma/web/media_proxy/media_proxy_controller.ex:6
#: lib/pleroma/web/mongoose_im/mongoose_im_controller.ex:6
@ -513,7 +505,6 @@ msgstr ""
#: lib/pleroma/web/pleroma_api/controllers/account_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/app_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/backup_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/chat_controller.ex:5
#: lib/pleroma/web/pleroma_api/controllers/conversation_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/emoji_file_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/emoji_pack_controller.ex:6
@ -522,7 +513,6 @@ msgstr ""
#: lib/pleroma/web/pleroma_api/controllers/mascot_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/notification_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/report_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/scrobble_controller.ex:6
#: lib/pleroma/web/pleroma_api/controllers/two_factor_authentication_controller.ex:7
#: lib/pleroma/web/pleroma_api/controllers/user_import_controller.ex:6
#: lib/pleroma/web/static_fe/static_fe_controller.ex:6
@ -532,79 +522,99 @@ msgstr ""
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:6
#: lib/pleroma/web/uploader_controller.ex:6
#: lib/pleroma/web/web_finger/web_finger_controller.ex:6
#, elixir-autogen, elixir-format
msgid "Security violation: OAuth scopes check was neither handled nor explicitly skipped."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_authenticated_plug.ex:32
#, elixir-autogen, elixir-format
msgid "Two-factor authentication enabled, you must use a access token."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/subscription_controller.ex:61
#, elixir-autogen, elixir-format
msgid "Web push subscription is disabled on this Pleroma instance"
msgstr ""
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:214
#, elixir-autogen, elixir-format
#: lib/pleroma/web/admin_api/controllers/admin_api_controller.ex:234
msgid "You can't revoke your own admin/moderator status."
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:169
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/timeline_controller.ex:129
msgid "authorization required for timeline view"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/fallback_controller.ex:24
#, elixir-autogen, elixir-format
msgid "Access denied"
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:331
#, elixir-autogen, elixir-format
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:322
msgid "This API requires an authenticated user"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_staff_privileged_plug.ex:26
#: lib/pleroma/web/plugs/user_is_admin_plug.ex:21
#, elixir-autogen, elixir-format
msgid "User is not an admin."
msgstr ""
#: lib/pleroma/user/backup.ex:73
#, elixir-format
#: lib/pleroma/user/backup.ex:75
msgid "Last export was less than a day ago"
msgid_plural "Last export was less than %{days} days ago"
msgstr[0] ""
msgstr[1] ""
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:421
#, elixir-autogen, elixir-format
#: lib/pleroma/user/backup.ex:93
msgid "Backups require enabled email"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/activity_pub/activity_pub_controller.ex:434
msgid "Character limit (%{limit} characters) exceeded, contains %{length} characters"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/user/backup.ex:98
msgid "Email is required"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/common_api/utils.ex:507
msgid "Too many attachments"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/plugs/ensure_staff_privileged_plug.ex:33
#: lib/pleroma/web/plugs/user_is_staff_plug.ex:20
#, elixir-autogen, elixir-format
msgid "User is not a staff member."
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:391
#, elixir-autogen, elixir-format
#: lib/pleroma/web/o_auth/o_auth_controller.ex:366
msgid "Your account is awaiting approval."
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:255
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:258
#: lib/pleroma/web/mastodon_api/controllers/account_controller.ex:261
#, elixir-autogen, elixir-format
msgid "File is too large"
msgstr ""
#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:37
#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:48
#: lib/pleroma/web/mastodon_api/controllers/tag_controller.ex:59
#, elixir-autogen, elixir-format
msgid "Hashtag not found"
msgstr ""
#: lib/pleroma/web/common_api/activity_draft.ex:144
#, elixir-autogen, elixir-format
msgid "Invalid language"
msgstr ""
#: lib/pleroma/web/o_auth/o_auth_controller.ex:218
#, elixir-autogen, elixir-format
msgid "This action is outside of authorized scopes"
msgstr ""
#: lib/pleroma/web/common_api/activity_draft.ex:129
#, elixir-autogen, elixir-format
msgid "You can only quote public or unlisted statuses"
msgstr ""
#: lib/pleroma/web/common_api/activity_draft.ex:126
#, elixir-autogen, elixir-format
msgid "You can't quote a status that doesn't exist"
msgstr ""

View file

@ -10,504 +10,553 @@
msgid ""
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:9
#, elixir-autogen, elixir-format
msgctxt "remote follow authorization button"
msgid "Authorize"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:2
#, elixir-autogen, elixir-format
msgctxt "remote follow error"
msgid "Error fetching user"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "remote follow header"
msgid "Remote follow"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:8
#, elixir-autogen, elixir-format
msgctxt "placeholder text for auth code entry"
msgid "Authentication code"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:10
#, elixir-autogen, elixir-format
msgctxt "placeholder text for password entry"
msgid "Password"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:8
#, elixir-autogen, elixir-format
msgctxt "placeholder text for username entry"
msgid "Username"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:13
#, elixir-autogen, elixir-format
msgctxt "remote follow authorization button for login"
msgid "Authorize"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:12
#, elixir-autogen, elixir-format
msgctxt "remote follow authorization button for mfa"
msgid "Authorize"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:2
#, elixir-autogen, elixir-format
msgctxt "remote follow error"
msgid "Error following account"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_login.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "remote follow header, need login"
msgid "Log in to follow"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/follow_mfa.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "remote follow mfa header"
msgid "Two-factor authentication"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/remote_follow/followed.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "remote follow success"
msgid "Account followed!"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:7
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:7
#, elixir-autogen, elixir-format
msgctxt "placeholder text for account id"
msgid "Your account ID, e.g. lain@quitter.se"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:8
#, elixir-autogen, elixir-format
msgctxt "remote follow authorization button for following with a remote account"
msgid "Follow"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:2
#, elixir-autogen, elixir-format
msgctxt "remote follow error"
msgid "Error: %{error}"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/util/subscribe.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "remote follow header"
msgid "Remotely follow %{nickname}"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:12
#, elixir-autogen, elixir-format
msgctxt "password reset button"
msgid "Reset"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "password reset failed homepage link"
msgid "Homepage"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_failed.html.eex:1
#, elixir-autogen, elixir-format
msgctxt "password reset failed message"
msgid "Password reset failed"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:8
#, elixir-autogen, elixir-format
msgctxt "password reset form confirm password prompt"
msgid "Confirmation"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "password reset form password prompt"
msgid "Password"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/invalid_token.html.eex:1
#, elixir-autogen, elixir-format
msgctxt "password reset invalid token message"
msgid "Invalid Token"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:2
#, elixir-autogen, elixir-format
msgctxt "password reset successful homepage link"
msgid "Homepage"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/twitter_api/password/reset_success.html.eex:1
#, elixir-autogen, elixir-format
msgctxt "password reset successful message"
msgid "Password changed!"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/feed/feed/tag.atom.eex:15
#: lib/pleroma/web/templates/feed/feed/tag.rss.eex:7
#, elixir-autogen, elixir-format
msgctxt "tag feed description"
msgid "These are public toots tagged with #%{tag}. You can interact with them if you have an account anywhere in the fediverse."
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:3
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:1
msgctxt "oauth authorization exists page title"
msgid "Authorization exists"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:37
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:32
msgctxt "oauth authorize approve button"
msgid "Approve"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:35
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:30
msgctxt "oauth authorize cancel button"
msgid "Cancel"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:26
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:23
msgctxt "oauth authorize message"
msgid "Application <strong>%{client_name}</strong> is requesting access to your account."
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:3
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:1
msgctxt "oauth authorized page title"
msgid "Successfully authorized"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:1
#, elixir-autogen, elixir-format
msgctxt "oauth external provider page title"
msgid "Sign in with external provider"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/consumer.html.eex:13
#, elixir-autogen, elixir-format
msgctxt "oauth external provider sign in button"
msgid "Sign in with %{strategy}"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:59
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:54
msgctxt "oauth login button"
msgid "Log In"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:56
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:51
msgctxt "oauth login password prompt"
msgid "Password"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:52
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:47
msgctxt "oauth login username prompt"
msgid "Username"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:44
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:39
msgctxt "oauth register nickname prompt"
msgid "Pleroma Handle"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:42
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:37
msgctxt "oauth register nickname unchangeable warning"
msgid "Choose carefully! You won't be able to change this later. You will be able to change your display name, though."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:18
#, elixir-autogen, elixir-format
msgctxt "oauth register page email prompt"
msgid "Email"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:10
#, elixir-autogen, elixir-format
msgctxt "oauth register page fill form prompt"
msgid "If you'd like to register a new account, please provide the details below."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:35
#, elixir-autogen, elixir-format
msgctxt "oauth register page login button"
msgid "Proceed as existing user"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:31
#, elixir-autogen, elixir-format
msgctxt "oauth register page login password prompt"
msgid "Password"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:24
#, elixir-autogen, elixir-format
msgctxt "oauth register page login prompt"
msgid "Alternatively, sign in to connect to existing account."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:27
#, elixir-autogen, elixir-format
msgctxt "oauth register page login username prompt"
msgid "Name or email"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:14
#, elixir-autogen, elixir-format
msgctxt "oauth register page nickname prompt"
msgid "Nickname"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:22
#, elixir-autogen, elixir-format
msgctxt "oauth register page register button"
msgid "Proceed as new user"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/register.html.eex:8
#, elixir-autogen, elixir-format
msgctxt "oauth register page title"
msgid "Registration Details"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:36
msgctxt "oauth register page title"
msgid "This is the first time you visit! Please enter your Pleroma handle."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/_scopes.html.eex:2
#, elixir-autogen, elixir-format
msgctxt "oauth scopes message"
msgid "The following permissions will be granted"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:6
#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:6
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/o_auth/oob_authorization_created.html.eex:2
#: lib/pleroma/web/templates/o_auth/o_auth/oob_token_exists.html.eex:2
msgctxt "oauth token code message"
msgid "Token code is <br>%{token}"
msgstr ""
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:14
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:12
msgctxt "mfa auth code prompt"
msgid "Authentication code"
msgstr ""
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:9
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:8
msgctxt "mfa auth page title"
msgid "Two-factor authentication"
msgstr ""
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:25
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:23
msgctxt "mfa auth page use recovery code link"
msgid "Enter a two-factor recovery code"
msgstr ""
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:22
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/totp.html.eex:20
msgctxt "mfa auth verify code button"
msgid "Verify"
msgstr ""
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:9
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:8
msgctxt "mfa recover page title"
msgid "Two-factor recovery"
msgstr ""
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:14
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:12
msgctxt "mfa recover recovery code prompt"
msgid "Recovery code"
msgstr ""
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:25
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:23
msgctxt "mfa recover use 2fa code link"
msgid "Enter a two-factor code"
msgstr ""
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:22
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/o_auth/mfa/recovery.html.eex:20
msgctxt "mfa recover verify recovery code button"
msgid "Verify"
msgstr ""
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:42
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/static_fe/static_fe/profile.html.eex:8
msgctxt "static fe profile page remote follow button"
msgid "Remote follow"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:163
#, elixir-autogen, elixir-format
msgctxt "digest email header line"
msgid "Hey %{nickname}, here is what you've missed!"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:544
#, elixir-autogen, elixir-format
msgctxt "digest email receiver address"
msgid "The email address you are subscribed as is <a href='mailto:%{@user.email}' style='color: %{color};text-decoration: none;'>%{email}</a>. "
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:538
#, elixir-autogen, elixir-format
msgctxt "digest email sending reason"
msgid "You have received this email because you have signed up to receive digest emails from <b>%{instance}</b> Pleroma instance."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:547
#, elixir-autogen, elixir-format
msgctxt "digest email unsubscribe action"
msgid "To unsubscribe, please go %{here}."
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:547
#, elixir-autogen, elixir-format
msgctxt "digest email unsubscribe action link text"
msgid "here"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_failure.html.eex:1
#, elixir-autogen, elixir-format
msgctxt "mailer unsubscribe failed message"
msgid "UNSUBSCRIBE FAILURE"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/web/templates/mailer/subscription/unsubscribe_success.html.eex:1
#, elixir-autogen, elixir-format
msgctxt "mailer unsubscribe successful message"
msgid "UNSUBSCRIBE SUCCESSFUL"
msgstr ""
#, elixir-format
#: lib/pleroma/web/templates/email/digest.html.eex:385
#, elixir-format
msgctxt "new followers count header"
msgid "%{count} New Follower"
msgid_plural "%{count} New Followers"
msgstr[0] ""
msgstr[1] ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:356
msgctxt "account archive email body - self-requested"
msgid "<p>You requested a full backup of your Pleroma account. It's ready for download:</p>\n<p><a href=\"%{download_url}\">%{download_url}</a></p>\n"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:384
#, elixir-autogen, elixir-format
msgctxt "account archive email subject"
msgid "Your account archive is ready"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:188
#, elixir-autogen, elixir-format
msgctxt "approval pending email body"
msgid "<h3>Awaiting Approval</h3>\n<p>Your account at %{instance_name} is being reviewed by staff. You will receive another email once your account is approved.</p>\n"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:202
#, elixir-autogen, elixir-format
msgctxt "approval pending email subject"
msgid "Your account is awaiting approval"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:158
#, elixir-autogen, elixir-format
msgctxt "confirmation email body"
msgid "<h3>Thank you for registering on %{instance_name}</h3>\n<p>Email confirmation is required to activate the account.</p>\n<p>Please click the following link to <a href=\"%{confirmation_url}\">activate your account</a>.</p>\n"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:174
#, elixir-autogen, elixir-format
msgctxt "confirmation email subject"
msgid "%{instance_name} account confirmation"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:310
#, elixir-autogen, elixir-format
msgctxt "digest email subject"
msgid "Your digest from %{instance_name}"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:81
#, elixir-autogen, elixir-format
msgctxt "password reset email body"
msgid "<h3>Reset your password at %{instance_name}</h3>\n<p>Someone has requested password change for your account at %{instance_name}.</p>\n<p>If it was you, visit the following link to proceed: <a href=\"%{password_reset_url}\">reset password</a>.</p>\n<p>If it was someone else, nothing to worry about: your data is secure and your password has not been changed.</p>\n"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:98
#, elixir-autogen, elixir-format
msgctxt "password reset email subject"
msgid "Password reset"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:215
#, elixir-autogen, elixir-format
msgctxt "successful registration email body"
msgid "<h3>Hello @%{nickname},</h3>\n<p>Your account at %{instance_name} has been registered successfully.</p>\n<p>No further action is required to activate your account.</p>\n"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:231
#, elixir-autogen, elixir-format
msgctxt "successful registration email subject"
msgid "Account registered on %{instance_name}"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:119
msgctxt "user invitation email body"
msgid "<h3>You are invited to %{instance_name}</h3>\n<p>%{inviter_name} invites you to join %{instance_name}, an instance of Pleroma federated social networking platform.</p>\n<p>Click the following link to register: <a href=\"%{registration_url}\">accept invitation</a>.</p>\n"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:136
#, elixir-autogen, elixir-format
msgctxt "user invitation email subject"
msgid "Invitation to %{instance_name}"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:53
#, elixir-autogen, elixir-format
msgctxt "welcome email html body"
msgid "Welcome to %{instance_name}!"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:41
#, elixir-autogen, elixir-format
msgctxt "welcome email subject"
msgid "Welcome to %{instance_name}!"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:65
#, elixir-autogen, elixir-format
msgctxt "welcome email text body"
msgid "Welcome to %{instance_name}!"
msgstr ""
#, elixir-autogen, elixir-format
#: lib/pleroma/emails/user_email.ex:368
#, elixir-autogen, elixir-format
msgctxt "account archive email body - admin requested"
msgid "<p>Admin @%{admin_nickname} requested a full backup of your Pleroma account. It's ready for download:</p>\n<p><a href=\"%{download_url}\">%{download_url}</a></p>\n"
msgid "<p>Admin @%{admin_nickname} requested a full backup of your Akkoma account. It's ready for download:</p>\n<p><a href=\"%{download_url}\">%{download_url}</a></p>\n"
msgstr ""
#: lib/pleroma/emails/user_email.ex:356
#, elixir-autogen, elixir-format
msgctxt "account archive email body - self-requested"
msgid "<p>You requested a full backup of your Akkoma account. It's ready for download:</p>\n<p><a href=\"%{download_url}\">%{download_url}</a></p>\n"
msgstr ""
#: lib/pleroma/web/templates/o_auth/o_auth/show.html.eex:41
#, elixir-autogen, elixir-format
msgctxt "oauth register page title"
msgid "This is your first visit! Please enter your Akkoma handle."
msgstr ""
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:123
#, elixir-autogen, elixir-format
msgctxt "remote follow error message - unknown error"
msgid "Something went wrong."
msgstr ""
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:67
#, elixir-autogen, elixir-format
msgctxt "remote follow error message - user not found"
msgid "Could not find user"
msgstr ""
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:8
#, elixir-autogen, elixir-format
msgctxt "status interact authorization button"
msgid "Interact"
msgstr ""
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:2
#, elixir-autogen, elixir-format
msgctxt "status interact error"
msgid "Error: %{error}"
msgstr ""
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:95
#, elixir-autogen, elixir-format
msgctxt "status interact error message - status not found"
msgid "Could not find status"
msgstr ""
#: lib/pleroma/web/twitter_api/controllers/util_controller.ex:144
#, elixir-autogen, elixir-format
msgctxt "status interact error message - unknown error"
msgid "Something went wrong."
msgstr ""
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "status interact header"
msgid "Interacting with %{nickname}'s %{status_link}"
msgstr ""
#: lib/pleroma/web/templates/twitter_api/util/status_interact.html.eex:4
#, elixir-autogen, elixir-format
msgctxt "status interact header - status link text"
msgid "status"
msgstr ""
#: lib/pleroma/emails/user_email.ex:119
#, elixir-autogen, elixir-format
msgctxt "user invitation email body"
msgid "<h3>You are invited to %{instance_name}</h3>\n<p>%{inviter_name} invites you to join %{instance_name}, an instance of Akkoma federated social networking platform.</p>\n<p>Click the following link to register: <a href=\"%{registration_url}\">accept invitation</a>.</p>\n"
msgstr ""

View file

@ -0,0 +1,23 @@
defmodule Pleroma.Repo.Migrations.RenameIndexUsersApId_COALESCEFollowerAddressIndex do
alias Pleroma.Repo
use Ecto.Migration
def up do
# By default Postgresql first restores the data and then the indexes when dumping and restoring the database.
# Restoring index activities_visibility_index took a very long time.
# users_ap_id_COALESCE_follower_address_index was later added because having this could speed up the restoration tremendously.
# The problem now is that restoration apparently happens in alphabetical order, so this new index wasn't created yet
# by the time activities_visibility_index needed it.
# There were several work-arounds which included more complex steps during backup/restore.
# By renaming this index, it should be restored first and thus activities_visibility_index can make use of it.
# This speeds up restoration significantly without requiring more complex or unexpected steps from people.
Repo.query!("ALTER INDEX public.\"users_ap_id_COALESCE_follower_address_index\"
RENAME TO \"aa_users_ap_id_COALESCE_follower_address_index\";")
end
def down do
Repo.query!("ALTER INDEX public.\"aa_users_ap_id_COALESCE_follower_address_index\"
RENAME TO \"users_ap_id_COALESCE_follower_address_index\";")
end
end

View file

@ -56,8 +56,6 @@ defmodule Pleroma.HTML.Scrubber.Default do
Meta.allow_tag_with_these_attributes(:u, [])
Meta.allow_tag_with_these_attributes(:ul, [])
Meta.allow_tags_with_style_attributes([:span])
Meta.allow_tag_with_this_attribute_values(:span, "class", [
"h-card",
"quote-inline",

View file

@ -5,7 +5,7 @@
"summary": null,
"content": "this does not get replaced",
"source": {
"content": "@akkoma_user @remote_user @full_tag_remote_user@misskey.local.live @oops_not_a_mention linkifylink #dancedance $[jelly mfm goes here] \n\n## aaa",
"content": "@akkoma_user @remote_user @full_tag_remote_user@misskey.local.live @oops_not_a_mention linkifylink #dancedance $[jelly mfm goes here] \n\n## aaa\n\nsome text\nnewline",
"mediaType": "text/x.misskeymarkdown"
},
"published": "2022-07-10T15:37:36.368Z",

View file

@ -353,6 +353,186 @@ test "with the --keep-threads option it keeps old threads with bookmarked posts"
assert length(Repo.all(Object)) == 1
end
test "We don't have unexpected tables which may contain objects that are referenced by activities" do
# We can delete orphaned activities. For that we look for the objects they reference in the 'objects', 'activities', and 'users' table.
# If someone adds another table with objects (idk, maybe with separate relations, or collections or w/e), then we need to make sure we
# add logic for that in the 'prune_objects' task so that we don't wrongly delete their corresponding activities.
# So when someone adds (or removes) a table, this test will fail.
# Either the table contains objects which can be referenced from the activities table
# => in that case the prune_objects job should be adapted so we don't delete activities who still have the referenced object.
# Or it doesn't contain objects which can be referenced from the activities table
# => in that case you can add/remove the table to/from this (sorted) list.
assert Repo.query!(
"SELECT table_name FROM information_schema.tables WHERE table_schema='public' AND table_type='BASE TABLE';"
).rows
|> Enum.sort() == [
["activities"],
["announcement_read_relationships"],
["announcements"],
["apps"],
["backups"],
["bookmarks"],
["chat_message_references"],
["chats"],
["config"],
["conversation_participation_recipient_ships"],
["conversation_participations"],
["conversations"],
["counter_cache"],
["data_migration_failed_ids"],
["data_migrations"],
["deliveries"],
["filters"],
["following_relationships"],
["hashtags"],
["hashtags_objects"],
["instances"],
["lists"],
["markers"],
["mfa_tokens"],
["moderation_log"],
["notifications"],
["oauth_authorizations"],
["oauth_tokens"],
["oban_jobs"],
["oban_peers"],
["objects"],
["password_reset_tokens"],
["push_subscriptions"],
["registrations"],
["report_notes"],
["scheduled_activities"],
["schema_migrations"],
["thread_mutes"],
["user_follows_hashtag"],
["user_frontend_setting_profiles"],
["user_invite_tokens"],
["user_notes"],
["user_relationships"],
["users"]
]
end
test "it prunes orphaned activities with the --prune-orphaned-activities" do
%Object{} |> Map.merge(%{data: %{"id" => "object_for_activity"}}) |> Repo.insert()
%Activity{}
|> Map.merge(%{
local: false,
data: %{"id" => "remote_activity_with_object", "object" => "object_for_activity"}
})
|> Repo.insert()
%Activity{}
|> Map.merge(%{
local: false,
data: %{
"id" => "remote_activity_with_activity",
"object" => "remote_activity_with_object"
}
})
|> Repo.insert()
%User{} |> Map.merge(%{ap_id: "actor"}) |> Repo.insert()
%Activity{}
|> Map.merge(%{
local: false,
data: %{"id" => "remote_activity_with_actor", "object" => "actor"}
})
|> Repo.insert()
%Activity{}
|> Map.merge(%{
local: false,
data: %{
"id" => "remote_activity_without_existing_referenced_object",
"object" => "non_existing"
}
})
|> Repo.insert()
%Activity{}
|> Map.merge(%{
local: true,
data: %{"id" => "local_activity_with_actor", "object" => "non_existing"}
})
|> Repo.insert()
assert length(Repo.all(Activity)) == 5
Mix.Tasks.Pleroma.Database.run(["prune_objects"])
assert length(Repo.all(Activity)) == 5
Mix.Tasks.Pleroma.Database.run(["prune_objects", "--prune-orphaned-activities"])
activities = Repo.all(Activity)
assert "remote_activity_without_existing_referenced_object" not in Enum.map(
activities,
fn a -> a.data["id"] end
)
assert length(activities) == 4
end
test "it prunes orphaned activities with the --prune-orphaned-activities when the objects are referenced from an array" do
%Object{} |> Map.merge(%{data: %{"id" => "existing_object"}}) |> Repo.insert()
%User{} |> Map.merge(%{ap_id: "existing_actor"}) |> Repo.insert()
%Activity{}
|> Map.merge(%{
local: false,
data: %{
"id" => "remote_activity_existing_object",
"object" => ["non_ existing_object", "existing_object"]
}
})
|> Repo.insert()
%Activity{}
|> Map.merge(%{
local: false,
data: %{
"id" => "remote_activity_existing_actor",
"object" => ["non_ existing_object", "existing_actor"]
}
})
|> Repo.insert()
%Activity{}
|> Map.merge(%{
local: false,
data: %{
"id" => "remote_activity_existing_activity",
"object" => ["non_ existing_object", "remote_activity_existing_actor"]
}
})
|> Repo.insert()
%Activity{}
|> Map.merge(%{
local: false,
data: %{
"id" => "remote_activity_without_existing_referenced_object",
"object" => ["owo", "whats_this"]
}
})
|> Repo.insert()
assert length(Repo.all(Activity)) == 4
Mix.Tasks.Pleroma.Database.run(["prune_objects"])
assert length(Repo.all(Activity)) == 4
Mix.Tasks.Pleroma.Database.run(["prune_objects", "--prune-orphaned-activities"])
activities = Repo.all(Activity)
assert length(activities) == 3
assert "remote_activity_without_existing_referenced_object" not in Enum.map(
activities,
fn a -> a.data["id"] end
)
assert length(activities) == 3
end
end
describe "running update_users_following_followers_counts" do

View file

@ -135,7 +135,9 @@ test "a misskey MFM status with a content field should work and be linked", _ do
assert content =~ "@oops_not_a_mention"
assert content =~
"<span class=\"mfm _mfm_jelly_\" style=\"display: inline-block; animation: 1s linear 0s infinite normal both running mfm-rubberBand;\">mfm goes here</span> </p>aaa"
"<span class=\"mfm _mfm_jelly_\">mfm goes here</span> </p>aaa"
assert content =~ "some text<br/>newline"
end
test "a misskey MFM status with a _misskey_content field should work and be linked", _ do

View file

@ -85,6 +85,40 @@ test "a filter with expires_in", %{conn: conn, user: user} do
assert Repo.aggregate(Filter, :count, :id) == 0
end
test "a filter with expires_at", %{conn: conn, user: user} do
response =
with_mock NaiveDateTime, [:passthrough], utc_now: fn -> ~N[2017-03-17 17:09:58] end do
conn
|> put_req_header("content-type", "application/json")
|> post("/api/v1/filters", %{
"phrase" => "bad memes",
context: ["home"],
expires_at: "2017-03-17T17:19:58.000Z"
})
|> json_response_and_validate_schema(200)
end
assert response["irreversible"] == false
assert response["expires_at"] == "2017-03-17T17:19:58.000Z"
filter = Filter.get(response["id"], user)
id = filter.id
assert_enqueued(
worker: PurgeExpiredFilter,
args: %{filter_id: filter.id}
)
assert {:ok, %{id: ^id}} =
perform_job(PurgeExpiredFilter, %{
filter_id: filter.id
})
assert Repo.aggregate(Filter, :count, :id) == 0
end
end
test "fetching a list of filters" do

View file

@ -594,6 +594,7 @@ test "a reblog" do
represented = StatusView.render("show.json", %{for: user, activity: reblog})
assert represented[:id] == to_string(reblog.id)
assert represented[:content] == ""
assert represented[:reblog][:id] == to_string(activity.id)
assert represented[:emojis] == []
assert_schema(represented, "Status", Pleroma.Web.ApiSpec.spec())

View file

@ -728,6 +728,42 @@ test "redirects with oauth authorization, " <>
assert auth.scopes == scopes_subset
end
test "redirects with oauth authorization, " <>
"granting requested app-supported scopes to moderators" do
app_scopes = ["read", "write", "admin", "secret_scope"]
app = insert(:oauth_app, scopes: app_scopes)
redirect_uri = OAuthController.default_redirect_uri(app)
scopes_subset = ["read:subscope", "write", "admin"]
admin = insert(:user, is_moderator: true)
# In case scope param is missing, expecting _all_ app-supported scopes to be granted
conn =
post(
build_conn(),
"/oauth/authorize",
%{
"authorization" => %{
"name" => admin.nickname,
"password" => "test",
"client_id" => app.client_id,
"redirect_uri" => redirect_uri,
"scope" => scopes_subset,
"state" => "statepassed"
}
}
)
target = redirected_to(conn)
assert target =~ redirect_uri
query = URI.parse(target).query |> URI.query_decoder() |> Map.new()
assert %{"state" => "statepassed", "code" => code} = query
auth = Repo.get_by(Authorization, token: code)
assert auth
assert auth.scopes == scopes_subset
end
test "redirects with oauth authorization, " <>
"granting requested app-supported scopes for non-admin users" do
app_scopes = ["read", "write", "secret_scope", "admin"]

View file

@ -26,13 +26,12 @@ test "parse/1" do
test "maybe_put_rel_me/2" do
profile_urls = ["https://social.example.org/users/lain"]
attr = "me"
fallback = nil
assert Pleroma.Web.RelMe.maybe_put_rel_me("http://example.com/rel_me/null", profile_urls) ==
fallback
{:error, {:could_not_verify, "http://example.com/rel_me/null", {:link_match, false}}}
assert Pleroma.Web.RelMe.maybe_put_rel_me("http://example.com/rel_me/error", profile_urls) ==
fallback
assert {:error, {:could_not_fetch, "http://example.com/rel_me/error", _}} =
Pleroma.Web.RelMe.maybe_put_rel_me("http://example.com/rel_me/error", profile_urls)
assert Pleroma.Web.RelMe.maybe_put_rel_me("http://example.com/rel_me/anchor", profile_urls) ==
attr