Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Feat/expose ssi verify sdk #47

Merged
merged 1 commit into from Feb 24, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
30 changes: 21 additions & 9 deletions demo/witness/src/lib.rs
@@ -1,16 +1,12 @@
extern crate wasm_bindgen;
extern crate log;
extern crate wasm_bindgen;
use js_sys::Promise;

use rebase_witness_sdk::types::{
issuer::ed25519::DidWebJwk,
InstructionsReq,
StatementReq,
WitnessReq,
WitnessFlow,
issuer::ed25519::DidWebJwk, InstructionsReq, StatementReq, VerifyJWTReq, VerifyRes,
WitnessFlow, WitnessReq,
};

use serde_json;
use wasm_bindgen::prelude::*;
use wasm_bindgen_futures::future_to_promise;

Expand All @@ -25,14 +21,13 @@ macro_rules! jserr {
};
}

use wee_alloc;
#[global_allocator]
static ALLOC: wee_alloc::WeeAlloc = wee_alloc::WeeAlloc::INIT;

#[derive(serde::Deserialize)]
pub struct Opts {
witness: WitnessFlow,
did: String
did: String,
}

#[wasm_bindgen]
Expand Down Expand Up @@ -67,3 +62,20 @@ pub async fn witness(secret: String, witness_request: String, opts: String) -> P
Ok(jserr!(serde_json::to_string(&res)).into())
})
}

#[wasm_bindgen]
pub async fn verify(secret: String, verify_request: String, opts: String) -> Promise {
future_to_promise(async move {
let opts: Opts = jserr!(serde_json::from_str(&opts));
let issuer = jserr!(DidWebJwk::new(&opts.did, &secret, "controller"));
let verify_request: VerifyJWTReq = jserr!(serde_json::from_str(&verify_request));
jserr!(
opts.witness
.handle_verify_jwt_req(&verify_request, &issuer)
.await
);

let res = VerifyRes { success: true };
Ok(jserr!(serde_json::to_string(&res)).into())
})
}
30 changes: 25 additions & 5 deletions demo/witness/worker/worker.js
Expand Up @@ -245,7 +245,7 @@ const opts = {
did: DID_WEB
}

const {statement, witness, instructions} = wasm_bindgen;
const {statement, witness, instructions, verify} = wasm_bindgen;
const instance = wasm_bindgen(wasm);

async function stmt(request) {
Expand All @@ -264,7 +264,7 @@ async function stmt(request) {
});
}
} catch (e) {
return new Response(JSON.stringify({ error: e?.message ?? `${e}` }), { status: 400, headers: headers});
return new Response(JSON.stringify({ error: e?.message ?? `${e}` }), {status: 400, headers: headers});
}
}

Expand All @@ -286,7 +286,7 @@ async function wtns(request) {
throw new Error(`Expected content-type application/json, got: ${contentType}`)
}
} catch (e) {
return new Response(JSON.stringify({error: e?.message ? e.message : e}), { status: 400, headers: headers});
return new Response(JSON.stringify({error: e?.message ? e.message : e}), {status: 400, headers: headers});
}
}

Expand All @@ -306,7 +306,27 @@ async function inst(request) {
throw new Error(`Expected content-type application/json, got: ${contentType}`)
}
} catch (e) {
return new Response(JSON.stringify({error: e?.message ? e.message : e}), { status: 400, headers: headers});
return new Response(JSON.stringify({error: e?.message ? e.message : e}), {status: 400, headers: headers});
}
}

async function verif(request) {
try {
await instance;
const h = request.headers;

const contentType = h.get('content-type') || '';

if (contentType.includes('application/json')) {
let body = await request.json();
const res = await verify(REBASE_SK, JSON.stringify(body), JSON.stringify(opts));

return new Response(res, {status: 200, headers: headers});
} else {
throw new Error(`Expected content-type application/json, got: ${contentType}`)
}
} catch (e) {
return new Response(JSON.stringify({error: e?.message ? e.message : e}), {status: 400, headers: headers});
}
}

Expand All @@ -315,7 +335,7 @@ async function handleRequest(request) {
r.post("/statement", (request) => stmt(request));
r.post("/witness", (request) => wtns(request));
r.post("/instructions", (request) => inst(request));
// r.post("/verify", (request) => verify(request))
r.post("/verify", (request) => verif(request))
const resp = await r.route(request);
return resp;
}
Expand Down
35 changes: 34 additions & 1 deletion js/rebase-client/src/lib.rs
Expand Up @@ -2,7 +2,7 @@ mod utils;

use rebase_witness_sdk::{
client::{Client as RebaseClient, Endpoints},
types::{InstructionsReq, StatementReq, WitnessReq},
types::{InstructionsReq, StatementReq, VerifyJWTReq, VerifyLDReq, WitnessReq},
};
// use serde_json::from_str;
use js_sys::Promise;
Expand Down Expand Up @@ -37,21 +37,34 @@ pub struct Client {
impl Client {
#[wasm_bindgen(constructor)]
pub fn new(
// TODO: Change this to an options struct
instructions: String,
statement: String,
jwt: Option<String>,
ld: Option<String>,
verify_jwt: Option<String>,
verify_ld: Option<String>,
) -> Result<Client, String> {
let jwt: Option<Url> = match jwt {
Some(s) => Some(Url::parse(&s).map_err(|e| e.to_string())?),
None => None,
};

let verify_jwt: Option<Url> = match verify_jwt {
Some(s) => Some(Url::parse(&s).map_err(|e| e.to_string())?),
None => None,
};

let ld: Option<Url> = match ld {
Some(s) => Some(Url::parse(&s).map_err(|e| e.to_string())?),
None => None,
};

let verify_ld: Option<Url> = match verify_ld {
Some(s) => Some(Url::parse(&s).map_err(|e| e.to_string())?),
None => None,
};

let statement = Url::parse(&statement).map_err(|e| e.to_string())?;
let instructions = Url::parse(&instructions).map_err(|e| e.to_string())?;
Ok(Client {
Expand All @@ -61,6 +74,8 @@ impl Client {
ld,
statement,
instructions,
verify_jwt,
verify_ld,
})
.map_err(|e| e.to_string())?,
),
Expand Down Expand Up @@ -94,6 +109,15 @@ impl Client {
})
}

pub fn verify_jwt(&self, req: String) -> Promise {
let client = self.client.clone();
future_to_promise(async move {
let req: VerifyJWTReq = jserr!(serde_json::from_str(&req));
let res = jserr!(client.verify_jwt(req).await);
Ok(jserr!(serde_json::to_string(&res)).into())
})
}

pub fn ld(&self, req: String) -> Promise {
let client = self.client.clone();
future_to_promise(async move {
Expand All @@ -102,4 +126,13 @@ impl Client {
Ok(jserr!(serde_json::to_string(&res)).into())
})
}

pub fn verify_ld(&self, req: String) -> Promise {
let client = self.client.clone();
future_to_promise(async move {
let req: VerifyLDReq = jserr!(serde_json::from_str(&req));
let res = jserr!(client.verify_ld(req).await);
Ok(jserr!(serde_json::to_string(&res)).into())
})
}
}
22 changes: 11 additions & 11 deletions rust/rebase/Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

1 change: 1 addition & 0 deletions rust/rebase/Cargo.toml
Expand Up @@ -23,6 +23,7 @@ serde = "1"
serde_json = "1"
sha3 = "0.9"
ssi = { path = "../../../ssi", default-features = false, features = ["ed25519", "secp256k1", "secp256r1"] }
# ssi = { version = "0.5", default-features = false, features = ["ed25519", "secp256k1", "secp256r1"] }

thiserror = "1"

Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/basic_post.rs
@@ -1,4 +1,4 @@
use crate::types::{error::ContentError, types::Content};
use crate::types::{defs::Content, error::ContentError};
use serde::{Deserialize, Serialize};
use serde_json::json;
use ssi::{one_or_many::OneOrMany, vc::Evidence};
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/basic_profile.rs
@@ -1,4 +1,4 @@
use crate::types::{error::ContentError, types::Content};
use crate::types::{defs::Content, error::ContentError};
use serde::{Deserialize, Serialize};
use serde_json::json;
use ssi::{one_or_many::OneOrMany, vc::Evidence};
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/dns.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use chrono::{SecondsFormat, Utc};
use schemars::JsonSchema;
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/email.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use chrono::{SecondsFormat, Utc};
use schemars::JsonSchema;
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/github.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use chrono::{SecondsFormat, Utc};
use schemars::JsonSchema;
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/nft_ownership.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use chrono::{SecondsFormat, Utc};
use schemars::JsonSchema;
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/poap_ownership.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use chrono::{SecondsFormat, Utc};
use schemars::JsonSchema;
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/reddit.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use chrono::{SecondsFormat, Utc};
use schemars::JsonSchema;
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/same.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use schemars::JsonSchema;
use serde::{Deserialize, Serialize};
Expand Down
2 changes: 1 addition & 1 deletion rust/rebase/src/content/soundcloud.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use chrono::{SecondsFormat, Utc};
use schemars::JsonSchema;
Expand Down
6 changes: 3 additions & 3 deletions rust/rebase/src/content/twitter.rs
@@ -1,7 +1,7 @@
use crate::types::{
defs::{Content, Subject},
enums::subject::Subjects,
error::ContentError,
types::{Content, Subject},
};
use chrono::{SecondsFormat, Utc};
use schemars::JsonSchema;
Expand Down Expand Up @@ -36,8 +36,8 @@ impl Content for Twitter {
"timestamp".to_string(),
serde_json::Value::String(Utc::now().to_rfc3339_opts(SecondsFormat::Millis, true)),
);
let url_vec: Vec<&str> = self.tweet_url.split("/").collect();
if url_vec.len() < 1 {
let url_vec: Vec<&str> = self.tweet_url.split('/').collect();
if url_vec.is_empty() {
return Err(ContentError::Invalid("could not find tweet id".to_owned()));
}

Expand Down