diff --git a/migration/src/m20240417_233430_post_user_keys.rs b/migration/src/m20240417_233430_post_user_keys.rs index 41a7872..802ac77 100644 --- a/migration/src/m20240417_233430_post_user_keys.rs +++ b/migration/src/m20240417_233430_post_user_keys.rs @@ -8,8 +8,9 @@ pub struct Migration; #[async_trait::async_trait] impl MigrationTrait for Migration { async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> { - - manager.drop_table(Table::drop().table(Post::Table).to_owned()).await?; + manager + .drop_table(Table::drop().table(Post::Table).to_owned()) + .await?; manager .create_table( diff --git a/src/activities/create_post.rs b/src/activities/create_post.rs index 70de587..514f9a6 100644 --- a/src/activities/create_post.rs +++ b/src/activities/create_post.rs @@ -1,5 +1,12 @@ use crate::{ - database::StateHandle, entities::{post, user}, error::Error, objects::{person::DbUser, post::{DbPost, Note}}, utils::generate_object_id + database::StateHandle, + entities::{post, user}, + error::Error, + objects::{ + person::DbUser, + post::{DbPost, Note}, + }, + utils::generate_object_id, }; use activitypub_federation::{ activity_sending::SendActivityTask, @@ -35,9 +42,13 @@ impl CreatePost { id: generate_object_id(data.domain())?, }; let create_with_context = WithContext::new_default(create); - let sends = - SendActivityTask::prepare(&create_with_context, &data.local_user().await?, vec![inbox], data) - .await?; + let sends = SendActivityTask::prepare( + &create_with_context, + &data.local_user().await?, + vec![inbox], + data, + ) + .await?; for send in sends { send.sign_and_send(data).await?; } diff --git a/src/database.rs b/src/database.rs index 3ea3cc7..6858da5 100644 --- a/src/database.rs +++ b/src/database.rs @@ -1,9 +1,9 @@ +use super::entities::prelude::User; use crate::{entities::user, error::Error, objects::person::DbUser}; use anyhow::anyhow; use sea_orm::{DatabaseConnection, EntityTrait}; use serde::{Deserialize, Serialize}; use std::sync::{Arc, Mutex}; -use super::entities::prelude::User; #[derive(Debug, Clone)] pub struct Config {} @@ -24,7 +24,10 @@ pub struct Database { impl State { pub async fn local_user(&self) -> Result { - let user = User::find().one(self.database_connection.as_ref()).await?.unwrap(); + let user = User::find() + .one(self.database_connection.as_ref()) + .await? + .unwrap(); Ok(user.clone()) } diff --git a/src/http.rs b/src/http.rs index 13a7515..9b99203 100644 --- a/src/http.rs +++ b/src/http.rs @@ -1,5 +1,8 @@ use crate::{ - database::StateHandle, entities::user, error::Error, objects::person::{DbUser, PersonAcceptedActivities} + database::StateHandle, + entities::user, + error::Error, + objects::person::{DbUser, PersonAcceptedActivities}, }; use activitypub_federation::{ actix_web::{inbox::receive_activity, signing_actor}, diff --git a/src/main.rs b/src/main.rs index c0739df..83e184a 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,11 +1,15 @@ -use activitypub_federation::config::{FederationConfig, FederationMiddleware}; +use activitypub_federation::{ + config::{FederationConfig, FederationMiddleware}, + http_signatures::generate_actor_keypair, +}; use actix_web::{get, http::KeepAlive, middleware, web, App, Error, HttpResponse, HttpServer}; use actix_web_prom::PrometheusMetricsBuilder; +use chrono::{DateTime, Utc}; use clap::Parser; use database::Database; use http::{http_get_user, http_post_user_inbox, webfinger}; use objects::person::DbUser; -use sea_orm::DatabaseConnection; +use sea_orm::{ActiveModelTrait, DatabaseConnection, Set}; use serde::{Deserialize, Serialize}; use std::{ collections::HashMap, @@ -15,12 +19,13 @@ use std::{ }; use tokio::signal; use tracing::info; +use url::Url; use crate::database::{Config, State}; -mod entities; mod activities; mod database; +mod entities; mod error; mod http; mod objects; @@ -69,12 +74,28 @@ async fn main() -> actix_web::Result<(), anyhow::Error> { ) .unwrap(); - let new_database = Arc::new(Database { - users: Mutex::new(vec![local_user]), - }); + let username = env::var("LOCAL_USER_NAME").unwrap_or(LOCAL_USER_NAME.to_string()); + let domain = env::var("FEDERATED_DOMAIN").unwrap_or(DOMAIN.to_string()); + + let ap_id = Url::parse(&format!("https://{}/{}", domain, &username))?; + let inbox = Url::parse(&format!("https://{}/{}/inbox", domain, &username))?; + let keypair = generate_actor_keypair()?; + + let user = entities::user::ActiveModel { + id: Set(ap_id.into()), + username: Set(username), + inbox: Set(inbox.to_string()), + public_key: Set(keypair.public_key.clone()), + private_key: Set(Some(keypair.private_key.clone())), + last_refreshed_at: Set(chrono::offset::Utc::now()), + local: Set(true), + ..Default::default() + }; let db = sea_orm::Database::connect(database_url).await?; + let user = user.insert(&db).await; + let config = Config {}; let state: State = State { diff --git a/src/objects/person.rs b/src/objects/person.rs index 05a7a61..e9ab100 100644 --- a/src/objects/person.rs +++ b/src/objects/person.rs @@ -1,4 +1,9 @@ -use crate::{activities::create_post::CreatePost, database::{State, StateHandle}, entities::{self, user}, error::Error}; +use crate::{ + activities::create_post::CreatePost, + database::{State, StateHandle}, + entities::{self, user}, + error::Error, +}; use activitypub_federation::{ config::Data, fetch::object_id::ObjectId, diff --git a/src/objects/post.rs b/src/objects/post.rs index 850f938..7915af1 100644 --- a/src/objects/post.rs +++ b/src/objects/post.rs @@ -1,5 +1,10 @@ use crate::{ - activities::create_post::CreatePost, database::StateHandle, entities::{post, user}, error::Error, objects::person::DbUser, utils::generate_object_id + activities::create_post::CreatePost, + database::StateHandle, + entities::{post, user}, + error::Error, + objects::person::DbUser, + utils::generate_object_id, }; use activitypub_federation::{ config::Data, @@ -81,8 +86,9 @@ impl Object for post::Model { local: Set(false), ..Default::default() }; - let post = post.insert(data.app_data().database_connection.clone().as_ref()) - .await?; + let post = post + .insert(data.app_data().database_connection.clone().as_ref()) + .await?; let mention = Mention { href: Url::parse(&creator.id)?,