Compare commits
7 commits
Author | SHA1 | Date | |
---|---|---|---|
asonix | 171e35d656 | ||
asonix | e624f88536 | ||
asonix | 0835c0118e | ||
asonix | 5dec9f6427 | ||
asonix | c4d97f378f | ||
asonix | 2f5cdc93f7 | ||
Aode (Lion) | 8ab8f74821 |
|
@ -23,6 +23,7 @@ steps:
|
|||
commands:
|
||||
- rustup component add clippy
|
||||
- cargo clippy -- -D warnings
|
||||
- cargo clippy --no-default-features -- -D warnings
|
||||
- cargo clippy --example fetch -- -D warnings
|
||||
- cargo clippy --example resolver -- -D warnings
|
||||
|
||||
|
@ -91,6 +92,7 @@ steps:
|
|||
pull: always
|
||||
commands:
|
||||
- cargo check --target=$TARGET
|
||||
- cargo check --target=$TARGET --no-default-features
|
||||
- cargo check --target=$TARGET --example fetch
|
||||
- cargo check --target=$TARGET --example resolver
|
||||
|
||||
|
@ -125,6 +127,7 @@ steps:
|
|||
pull: always
|
||||
commands:
|
||||
- cargo check --target=$TARGET
|
||||
- cargo check --target=$TARGET --no-default-features
|
||||
- cargo check --target=$TARGET --example fetch
|
||||
- cargo check --target=$TARGET --example resolver
|
||||
|
||||
|
@ -159,6 +162,7 @@ steps:
|
|||
pull: always
|
||||
commands:
|
||||
- cargo check --target=$TARGET
|
||||
- cargo check --target=$TARGET --no-default-features
|
||||
- cargo check --target=$TARGET --example fetch
|
||||
- cargo check --target=$TARGET --example resolver
|
||||
|
||||
|
|
2
.gitignore
vendored
2
.gitignore
vendored
|
@ -1,3 +1,5 @@
|
|||
/target
|
||||
**/*.rs.bk
|
||||
Cargo.lock
|
||||
.direnv
|
||||
.envrc
|
||||
|
|
10
Cargo.toml
10
Cargo.toml
|
@ -1,21 +1,25 @@
|
|||
[package]
|
||||
name = "actix-webfinger"
|
||||
description = "Types and helpers to create and fetch Webfinger resources"
|
||||
version = "0.4.0"
|
||||
version = "0.5.0"
|
||||
license = "GPL-3.0"
|
||||
authors = ["asonix <asonix@asonix.dog>"]
|
||||
repository = "https://git.asonix.dog/asonix/actix-webfinger"
|
||||
readme = "README.md"
|
||||
edition = "2021"
|
||||
|
||||
[features]
|
||||
default = ["client"]
|
||||
client = ["dep:awc"]
|
||||
|
||||
[dependencies]
|
||||
actix-rt = "2.6.0"
|
||||
actix-web = { version = "4.0.1", default-features = false }
|
||||
awc = { version = "3.0.0", default-features = false }
|
||||
awc = { version = "3.0.0", default-features = false, optional = true }
|
||||
serde = "1.0"
|
||||
serde_derive = "1.0"
|
||||
thiserror = "1.0"
|
||||
|
||||
[dev-dependencies]
|
||||
pretty_env_logger = "0.4"
|
||||
pretty_env_logger = "0.5"
|
||||
serde_json = "1.0"
|
||||
|
|
37
README.md
37
README.md
|
@ -13,23 +13,30 @@ First, add Actix Webfinger as a dependency
|
|||
|
||||
```toml
|
||||
[dependencies]
|
||||
actix-rt = "=2.0.0-beta.1"
|
||||
actix-web = "4.0.0-alpha.1"
|
||||
actix-webfinger = "0.4.0-beta.1"
|
||||
actix-rt = "2.6.0"
|
||||
actix-web = "4.0.0"
|
||||
actix-webfinger = "0.4.0"
|
||||
```
|
||||
|
||||
Then use it in your application
|
||||
|
||||
#### Client Example
|
||||
```rust
|
||||
use actix_web::client::Client;
|
||||
use actix_webfinger::Webfinger;
|
||||
use awc::Client;
|
||||
use std::error::Error;
|
||||
|
||||
#[actix_rt::main]
|
||||
async fn main() -> Result<(), Box<dyn Error>> {
|
||||
let client = Client::default();
|
||||
let wf = Webfinger::fetch(&client, "asonix@asonix.dog", "localhost:8000", false).await?;
|
||||
let wf = Webfinger::fetch(
|
||||
&client,
|
||||
Some("acct:"),
|
||||
"asonix@localhost:8000",
|
||||
"localhost:8000",
|
||||
false,
|
||||
)
|
||||
.await?;
|
||||
|
||||
println!("asonix's webfinger:\n{:#?}", wf);
|
||||
Ok(())
|
||||
|
@ -38,7 +45,7 @@ async fn main() -> Result<(), Box<dyn Error>> {
|
|||
|
||||
#### Server Example
|
||||
```rust
|
||||
use actix_web::{web::Data, App, HttpServer};
|
||||
use actix_web::{middleware::Logger, web::Data, App, HttpServer};
|
||||
use actix_webfinger::{Resolver, Webfinger};
|
||||
use std::{error::Error, future::Future, pin::Pin};
|
||||
|
||||
|
@ -49,16 +56,19 @@ pub struct MyState {
|
|||
|
||||
pub struct MyResolver;
|
||||
|
||||
type LocalBoxFuture<'a, Output> = Pin<Box<dyn Future<Output = Output> + 'a>>;
|
||||
|
||||
impl Resolver for MyResolver {
|
||||
type State = Data<MyState>;
|
||||
type Error = actix_web::error::JsonPayloadError;
|
||||
|
||||
fn find(
|
||||
scheme: Option<&str>,
|
||||
account: &str,
|
||||
domain: &str,
|
||||
state: Data<MyState>,
|
||||
) -> Pin<Box<dyn Future<Output = Result<Option<Webfinger>, Self::Error>>>> {
|
||||
let w = if domain == state.domain {
|
||||
) -> LocalBoxFuture<'static, Result<Option<Webfinger>, Self::Error>> {
|
||||
let w = if scheme == Some("acct:") && domain == state.domain {
|
||||
Some(Webfinger::new(&format!("{}@{}", account, domain)))
|
||||
} else {
|
||||
None
|
||||
|
@ -70,12 +80,15 @@ impl Resolver for MyResolver {
|
|||
|
||||
#[actix_rt::main]
|
||||
async fn main() -> Result<(), Box<dyn Error>> {
|
||||
std::env::set_var("RUST_LOG", "info");
|
||||
pretty_env_logger::init();
|
||||
HttpServer::new(|| {
|
||||
App::new()
|
||||
.data(MyState {
|
||||
domain: "asonix.dog".to_owned(),
|
||||
})
|
||||
.service(actix_webfinger::resource::<_, MyResolver>())
|
||||
.app_data(Data::new(MyState {
|
||||
domain: "localhost:8000".to_owned(),
|
||||
}))
|
||||
.wrap(Logger::default())
|
||||
.service(actix_webfinger::resource::<MyResolver>())
|
||||
})
|
||||
.bind("127.0.0.1:8000")?
|
||||
.run()
|
||||
|
|
61
flake.lock
Normal file
61
flake.lock
Normal file
|
@ -0,0 +1,61 @@
|
|||
{
|
||||
"nodes": {
|
||||
"flake-utils": {
|
||||
"inputs": {
|
||||
"systems": "systems"
|
||||
},
|
||||
"locked": {
|
||||
"lastModified": 1689068808,
|
||||
"narHash": "sha256-6ixXo3wt24N/melDWjq70UuHQLxGV8jZvooRanIHXw0=",
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"rev": "919d646de7be200f3bf08cb76ae1f09402b6f9b4",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "numtide",
|
||||
"repo": "flake-utils",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"nixpkgs": {
|
||||
"locked": {
|
||||
"lastModified": 1692174805,
|
||||
"narHash": "sha256-xmNPFDi/AUMIxwgOH/IVom55Dks34u1g7sFKKebxUm0=",
|
||||
"owner": "NixOS",
|
||||
"repo": "nixpkgs",
|
||||
"rev": "caac0eb6bdcad0b32cb2522e03e4002c8975c62e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "NixOS",
|
||||
"ref": "nixos-unstable",
|
||||
"repo": "nixpkgs",
|
||||
"type": "github"
|
||||
}
|
||||
},
|
||||
"root": {
|
||||
"inputs": {
|
||||
"flake-utils": "flake-utils",
|
||||
"nixpkgs": "nixpkgs"
|
||||
}
|
||||
},
|
||||
"systems": {
|
||||
"locked": {
|
||||
"lastModified": 1681028828,
|
||||
"narHash": "sha256-Vy1rq5AaRuLzOxct8nz4T6wlgyUR7zLU309k9mBC768=",
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"rev": "da67096a3b9bf56a91d16901293e51ba5b49a27e",
|
||||
"type": "github"
|
||||
},
|
||||
"original": {
|
||||
"owner": "nix-systems",
|
||||
"repo": "default",
|
||||
"type": "github"
|
||||
}
|
||||
}
|
||||
},
|
||||
"root": "root",
|
||||
"version": 7
|
||||
}
|
25
flake.nix
Normal file
25
flake.nix
Normal file
|
@ -0,0 +1,25 @@
|
|||
{
|
||||
description = "actix-webfinger";
|
||||
|
||||
inputs = {
|
||||
nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
|
||||
flake-utils.url = "github:numtide/flake-utils";
|
||||
};
|
||||
|
||||
outputs = { self, nixpkgs, flake-utils }:
|
||||
flake-utils.lib.eachDefaultSystem (system:
|
||||
let
|
||||
pkgs = import nixpkgs {
|
||||
inherit system;
|
||||
};
|
||||
in
|
||||
{
|
||||
packages.default = pkgs.hello;
|
||||
|
||||
devShell = with pkgs; mkShell {
|
||||
nativeBuildInputs = [ cargo cargo-outdated cargo-zigbuild clippy gcc protobuf rust-analyzer rustc rustfmt ];
|
||||
|
||||
RUST_SRC_PATH = "${pkgs.rust.packages.stable.rustPlatform.rustLibSrc}";
|
||||
};
|
||||
});
|
||||
}
|
37
src/lib.rs
37
src/lib.rs
|
@ -13,9 +13,9 @@
|
|||
//!
|
||||
//! ```toml
|
||||
//! [dependencies]
|
||||
//! actix = "0.10.0-alpha.1"
|
||||
//! actix-web = "3.0.0-alpha.1"
|
||||
//! actix-webfinger = "0.3.0-alpha.2"
|
||||
//! actix-rt = "2.6.0"
|
||||
//! actix-web = "4.0.0"
|
||||
//! actix-webfinger = "0.4.0"
|
||||
//! ```
|
||||
//!
|
||||
//! Then use it in your application
|
||||
|
@ -29,7 +29,14 @@
|
|||
//! #[actix_rt::main]
|
||||
//! async fn main() -> Result<(), Box<dyn Error>> {
|
||||
//! let client = Client::default();
|
||||
//! let wf = Webfinger::fetch(&client, None, "asonix@asonix.dog", "localhost:8000", false).await?;
|
||||
//! let wf = Webfinger::fetch(
|
||||
//! &client,
|
||||
//! Some("acct:"),
|
||||
//! "asonix@localhost:8000",
|
||||
//! "localhost:8000",
|
||||
//! false,
|
||||
//! )
|
||||
//! .await?;
|
||||
//!
|
||||
//! println!("asonix's webfinger:\n{:#?}", wf);
|
||||
//! Ok(())
|
||||
|
@ -38,7 +45,7 @@
|
|||
//!
|
||||
//! #### Server Example
|
||||
//! ```rust,ignore
|
||||
//! use actix_web::{web::Data, App, HttpServer};
|
||||
//! use actix_web::{middleware::Logger, web::Data, App, HttpServer};
|
||||
//! use actix_webfinger::{Resolver, Webfinger};
|
||||
//! use std::{error::Error, future::Future, pin::Pin};
|
||||
//!
|
||||
|
@ -49,16 +56,19 @@
|
|||
//!
|
||||
//! pub struct MyResolver;
|
||||
//!
|
||||
//! type LocalBoxFuture<'a, Output> = Pin<Box<dyn Future<Output = Output> + 'a>>;
|
||||
//!
|
||||
//! impl Resolver for MyResolver {
|
||||
//! type State = Data<MyState>;
|
||||
//! type Error = actix_web::error::JsonPayloadError;
|
||||
//!
|
||||
//! fn find(
|
||||
//! scheme: Option<&str>,
|
||||
//! account: &str,
|
||||
//! domain: &str,
|
||||
//! state: S,
|
||||
//! ) -> Pin<Box<dyn Future<Output = Result<Option<Webfinger>, Self::Error>>>> {
|
||||
//! let w = if domain == state.domain {
|
||||
//! state: Data<MyState>,
|
||||
//! ) -> LocalBoxFuture<'static, Result<Option<Webfinger>, Self::Error>> {
|
||||
//! let w = if scheme == Some("acct:") && domain == state.domain {
|
||||
//! Some(Webfinger::new(&format!("{}@{}", account, domain)))
|
||||
//! } else {
|
||||
//! None
|
||||
|
@ -70,11 +80,14 @@
|
|||
//!
|
||||
//! #[actix_rt::main]
|
||||
//! async fn main() -> Result<(), Box<dyn Error>> {
|
||||
//! std::env::set_var("RUST_LOG", "info");
|
||||
//! pretty_env_logger::init();
|
||||
//! HttpServer::new(|| {
|
||||
//! App::new()
|
||||
//! .data(MyState {
|
||||
//! domain: "asonix.dog".to_owned(),
|
||||
//! })
|
||||
//! .app_data(Data::new(MyState {
|
||||
//! domain: "localhost:8000".to_owned(),
|
||||
//! }))
|
||||
//! .wrap(Logger::default())
|
||||
//! .service(actix_webfinger::resource::<MyResolver>())
|
||||
//! })
|
||||
//! .bind("127.0.0.1:8000")?
|
||||
|
@ -104,6 +117,7 @@ use actix_web::{
|
|||
web::{get, Query},
|
||||
FromRequest, HttpResponse, Resource,
|
||||
};
|
||||
#[cfg(feature = "client")]
|
||||
use awc::Client;
|
||||
use serde_derive::{Deserialize, Serialize};
|
||||
use std::{future::Future, pin::Pin};
|
||||
|
@ -622,6 +636,7 @@ impl Webfinger {
|
|||
.json(&self)
|
||||
}
|
||||
|
||||
#[cfg(feature = "client")]
|
||||
/// Fetch a webfinger with subject `user` from a given `domain`
|
||||
///
|
||||
/// This method takes a `Client` so derivative works can provide their own configured clients
|
||||
|
|
Loading…
Reference in a new issue