commit
6d41858e92
@ -0,0 +1 @@
|
||||
/target
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,12 @@
|
||||
[package]
|
||||
name = "rust_fedi"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
axum = "0.8.3"
|
||||
env_logger = "0.11.8"
|
||||
rsa = "0.9.8"
|
||||
serde = { version = "1.0.219", features = ["derive"] }
|
||||
sha2 = "0.10.8"
|
||||
tokio = { version = "1.44.2", features = ["full"] }
|
@ -0,0 +1,26 @@
|
||||
mod users;
|
||||
mod webfinger;
|
||||
|
||||
use axum::{Router, routing::get};
|
||||
use users::users_get;
|
||||
use webfinger::webfinger_get;
|
||||
|
||||
const HOST: &'static str = "testhost.com";
|
||||
const USER: &'static str = "test";
|
||||
|
||||
#[tokio::main]
|
||||
async fn main() {
|
||||
env_logger::init();
|
||||
|
||||
let app = Router::new()
|
||||
.route("/", get(root))
|
||||
.route("/.well_know/webfinger", get(webfinger_get))
|
||||
.route("/users/{users}", get(users_get));
|
||||
|
||||
let listener = tokio::net::TcpListener::bind("0.0.0.0:8000").await.unwrap();
|
||||
axum::serve(listener, app).await.unwrap();
|
||||
}
|
||||
|
||||
async fn root() -> &'static str {
|
||||
"Hello World!"
|
||||
}
|
@ -0,0 +1,31 @@
|
||||
use axum::{Json, extract::Path};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::USER;
|
||||
|
||||
// {
|
||||
// "@context": "https://www.w3.org/ns/activitystreams",
|
||||
// "type": "Person",
|
||||
// "name": "Sally Smith",
|
||||
// "id": "https://testhost.com/users/test"
|
||||
// }
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct UsersResponse {
|
||||
#[serde(rename = "@context")]
|
||||
context: String,
|
||||
r#type: String,
|
||||
name: String,
|
||||
id: String,
|
||||
}
|
||||
|
||||
pub async fn users_get(Path(user): Path<String>) -> Json<UsersResponse> {
|
||||
assert_eq!(user, USER);
|
||||
|
||||
Json(UsersResponse {
|
||||
context: "https://www.w3.org/ns/activitystreams".to_string(),
|
||||
r#type: "Person".to_string(),
|
||||
name: "Sally Smith".to_string(),
|
||||
id: "https://testhost.com/users/test".to_string(),
|
||||
})
|
||||
}
|
@ -0,0 +1,46 @@
|
||||
use axum::{Json, extract::Query};
|
||||
use serde::{Deserialize, Serialize};
|
||||
|
||||
use crate::{HOST, USER};
|
||||
|
||||
#[derive(Deserialize)]
|
||||
pub struct WebfingerQuery {
|
||||
resource: String,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct WebfingerResponse {
|
||||
subject: String,
|
||||
alias: Vec<String>,
|
||||
links: Vec<WebfigerLink>,
|
||||
}
|
||||
|
||||
#[derive(Serialize)]
|
||||
pub struct WebfigerLink {
|
||||
rel: String,
|
||||
r#type: String,
|
||||
href: String,
|
||||
}
|
||||
|
||||
pub async fn webfinger_get(
|
||||
Query(WebfingerQuery { resource }): Query<WebfingerQuery>,
|
||||
) -> Json<WebfingerResponse> {
|
||||
let Some((typ, val)) = resource.split_once(':') else {
|
||||
panic!()
|
||||
};
|
||||
assert_eq!(typ, "acct");
|
||||
let Some((usr, dom)) = val.split_once('@') else {
|
||||
panic!()
|
||||
};
|
||||
assert_eq!(usr, USER);
|
||||
assert_eq!(dom, HOST);
|
||||
Json(WebfingerResponse {
|
||||
subject: format!("acct:{USER}@{HOST}"),
|
||||
alias: vec![format!("https://{HOST}/users/{USER}")],
|
||||
links: vec![WebfigerLink {
|
||||
rel: "self".to_string(),
|
||||
r#type: "application/activity+json".to_string(),
|
||||
href: format!("https://{HOST}/users/{USER}"),
|
||||
}],
|
||||
})
|
||||
}
|
Loading…
Reference in new issue