diff --git a/Cargo.lock b/Cargo.lock index 9d0e7cf..38b9d8b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -124,7 +124,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 2.0.117", ] [[package]] @@ -155,6 +155,17 @@ dependencies = [ "tokio", ] +[[package]] +name = "async-trait" +version = "0.1.91" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ae36dc4177970ef04fde5178d3e2429882def40e57a451f919c098f72baa6cec" +dependencies = [ + "proc-macro2", + "quote", + "syn 3.0.3", +] + [[package]] name = "atomic-polyfill" version = "1.0.3" @@ -198,6 +209,12 @@ dependencies = [ "fs_extra", ] +[[package]] +name = "base16ct" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd307490d624467aa6f74b0eabb77633d1f758a7b25f12bceb0b22e08d9726f6" + [[package]] name = "base32" version = "0.5.1" @@ -439,7 +456,7 @@ dependencies = [ "heck 0.5.0", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -637,12 +654,12 @@ dependencies = [ [[package]] name = "curve25519-dalek" -version = "5.0.0-pre.6" +version = "5.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335f1947f241137a14106b6f5acc5918a5ede29c9d71d3f2cb1678d5075d9fc3" +checksum = "b5eed333089e2e1c1ac8c6c0398e5e2497b4c9926ca6d0365ed1e099afa5bc23" dependencies = [ "cfg-if", - "cpufeatures 0.2.17", + "cpufeatures 0.3.0", "curve25519-dalek-derive", "digest 0.11.3", "fiat-crypto", @@ -659,7 +676,7 @@ checksum = "f46882e17999c6cc590af592290432be3bce0428cb0d5f8b6715e4dc7b383eb3" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -716,7 +733,7 @@ checksum = "97369cbbc041bc366949bc74d34658d6cda5621039731c6310521892a3a20ae0" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -751,20 +768,20 @@ checksum = "d0881ea181b1df73ff77ffaaf9c7544ecc11e82fba9b5f27b262a3c73a332555" [[package]] name = "ed25519" -version = "3.0.0-rc.4" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c6e914c7c52decb085cea910552e24c63ac019e3ab8bf001ff736da9a9d9d890" +checksum = "29fcf32e6c73d1079f83ab4d782de2d81620346a5f38c6237a86a22f8368980a" dependencies = [ "pkcs8", - "serde", + "serdect", "signature", ] [[package]] name = "ed25519-dalek" -version = "3.0.0-pre.6" +version = "3.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "053618a4c3d3bc24f188aa660ae75a46eeab74ef07fb415c61431e5e7cd4749b" +checksum = "6ebaa1a2bf1290ab3bfe5a7b771d050ebffab2711c19a81691c683a5144a25de" dependencies = [ "curve25519-dalek", "ed25519", @@ -935,7 +952,7 @@ checksum = "162ee34ebcb7c64a8abebc059ce0fee27c2262618d7b60ed8faf72fef13c3650" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1394,7 +1411,7 @@ checksum = "1ec89e9337638ecdc08744df490b221a7399bf8d164eb52a665454e60e075ad6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1490,7 +1507,7 @@ dependencies = [ "quote", "rustc_version", "simd_cesu8", - "syn", + "syn 2.0.117", ] [[package]] @@ -1509,7 +1526,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "38c0b942f458fe50cdac086d2f946512305e5631e720728f2a61aabcd47a6264" dependencies = [ "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1612,9 +1629,9 @@ checksum = "7f66e8d5d03f609abc3a39e6f08e4164ebf1447a732906d39eb9b99b7919ef39" [[package]] name = "mainline" -version = "6.2.0" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "25fd96e1eb0cff23f7048801d1561336c2e3c9f2b468d0271f27ad3463f583bf" +checksum = "6dfad9601b9117218868271c05403853593d4817e7abeab5c95e11eee16382bb" dependencies = [ "crc", "document-features", @@ -1849,7 +1866,7 @@ dependencies = [ "phf_shared", "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -1875,9 +1892,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184" [[package]] name = "pkarr" -version = "6.0.1" +version = "7.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "51c6a54ffd41eaecab1c5736251f48f229638430939fcf1e02a22ddc632471be" +checksum = "0b8d06aecdd0cb2166c14af7abf72a8e2f125e04071bbed81b69c9b802c2a50a" dependencies = [ "async-compat", "base32", @@ -1886,7 +1903,6 @@ dependencies = [ "cfg_aliases", "document-features", "dyn-clone", - "ed25519", "ed25519-dalek", "futures-buffered", "futures-lite", @@ -1898,7 +1914,6 @@ dependencies = [ "mainline", "ntimestamp", "page_size", - "pkcs8", "reqwest 0.13.4", "rustls", "rustls-webpki", @@ -1910,14 +1925,13 @@ dependencies = [ "tokio", "tracing", "url", - "wasm-bindgen-futures", ] [[package]] name = "pkcs8" -version = "0.11.0-rc.11" +version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12922b6296c06eb741b02d7b5161e3aaa22864af38dfa025a1a3ba3f68c84577" +checksum = "451913da69c775a56034ea8d9003d27ee8948e12443eae7c038ba100a4f21cb7" dependencies = [ "der", "spki", @@ -1975,7 +1989,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "479ca8adacdd7ce8f1fb39ce9ecccbfe93a3f1344b3d0d97f20bc0196208f62b" dependencies = [ "proc-macro2", - "syn", + "syn 2.0.117", ] [[package]] @@ -1995,10 +2009,11 @@ checksum = "33cb294fe86a74cbcf50d4445b37da762029549ebeea341421c7c70370f86cac" [[package]] name = "pubky" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3dabfa82f58ad04e2b65fcecc02ca953dec608533dfa820b03ee174b2593e8af" +checksum = "773c09666db817b1d2cf13866e053b790e95ec99c78385b86fa848d23bb36e70" dependencies = [ + "async-trait", "base64", "cookie", "eventsource-stream", @@ -2007,10 +2022,13 @@ dependencies = [ "futures-util", "httpdate", "log", + "percent-encoding", "pkarr", "pubky-common", "reqwest 0.13.4", "rustls", + "serde", + "serde_json", "thiserror 2.0.18", "tokio", "tracing", @@ -2022,22 +2040,22 @@ dependencies = [ [[package]] name = "pubky-common" -version = "0.9.3" +version = "0.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a7115f4177712ffb1d261e93a9a4992ef12da80c4b70decb1395bf8ac919c24c" +checksum = "e772ea228e1d7be7590c7a15ce975605df30e257ddeb272be8d6c0c23c98f57c" dependencies = [ "argon2", - "base32", + "base64", "blake3", "crypto_secretbox", "ed25519-dalek", - "js-sys", - "once_cell", + "percent-encoding", "pkarr", "postcard", "pubky-timestamp", "rand 0.10.1", "serde", + "serde_json", "thiserror 2.0.18", "url", ] @@ -2059,7 +2077,7 @@ dependencies = [ [[package]] name = "pubkycore" -version = "0.3.1" +version = "0.4.0" dependencies = [ "base64", "bip39", @@ -2560,7 +2578,7 @@ checksum = "1db149f81d46d2deba7cd3c50772474707729550221e69588478ebf9ada425ae" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2648,7 +2666,7 @@ checksum = "d540f220d3187173da220f885ab66608367b6574e925011a9353e4badda91d79" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2675,6 +2693,16 @@ dependencies = [ "serde", ] +[[package]] +name = "serdect" +version = "0.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "66cf8fedced2fcf12406bcb34223dffb92eaf34908ede12fed414c82b7f00b3e" +dependencies = [ + "base16ct", + "serde", +] + [[package]] name = "sha1_smol" version = "1.0.1" @@ -2865,6 +2893,17 @@ dependencies = [ "unicode-ident", ] +[[package]] +name = "syn" +version = "3.0.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "53e9bae58849f64dfa4f5d5ae372c8341f7305f82a3868709269343628b659a3" +dependencies = [ + "proc-macro2", + "quote", + "unicode-ident", +] + [[package]] name = "sync_wrapper" version = "1.0.2" @@ -2891,7 +2930,7 @@ checksum = "c8af7666ab7b6390ab78131fb5b0fce11d6b7a6951602017c35fa82800708971" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2920,7 +2959,7 @@ checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -2931,7 +2970,7 @@ checksum = "ebc4ee7f67670e9b64d05fa4253e753e016c6c95ff35b89b7941d6b856dec1d5" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3025,7 +3064,7 @@ checksum = "385a6cb71ab9ab790c5fe8d67f1645e6c450a7ce006a33de03daa956cf70a496" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3124,7 +3163,7 @@ checksum = "7490cfa5ec963746568740651ac6781f701c9c5ea257c58e057f3ba8cf69e8da" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3261,7 +3300,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55137c122f712d9330fd985d66fa61bdc381752e89c35708c13ce63049a3002c" dependencies = [ "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -3293,7 +3332,7 @@ dependencies = [ "proc-macro2", "quote", "serde", - "syn", + "syn 2.0.117", "toml", "uniffi_build", "uniffi_meta", @@ -3488,7 +3527,7 @@ dependencies = [ "bumpalo", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wasm-bindgen-shared", ] @@ -3942,7 +3981,7 @@ dependencies = [ "heck 0.5.0", "indexmap", "prettyplease", - "syn", + "syn 2.0.117", "wasm-metadata", "wit-bindgen-core", "wit-component", @@ -3958,7 +3997,7 @@ dependencies = [ "prettyplease", "proc-macro2", "quote", - "syn", + "syn 2.0.117", "wit-bindgen-core", "wit-bindgen-rust", ] @@ -4032,7 +4071,7 @@ checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] @@ -4053,7 +4092,7 @@ checksum = "a996a8f63c5c4448cd959ac1bab0aaa3306ccfd060472f85943ee0750f0169be" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] [[package]] @@ -4073,7 +4112,7 @@ checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", "synstructure", ] @@ -4102,5 +4141,5 @@ checksum = "6eafa6dfb17584ea3e2bd6e76e0cc15ad7af12b09abdd1ca55961bed9b1063c6" dependencies = [ "proc-macro2", "quote", - "syn", + "syn 2.0.117", ] diff --git a/Cargo.toml b/Cargo.toml index eb72d8a..03c61a1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "pubkycore" -version = "0.3.1" +version = "0.4.0" edition = "2021" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html @@ -19,7 +19,7 @@ url = "2.5.2" base64 = "0.22.1" once_cell = "1.19.0" reqwest = { version = "0.12.0", default-features = false, features = ["rustls-tls"] } -pubky = "0.9.3" +pubky = "0.10.0" bip39 = { version = "2.2.0", features = ["rand"] } # Android-only: pkarr's relay HTTP client (via reqwest 0.13's `rustls` feature) uses diff --git a/README.md b/README.md index e2a02ac..fca91b5 100644 --- a/README.md +++ b/README.md @@ -11,7 +11,7 @@ coordinating a migration across those apps. - **Public keys are always bare z-base32** (52 chars, no prefix) in every output: `public_key` fields, the session `pubky` field, `get_homeserver`, and the `publish`/`publish_https` return values. The underlying - `pubky` crate (0.9.x) renders `PublicKey::to_string()` as + `pubky` crate (0.10.x) renders `PublicKey::to_string()` as `pubky`, so all output sites must use `.z32()` instead — pubky's own storage URL parser rejects `pubky://pubky/...`, and downstream apps build `pubky:///...` URLs from these values. Inputs accept either form. @@ -22,8 +22,20 @@ coordinating a migration across those apps. `kind` (`"signin"` or `"signup"`; legacy `pubkyauth:///?...` URLs are `"signin"`) and, for signup links, optional `homeserver` (bare z32) and `signup_token` fields. -- **Session secrets** are `:`, compatible in both - directions with sessions created on pubky 0.6.0-rc.6. +- **Authentication mirrors pubky 0.10.** Grant auth is exposed through + `sign_up_grant`, `sign_in_grant`, `start_grant_auth_flow`, and + `await_grant_auth_approval`; these return `grant_secret` in session JSON. + The unqualified `sign_up`, `sign_in`, `start_auth_flow`, and + `await_auth_approval` names are Grant aliases for downstream migration. +- **Legacy cookie auth remains available** through `sign_up_cookie`, + `sign_in_cookie`, `start_cookie_auth_flow`, and + `await_cookie_auth_approval`; these return `session_secret` in session JSON. + Cookie auth is deprecated upstream, but it is still exposed here because this + crate is a low-level binding layer. +- **Session-token APIs accept either strategy.** `sign_out`, + `revalidate_session`, `put_with_session`, and `delete_with_session` call + `Pubky::restore_session`, so they accept a Grant `grant_secret` or a legacy + cookie `session_secret`. ## Building the SDK @@ -450,4 +462,4 @@ try switchNetwork(useTestnet: false) // For default // Android switchNetwork(true) // For testnet switchNetwork(false) // For default -``` \ No newline at end of file +``` diff --git a/bindings/android/jniLibs/arm64-v8a/libpubkycore.so b/bindings/android/jniLibs/arm64-v8a/libpubkycore.so index d55e4ce..e110d1c 100755 Binary files a/bindings/android/jniLibs/arm64-v8a/libpubkycore.so and b/bindings/android/jniLibs/arm64-v8a/libpubkycore.so differ diff --git a/bindings/android/jniLibs/armeabi-v7a/libpubkycore.so b/bindings/android/jniLibs/armeabi-v7a/libpubkycore.so index 3ac422f..8c43c03 100755 Binary files a/bindings/android/jniLibs/armeabi-v7a/libpubkycore.so and b/bindings/android/jniLibs/armeabi-v7a/libpubkycore.so differ diff --git a/bindings/android/jniLibs/x86/libpubkycore.so b/bindings/android/jniLibs/x86/libpubkycore.so index 66d10bb..7665fb3 100755 Binary files a/bindings/android/jniLibs/x86/libpubkycore.so and b/bindings/android/jniLibs/x86/libpubkycore.so differ diff --git a/bindings/android/jniLibs/x86_64/libpubkycore.so b/bindings/android/jniLibs/x86_64/libpubkycore.so index 06144f5..be2480d 100755 Binary files a/bindings/android/jniLibs/x86_64/libpubkycore.so and b/bindings/android/jniLibs/x86_64/libpubkycore.so differ diff --git a/bindings/android/pubkycore.kt b/bindings/android/pubkycore.kt index 3be78d8..c85bcc2 100644 --- a/bindings/android/pubkycore.kt +++ b/bindings/android/pubkycore.kt @@ -386,81 +386,99 @@ internal interface _UniFFILib : Library { } } - fun uniffi_pubkycore_fn_free_eventnotifier(`ptr`: Pointer,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_free_eventnotifier(`ptr`: Pointer,_uniffi_out_err: RustCallStatus, ): Unit - fun uniffi_pubkycore_fn_init_callback_eventlistener(`callbackStub`: ForeignCallback,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_init_callback_eventlistener(`callbackStub`: ForeignCallback,_uniffi_out_err: RustCallStatus, ): Unit - fun uniffi_pubkycore_fn_func_auth(`url`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_auth(`url`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_await_auth_approval(_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_await_auth_approval(_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_create_recovery_file(`secretKey`: RustBuffer.ByValue,`passphrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_await_cookie_auth_approval(_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_decrypt_recovery_file(`recoveryFile`: RustBuffer.ByValue,`passphrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_await_grant_auth_approval(_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_delete_file(`url`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_create_recovery_file(`secretKey`: RustBuffer.ByValue,`passphrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_delete_with_session(`url`: RustBuffer.ByValue,`sessionSecret`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_decrypt_recovery_file(`recoveryFile`: RustBuffer.ByValue,`passphrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_generate_mnemonic_phrase(_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_delete_file(`url`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_generate_mnemonic_phrase_and_keypair(_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_delete_with_session(`url`: RustBuffer.ByValue,`sessionSecret`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_generate_secret_key(_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_generate_mnemonic_phrase(_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_get(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_generate_mnemonic_phrase_and_keypair(_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_get_homeserver(`pubky`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_generate_secret_key(_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_get_public_key_from_secret_key(`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_get(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_get_signup_token(`homeserverPubky`: RustBuffer.ByValue,`adminPassword`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_get_homeserver(`pubky`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_list(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_get_public_key_from_secret_key(`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_mnemonic_phrase_to_keypair(`mnemonicPhrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_get_signup_token(`homeserverPubky`: RustBuffer.ByValue,`adminPassword`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_parse_auth_url(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_list(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_publish(`recordName`: RustBuffer.ByValue,`recordContent`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_mnemonic_phrase_to_keypair(`mnemonicPhrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_publish_https(`recordName`: RustBuffer.ByValue,`target`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_parse_auth_url(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_put(`url`: RustBuffer.ByValue,`content`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_parse_deep_link(`url`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_put_with_session(`url`: RustBuffer.ByValue,`content`: RustBuffer.ByValue,`sessionSecret`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_publish(`recordName`: RustBuffer.ByValue,`recordContent`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_remove_event_listener(_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_publish_https(`recordName`: RustBuffer.ByValue,`target`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun uniffi_pubkycore_fn_func_put(`url`: RustBuffer.ByValue,`content`: RustBuffer.ByValue,`secretKey`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun uniffi_pubkycore_fn_func_put_with_session(`url`: RustBuffer.ByValue,`content`: RustBuffer.ByValue,`sessionSecret`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun uniffi_pubkycore_fn_func_remove_event_listener(_uniffi_out_err: RustCallStatus, ): Unit - fun uniffi_pubkycore_fn_func_republish_homeserver(`secretKey`: RustBuffer.ByValue,`homeserver`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_republish_homeserver(`secretKey`: RustBuffer.ByValue,`homeserver`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_resolve(`publicKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_resolve(`publicKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_resolve_https(`publicKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_resolve_https(`publicKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_revalidate_session(`sessionSecret`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_revalidate_session(`sessionSecret`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_set_event_listener(`listener`: Long,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_set_event_listener(`listener`: Long,_uniffi_out_err: RustCallStatus, ): Unit - fun uniffi_pubkycore_fn_func_sign_in(`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_sign_in(`secretKey`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun uniffi_pubkycore_fn_func_sign_in_cookie(`secretKey`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun uniffi_pubkycore_fn_func_sign_in_grant(`secretKey`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun uniffi_pubkycore_fn_func_sign_out(`sessionSecret`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun uniffi_pubkycore_fn_func_sign_up(`secretKey`: RustBuffer.ByValue,`homeserver`: RustBuffer.ByValue,`signupToken`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_sign_out(`sessionSecret`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_sign_up_cookie(`secretKey`: RustBuffer.ByValue,`homeserver`: RustBuffer.ByValue,`signupToken`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_sign_up(`secretKey`: RustBuffer.ByValue,`homeserver`: RustBuffer.ByValue,`signupToken`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_sign_up_grant(`secretKey`: RustBuffer.ByValue,`homeserver`: RustBuffer.ByValue,`signupToken`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_start_auth_flow(`capabilitiesStr`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_start_auth_flow(`capabilitiesStr`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_switch_network(`useTestnet`: Byte,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_start_cookie_auth_flow(`capabilitiesStr`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun uniffi_pubkycore_fn_func_validate_mnemonic_phrase(`mnemonicPhrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_start_grant_auth_flow(`capabilitiesStr`: RustBuffer.ByValue,`clientId`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun ffi_pubkycore_rustbuffer_alloc(`size`: Int,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_switch_network(`useTestnet`: Byte,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun ffi_pubkycore_rustbuffer_from_bytes(`bytes`: ForeignBytes.ByValue,_uniffi_out_err: RustCallStatus, + fun uniffi_pubkycore_fn_func_validate_mnemonic_phrase(`mnemonicPhrase`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue - fun ffi_pubkycore_rustbuffer_free(`buf`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rustbuffer_alloc(`size`: Int,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun ffi_pubkycore_rustbuffer_from_bytes(`bytes`: ForeignBytes.ByValue,_uniffi_out_err: RustCallStatus, + ): RustBuffer.ByValue + fun ffi_pubkycore_rustbuffer_free(`buf`: RustBuffer.ByValue,_uniffi_out_err: RustCallStatus, ): Unit - fun ffi_pubkycore_rustbuffer_reserve(`buf`: RustBuffer.ByValue,`additional`: Int,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rustbuffer_reserve(`buf`: RustBuffer.ByValue,`additional`: Int,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue fun ffi_pubkycore_rust_future_continuation_callback_set(`callback`: UniFffiRustFutureContinuationCallbackType, ): Unit @@ -470,7 +488,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_u8(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_u8(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_u8(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Byte fun ffi_pubkycore_rust_future_poll_i8(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -478,7 +496,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_i8(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_i8(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_i8(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Byte fun ffi_pubkycore_rust_future_poll_u16(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -486,7 +504,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_u16(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_u16(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_u16(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Short fun ffi_pubkycore_rust_future_poll_i16(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -494,7 +512,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_i16(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_i16(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_i16(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Short fun ffi_pubkycore_rust_future_poll_u32(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -502,7 +520,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_u32(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_u32(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_u32(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Int fun ffi_pubkycore_rust_future_poll_i32(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -510,7 +528,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_i32(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_i32(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_i32(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Int fun ffi_pubkycore_rust_future_poll_u64(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -518,7 +536,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_u64(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_u64(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_u64(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Long fun ffi_pubkycore_rust_future_poll_i64(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -526,7 +544,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_i64(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_i64(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_i64(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Long fun ffi_pubkycore_rust_future_poll_f32(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -534,7 +552,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_f32(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_f32(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_f32(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Float fun ffi_pubkycore_rust_future_poll_f64(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -542,7 +560,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_f64(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_f64(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_f64(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Double fun ffi_pubkycore_rust_future_poll_pointer(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -550,7 +568,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_pointer(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_pointer(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_pointer(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Pointer fun ffi_pubkycore_rust_future_poll_rust_buffer(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -558,7 +576,7 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_rust_buffer(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_rust_buffer(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_rust_buffer(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): RustBuffer.ByValue fun ffi_pubkycore_rust_future_poll_void(`handle`: Pointer,`uniffiCallback`: USize, ): Unit @@ -566,12 +584,16 @@ internal interface _UniFFILib : Library { ): Unit fun ffi_pubkycore_rust_future_free_void(`handle`: Pointer, ): Unit - fun ffi_pubkycore_rust_future_complete_void(`handle`: Pointer,_uniffi_out_err: RustCallStatus, + fun ffi_pubkycore_rust_future_complete_void(`handle`: Pointer,_uniffi_out_err: RustCallStatus, ): Unit fun uniffi_pubkycore_checksum_func_auth( ): Short fun uniffi_pubkycore_checksum_func_await_auth_approval( ): Short + fun uniffi_pubkycore_checksum_func_await_cookie_auth_approval( + ): Short + fun uniffi_pubkycore_checksum_func_await_grant_auth_approval( + ): Short fun uniffi_pubkycore_checksum_func_create_recovery_file( ): Short fun uniffi_pubkycore_checksum_func_decrypt_recovery_file( @@ -600,6 +622,8 @@ internal interface _UniFFILib : Library { ): Short fun uniffi_pubkycore_checksum_func_parse_auth_url( ): Short + fun uniffi_pubkycore_checksum_func_parse_deep_link( + ): Short fun uniffi_pubkycore_checksum_func_publish( ): Short fun uniffi_pubkycore_checksum_func_publish_https( @@ -622,12 +646,24 @@ internal interface _UniFFILib : Library { ): Short fun uniffi_pubkycore_checksum_func_sign_in( ): Short + fun uniffi_pubkycore_checksum_func_sign_in_cookie( + ): Short + fun uniffi_pubkycore_checksum_func_sign_in_grant( + ): Short fun uniffi_pubkycore_checksum_func_sign_out( ): Short fun uniffi_pubkycore_checksum_func_sign_up( ): Short + fun uniffi_pubkycore_checksum_func_sign_up_cookie( + ): Short + fun uniffi_pubkycore_checksum_func_sign_up_grant( + ): Short fun uniffi_pubkycore_checksum_func_start_auth_flow( ): Short + fun uniffi_pubkycore_checksum_func_start_cookie_auth_flow( + ): Short + fun uniffi_pubkycore_checksum_func_start_grant_auth_flow( + ): Short fun uniffi_pubkycore_checksum_func_switch_network( ): Short fun uniffi_pubkycore_checksum_func_validate_mnemonic_phrase( @@ -636,7 +672,7 @@ internal interface _UniFFILib : Library { ): Short fun ffi_pubkycore_uniffi_contract_version( ): Int - + } private fun uniffiCheckContractApiVersion(lib: _UniFFILib) { @@ -657,13 +693,19 @@ private fun uniffiCheckApiChecksums(lib: _UniFFILib) { if (lib.uniffi_pubkycore_checksum_func_await_auth_approval() != 56488.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_pubkycore_checksum_func_await_cookie_auth_approval() != 44552.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_pubkycore_checksum_func_await_grant_auth_approval() != 15252.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_pubkycore_checksum_func_create_recovery_file() != 48846.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_pubkycore_checksum_func_decrypt_recovery_file() != 26407.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_pubkycore_checksum_func_delete_file() != 47931.toShort()) { + if (lib.uniffi_pubkycore_checksum_func_delete_file() != 43485.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_pubkycore_checksum_func_delete_with_session() != 26332.toShort()) { @@ -699,13 +741,16 @@ private fun uniffiCheckApiChecksums(lib: _UniFFILib) { if (lib.uniffi_pubkycore_checksum_func_parse_auth_url() != 27379.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } + if (lib.uniffi_pubkycore_checksum_func_parse_deep_link() != 29971.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } if (lib.uniffi_pubkycore_checksum_func_publish() != 48989.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_pubkycore_checksum_func_publish_https() != 5614.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_pubkycore_checksum_func_put() != 64514.toShort()) { + if (lib.uniffi_pubkycore_checksum_func_put() != 32173.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_pubkycore_checksum_func_put_with_session() != 17390.toShort()) { @@ -729,16 +774,34 @@ private fun uniffiCheckApiChecksums(lib: _UniFFILib) { if (lib.uniffi_pubkycore_checksum_func_set_event_listener() != 60071.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_pubkycore_checksum_func_sign_in() != 21584.toShort()) { + if (lib.uniffi_pubkycore_checksum_func_sign_in() != 23529.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_pubkycore_checksum_func_sign_in_cookie() != 28058.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_pubkycore_checksum_func_sign_in_grant() != 49219.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_pubkycore_checksum_func_sign_out() != 27163.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_pubkycore_checksum_func_sign_up() != 48789.toShort()) { + if (lib.uniffi_pubkycore_checksum_func_sign_up() != 6399.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_pubkycore_checksum_func_sign_up_cookie() != 55185.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_pubkycore_checksum_func_sign_up_grant() != 65298.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } - if (lib.uniffi_pubkycore_checksum_func_start_auth_flow() != 25681.toShort()) { + if (lib.uniffi_pubkycore_checksum_func_start_auth_flow() != 45230.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_pubkycore_checksum_func_start_cookie_auth_flow() != 49536.toShort()) { + throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + } + if (lib.uniffi_pubkycore_checksum_func_start_grant_auth_flow() != 48937.toShort()) { throw RuntimeException("UniFFI API checksum mismatch: try cleaning and rebuilding your project") } if (lib.uniffi_pubkycore_checksum_func_switch_network() != 64215.toShort()) { @@ -995,7 +1058,7 @@ abstract class FFIObject( } public interface EventNotifierInterface { - + companion object } @@ -1017,11 +1080,11 @@ class EventNotifier( } } - - + + companion object - + } public object FfiConverterTypeEventNotifier: FfiConverter { @@ -1132,7 +1195,7 @@ public abstract class FfiConverterCallbackInterface( public interface EventListener { fun `onEventOccurred`(`eventData`: String) - + companion object } @@ -1164,7 +1227,7 @@ internal class ForeignCallbackTypeEventListener : ForeignCallback { UNIFFI_CALLBACK_UNEXPECTED_ERROR } } - + else -> { // An unexpected error happened. // See docs of ForeignCallback in `uniffi_core/src/ffi/foreigncallbacks.rs` @@ -1179,7 +1242,7 @@ internal class ForeignCallbackTypeEventListener : ForeignCallback { } } - + @Suppress("UNUSED_PARAMETER") private fun `invokeOnEventOccurred`(kotlinCallbackInterface: EventListener, argsData: Pointer, argsLen: Int, outBuf: RustBufferByReference): Int { val argsBuf = argsData.getByteBuffer(0, argsLen.toLong()).also { @@ -1195,7 +1258,7 @@ internal class ForeignCallbackTypeEventListener : ForeignCallback { return makeCallAndHandleError() } - + } // The ffiConverter which transforms the Callbacks in to Handles to pass to Rust. @@ -1279,6 +1342,22 @@ fun `awaitAuthApproval`(): List { } +fun `awaitCookieAuthApproval`(): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_await_cookie_auth_approval(_status) +}) +} + + +fun `awaitGrantAuthApproval`(): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_await_grant_auth_approval(_status) +}) +} + + fun `createRecoveryFile`(`secretKey`: String, `passphrase`: String): List { return FfiConverterSequenceString.lift( rustCall() { _status -> @@ -1295,10 +1374,10 @@ fun `decryptRecoveryFile`(`recoveryFile`: String, `passphrase`: String): List { +fun `deleteFile`(`url`: String, `secretKey`: String, `clientId`: String): List { return FfiConverterSequenceString.lift( rustCall() { _status -> - _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_delete_file(FfiConverterString.lower(`url`),FfiConverterString.lower(`secretKey`),_status) + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_delete_file(FfiConverterString.lower(`url`),FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`clientId`),_status) }) } @@ -1391,6 +1470,14 @@ fun `parseAuthUrl`(`url`: String): List { } +fun `parseDeepLink`(`url`: String): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_parse_deep_link(FfiConverterString.lower(`url`),_status) +}) +} + + fun `publish`(`recordName`: String, `recordContent`: String, `secretKey`: String): List { return FfiConverterSequenceString.lift( rustCall() { _status -> @@ -1407,10 +1494,10 @@ fun `publishHttps`(`recordName`: String, `target`: String, `secretKey`: String): } -fun `put`(`url`: String, `content`: String, `secretKey`: String): List { +fun `put`(`url`: String, `content`: String, `secretKey`: String, `clientId`: String): List { return FfiConverterSequenceString.lift( rustCall() { _status -> - _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_put(FfiConverterString.lower(`url`),FfiConverterString.lower(`content`),FfiConverterString.lower(`secretKey`),_status) + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_put(FfiConverterString.lower(`url`),FfiConverterString.lower(`content`),FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`clientId`),_status) }) } @@ -1424,7 +1511,7 @@ fun `putWithSession`(`url`: String, `content`: String, `sessionSecret`: String): fun `removeEventListener`() = - + rustCall() { _status -> _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_remove_event_listener(_status) } @@ -1464,17 +1551,33 @@ fun `revalidateSession`(`sessionSecret`: String): List { fun `setEventListener`(`listener`: EventListener) = - + rustCall() { _status -> _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_set_event_listener(FfiConverterTypeEventListener.lower(`listener`),_status) } -fun `signIn`(`secretKey`: String): List { +fun `signIn`(`secretKey`: String, `clientId`: String): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_sign_in(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`clientId`),_status) +}) +} + + +fun `signInCookie`(`secretKey`: String): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_sign_in_cookie(FfiConverterString.lower(`secretKey`),_status) +}) +} + + +fun `signInGrant`(`secretKey`: String, `clientId`: String): List { return FfiConverterSequenceString.lift( rustCall() { _status -> - _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_sign_in(FfiConverterString.lower(`secretKey`),_status) + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_sign_in_grant(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`clientId`),_status) }) } @@ -1487,18 +1590,50 @@ fun `signOut`(`sessionSecret`: String): List { } -fun `signUp`(`secretKey`: String, `homeserver`: String, `signupToken`: String?): List { +fun `signUp`(`secretKey`: String, `homeserver`: String, `signupToken`: String?, `clientId`: String): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_sign_up(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`homeserver`),FfiConverterOptionalString.lower(`signupToken`),FfiConverterString.lower(`clientId`),_status) +}) +} + + +fun `signUpCookie`(`secretKey`: String, `homeserver`: String, `signupToken`: String?): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_sign_up_cookie(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`homeserver`),FfiConverterOptionalString.lower(`signupToken`),_status) +}) +} + + +fun `signUpGrant`(`secretKey`: String, `homeserver`: String, `signupToken`: String?, `clientId`: String): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_sign_up_grant(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`homeserver`),FfiConverterOptionalString.lower(`signupToken`),FfiConverterString.lower(`clientId`),_status) +}) +} + + +fun `startAuthFlow`(`capabilitiesStr`: String, `clientId`: String): List { + return FfiConverterSequenceString.lift( + rustCall() { _status -> + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_start_auth_flow(FfiConverterString.lower(`capabilitiesStr`),FfiConverterString.lower(`clientId`),_status) +}) +} + + +fun `startCookieAuthFlow`(`capabilitiesStr`: String): List { return FfiConverterSequenceString.lift( rustCall() { _status -> - _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_sign_up(FfiConverterString.lower(`secretKey`),FfiConverterString.lower(`homeserver`),FfiConverterOptionalString.lower(`signupToken`),_status) + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_start_cookie_auth_flow(FfiConverterString.lower(`capabilitiesStr`),_status) }) } -fun `startAuthFlow`(`capabilitiesStr`: String): List { +fun `startGrantAuthFlow`(`capabilitiesStr`: String, `clientId`: String): List { return FfiConverterSequenceString.lift( rustCall() { _status -> - _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_start_auth_flow(FfiConverterString.lower(`capabilitiesStr`),_status) + _UniFFILib.INSTANCE.uniffi_pubkycore_fn_func_start_grant_auth_flow(FfiConverterString.lower(`capabilitiesStr`),FfiConverterString.lower(`clientId`),_status) }) } diff --git a/bindings/ios/PubkyCore.xcframework/ios-arm64-simulator/Headers/pubkycoreFFI.h b/bindings/ios/PubkyCore.xcframework/ios-arm64-simulator/Headers/pubkycoreFFI.h index 0cbbef7..d1d862b 100644 --- a/bindings/ios/PubkyCore.xcframework/ios-arm64-simulator/Headers/pubkycoreFFI.h +++ b/bindings/ios/PubkyCore.xcframework/ios-arm64-simulator/Headers/pubkycoreFFI.h @@ -70,24 +70,30 @@ void uniffi_pubkycore_fn_init_callback_eventlistener(ForeignCallback _Nonnull ca RustBuffer uniffi_pubkycore_fn_func_auth(RustBuffer url, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_await_auth_approval(RustCallStatus *_Nonnull out_status - + +); +RustBuffer uniffi_pubkycore_fn_func_await_cookie_auth_approval(RustCallStatus *_Nonnull out_status + +); +RustBuffer uniffi_pubkycore_fn_func_await_grant_auth_approval(RustCallStatus *_Nonnull out_status + ); RustBuffer uniffi_pubkycore_fn_func_create_recovery_file(RustBuffer secret_key, RustBuffer passphrase, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_decrypt_recovery_file(RustBuffer recovery_file, RustBuffer passphrase, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_delete_file(RustBuffer url, RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_delete_file(RustBuffer url, RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_delete_with_session(RustBuffer url, RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_generate_mnemonic_phrase(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_generate_mnemonic_phrase_and_keypair(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_generate_secret_key(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_get(RustBuffer url, RustCallStatus *_Nonnull out_status ); @@ -103,16 +109,18 @@ RustBuffer uniffi_pubkycore_fn_func_mnemonic_phrase_to_keypair(RustBuffer mnemon ); RustBuffer uniffi_pubkycore_fn_func_parse_auth_url(RustBuffer url, RustCallStatus *_Nonnull out_status ); +RustBuffer uniffi_pubkycore_fn_func_parse_deep_link(RustBuffer url, RustCallStatus *_Nonnull out_status +); RustBuffer uniffi_pubkycore_fn_func_publish(RustBuffer record_name, RustBuffer record_content, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_publish_https(RustBuffer record_name, RustBuffer target, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_put(RustBuffer url, RustBuffer content, RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_put(RustBuffer url, RustBuffer content, RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_put_with_session(RustBuffer url, RustBuffer content, RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); void uniffi_pubkycore_fn_func_remove_event_listener(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_republish_homeserver(RustBuffer secret_key, RustBuffer homeserver, RustCallStatus *_Nonnull out_status ); @@ -124,13 +132,25 @@ RustBuffer uniffi_pubkycore_fn_func_revalidate_session(RustBuffer session_secret ); void uniffi_pubkycore_fn_func_set_event_listener(uint64_t listener, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_sign_in(RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_in(RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_in_cookie(RustBuffer secret_key, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_in_grant(RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_sign_out(RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_sign_up(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_up(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_up_cookie(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_start_auth_flow(RustBuffer capabilities_str, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_up_grant(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_auth_flow(RustBuffer capabilities_str, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_cookie_auth_flow(RustBuffer capabilities_str, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_grant_auth_flow(RustBuffer capabilities_str, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_switch_network(int8_t use_testnet, RustCallStatus *_Nonnull out_status ); @@ -251,105 +271,132 @@ void ffi_pubkycore_rust_future_free_void(void* _Nonnull handle void ffi_pubkycore_rust_future_complete_void(void* _Nonnull handle, RustCallStatus *_Nonnull out_status ); uint16_t uniffi_pubkycore_checksum_func_auth(void - + ); uint16_t uniffi_pubkycore_checksum_func_await_auth_approval(void - + +); +uint16_t uniffi_pubkycore_checksum_func_await_cookie_auth_approval(void + +); +uint16_t uniffi_pubkycore_checksum_func_await_grant_auth_approval(void + ); uint16_t uniffi_pubkycore_checksum_func_create_recovery_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_decrypt_recovery_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_delete_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_delete_with_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_mnemonic_phrase(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_mnemonic_phrase_and_keypair(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_secret_key(void - + ); uint16_t uniffi_pubkycore_checksum_func_get(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_homeserver(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_public_key_from_secret_key(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_signup_token(void - + ); uint16_t uniffi_pubkycore_checksum_func_list(void - + ); uint16_t uniffi_pubkycore_checksum_func_mnemonic_phrase_to_keypair(void - + ); uint16_t uniffi_pubkycore_checksum_func_parse_auth_url(void - + +); +uint16_t uniffi_pubkycore_checksum_func_parse_deep_link(void + ); uint16_t uniffi_pubkycore_checksum_func_publish(void - + ); uint16_t uniffi_pubkycore_checksum_func_publish_https(void - + ); uint16_t uniffi_pubkycore_checksum_func_put(void - + ); uint16_t uniffi_pubkycore_checksum_func_put_with_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_remove_event_listener(void - + ); uint16_t uniffi_pubkycore_checksum_func_republish_homeserver(void - + ); uint16_t uniffi_pubkycore_checksum_func_resolve(void - + ); uint16_t uniffi_pubkycore_checksum_func_resolve_https(void - + ); uint16_t uniffi_pubkycore_checksum_func_revalidate_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_set_event_listener(void - + ); uint16_t uniffi_pubkycore_checksum_func_sign_in(void - + +); +uint16_t uniffi_pubkycore_checksum_func_sign_in_cookie(void + +); +uint16_t uniffi_pubkycore_checksum_func_sign_in_grant(void + ); uint16_t uniffi_pubkycore_checksum_func_sign_out(void - + ); uint16_t uniffi_pubkycore_checksum_func_sign_up(void - + +); +uint16_t uniffi_pubkycore_checksum_func_sign_up_cookie(void + +); +uint16_t uniffi_pubkycore_checksum_func_sign_up_grant(void + ); uint16_t uniffi_pubkycore_checksum_func_start_auth_flow(void - + +); +uint16_t uniffi_pubkycore_checksum_func_start_cookie_auth_flow(void + +); +uint16_t uniffi_pubkycore_checksum_func_start_grant_auth_flow(void + ); uint16_t uniffi_pubkycore_checksum_func_switch_network(void - + ); uint16_t uniffi_pubkycore_checksum_func_validate_mnemonic_phrase(void - + ); uint16_t uniffi_pubkycore_checksum_method_eventlistener_on_event_occurred(void - + ); uint32_t ffi_pubkycore_uniffi_contract_version(void - + ); diff --git a/bindings/ios/PubkyCore.xcframework/ios-arm64-simulator/libpubkycore.a b/bindings/ios/PubkyCore.xcframework/ios-arm64-simulator/libpubkycore.a index a8049c2..a0fa44e 100644 Binary files a/bindings/ios/PubkyCore.xcframework/ios-arm64-simulator/libpubkycore.a and b/bindings/ios/PubkyCore.xcframework/ios-arm64-simulator/libpubkycore.a differ diff --git a/bindings/ios/PubkyCore.xcframework/ios-arm64/Headers/pubkycoreFFI.h b/bindings/ios/PubkyCore.xcframework/ios-arm64/Headers/pubkycoreFFI.h index 0cbbef7..d1d862b 100644 --- a/bindings/ios/PubkyCore.xcframework/ios-arm64/Headers/pubkycoreFFI.h +++ b/bindings/ios/PubkyCore.xcframework/ios-arm64/Headers/pubkycoreFFI.h @@ -70,24 +70,30 @@ void uniffi_pubkycore_fn_init_callback_eventlistener(ForeignCallback _Nonnull ca RustBuffer uniffi_pubkycore_fn_func_auth(RustBuffer url, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_await_auth_approval(RustCallStatus *_Nonnull out_status - + +); +RustBuffer uniffi_pubkycore_fn_func_await_cookie_auth_approval(RustCallStatus *_Nonnull out_status + +); +RustBuffer uniffi_pubkycore_fn_func_await_grant_auth_approval(RustCallStatus *_Nonnull out_status + ); RustBuffer uniffi_pubkycore_fn_func_create_recovery_file(RustBuffer secret_key, RustBuffer passphrase, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_decrypt_recovery_file(RustBuffer recovery_file, RustBuffer passphrase, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_delete_file(RustBuffer url, RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_delete_file(RustBuffer url, RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_delete_with_session(RustBuffer url, RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_generate_mnemonic_phrase(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_generate_mnemonic_phrase_and_keypair(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_generate_secret_key(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_get(RustBuffer url, RustCallStatus *_Nonnull out_status ); @@ -103,16 +109,18 @@ RustBuffer uniffi_pubkycore_fn_func_mnemonic_phrase_to_keypair(RustBuffer mnemon ); RustBuffer uniffi_pubkycore_fn_func_parse_auth_url(RustBuffer url, RustCallStatus *_Nonnull out_status ); +RustBuffer uniffi_pubkycore_fn_func_parse_deep_link(RustBuffer url, RustCallStatus *_Nonnull out_status +); RustBuffer uniffi_pubkycore_fn_func_publish(RustBuffer record_name, RustBuffer record_content, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_publish_https(RustBuffer record_name, RustBuffer target, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_put(RustBuffer url, RustBuffer content, RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_put(RustBuffer url, RustBuffer content, RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_put_with_session(RustBuffer url, RustBuffer content, RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); void uniffi_pubkycore_fn_func_remove_event_listener(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_republish_homeserver(RustBuffer secret_key, RustBuffer homeserver, RustCallStatus *_Nonnull out_status ); @@ -124,13 +132,25 @@ RustBuffer uniffi_pubkycore_fn_func_revalidate_session(RustBuffer session_secret ); void uniffi_pubkycore_fn_func_set_event_listener(uint64_t listener, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_sign_in(RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_in(RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_in_cookie(RustBuffer secret_key, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_in_grant(RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_sign_out(RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_sign_up(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_up(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_up_cookie(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_start_auth_flow(RustBuffer capabilities_str, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_up_grant(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_auth_flow(RustBuffer capabilities_str, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_cookie_auth_flow(RustBuffer capabilities_str, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_grant_auth_flow(RustBuffer capabilities_str, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_switch_network(int8_t use_testnet, RustCallStatus *_Nonnull out_status ); @@ -251,105 +271,132 @@ void ffi_pubkycore_rust_future_free_void(void* _Nonnull handle void ffi_pubkycore_rust_future_complete_void(void* _Nonnull handle, RustCallStatus *_Nonnull out_status ); uint16_t uniffi_pubkycore_checksum_func_auth(void - + ); uint16_t uniffi_pubkycore_checksum_func_await_auth_approval(void - + +); +uint16_t uniffi_pubkycore_checksum_func_await_cookie_auth_approval(void + +); +uint16_t uniffi_pubkycore_checksum_func_await_grant_auth_approval(void + ); uint16_t uniffi_pubkycore_checksum_func_create_recovery_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_decrypt_recovery_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_delete_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_delete_with_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_mnemonic_phrase(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_mnemonic_phrase_and_keypair(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_secret_key(void - + ); uint16_t uniffi_pubkycore_checksum_func_get(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_homeserver(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_public_key_from_secret_key(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_signup_token(void - + ); uint16_t uniffi_pubkycore_checksum_func_list(void - + ); uint16_t uniffi_pubkycore_checksum_func_mnemonic_phrase_to_keypair(void - + ); uint16_t uniffi_pubkycore_checksum_func_parse_auth_url(void - + +); +uint16_t uniffi_pubkycore_checksum_func_parse_deep_link(void + ); uint16_t uniffi_pubkycore_checksum_func_publish(void - + ); uint16_t uniffi_pubkycore_checksum_func_publish_https(void - + ); uint16_t uniffi_pubkycore_checksum_func_put(void - + ); uint16_t uniffi_pubkycore_checksum_func_put_with_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_remove_event_listener(void - + ); uint16_t uniffi_pubkycore_checksum_func_republish_homeserver(void - + ); uint16_t uniffi_pubkycore_checksum_func_resolve(void - + ); uint16_t uniffi_pubkycore_checksum_func_resolve_https(void - + ); uint16_t uniffi_pubkycore_checksum_func_revalidate_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_set_event_listener(void - + ); uint16_t uniffi_pubkycore_checksum_func_sign_in(void - + +); +uint16_t uniffi_pubkycore_checksum_func_sign_in_cookie(void + +); +uint16_t uniffi_pubkycore_checksum_func_sign_in_grant(void + ); uint16_t uniffi_pubkycore_checksum_func_sign_out(void - + ); uint16_t uniffi_pubkycore_checksum_func_sign_up(void - + +); +uint16_t uniffi_pubkycore_checksum_func_sign_up_cookie(void + +); +uint16_t uniffi_pubkycore_checksum_func_sign_up_grant(void + ); uint16_t uniffi_pubkycore_checksum_func_start_auth_flow(void - + +); +uint16_t uniffi_pubkycore_checksum_func_start_cookie_auth_flow(void + +); +uint16_t uniffi_pubkycore_checksum_func_start_grant_auth_flow(void + ); uint16_t uniffi_pubkycore_checksum_func_switch_network(void - + ); uint16_t uniffi_pubkycore_checksum_func_validate_mnemonic_phrase(void - + ); uint16_t uniffi_pubkycore_checksum_method_eventlistener_on_event_occurred(void - + ); uint32_t ffi_pubkycore_uniffi_contract_version(void - + ); diff --git a/bindings/ios/PubkyCore.xcframework/ios-arm64/libpubkycore.a b/bindings/ios/PubkyCore.xcframework/ios-arm64/libpubkycore.a index b127deb..122e063 100644 Binary files a/bindings/ios/PubkyCore.xcframework/ios-arm64/libpubkycore.a and b/bindings/ios/PubkyCore.xcframework/ios-arm64/libpubkycore.a differ diff --git a/bindings/ios/pubkycore.swift b/bindings/ios/pubkycore.swift index 0dc7f8a..9435912 100644 --- a/bindings/ios/pubkycore.swift +++ b/bindings/ios/pubkycore.swift @@ -10,7 +10,7 @@ import Foundation #endif private extension RustBuffer { - // Allocate a new buffer, copying the contents of a `UInt8` array. + /// Allocate a new buffer, copying the contents of a `UInt8` array. init(bytes: [UInt8]) { let rbuf = bytes.withUnsafeBufferPointer { ptr in RustBuffer.from(ptr) @@ -22,8 +22,8 @@ private extension RustBuffer { try! rustCall { ffi_pubkycore_rustbuffer_from_bytes(ForeignBytes(bufferPointer: ptr), $0) } } - // Frees the buffer in place. - // The buffer must not be used after this is called. + /// Frees the buffer in place. + /// The buffer must not be used after this is called. func deallocate() { try! rustCall { ffi_pubkycore_rustbuffer_free(self, $0) } } @@ -68,9 +68,9 @@ private func createReader(data: Data) -> (data: Data, offset: Data.Index) { (data: data, offset: 0) } -// Reads an integer at the current offset, in big-endian order, and advances -// the offset on success. Throws if reading the integer would move the -// offset past the end of the buffer. +/// Reads an integer at the current offset, in big-endian order, and advances +/// the offset on success. Throws if reading the integer would move the +/// offset past the end of the buffer. private func readInt(_ reader: inout (data: Data, offset: Data.Index)) throws -> T { let range = reader.offset ..< reader.offset + MemoryLayout.size guard reader.data.count >= range.upperBound else { @@ -87,8 +87,8 @@ private func readInt(_ reader: inout (data: Data, offset: return value.bigEndian } -// Reads an arbitrary number of bytes, to be used to read -// raw bytes, this is useful when lifting strings +/// Reads an arbitrary number of bytes, to be used to read +/// raw bytes, this is useful when lifting strings private func readBytes(_ reader: inout (data: Data, offset: Data.Index), count: Int) throws -> [UInt8] { let range = reader.offset ..< (reader.offset + count) guard reader.data.count >= range.upperBound else { @@ -102,17 +102,17 @@ private func readBytes(_ reader: inout (data: Data, offset: Data.Index), count: return value } -// Reads a float at the current offset. +/// Reads a float at the current offset. private func readFloat(_ reader: inout (data: Data, offset: Data.Index)) throws -> Float { return try Float(bitPattern: readInt(&reader)) } -// Reads a float at the current offset. +/// Reads a float at the current offset. private func readDouble(_ reader: inout (data: Data, offset: Data.Index)) throws -> Double { return try Double(bitPattern: readInt(&reader)) } -// Indicates if the offset has reached the end of the buffer. +/// Indicates if the offset has reached the end of the buffer. private func hasRemaining(_ reader: (data: Data, offset: Data.Index)) -> Bool { return reader.offset < reader.data.count } @@ -125,14 +125,14 @@ private func createWriter() -> [UInt8] { return [] } -private func writeBytes(_ writer: inout [UInt8], _ byteArr: S) where S: Sequence, S.Element == UInt8 { +private func writeBytes(_ writer: inout [UInt8], _ byteArr: S) where S.Element == UInt8 { writer.append(contentsOf: byteArr) } -// Writes an integer in big-endian order. -// -// Warning: make sure what you are trying to write -// is in the correct type! +/// Writes an integer in big-endian order. +/// +/// Warning: make sure what you are trying to write +/// is in the correct type! private func writeInt(_ writer: inout [UInt8], _ value: T) { var value = value.bigEndian withUnsafeBytes(of: &value) { writer.append(contentsOf: $0) } @@ -146,8 +146,8 @@ private func writeDouble(_ writer: inout [UInt8], _ value: Double) { writeInt(&writer, value.bitPattern) } -// Protocol for types that transfer other types across the FFI. This is -// analogous go the Rust trait of the same name. +/// Protocol for types that transfer other types across the FFI. This is +/// analogous go the Rust trait of the same name. private protocol FfiConverter { associatedtype FfiType associatedtype SwiftType @@ -158,7 +158,7 @@ private protocol FfiConverter { static func write(_ value: SwiftType, into buf: inout [UInt8]) } -// Types conforming to `Primitive` pass themselves directly over the FFI. +/// Types conforming to `Primitive` pass themselves directly over the FFI. private protocol FfiConverterPrimitive: FfiConverter where FfiType == SwiftType {} extension FfiConverterPrimitive { @@ -171,8 +171,8 @@ extension FfiConverterPrimitive { } } -// Types conforming to `FfiConverterRustBuffer` lift and lower into a `RustBuffer`. -// Used for complex types where it's hard to write a custom lift/lower. +/// Types conforming to `FfiConverterRustBuffer` lift and lower into a `RustBuffer`. +/// Used for complex types where it's hard to write a custom lift/lower. private protocol FfiConverterRustBuffer: FfiConverter where FfiType == RustBuffer {} extension FfiConverterRustBuffer { @@ -193,8 +193,8 @@ extension FfiConverterRustBuffer { } } -// An error type for FFI errors. These errors occur at the UniFFI level, not -// the library level. +/// An error type for FFI errors. These errors occur at the UniFFI level, not +/// the library level. private enum UniffiInternalError: LocalizedError { case bufferOverflow case incompleteData @@ -469,8 +469,8 @@ private class UniFFICallbackHandleMap { } } -// Magic number for the Rust proxy to call using the same mechanism as every other method, -// to free the callback once it's dropped by Rust. +/// Magic number for the Rust proxy to call using the same mechanism as every other method, +/// to free the callback once it's dropped by Rust. private let IDX_CALLBACK_FREE: Int32 = 0 // Callback return codes private let UNIFFI_CALLBACK_SUCCESS: Int32 = 0 @@ -483,7 +483,7 @@ public protocol EventListener: AnyObject { func onEventOccurred(eventData: String) } -// The ForeignCallback that is passed to Rust. +/// The ForeignCallback that is passed to Rust. private let foreignCallbackCallbackInterfaceEventListener: ForeignCallback = { (handle: UniFFICallbackHandle, method: Int32, argsData: UnsafePointer, argsLen: Int32, out_buf: UnsafeMutablePointer) -> Int32 in func invokeOnEventOccurred(_ swiftCallbackInterface: EventListener, _ argsData: UnsafePointer, _ argsLen: Int32, _: UnsafeMutablePointer) throws -> Int32 { var reader = createReader(data: Data(bytes: argsData, count: Int(argsLen))) @@ -528,7 +528,7 @@ private let foreignCallbackCallbackInterfaceEventListener: ForeignCallback = { ( } } -// FfiConverter protocol for callback interfaces +/// FfiConverter protocol for callback interfaces private enum FfiConverterCallbackInterfaceEventListener { private static let initCallbackOnce: () = { // Swift ensures this initializer code will once run once, even when accessed by multiple threads. @@ -550,7 +550,7 @@ private enum FfiConverterCallbackInterfaceEventListener { extension FfiConverterCallbackInterfaceEventListener: FfiConverter { typealias SwiftType = EventListener - // We can use Handle as the FfiType because it's a typealias to UInt64 + /// We can use Handle as the FfiType because it's a typealias to UInt64 typealias FfiType = UniFFICallbackHandle public static func lift(_ handle: UniFFICallbackHandle) throws -> SwiftType { @@ -640,6 +640,22 @@ public func awaitAuthApproval() -> [String] { ) } +public func awaitCookieAuthApproval() -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_await_cookie_auth_approval($0) + } + ) +} + +public func awaitGrantAuthApproval() -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_await_grant_auth_approval($0) + } + ) +} + public func createRecoveryFile(secretKey: String, passphrase: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { @@ -662,12 +678,13 @@ public func decryptRecoveryFile(recoveryFile: String, passphrase: String) -> [St ) } -public func deleteFile(url: String, secretKey: String) -> [String] { +public func deleteFile(url: String, secretKey: String, clientId: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { uniffi_pubkycore_fn_func_delete_file( FfiConverterString.lower(url), - FfiConverterString.lower(secretKey), $0 + FfiConverterString.lower(secretKey), + FfiConverterString.lower(clientId), $0 ) } ) @@ -779,6 +796,16 @@ public func parseAuthUrl(url: String) -> [String] { ) } +public func parseDeepLink(url: String) -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_parse_deep_link( + FfiConverterString.lower(url), $0 + ) + } + ) +} + public func publish(recordName: String, recordContent: String, secretKey: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { @@ -803,13 +830,14 @@ public func publishHttps(recordName: String, target: String, secretKey: String) ) } -public func put(url: String, content: String, secretKey: String) -> [String] { +public func put(url: String, content: String, secretKey: String, clientId: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { uniffi_pubkycore_fn_func_put( FfiConverterString.lower(url), FfiConverterString.lower(content), - FfiConverterString.lower(secretKey), $0 + FfiConverterString.lower(secretKey), + FfiConverterString.lower(clientId), $0 ) } ) @@ -882,16 +910,38 @@ public func setEventListener(listener: EventListener) { } } -public func signIn(secretKey: String) -> [String] { +public func signIn(secretKey: String, clientId: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { uniffi_pubkycore_fn_func_sign_in( + FfiConverterString.lower(secretKey), + FfiConverterString.lower(clientId), $0 + ) + } + ) +} + +public func signInCookie(secretKey: String) -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_sign_in_cookie( FfiConverterString.lower(secretKey), $0 ) } ) } +public func signInGrant(secretKey: String, clientId: String) -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_sign_in_grant( + FfiConverterString.lower(secretKey), + FfiConverterString.lower(clientId), $0 + ) + } + ) +} + public func signOut(sessionSecret: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { @@ -902,10 +952,23 @@ public func signOut(sessionSecret: String) -> [String] { ) } -public func signUp(secretKey: String, homeserver: String, signupToken: String?) -> [String] { +public func signUp(secretKey: String, homeserver: String, signupToken: String?, clientId: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { uniffi_pubkycore_fn_func_sign_up( + FfiConverterString.lower(secretKey), + FfiConverterString.lower(homeserver), + FfiConverterOptionString.lower(signupToken), + FfiConverterString.lower(clientId), $0 + ) + } + ) +} + +public func signUpCookie(secretKey: String, homeserver: String, signupToken: String?) -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_sign_up_cookie( FfiConverterString.lower(secretKey), FfiConverterString.lower(homeserver), FfiConverterOptionString.lower(signupToken), $0 @@ -914,16 +977,51 @@ public func signUp(secretKey: String, homeserver: String, signupToken: String?) ) } -public func startAuthFlow(capabilitiesStr: String) -> [String] { +public func signUpGrant(secretKey: String, homeserver: String, signupToken: String?, clientId: String) -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_sign_up_grant( + FfiConverterString.lower(secretKey), + FfiConverterString.lower(homeserver), + FfiConverterOptionString.lower(signupToken), + FfiConverterString.lower(clientId), $0 + ) + } + ) +} + +public func startAuthFlow(capabilitiesStr: String, clientId: String) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { uniffi_pubkycore_fn_func_start_auth_flow( + FfiConverterString.lower(capabilitiesStr), + FfiConverterString.lower(clientId), $0 + ) + } + ) +} + +public func startCookieAuthFlow(capabilitiesStr: String) -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_start_cookie_auth_flow( FfiConverterString.lower(capabilitiesStr), $0 ) } ) } +public func startGrantAuthFlow(capabilitiesStr: String, clientId: String) -> [String] { + return try! FfiConverterSequenceString.lift( + try! rustCall { + uniffi_pubkycore_fn_func_start_grant_auth_flow( + FfiConverterString.lower(capabilitiesStr), + FfiConverterString.lower(clientId), $0 + ) + } + ) +} + public func switchNetwork(useTestnet: Bool) -> [String] { return try! FfiConverterSequenceString.lift( try! rustCall { @@ -950,8 +1048,8 @@ private enum InitializationResult { case apiChecksumMismatch } -// Use a global variables to perform the versioning checks. Swift ensures that -// the code inside is only computed once. +/// Use a global variables to perform the versioning checks. Swift ensures that +/// the code inside is only computed once. private var initializationResult: InitializationResult { // Get the bindings contract version from our ComponentInterface let bindings_contract_version = 24 @@ -966,13 +1064,19 @@ private var initializationResult: InitializationResult { if uniffi_pubkycore_checksum_func_await_auth_approval() != 56488 { return InitializationResult.apiChecksumMismatch } + if uniffi_pubkycore_checksum_func_await_cookie_auth_approval() != 44552 { + return InitializationResult.apiChecksumMismatch + } + if uniffi_pubkycore_checksum_func_await_grant_auth_approval() != 15252 { + return InitializationResult.apiChecksumMismatch + } if uniffi_pubkycore_checksum_func_create_recovery_file() != 48846 { return InitializationResult.apiChecksumMismatch } if uniffi_pubkycore_checksum_func_decrypt_recovery_file() != 26407 { return InitializationResult.apiChecksumMismatch } - if uniffi_pubkycore_checksum_func_delete_file() != 47931 { + if uniffi_pubkycore_checksum_func_delete_file() != 43485 { return InitializationResult.apiChecksumMismatch } if uniffi_pubkycore_checksum_func_delete_with_session() != 26332 { @@ -1008,13 +1112,16 @@ private var initializationResult: InitializationResult { if uniffi_pubkycore_checksum_func_parse_auth_url() != 27379 { return InitializationResult.apiChecksumMismatch } + if uniffi_pubkycore_checksum_func_parse_deep_link() != 29971 { + return InitializationResult.apiChecksumMismatch + } if uniffi_pubkycore_checksum_func_publish() != 48989 { return InitializationResult.apiChecksumMismatch } if uniffi_pubkycore_checksum_func_publish_https() != 5614 { return InitializationResult.apiChecksumMismatch } - if uniffi_pubkycore_checksum_func_put() != 64514 { + if uniffi_pubkycore_checksum_func_put() != 32173 { return InitializationResult.apiChecksumMismatch } if uniffi_pubkycore_checksum_func_put_with_session() != 17390 { @@ -1038,16 +1145,34 @@ private var initializationResult: InitializationResult { if uniffi_pubkycore_checksum_func_set_event_listener() != 60071 { return InitializationResult.apiChecksumMismatch } - if uniffi_pubkycore_checksum_func_sign_in() != 21584 { + if uniffi_pubkycore_checksum_func_sign_in() != 23529 { + return InitializationResult.apiChecksumMismatch + } + if uniffi_pubkycore_checksum_func_sign_in_cookie() != 28058 { + return InitializationResult.apiChecksumMismatch + } + if uniffi_pubkycore_checksum_func_sign_in_grant() != 49219 { return InitializationResult.apiChecksumMismatch } if uniffi_pubkycore_checksum_func_sign_out() != 27163 { return InitializationResult.apiChecksumMismatch } - if uniffi_pubkycore_checksum_func_sign_up() != 48789 { + if uniffi_pubkycore_checksum_func_sign_up() != 6399 { + return InitializationResult.apiChecksumMismatch + } + if uniffi_pubkycore_checksum_func_sign_up_cookie() != 55185 { + return InitializationResult.apiChecksumMismatch + } + if uniffi_pubkycore_checksum_func_sign_up_grant() != 65298 { + return InitializationResult.apiChecksumMismatch + } + if uniffi_pubkycore_checksum_func_start_auth_flow() != 45230 { + return InitializationResult.apiChecksumMismatch + } + if uniffi_pubkycore_checksum_func_start_cookie_auth_flow() != 49536 { return InitializationResult.apiChecksumMismatch } - if uniffi_pubkycore_checksum_func_start_auth_flow() != 25681 { + if uniffi_pubkycore_checksum_func_start_grant_auth_flow() != 48937 { return InitializationResult.apiChecksumMismatch } if uniffi_pubkycore_checksum_func_switch_network() != 64215 { diff --git a/bindings/ios/pubkycoreFFI.h b/bindings/ios/pubkycoreFFI.h index 0cbbef7..d1d862b 100644 --- a/bindings/ios/pubkycoreFFI.h +++ b/bindings/ios/pubkycoreFFI.h @@ -70,24 +70,30 @@ void uniffi_pubkycore_fn_init_callback_eventlistener(ForeignCallback _Nonnull ca RustBuffer uniffi_pubkycore_fn_func_auth(RustBuffer url, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_await_auth_approval(RustCallStatus *_Nonnull out_status - + +); +RustBuffer uniffi_pubkycore_fn_func_await_cookie_auth_approval(RustCallStatus *_Nonnull out_status + +); +RustBuffer uniffi_pubkycore_fn_func_await_grant_auth_approval(RustCallStatus *_Nonnull out_status + ); RustBuffer uniffi_pubkycore_fn_func_create_recovery_file(RustBuffer secret_key, RustBuffer passphrase, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_decrypt_recovery_file(RustBuffer recovery_file, RustBuffer passphrase, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_delete_file(RustBuffer url, RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_delete_file(RustBuffer url, RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_delete_with_session(RustBuffer url, RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_generate_mnemonic_phrase(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_generate_mnemonic_phrase_and_keypair(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_generate_secret_key(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_get(RustBuffer url, RustCallStatus *_Nonnull out_status ); @@ -103,16 +109,18 @@ RustBuffer uniffi_pubkycore_fn_func_mnemonic_phrase_to_keypair(RustBuffer mnemon ); RustBuffer uniffi_pubkycore_fn_func_parse_auth_url(RustBuffer url, RustCallStatus *_Nonnull out_status ); +RustBuffer uniffi_pubkycore_fn_func_parse_deep_link(RustBuffer url, RustCallStatus *_Nonnull out_status +); RustBuffer uniffi_pubkycore_fn_func_publish(RustBuffer record_name, RustBuffer record_content, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_publish_https(RustBuffer record_name, RustBuffer target, RustBuffer secret_key, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_put(RustBuffer url, RustBuffer content, RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_put(RustBuffer url, RustBuffer content, RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_put_with_session(RustBuffer url, RustBuffer content, RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); void uniffi_pubkycore_fn_func_remove_event_listener(RustCallStatus *_Nonnull out_status - + ); RustBuffer uniffi_pubkycore_fn_func_republish_homeserver(RustBuffer secret_key, RustBuffer homeserver, RustCallStatus *_Nonnull out_status ); @@ -124,13 +132,25 @@ RustBuffer uniffi_pubkycore_fn_func_revalidate_session(RustBuffer session_secret ); void uniffi_pubkycore_fn_func_set_event_listener(uint64_t listener, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_sign_in(RustBuffer secret_key, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_in(RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_in_cookie(RustBuffer secret_key, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_in_grant(RustBuffer secret_key, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_sign_out(RustBuffer session_secret, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_sign_up(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_up(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_sign_up_cookie(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustCallStatus *_Nonnull out_status ); -RustBuffer uniffi_pubkycore_fn_func_start_auth_flow(RustBuffer capabilities_str, RustCallStatus *_Nonnull out_status +RustBuffer uniffi_pubkycore_fn_func_sign_up_grant(RustBuffer secret_key, RustBuffer homeserver, RustBuffer signup_token, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_auth_flow(RustBuffer capabilities_str, RustBuffer client_id, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_cookie_auth_flow(RustBuffer capabilities_str, RustCallStatus *_Nonnull out_status +); +RustBuffer uniffi_pubkycore_fn_func_start_grant_auth_flow(RustBuffer capabilities_str, RustBuffer client_id, RustCallStatus *_Nonnull out_status ); RustBuffer uniffi_pubkycore_fn_func_switch_network(int8_t use_testnet, RustCallStatus *_Nonnull out_status ); @@ -251,105 +271,132 @@ void ffi_pubkycore_rust_future_free_void(void* _Nonnull handle void ffi_pubkycore_rust_future_complete_void(void* _Nonnull handle, RustCallStatus *_Nonnull out_status ); uint16_t uniffi_pubkycore_checksum_func_auth(void - + ); uint16_t uniffi_pubkycore_checksum_func_await_auth_approval(void - + +); +uint16_t uniffi_pubkycore_checksum_func_await_cookie_auth_approval(void + +); +uint16_t uniffi_pubkycore_checksum_func_await_grant_auth_approval(void + ); uint16_t uniffi_pubkycore_checksum_func_create_recovery_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_decrypt_recovery_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_delete_file(void - + ); uint16_t uniffi_pubkycore_checksum_func_delete_with_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_mnemonic_phrase(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_mnemonic_phrase_and_keypair(void - + ); uint16_t uniffi_pubkycore_checksum_func_generate_secret_key(void - + ); uint16_t uniffi_pubkycore_checksum_func_get(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_homeserver(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_public_key_from_secret_key(void - + ); uint16_t uniffi_pubkycore_checksum_func_get_signup_token(void - + ); uint16_t uniffi_pubkycore_checksum_func_list(void - + ); uint16_t uniffi_pubkycore_checksum_func_mnemonic_phrase_to_keypair(void - + ); uint16_t uniffi_pubkycore_checksum_func_parse_auth_url(void - + +); +uint16_t uniffi_pubkycore_checksum_func_parse_deep_link(void + ); uint16_t uniffi_pubkycore_checksum_func_publish(void - + ); uint16_t uniffi_pubkycore_checksum_func_publish_https(void - + ); uint16_t uniffi_pubkycore_checksum_func_put(void - + ); uint16_t uniffi_pubkycore_checksum_func_put_with_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_remove_event_listener(void - + ); uint16_t uniffi_pubkycore_checksum_func_republish_homeserver(void - + ); uint16_t uniffi_pubkycore_checksum_func_resolve(void - + ); uint16_t uniffi_pubkycore_checksum_func_resolve_https(void - + ); uint16_t uniffi_pubkycore_checksum_func_revalidate_session(void - + ); uint16_t uniffi_pubkycore_checksum_func_set_event_listener(void - + ); uint16_t uniffi_pubkycore_checksum_func_sign_in(void - + +); +uint16_t uniffi_pubkycore_checksum_func_sign_in_cookie(void + +); +uint16_t uniffi_pubkycore_checksum_func_sign_in_grant(void + ); uint16_t uniffi_pubkycore_checksum_func_sign_out(void - + ); uint16_t uniffi_pubkycore_checksum_func_sign_up(void - + +); +uint16_t uniffi_pubkycore_checksum_func_sign_up_cookie(void + +); +uint16_t uniffi_pubkycore_checksum_func_sign_up_grant(void + ); uint16_t uniffi_pubkycore_checksum_func_start_auth_flow(void - + +); +uint16_t uniffi_pubkycore_checksum_func_start_cookie_auth_flow(void + +); +uint16_t uniffi_pubkycore_checksum_func_start_grant_auth_flow(void + ); uint16_t uniffi_pubkycore_checksum_func_switch_network(void - + ); uint16_t uniffi_pubkycore_checksum_func_validate_mnemonic_phrase(void - + ); uint16_t uniffi_pubkycore_checksum_method_eventlistener_on_event_occurred(void - + ); uint32_t ffi_pubkycore_uniffi_contract_version(void - + ); diff --git a/bindings/python/pubkycore/libpubkycore.dylib b/bindings/python/pubkycore/libpubkycore.dylib index 1296e8f..7db723c 100755 Binary files a/bindings/python/pubkycore/libpubkycore.dylib and b/bindings/python/pubkycore/libpubkycore.dylib differ diff --git a/bindings/python/pubkycore/pubkycore.py b/bindings/python/pubkycore/pubkycore.py index d59f8a0..7f74c82 100644 --- a/bindings/python/pubkycore/pubkycore.py +++ b/bindings/python/pubkycore/pubkycore.py @@ -508,11 +508,15 @@ def _uniffi_check_api_checksums(lib): raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_await_auth_approval() != 56488: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_await_cookie_auth_approval() != 44552: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_await_grant_auth_approval() != 15252: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_create_recovery_file() != 48846: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_decrypt_recovery_file() != 26407: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") - if lib.uniffi_pubkycore_checksum_func_delete_file() != 47931: + if lib.uniffi_pubkycore_checksum_func_delete_file() != 43485: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_delete_with_session() != 26332: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") @@ -536,11 +540,13 @@ def _uniffi_check_api_checksums(lib): raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_parse_auth_url() != 27379: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_parse_deep_link() != 29971: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_publish() != 48989: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_publish_https() != 5614: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") - if lib.uniffi_pubkycore_checksum_func_put() != 64514: + if lib.uniffi_pubkycore_checksum_func_put() != 32173: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_put_with_session() != 17390: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") @@ -556,13 +562,25 @@ def _uniffi_check_api_checksums(lib): raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_set_event_listener() != 60071: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") - if lib.uniffi_pubkycore_checksum_func_sign_in() != 21584: + if lib.uniffi_pubkycore_checksum_func_sign_in() != 23529: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_sign_in_cookie() != 28058: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_sign_in_grant() != 49219: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_sign_out() != 27163: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") - if lib.uniffi_pubkycore_checksum_func_sign_up() != 48789: + if lib.uniffi_pubkycore_checksum_func_sign_up() != 6399: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") - if lib.uniffi_pubkycore_checksum_func_start_auth_flow() != 25681: + if lib.uniffi_pubkycore_checksum_func_sign_up_cookie() != 55185: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_sign_up_grant() != 65298: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_start_auth_flow() != 45230: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_start_cookie_auth_flow() != 49536: + raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") + if lib.uniffi_pubkycore_checksum_func_start_grant_auth_flow() != 48937: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") if lib.uniffi_pubkycore_checksum_func_switch_network() != 64215: raise InternalError("UniFFI API checksum mismatch: try cleaning and rebuilding your project") @@ -595,6 +613,14 @@ def _uniffi_check_api_checksums(lib): ctypes.POINTER(_UniffiRustCallStatus), ) _UniffiLib.uniffi_pubkycore_fn_func_await_auth_approval.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_await_cookie_auth_approval.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_await_cookie_auth_approval.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_await_grant_auth_approval.argtypes = ( + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_await_grant_auth_approval.restype = _UniffiRustBuffer _UniffiLib.uniffi_pubkycore_fn_func_create_recovery_file.argtypes = ( _UniffiRustBuffer, _UniffiRustBuffer, @@ -608,6 +634,7 @@ def _uniffi_check_api_checksums(lib): ) _UniffiLib.uniffi_pubkycore_fn_func_decrypt_recovery_file.restype = _UniffiRustBuffer _UniffiLib.uniffi_pubkycore_fn_func_delete_file.argtypes = ( + _UniffiRustBuffer, _UniffiRustBuffer, _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), @@ -667,6 +694,11 @@ def _uniffi_check_api_checksums(lib): ctypes.POINTER(_UniffiRustCallStatus), ) _UniffiLib.uniffi_pubkycore_fn_func_parse_auth_url.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_parse_deep_link.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_parse_deep_link.restype = _UniffiRustBuffer _UniffiLib.uniffi_pubkycore_fn_func_publish.argtypes = ( _UniffiRustBuffer, _UniffiRustBuffer, @@ -685,6 +717,7 @@ def _uniffi_check_api_checksums(lib): _UniffiRustBuffer, _UniffiRustBuffer, _UniffiRustBuffer, + _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), ) _UniffiLib.uniffi_pubkycore_fn_func_put.restype = _UniffiRustBuffer @@ -726,10 +759,22 @@ def _uniffi_check_api_checksums(lib): ) _UniffiLib.uniffi_pubkycore_fn_func_set_event_listener.restype = None _UniffiLib.uniffi_pubkycore_fn_func_sign_in.argtypes = ( + _UniffiRustBuffer, _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), ) _UniffiLib.uniffi_pubkycore_fn_func_sign_in.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_sign_in_cookie.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_sign_in_cookie.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_sign_in_grant.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_sign_in_grant.restype = _UniffiRustBuffer _UniffiLib.uniffi_pubkycore_fn_func_sign_out.argtypes = ( _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), @@ -739,14 +784,42 @@ def _uniffi_check_api_checksums(lib): _UniffiRustBuffer, _UniffiRustBuffer, _UniffiRustBuffer, + _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), ) _UniffiLib.uniffi_pubkycore_fn_func_sign_up.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_sign_up_cookie.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_sign_up_cookie.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_sign_up_grant.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_sign_up_grant.restype = _UniffiRustBuffer _UniffiLib.uniffi_pubkycore_fn_func_start_auth_flow.argtypes = ( + _UniffiRustBuffer, _UniffiRustBuffer, ctypes.POINTER(_UniffiRustCallStatus), ) _UniffiLib.uniffi_pubkycore_fn_func_start_auth_flow.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_start_cookie_auth_flow.argtypes = ( + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_start_cookie_auth_flow.restype = _UniffiRustBuffer +_UniffiLib.uniffi_pubkycore_fn_func_start_grant_auth_flow.argtypes = ( + _UniffiRustBuffer, + _UniffiRustBuffer, + ctypes.POINTER(_UniffiRustCallStatus), +) +_UniffiLib.uniffi_pubkycore_fn_func_start_grant_auth_flow.restype = _UniffiRustBuffer _UniffiLib.uniffi_pubkycore_fn_func_switch_network.argtypes = ( ctypes.c_int8, ctypes.POINTER(_UniffiRustCallStatus), @@ -1022,6 +1095,12 @@ def _uniffi_check_api_checksums(lib): _UniffiLib.uniffi_pubkycore_checksum_func_await_auth_approval.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_await_auth_approval.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_await_cookie_auth_approval.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_await_cookie_auth_approval.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_await_grant_auth_approval.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_await_grant_auth_approval.restype = ctypes.c_uint16 _UniffiLib.uniffi_pubkycore_checksum_func_create_recovery_file.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_create_recovery_file.restype = ctypes.c_uint16 @@ -1064,6 +1143,9 @@ def _uniffi_check_api_checksums(lib): _UniffiLib.uniffi_pubkycore_checksum_func_parse_auth_url.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_parse_auth_url.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_parse_deep_link.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_parse_deep_link.restype = ctypes.c_uint16 _UniffiLib.uniffi_pubkycore_checksum_func_publish.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_publish.restype = ctypes.c_uint16 @@ -1097,15 +1179,33 @@ def _uniffi_check_api_checksums(lib): _UniffiLib.uniffi_pubkycore_checksum_func_sign_in.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_sign_in.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_sign_in_cookie.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_sign_in_cookie.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_sign_in_grant.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_sign_in_grant.restype = ctypes.c_uint16 _UniffiLib.uniffi_pubkycore_checksum_func_sign_out.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_sign_out.restype = ctypes.c_uint16 _UniffiLib.uniffi_pubkycore_checksum_func_sign_up.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_sign_up.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_sign_up_cookie.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_sign_up_cookie.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_sign_up_grant.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_sign_up_grant.restype = ctypes.c_uint16 _UniffiLib.uniffi_pubkycore_checksum_func_start_auth_flow.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_start_auth_flow.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_start_cookie_auth_flow.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_start_cookie_auth_flow.restype = ctypes.c_uint16 +_UniffiLib.uniffi_pubkycore_checksum_func_start_grant_auth_flow.argtypes = ( +) +_UniffiLib.uniffi_pubkycore_checksum_func_start_grant_auth_flow.restype = ctypes.c_uint16 _UniffiLib.uniffi_pubkycore_checksum_func_switch_network.argtypes = ( ) _UniffiLib.uniffi_pubkycore_checksum_func_switch_network.restype = ctypes.c_uint16 @@ -1306,10 +1406,10 @@ class EventListener: def on_event_occurred(self, event_data: "str"): raise NotImplementedError - + def py_foreignCallbackCallbackInterfaceEventListener(handle, method, args_data, args_len, buf_ptr): - + def invoke_on_event_occurred(python_callback, args_stream, buf_ptr): def makeCall():return python_callback.on_event_occurred( _UniffiConverterString.read(args_stream) @@ -1320,7 +1420,7 @@ def makeCallAndHandleReturn(): return _UNIFFI_CALLBACK_SUCCESS return makeCallAndHandleReturn() - + cb = _UniffiConverterCallbackInterfaceEventListener.lift(handle) if not cb: @@ -1346,7 +1446,7 @@ def makeCallAndHandleReturn(): # If that fails, just give up pass return _UNIFFI_CALLBACK_UNEXPECTED_ERROR - + # This should never happen, because an out of bounds method index won't # ever be used. Once we can catch errors, we should return an InternalException. @@ -1409,8 +1509,8 @@ def read(cls, buf): ] def auth(url: "str",secret_key: "str") -> "typing.List[str]": - - + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_auth, _UniffiConverterString.lower(url), _UniffiConverterString.lower(secret_key))) @@ -1420,33 +1520,43 @@ def await_auth_approval() -> "typing.List[str]": return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_await_auth_approval,)) +def await_cookie_auth_approval() -> "typing.List[str]": + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_await_cookie_auth_approval,)) + + +def await_grant_auth_approval() -> "typing.List[str]": + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_await_grant_auth_approval,)) + + def create_recovery_file(secret_key: "str",passphrase: "str") -> "typing.List[str]": - - + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_create_recovery_file, _UniffiConverterString.lower(secret_key), _UniffiConverterString.lower(passphrase))) def decrypt_recovery_file(recovery_file: "str",passphrase: "str") -> "typing.List[str]": - - + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_decrypt_recovery_file, _UniffiConverterString.lower(recovery_file), _UniffiConverterString.lower(passphrase))) -def delete_file(url: "str",secret_key: "str") -> "typing.List[str]": - - +def delete_file(url: "str",secret_key: "str",client_id: "str") -> "typing.List[str]": + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_delete_file, _UniffiConverterString.lower(url), - _UniffiConverterString.lower(secret_key))) + _UniffiConverterString.lower(secret_key), + _UniffiConverterString.lower(client_id))) def delete_with_session(url: "str",session_secret: "str") -> "typing.List[str]": - - + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_delete_with_session, _UniffiConverterString.lower(url), _UniffiConverterString.lower(session_secret))) @@ -1465,53 +1575,59 @@ def generate_secret_key() -> "typing.List[str]": def get(url: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_get, _UniffiConverterString.lower(url))) def get_homeserver(pubky: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_get_homeserver, _UniffiConverterString.lower(pubky))) def get_public_key_from_secret_key(secret_key: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_get_public_key_from_secret_key, _UniffiConverterString.lower(secret_key))) def get_signup_token(homeserver_pubky: "str",admin_password: "str") -> "typing.List[str]": - - + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_get_signup_token, _UniffiConverterString.lower(homeserver_pubky), _UniffiConverterString.lower(admin_password))) def list(url: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_list, _UniffiConverterString.lower(url))) def mnemonic_phrase_to_keypair(mnemonic_phrase: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_mnemonic_phrase_to_keypair, _UniffiConverterString.lower(mnemonic_phrase))) def parse_auth_url(url: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_parse_auth_url, _UniffiConverterString.lower(url))) +def parse_deep_link(url: "str") -> "typing.List[str]": + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_parse_deep_link, + _UniffiConverterString.lower(url))) + + def publish(record_name: "str",record_content: "str",secret_key: "str") -> "typing.List[str]": - - - + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_publish, _UniffiConverterString.lower(record_name), _UniffiConverterString.lower(record_content), @@ -1519,29 +1635,31 @@ def publish(record_name: "str",record_content: "str",secret_key: "str") -> "typi def publish_https(record_name: "str",target: "str",secret_key: "str") -> "typing.List[str]": - - - + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_publish_https, _UniffiConverterString.lower(record_name), _UniffiConverterString.lower(target), _UniffiConverterString.lower(secret_key))) -def put(url: "str",content: "str",secret_key: "str") -> "typing.List[str]": - - - +def put(url: "str",content: "str",secret_key: "str",client_id: "str") -> "typing.List[str]": + + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_put, _UniffiConverterString.lower(url), _UniffiConverterString.lower(content), - _UniffiConverterString.lower(secret_key))) + _UniffiConverterString.lower(secret_key), + _UniffiConverterString.lower(client_id))) def put_with_session(url: "str",content: "str",session_secret: "str") -> "typing.List[str]": - - - + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_put_with_session, _UniffiConverterString.lower(url), _UniffiConverterString.lower(content), @@ -1553,73 +1671,129 @@ def remove_event_listener(): def republish_homeserver(secret_key: "str",homeserver: "str") -> "typing.List[str]": - - + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_republish_homeserver, _UniffiConverterString.lower(secret_key), _UniffiConverterString.lower(homeserver))) def resolve(public_key: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_resolve, _UniffiConverterString.lower(public_key))) def resolve_https(public_key: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_resolve_https, _UniffiConverterString.lower(public_key))) def revalidate_session(session_secret: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_revalidate_session, _UniffiConverterString.lower(session_secret))) def set_event_listener(listener: "EventListener"): - + _rust_call(_UniffiLib.uniffi_pubkycore_fn_func_set_event_listener, _UniffiConverterCallbackInterfaceEventListener.lower(listener)) -def sign_in(secret_key: "str") -> "typing.List[str]": - +def sign_in(secret_key: "str",client_id: "str") -> "typing.List[str]": + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_sign_in, + _UniffiConverterString.lower(secret_key), + _UniffiConverterString.lower(client_id))) + + +def sign_in_cookie(secret_key: "str") -> "typing.List[str]": + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_sign_in_cookie, _UniffiConverterString.lower(secret_key))) +def sign_in_grant(secret_key: "str",client_id: "str") -> "typing.List[str]": + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_sign_in_grant, + _UniffiConverterString.lower(secret_key), + _UniffiConverterString.lower(client_id))) + + def sign_out(session_secret: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_sign_out, _UniffiConverterString.lower(session_secret))) -def sign_up(secret_key: "str",homeserver: "str",signup_token: "typing.Optional[str]") -> "typing.List[str]": - - - +def sign_up(secret_key: "str",homeserver: "str",signup_token: "typing.Optional[str]",client_id: "str") -> "typing.List[str]": + + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_sign_up, + _UniffiConverterString.lower(secret_key), + _UniffiConverterString.lower(homeserver), + _UniffiConverterOptionalString.lower(signup_token), + _UniffiConverterString.lower(client_id))) + + +def sign_up_cookie(secret_key: "str",homeserver: "str",signup_token: "typing.Optional[str]") -> "typing.List[str]": + + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_sign_up_cookie, _UniffiConverterString.lower(secret_key), _UniffiConverterString.lower(homeserver), _UniffiConverterOptionalString.lower(signup_token))) -def start_auth_flow(capabilities_str: "str") -> "typing.List[str]": - +def sign_up_grant(secret_key: "str",homeserver: "str",signup_token: "typing.Optional[str]",client_id: "str") -> "typing.List[str]": + + + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_sign_up_grant, + _UniffiConverterString.lower(secret_key), + _UniffiConverterString.lower(homeserver), + _UniffiConverterOptionalString.lower(signup_token), + _UniffiConverterString.lower(client_id))) + + +def start_auth_flow(capabilities_str: "str",client_id: "str") -> "typing.List[str]": + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_start_auth_flow, + _UniffiConverterString.lower(capabilities_str), + _UniffiConverterString.lower(client_id))) + + +def start_cookie_auth_flow(capabilities_str: "str") -> "typing.List[str]": + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_start_cookie_auth_flow, _UniffiConverterString.lower(capabilities_str))) +def start_grant_auth_flow(capabilities_str: "str",client_id: "str") -> "typing.List[str]": + + + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_start_grant_auth_flow, + _UniffiConverterString.lower(capabilities_str), + _UniffiConverterString.lower(client_id))) + + def switch_network(use_testnet: "bool") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_switch_network, _UniffiConverterBool.lower(use_testnet))) def validate_mnemonic_phrase(mnemonic_phrase: "str") -> "typing.List[str]": - + return _UniffiConverterSequenceString.lift(_rust_call(_UniffiLib.uniffi_pubkycore_fn_func_validate_mnemonic_phrase, _UniffiConverterString.lower(mnemonic_phrase))) @@ -1628,6 +1802,8 @@ def validate_mnemonic_phrase(mnemonic_phrase: "str") -> "typing.List[str]": "InternalError", "auth", "await_auth_approval", + "await_cookie_auth_approval", + "await_grant_auth_approval", "create_recovery_file", "decrypt_recovery_file", "delete_file", @@ -1642,6 +1818,7 @@ def validate_mnemonic_phrase(mnemonic_phrase: "str") -> "typing.List[str]": "list", "mnemonic_phrase_to_keypair", "parse_auth_url", + "parse_deep_link", "publish", "publish_https", "put", @@ -1653,9 +1830,15 @@ def validate_mnemonic_phrase(mnemonic_phrase: "str") -> "typing.List[str]": "revalidate_session", "set_event_listener", "sign_in", + "sign_in_cookie", + "sign_in_grant", "sign_out", "sign_up", + "sign_up_cookie", + "sign_up_grant", "start_auth_flow", + "start_cookie_auth_flow", + "start_grant_auth_flow", "switch_network", "validate_mnemonic_phrase", "EventNotifier", diff --git a/src/auth.rs b/src/auth.rs index 1b17c4c..3a29028 100644 --- a/src/auth.rs +++ b/src/auth.rs @@ -1,91 +1,219 @@ // Note: The authorize function has been moved inline into the auth() function in lib.rs // using the new approve_auth API from PubkySigner -use crate::{Capability, PubkyAuthDetails}; +use crate::{Capability, PubkyAuthDetails, PubkyDeepLinkDetails}; +use base64::{engine::general_purpose::URL_SAFE_NO_PAD, Engine}; +use pubky::deep_links::{DeepLink, XCallbackParams}; +use pubky::Capabilities; use serde_json; -use std::collections::HashMap; -use url::Url; +use std::str::FromStr; pub fn pubky_auth_details_to_json(details: &PubkyAuthDetails) -> Result { serde_json::to_string(details).map_err(|_| "Error serializing to JSON".to_string()) } -pub fn parse_pubky_auth_url(url_str: &str) -> Result { - let url = Url::parse(url_str).map_err(|_| "Invalid URL".to_string())?; +pub fn pubky_deep_link_details_to_json(details: &PubkyDeepLinkDetails) -> Result { + serde_json::to_string(details).map_err(|_| "Error serializing to JSON".to_string()) +} - if url.scheme() != "pubkyauth" { - return Err("Invalid scheme, expected 'pubkyauth'".to_string()); +pub fn parse_pubky_auth_url(url_str: &str) -> Result { + let details = parse_pubky_deep_link(url_str)?; + match details.kind.as_str() { + "signin" | "signup" | "signin_grant" | "signup_grant" => Ok(PubkyAuthDetails { + relay: details.relay.ok_or_else(|| "Missing relay".to_string())?, + capabilities: details.capabilities.unwrap_or_default(), + secret: details.secret.ok_or_else(|| "Missing secret".to_string())?, + kind: details.kind, + homeserver: details.homeserver, + signup_token: details.signup_token, + client_id: details.client_id, + client_public_key: details.client_public_key, + x_source: details.x_source, + x_success: details.x_success, + x_error: details.x_error, + x_cancel: details.x_cancel, + }), + other => Err(format!("Invalid auth URL intent '{}'", other)), } +} + +pub fn parse_pubky_deep_link(url_str: &str) -> Result { + let deep_link = DeepLink::from_str(url_str).map_err(|error| error.to_string())?; + Ok(deep_link_details(&deep_link)) +} - // pubky 0.9.1 deep links carry the intent in the host position - // (pubkyauth://signin?... / pubkyauth://signup?...). Legacy URLs - // (pubkyauth:///?...) have no host and mean signin. Unknown intents are - // rejected rather than silently treated as signin, matching pubky's own - // DeepLink parser. - let kind = match url.host_str().unwrap_or("") { - "" | "signin" => "signin", - "signup" => "signup", - other => { - return Err(format!( - "Invalid auth URL intent '{}', expected 'signin' or 'signup'", - other - )) +fn deep_link_details(deep_link: &DeepLink) -> PubkyDeepLinkDetails { + let callbacks = deep_link.x_callback(); + match deep_link { + DeepLink::Signin(link) => { + let params = link.params(); + auth_deep_link_details( + link.scheme().as_str(), + link.intent(), + link.to_string(), + params.relay.to_string(), + ¶ms.capabilities, + ¶ms.secret, + None, + None, + None, + None, + callbacks, + ) + } + DeepLink::Signup(link) => { + let params = link.params(); + auth_deep_link_details( + link.scheme().as_str(), + link.intent(), + link.to_string(), + params.relay.to_string(), + ¶ms.capabilities, + ¶ms.secret, + Some(params.homeserver.z32()), + params.signup_token.clone(), + None, + None, + callbacks, + ) + } + DeepLink::DirectSignup(link) => { + let params = link.params(); + non_auth_deep_link_details( + link.scheme().as_str(), + link.intent(), + link.to_string(), + Some(params.homeserver.z32()), + params.signup_token.clone(), + None, + None, + None, + callbacks, + ) + } + DeepLink::SigninGrant(link) => { + let params = link.params(); + auth_deep_link_details( + link.scheme().as_str(), + link.intent(), + link.to_string(), + params.relay.to_string(), + ¶ms.capabilities, + ¶ms.secret, + None, + None, + Some(params.client_id.to_string()), + Some(params.client_pk.z32()), + callbacks, + ) + } + DeepLink::SignupGrant(link) => { + let params = link.params(); + auth_deep_link_details( + link.scheme().as_str(), + link.intent(), + link.to_string(), + params.relay.to_string(), + ¶ms.capabilities, + ¶ms.secret, + Some(params.homeserver.z32()), + params.signup_token.clone(), + Some(params.client_id.to_string()), + Some(params.client_pk.z32()), + callbacks, + ) + } + DeepLink::SeedExport(link) => { + let params = link.params(); + non_auth_deep_link_details( + link.scheme().as_str(), + link.intent(), + link.to_string(), + None, + None, + Some(URL_SAFE_NO_PAD.encode(params.secret)), + None, + None, + callbacks, + ) } } - .to_string(); - - // Collect query pairs into a HashMap for efficient access - let query_params: HashMap<_, _> = url.query_pairs().into_owned().collect(); - - let relay = query_params - .get("relay") - .cloned() - .ok_or_else(|| "Missing relay".to_string())?; - - let secret = query_params - .get("secret") - .cloned() - .ok_or_else(|| "Missing secret".to_string())?; - - let capabilities_str = query_params - .get("capabilities") - .or_else(|| query_params.get("caps")) - .cloned() - .unwrap_or_default(); - - // Parse capabilities - let capabilities = if capabilities_str.is_empty() { - Vec::new() - } else { - capabilities_str - .split(',') - .map(|capability| { - let mut parts = capability.splitn(2, ':'); - let path = parts - .next() - .ok_or_else(|| format!("Invalid capability format in '{}'", capability))?; - let permission = parts - .next() - .ok_or_else(|| format!("Invalid capability format in '{}'", capability))?; - Ok(Capability { - path: path.to_string(), - permission: permission.to_string(), - }) - }) - .collect::, String>>()? - }; +} - // Signup links (pubky 0.9.1) also carry the homeserver public key and an - // optional signup token: ...&hs={homeserver_z32}&st={signup_token} - let homeserver = query_params.get("hs").cloned().filter(|v| !v.is_empty()); - let signup_token = query_params.get("st").cloned().filter(|v| !v.is_empty()); +#[allow(clippy::too_many_arguments)] +fn auth_deep_link_details( + scheme: &str, + kind: &str, + url: String, + relay: String, + capabilities: &Capabilities, + secret: &[u8; 32], + homeserver: Option, + signup_token: Option, + client_id: Option, + client_public_key: Option, + callbacks: &XCallbackParams, +) -> PubkyDeepLinkDetails { + PubkyDeepLinkDetails { + scheme: scheme.to_string(), + kind: kind.to_string(), + url, + relay: Some(relay), + capabilities: Some(convert_capabilities(capabilities)), + secret: Some(URL_SAFE_NO_PAD.encode(secret)), + homeserver, + signup_token, + client_id, + client_public_key, + x_source: callbacks.x_source.clone(), + x_success: callbacks.x_success.clone(), + x_error: callbacks.x_error.clone(), + x_cancel: callbacks.x_cancel.clone(), + } +} - Ok(PubkyAuthDetails { - relay, - capabilities, +#[allow(clippy::too_many_arguments)] +fn non_auth_deep_link_details( + scheme: &str, + kind: &str, + url: String, + homeserver: Option, + signup_token: Option, + secret: Option, + client_id: Option, + client_public_key: Option, + callbacks: &XCallbackParams, +) -> PubkyDeepLinkDetails { + PubkyDeepLinkDetails { + scheme: scheme.to_string(), + kind: kind.to_string(), + url, + relay: None, + capabilities: None, secret, - kind, homeserver, signup_token, - }) + client_id, + client_public_key, + x_source: callbacks.x_source.clone(), + x_success: callbacks.x_success.clone(), + x_error: callbacks.x_error.clone(), + x_cancel: callbacks.x_cancel.clone(), + } +} + +fn convert_capabilities(capabilities: &Capabilities) -> Vec { + capabilities + .iter() + .map(|capability| { + let capability = capability.to_string(); + let (path, permission) = capability + .rsplit_once(':') + .unwrap_or((capability.as_str(), "")); + Capability { + path: path.to_string(), + permission: permission.to_string(), + } + }) + .collect() } diff --git a/src/lib.rs b/src/lib.rs index 4da6bf3..c3269ab 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -19,10 +19,15 @@ use hex; use once_cell::sync::Lazy; use pubky::pkarr::dns::rdata::{RData, SVCParam, HTTPS, SVCB}; use pubky::pkarr::dns::{Packet, ResourceRecord}; +use pubky::pkarr::ResolvePolicy; use pubky::pkarr::Timestamp; use pubky::pkarr::{dns, SignedPacket}; use pubky::recovery_file; -use pubky::{AuthFlowKind, Capabilities, Pubky, PubkyAuthFlow, PubkySession, PublicKey}; +#[allow(deprecated)] +use pubky::{ + AuthFlowKind, Capabilities, ClientId, Pubky, PubkyCookieAuthFlow, PubkyGrantAuthFlow, + PubkySession, PublicKey, +}; use serde_json::json; use std::str; use std::sync::{Arc, Mutex}; @@ -79,7 +84,30 @@ pub fn switch_network(use_testnet: bool) -> Vec { static TOKIO_RUNTIME: Lazy> = Lazy::new(|| Arc::new(Runtime::new().expect("Failed to create Tokio runtime"))); -static AUTH_FLOW: Lazy>> = Lazy::new(|| Mutex::new(None)); +static GRANT_AUTH_FLOW: Lazy>> = Lazy::new(|| Mutex::new(None)); +#[allow(deprecated)] +static COOKIE_AUTH_FLOW: Lazy>> = Lazy::new(|| Mutex::new(None)); + +fn parse_client_id(client_id: &str) -> Result { + ClientId::new(client_id).map_err(|error| format!("Invalid client_id: {}", error)) +} + +async fn export_grant_session_secret(session: &PubkySession) -> Result { + session + .as_grant() + .ok_or_else(|| "Session is not grant-backed".to_string())? + .export_local_secret() + .await + .ok_or_else(|| "Session secret is unavailable for this session type".to_string()) +} + +fn export_cookie_session_secret(session: &PubkySession) -> Result { + session + .as_cookie() + .ok_or_else(|| "Session is not cookie-backed".to_string())? + .export_secret() + .ok_or_else(|| "Session secret is unavailable for this session type".to_string()) +} // Define the EventListener trait #[uniffi::export(callback_interface)] @@ -145,7 +173,7 @@ pub fn start_internal_event_loop() { } #[uniffi::export] -pub fn delete_file(url: String, secret_key: String) -> Vec { +pub fn delete_file(url: String, secret_key: String, client_id: String) -> Vec { let runtime = TOKIO_RUNTIME.clone(); runtime.block_on(async { let client = get_pubky_client(); @@ -155,7 +183,11 @@ pub fn delete_file(url: String, secret_key: String) -> Vec { }; let signer = client.signer(keypair); - let session = match signer.signin().await { + let client_id = match parse_client_id(&client_id) { + Ok(client_id) => client_id, + Err(error) => return create_response_vector(true, error), + }; + let session = match signer.signin(client_id).await { Ok(session) => session, Err(error) => { return create_response_vector(true, format!("Failed to sign in: {}", error)) @@ -263,8 +295,8 @@ pub fn publish_https(record_name: String, target: String, secret_key: String) -> ) } }; - match client.client().pkarr().publish(&signed_packet, None).await { - Ok(()) => create_response_vector(false, keypair.public_key().z32()), + match client.client().pkarr().publish(&signed_packet).await { + Ok(_) => create_response_vector(false, keypair.public_key().z32()), Err(e) => create_response_vector(true, format!("Failed to publish: {}", e)), } }) @@ -283,8 +315,13 @@ pub fn resolve_https(public_key: String) -> Vec { let client = get_pubky_client(); - match client.client().pkarr().resolve(&public_key).await { - Some(signed_packet) => { + match client + .client() + .pkarr() + .resolve(&public_key, ResolvePolicy::CacheFirst) + .await + { + Ok(signed_packet) => { // Extract HTTPS records from the signed packet let https_records: Vec = signed_packet .all_resource_records() @@ -299,8 +336,8 @@ pub fn resolve_https(public_key: String) -> Vec { "target": https.0.target.to_string(), }); - // Access specific parameters via the typed SVCParam enum - // (simple-dns 0.11 / pkarr 6). Port is key code 3, ALPN is 1. + // Access specific parameters via the typed SVCParam enum. + // Port is key code 3, ALPN is 1. if let Some(SVCParam::Port(port)) = https.0.get_param(3) { https_json["port"] = serde_json::json!(port); } @@ -341,7 +378,7 @@ pub fn resolve_https(public_key: String) -> Vec { create_response_vector(false, json_str) } - None => create_response_vector(true, "No signed packet found".to_string()), + Err(e) => create_response_vector(true, format!("No signed packet found: {}", e)), } }) } @@ -391,6 +428,17 @@ pub fn sign_up( secret_key: String, homeserver: String, signup_token: Option, + client_id: String, +) -> Vec { + sign_up_grant(secret_key, homeserver, signup_token, client_id) +} + +#[uniffi::export] +pub fn sign_up_grant( + secret_key: String, + homeserver: String, + signup_token: Option, + client_id: String, ) -> Vec { let runtime = TOKIO_RUNTIME.clone(); runtime.block_on(async { @@ -411,13 +459,72 @@ pub fn sign_up( }; let signer = client.signer(keypair); + let client_id = match parse_client_id(&client_id) { + Ok(client_id) => client_id, + Err(error) => return create_response_vector(true, error), + }; match signer .signup(&homeserver_public_key, signup_token.as_deref()) .await + { + Ok(()) => { + let session = match signer.signin(client_id).await { + Ok(session) => session, + Err(error) => { + return create_response_vector( + true, + format!("signup succeeded but sign in failed: {}", error), + ) + } + }; + let grant_secret = match export_grant_session_secret(&session).await { + Ok(secret) => secret, + Err(error) => return create_response_vector(true, error), + }; + let session_data = session_to_json_with_grant_secret(&session, &grant_secret); + create_response_vector(false, session_data) + } + Err(error) => create_response_vector(true, format!("signup failure: {}", error)), + } + }) +} + +#[uniffi::export] +#[allow(deprecated)] +pub fn sign_up_cookie( + secret_key: String, + homeserver: String, + signup_token: Option, +) -> Vec { + let runtime = TOKIO_RUNTIME.clone(); + runtime.block_on(async { + let client = get_pubky_client(); + let keypair = match get_keypair_from_secret_key(&secret_key) { + Ok(keypair) => keypair, + Err(error) => return create_response_vector(true, error), + }; + + let homeserver_public_key = match PublicKey::try_from(homeserver.as_str()) { + Ok(key) => key, + Err(error) => { + return create_response_vector( + true, + format!("Invalid homeserver public key: {}", error), + ) + } + }; + + let signer = client.signer(keypair); + match signer + .signup_cookie(&homeserver_public_key, signup_token.as_deref()) + .await { Ok(session) => { - let session_secret = session.export_secret(); - let session_data = session_to_json_with_secret(&session, &session_secret); + let session_secret = match export_cookie_session_secret(&session) { + Ok(secret) => secret, + Err(error) => return create_response_vector(true, error), + }; + let session_data = session_to_json_with_cookie_secret(&session, &session_secret); create_response_vector(false, session_data) } Err(error) => create_response_vector(true, format!("signup failure: {}", error)), @@ -462,7 +569,41 @@ pub fn republish_homeserver(secret_key: String, homeserver: String) -> Vec Vec { +pub fn sign_in(secret_key: String, client_id: String) -> Vec { + sign_in_grant(secret_key, client_id) +} + +#[uniffi::export] +pub fn sign_in_grant(secret_key: String, client_id: String) -> Vec { + let runtime = TOKIO_RUNTIME.clone(); + runtime.block_on(async { + let client = get_pubky_client(); + let keypair = match get_keypair_from_secret_key(&secret_key) { + Ok(keypair) => keypair, + Err(error) => return create_response_vector(true, error), + }; + let signer = client.signer(keypair); + let client_id = match parse_client_id(&client_id) { + Ok(client_id) => client_id, + Err(error) => return create_response_vector(true, error), + }; + match signer.signin(client_id).await { + Ok(session) => { + let grant_secret = match export_grant_session_secret(&session).await { + Ok(secret) => secret, + Err(error) => return create_response_vector(true, error), + }; + let session_data = session_to_json_with_grant_secret(&session, &grant_secret); + create_response_vector(false, session_data) + } + Err(error) => create_response_vector(true, format!("Failed to sign in: {}", error)), + } + }) +} + +#[uniffi::export] +#[allow(deprecated)] +pub fn sign_in_cookie(secret_key: String) -> Vec { let runtime = TOKIO_RUNTIME.clone(); runtime.block_on(async { let client = get_pubky_client(); @@ -471,10 +612,13 @@ pub fn sign_in(secret_key: String) -> Vec { Err(error) => return create_response_vector(true, error), }; let signer = client.signer(keypair); - match signer.signin().await { + match signer.signin_cookie().await { Ok(session) => { - let session_secret = session.export_secret(); - let session_data = session_to_json_with_secret(&session, &session_secret); + let session_secret = match export_cookie_session_secret(&session) { + Ok(secret) => secret, + Err(error) => return create_response_vector(true, error), + }; + let session_data = session_to_json_with_cookie_secret(&session, &session_secret); create_response_vector(false, session_data) } Err(error) => create_response_vector(true, format!("Failed to sign in: {}", error)), @@ -487,12 +631,8 @@ pub fn sign_out(session_secret: String) -> Vec { let runtime = TOKIO_RUNTIME.clone(); runtime.block_on(async { let pubky_client = get_pubky_client(); - let http_client = pubky_client.client().clone(); - // Import the session from the secret token - let session = match pubky::PubkySession::import_secret(&session_secret, Some(http_client)) - .await - { + let session = match pubky_client.restore_session(&session_secret).await { Ok(session) => session, Err(error) => { return create_response_vector(true, format!("Failed to import session: {}", error)) @@ -514,12 +654,7 @@ pub fn revalidate_session(session_secret: String) -> Vec { let runtime = TOKIO_RUNTIME.clone(); runtime.block_on(async { let pubky_client = get_pubky_client(); - let http_client = pubky_client.client().clone(); - - // Import the session from the secret token - let session = match pubky::PubkySession::import_secret(&session_secret, Some(http_client)) - .await - { + let session = match pubky_client.restore_session(&session_secret).await { Ok(session) => session, Err(error) => { return create_response_vector(true, format!("Failed to import session: {}", error)) @@ -529,10 +664,21 @@ pub fn revalidate_session(session_secret: String) -> Vec { // Revalidate returns the session info if still valid, None if expired match session.revalidate().await { Ok(Some(_session_info)) => { - let session_secret = session.export_secret(); + let grant_secret = match export_grant_session_secret(&session).await { + Ok(secret) => secret, + Err(_) => match export_cookie_session_secret(&session) { + Ok(secret) => { + return create_response_vector( + false, + session_to_json_with_cookie_secret(&session, &secret), + ) + } + Err(error) => return create_response_vector(true, error), + }, + }; create_response_vector( false, - session_to_json_with_secret(&session, &session_secret), + session_to_json_with_grant_secret(&session, &grant_secret), ) } Ok(None) => create_response_vector( @@ -550,7 +696,7 @@ pub fn revalidate_session(session_secret: String) -> Vec { // To use put, you must first sign in to get a session, then use the session storage. // This function is kept for backward compatibility but requires a secret_key to authenticate. #[uniffi::export] -pub fn put(url: String, content: String, secret_key: String) -> Vec { +pub fn put(url: String, content: String, secret_key: String, client_id: String) -> Vec { let runtime = TOKIO_RUNTIME.clone(); let content_bytes = content.into_bytes(); runtime.block_on(async { @@ -561,7 +707,11 @@ pub fn put(url: String, content: String, secret_key: String) -> Vec { }; let signer = client.signer(keypair); - let session = match signer.signin().await { + let client_id = match parse_client_id(&client_id) { + Ok(client_id) => client_id, + Err(error) => return create_response_vector(true, error), + }; + let session = match signer.signin(client_id).await { Ok(session) => session, Err(error) => { return create_response_vector(true, format!("Failed to sign in: {}", error)) @@ -632,8 +782,13 @@ pub fn resolve(public_key: String) -> Vec { }; let client = get_pubky_client(); - match client.client().pkarr().resolve(&public_key).await { - Some(signed_packet) => { + match client + .client() + .pkarr() + .resolve(&public_key, ResolvePolicy::CacheFirst) + .await + { + Ok(signed_packet) => { let all_records: Vec<_> = signed_packet.all_resource_records().collect(); // Convert each ResourceRecord to a JSON value let json_records: Vec = all_records @@ -663,7 +818,7 @@ pub fn resolve(public_key: String) -> Vec { create_response_vector(false, json_str) } - None => create_response_vector(true, "No signed packet found".to_string()), + Err(e) => create_response_vector(true, format!("No signed packet found: {}", e)), } }) } @@ -708,12 +863,10 @@ pub fn publish(record_name: String, record_content: String, secret_key: String) )); match SignedPacket::new(&keypair, &packet.answers, Timestamp::now()) { - Ok(signed_packet) => { - match client.client().pkarr().publish(&signed_packet, None).await { - Ok(()) => create_response_vector(false, keypair.public_key().z32()), - Err(e) => create_response_vector(true, format!("Failed to publish: {}", e)), - } - } + Ok(signed_packet) => match client.client().pkarr().publish(&signed_packet).await { + Ok(_) => create_response_vector(false, keypair.public_key().z32()), + Err(e) => create_response_vector(true, format!("Failed to publish: {}", e)), + }, Err(e) => { create_response_vector(true, format!("Failed to create signed packet: {}", e)) } @@ -813,6 +966,18 @@ pub fn parse_auth_url(url: String) -> Vec { } } +#[uniffi::export] +pub fn parse_deep_link(url: String) -> Vec { + let parsed_details = match parse_pubky_deep_link(&url) { + Ok(details) => details, + Err(error) => return create_response_vector(true, error), + }; + match pubky_deep_link_details_to_json(&parsed_details) { + Ok(json) => create_response_vector(false, json), + Err(error) => create_response_vector(true, error), + } +} + #[uniffi::export] pub fn create_recovery_file(secret_key: String, passphrase: String) -> Vec { if secret_key.is_empty() || passphrase.is_empty() { @@ -870,10 +1035,13 @@ pub fn get_homeserver(pubky: String) -> Vec { }; match client.get_homeserver_of(&public_key).await { - Some(homeserver) => create_response_vector(false, homeserver.z32()), - None => { + Ok(Some(homeserver)) => create_response_vector(false, homeserver.z32()), + Ok(None) => { create_response_vector(true, "No homeserver found for this public key".to_string()) } + Err(error) => { + create_response_vector(true, format!("Failed to get homeserver: {}", error)) + } } }) } @@ -915,7 +1083,12 @@ pub fn validate_mnemonic_phrase(mnemonic_phrase: String) -> Vec { } #[uniffi::export] -pub fn start_auth_flow(capabilities_str: String) -> Vec { +pub fn start_auth_flow(capabilities_str: String, client_id: String) -> Vec { + start_grant_auth_flow(capabilities_str, client_id) +} + +#[uniffi::export] +pub fn start_grant_auth_flow(capabilities_str: String, client_id: String) -> Vec { let runtime = TOKIO_RUNTIME.clone(); runtime.block_on(async { let caps = match Capabilities::try_from(capabilities_str.as_str()) { @@ -925,8 +1098,12 @@ pub fn start_auth_flow(capabilities_str: String) -> Vec { let pubky_client = get_pubky_client(); let http_client = pubky_client.client().clone(); + let client_id = match parse_client_id(&client_id) { + Ok(client_id) => client_id, + Err(error) => return create_response_vector(true, error), + }; - let flow = match PubkyAuthFlow::builder(&caps, AuthFlowKind::SignIn) + let flow = match PubkyGrantAuthFlow::builder(&caps, AuthFlowKind::signin(), client_id) .client(http_client) .start() { @@ -938,7 +1115,7 @@ pub fn start_auth_flow(capabilities_str: String) -> Vec { let auth_url = flow.authorization_url().to_string(); - let mut guard = AUTH_FLOW.lock().unwrap(); + let mut guard = GRANT_AUTH_FLOW.lock().unwrap(); *guard = Some(flow); create_response_vector(false, auth_url) @@ -947,10 +1124,15 @@ pub fn start_auth_flow(capabilities_str: String) -> Vec { #[uniffi::export] pub fn await_auth_approval() -> Vec { + await_grant_auth_approval() +} + +#[uniffi::export] +pub fn await_grant_auth_approval() -> Vec { let runtime = TOKIO_RUNTIME.clone(); runtime.block_on(async { let flow = { - let mut guard = AUTH_FLOW.lock().unwrap(); + let mut guard = GRANT_AUTH_FLOW.lock().unwrap(); guard.take() }; @@ -961,8 +1143,11 @@ pub fn await_auth_approval() -> Vec { match flow.await_approval().await { Ok(session) => { - let session_secret = session.export_secret(); - let session_data = session_to_json_with_secret(&session, &session_secret); + let grant_secret = match export_grant_session_secret(&session).await { + Ok(secret) => secret, + Err(error) => return create_response_vector(true, error), + }; + let session_data = session_to_json_with_grant_secret(&session, &grant_secret); create_response_vector(false, session_data) } Err(e) => create_response_vector(true, format!("Auth approval failed: {}", e)), @@ -971,14 +1156,73 @@ pub fn await_auth_approval() -> Vec { } #[uniffi::export] -pub fn put_with_session(url: String, content: String, session_secret: String) -> Vec { +#[allow(deprecated)] +pub fn start_cookie_auth_flow(capabilities_str: String) -> Vec { let runtime = TOKIO_RUNTIME.clone(); - let content_bytes = content.into_bytes(); runtime.block_on(async { + let caps = match Capabilities::try_from(capabilities_str.as_str()) { + Ok(caps) => caps, + Err(e) => return create_response_vector(true, format!("Invalid capabilities: {}", e)), + }; + let pubky_client = get_pubky_client(); let http_client = pubky_client.client().clone(); - let session = match PubkySession::import_secret(&session_secret, Some(http_client)).await { + let flow = match PubkyCookieAuthFlow::builder(&caps, AuthFlowKind::signin()) + .client(http_client) + .start() + { + Ok(flow) => flow, + Err(e) => { + return create_response_vector(true, format!("Failed to start auth flow: {}", e)) + } + }; + + let auth_url = flow.authorization_url().to_string(); + + let mut guard = COOKIE_AUTH_FLOW.lock().unwrap(); + *guard = Some(flow); + + create_response_vector(false, auth_url) + }) +} + +#[uniffi::export] +#[allow(deprecated)] +pub fn await_cookie_auth_approval() -> Vec { + let runtime = TOKIO_RUNTIME.clone(); + runtime.block_on(async { + let flow = { + let mut guard = COOKIE_AUTH_FLOW.lock().unwrap(); + guard.take() + }; + + let flow = match flow { + Some(f) => f, + None => return create_response_vector(true, "No auth flow in progress".to_string()), + }; + + match flow.await_approval().await { + Ok(session) => { + let session_secret = match export_cookie_session_secret(&session) { + Ok(secret) => secret, + Err(error) => return create_response_vector(true, error), + }; + let session_data = session_to_json_with_cookie_secret(&session, &session_secret); + create_response_vector(false, session_data) + } + Err(e) => create_response_vector(true, format!("Auth approval failed: {}", e)), + } + }) +} + +#[uniffi::export] +pub fn put_with_session(url: String, content: String, session_secret: String) -> Vec { + let runtime = TOKIO_RUNTIME.clone(); + let content_bytes = content.into_bytes(); + runtime.block_on(async { + let pubky_client = get_pubky_client(); + let session = match pubky_client.restore_session(&session_secret).await { Ok(s) => s, Err(e) => { return create_response_vector(true, format!("Failed to import session: {}", e)) @@ -1004,9 +1248,7 @@ pub fn delete_with_session(url: String, session_secret: String) -> Vec { let runtime = TOKIO_RUNTIME.clone(); runtime.block_on(async { let pubky_client = get_pubky_client(); - let http_client = pubky_client.client().clone(); - - let session = match PubkySession::import_secret(&session_secret, Some(http_client)).await { + let session = match pubky_client.restore_session(&session_secret).await { Ok(s) => s, Err(e) => { return create_response_vector(true, format!("Failed to import session: {}", e)) diff --git a/src/tests.rs b/src/tests.rs index b0bc339..13b1ed5 100644 --- a/src/tests.rs +++ b/src/tests.rs @@ -2,12 +2,12 @@ mod tests { use crate::generate_keypair; use crate::*; - use base64; use pubky::Keypair; use std::string::ToString; use tokio; const HOMESERVER: &str = "ufibwbmed6jeq9k4p583go95wofakh9fwpp4k734trq79pd9u1uy"; + const CLIENT_ID: &str = "pubky-core-ffi.test"; fn get_test_setup() -> (Keypair, String, String) { let keypair = generate_keypair(); @@ -16,6 +16,26 @@ mod tests { (keypair, secret_key, homeserver) } + fn signup_token() -> Option { + std::env::var("PUBKY_TEST_SIGNUP_TOKEN") + .ok() + .filter(|token| !token.is_empty()) + } + + fn sign_up_for_test(secret_key: String, homeserver: String) -> Option> { + let token = signup_token(); + let result = sign_up(secret_key, homeserver, token, CLIENT_ID.to_string()); + if result[0] == "true" && result[1].contains("Token required") { + eprintln!( + "Skipping signup-dependent test: homeserver requires PUBKY_TEST_SIGNUP_TOKEN" + ); + return None; + } + + assert_eq!(result[0], "false", "Sign up result: {:?}", result); + Some(result) + } + // Test keypair generation #[test] fn test_put_and_get_and_list() { @@ -25,12 +45,18 @@ mod tests { let url = format!("pubky://{}/pub/test.com/testfile", public_key); let content = "test content".to_string(); - let _sign_up_result = sign_up(secret_key.clone(), homeserver, None); - // assert_eq!(sign_up_result[0], "false"); + if sign_up_for_test(secret_key.clone(), homeserver).is_none() { + return; + } let inner_url = url.clone(); - let put_result = put(url.clone(), content.clone(), secret_key.clone()); + let put_result = put( + url.clone(), + content.clone(), + secret_key.clone(), + CLIENT_ID.to_string(), + ); assert_eq!(put_result[0], "false"); // Add a small delay to ensure the put operation completes @@ -59,7 +85,7 @@ mod tests { } // Guard the bare-z32 public key output contract (see README "String - // Contracts"). pubky 0.9.x renders PublicKey::to_string() as + // Contracts"). pubky 0.10.x renders PublicKey::to_string() as // "pubky" (57 chars); FFI outputs must stay bare z32 (52 chars) or // downstream pubky:// URL building breaks. We assert on length rather // than a "pubky" prefix because all five prefix letters are in the @@ -176,16 +202,21 @@ mod tests { let (_, secret_key, homeserver) = get_test_setup(); // First sign up - let sign_up_result = sign_up(secret_key.clone(), homeserver, None); - println!("Sign up result: {:?}", sign_up_result); - assert_eq!(sign_up_result[0], "false"); + if sign_up_for_test(secret_key.clone(), homeserver).is_none() { + return; + } // Test sign in - let sign_in_result = sign_in(secret_key.clone()); + let sign_in_result = sign_in(secret_key.clone(), CLIENT_ID.to_string()); assert_eq!(sign_in_result[0], "false"); + let session: serde_json::Value = serde_json::from_str(&sign_in_result[1]).unwrap(); + let grant_secret = session["grant_secret"] + .as_str() + .expect("grant_secret missing") + .to_string(); // Test sign out - let sign_out_result = sign_out(secret_key); + let sign_out_result = sign_out(grant_secret); assert_eq!(sign_out_result[0], "false"); } @@ -195,23 +226,28 @@ mod tests { let (keypair, secret_key, homeserver) = get_test_setup(); // First sign up - let sign_up_result = sign_up(secret_key.clone(), homeserver, None); - println!("Sign up result: {:?}", sign_up_result); - assert_eq!(sign_up_result[0], "false"); + if sign_up_for_test(secret_key.clone(), homeserver).is_none() { + return; + } let public_key = keypair.public_key().z32(); let url = format!("pubky://{}/pub/test.com/testfile", public_key); let content = "test content".to_string(); // Put some content first - let put_result = put(url.clone(), content, secret_key.clone()); + let put_result = put( + url.clone(), + content, + secret_key.clone(), + CLIENT_ID.to_string(), + ); println!("Put result: {:?}", put_result); assert_eq!(put_result[0], "false"); std::thread::sleep(std::time::Duration::from_secs(2)); // Test delete - let delete_result = delete_file(url.clone(), secret_key.clone()); + let delete_result = delete_file(url.clone(), secret_key.clone(), CLIENT_ID.to_string()); println!("Delete result: {:?}", delete_result); assert_eq!(delete_result[0], "false"); assert_eq!(delete_result[1], "Deleted successfully"); @@ -274,6 +310,21 @@ mod tests { assert!(json.get("homeserver").is_none()); } + // Test auth URL parsing (pubky 0.10 Grant signin format) + #[test] + fn test_parse_auth_url_signin_grant_host() { + let client_pubky = "ufibwbmed6jeq9k4p583go95wofakh9fwpp4k734trq79pd9u1uy"; + let test_url = format!("pubkyauth://signin_grant?caps=/pub/pubky.app/:rw&secret=U55XnoH6vsMCpx1pxHtt8fReVg4Brvu9C0gUBuw-Jkw&relay=https://httprelay.pubky.app/inbox&cid=pubky-ring&cpk={client_pubky}"); + let result = parse_auth_url(test_url.to_string()); + assert_eq!(result[0], "false"); + + let json: serde_json::Value = serde_json::from_str(&result[1]).unwrap(); + assert_eq!(json["kind"], "signin_grant"); + assert_eq!(json["client_id"], "pubky-ring"); + assert_eq!(json["client_public_key"], client_pubky); + assert!(json.get("homeserver").is_none()); + } + // Test auth URL parsing (pubky 0.9.1 signup format with hs/st params) #[test] fn test_parse_auth_url_signup() { @@ -298,6 +349,67 @@ mod tests { assert!(json.get("signup_token").is_none()); } + // Test auth URL parsing (pubky 0.10 Grant signup format with hs/st params) + #[test] + fn test_parse_auth_url_signup_grant() { + let client_pubky = "ufibwbmed6jeq9k4p583go95wofakh9fwpp4k734trq79pd9u1uy"; + let test_url = format!("pubkyauth://signup_grant?caps=/pub/pubky.app/:rw&secret=U55XnoH6vsMCpx1pxHtt8fReVg4Brvu9C0gUBuw-Jkw&relay=https://httprelay.pubky.app/inbox&hs=ufibwbmed6jeq9k4p583go95wofakh9fwpp4k734trq79pd9u1uy&st=ABCD-1234&cid=pubky-ring&cpk={client_pubky}"); + let result = parse_auth_url(test_url.to_string()); + assert_eq!(result[0], "false"); + + let json: serde_json::Value = serde_json::from_str(&result[1]).unwrap(); + assert_eq!(json["kind"], "signup_grant"); + assert_eq!( + json["homeserver"], + "ufibwbmed6jeq9k4p583go95wofakh9fwpp4k734trq79pd9u1uy" + ); + assert_eq!(json["signup_token"], "ABCD-1234"); + assert_eq!(json["client_id"], "pubky-ring"); + assert_eq!(json["client_public_key"], client_pubky); + } + + #[test] + fn test_parse_auth_url_signin_grant_requires_client_pubky() { + let test_url = "pubkyauth://signin_grant?caps=/pub/pubky.app/:rw&secret=U55XnoH6vsMCpx1pxHtt8fReVg4Brvu9C0gUBuw-Jkw&relay=https://httprelay.pubky.app/inbox&cid=pubky-ring"; + let result = parse_auth_url(test_url.to_string()); + assert_eq!(result[0], "true"); + assert!(result[1].contains("cpk"), "unexpected error: {}", result[1]); + } + + #[test] + fn test_parse_deep_link_direct_signup() { + let test_url = + "pubkyauth://direct_signup?hs=ufibwbmed6jeq9k4p583go95wofakh9fwpp4k734trq79pd9u1uy&st=ABCD-1234"; + let result = parse_deep_link(test_url.to_string()); + assert_eq!(result[0], "false"); + + let json: serde_json::Value = serde_json::from_str(&result[1]).unwrap(); + assert_eq!(json["scheme"], "pubkyauth"); + assert_eq!(json["kind"], "direct_signup"); + assert_eq!( + json["homeserver"], + "ufibwbmed6jeq9k4p583go95wofakh9fwpp4k734trq79pd9u1uy" + ); + assert_eq!(json["signup_token"], "ABCD-1234"); + assert!(json.get("relay").is_none()); + } + + #[test] + fn test_parse_deep_link_secret_export() { + let test_url = + "pubkyring://secret_export?secret=U55XnoH6vsMCpx1pxHtt8fReVg4Brvu9C0gUBuw-Jkw"; + let result = parse_deep_link(test_url.to_string()); + assert_eq!(result[0], "false"); + + let json: serde_json::Value = serde_json::from_str(&result[1]).unwrap(); + assert_eq!(json["scheme"], "pubkyring"); + assert_eq!(json["kind"], "secret_export"); + assert_eq!( + json["secret"], + "U55XnoH6vsMCpx1pxHtt8fReVg4Brvu9C0gUBuw-Jkw" + ); + } + // Unknown intents must be rejected, not silently treated as signin #[test] fn test_parse_auth_url_unknown_intent_rejected() { @@ -305,17 +417,28 @@ mod tests { let result = parse_auth_url(typo_url.to_string()); assert_eq!(result[0], "true"); assert!( - result[1].contains("Invalid auth URL intent"), + result[1].contains("Invalid intent"), "unexpected error: {}", result[1] ); } + #[test] + fn test_auth_strategy_entrypoints_are_explicit() { + let cookie_result = await_cookie_auth_approval(); + assert_eq!(cookie_result[0], "true"); + assert_eq!(cookie_result[1], "No auth flow in progress"); + + let grant_result = await_grant_auth_approval(); + assert_eq!(grant_result[0], "true"); + assert_eq!(grant_result[1], "No auth flow in progress"); + } + // Test error cases #[test] fn test_error_cases() { // Test invalid secret key - let sign_in_result = sign_in("invalid_key".to_string()); + let sign_in_result = sign_in("invalid_key".to_string(), CLIENT_ID.to_string()); assert_eq!(sign_in_result[0], "true"); // Test invalid URL @@ -336,9 +459,9 @@ mod tests { let (_, secret_key, homeserver) = get_test_setup(); // First sign up to ensure the user exists - let sign_up_result = sign_up(secret_key.clone(), homeserver.clone(), None); - println!("Sign up result: {:?}", sign_up_result); - assert_eq!(sign_up_result[0], "false"); + if sign_up_for_test(secret_key.clone(), homeserver.clone()).is_none() { + return; + } // Test republish homeserver let republish_result = republish_homeserver(secret_key, homeserver); diff --git a/src/types.rs b/src/types.rs index b8f6048..ec5ee95 100644 --- a/src/types.rs +++ b/src/types.rs @@ -11,8 +11,8 @@ pub struct PubkyAuthDetails { pub relay: String, pub capabilities: Vec, pub secret: String, - /// "signin" or "signup". Legacy URLs (`pubkyauth:///?...`) have no intent - /// host and are treated as "signin", matching pubky 0.9.1's own parser. + /// Auth URL intent. Legacy URLs (`pubkyauth:///?...`) have no intent host + /// and are treated as "signin". pub kind: String, /// Homeserver public key (bare z-base32) from the `hs` param of signup links. #[serde(skip_serializing_if = "Option::is_none")] @@ -20,4 +20,51 @@ pub struct PubkyAuthDetails { /// Signup token from the `st` param of signup links. #[serde(skip_serializing_if = "Option::is_none")] pub signup_token: Option, + /// Grant client id from the `cid` param of grant auth links. + #[serde(skip_serializing_if = "Option::is_none")] + pub client_id: Option, + /// Grant client public key from the `cpk` param of grant auth links. + #[serde(skip_serializing_if = "Option::is_none")] + pub client_public_key: Option, + /// x-callback-url source app name. + #[serde(skip_serializing_if = "Option::is_none")] + pub x_source: Option, + /// x-callback-url success callback. + #[serde(skip_serializing_if = "Option::is_none")] + pub x_success: Option, + /// x-callback-url error callback. + #[serde(skip_serializing_if = "Option::is_none")] + pub x_error: Option, + /// x-callback-url cancel callback. + #[serde(skip_serializing_if = "Option::is_none")] + pub x_cancel: Option, +} + +#[derive(Debug, Serialize)] +pub struct PubkyDeepLinkDetails { + pub scheme: String, + pub kind: String, + pub url: String, + #[serde(skip_serializing_if = "Option::is_none")] + pub relay: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub capabilities: Option>, + #[serde(skip_serializing_if = "Option::is_none")] + pub secret: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub homeserver: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub signup_token: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub client_id: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub client_public_key: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub x_source: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub x_success: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub x_error: Option, + #[serde(skip_serializing_if = "Option::is_none")] + pub x_cancel: Option, } diff --git a/src/utils.rs b/src/utils.rs index 9450e5c..6e3425a 100644 --- a/src/utils.rs +++ b/src/utils.rs @@ -10,7 +10,7 @@ use std::error::Error; use std::net::{Ipv4Addr, Ipv6Addr}; // Serialize a single SVCB/HTTPS service parameter into JSON. In simple-dns 0.11 -// (pkarr 6) params are a typed `SVCParam` enum rather than raw key/value bytes. +// (via pkarr) params are a typed `SVCParam` enum rather than raw key/value bytes. fn svc_param_to_json(param: &SVCParam) -> serde_json::Value { match param { SVCParam::Mandatory(keys) => json!(keys.iter().copied().collect::>()), @@ -227,7 +227,18 @@ pub fn session_to_json(session: &PubkySession) -> String { serde_json::to_string(&json_obj).unwrap_or_else(|e| format!("Failed to serialize JSON: {}", e)) } -pub fn session_to_json_with_secret(session: &PubkySession, session_secret: &str) -> String { +pub fn session_to_json_with_grant_secret(session: &PubkySession, grant_secret: &str) -> String { + let info = session.info(); + let json_obj = json!({ + "pubky": info.public_key().z32(), + "capabilities": info.capabilities().iter().map(|c| c.to_string()).collect::>(), + "grant_secret": grant_secret, + }); + + serde_json::to_string(&json_obj).unwrap_or_else(|e| format!("Failed to serialize JSON: {}", e)) +} + +pub fn session_to_json_with_cookie_secret(session: &PubkySession, session_secret: &str) -> String { let info = session.info(); let json_obj = json!({ "pubky": info.public_key().z32(),