Rough working login page (#417)

This commit is contained in:
Firstyear 2021-04-24 10:53:19 +10:00 committed by GitHub
parent f97a3bf596
commit 8da89613e3
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
19 changed files with 826 additions and 318 deletions

119
Cargo.lock generated
View file

@ -175,19 +175,19 @@ dependencies = [
[[package]]
name = "async-io"
version = "1.3.1"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9315f8f07556761c3e48fec2e6b276004acf426e6dc068b2c2251854d65ee0fd"
checksum = "fcb9af4888a70ad78ecb5efcb0ba95d66a3cf54a88b62ae81559954c7588c7a2"
dependencies = [
"concurrent-queue",
"fastrand",
"futures-lite",
"libc",
"log",
"nb-connect",
"once_cell",
"parking",
"polling",
"socket2",
"vec-arena",
"waker-fn",
"winapi",
@ -195,9 +195,9 @@ dependencies = [
[[package]]
name = "async-lock"
version = "2.3.0"
version = "2.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1996609732bde4a9988bc42125f55f2af5f3c36370e27c778d5191a4a1b63bfb"
checksum = "e6a8ea61bf9947a1007c5cada31e647dbc77b103c679858150003ba697ea798b"
dependencies = [
"event-listener",
]
@ -309,9 +309,9 @@ checksum = "e91831deabf0d6d7ec49552e489aed63b7456a7a3c46cff62adad428110b0af0"
[[package]]
name = "async-trait"
version = "0.1.48"
version = "0.1.50"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36ea56748e10732c49404c153638a15ec3d6211ec5ff35d9bb20e13b93576adf"
checksum = "0b98e84bbb4cbcdd97da190ba0c58a1bb0de2c1fdf67d159e192ed766aeca722"
dependencies = [
"proc-macro2",
"quote",
@ -549,9 +549,9 @@ checksum = "7b02b629252fe8ef6460461409564e2c21d0c8e77e0944f3d189ff06c4e932ad"
[[package]]
name = "cast"
version = "0.2.3"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b9434b9a5aa1450faa3f9cb14ea0e8c53bb5d2b3c1bfd1ab4fc03e9f33fbfb0"
checksum = "cc38c385bfd7e444464011bb24820f40dd1c76bcdfa1b78611cb7c2e5cafab75"
dependencies = [
"rustc_version",
]
@ -659,9 +659,9 @@ dependencies = [
[[package]]
name = "const_fn"
version = "0.4.6"
version = "0.4.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "076a6803b0dacd6a88cfe64deba628b01533ff5ef265687e6938280c1afd0a28"
checksum = "402da840495de3f976eaefc3485b7f5eb5b0bf9761f9a47be27fe975b3b8c2ec"
[[package]]
name = "constant_time_eq"
@ -1523,9 +1523,9 @@ dependencies = [
[[package]]
name = "http-types"
version = "2.10.0"
version = "2.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32613ebb139d1d430ef5783676f84abfa06fc5f2b4b5a25220cdeeff7e16ef5c"
checksum = "686f600cccfb9d96c45550bac47b592bc88191a0dd965e9d55848880c2c5a45f"
dependencies = [
"anyhow",
"async-channel",
@ -1545,15 +1545,15 @@ dependencies = [
[[package]]
name = "httparse"
version = "1.3.6"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc35c995b9d93ec174cf9a27d425c7892722101e14993cd227fdb51d70cf9589"
checksum = "4a1ce40d6fc9764887c2fdc7305c3dcc429ba11ff981c1509416afd5697e4437"
[[package]]
name = "httpdate"
version = "0.3.2"
version = "1.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "494b4d60369511e7dea41cf646832512a94e542f68bb9c49e54518e0f468eb47"
checksum = "05842d0d43232b23ccb7060ecb0f0626922c21f30012e97b767b30afd4a5d4b9"
[[package]]
name = "humantime"
@ -1563,9 +1563,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
[[package]]
name = "hyper"
version = "0.14.5"
version = "0.14.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bf09f61b52cfcf4c00de50df88ae423d6c02354e385a86341133b5338630ad1"
checksum = "5f006b8784cfb01fe7aa9c46f5f5cd4cf5c85a8c612a0653ec97642979062665"
dependencies = [
"bytes",
"futures-channel",
@ -1617,9 +1617,9 @@ dependencies = [
[[package]]
name = "idna"
version = "0.2.2"
version = "0.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21"
checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
dependencies = [
"matches",
"unicode-bidi",
@ -1856,9 +1856,12 @@ name = "kanidmd_web_ui"
version = "1.1.0-alpha.4"
dependencies = [
"anyhow",
"js-sys",
"kanidm_proto",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"webauthn-rs",
"yew",
]
@ -1901,9 +1904,9 @@ dependencies = [
[[package]]
name = "lexical-core"
version = "0.7.5"
version = "0.7.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "21f866863575d0e1d654fbeeabdc927292fdf862873dc3c96c6f753357e13374"
checksum = "6607c62aa161d23d17a9072cc5da0be67cdfc89d3afb1e8d9c842bebc2525ffe"
dependencies = [
"arrayvec",
"bitflags",
@ -1937,9 +1940,9 @@ dependencies = [
[[package]]
name = "libsqlite3-sys"
version = "0.22.0"
version = "0.22.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2f6332d94daa84478d55a6aa9dbb3b305ed6500fb0cb9400cb9e1525d0e0e188"
checksum = "19cb1effde5f834799ac5e5ef0e40d45027cd74f271b1de786ba8abb30e2164d"
dependencies = [
"pkg-config",
"vcpkg",
@ -2060,16 +2063,6 @@ dependencies = [
"tempfile",
]
[[package]]
name = "nb-connect"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a19900e7eee95eb2b3c2e26d12a874cc80aaf750e31be6fcbe743ead369fa45d"
dependencies = [
"libc",
"socket2",
]
[[package]]
name = "nom"
version = "2.2.1"
@ -2297,18 +2290,18 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
[[package]]
name = "pin-project"
version = "1.0.6"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bc174859768806e91ae575187ada95c91a29e96a98dc5d2cd9a1fed039501ba6"
checksum = "c7509cc106041c40a4518d2af7a61530e1eed0e6285296a3d8c5472806ccc4a4"
dependencies = [
"pin-project-internal",
]
[[package]]
name = "pin-project-internal"
version = "1.0.6"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a490329918e856ed1b083f244e3bfe2d8c4f336407e4ea9e1a9f479ff09049e5"
checksum = "48c950132583b500556b1efd71d45b319029f2b71518d979fcc208e16b42426f"
dependencies = [
"proc-macro2",
"quote",
@ -2611,9 +2604,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.2.5"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9"
checksum = "8270314b5ccceb518e7e578952f0b72b88222d02e8f77f5ecf7abbb673539041"
dependencies = [
"bitflags",
]
@ -2665,9 +2658,9 @@ dependencies = [
[[package]]
name = "reqwest"
version = "0.11.2"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bf12057f289428dbf5c591c74bf10392e4a8003f993405a902f20117019022d4"
checksum = "2296f2fac53979e8ccbc4a1136b25dcefd37be9ed7e4a1f6b05a6029c84ff124"
dependencies = [
"base64 0.13.0",
"bytes",
@ -2740,9 +2733,9 @@ checksum = "5d79b4b604167921892e84afbbaad9d5ad74e091bf6c511d9dbfb0593f09fabd"
[[package]]
name = "rusqlite"
version = "0.25.0"
version = "0.25.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48381bf52627e7b0e02c4c0e4c0c88fc1cf2228a2eb7461d9499b1372399f1da"
checksum = "fbc783b7ddae608338003bac1fa00b6786a75a9675fbd8e87243ecfdea3f6ed2"
dependencies = [
"bitflags",
"fallible-iterator",
@ -2764,9 +2757,9 @@ dependencies = [
[[package]]
name = "rustls"
version = "0.19.0"
version = "0.19.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "064fd21ff87c6e87ed4506e68beb42459caa4a0e2eb144932e6776768556980b"
checksum = "35edb675feee39aec9c99fa5ff985081995a06d594114ae14cbe797ad7b7a6d7"
dependencies = [
"base64 0.13.0",
"log",
@ -3007,9 +3000,9 @@ dependencies = [
[[package]]
name = "slab"
version = "0.4.2"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8"
checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527"
[[package]]
name = "smallvec"
@ -3171,9 +3164,9 @@ checksum = "45f6ee7c7b87caf59549e9fe45d6a69c75c8019e79e212a835c5da0e92f0ba08"
[[package]]
name = "syn"
version = "1.0.69"
version = "1.0.70"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "48fe99c6bd8b1cc636890bcc071842de909d902c81ac7dab53ba33c421ab8ffb"
checksum = "b9505f307c872bab8eb46f77ae357c8eba1fdacead58ee5a850116b1d7f82883"
dependencies = [
"proc-macro2",
"quote",
@ -3363,9 +3356,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
[[package]]
name = "tokio"
version = "1.4.0"
version = "1.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "134af885d758d645f0f0505c9a8b3f9bf8a348fd822e112ab5248138348f1722"
checksum = "83f0c8e7c0addab50b663055baf787d0af7f413a46e6e7fb9559a4e4db7137a5"
dependencies = [
"autocfg",
"bytes",
@ -3416,9 +3409,9 @@ dependencies = [
[[package]]
name = "tokio-util"
version = "0.6.5"
version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5143d049e85af7fbc36f5454d990e62c2df705b3589f123b71f441b6b59f443f"
checksum = "940a12c99365c31ea8dd9ba04ec1be183ffe4920102bb7122c2f515437601e8e"
dependencies = [
"bytes",
"futures-core",
@ -3572,9 +3565,9 @@ dependencies = [
[[package]]
name = "vcpkg"
version = "0.2.11"
version = "0.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b00bca6106a5e23f3eee943593759b7fcddb00554332e856d990c893966879fb"
checksum = "cbdbff6266a24120518560b5dc983096efb98462e51d0d68169895b237be3e5d"
[[package]]
name = "vec-arena"
@ -3713,9 +3706,9 @@ dependencies = [
[[package]]
name = "webauthn-authenticator-rs"
version = "0.3.0-alpha.7"
version = "0.3.0-alpha.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "03ef444688ad36c65b46b31b095982ed027f67cc4181582f67a0d78c6defa87b"
checksum = "5fea4cabcc05835a309f938c4699a820a4f11c228d94d466e60fd95c7bf57d4e"
dependencies = [
"authenticator",
"log",
@ -3861,18 +3854,18 @@ dependencies = [
[[package]]
name = "zeroize"
version = "1.2.0"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "81a974bcdd357f0dca4d41677db03436324d45a4c9ed2d0b873a5a360ce41c36"
checksum = "4756f7db3f7b5574938c3eb1c117038b8e07f95ee6718c0efad4ac21508f1efd"
dependencies = [
"zeroize_derive",
]
[[package]]
name = "zeroize_derive"
version = "1.0.1"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c3f369ddb18862aba61aa49bf31e74d29f0f162dec753063200e1dc084345d16"
checksum = "a2c1e130bebaeab2f23886bf9acbaca14b092408c452543c857f66399cd6dab1"
dependencies = [
"proc-macro2",
"quote",

View file

@ -149,8 +149,10 @@ You will also need a config file in the volume named `server.toml` (Within the c
# Defaults to "default"
# log_level = "default"
#
# The origin for webauthn. This is the url to the server minus port information
origin = "https://idm.example.com"
# The origin for webauthn. This is the url to the server, with the port included if
# it is non-standard (any port except 443)
# origin = "https://idm.example.com"
origin = "https://idm.example.com:8443"
Then you can setup the initial admin account and initialise the database into your volume.

View file

@ -29,4 +29,4 @@ kanidm = { path = "../kanidmd" }
futures = "0.3"
async-std = "1.6"
webauthn-authenticator-rs = "0.3.0-alpha.7"
webauthn-authenticator-rs = "0.3.0-alpha.8"

View file

@ -281,10 +281,7 @@ impl KanidmClientBuilder {
let uri = Url::parse(&address).expect("can not fail");
#[allow(clippy::expect_used)]
let origin = uri
.host_str()
.map(|h| format!("{}://{}", uri.scheme(), h))
.expect("can not fail");
let origin = uri.origin().unicode_serialization();
Ok(KanidmAsyncClient {
client,

View file

@ -43,7 +43,8 @@ qrcode = { version = "0.12", default-features = false }
zxcvbn = "2.0"
webauthn-authenticator-rs = "^0.3.0-alpha.7"
webauthn-authenticator-rs = "^0.3.0-alpha.8"
# webauthn-authenticator-rs = { path = "../../webauthn-authenticator-rs/" }
[build-dependencies]
structopt = { version = "0.3", default-features = false }

View file

@ -92,7 +92,7 @@ simd_support = [ "concread/simd_support" ]
[dev-dependencies]
criterion = { version = "0.3", features = ["html_reports"] }
# For testing webauthn
webauthn-authenticator-rs = "0.3.0-alpha.7"
webauthn-authenticator-rs = "0.3.0-alpha.8"
[dev-dependencies.cargo-husky]
version = "1"

View file

@ -6,4 +6,4 @@ tls_chain = "../insecure/chain.pem"
tls_key = "../insecure/key.pem"
# log_level = "fulltrace"
log_level = "perffull"
origin = "https://idm.example.com"
origin = "https://idm.example.com:8443"

View file

@ -171,6 +171,7 @@ async fn index_view(_req: tide::Request<AppState>) -> tide::Result {
<script src="/pkg/external/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo"></script>
<script src="/pkg/external/popper.min.js" integrity="sha384-UO2eT0CpHqdSJQ6hJty5KVphtPhzWj9WO1clHTMGa3JDZwrnQq4sF86dIHNDz0W1"></script>
<script src="/pkg/external/bootstrap.min.js" integrity="sha384-JjSmVgyd0p3pXB1rRibZUAYoIIy6OrQ6VrjIEaFf/nJGzIxFDsf4x0xIM+B07jRM"></script>
<script src="/pkg/external/confetti.js"></script>
<script src="/pkg/bundle.js" defer></script>
</head>
@ -1125,12 +1126,12 @@ pub async fn auth(mut req: tide::Request<AppState>) -> tide::Result {
})
.map_err(|_| OperationError::InvalidSessionState)
}
AuthState::Denied(_) => {
AuthState::Denied(reason) => {
debug!("🧩 -> AuthState::Denied");
let msession = req.session_mut();
// Remove the auth-session-id
msession.remove("auth-session-id");
Err(OperationError::AccessDenied)
Ok(ProtoAuthState::Denied(reason))
}
}
.map(|state| AuthResponse { state, sessionid })

View file

@ -218,6 +218,16 @@ impl Account {
self.uuid == *UUID_ANONYMOUS
}
pub(crate) fn gen_password_recover_mod(
&self,
cleartext: &str,
crypto_policy: &CryptoPolicy,
) -> Result<ModifyList<ModifyInvalid>, OperationError> {
let ncred = Credential::new_password_only(crypto_policy, cleartext)?;
let vcred = Value::new_credential("primary", ncred);
Ok(ModifyList::new_purge_and_set("primary_credential", vcred))
}
pub(crate) fn gen_password_mod(
&self,
cleartext: &str,

View file

@ -1077,10 +1077,30 @@ impl<'a> IdmServerProxyWriteTransaction<'a> {
ladmin_error!(au, "name to uuid failed {:?}", e);
e
})?;
// internal pce.
let pce = PasswordChangeEvent::new_internal(&target, cleartext, None);
// now set_account_password.
self.set_account_password(au, &pce)
let account = self.target_to_account(au, &target)?;
let modlist = account
.gen_password_recover_mod(cleartext, self.crypto_policy)
.map_err(|e| {
ladmin_error!(au, "Failed to generate password mod {:?}", e);
e
})?;
ltrace!(au, "processing change {:?}", modlist);
self.qs_write
.internal_modify(
au,
// Filter as executed
&filter!(f_eq("uuid", PartialValue::new_uuidr(&target))),
&modlist,
)
.map_err(|e| {
lrequest_error!(au, "error -> {:?}", e);
e
})?;
Ok(())
}
pub fn generate_account_password(

View file

@ -18,3 +18,9 @@ wasm-bindgen-futures = { version = "0.4" }
yew = "0.17"
kanidm_proto = { path = "../kanidm_proto", version = "1.1.0-alpha" }
anyhow = "1"
webauthn-rs = { version = "0.3.0-alpha.7", default-features = false, features = ["wasm"] }
web-sys = { version = "0.3", features = ["PublicKeyCredentialUserEntity", "CredentialCreationOptions", "Navigator", "Window", "CredentialsContainer", "PublicKeyCredentialRpEntity", "PublicKeyCredentialCreationOptions", "PublicKeyCredential", "AuthenticatorResponse", "AuthenticationExtensionsClientOutputs", "CredentialRequestOptions"] }
js-sys = "0.3"

View file

@ -2,3 +2,4 @@
wasm-pack build --no-typescript --release --target web && \
rollup ./src/main.js --format iife --file ./pkg/bundle.js && \
rm ./pkg/.gitignore

View file

@ -48,6 +48,26 @@
return idx;
}
function isLikeNone(x) {
return x === undefined || x === null;
}
let cachegetFloat64Memory0 = null;
function getFloat64Memory0() {
if (cachegetFloat64Memory0 === null || cachegetFloat64Memory0.buffer !== wasm.memory.buffer) {
cachegetFloat64Memory0 = new Float64Array(wasm.memory.buffer);
}
return cachegetFloat64Memory0;
}
let cachegetInt32Memory0 = null;
function getInt32Memory0() {
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
}
return cachegetInt32Memory0;
}
let WASM_VECTOR_LEN = 0;
let cachedTextEncoder = new TextEncoder('utf-8');
@ -103,18 +123,6 @@
return ptr;
}
function isLikeNone(x) {
return x === undefined || x === null;
}
let cachegetInt32Memory0 = null;
function getInt32Memory0() {
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
}
return cachegetInt32Memory0;
}
function debugString(val) {
// primitive types
const type = typeof val;
@ -212,18 +220,19 @@
heap[--stack_pointer] = obj;
return stack_pointer;
}
function __wbg_adapter_24(arg0, arg1, arg2) {
function __wbg_adapter_28(arg0, arg1, arg2) {
try {
wasm._dyn_core__ops__function__FnMut___A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h7ed9c14451e9c663(arg0, arg1, addBorrowedObject(arg2));
wasm._dyn_core__ops__function__FnMut___A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h932b7022027653c1(arg0, arg1, addBorrowedObject(arg2));
} finally {
heap[stack_pointer++] = undefined;
}
}
function __wbg_adapter_27(arg0, arg1, arg2) {
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1409b27d5a10e953(arg0, arg1, addHeapObject(arg2));
function __wbg_adapter_31(arg0, arg1, arg2) {
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hc5a7090637073a80(arg0, arg1, addHeapObject(arg2));
}
function notDefined(what) { return () => { throw new Error(`${what} is not defined`); }; }
/**
*/
function run_login_app() {
@ -281,6 +290,7 @@
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
takeObject(arg0);
};
imports.wbg.__wbg_startConfetti_1e3412426d93bcf0 = typeof startConfetti == 'function' ? startConfetti : notDefined('startConfetti');
imports.wbg.__wbindgen_cb_drop = function(arg0) {
const obj = takeObject(arg0).original;
if (obj.cnt-- == 1) {
@ -298,6 +308,10 @@
var ret = getObject(arg0) === undefined;
return ret;
};
imports.wbg.__wbindgen_json_parse = function(arg0, arg1) {
var ret = JSON.parse(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
var ret = getObject(arg0);
return addHeapObject(ret);
@ -328,171 +342,201 @@
wasm.__wbindgen_free(arg0, arg1);
}
};
imports.wbg.__wbg_instanceof_Window_5993230e7331f098 = function(arg0) {
imports.wbg.__wbg_instanceof_Window_9c4fd26090e1d029 = function(arg0) {
var ret = getObject(arg0) instanceof Window;
return ret;
};
imports.wbg.__wbg_document_85584f745133c6ad = function(arg0) {
imports.wbg.__wbg_document_249e9cf340780f93 = function(arg0) {
var ret = getObject(arg0).document;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
imports.wbg.__wbg_localStorage_17cc4197ac61d472 = handleError(function(arg0) {
imports.wbg.__wbg_navigator_fdf3521d0e190a9b = function(arg0) {
var ret = getObject(arg0).navigator;
return addHeapObject(ret);
};
imports.wbg.__wbg_innerWidth_2bb09626230de7ba = handleError(function(arg0) {
var ret = getObject(arg0).innerWidth;
return addHeapObject(ret);
});
imports.wbg.__wbg_innerHeight_e73b06bc6aaff2f6 = handleError(function(arg0) {
var ret = getObject(arg0).innerHeight;
return addHeapObject(ret);
});
imports.wbg.__wbg_localStorage_884d77b5cedf820a = handleError(function(arg0) {
var ret = getObject(arg0).localStorage;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
});
imports.wbg.__wbg_sessionStorage_eb79149ddca2015c = handleError(function(arg0) {
imports.wbg.__wbg_sessionStorage_8a3472de40e5b08f = handleError(function(arg0) {
var ret = getObject(arg0).sessionStorage;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
});
imports.wbg.__wbg_fetch_a830023d79222b35 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_fetch_4889502a30fcf1be = function(arg0, arg1, arg2) {
var ret = getObject(arg0).fetch(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
};
imports.wbg.__wbg_createElement_9291c0306f179f1e = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_createElement_ba61aad8af6be7f4 = handleError(function(arg0, arg1, arg2) {
var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2));
return addHeapObject(ret);
});
imports.wbg.__wbg_createElementNS_ecbbee6419005089 = handleError(function(arg0, arg1, arg2, arg3, arg4) {
imports.wbg.__wbg_createElementNS_c951238dc260501e = handleError(function(arg0, arg1, arg2, arg3, arg4) {
var ret = getObject(arg0).createElementNS(arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
return addHeapObject(ret);
});
imports.wbg.__wbg_createTextNode_cd0249d33c7e5c4a = function(arg0, arg1, arg2) {
imports.wbg.__wbg_createTextNode_278b625a43390ab0 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).createTextNode(getStringFromWasm0(arg1, arg2));
return addHeapObject(ret);
};
imports.wbg.__wbg_querySelector_8ff6e717f918ac47 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_querySelector_db4d492deb40e771 = handleError(function(arg0, arg1, arg2) {
var ret = getObject(arg0).querySelector(getStringFromWasm0(arg1, arg2));
return isLikeNone(ret) ? 0 : addHeapObject(ret);
});
imports.wbg.__wbg_status_42d679a063e3f40c = function(arg0) {
imports.wbg.__wbg_status_5580a898717a7097 = function(arg0) {
var ret = getObject(arg0).status;
return ret;
};
imports.wbg.__wbg_headers_92965033102a703d = function(arg0) {
imports.wbg.__wbg_headers_f36154094992b8f5 = function(arg0) {
var ret = getObject(arg0).headers;
return addHeapObject(ret);
};
imports.wbg.__wbg_arrayBuffer_aeff0aaf9aec857d = handleError(function(arg0) {
imports.wbg.__wbg_arrayBuffer_a98df6d58bb5ea26 = handleError(function(arg0) {
var ret = getObject(arg0).arrayBuffer();
return addHeapObject(ret);
});
imports.wbg.__wbg_text_4b57f36d42790087 = handleError(function(arg0) {
imports.wbg.__wbg_text_b2095448993eb3f0 = handleError(function(arg0) {
var ret = getObject(arg0).text();
return addHeapObject(ret);
});
imports.wbg.__wbg_instanceof_HtmlTextAreaElement_85330633857ee50e = function(arg0) {
imports.wbg.__wbg_instanceof_HtmlTextAreaElement_aefe0cf650ce9a0c = function(arg0) {
var ret = getObject(arg0) instanceof HTMLTextAreaElement;
return ret;
};
imports.wbg.__wbg_value_4797b74b15a0bc19 = function(arg0, arg1) {
imports.wbg.__wbg_value_ad57e46044f59979 = function(arg0, arg1) {
var ret = getObject(arg1).value;
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
imports.wbg.__wbg_setvalue_3ee783318a1b301d = function(arg0, arg1, arg2) {
imports.wbg.__wbg_setvalue_790f4e4951947e33 = function(arg0, arg1, arg2) {
getObject(arg0).value = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_newwithstrandinit_814c15649f6924a8 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_newwithstrandinit_a58924208f457f33 = handleError(function(arg0, arg1, arg2) {
var ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2));
return addHeapObject(ret);
});
imports.wbg.__wbg_instanceof_HtmlButtonElement_87846abf00da2deb = function(arg0) {
imports.wbg.__wbg_get_e8e3b929210def3e = handleError(function(arg0, arg1) {
var ret = getObject(arg0).get(getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_instanceof_HtmlButtonElement_98ac0dc8a5eb6f4e = function(arg0) {
var ret = getObject(arg0) instanceof HTMLButtonElement;
return ret;
};
imports.wbg.__wbg_settype_1772a824336d2b26 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_settype_b8aa4d6f9b00c6f9 = function(arg0, arg1, arg2) {
getObject(arg0).type = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_addEventListener_c11a938b8469ab06 = handleError(function(arg0, arg1, arg2, arg3, arg4) {
imports.wbg.__wbg_signal_b959b4cb8b279328 = function(arg0) {
var ret = getObject(arg0).signal;
return addHeapObject(ret);
};
imports.wbg.__wbg_new_94647a205b427932 = handleError(function() {
var ret = new AbortController();
return addHeapObject(ret);
});
imports.wbg.__wbg_abort_13132a8ca4c8ac09 = function(arg0) {
getObject(arg0).abort();
};
imports.wbg.__wbg_addEventListener_502683a26945b1a5 = handleError(function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3), getObject(arg4));
});
imports.wbg.__wbg_removeEventListener_992337883d25d832 = handleError(function(arg0, arg1, arg2, arg3, arg4) {
imports.wbg.__wbg_removeEventListener_1f30d3e3ef4ee58e = handleError(function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).removeEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3), arg4 !== 0);
});
imports.wbg.__wbg_instanceof_HtmlInputElement_631f8bb677bb0897 = function(arg0) {
imports.wbg.__wbg_instanceof_HtmlInputElement_6dfc5638bc87076f = function(arg0) {
var ret = getObject(arg0) instanceof HTMLInputElement;
return ret;
};
imports.wbg.__wbg_setchecked_e9a4b8ce0e28b973 = function(arg0, arg1) {
imports.wbg.__wbg_setchecked_0033386107edc6f2 = function(arg0, arg1) {
getObject(arg0).checked = arg1 !== 0;
};
imports.wbg.__wbg_settype_dfbbea62b5fa060d = function(arg0, arg1, arg2) {
imports.wbg.__wbg_settype_6d9bbd4e5c5e8fc9 = function(arg0, arg1, arg2) {
getObject(arg0).type = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_value_98044d455b0093f7 = function(arg0, arg1) {
imports.wbg.__wbg_value_2577d9319a38ca2e = function(arg0, arg1) {
var ret = getObject(arg1).value;
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
imports.wbg.__wbg_setvalue_2924913056a0a03c = function(arg0, arg1, arg2) {
imports.wbg.__wbg_setvalue_7adbd4552719bd8e = function(arg0, arg1, arg2) {
getObject(arg0).value = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_signal_fbd119dce1c909d1 = function(arg0) {
var ret = getObject(arg0).signal;
return addHeapObject(ret);
};
imports.wbg.__wbg_new_049faf1b539ba534 = handleError(function() {
var ret = new AbortController();
return addHeapObject(ret);
});
imports.wbg.__wbg_abort_fa1dfe1534bb7a3a = function(arg0) {
getObject(arg0).abort();
};
imports.wbg.__wbg_namespaceURI_ba0083a6b53a9753 = function(arg0, arg1) {
imports.wbg.__wbg_namespaceURI_09075ee9acb8b2d7 = function(arg0, arg1) {
var ret = getObject(arg1).namespaceURI;
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
imports.wbg.__wbg_removeAttribute_ab52d40b0c7386a7 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_removeAttribute_3b4ea946697b7cea = handleError(function(arg0, arg1, arg2) {
getObject(arg0).removeAttribute(getStringFromWasm0(arg1, arg2));
});
imports.wbg.__wbg_setAttribute_5349d84c3833cecd = handleError(function(arg0, arg1, arg2, arg3, arg4) {
imports.wbg.__wbg_setAttribute_0b50656f1ccc45bf = handleError(function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).setAttribute(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
});
imports.wbg.__wbg_log_be5faf67a2e8b869 = function(arg0) {
imports.wbg.__wbg_log_386a8115a84a780d = function(arg0) {
console.log(getObject(arg0));
};
imports.wbg.__wbg_fetch_2740e801a1c8d511 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_fetch_75f2bada7009e7f1 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).fetch(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
};
imports.wbg.__wbg_lastChild_d4077e79715ffef3 = function(arg0) {
imports.wbg.__wbg_credentials_ba45779b49de67a8 = function(arg0) {
var ret = getObject(arg0).credentials;
return addHeapObject(ret);
};
imports.wbg.__wbg_lastChild_41f6d41cb58f88d3 = function(arg0) {
var ret = getObject(arg0).lastChild;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
imports.wbg.__wbg_setnodeValue_83c9aa40c199e1ba = function(arg0, arg1, arg2) {
imports.wbg.__wbg_setnodeValue_eb7b7f2b1e879eec = function(arg0, arg1, arg2) {
getObject(arg0).nodeValue = arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_textContent_06c1d06e1d69ea68 = function(arg0, arg1) {
imports.wbg.__wbg_textContent_62903c35b99b5ca3 = function(arg0, arg1) {
var ret = getObject(arg1).textContent;
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
imports.wbg.__wbg_appendChild_57f30a01b30ec33c = handleError(function(arg0, arg1) {
imports.wbg.__wbg_appendChild_6ae001e6d3556190 = handleError(function(arg0, arg1) {
var ret = getObject(arg0).appendChild(getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_insertBefore_30d17168293fa763 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_insertBefore_f2ee50372a21309c = handleError(function(arg0, arg1, arg2) {
var ret = getObject(arg0).insertBefore(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
});
imports.wbg.__wbg_removeChild_77c0b65b7396e214 = handleError(function(arg0, arg1) {
imports.wbg.__wbg_removeChild_d76a38e31f7ffdcb = handleError(function(arg0, arg1) {
var ret = getObject(arg0).removeChild(getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_newwithstrsequencesequence_856c86f363c8a3d6 = handleError(function(arg0) {
imports.wbg.__wbg_getItem_ccdedac90f432f9a = handleError(function(arg0, arg1, arg2, arg3) {
var ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3));
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
});
imports.wbg.__wbg_setItem_79aa1709a35f859c = handleError(function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).setItem(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
});
imports.wbg.__wbg_newwithstrsequencesequence_fb596b2afa3a5079 = handleError(function(arg0) {
var ret = new Headers(getObject(arg0));
return addHeapObject(ret);
});
imports.wbg.__wbg_get_47bf656299aac357 = function(arg0, arg1) {
imports.wbg.__wbg_get_f099d98ea7d68360 = function(arg0, arg1) {
var ret = getObject(arg0)[arg1 >>> 0];
return addHeapObject(ret);
};
@ -505,113 +549,119 @@
var ret = typeof(val) === 'object' && val !== null;
return ret;
};
imports.wbg.__wbg_next_f613b44647788059 = function(arg0) {
imports.wbg.__wbg_next_af8c20b8c0d81345 = function(arg0) {
var ret = getObject(arg0).next;
return addHeapObject(ret);
};
imports.wbg.__wbg_next_cf4ec627a2e85bac = handleError(function(arg0) {
imports.wbg.__wbg_next_9d10ccb28a5fd327 = handleError(function(arg0) {
var ret = getObject(arg0).next();
return addHeapObject(ret);
});
imports.wbg.__wbg_done_4e046ac6e3b595e0 = function(arg0) {
imports.wbg.__wbg_done_faa42c8d1dd8ca9e = function(arg0) {
var ret = getObject(arg0).done;
return ret;
};
imports.wbg.__wbg_value_6fa14ba8ee7b7c3d = function(arg0) {
imports.wbg.__wbg_value_9befa7ab4a7326bf = function(arg0) {
var ret = getObject(arg0).value;
return addHeapObject(ret);
};
imports.wbg.__wbg_iterator_7d4f7917ab7aeca0 = function() {
imports.wbg.__wbg_iterator_de2adb40693c8c47 = function() {
var ret = Symbol.iterator;
return addHeapObject(ret);
};
imports.wbg.__wbg_get_4e90ba4e3de362de = handleError(function(arg0, arg1) {
imports.wbg.__wbg_get_0c6963cbab34fbb6 = handleError(function(arg0, arg1) {
var ret = Reflect.get(getObject(arg0), getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_call_e5847d15cc228e4f = handleError(function(arg0, arg1) {
imports.wbg.__wbg_call_cb478d88f3068c91 = handleError(function(arg0, arg1) {
var ret = getObject(arg0).call(getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_new_7c995f2adeba6fb5 = function() {
imports.wbg.__wbg_new_8528c110a833413f = function() {
var ret = new Array();
return addHeapObject(ret);
};
imports.wbg.__wbg_from_badf9c2620e47d5a = function(arg0) {
imports.wbg.__wbg_from_c9968c40e2da92d7 = function(arg0) {
var ret = Array.from(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_push_3f7c76b58919ce0d = function(arg0, arg1) {
imports.wbg.__wbg_push_17a514d8ab666103 = function(arg0, arg1) {
var ret = getObject(arg0).push(getObject(arg1));
return ret;
};
imports.wbg.__wbg_toString_ebb2190bcbb2fdfe = function(arg0) {
imports.wbg.__wbg_toString_24c414b45ffa40fa = function(arg0) {
var ret = getObject(arg0).toString();
return addHeapObject(ret);
};
imports.wbg.__wbg_newnoargs_2349ba6aefe72376 = function(arg0, arg1) {
imports.wbg.__wbg_newnoargs_3efc7bfa69a681f9 = function(arg0, arg1) {
var ret = new Function(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
imports.wbg.__wbg_is_ff18d90ee51cb4a6 = function(arg0, arg1) {
imports.wbg.__wbg_is_573b30cf06a763fb = function(arg0, arg1) {
var ret = Object.is(getObject(arg0), getObject(arg1));
return ret;
};
imports.wbg.__wbg_new_59986c8731bebaa1 = function() {
imports.wbg.__wbg_new_d14bf16e62c6b3d5 = function() {
var ret = new Object();
return addHeapObject(ret);
};
imports.wbg.__wbg_resolve_e0690143406c88cb = function(arg0) {
imports.wbg.__wbg_resolve_778af3f90b8e2b59 = function(arg0) {
var ret = Promise.resolve(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_then_9caf23122e4fd5d3 = function(arg0, arg1) {
imports.wbg.__wbg_then_367b3e718069cfb9 = function(arg0, arg1) {
var ret = getObject(arg0).then(getObject(arg1));
return addHeapObject(ret);
};
imports.wbg.__wbg_then_16663faf60ffbe95 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_then_ac66ca61394bfd21 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).then(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
};
imports.wbg.__wbg_self_35a0fda3eb965abe = handleError(function() {
imports.wbg.__wbg_self_05c54dcacb623b9a = handleError(function() {
var ret = self.self;
return addHeapObject(ret);
});
imports.wbg.__wbg_window_88a6f88dd3a474f1 = handleError(function() {
imports.wbg.__wbg_window_9777ce446d12989f = handleError(function() {
var ret = window.window;
return addHeapObject(ret);
});
imports.wbg.__wbg_globalThis_1d843c4ad7b6a1f5 = handleError(function() {
imports.wbg.__wbg_globalThis_f0ca0bbb0149cf3d = handleError(function() {
var ret = globalThis.globalThis;
return addHeapObject(ret);
});
imports.wbg.__wbg_global_294ce70448e8fbbf = handleError(function() {
imports.wbg.__wbg_global_c3c8325ae8c7f1a9 = handleError(function() {
var ret = global.global;
return addHeapObject(ret);
});
imports.wbg.__wbg_buffer_0be9fb426f2dd82b = function(arg0) {
imports.wbg.__wbg_buffer_ebc6c8e75510eae3 = function(arg0) {
var ret = getObject(arg0).buffer;
return addHeapObject(ret);
};
imports.wbg.__wbg_newwithbyteoffsetandlength_85b7ce82b001ea08 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_newwithbyteoffsetandlength_ca3d3d8811ecb569 = function(arg0, arg1, arg2) {
var ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
};
imports.wbg.__wbg_length_3a5138f465b971ad = function(arg0) {
imports.wbg.__wbg_length_317f0dd77f7a6673 = function(arg0) {
var ret = getObject(arg0).length;
return ret;
};
imports.wbg.__wbg_new_4e8d18dbf9cd5240 = function(arg0) {
imports.wbg.__wbg_new_135e963dedf67b22 = function(arg0) {
var ret = new Uint8Array(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_set_4769de301eb521d7 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_set_4a5072a31008e0cb = function(arg0, arg1, arg2) {
getObject(arg0).set(getObject(arg1), arg2 >>> 0);
};
imports.wbg.__wbg_set_7e15d36563072b19 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_set_61642586f7156f4a = handleError(function(arg0, arg1, arg2) {
var ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2));
return ret;
});
imports.wbg.__wbindgen_number_get = function(arg0, arg1) {
const obj = getObject(arg1);
var ret = typeof(obj) === 'number' ? obj : undefined;
getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret;
getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret);
};
imports.wbg.__wbindgen_string_get = function(arg0, arg1) {
const obj = getObject(arg1);
var ret = typeof(obj) === 'string' ? obj : undefined;
@ -634,12 +684,12 @@
var ret = wasm.memory;
return addHeapObject(ret);
};
imports.wbg.__wbindgen_closure_wrapper487 = function(arg0, arg1, arg2) {
var ret = makeMutClosure(arg0, arg1, 173, __wbg_adapter_24);
imports.wbg.__wbindgen_closure_wrapper605 = function(arg0, arg1, arg2) {
var ret = makeMutClosure(arg0, arg1, 237, __wbg_adapter_28);
return addHeapObject(ret);
};
imports.wbg.__wbindgen_closure_wrapper560 = function(arg0, arg1, arg2) {
var ret = makeMutClosure(arg0, arg1, 202, __wbg_adapter_27);
imports.wbg.__wbindgen_closure_wrapper1492 = function(arg0, arg1, arg2) {
var ret = makeMutClosure(arg0, arg1, 330, __wbg_adapter_31);
return addHeapObject(ret);
};

16
kanidmd_web_ui/pkg/external/confetti.js vendored Normal file
View file

@ -0,0 +1,16 @@
var maxParticleCount=150;var particleSpeed=2;var startConfetti;var stopConfetti;var toggleConfetti;var removeConfetti;(function(){startConfetti=startConfettiInner;stopConfetti=stopConfettiInner;toggleConfetti=toggleConfettiInner;removeConfetti=removeConfettiInner;var colors=["DodgerBlue","OliveDrab","Gold","Pink","SlateBlue","LightBlue","Violet","PaleGreen","SteelBlue","SandyBrown","Chocolate","Crimson"]
var streamingConfetti=false;var animationTimer=null;var particles=[];var waveAngle=0;function resetParticle(particle,width,height){particle.color=colors[(Math.random()*colors.length)|0];particle.x=Math.random()*width;particle.y=Math.random()*height-height;particle.diameter=Math.random()*10+5;particle.tilt=Math.random()*10-10;particle.tiltAngleIncrement=Math.random()*0.07+0.05;particle.tiltAngle=0;return particle;}
function startConfettiInner(){var width=window.innerWidth;var height=window.innerHeight;window.requestAnimFrame=(function(){return window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||window.oRequestAnimationFrame||window.msRequestAnimationFrame||function(callback){return window.setTimeout(callback,16.6666667);};})();var canvas=document.getElementById("confetti-canvas");if(canvas===null){canvas=document.createElement("canvas");canvas.setAttribute("id","confetti-canvas");canvas.setAttribute("style","display:block;z-index:999999;pointer-events:none");document.body.appendChild(canvas);canvas.width=width;canvas.height=height;window.addEventListener("resize",function(){canvas.width=window.innerWidth;canvas.height=window.innerHeight;},true);}
var context=canvas.getContext("2d");while(particles.length<maxParticleCount)
particles.push(resetParticle({},width,height));streamingConfetti=true;if(animationTimer===null){(function runAnimation(){context.clearRect(0,0,window.innerWidth,window.innerHeight);if(particles.length===0)
animationTimer=null;else{updateParticles();drawParticles(context);animationTimer=requestAnimFrame(runAnimation);}})();}}
function stopConfettiInner(){streamingConfetti=false;}
function removeConfettiInner(){stopConfetti();particles=[];}
function toggleConfettiInner(){if(streamingConfetti)
stopConfettiInner();else
startConfettiInner();}
function drawParticles(context){var particle;var x;for(var i=0;i<particles.length;i++){particle=particles[i];context.beginPath();context.lineWidth=particle.diameter;context.strokeStyle=particle.color;x=particle.x+particle.tilt;context.moveTo(x+particle.diameter/2,particle.y);context.lineTo(x,particle.y+particle.tilt+particle.diameter/2);context.stroke();}}
function updateParticles(){var width=window.innerWidth;var height=window.innerHeight;var particle;waveAngle+=0.01;for(var i=0;i<particles.length;i++){particle=particles[i];if(!streamingConfetti&&particle.y<-15)
particle.y=height+100;else{particle.tiltAngle+=particle.tiltAngleIncrement;particle.x+=Math.sin(waveAngle);particle.y+=(Math.cos(waveAngle)+particle.diameter+particleSpeed)*0.5;particle.tilt=Math.sin(particle.tiltAngle)*15;}
if(particle.x>width+20||particle.x<-20||particle.y>height){if(streamingConfetti&&particles.length<=maxParticleCount)
resetParticle(particle,width,height);else{particles.splice(i,1);i--;}}}}})();

View file

@ -46,6 +46,26 @@ function addHeapObject(obj) {
return idx;
}
function isLikeNone(x) {
return x === undefined || x === null;
}
let cachegetFloat64Memory0 = null;
function getFloat64Memory0() {
if (cachegetFloat64Memory0 === null || cachegetFloat64Memory0.buffer !== wasm.memory.buffer) {
cachegetFloat64Memory0 = new Float64Array(wasm.memory.buffer);
}
return cachegetFloat64Memory0;
}
let cachegetInt32Memory0 = null;
function getInt32Memory0() {
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
}
return cachegetInt32Memory0;
}
let WASM_VECTOR_LEN = 0;
let cachedTextEncoder = new TextEncoder('utf-8');
@ -101,18 +121,6 @@ function passStringToWasm0(arg, malloc, realloc) {
return ptr;
}
function isLikeNone(x) {
return x === undefined || x === null;
}
let cachegetInt32Memory0 = null;
function getInt32Memory0() {
if (cachegetInt32Memory0 === null || cachegetInt32Memory0.buffer !== wasm.memory.buffer) {
cachegetInt32Memory0 = new Int32Array(wasm.memory.buffer);
}
return cachegetInt32Memory0;
}
function debugString(val) {
// primitive types
const type = typeof val;
@ -210,18 +218,19 @@ function addBorrowedObject(obj) {
heap[--stack_pointer] = obj;
return stack_pointer;
}
function __wbg_adapter_24(arg0, arg1, arg2) {
function __wbg_adapter_28(arg0, arg1, arg2) {
try {
wasm._dyn_core__ops__function__FnMut___A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h7ed9c14451e9c663(arg0, arg1, addBorrowedObject(arg2));
wasm._dyn_core__ops__function__FnMut___A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h932b7022027653c1(arg0, arg1, addBorrowedObject(arg2));
} finally {
heap[stack_pointer++] = undefined;
}
}
function __wbg_adapter_27(arg0, arg1, arg2) {
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__h1409b27d5a10e953(arg0, arg1, addHeapObject(arg2));
function __wbg_adapter_31(arg0, arg1, arg2) {
wasm._dyn_core__ops__function__FnMut__A____Output___R_as_wasm_bindgen__closure__WasmClosure___describe__invoke__hc5a7090637073a80(arg0, arg1, addHeapObject(arg2));
}
function notDefined(what) { return () => { throw new Error(`${what} is not defined`); }; }
/**
*/
export function run_login_app() {
@ -279,6 +288,7 @@ async function init(input) {
imports.wbg.__wbindgen_object_drop_ref = function(arg0) {
takeObject(arg0);
};
imports.wbg.__wbg_startConfetti_1e3412426d93bcf0 = typeof startConfetti == 'function' ? startConfetti : notDefined('startConfetti');
imports.wbg.__wbindgen_cb_drop = function(arg0) {
const obj = takeObject(arg0).original;
if (obj.cnt-- == 1) {
@ -296,6 +306,10 @@ async function init(input) {
var ret = getObject(arg0) === undefined;
return ret;
};
imports.wbg.__wbindgen_json_parse = function(arg0, arg1) {
var ret = JSON.parse(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
imports.wbg.__wbindgen_object_clone_ref = function(arg0) {
var ret = getObject(arg0);
return addHeapObject(ret);
@ -326,171 +340,201 @@ async function init(input) {
wasm.__wbindgen_free(arg0, arg1);
}
};
imports.wbg.__wbg_instanceof_Window_5993230e7331f098 = function(arg0) {
imports.wbg.__wbg_instanceof_Window_9c4fd26090e1d029 = function(arg0) {
var ret = getObject(arg0) instanceof Window;
return ret;
};
imports.wbg.__wbg_document_85584f745133c6ad = function(arg0) {
imports.wbg.__wbg_document_249e9cf340780f93 = function(arg0) {
var ret = getObject(arg0).document;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
imports.wbg.__wbg_localStorage_17cc4197ac61d472 = handleError(function(arg0) {
imports.wbg.__wbg_navigator_fdf3521d0e190a9b = function(arg0) {
var ret = getObject(arg0).navigator;
return addHeapObject(ret);
};
imports.wbg.__wbg_innerWidth_2bb09626230de7ba = handleError(function(arg0) {
var ret = getObject(arg0).innerWidth;
return addHeapObject(ret);
});
imports.wbg.__wbg_innerHeight_e73b06bc6aaff2f6 = handleError(function(arg0) {
var ret = getObject(arg0).innerHeight;
return addHeapObject(ret);
});
imports.wbg.__wbg_localStorage_884d77b5cedf820a = handleError(function(arg0) {
var ret = getObject(arg0).localStorage;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
});
imports.wbg.__wbg_sessionStorage_eb79149ddca2015c = handleError(function(arg0) {
imports.wbg.__wbg_sessionStorage_8a3472de40e5b08f = handleError(function(arg0) {
var ret = getObject(arg0).sessionStorage;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
});
imports.wbg.__wbg_fetch_a830023d79222b35 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_fetch_4889502a30fcf1be = function(arg0, arg1, arg2) {
var ret = getObject(arg0).fetch(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
};
imports.wbg.__wbg_createElement_9291c0306f179f1e = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_createElement_ba61aad8af6be7f4 = handleError(function(arg0, arg1, arg2) {
var ret = getObject(arg0).createElement(getStringFromWasm0(arg1, arg2));
return addHeapObject(ret);
});
imports.wbg.__wbg_createElementNS_ecbbee6419005089 = handleError(function(arg0, arg1, arg2, arg3, arg4) {
imports.wbg.__wbg_createElementNS_c951238dc260501e = handleError(function(arg0, arg1, arg2, arg3, arg4) {
var ret = getObject(arg0).createElementNS(arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
return addHeapObject(ret);
});
imports.wbg.__wbg_createTextNode_cd0249d33c7e5c4a = function(arg0, arg1, arg2) {
imports.wbg.__wbg_createTextNode_278b625a43390ab0 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).createTextNode(getStringFromWasm0(arg1, arg2));
return addHeapObject(ret);
};
imports.wbg.__wbg_querySelector_8ff6e717f918ac47 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_querySelector_db4d492deb40e771 = handleError(function(arg0, arg1, arg2) {
var ret = getObject(arg0).querySelector(getStringFromWasm0(arg1, arg2));
return isLikeNone(ret) ? 0 : addHeapObject(ret);
});
imports.wbg.__wbg_status_42d679a063e3f40c = function(arg0) {
imports.wbg.__wbg_status_5580a898717a7097 = function(arg0) {
var ret = getObject(arg0).status;
return ret;
};
imports.wbg.__wbg_headers_92965033102a703d = function(arg0) {
imports.wbg.__wbg_headers_f36154094992b8f5 = function(arg0) {
var ret = getObject(arg0).headers;
return addHeapObject(ret);
};
imports.wbg.__wbg_arrayBuffer_aeff0aaf9aec857d = handleError(function(arg0) {
imports.wbg.__wbg_arrayBuffer_a98df6d58bb5ea26 = handleError(function(arg0) {
var ret = getObject(arg0).arrayBuffer();
return addHeapObject(ret);
});
imports.wbg.__wbg_text_4b57f36d42790087 = handleError(function(arg0) {
imports.wbg.__wbg_text_b2095448993eb3f0 = handleError(function(arg0) {
var ret = getObject(arg0).text();
return addHeapObject(ret);
});
imports.wbg.__wbg_instanceof_HtmlTextAreaElement_85330633857ee50e = function(arg0) {
imports.wbg.__wbg_instanceof_HtmlTextAreaElement_aefe0cf650ce9a0c = function(arg0) {
var ret = getObject(arg0) instanceof HTMLTextAreaElement;
return ret;
};
imports.wbg.__wbg_value_4797b74b15a0bc19 = function(arg0, arg1) {
imports.wbg.__wbg_value_ad57e46044f59979 = function(arg0, arg1) {
var ret = getObject(arg1).value;
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
imports.wbg.__wbg_setvalue_3ee783318a1b301d = function(arg0, arg1, arg2) {
imports.wbg.__wbg_setvalue_790f4e4951947e33 = function(arg0, arg1, arg2) {
getObject(arg0).value = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_newwithstrandinit_814c15649f6924a8 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_newwithstrandinit_a58924208f457f33 = handleError(function(arg0, arg1, arg2) {
var ret = new Request(getStringFromWasm0(arg0, arg1), getObject(arg2));
return addHeapObject(ret);
});
imports.wbg.__wbg_instanceof_HtmlButtonElement_87846abf00da2deb = function(arg0) {
imports.wbg.__wbg_get_e8e3b929210def3e = handleError(function(arg0, arg1) {
var ret = getObject(arg0).get(getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_instanceof_HtmlButtonElement_98ac0dc8a5eb6f4e = function(arg0) {
var ret = getObject(arg0) instanceof HTMLButtonElement;
return ret;
};
imports.wbg.__wbg_settype_1772a824336d2b26 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_settype_b8aa4d6f9b00c6f9 = function(arg0, arg1, arg2) {
getObject(arg0).type = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_addEventListener_c11a938b8469ab06 = handleError(function(arg0, arg1, arg2, arg3, arg4) {
imports.wbg.__wbg_signal_b959b4cb8b279328 = function(arg0) {
var ret = getObject(arg0).signal;
return addHeapObject(ret);
};
imports.wbg.__wbg_new_94647a205b427932 = handleError(function() {
var ret = new AbortController();
return addHeapObject(ret);
});
imports.wbg.__wbg_abort_13132a8ca4c8ac09 = function(arg0) {
getObject(arg0).abort();
};
imports.wbg.__wbg_addEventListener_502683a26945b1a5 = handleError(function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).addEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3), getObject(arg4));
});
imports.wbg.__wbg_removeEventListener_992337883d25d832 = handleError(function(arg0, arg1, arg2, arg3, arg4) {
imports.wbg.__wbg_removeEventListener_1f30d3e3ef4ee58e = handleError(function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).removeEventListener(getStringFromWasm0(arg1, arg2), getObject(arg3), arg4 !== 0);
});
imports.wbg.__wbg_instanceof_HtmlInputElement_631f8bb677bb0897 = function(arg0) {
imports.wbg.__wbg_instanceof_HtmlInputElement_6dfc5638bc87076f = function(arg0) {
var ret = getObject(arg0) instanceof HTMLInputElement;
return ret;
};
imports.wbg.__wbg_setchecked_e9a4b8ce0e28b973 = function(arg0, arg1) {
imports.wbg.__wbg_setchecked_0033386107edc6f2 = function(arg0, arg1) {
getObject(arg0).checked = arg1 !== 0;
};
imports.wbg.__wbg_settype_dfbbea62b5fa060d = function(arg0, arg1, arg2) {
imports.wbg.__wbg_settype_6d9bbd4e5c5e8fc9 = function(arg0, arg1, arg2) {
getObject(arg0).type = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_value_98044d455b0093f7 = function(arg0, arg1) {
imports.wbg.__wbg_value_2577d9319a38ca2e = function(arg0, arg1) {
var ret = getObject(arg1).value;
var ptr0 = passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
imports.wbg.__wbg_setvalue_2924913056a0a03c = function(arg0, arg1, arg2) {
imports.wbg.__wbg_setvalue_7adbd4552719bd8e = function(arg0, arg1, arg2) {
getObject(arg0).value = getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_signal_fbd119dce1c909d1 = function(arg0) {
var ret = getObject(arg0).signal;
return addHeapObject(ret);
};
imports.wbg.__wbg_new_049faf1b539ba534 = handleError(function() {
var ret = new AbortController();
return addHeapObject(ret);
});
imports.wbg.__wbg_abort_fa1dfe1534bb7a3a = function(arg0) {
getObject(arg0).abort();
};
imports.wbg.__wbg_namespaceURI_ba0083a6b53a9753 = function(arg0, arg1) {
imports.wbg.__wbg_namespaceURI_09075ee9acb8b2d7 = function(arg0, arg1) {
var ret = getObject(arg1).namespaceURI;
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
imports.wbg.__wbg_removeAttribute_ab52d40b0c7386a7 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_removeAttribute_3b4ea946697b7cea = handleError(function(arg0, arg1, arg2) {
getObject(arg0).removeAttribute(getStringFromWasm0(arg1, arg2));
});
imports.wbg.__wbg_setAttribute_5349d84c3833cecd = handleError(function(arg0, arg1, arg2, arg3, arg4) {
imports.wbg.__wbg_setAttribute_0b50656f1ccc45bf = handleError(function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).setAttribute(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
});
imports.wbg.__wbg_log_be5faf67a2e8b869 = function(arg0) {
imports.wbg.__wbg_log_386a8115a84a780d = function(arg0) {
console.log(getObject(arg0));
};
imports.wbg.__wbg_fetch_2740e801a1c8d511 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_fetch_75f2bada7009e7f1 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).fetch(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
};
imports.wbg.__wbg_lastChild_d4077e79715ffef3 = function(arg0) {
imports.wbg.__wbg_credentials_ba45779b49de67a8 = function(arg0) {
var ret = getObject(arg0).credentials;
return addHeapObject(ret);
};
imports.wbg.__wbg_lastChild_41f6d41cb58f88d3 = function(arg0) {
var ret = getObject(arg0).lastChild;
return isLikeNone(ret) ? 0 : addHeapObject(ret);
};
imports.wbg.__wbg_setnodeValue_83c9aa40c199e1ba = function(arg0, arg1, arg2) {
imports.wbg.__wbg_setnodeValue_eb7b7f2b1e879eec = function(arg0, arg1, arg2) {
getObject(arg0).nodeValue = arg1 === 0 ? undefined : getStringFromWasm0(arg1, arg2);
};
imports.wbg.__wbg_textContent_06c1d06e1d69ea68 = function(arg0, arg1) {
imports.wbg.__wbg_textContent_62903c35b99b5ca3 = function(arg0, arg1) {
var ret = getObject(arg1).textContent;
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
};
imports.wbg.__wbg_appendChild_57f30a01b30ec33c = handleError(function(arg0, arg1) {
imports.wbg.__wbg_appendChild_6ae001e6d3556190 = handleError(function(arg0, arg1) {
var ret = getObject(arg0).appendChild(getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_insertBefore_30d17168293fa763 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_insertBefore_f2ee50372a21309c = handleError(function(arg0, arg1, arg2) {
var ret = getObject(arg0).insertBefore(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
});
imports.wbg.__wbg_removeChild_77c0b65b7396e214 = handleError(function(arg0, arg1) {
imports.wbg.__wbg_removeChild_d76a38e31f7ffdcb = handleError(function(arg0, arg1) {
var ret = getObject(arg0).removeChild(getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_newwithstrsequencesequence_856c86f363c8a3d6 = handleError(function(arg0) {
imports.wbg.__wbg_getItem_ccdedac90f432f9a = handleError(function(arg0, arg1, arg2, arg3) {
var ret = getObject(arg1).getItem(getStringFromWasm0(arg2, arg3));
var ptr0 = isLikeNone(ret) ? 0 : passStringToWasm0(ret, wasm.__wbindgen_malloc, wasm.__wbindgen_realloc);
var len0 = WASM_VECTOR_LEN;
getInt32Memory0()[arg0 / 4 + 1] = len0;
getInt32Memory0()[arg0 / 4 + 0] = ptr0;
});
imports.wbg.__wbg_setItem_79aa1709a35f859c = handleError(function(arg0, arg1, arg2, arg3, arg4) {
getObject(arg0).setItem(getStringFromWasm0(arg1, arg2), getStringFromWasm0(arg3, arg4));
});
imports.wbg.__wbg_newwithstrsequencesequence_fb596b2afa3a5079 = handleError(function(arg0) {
var ret = new Headers(getObject(arg0));
return addHeapObject(ret);
});
imports.wbg.__wbg_get_47bf656299aac357 = function(arg0, arg1) {
imports.wbg.__wbg_get_f099d98ea7d68360 = function(arg0, arg1) {
var ret = getObject(arg0)[arg1 >>> 0];
return addHeapObject(ret);
};
@ -503,113 +547,119 @@ async function init(input) {
var ret = typeof(val) === 'object' && val !== null;
return ret;
};
imports.wbg.__wbg_next_f613b44647788059 = function(arg0) {
imports.wbg.__wbg_next_af8c20b8c0d81345 = function(arg0) {
var ret = getObject(arg0).next;
return addHeapObject(ret);
};
imports.wbg.__wbg_next_cf4ec627a2e85bac = handleError(function(arg0) {
imports.wbg.__wbg_next_9d10ccb28a5fd327 = handleError(function(arg0) {
var ret = getObject(arg0).next();
return addHeapObject(ret);
});
imports.wbg.__wbg_done_4e046ac6e3b595e0 = function(arg0) {
imports.wbg.__wbg_done_faa42c8d1dd8ca9e = function(arg0) {
var ret = getObject(arg0).done;
return ret;
};
imports.wbg.__wbg_value_6fa14ba8ee7b7c3d = function(arg0) {
imports.wbg.__wbg_value_9befa7ab4a7326bf = function(arg0) {
var ret = getObject(arg0).value;
return addHeapObject(ret);
};
imports.wbg.__wbg_iterator_7d4f7917ab7aeca0 = function() {
imports.wbg.__wbg_iterator_de2adb40693c8c47 = function() {
var ret = Symbol.iterator;
return addHeapObject(ret);
};
imports.wbg.__wbg_get_4e90ba4e3de362de = handleError(function(arg0, arg1) {
imports.wbg.__wbg_get_0c6963cbab34fbb6 = handleError(function(arg0, arg1) {
var ret = Reflect.get(getObject(arg0), getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_call_e5847d15cc228e4f = handleError(function(arg0, arg1) {
imports.wbg.__wbg_call_cb478d88f3068c91 = handleError(function(arg0, arg1) {
var ret = getObject(arg0).call(getObject(arg1));
return addHeapObject(ret);
});
imports.wbg.__wbg_new_7c995f2adeba6fb5 = function() {
imports.wbg.__wbg_new_8528c110a833413f = function() {
var ret = new Array();
return addHeapObject(ret);
};
imports.wbg.__wbg_from_badf9c2620e47d5a = function(arg0) {
imports.wbg.__wbg_from_c9968c40e2da92d7 = function(arg0) {
var ret = Array.from(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_push_3f7c76b58919ce0d = function(arg0, arg1) {
imports.wbg.__wbg_push_17a514d8ab666103 = function(arg0, arg1) {
var ret = getObject(arg0).push(getObject(arg1));
return ret;
};
imports.wbg.__wbg_toString_ebb2190bcbb2fdfe = function(arg0) {
imports.wbg.__wbg_toString_24c414b45ffa40fa = function(arg0) {
var ret = getObject(arg0).toString();
return addHeapObject(ret);
};
imports.wbg.__wbg_newnoargs_2349ba6aefe72376 = function(arg0, arg1) {
imports.wbg.__wbg_newnoargs_3efc7bfa69a681f9 = function(arg0, arg1) {
var ret = new Function(getStringFromWasm0(arg0, arg1));
return addHeapObject(ret);
};
imports.wbg.__wbg_is_ff18d90ee51cb4a6 = function(arg0, arg1) {
imports.wbg.__wbg_is_573b30cf06a763fb = function(arg0, arg1) {
var ret = Object.is(getObject(arg0), getObject(arg1));
return ret;
};
imports.wbg.__wbg_new_59986c8731bebaa1 = function() {
imports.wbg.__wbg_new_d14bf16e62c6b3d5 = function() {
var ret = new Object();
return addHeapObject(ret);
};
imports.wbg.__wbg_resolve_e0690143406c88cb = function(arg0) {
imports.wbg.__wbg_resolve_778af3f90b8e2b59 = function(arg0) {
var ret = Promise.resolve(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_then_9caf23122e4fd5d3 = function(arg0, arg1) {
imports.wbg.__wbg_then_367b3e718069cfb9 = function(arg0, arg1) {
var ret = getObject(arg0).then(getObject(arg1));
return addHeapObject(ret);
};
imports.wbg.__wbg_then_16663faf60ffbe95 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_then_ac66ca61394bfd21 = function(arg0, arg1, arg2) {
var ret = getObject(arg0).then(getObject(arg1), getObject(arg2));
return addHeapObject(ret);
};
imports.wbg.__wbg_self_35a0fda3eb965abe = handleError(function() {
imports.wbg.__wbg_self_05c54dcacb623b9a = handleError(function() {
var ret = self.self;
return addHeapObject(ret);
});
imports.wbg.__wbg_window_88a6f88dd3a474f1 = handleError(function() {
imports.wbg.__wbg_window_9777ce446d12989f = handleError(function() {
var ret = window.window;
return addHeapObject(ret);
});
imports.wbg.__wbg_globalThis_1d843c4ad7b6a1f5 = handleError(function() {
imports.wbg.__wbg_globalThis_f0ca0bbb0149cf3d = handleError(function() {
var ret = globalThis.globalThis;
return addHeapObject(ret);
});
imports.wbg.__wbg_global_294ce70448e8fbbf = handleError(function() {
imports.wbg.__wbg_global_c3c8325ae8c7f1a9 = handleError(function() {
var ret = global.global;
return addHeapObject(ret);
});
imports.wbg.__wbg_buffer_0be9fb426f2dd82b = function(arg0) {
imports.wbg.__wbg_buffer_ebc6c8e75510eae3 = function(arg0) {
var ret = getObject(arg0).buffer;
return addHeapObject(ret);
};
imports.wbg.__wbg_newwithbyteoffsetandlength_85b7ce82b001ea08 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_newwithbyteoffsetandlength_ca3d3d8811ecb569 = function(arg0, arg1, arg2) {
var ret = new Uint8Array(getObject(arg0), arg1 >>> 0, arg2 >>> 0);
return addHeapObject(ret);
};
imports.wbg.__wbg_length_3a5138f465b971ad = function(arg0) {
imports.wbg.__wbg_length_317f0dd77f7a6673 = function(arg0) {
var ret = getObject(arg0).length;
return ret;
};
imports.wbg.__wbg_new_4e8d18dbf9cd5240 = function(arg0) {
imports.wbg.__wbg_new_135e963dedf67b22 = function(arg0) {
var ret = new Uint8Array(getObject(arg0));
return addHeapObject(ret);
};
imports.wbg.__wbg_set_4769de301eb521d7 = function(arg0, arg1, arg2) {
imports.wbg.__wbg_set_4a5072a31008e0cb = function(arg0, arg1, arg2) {
getObject(arg0).set(getObject(arg1), arg2 >>> 0);
};
imports.wbg.__wbg_set_7e15d36563072b19 = handleError(function(arg0, arg1, arg2) {
imports.wbg.__wbg_set_61642586f7156f4a = handleError(function(arg0, arg1, arg2) {
var ret = Reflect.set(getObject(arg0), getObject(arg1), getObject(arg2));
return ret;
});
imports.wbg.__wbindgen_number_get = function(arg0, arg1) {
const obj = getObject(arg1);
var ret = typeof(obj) === 'number' ? obj : undefined;
getFloat64Memory0()[arg0 / 8 + 1] = isLikeNone(ret) ? 0 : ret;
getInt32Memory0()[arg0 / 4 + 0] = !isLikeNone(ret);
};
imports.wbg.__wbindgen_string_get = function(arg0, arg1) {
const obj = getObject(arg1);
var ret = typeof(obj) === 'string' ? obj : undefined;
@ -632,12 +682,12 @@ async function init(input) {
var ret = wasm.memory;
return addHeapObject(ret);
};
imports.wbg.__wbindgen_closure_wrapper487 = function(arg0, arg1, arg2) {
var ret = makeMutClosure(arg0, arg1, 173, __wbg_adapter_24);
imports.wbg.__wbindgen_closure_wrapper605 = function(arg0, arg1, arg2) {
var ret = makeMutClosure(arg0, arg1, 237, __wbg_adapter_28);
return addHeapObject(ret);
};
imports.wbg.__wbindgen_closure_wrapper560 = function(arg0, arg1, arg2) {
var ret = makeMutClosure(arg0, arg1, 202, __wbg_adapter_27);
imports.wbg.__wbindgen_closure_wrapper1492 = function(arg0, arg1, arg2) {
var ret = makeMutClosure(arg0, arg1, 330, __wbg_adapter_31);
return addHeapObject(ret);
};

View file

@ -4,7 +4,7 @@
"William Brown <william@blackhats.net.au>"
],
"description": "Kanidm Server Web User Interface",
"version": "1.1.0-alpha.3",
"version": "1.1.0-alpha.4",
"license": "MPL-2.0",
"repository": {
"type": "git",

View file

@ -1,7 +1,7 @@
#![recursion_limit = "256"]
use wasm_bindgen::prelude::*;
use yew::prelude::*;
// use yew::prelude::*;
mod login;

View file

@ -1,42 +1,91 @@
use anyhow::Error;
use wasm_bindgen::prelude::*;
use yew::format::{Json, Nothing};
use wasm_bindgen_futures::{spawn_local, JsFuture};
use yew::format::Json;
use yew::prelude::*;
use yew::services::fetch::{FetchService, FetchTask, Request, Response};
use yew::services::{ConsoleService, StorageService};
use kanidm_proto::v1::{AuthRequest, AuthState, AuthStep};
use kanidm_proto::v1::{
AuthAllowed, AuthCredential, AuthRequest, AuthResponse, AuthState, AuthStep,
};
use webauthn_rs::proto::PublicKeyCredential;
#[wasm_bindgen]
extern "C" {
fn startConfetti();
}
pub struct LoginApp {
link: ComponentLink<Self>,
username: String,
inputvalue: String,
lstorage: StorageService,
ft: Option<FetchTask>,
session_id: String,
state: LoginState,
}
#[derive(PartialEq)]
enum TotpState {
Enabled,
Disabled,
Invalid,
}
enum LoginState {
Init(bool),
// MechChoice
// CredChoice
Password(bool),
Totp(TotpState),
Webauthn(web_sys::CredentialRequestOptions),
Error(String, Option<String>),
Denied(String),
Authenticated,
}
pub enum LoginAppMsg {
UserNameInput(String),
Input(String),
Restart,
Begin,
Next(AuthState),
DoNothing,
PasswordSubmit,
TotpSubmit,
WebauthnSubmit(PublicKeyCredential),
Start(String, AuthResponse),
Next(AuthResponse),
// DoNothing,
Error(String, Option<String>),
}
impl LoginApp {
fn auth_begin(&mut self) {
let username_copy = self.username.clone();
let callback =
self.link
.callback(move |response: Response<Json<Result<AuthState, Error>>>| {
let (parts, body) = response.into_parts();
match body {
Json(Ok(state)) => LoginAppMsg::Next(state),
Json(Err(_)) => LoginAppMsg::DoNothing,
}
});
fn auth_init(&mut self) {
let callback = self.link.callback(
move |response: Response<Json<Result<AuthResponse, Error>>>| {
let (parts, body) = response.into_parts();
let session_id = parts
.headers
.get("x-kanidm-auth-session-id")
.map(|session_id| session_id.to_str().unwrap().to_string())
.unwrap_or_else(|| "".to_string());
match body {
Json(Ok(state)) => LoginAppMsg::Start(session_id, state),
Json(Err(e)) => LoginAppMsg::Error(
format!("{:?}", e),
parts
.headers
.get("x-kanidm-opid")
.map(|id| id.to_str().unwrap().to_string()),
),
}
},
);
let authreq = AuthRequest {
step: AuthStep::Init(self.username.clone()),
step: AuthStep::Init(self.inputvalue.clone()),
};
// Setup the auth step::init(username);
self.ft = Request::post("/v1/auth")
.header("Content-Type", "application/json")
.body(Json(&authreq))
@ -45,6 +94,167 @@ impl LoginApp {
.map(|ft| Some(ft))
.unwrap_or_else(|_e| None);
}
fn auth_step(&mut self, authreq: AuthRequest) {
let callback = self.link.callback(
move |response: Response<Json<Result<AuthResponse, Error>>>| {
let (parts, body) = response.into_parts();
match body {
Json(Ok(state)) => LoginAppMsg::Next(state),
Json(Err(e)) => LoginAppMsg::Error(
format!("{:?}", e),
parts
.headers
.get("x-kanidm-opid")
.map(|id| id.to_str().unwrap().to_string()),
),
}
},
);
self.ft = Request::post("/v1/auth")
.header("Content-Type", "application/json")
.header("x-kanidm-auth-session-id", &self.session_id)
.body(Json(&authreq))
.map_err(|_| ())
.and_then(|request| FetchService::fetch_binary(request, callback).map_err(|_| ()))
.map(|ft| Some(ft))
.unwrap_or_else(|_e| None);
}
fn view_state(&self) -> Html {
match &self.state {
LoginState::Init(enable) => {
html! {
<>
<div class="container">
<p>
{" Username: "}
</p>
</div>
<div class="container">
<div>
<input id="username" type="text" class="form-control" value=self.inputvalue oninput=self.link.callback(|e: InputData| LoginAppMsg::Input(e.value)) disabled=!enable />
<button type="button" class="btn btn-dark" onclick=self.link.callback(|_| LoginAppMsg::Begin) disabled=!enable >{" Begin "}</button>
</div>
</div>
</>
}
}
LoginState::Password(enable) => {
html! {
<>
<div class="container">
<p>
{" Password: "}
</p>
</div>
<div class="container">
<div>
<input id="password" type="password" class="form-control" value=self.inputvalue oninput=self.link.callback(|e: InputData| LoginAppMsg::Input(e.value)) disabled=!enable />
<button type="button" class="btn btn-dark" onclick=self.link.callback(|_| LoginAppMsg::PasswordSubmit) disabled=!enable >{" Submit "}</button>
</div>
</div>
</>
}
}
LoginState::Totp(state) => {
html! {
<>
<div class="container">
<p>
{" TOTP: "}
{ if state==&TotpState::Invalid { "can only contain numeric digits" } else { "" } }
</p>
</div>
<div class="container">
<div>
<input id="totp" type="text" class="form-control" value=self.inputvalue oninput=self.link.callback(|e: InputData| LoginAppMsg::Input(e.value)) disabled=state==&TotpState::Disabled />
<button type="button" class="btn btn-dark" onclick=self.link.callback(|_| LoginAppMsg::TotpSubmit) disabled=state==&TotpState::Disabled >{" Submit "}</button>
</div>
</div>
</>
}
}
LoginState::Webauthn(challenge) => {
// Start the navigator parts.
if let Some(win) = web_sys::window() {
let promise = win
.navigator()
.credentials()
.get_with_options(&challenge)
.expect("Unable to create promise");
let fut = JsFuture::from(promise);
let linkc = self.link.clone();
spawn_local(async move {
match fut.await {
Ok(data) => {
let data = PublicKeyCredential::from(
web_sys::PublicKeyCredential::from(data),
);
linkc.send_message(LoginAppMsg::WebauthnSubmit(data));
}
Err(e) => {
linkc.send_message(LoginAppMsg::Error(format!("{:?}", e), None));
}
}
});
} else {
self.link.send_message(LoginAppMsg::Error(
"failed to access navigator credentials".to_string(),
None,
));
};
html! {
<div class="container">
<p>
{" Webauthn "}
</p>
</div>
}
}
LoginState::Authenticated => {
html! {
<div class="container">
<p>
{ "Login Success 🎉" }
</p>
</div>
}
}
LoginState::Denied(msg) => {
html! {
<div class="container">
<p>
{ "Authentication Denied" }
</p>
<p>
{ msg.as_str() }
</p>
<button type="button" class="btn btn-dark" onclick=self.link.callback(|_| LoginAppMsg::Restart) >{" Start Again "}</button>
</div>
}
}
LoginState::Error(msg, last_opid) => {
html! {
<div class="container">
<p>
{ "An error has occured 😔 " }
</p>
<p>
{ msg.as_str() }
</p>
<p>
{ if let Some(opid) = last_opid.as_ref() { opid.clone() } else { "Local Error".to_string() } }
</p>
</div>
}
}
}
}
}
impl Component for LoginApp {
@ -58,13 +268,19 @@ impl Component for LoginApp {
let lstorage = StorageService::new(yew::services::storage::Area::Local).unwrap();
// Get any previous sessions?
let prev_session: Result<String, _> = lstorage.restore("kanidm_bearer_token");
ConsoleService::log(format!("prev_session -> {:?}", prev_session).as_str());
// Are they still valid?
LoginApp {
link,
username: "".to_string(),
inputvalue: "".to_string(),
lstorage,
ft: None,
session_id: "".to_string(),
state: LoginState::Init(true),
}
}
@ -74,46 +290,191 @@ impl Component for LoginApp {
fn update(&mut self, msg: Self::Message) -> ShouldRender {
match msg {
LoginAppMsg::UserNameInput(mut username) => {
std::mem::swap(&mut self.username, &mut username);
LoginAppMsg::Input(mut inputvalue) => {
std::mem::swap(&mut self.inputvalue, &mut inputvalue);
true
}
LoginAppMsg::Restart => {
// Clear any leftover input
self.inputvalue = "".to_string();
self.ft = None;
self.session_id = "".to_string();
self.state = LoginState::Init(true);
true
}
LoginAppMsg::Begin => {
ConsoleService::log(format!("begin -> {:?}", self.username).as_str());
ConsoleService::log(format!("begin -> {:?}", self.inputvalue).as_str());
// Disable the button?
self.auth_begin();
self.state = LoginState::Init(false);
self.auth_init();
true
}
LoginAppMsg::Next(state) => {
ConsoleService::log(format!("next -> {:?}", state).as_str());
LoginAppMsg::PasswordSubmit => {
ConsoleService::log("password");
// Disable the button?
self.state = LoginState::Password(false);
let authreq = AuthRequest {
step: AuthStep::Cred(AuthCredential::Password(self.inputvalue.clone())),
};
self.auth_step(authreq);
// Clear the password from memory.
self.inputvalue = "".to_string();
true
}
LoginAppMsg::TotpSubmit => {
ConsoleService::log("totp");
// Disable the button?
match u32::from_str_radix(&self.inputvalue, 10) {
Ok(totp) => {
self.state = LoginState::Totp(TotpState::Disabled);
let authreq = AuthRequest {
step: AuthStep::Cred(AuthCredential::TOTP(totp)),
};
self.auth_step(authreq);
}
Err(_) => {
self.state = LoginState::Totp(TotpState::Invalid);
}
}
// Clear the totp from memory.
self.inputvalue = "".to_string();
true
}
LoginAppMsg::WebauthnSubmit(resp) => {
ConsoleService::log("webauthn");
let authreq = AuthRequest {
step: AuthStep::Cred(AuthCredential::Webauthn(resp.into())),
};
self.auth_step(authreq);
// Do not submit here, we need to wait for the next ui transition.
false
}
LoginAppMsg::Start(session_id, resp) => {
// Clear any leftover input
self.inputvalue = "".to_string();
ConsoleService::log(format!("start -> {:?} : {:?}", resp, session_id).as_str());
match resp.state {
AuthState::Choose(mut mechs) => {
self.session_id = session_id;
if mechs.len() == 1 {
// If it's only one mech, just submit that.
let mech = mechs.pop().unwrap();
let authreq = AuthRequest {
step: AuthStep::Begin(mech),
};
self.auth_step(authreq);
// We do NOT need to change state or redraw
false
} else {
// Offer the choices.
ConsoleService::log(format!("unimplemented").as_str());
self.state = LoginState::Error("Unimplemented".to_string(), None);
true
}
}
AuthState::Denied(reason) => {
ConsoleService::log(format!("denied -> {:?}", reason).as_str());
self.state = LoginState::Denied(reason);
true
}
_ => {
ConsoleService::log(format!("invalid state transition").as_str());
self.state =
LoginState::Error("Invalid UI State Transition".to_string(), None);
true
}
}
}
LoginAppMsg::Next(resp) => {
// Clear any leftover input
self.inputvalue = "".to_string();
ConsoleService::log(format!("next -> {:?}", resp).as_str());
// Based on the state we have, we need to chose our steps.
match resp.state {
AuthState::Choose(_mechs) => {
ConsoleService::log(format!("invalid state transition").as_str());
self.state =
LoginState::Error("Invalid UI State Transition".to_string(), None);
true
}
AuthState::Continue(mut allowed) => {
if allowed.len() == 1 {
// If there is only one, change our state for that input type.
match allowed.pop().unwrap() {
AuthAllowed::Anonymous => {
// Just submit this.
}
AuthAllowed::Password => {
// Go to the password view.
self.state = LoginState::Password(true);
}
AuthAllowed::TOTP => {
self.state = LoginState::Totp(TotpState::Enabled);
}
AuthAllowed::Webauthn(challenge) => {
self.state = LoginState::Webauthn(challenge.into())
}
}
} else {
// Else, present the options in a choice.
}
true
}
AuthState::Denied(reason) => {
ConsoleService::log(format!("denied -> {:?}", reason).as_str());
self.state = LoginState::Denied(reason);
true
}
AuthState::Success(bearer_token) => {
// Store the bearer here!
self.lstorage.store("kanidm_bearer_token", Ok(bearer_token));
self.state = LoginState::Authenticated;
startConfetti();
true
}
}
}
LoginAppMsg::Error(msg, opid) => {
// Clear any leftover input
self.inputvalue = "".to_string();
ConsoleService::log(format!("error -> {:?}, {:?}", msg, opid).as_str());
self.state = LoginState::Error(msg, opid);
true
}
LoginAppMsg::DoNothing => false,
}
}
fn view(&self) -> Html {
// How do we add a top level theme?
let (width, height): (u32, u32) = if let Some(win) = web_sys::window() {
let w = win.inner_width().unwrap();
let h = win.inner_height().unwrap();
ConsoleService::log(format!("width {:?} {:?}", w, w.as_f64()).as_str());
ConsoleService::log(format!("height {:?} {:?}", h, h.as_f64()).as_str());
(w.as_f64().unwrap() as u32, h.as_f64().unwrap() as u32)
} else {
ConsoleService::log("Unable to access document window");
(0, 0)
};
html! {
<div id="content" class="container">
<div class="row d-flex justify-content-center align-items-center" style="min-height: 100vh;">
<div class="col">
</div>
<div class="col-sm-6">
<div class="container">
<h2>{ "Kanidm Alpha 🦀 " }</h2>
<p>
{" Username: "}
</p>
<div>
<canvas id="confetti-canvas" style="position:absolute" width=width height=height></canvas>
<div id="content" class="container">
<div class="row d-flex justify-content-center align-items-center" style="min-height: 100vh;">
<div class="col">
</div>
<div class="container">
<div>
<input id="username" type="text" class="form-control" value=self.username oninput=self.link.callback(|e: InputData| LoginAppMsg::UserNameInput(e.value)) />
<button type="button" class="btn btn-dark" onclick=self.link.callback(|_| LoginAppMsg::Begin)>{" Begin "}</button>
<div class="col-sm-6">
<div class="container">
<h2>{ "Kanidm Alpha 🦀 " }</h2>
</div>
{ self.view_state() }
</div>
<div class="col">
</div>
</div>
<div class="col">
</div>
</div>
</div>