From eb6c4e633b02522d6349f125df0ee6a9b6aadfd3 Mon Sep 17 00:00:00 2001 From: madclaws Date: Mon, 30 Oct 2023 03:39:14 +0530 Subject: [PATCH 1/5] fix: test --- README.md | 5 ++++- doc_assets/ticket-2.png | Bin 0 -> 21081 bytes doc_assets/ticket-3.png | Bin 0 -> 12578 bytes 3 files changed, 4 insertions(+), 1 deletion(-) create mode 100644 doc_assets/ticket-2.png create mode 100644 doc_assets/ticket-3.png diff --git a/README.md b/README.md index fd0c560..a59824a 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,9 @@ +![ticket](doc_assets/ticket-3.png?raw=true "ticket") # ExUcan -**Decentralized Auth with [UCANs](https://ucan.xyz/)** +> Decentralized Auth with [UCANs](https://ucan.xyz/) + +**Elixir library to help the next generation of applications make use of UCANs in their authorization flows. To learn more about UCANs and how you might use them in your application, visit [https://ucan.xyz](https://ucan.xyz) or read the [spec](https://github.com/ucan-wg/spec).** ## Installation diff --git a/doc_assets/ticket-2.png b/doc_assets/ticket-2.png new file mode 100644 index 0000000000000000000000000000000000000000..cda3d348b2b7996da68a567519129cf97d87bb2e GIT binary patch literal 21081 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%0A+-~K)o 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 literal 0 HcmV?d00001 diff --git a/doc_assets/ticket-3.png b/doc_assets/ticket-3.png new file mode 100644 index 0000000000000000000000000000000000000000..eb615b0d0f1aa763f98214754402f4e8c1219b20 GIT binary patch literal 12578 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 literal 0 HcmV?d00001 From edb0a9fca753f6ec15792834605328339762bd08 Mon Sep 17 00:00:00 2001 From: madclaws Date: Mon, 30 Oct 2023 03:41:04 +0530 Subject: [PATCH 2/5] fix: cmpressed --- README.md | 2 +- doc_assets/ticket-4.png | Bin 0 -> 2502 bytes 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 doc_assets/ticket-4.png diff --git a/README.md b/README.md index a59824a..ea649f4 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -![ticket](doc_assets/ticket-3.png?raw=true "ticket") +![ticket](doc_assets/ticket-4.png?raw=true "ticket") # ExUcan > Decentralized Auth with [UCANs](https://ucan.xyz/) diff --git a/doc_assets/ticket-4.png b/doc_assets/ticket-4.png new file mode 100644 index 0000000000000000000000000000000000000000..95caaf6d9a8d2cb179a3f1bd936dfd53c5c85871 GIT binary patch literal 2502 zcmYjTdo+{@8-K?zp_$yns3v4dSW?ou%uHxl*Q{%ip%j(eSLO1~xSPr)EA5h*P+3HU zCB-||{W_FOEIWjz)@584!(84^=R4;+-}BG!_nhDJJm)#jAJ6$^xHyq8(pYH#05Ep8 z)~*16*rf7 z-6H8ISEru<7>0}OKFIe6a;|0N0f3aeoi)+z*2L1|@rhzXG(o~Y+n_dY3mjYZ9REe@ zsM33_{Pq5JFw^&e33L8|h7C>esB5Wh&i_cFms_CkaJ0A0kACdeF^Yl7f|I>x!|&cy zR2(N+n@E-~9{Z5tweNLn_uL1H<j(|HfLtK+UZE0Y4QEJL zNg{I(`0#6kc-(4eQBq2sWacOsqR!-pguRBFf|G4D+)|jZ$Re-1#4ZI|!x@yCnD80& z=jx-|euw8*bfKA!7OJhg{PK&7^JC~nm8ydodH2FHUk+q-NsWB!w{<*if1VCY=P0dP zCh30H+N7()Rt>2H(LX7Fxp9{0oxNN>bsknKKQ2E@lA`U%wco$xw>m2746l3A_ebI* zYD6R)`lpG@4G!KGIq^O6uw^mEFhFP~|neC5bP6PpO~u67sl8(_Mty`yio^^!M@SC}}otb!4?;JSRp_gd5iQNyp^P^=P2sLYV^@E&dl#WX@Gst<3%h^b1f%NJ-ON3AFa>m@~$-4%}!aQSFB z89GHiEn#X_`C^eIkU^ry?Mzxhru>Srh~!ZjU6TuMS-9ip*f|ofTQjZqed0J?Z})TI za4^Yzw!;C2E3hd3Ui+a013%B_1qXA*>Trj;{g$RrwZ2jM%j+K()s`GV6QGtLkr2To zKlsyXn?DAJtQKHI_wCPFYmc-Dst+-uMW0W9$O{_d8DA+JP9?2-!VTF0AqPX#s-6wO z#_SM-37hCRb9|h2rqVs067ryCD|&D?bi9)*a5G$~;crZYpsv&-?g%1%;}cIQh!*mw zH(me0$j*h1s_k495D*2A-Nd)GUo_nncm~A|lbMA@Fu=$C4dyobaj)gTMa1gdg1p#H zGlXAHlJpswcH9t6;S5K$GinEQvUq zi64=MV->mvNgcl0Bc}yjThLcW#K&j4L;Y6o1=;FkZ3efrxL*b<)}Sq6Y4&^ix>YKm zhTotrmud{)(bW0-1P5GP%g?TI92SP(6Sw~};6$920`cM=pD9I_!a#q@ad51%-NTg{ zJfb()3j~Xn^UwFDRQ)!?uC|Vc`R1^%Qdra8MHSN&cCmK}9#$ONXvoTvIeji6uG^## zzIf_VDZzEV6Kfc`fw!hU>B*`%PvXFyUX#Qk)?8=l;@NmQ7?L6;X?j(d|E0=8Eg_v! zvx(1`l1!GslcfvmVf#rw%k&{!mFA4bKG@FkkX{X{NM47ZAR~!>YtW2GP=Q}fwY}yc z0H1b1lI5fFV)=v{uP$J)KA=or#HE9`#j(E|(y!G;HFS)E57Q4&{ zv`78RK?9RDLlf|kE@nWIEdQOVa?z?4M$buX`_-NxHm~Ip`G>u!^RnYuf)SjgYFPbH z_F3soUeHGNhhuWHIQ%e^eIe;Ke`+(H_X?vAGJ3OB@R7yN>U#tpGzr7UQ=Gog!gf&Z`V&=2tIIME9m3zjLH=v)Frmj7&f zw&EpR%0Tw_;8Y7cXiDQV=G8jgANaUt&-{=jRC(l(*dDogi4Ha_&5o57d>GO!>8;K- ze+W%%H_KV^A=b1AQeZ?#qnxI>5VA!|#WV?y=-!k;kWd3NTzmDIHsE^vEUr1_QwL@9 zKIn!qGh#H&;(CbMC@hyp%4Jd!U)A9+wwLJ$zH$k@kK0E97uYPc3X3;|<(X{|%q7ky zvVTWpOzcZvF+0IL=WV2#5QB2TIcc;(WJXBst>jd{q}ueJbVc|c!jkWA%=-$?D#OpI zDb9brsmSbJbw<}lh-Ool(Xw+mHLn{Rk%5#W_%=$^C5jF#gARju5N47_nq0)_uz1f= zv}Glsdwh-0o=2g(Z|(zB^={^nM&4abiYfd_dnwJi>6o=8LpTenlIMF6*O2{Ezvc_F zaBuZ0>NGD;ThL}YoJD~~^-Z3HgmoEGSHpwxplySvaU9$onv0-(p>&N7u{DkIDa8dQ zh?Om0_eVC2ii&7JAUrU*U+lFkFQkzcWh;0L4C^z{>Fla%ht$?kZSt_zq8Ze$q0%N| zr#TuNkOzZvBvabh`UpJ_k+dILq8)4j{VnxG*eNgUelX)^2Iekw29!CaC-Mhs!`Djq zG^<(MGoX(UCg`e~0JhIPb|bE7qQ!e;Ol0-&g9N7FFp{{AM2inV!G~{&Fi5$TYHWHU z*iJYixQi;D@iUZ_gDa_JyiU{{|KMWys`H&6^JH5&?0^}+#mdZ7u!UePs6iEff_!>d zW46lSt63My==sk!w3>BdCF&a++f)OE>Bl{Gw%i*2-^%>g)5zX~6+SL^t7f0G{N}9e MY@DpC&X5!T1L*7400000 literal 0 HcmV?d00001 From 7c1a818ce0a1bac50aff811c235a8e0df3ac6758 Mon Sep 17 00:00:00 2001 From: madclaws Date: Mon, 30 Oct 2023 04:35:38 +0530 Subject: [PATCH 3/5] feat: init draft doc --- README.md | 211 ++++++++++++++++++++++++++++++++++++++-- doc_assets/ticket-2.png | Bin 21081 -> 0 bytes doc_assets/ticket-3.png | Bin 12578 -> 0 bytes 3 files changed, 205 insertions(+), 6 deletions(-) delete mode 100644 doc_assets/ticket-2.png delete mode 100644 doc_assets/ticket-3.png diff --git a/README.md b/README.md index ea649f4..42f4fdb 100644 --- a/README.md +++ b/README.md @@ -5,20 +5,219 @@ **Elixir library to help the next generation of applications make use of UCANs in their authorization flows. To learn more about UCANs and how you might use them in your application, visit [https://ucan.xyz](https://ucan.xyz) or read the [spec](https://github.com/ucan-wg/spec).** -## Installation +## Table of Contents + +1. [About](#about) +2. [Structure](#structure) +3. [Installation](#installation) +4. [Usage](#usage) + - [Generating UCAN](#generating-ucan) + - [Validating UCAN](#validating-ucan) + - [Adding Capabilities](#adding-capabilities) +5. [Roadmap](#roadmap) + +## About +UCANs are JWTs that contain special keys pecifically designed to enable ways of authorizing offline-first apps and distributed systems. + +At a high level, UCANs (“User Controlled Authorization Network”) are an authorization scheme ("what you can do") where users are fully in control. UCANs use [DID](https://www.w3.org/TR/did-core/#:~:text=Decentralized%20identifiers%20(DIDs)%20are%20a,the%20controller%20of%20the%20DID.)s ("Decentralized Identifiers") to identify users and services ("who you are"). + +No all-powerful authorization server or server of any kind is required for UCANs. Instead, everything a user can do is captured directly in a key or token, which can be sent to anyone who knows how to interpret the UCAN format. Because UCANs are self-contained, they are easy to consume permissionlessly, and they work well offline and in distributed systems. + +UCANs work, + +Server → Server + +Client → Server + +Peer-to-peer + +**OAuth is designed for a centralized world, UCAN is the distributed user-controlled version.** + +## Structure + +### Header + + `alg`, Algorithm, the type of signature. + + `typ`, Type, the type of this data structure, JWT. + +### Payload + + `ucv`, UCAN version. -If [available in Hex](https://hex.pm/docs/publish), the package can be installed -by adding `ex_ucan` to your list of dependencies in `mix.exs`: + `cap`, A list of resources and capabilities that the ucan grants. + + `aud`, Audience, the DID of who it's intended for. + + `exp`, Expiry, unix timestamp of when the jwt is no longer valid. + + `fct`, Facts, an array of extra facts or information to attach to the jwt. + + `nnc`, Nonce value to increase the uniqueness of UCAN token. + + `iss`, Issuer, the DID of who sent this. + + `nbf`, Not Before, unix timestamp of when the jwt becomes valid. + + `prf`, Proof, an optional nested token with equal or greater privileges. + + ### Signature + + A signature (using `alg`) of the base64 encoded header and payload concatenated together and delimited by `.` + +## Installation ```elixir def deps do [ - {:ex_ucan, "~> 0.1.0"} + {:ex_ucan, git: "https://github.com/spawnfest/youcan.git"} ] end ``` Documentation can be generated with [ExDoc](https://github.com/elixir-lang/ex_doc) -and published on [HexDocs](https://hexdocs.pm). Once published, the docs can -be found at . +and published on [HexDocs](https://hexdocs.pm). + +## Usage + +### Generating UCAN + +- Create a Keypair + +- Use Ucan builder to build the payload + +- Sign the payload with the keypair + +- encode it to JWT format + +```elixir +iex> alias ExUcan.Builder + +# receiver DID +iex> audience_did = "did:key:z6MkwDK3M4PxU1FqcSt4quXghquH1MoWXGzTrNkNWTSy2NLD" + +# Step 1: Create keypair +# default keypair generation uses EdDSA algorithm +iex> keypair = ExUcan.create_default_keypair() + +%ExUcan.Keymaterial.Ed25519.Keypair{ + jwt_alg: "EdDSA", + secret_key: <<119, 230, 103, 205, 6, 104, 32, 67, 206, 178, 128, 75, 16, + 177, 64, 44, 45, 238, 145, 226, 192, 163, 70, 36, 198, 1, 73, 61, 193, + 159, 100, 139>>, + public_key: <<253, 108, 63, 29, 71, 28, 139, 34, 170, 97, 117, 25, 179, + 124, 224, 206, 131, 150, 60, 212, 216, 168, 24, 85, 139, 119, 232, 14, + 64, 143, 2, 191>> +} +#################################################################### + +# Step 2: Use Ucan builder to build the payload +iex> ucan_payload = + Builder.default() + |> Builder.issued_by(keypair) + |> Builder.for_audience(audience_did) + |> Builder.with_lifetime(86_400) + |> Builder.build!() + +%ExUcan.Core.Structs.UcanPayload{ + ucv: "0.10.0", + iss: "did:key:z6MkmuTr3fgtBeTVmDtZZGmuHNrLwEA6b9KX4Shw1nyLioEy", + aud: "did:key:z6MkwDK3M4PxU1FqcSt4quXghquH1MoWXGzTrNkNWTSy2NLD", + nbf: nil, + exp: 1698705462, + nnc: nil, + fct: %{}, + cap: [], + prf: [] +} +####################################################################### + +# Step 3: Sign the payload with the keypair (generated in step 1) +iex> ucan = ExUcan.sign(ucan_payload, keypair) + +%ExUcan.Core.Structs.Ucan{ + header: %ExUcan.Core.Structs.UcanHeader{ + alg: "EdDSA", + typ: "JWT" + }, + payload: %ExUcan.Core.Structs.UcanPayload{ + ucv: "0.10.0", + iss: "did:key:z6MkmuTr3fgtBeTVmDtZZGmuHNrLwEA6b9KX4Shw1nyLioEy", + aud: "did:key:z6MkwDK3M4PxU1FqcSt4quXghquH1MoWXGzTrNkNWTSy2NLD", + nbf: nil, + exp: 1698705462, + nnc: nil, + fct: %{}, + cap: [], + prf: [] + }, + signed_data: "eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTg3MDU0NjIsInVjdiI6IjAuMTAuMCIsImlzcyI6ImRpZDprZXk6ejZNa211VHIzZmd0QmVUVm1EdFpaR211SE5yTHdFQTZiOUtYNFNodzFueUxpb0V5IiwiYXVkIjoiZGlkOmtleTp6Nk1rd0RLM000UHhVMUZxY1N0NHF1WGdocXVIMU1vV1hHelRyTmtOV1RTeTJOTEQiLCJuYmYiOm51bGwsIm5uYyI6bnVsbCwiZmN0Ijp7fSwiY2FwIjpbXSwicHJmIjpbXX0", + signature: "aUwyis34wQBiPhDqaFjuRwUfSHhl1ZRJLwBlyqP2dKCY1syweuSPp1CY4zgMOE-iUFr8mug7CKqxuUKk8yzkBA" +} +############################################################################# + +# Step 4: encode it to JWT format +iex> ExUcan.encode(ucan) +"eyJhbGciOiJFZERTQSIsInR5cCI6IkpXVCJ9.eyJleHAiOjE2OTg3MDU0NjIsInVjdiI6IjAuMTAuMCIsImlzcyI6ImRpZDprZXk6ejZNa211VHIzZmd0QmVUVm1EdFpaR211SE5yTHdFQTZiOUtYNFNodzFueUxpb0V5IiwiYXVkIjoiZGlkOmtleTp6Nk1rd0RLM000UHhVMUZxY1N0NHF1WGdocXVIMU1vV1hHelRyTmtOV1RTeTJOTEQiLCJuYmYiOm51bGwsIm5uYyI6bnVsbCwiZmN0Ijp7fSwiY2FwIjpbXSwicHJmIjpbXX0.aUwyis34wQBiPhDqaFjuRwUfSHhl1ZRJLwBlyqP2dKCY1syweuSPp1CY4zgMOE-iUFr8mug7CKqxuUKk8yzkBA" +``` + +### Validating UCAN + +UCANs can be validated using + +``` +ExUcan.validate_token(token) +``` + +### Adding Capabilities + +`capabilities` are an list of `resources`, the `abilities` that we can make on the `resource` with some optional `caveats`. + + +```elixir +cap = ExUcan.Core.Capability.new("example://bar", "ability/bar", %{"beep" => 1}) + +# where resource - example://bar", ability - "ability/bar" and caveat - %{"beep" => 1} +# This should be the only capability the receiver or `aud` of UCAN can do. We can add this capability in the ucan builder flow as + +iex> ucan_payload = + Builder.default() + |> Builder.issued_by(keypair) + |> Builder.for_audience(audience_did) + |> Builder.with_lifetime(86_400) + |> Builder.claiming_capability(cap) + |> Builder.build!() + +%ExUcan.Core.Structs.UcanPayload{ + ucv: "0.10.0", + iss: "did:key:z6MkmuTr3fgtBeTVmDtZZGmuHNrLwEA6b9KX4Shw1nyLioEy", + aud: "did:key:z6MkwDK3M4PxU1FqcSt4quXghquH1MoWXGzTrNkNWTSy2NLD", + nbf: nil, + exp: 1698706505, + nnc: nil, + fct: %{}, + cap: [ + %ExUcan.Core.Capability{ + resource: "example://bar", + ability: "ability/bar", + caveat: %{"beep" => 1} + } + ], + prf: [] +} +``` + +## Roadmap + +The library is no-where feature parity with ucan [rust](https://github.com/ucan-wg/rs-ucan/tree/main) library or with the spec. The spec itself is nearing a 1.0.0, and is under-review. +But good thing is we have now laid the basic foundations. The next immediate additions would be, + +- [] - Proof encodings as CID (Content Addressable Data) +- [] - Delegation semantics +- [] - Verifying UCAN invocations + + +## Acknowledgement + +This library has taken reference from both [ts-ucan](https://github.com/ucan-wg/ts-ucan) and rs-ucan. diff --git a/doc_assets/ticket-2.png b/doc_assets/ticket-2.png deleted file mode 100644 index cda3d348b2b7996da68a567519129cf97d87bb2e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 21081 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%0A+-~K)o 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 diff --git a/doc_assets/ticket-3.png b/doc_assets/ticket-3.png deleted file mode 100644 index eb615b0d0f1aa763f98214754402f4e8c1219b20..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 12578 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 From b5113ab9ae4da2a397ba5c65a34d40b0d10a566e Mon Sep 17 00:00:00 2001 From: madclaws Date: Mon, 30 Oct 2023 04:36:51 +0530 Subject: [PATCH 4/5] fix: minor --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 42f4fdb..5929c3e 100644 --- a/README.md +++ b/README.md @@ -212,9 +212,9 @@ iex> ucan_payload = The library is no-where feature parity with ucan [rust](https://github.com/ucan-wg/rs-ucan/tree/main) library or with the spec. The spec itself is nearing a 1.0.0, and is under-review. But good thing is we have now laid the basic foundations. The next immediate additions would be, -- [] - Proof encodings as CID (Content Addressable Data) -- [] - Delegation semantics -- [] - Verifying UCAN invocations +- [ ] - Proof encodings as CID (Content Addressable Data) +- [ ] - Delegation semantics +- [ ] - Verifying UCAN invocations ## Acknowledgement From 590cd56c19b3d694b8de79abf7f38b9e2193d45c Mon Sep 17 00:00:00 2001 From: madclaws Date: Mon, 30 Oct 2023 05:01:14 +0530 Subject: [PATCH 5/5] feat: final refactor it seems --- README.md | 13 ++++++---- lib/ex_ucan/builder.ex | 17 ------------- lib/ex_ucan/core/capability/data.ex | 37 ++++++++++++++++++----------- lib/ex_ucan/core/structs.ex | 28 ++++++++++++++++++++-- lib/ex_ucan/core/token.ex | 2 +- test/capability_test.exs | 25 ------------------- 6 files changed, 58 insertions(+), 64 deletions(-) diff --git a/README.md b/README.md index 5929c3e..db05031 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,5 @@ ![ticket](doc_assets/ticket-4.png?raw=true "ticket") + # ExUcan > Decentralized Auth with [UCANs](https://ucan.xyz/) @@ -171,7 +172,7 @@ ExUcan.validate_token(token) ### Adding Capabilities -`capabilities` are an list of `resources`, the `abilities` that we can make on the `resource` with some optional `caveats`. +`capabilities` are a list of `resources`, and the `abilities` that we can make on the `resource` with some optional `caveats`. ```elixir @@ -212,12 +213,14 @@ iex> ucan_payload = The library is no-where feature parity with ucan [rust](https://github.com/ucan-wg/rs-ucan/tree/main) library or with the spec. The spec itself is nearing a 1.0.0, and is under-review. But good thing is we have now laid the basic foundations. The next immediate additions would be, -- [ ] - Proof encodings as CID (Content Addressable Data) -- [ ] - Delegation semantics -- [ ] - Verifying UCAN invocations +- [ ] Proof encodings as CID (Content Addressable Data) +- [ ] Delegation semantics +- [ ] Verifying UCAN invocations ## Acknowledgement -This library has taken reference from both [ts-ucan](https://github.com/ucan-wg/ts-ucan) and rs-ucan. +- This library has taken reference from both [ts-ucan](https://github.com/ucan-wg/ts-ucan) and rs-ucan. + +- ExUcan logo - Validating ticket icons created by Good Ware - Flaticon diff --git a/lib/ex_ucan/builder.ex b/lib/ex_ucan/builder.ex index 5ca2b76..ee53feb 100644 --- a/lib/ex_ucan/builder.ex +++ b/lib/ex_ucan/builder.ex @@ -116,19 +116,6 @@ defmodule ExUcan.Builder do %{builder | add_nonce?: true} end - # TODO: try to do this function - @doc """ - Includes a UCAN in the list of proofs for the UCAN to be built. - Note that the proof's audience must match this UCAN's issuer - or else the proof chain will be invalidated! - The proof is encoded into a [Cid], hashed via the [UcanBuilder::default_hasher()] - algorithm, unless one is provided. - """ - @spec witnessed_by(__MODULE__.t()) :: __MODULE__.t() - def witnessed_by(builder) do - builder - end - @doc """ Claim a capability by inheritance (from an authorizing proof) or implicitly by ownership of the resource by this UCAN's issuer @@ -138,10 +125,6 @@ defmodule ExUcan.Builder do %{builder | capabilities: builder.capabilities ++ [capability]} end - def delegating_from(builder) do - builder - end - @doc """ Builds the UCAN `payload` from the `Builder` workflow diff --git a/lib/ex_ucan/core/capability/data.ex b/lib/ex_ucan/core/capability/data.ex index 241e4f7..15fbd0e 100644 --- a/lib/ex_ucan/core/capability/data.ex +++ b/lib/ex_ucan/core/capability/data.ex @@ -1,5 +1,8 @@ defmodule ExUcan.Core.Capability do - # TODO: All the docs needed + @moduledoc """ + Capabilities are a list of `resources`, and the `abilities` that we + can make on the `resource` with some optional `caveats`. + """ @type t :: %__MODULE__{ resource: String.t(), ability: String.t(), @@ -7,6 +10,11 @@ defmodule ExUcan.Core.Capability do } defstruct [:resource, :ability, :caveat] + @doc """ + Creates a new capability with given resource, ability and caveat + + See `/test/capability_test.exs` + """ @spec new(String.t(), String.t(), list()) :: __MODULE__.t() def new(resource, ability, caveat) do %__MODULE__{ @@ -19,23 +27,19 @@ end defmodule ExUcan.Core.Capabilities do @moduledoc """ - Capabilities always deals with capabilites as map of maps - map> - """ - alias ExUcan.Core.Capability - # TODO: All the docs needed + Handling conversions of different type of group of capabilities - # def validate(capabilities) when is_map(capabilities) do - # capabilities - # |> Enum.reduce_while(%{}, fn {resource, ability}, caps -> - # # ability should be map - # # iter through ability + `Capabilities` are always maps of maps - # end) - # end + type reference - map> + """ + alias ExUcan.Core.Capability - def validate(_), do: {:error, "Capabilities must be an object."} + @doc """ + Convert capabilites represented in maps to list of capabilites + See `/test/capability_test.exs` + """ @spec map_to_sequence(map()) :: list(Capability.t()) def map_to_sequence(capabilities) do capabilities @@ -45,6 +49,11 @@ defmodule ExUcan.Core.Capabilities do end) end + @doc """ + Convert capabilites represented as list of capabilities to maps of maps + + See `/test/capability_test.exs` + """ @spec sequence_to_map(list(Capability.t())) :: map() def sequence_to_map(capabilites) do capabilites diff --git a/lib/ex_ucan/core/structs.ex b/lib/ex_ucan/core/structs.ex index 9e94b7c..3738a3d 100644 --- a/lib/ex_ucan/core/structs.ex +++ b/lib/ex_ucan/core/structs.ex @@ -1,6 +1,11 @@ defmodule ExUcan.Core.Structs.UcanHeader do @moduledoc """ - Ucan header + Ucan header representation + """ + + @typedoc """ + alg - Algorithm used (ex EdDSA) + typ - Type of token format (ex JWT) """ @type t :: %__MODULE__{ alg: String.t(), @@ -13,10 +18,23 @@ end defmodule ExUcan.Core.Structs.UcanPayload do @moduledoc """ - Ucan Payload + Ucan Payload representation """ alias ExUcan.Core.Capability + @typedoc """ + + ucv: UCAN version. + iss: Issuer, the DID of who sent this. + aud: Audience, the DID of who it's intended for. + nbf: Not Before, unix timestamp of when the jwt becomes valid. + exp: Expiry, unix timestamp of when the jwt is no longer valid. + nnc: Nonce value to increase the uniqueness of UCAN token. + fct: Facts, an array of extra facts or information to attach to the jwt. + cap: A list of resources and capabilities that the ucan grants. + prf: Proof, an optional nested token with equal or greater privileges. + + """ @type t :: %__MODULE__{ ucv: String.t(), iss: String.t(), @@ -40,6 +58,12 @@ defmodule ExUcan.Core.Structs.Ucan do alias ExUcan.Core.Structs.UcanHeader alias ExUcan.Core.Structs.UcanPayload + @typedoc """ + header - Token Header + payload - Token payload + signed_data - Data that would be eventually signed + signature - Base64Url encoded signature + """ @type t :: %__MODULE__{ header: UcanHeader.t(), payload: UcanPayload.t(), diff --git a/lib/ex_ucan/core/token.ex b/lib/ex_ucan/core/token.ex index 3e8cc94..6d5d21c 100644 --- a/lib/ex_ucan/core/token.ex +++ b/lib/ex_ucan/core/token.ex @@ -1,6 +1,6 @@ defmodule ExUcan.Core.Token do @moduledoc """ - Creates and manages UCAN tokens + Core functions for the creation and management of UCAN tokens """ alias ExUcan.Builder alias ExUcan.Core.Structs.Ucan diff --git a/test/capability_test.exs b/test/capability_test.exs index 5aa7841..aa72cf3 100644 --- a/test/capability_test.exs +++ b/test/capability_test.exs @@ -14,29 +14,4 @@ defmodule CapabilityTest do cap_maps = Capabilities.sequence_to_map(cap_sequence) assert Capabilities.map_to_sequence(cap_maps) == cap_sequence end - - test "it_rejects_non_compliant_json" do - failure_cases = [ - { - [], - "resources must be map" - }, - { - %{"resource:foo" => []}, - "abilities must be map" - }, - { - %{"resource:foo" => {}}, - "resource must have at least one ability" - }, - { - %{"resource:foo" => %{"ability/read" => %{}}}, - "caveats must be a list" - }, - { - %{"resource:foo" => %{"ability/read" => [1]}}, - "caveat must be object" - } - ] - end end