🔨 Add some tests utilities of activity pub
This commit is contained in:
287
docs/ACTIVITYPUB_IMPLEMENTATION.md
Normal file
287
docs/ACTIVITYPUB_IMPLEMENTATION.md
Normal file
@@ -0,0 +1,287 @@
|
||||
# ActivityPub Implementation for Solar Network
|
||||
|
||||
## Overview
|
||||
|
||||
This document outlines the initial implementation of ActivityPub federation for the Solar Network (DysonNetwork), following the plan outlined in `ACTIVITYPUB_PLAN.md`.
|
||||
|
||||
## What Has Been Created
|
||||
|
||||
### 1. Database Models (DysonNetwork.Shared/Models)
|
||||
|
||||
All ActivityPub-related models are shared across projects and located in `DysonNetwork.Shared/Models/`:
|
||||
|
||||
#### FediverseInstance.cs
|
||||
- Tracks ActivityPub instances (servers) in the fediverse
|
||||
- Stores instance metadata, blocking status, and activity tracking
|
||||
- Links to actors and content from that instance
|
||||
|
||||
#### FediverseActor.cs
|
||||
- Represents remote actors (users/accounts) from other instances
|
||||
- Stores actor information including keys, inbox/outbox URLs
|
||||
- Links to instance and manages relationships
|
||||
- Tracks whether the actor is a bot, locked, or discoverable
|
||||
|
||||
#### FediverseContent.cs
|
||||
- Stores content (posts, notes, etc.) received from the fediverse
|
||||
- Supports multiple content types (Note, Article, Image, Video, etc.)
|
||||
- Includes attachments, mentions, tags, and emojis
|
||||
- Links to local posts for unified display
|
||||
|
||||
#### FediverseActivity.cs
|
||||
- Tracks ActivityPub activities (Create, Follow, Like, Announce, etc.)
|
||||
- Stores raw activity data and processing status
|
||||
- Links to actors, content, and local entities
|
||||
- Supports both incoming and outgoing activities
|
||||
|
||||
#### FediverseRelationship.cs
|
||||
- Manages follow relationships between local and remote actors
|
||||
- Tracks relationship state (Pending, Accepted, Rejected)
|
||||
- Supports muting and blocking
|
||||
- Links to local accounts/publishers
|
||||
|
||||
#### FediverseReaction.cs
|
||||
- Stores reactions (likes, emoji) from both local and remote actors
|
||||
- Links to content and actor
|
||||
- Supports federation of reactions
|
||||
|
||||
### 2. Database Migration
|
||||
|
||||
**File**: `DysonNetwork.Sphere/Migrations/20251228120000_AddActivityPubModels.cs`
|
||||
|
||||
This migration creates the following tables:
|
||||
- `fediverse_instances` - Instance tracking
|
||||
- `fediverse_actors` - Remote actor profiles
|
||||
- `fediverse_contents` - Federated content storage
|
||||
- `fediverse_activities` - Activity tracking and processing
|
||||
- `fediverse_relationships` - Follow relationships
|
||||
- `fediverse_reactions` - Reactions from fediverse
|
||||
|
||||
### 3. API Controllers (DysonNetwork.Sphere/ActivityPub)
|
||||
|
||||
#### WebFingerController.cs
|
||||
- **Endpoint**: `GET /.well-known/webfinger?resource=acct:<username>@<domain>`
|
||||
- **Purpose**: Allows other instances to discover actors via WebFinger protocol
|
||||
- **Response**: Returns actor's inbox/outbox URLs and profile page links
|
||||
- Maps local Publishers to ActivityPub actors
|
||||
|
||||
#### ActivityPubController.cs
|
||||
Provides three main endpoints:
|
||||
|
||||
1. **GET /activitypub/actors/{username}**
|
||||
- Returns ActivityPub actor profile in JSON-LD format
|
||||
- Includes actor's keys, inbox, outbox, followers, and following URLs
|
||||
- Maps SnPublisher to ActivityPub Person type
|
||||
|
||||
2. **GET /activitypub/actors/{username}/outbox**
|
||||
- Returns actor's outbox collection
|
||||
- Lists public posts as ActivityPub activities
|
||||
- Supports pagination
|
||||
|
||||
3. **POST /activitypub/actors/{username}/inbox**
|
||||
- Receives incoming ActivityPub activities
|
||||
- Supports Create, Follow, Like, Announce activities
|
||||
- Placeholder for activity processing logic
|
||||
|
||||
## Architecture
|
||||
|
||||
### Data Flow
|
||||
|
||||
```
|
||||
Remote Instance Solar Network (Sphere)
|
||||
│ │
|
||||
│ ───WebFinger─────> │
|
||||
│ │
|
||||
│ <───Actor JSON──── │
|
||||
│ │
|
||||
│ ───Activity─────> │ → Inbox Processing
|
||||
│ │
|
||||
│ <───Activity────── │ ← Outbox Distribution
|
||||
```
|
||||
|
||||
### Model Relationships
|
||||
|
||||
- `SnFediverseInstance` has many `SnFediverseActor`
|
||||
- `SnFediverseInstance` has many `SnFediverseContent`
|
||||
- `SnFediverseActor` has many `SnFediverseContent`
|
||||
- `SnFediverseActor` has many `SnFediverseActivity`
|
||||
- `SnFediverseActor` has many `SnFediverseRelationship` (as follower and following)
|
||||
- `SnFediverseContent` has many `SnFediverseActivity`
|
||||
- `SnFediverseContent` has many `SnFediverseReaction`
|
||||
- `SnFediverseContent` optionally links to `SnPost` (local copy)
|
||||
|
||||
### Local to Fediverse Mapping
|
||||
|
||||
| Solar Network Model | ActivityPub Type |
|
||||
|-------------------|-----------------|
|
||||
| SnPublisher | Person (Actor) |
|
||||
| SnPost | Note / Article |
|
||||
| SnPostReaction | Like / EmojiReact |
|
||||
| Follow | Follow Activity |
|
||||
| SnPublisherSubscription | Follow Relationship |
|
||||
|
||||
## Next Steps
|
||||
|
||||
### Stage 1: Core Infrastructure ✅ (COMPLETED)
|
||||
- ✅ Create database models for ActivityPub entities
|
||||
- ✅ Create database migration
|
||||
- ✅ Implement basic WebFinger endpoint
|
||||
- ✅ Implement basic Actor endpoint
|
||||
- ✅ Implement Inbox/Outbox endpoints
|
||||
|
||||
### Stage 2: Activity Processing ✅ (COMPLETED)
|
||||
- ✅ Implement HTTP Signature verification (ActivityPubSignatureService)
|
||||
- ✅ Process incoming activities:
|
||||
- Follow/Accept/Reject
|
||||
- Create (incoming posts)
|
||||
- Like/Announce
|
||||
- Delete/Update
|
||||
- Undo
|
||||
- ✅ Generate outgoing activities (ActivityPubDeliveryService)
|
||||
- ✅ Queue and retry failed deliveries (basic implementation)
|
||||
|
||||
### Stage 3: Key Management ✅ (COMPLETED)
|
||||
- ✅ Generate RSA key pairs for each Publisher (ActivityPubKeyService)
|
||||
- ✅ Store public/private keys in Publisher.Meta
|
||||
- ✅ Sign outgoing HTTP requests
|
||||
- ✅ Verify incoming HTTP signatures
|
||||
|
||||
### Stage 4: Content Federation (IN PROGRESS)
|
||||
- ✅ Convert between SnPost and ActivityPub Note/Article (basic mapping)
|
||||
- ✅ Handle content attachments and media
|
||||
- ✅ Support content warnings and sensitive content
|
||||
- ✅ Handle replies, boosts, and mentions
|
||||
- ⏳ Add local post reference for federated content
|
||||
- ⏳ Handle media attachments in federated content
|
||||
|
||||
### Stage 5: Relationship Management ✅ (COMPLETED)
|
||||
- ✅ Handle follow/unfollow logic
|
||||
- ✅ Update followers/following collections
|
||||
- ✅ Block/mute functionality (data model ready)
|
||||
- ✅ Relationship state machine (Pending, Accepted, Rejected)
|
||||
|
||||
### Stage 6: Testing & Interop (NEXT)
|
||||
- ⏳ Test with Mastodon instances
|
||||
- ⏳ Test with Pleroma/Akkoma instances
|
||||
- ⏳ Test with Lemmy instances
|
||||
- ⏳ Verify WebFinger and actor discovery
|
||||
- ⏳ Test activity delivery and processing
|
||||
|
||||
## Implementation Details
|
||||
|
||||
### Core Services
|
||||
|
||||
#### 1. ActivityPubKeyService
|
||||
- Generates RSA 2048-bit key pairs for ActivityPub
|
||||
- Signs data with private key
|
||||
- Verifies signatures with public key
|
||||
- Key stored in `SnPublisher.Meta["private_key"]` and `["public_key"]`
|
||||
|
||||
#### 2. ActivityPubSignatureService
|
||||
- Verifies incoming HTTP Signature headers
|
||||
- Signs outgoing HTTP requests
|
||||
- Manages key retrieval and storage
|
||||
- Builds signing strings according to ActivityPub spec
|
||||
|
||||
#### 3. ActivityPubActivityProcessor
|
||||
- Processes all incoming activity types
|
||||
- Follow: Creates relationship, sends Accept
|
||||
- Accept: Updates relationship to accepted state
|
||||
- Reject: Updates relationship to rejected state
|
||||
- Create: Stores federated content
|
||||
- Like: Records like reaction
|
||||
- Announce: Increments boost count
|
||||
- Undo: Reverts previous actions
|
||||
- Delete: Soft-deletes federated content
|
||||
- Update: Marks content as edited
|
||||
|
||||
#### 4. ActivityPubDeliveryService
|
||||
- Sends Follow activities to remote instances
|
||||
- Sends Accept activities in response to follows
|
||||
- Sends Create activities (posts) to followers
|
||||
- Sends Like activities to remote instances
|
||||
- Sends Undo activities
|
||||
- Fetches remote actor profiles on-demand
|
||||
|
||||
### Data Flow
|
||||
|
||||
#### Incoming Activity Flow
|
||||
```
|
||||
Remote Server → HTTP Signature Verification → Activity Type → Specific Handler
|
||||
↓
|
||||
Database Update & Response
|
||||
```
|
||||
|
||||
#### Outgoing Activity Flow
|
||||
```
|
||||
Local Action → Create Activity → Sign with Key → Send to Followers' Inboxes
|
||||
↓
|
||||
Track Status & Retry
|
||||
```
|
||||
|
||||
## Configuration
|
||||
|
||||
Add to `appsettings.json`:
|
||||
|
||||
```json
|
||||
{
|
||||
"ActivityPub": {
|
||||
"Domain": "your-domain.com",
|
||||
"EnableFederation": true
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## Database Migration
|
||||
|
||||
To apply the migration:
|
||||
|
||||
```bash
|
||||
cd DysonNetwork.Sphere
|
||||
dotnet ef database update
|
||||
```
|
||||
|
||||
## Testing
|
||||
|
||||
### WebFinger
|
||||
```bash
|
||||
curl "https://your-domain.com/.well-known/webfinger?resource=acct:username@your-domain.com"
|
||||
```
|
||||
|
||||
### Actor Profile
|
||||
```bash
|
||||
curl -H "Accept: application/activity+json" https://your-domain.com/activitypub/actors/username
|
||||
```
|
||||
|
||||
### Outbox
|
||||
```bash
|
||||
curl -H "Accept: application/activity+json" https://your-domain.com/activitypub/actors/username/outbox
|
||||
```
|
||||
|
||||
## Notes
|
||||
|
||||
- All models follow the existing Solar Network patterns (ModelBase, NodaTime, JSON columns)
|
||||
- Controllers use standard ASP.NET Core patterns with dependency injection
|
||||
- Database uses PostgreSQL with JSONB for flexible metadata storage
|
||||
- Migration follows existing naming conventions
|
||||
- Soft delete is enabled on all models
|
||||
|
||||
## References
|
||||
|
||||
- [ActivityPub W3C Recommendation](https://www.w3.org/TR/activitypub/)
|
||||
- [ActivityStreams 2.0](https://www.w3.org/TR/activitystreams-core/)
|
||||
- [WebFinger RFC 7033](https://tools.ietf.org/html/rfc7033)
|
||||
- [Mastodon Federation Documentation](https://docs.joinmastodon.org/spec/activitypub/)
|
||||
|
||||
## TODOs
|
||||
|
||||
- [ ] Implement HTTP Signature verification middleware
|
||||
- [ ] Create activity processor service
|
||||
- [ ] Implement activity queue and retry logic
|
||||
- [ ] Add key generation for Publishers
|
||||
- [ ] Implement content conversion between formats
|
||||
- [ ] Add inbox background worker
|
||||
- [ ] Add outbox delivery worker
|
||||
- [ ] Implement relationship management logic
|
||||
- [ ] Add moderation tools for federated content
|
||||
- [ ] Add federation metrics and monitoring
|
||||
- [ ] Write comprehensive tests
|
||||
Reference in New Issue
Block a user