mirror of
https://codeberg.org/fediverse/fep.git
synced 2026-08-05 11:46:04 +00:00
FEP-6fcd: Account Export Container Format (#354)
Reviewed-on: https://codeberg.org/fediverse/fep/pulls/354 Co-authored-by: Dmitri Zagidulin <dzagidulin@gmail.com> Co-committed-by: Dmitri Zagidulin <dzagidulin@gmail.com>
This commit is contained in:
committed by
silverpill
parent
a5d315af2f
commit
072f0a37d3
@@ -0,0 +1,186 @@
|
||||
---
|
||||
slug: "6fcd"
|
||||
authors: Dmitri Zagidulin <@dmitri@social.coop>
|
||||
status: DRAFT
|
||||
dateReceived: 2024-07-11
|
||||
discussionsTo: https://socialhub.activitypub.rocks/t/fep-6fcd-account-export-container-format/4355
|
||||
---
|
||||
# FEP-6fcd: Account Export Container Format
|
||||
|
||||
## Summary
|
||||
|
||||
This FEP describes a lightweight general purpose account export container format,
|
||||
with the following properties:
|
||||
|
||||
* General purpose, allowing for easy adaptation of existing ActivityPub, social media, and
|
||||
cryptographic key material export formats
|
||||
* Extensible, upgradable, and self-documenting (in the human-readable sense)
|
||||
* Works with [FEP-7952: Roadmap for Actor and Object Portability](https://codeberg.org/fediverse/fep/pulls/334/files)
|
||||
* Serves as a concrete serialization of the result of the Export operation described in
|
||||
[FEP-9091: Export Actor Service Endpoint](https://codeberg.org/fediverse/fep/pulls/353)
|
||||
|
||||
Out of scope:
|
||||
|
||||
* Encryption -- handled in a separate layer
|
||||
* Compression -- handled in a separate layer (how to turn a `.tar` file into a
|
||||
`.tar.gz` is well known)
|
||||
|
||||
## Inspirations and Prior Art
|
||||
|
||||
* (Undocumented) Mastodon Account Export features
|
||||
* [IndieWeb Blog Archive Format](https://indieweb.org/blog_archive_format)
|
||||
* WordPress Export Format
|
||||
* DIF Universal Wallet Backup Containers spec (in progress)
|
||||
|
||||
## Overall Concept
|
||||
|
||||
1. Serialize export data into files and directories
|
||||
2. Add a lightweight `manifest.yml` file that describes what's in the files and directories
|
||||
3. Wrap everything into a `.tar` file.
|
||||
|
||||
## Manifest File
|
||||
|
||||
### Reserved Properties
|
||||
|
||||
* (Required) `ubc-version`: Version of the Account Export Container Format spec
|
||||
* (Required) `contents`: A listing of files and directories in this .tar file
|
||||
* (Optional) `meta`: A metadata section describing who this export belongs to, what app
|
||||
or service created it, and so on.
|
||||
|
||||
### ActivityPub Export Example
|
||||
|
||||
Example result of exporting an ActivityPub account:
|
||||
|
||||
```bash
|
||||
$ tar -vtf ap-account-export-2024-06-11.tar
|
||||
|
||||
-rw-rw-r-- 0 0 1K Jun 11 15:38 manifest.yml
|
||||
drwxrwxr-x 0 0 4.0K Jun 11 15:38 activitypub/
|
||||
drwxrwxr-x 0 0 4.0K Jun 11 15:38 key/
|
||||
```
|
||||
|
||||
Example corresponding `manifest.yml` file:
|
||||
|
||||
```yaml
|
||||
# (Required) Universal Backup Container spec version
|
||||
ubc-version: 0.1
|
||||
|
||||
# (Optional) Metadata section
|
||||
meta:
|
||||
created: 2024-01-01
|
||||
createdBy:
|
||||
# (Optional) URL to a Controller document, such as an ActivityPub profile using FEP-521a
|
||||
# @see https://codeberg.org/fediverse/fep/src/branch/main/fep/521a/fep-521a.md
|
||||
controller: https://alice-personal-site.example/actor
|
||||
# (Optional) The app or service that created this export
|
||||
client:
|
||||
name: "Example Exporter App"
|
||||
url: https://codeberg.example.com/example-export-app
|
||||
|
||||
# (Required, but can be empty) Contents section, listing the other files and directories
|
||||
contents:
|
||||
# This file
|
||||
manifest.yml:
|
||||
url: https://codeberg.org/fediverse/fep/src/branch/main/fep/6fcd/fep-6fcd.md#manifest-file
|
||||
# Directory with ActivityPub-relevant exports
|
||||
activitypub:
|
||||
contents:
|
||||
# Serialized ActivityPub Actor profile
|
||||
actor.json:
|
||||
url: https://www.w3.org/TR/activitypub/#actor-objects
|
||||
# ActivityStreams OrderedCollection representing the contents of the actor's Outbox
|
||||
outbox.json:
|
||||
url: https://www.w3.org/TR/activitystreams-core/#collections
|
||||
following_accounts.csv:
|
||||
url: https://docs.joinmastodon.org/user/moving/#export
|
||||
followers.csv:
|
||||
url: https://docs.joinmastodon.org/user/moving/#export
|
||||
lists.csv:
|
||||
url: https://docs.joinmastodon.org/user/moving/#export
|
||||
bookmarks.csv:
|
||||
url: https://docs.joinmastodon.org/user/moving/#export
|
||||
blocks.csv:
|
||||
url: https://docs.joinmastodon.org/user/moving/#export
|
||||
mutes.csv:
|
||||
url: https://docs.joinmastodon.org/user/moving/#export
|
||||
# Directory of object attachments (post images, etc)
|
||||
attachments:
|
||||
url: https://www.w3.org/TR/activitystreams-vocabulary/#dfn-attachment
|
||||
contents:
|
||||
# Actor profile avatar
|
||||
avatar.jpg:
|
||||
url: https://www.w3.org/TR/activitystreams-vocabulary/#dfn-icon
|
||||
# 'key' dir, serialized private/public key pairs,
|
||||
# such as those declared in a FEP-521a Actor profile
|
||||
key:
|
||||
url: https://codeberg.org/fediverse/fep/src/branch/main/fep/521a/fep-521a.md
|
||||
contents:
|
||||
key-1234.json:
|
||||
url: https://www.w3.org/TR/vc-di-eddsa/#representation-eddsa-rdfc-2022
|
||||
```
|
||||
|
||||
Example exported key file:
|
||||
|
||||
```
|
||||
$ cat key/key-1234.json
|
||||
```
|
||||
|
||||
```json
|
||||
{
|
||||
"@context": ["https://w3id.org/security/multikey/v1"],
|
||||
"type": "Multikey",
|
||||
"id": "https://alice-personal-site.example/actor#key1234",
|
||||
"controller": "https://alice-personal-site.example/actor",
|
||||
"publicKeyMultibase": "z6MkrJVnaZkeFzdQyMZu1cgjg7k1pZZ6pvBQ7XJPt4swbTQ2",
|
||||
"privateKeyMultibase": "z3u2en7t5LR2WtQH5PfFqMqwVHBeXouLzo6haApm8XHqvjxq"
|
||||
}
|
||||
```
|
||||
|
||||
### Example Blog Archive Format Export
|
||||
|
||||
```bash
|
||||
$ tar -vtf bar-account-export-2024-06-11.tar
|
||||
|
||||
-rw-rw-r-- 0 0 1K Jun 11 15:38 manifest.yml
|
||||
-rw-rw-r-- 0 0 100K Jun 11 15:38 index.html
|
||||
-rw-rw-r-- 0 0 50K Jun 11 15:38 feed.json
|
||||
drwxrwxr-x 0 0 4.0K Jun 11 15:38 uploads/
|
||||
```
|
||||
|
||||
Example corresponding `manifest.yml` file:
|
||||
|
||||
```yaml
|
||||
ubc-version: 0.1
|
||||
|
||||
meta:
|
||||
created: 2024-01-01
|
||||
|
||||
contents:
|
||||
# This file
|
||||
manifest.yml:
|
||||
url: https://codeberg.org/fediverse/fep/src/branch/main/fep/6fcd/fep-6fcd.md#manifest-file
|
||||
index.html:
|
||||
url: https://indieweb.org/blog_archive_format
|
||||
feed.json:
|
||||
url: https://indieweb.org/blog_archive_format
|
||||
uploads:
|
||||
url: https://indieweb.org/blog_archive_format
|
||||
```
|
||||
|
||||
## References
|
||||
|
||||
* [FEP-521a: Representing actor's public keys][FEP-521a]
|
||||
* Christine Lemmer Webber, Jessica Tallon, [ActivityPub][AP], 2018
|
||||
* S. Bradner, Key words for use in RFCs to Indicate Requirement Levels, 1997
|
||||
* Dave Longley, Manu Sporny, [Data Integrity EdDSA Cryptosuites][DI Sigs] v1.0, 2023
|
||||
|
||||
[FEP-521a]: https://codeberg.org/fediverse/fep/src/branch/main/fep/521a/fep-521a.md
|
||||
[AP]: https://www.w3.org/TR/activitypub/
|
||||
[DI Sigs]: https://w3c.github.io/vc-di-eddsa/#eddsa-jcs-2022
|
||||
|
||||
## Copyright
|
||||
|
||||
CC0 1.0 Universal (CC0 1.0) Public Domain Dedication
|
||||
|
||||
To the extent possible under law, the authors of this Fediverse Enhancement
|
||||
Proposal have waived all copyright and related or neighboring rights to this work.
|
||||
Reference in New Issue
Block a user