From 0cad39501365915d0756ea74f5b7cc1a8c259ecb Mon Sep 17 00:00:00 2001 From: realaravinth Date: Fri, 27 May 2022 13:55:17 +0000 Subject: [PATCH] =?UTF-8?q?Deploying=20to=20gh-pages=20from=20=20@=203710c?= =?UTF-8?q?8f653b52e66f6d8a6a885a3e21514b346cd=20=F0=9F=9A=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- crates.js | 2 +- db_core/all.html | 7 + db_core/dev/attr.async_trait.html | 8 + db_core/dev/index.html | 11 + db_core/dev/sidebar-items.js | 1 + db_core/enum.Login.html | 45 + db_core/errors/enum.DBError.html | 55 + db_core/errors/index.html | 14 + db_core/errors/sidebar-items.js | 1 + db_core/errors/type.BoxDynError.html | 9 + db_core/errors/type.DBResult.html | 9 + db_core/index.html | 44 + db_core/ops/index.html | 14 + db_core/ops/sidebar-items.js | 1 + db_core/ops/trait.Connect.html | 15 + db_core/ops/trait.DBOps.html | 9 + db_core/ops/trait.GetConnection.html | 15 + db_core/ops/trait.Migrate.html | 13 + db_core/prelude/index.html | 10 + db_core/prelude/sidebar-items.js | 1 + db_core/sidebar-items.js | 1 + db_core/struct.AddNotification.html | 50 + db_core/struct.Captcha.html | 50 + db_core/struct.CreateCaptcha.html | 48 + db_core/struct.Level.html | 43 + db_core/struct.NameHash.html | 45 + db_core/struct.Notification.html | 52 + db_core/struct.Register.html | 49 + db_core/struct.Secret.html | 44 + db_core/struct.StatsUnixTimestamp.html | 48 + db_core/struct.TrafficPattern.html | 48 + db_core/struct.UpdateEmail.html | 45 + db_core/tests/fn.database_works.html | 9 + db_core/tests/index.html | 11 + db_core/tests/sidebar-items.js | 1 + db_core/trait.CloneSPDatabase.html | 12 + db_core/trait.MCDatabase.html | 81 + db_sqlx_postgres/all.html | 7 + db_sqlx_postgres/dev/attr.async_trait.html | 8 + .../dev/dev/attr.async_trait.html | 8 + db_sqlx_postgres/dev/dev/enum.DBError.html | 55 + db_sqlx_postgres/dev/dev/enum.Login.html | 45 + db_sqlx_postgres/dev/dev/index.html | 38 + .../dev/dev/prelude/enum.DBError.html | 55 + .../dev/dev/prelude/enum.Login.html | 45 + db_sqlx_postgres/dev/dev/prelude/index.html | 35 + .../dev/dev/prelude/sidebar-items.js | 1 + .../dev/prelude/struct.AddNotification.html | 50 + .../dev/dev/prelude/struct.Captcha.html | 50 + .../dev/dev/prelude/struct.CreateCaptcha.html | 48 + .../dev/dev/prelude/struct.Level.html | 43 + .../dev/dev/prelude/struct.NameHash.html | 45 + .../dev/dev/prelude/struct.Notification.html | 53 + .../dev/dev/prelude/struct.Register.html | 49 + .../dev/dev/prelude/struct.Secret.html | 44 + .../prelude/struct.StatsUnixTimestamp.html | 48 + .../dev/prelude/struct.TrafficPattern.html | 48 + .../dev/dev/prelude/struct.UpdateEmail.html | 45 + .../dev/prelude/trait.CloneSPDatabase.html | 12 + .../dev/dev/prelude/trait.Connect.html | 15 + .../dev/dev/prelude/trait.DBOps.html | 9 + .../dev/dev/prelude/trait.GetConnection.html | 15 + .../dev/dev/prelude/trait.MCDatabase.html | 81 + .../dev/dev/prelude/trait.Migrate.html | 13 + .../dev/dev/prelude/type.BoxDynError.html | 9 + .../dev/dev/prelude/type.DBResult.html | 9 + db_sqlx_postgres/dev/dev/sidebar-items.js | 1 + .../dev/dev/struct.AddNotification.html | 50 + db_sqlx_postgres/dev/dev/struct.Captcha.html | 50 + .../dev/dev/struct.CreateCaptcha.html | 48 + db_sqlx_postgres/dev/dev/struct.Level.html | 43 + db_sqlx_postgres/dev/dev/struct.NameHash.html | 45 + .../dev/dev/struct.Notification.html | 53 + db_sqlx_postgres/dev/dev/struct.Register.html | 49 + .../dev/dev/struct.Secret.html | 30 +- .../dev/dev/struct.StatsUnixTimestamp.html | 48 + .../dev/dev/struct.TrafficPattern.html | 48 + .../dev/dev/struct.UpdateEmail.html | 45 + .../dev/dev/trait.CloneSPDatabase.html | 12 + db_sqlx_postgres/dev/dev/trait.Connect.html | 15 + db_sqlx_postgres/dev/dev/trait.DBOps.html | 9 + .../dev/dev/trait.GetConnection.html | 15 + .../dev/dev/trait.MCDatabase.html | 81 + db_sqlx_postgres/dev/dev/trait.Migrate.html | 13 + .../dev/dev/type.BoxDynError.html | 9 + db_sqlx_postgres/dev/dev/type.DBResult.html | 9 + db_sqlx_postgres/dev/enum.DBError.html | 55 + db_sqlx_postgres/dev/enum.Error.html | 82 + db_sqlx_postgres/dev/enum.Login.html | 45 + db_sqlx_postgres/dev/errors/enum.DBError.html | 55 + db_sqlx_postgres/dev/errors/index.html | 14 + db_sqlx_postgres/dev/errors/sidebar-items.js | 1 + .../dev/errors/type.BoxDynError.html | 9 + .../dev/errors/type.DBResult.html | 9 + db_sqlx_postgres/dev/index.html | 43 + db_sqlx_postgres/dev/ops/index.html | 14 + db_sqlx_postgres/dev/ops/sidebar-items.js | 1 + db_sqlx_postgres/dev/ops/trait.Connect.html | 15 + db_sqlx_postgres/dev/ops/trait.DBOps.html | 9 + .../dev/ops/trait.GetConnection.html | 15 + db_sqlx_postgres/dev/ops/trait.Migrate.html | 13 + .../dev/prelude/dev/attr.async_trait.html | 8 + .../dev/prelude/dev/enum.DBError.html | 55 + .../dev/prelude/dev/enum.Login.html | 45 + db_sqlx_postgres/dev/prelude/dev/index.html | 36 + .../dev/prelude/dev/sidebar-items.js | 1 + .../prelude/dev/struct.AddNotification.html | 50 + .../dev/prelude/dev/struct.Captcha.html | 50 + .../dev/prelude/dev/struct.CreateCaptcha.html | 48 + .../dev/prelude/dev/struct.Level.html | 43 + .../dev/prelude/dev/struct.NameHash.html | 45 + .../dev/prelude/dev/struct.Notification.html | 53 + .../dev/prelude/dev/struct.Register.html | 49 + .../dev/prelude/dev/struct.Secret.html | 44 + .../dev/struct.StatsUnixTimestamp.html | 48 + .../prelude/dev/struct.TrafficPattern.html | 48 + .../dev/prelude/dev/struct.UpdateEmail.html | 45 + .../prelude/dev/trait.CloneSPDatabase.html | 12 + .../dev/prelude/dev/trait.Connect.html | 15 + .../dev/prelude/dev/trait.DBOps.html | 9 + .../dev/prelude/dev/trait.GetConnection.html | 15 + .../dev/prelude/dev/trait.MCDatabase.html | 81 + .../dev/prelude/dev/trait.Migrate.html | 13 + .../dev/prelude/dev/type.BoxDynError.html | 9 + .../dev/prelude/dev/type.DBResult.html | 9 + .../dev/prelude/enum.DBError.html | 55 + db_sqlx_postgres/dev/prelude/enum.Login.html | 45 + db_sqlx_postgres/dev/prelude/index.html | 37 + db_sqlx_postgres/dev/prelude/sidebar-items.js | 1 + .../dev/prelude/struct.AddNotification.html | 50 + .../dev/prelude/struct.Captcha.html | 50 + .../dev/prelude/struct.CreateCaptcha.html | 48 + .../dev/prelude/struct.Level.html | 43 + .../dev/prelude/struct.NameHash.html | 45 + .../dev/prelude/struct.Notification.html | 53 + .../dev/prelude/struct.Register.html | 49 + .../dev/prelude/struct.Secret.html | 44 + .../prelude/struct.StatsUnixTimestamp.html | 48 + .../dev/prelude/struct.TrafficPattern.html | 48 + .../dev/prelude/struct.UpdateEmail.html | 31 +- .../dev/prelude/trait.CloneSPDatabase.html | 12 + .../dev/prelude/trait.Connect.html | 15 + db_sqlx_postgres/dev/prelude/trait.DBOps.html | 9 + .../dev/prelude/trait.GetConnection.html | 15 + .../dev/prelude/trait.MCDatabase.html | 81 + .../dev/prelude/trait.Migrate.html | 13 + .../dev/prelude/type.BoxDynError.html | 9 + .../dev/prelude/type.DBResult.html | 9 + db_sqlx_postgres/dev/sidebar-items.js | 1 + .../dev/struct.AddNotification.html | 50 + db_sqlx_postgres/dev/struct.Captcha.html | 50 + .../dev/struct.CreateCaptcha.html | 48 + db_sqlx_postgres/dev/struct.Level.html | 43 + db_sqlx_postgres/dev/struct.NameHash.html | 45 + db_sqlx_postgres/dev/struct.Notification.html | 53 + db_sqlx_postgres/dev/struct.Register.html | 49 + db_sqlx_postgres/dev/struct.Secret.html | 44 + .../dev/struct.StatsUnixTimestamp.html | 48 + .../dev/struct.TrafficPattern.html | 48 + db_sqlx_postgres/dev/struct.UpdateEmail.html | 45 + .../dev/tests/fn.database_works.html | 9 + db_sqlx_postgres/dev/tests/index.html | 11 + db_sqlx_postgres/dev/tests/sidebar-items.js | 1 + .../dev/trait.CloneSPDatabase.html | 12 + db_sqlx_postgres/dev/trait.Connect.html | 15 + db_sqlx_postgres/dev/trait.DBOps.html | 9 + db_sqlx_postgres/dev/trait.GetConnection.html | 15 + db_sqlx_postgres/dev/trait.MCDatabase.html | 81 + db_sqlx_postgres/dev/trait.Migrate.html | 13 + db_sqlx_postgres/dev/type.BoxDynError.html | 9 + db_sqlx_postgres/dev/type.DBResult.html | 9 + .../enum.ConnectionOptions.html | 29 +- .../errors/fn.map_register_err.html | 9 + .../errors/fn.map_row_not_found_err.html | 9 + db_sqlx_postgres/errors/index.html | 12 + db_sqlx_postgres/errors/sidebar-items.js | 1 + db_sqlx_postgres/index.html | 15 + .../prelude/dev/attr.async_trait.html | 8 + .../prelude/dev/enum.DBError.html | 55 + db_sqlx_postgres/prelude/dev/enum.Login.html | 45 + db_sqlx_postgres/prelude/dev/index.html | 38 + .../prelude/dev/prelude/enum.DBError.html | 55 + .../prelude/dev/prelude/enum.Login.html | 45 + .../prelude/dev/prelude/index.html | 35 + .../prelude/dev/prelude/sidebar-items.js | 1 + .../dev/prelude/struct.AddNotification.html | 50 + .../prelude/dev/prelude/struct.Captcha.html | 50 + .../dev/prelude/struct.CreateCaptcha.html | 48 + .../prelude/dev/prelude/struct.Level.html | 43 + .../prelude/dev/prelude/struct.NameHash.html | 30 +- .../dev/prelude/struct.Notification.html | 53 + .../prelude/dev/prelude/struct.Register.html | 49 + .../prelude/dev/prelude/struct.Secret.html | 44 + .../prelude/struct.StatsUnixTimestamp.html | 48 + .../dev/prelude/struct.TrafficPattern.html | 48 + .../dev/prelude/struct.UpdateEmail.html | 45 + .../dev/prelude/trait.CloneSPDatabase.html | 12 + .../prelude/dev/prelude/trait.Connect.html | 15 + .../prelude/dev/prelude/trait.DBOps.html | 9 + .../dev/prelude/trait.GetConnection.html | 15 + .../prelude/dev/prelude/trait.MCDatabase.html | 81 + .../prelude/dev/prelude/trait.Migrate.html | 13 + .../prelude/dev/prelude/type.BoxDynError.html | 9 + .../prelude/dev/prelude/type.DBResult.html | 9 + db_sqlx_postgres/prelude/dev/sidebar-items.js | 1 + .../prelude/dev/struct.AddNotification.html | 50 + .../prelude/dev/struct.Captcha.html | 50 + .../prelude/dev/struct.CreateCaptcha.html | 48 + .../prelude/dev/struct.Level.html | 43 + .../prelude/dev/struct.NameHash.html | 45 + .../prelude/dev/struct.Notification.html | 53 + .../prelude/dev/struct.Register.html | 49 + .../prelude/dev/struct.Secret.html | 44 + .../dev/struct.StatsUnixTimestamp.html | 48 + .../prelude/dev/struct.TrafficPattern.html | 48 + .../prelude/dev/struct.UpdateEmail.html | 45 + .../prelude/dev/trait.CloneSPDatabase.html | 12 + .../prelude/dev/trait.Connect.html | 15 + db_sqlx_postgres/prelude/dev/trait.DBOps.html | 9 + .../prelude/dev/trait.GetConnection.html | 15 + .../prelude/dev/trait.MCDatabase.html | 81 + .../prelude/dev/trait.Migrate.html | 13 + .../prelude/dev/type.BoxDynError.html | 9 + .../prelude/dev/type.DBResult.html | 9 + db_sqlx_postgres/prelude/enum.DBError.html | 55 + db_sqlx_postgres/prelude/enum.Login.html | 45 + .../prelude/errors/enum.DBError.html | 55 + db_sqlx_postgres/prelude/errors/index.html | 14 + .../prelude/errors/sidebar-items.js | 1 + .../prelude/errors/type.BoxDynError.html | 9 + .../prelude/errors/type.DBResult.html | 9 + db_sqlx_postgres/prelude/index.html | 40 + db_sqlx_postgres/prelude/ops/index.html | 14 + db_sqlx_postgres/prelude/ops/sidebar-items.js | 1 + .../prelude/ops/trait.Connect.html | 15 + db_sqlx_postgres/prelude/ops/trait.DBOps.html | 9 + .../prelude/ops/trait.GetConnection.html | 15 + .../prelude/ops/trait.Migrate.html | 13 + db_sqlx_postgres/prelude/sidebar-items.js | 1 + .../prelude/struct.AddNotification.html | 50 + db_sqlx_postgres/prelude/struct.Captcha.html | 50 + .../prelude/struct.CreateCaptcha.html | 48 + db_sqlx_postgres/prelude/struct.Level.html | 43 + db_sqlx_postgres/prelude/struct.NameHash.html | 45 + .../prelude/struct.Notification.html | 53 + db_sqlx_postgres/prelude/struct.Register.html | 49 + db_sqlx_postgres/prelude/struct.Secret.html | 44 + .../prelude/struct.StatsUnixTimestamp.html | 48 + .../prelude/struct.TrafficPattern.html | 48 + .../prelude/struct.UpdateEmail.html | 45 + .../prelude/tests/fn.database_works.html | 9 + db_sqlx_postgres/prelude/tests/index.html | 11 + .../prelude/tests/sidebar-items.js | 1 + .../prelude/trait.CloneSPDatabase.html | 12 + db_sqlx_postgres/prelude/trait.Connect.html | 15 + db_sqlx_postgres/prelude/trait.DBOps.html | 9 + .../prelude/trait.GetConnection.html | 15 + .../prelude/trait.MCDatabase.html | 81 + db_sqlx_postgres/prelude/trait.Migrate.html | 13 + .../prelude/type.BoxDynError.html | 9 + db_sqlx_postgres/prelude/type.DBResult.html | 9 + db_sqlx_postgres/sidebar-items.js | 1 + .../struct.Conn.html | 22 +- db_sqlx_postgres/struct.Database.html | 73 + .../struct.Fresh.html | 23 +- .../struct.InnerNotification.html | 51 + implementors/core/clone/trait.Clone.js | 5 +- implementors/core/cmp/trait.PartialEq.js | 4 +- implementors/core/convert/trait.From.js | 3 +- implementors/core/default/trait.Default.js | 4 +- implementors/core/fmt/trait.Debug.js | 5 +- implementors/core/fmt/trait.Display.js | 3 +- implementors/core/marker/trait.Freeze.js | 5 +- implementors/core/marker/trait.Send.js | 5 +- .../core/marker/trait.StructuralPartialEq.js | 4 +- implementors/core/marker/trait.Sync.js | 5 +- implementors/core/marker/trait.Unpin.js | 5 +- implementors/core/ops/deref/trait.Deref.js | 1 - .../panic/unwind_safe/trait.RefUnwindSafe.js | 5 +- .../panic/unwind_safe/trait.UnwindSafe.js | 5 +- implementors/db_core/trait.CloneSPDatabase.js | 3 + .../prelude/trait.CloneSPDatabase.js | 3 + .../db_sqlx_postgres/prelude/trait.Connect.js | 3 + .../prelude/trait.MCDatabase.js | 3 + .../db_sqlx_postgres/prelude/trait.Migrate.js | 3 + implementors/lazy_static/trait.LazyStatic.js | 1 - .../mcaptcha/stats/trait.CloneStats.js | 3 + implementors/mcaptcha/stats/trait.Stats.js | 3 + implementors/serde/de/trait.Deserialize.js | 4 +- implementors/serde/ser/trait.Serialize.js | 3 +- implementors/std/error/trait.Error.js | 3 +- mcaptcha/all.html | 2 +- .../api/v1/account/delete/fn.services.html | 2 +- mcaptcha/api/v1/account/delete/index.html | 2 +- .../delete/runners/fn.delete_user.html | 2 +- .../api/v1/account/delete/runners/index.html | 2 +- .../api/v1/account/email/fn.services.html | 2 +- mcaptcha/api/v1/account/email/index.html | 2 +- .../api/v1/account/email/struct.Email.html | 10 +- .../v1/account/email/struct.email_exists.html | 2 +- .../v1/account/email/struct.set_email.html | 4 +- .../api/v1/account/password/fn.services.html | 2 +- .../password/fn.update_password_runner.html | 2 +- mcaptcha/api/v1/account/password/index.html | 2 +- .../password/struct.ChangePasswordReqest.html | 12 +- .../password/struct.UpdatePassword.html | 4 +- .../password/struct.update_user_password.html | 2 +- .../api/v1/account/secret/fn.services.html | 2 +- mcaptcha/api/v1/account/secret/index.html | 4 +- .../api/v1/account/secret/sidebar-items.js | 2 +- .../v1/account/secret/struct.get_secret.html | 2 +- .../secret/struct.update_user_secret.html | 2 +- .../api/v1/account/username/fn.services.html | 2 +- mcaptcha/api/v1/account/username/index.html | 2 +- .../username/runners/fn.username_exists.html | 2 +- .../v1/account/username/runners/index.html | 2 +- .../v1/account/username/struct.Username.html | 10 +- .../account/username/struct.set_username.html | 4 +- .../username/struct.username_exists.html | 2 +- mcaptcha/api/v1/auth/fn.services.html | 2 +- mcaptcha/api/v1/auth/index.html | 2 +- mcaptcha/api/v1/auth/routes/index.html | 2 +- mcaptcha/api/v1/auth/routes/struct.Auth.html | 4 +- .../api/v1/auth/runners/fn.login_runner.html | 2 +- .../v1/auth/runners/fn.register_runner.html | 2 +- mcaptcha/api/v1/auth/runners/index.html | 2 +- .../api/v1/auth/runners/struct.Login.html | 10 +- .../api/v1/auth/runners/struct.Password.html | 10 +- .../api/v1/auth/runners/struct.Register.html | 10 +- mcaptcha/api/v1/auth/struct.login.html | 2 +- mcaptcha/api/v1/auth/struct.register.html | 2 +- mcaptcha/api/v1/auth/struct.signout.html | 2 +- mcaptcha/api/v1/mcaptcha/create/index.html | 2 +- .../v1/mcaptcha/create/runner/fn.create.html | 2 +- .../api/v1/mcaptcha/create/runner/index.html | 2 +- .../mcaptcha/create/struct.CreateCaptcha.html | 6 +- .../create/struct.MCaptchaDetails.html | 10 +- .../api/v1/mcaptcha/create/struct.create.html | 2 +- mcaptcha/api/v1/mcaptcha/delete/index.html | 2 +- .../mcaptcha/delete/struct.DeleteCaptcha.html | 10 +- .../api/v1/mcaptcha/delete/struct.delete.html | 2 +- .../api/v1/mcaptcha/easy/fn.calculate.html | 8 + .../api/v1/mcaptcha/easy/fn.services.html | 2 +- mcaptcha/api/v1/mcaptcha/easy/index.html | 7 +- .../api/v1/mcaptcha/easy/routes/index.html | 2 +- .../v1/mcaptcha/easy/routes/struct.Easy.html | 4 +- .../api/v1/mcaptcha/easy/sidebar-items.js | 2 +- ...html => struct.TrafficPatternRequest.html} | 25 +- .../easy/struct.UpdateTrafficPattern.html | 12 +- .../api/v1/mcaptcha/easy/struct.create.html | 2 +- .../api/v1/mcaptcha/easy/struct.update.html | 2 +- mcaptcha/api/v1/mcaptcha/get/index.html | 5 +- .../mcaptcha/get/runner/fn.get_captcha.html | 8 - .../api/v1/mcaptcha/get/runner/index.html | 9 - .../v1/mcaptcha/get/runner/sidebar-items.js | 1 - mcaptcha/api/v1/mcaptcha/get/sidebar-items.js | 2 +- .../api/v1/mcaptcha/get/struct.I32Levels.html | 10 +- .../api/v1/mcaptcha/get/struct.Levels.html | 10 +- mcaptcha/api/v1/mcaptcha/stats/index.html | 2 +- .../api/v1/mcaptcha/stats/routes/index.html | 2 +- .../mcaptcha/stats/routes/struct.Stats.html | 4 +- .../mcaptcha/stats/struct.StatsPayload.html | 10 +- .../api/v1/mcaptcha/stats/struct.get.html | 2 +- mcaptcha/api/v1/mcaptcha/update/index.html | 2 +- .../update/runner/fn.update_captcha.html | 2 +- .../mcaptcha/update/runner/fn.update_key.html | 8 - .../api/v1/mcaptcha/update/runner/index.html | 4 +- .../mcaptcha/update/runner/sidebar-items.js | 2 +- .../mcaptcha/update/struct.UpdateCaptcha.html | 6 +- .../update/struct.update_captcha.html | 2 +- .../v1/mcaptcha/update/struct.update_key.html | 2 +- mcaptcha/api/v1/meta/fn.services.html | 2 +- mcaptcha/api/v1/meta/index.html | 2 +- mcaptcha/api/v1/notifications/add/index.html | 4 +- .../api/v1/notifications/add/sidebar-items.js | 2 +- .../add/struct.AddNotification.html | 34 - .../add/struct.AddNotificationRequest.html} | 24 +- .../add/struct.add_notification.html | 4 +- mcaptcha/api/v1/notifications/get/index.html | 7 +- .../get/runner/fn.get_notification.html | 8 - .../v1/notifications/get/runner/index.html | 9 - .../notifications/get/runner/sidebar-items.js | 1 - .../api/v1/notifications/get/sidebar-items.js | 2 +- .../get/struct.Notification.html | 36 - .../get/struct.NotificationResp.html | 21 +- .../get/struct.get_notification.html | 4 +- .../api/v1/notifications/mark_read/index.html | 4 +- .../notifications/mark_read/sidebar-items.js | 2 +- .../mark_read/struct.NotificationResp.html | 36 - .../mark_read/struct.mark_read.html | 4 +- .../v1/pow/get_config/fn.init_mcaptcha.html | 2 +- mcaptcha/api/v1/pow/get_config/index.html | 2 +- .../get_config/struct.GetConfigPayload.html | 10 +- .../v1/pow/get_config/struct.get_config.html | 4 +- mcaptcha/api/v1/pow/verify_pow/index.html | 2 +- .../verify_pow/struct.ValidationToken.html | 10 +- .../v1/pow/verify_pow/struct.verify_pow.html | 4 +- mcaptcha/api/v1/pow/verify_token/index.html | 2 +- .../struct.CaptchaValidateResp.html | 10 +- .../struct.validate_captcha_token.html | 4 +- mcaptcha/constant.GIT_COMMIT_HASH.html | 2 +- mcaptcha/data/enum.SystemGroup.html | 4 +- mcaptcha/data/index.html | 2 +- mcaptcha/data/macro.enum_system_actor.html | 2 +- mcaptcha/data/macro.enum_system_wrapper.html | 2 +- mcaptcha/data/struct.Data.html | 16 +- mcaptcha/data/type.Mailer.html | 2 +- mcaptcha/date/index.html | 2 +- mcaptcha/date/struct.Date.html | 6 +- mcaptcha/demo/index.html | 2 +- mcaptcha/docs/constant.OPEN_API_SPEC.html | 2 +- mcaptcha/docs/index.html | 2 +- mcaptcha/docs/struct.dist.html | 2 +- mcaptcha/docs/struct.index.html | 2 +- mcaptcha/docs/struct.spec.html | 2 +- .../email/verification/constant.PAGE.html | 2 +- .../email/verification/fn.verification.html | 2 +- .../email/verification/struct.IndexPage.html | 10 +- mcaptcha/errors/enum.PageError.html | 24 +- mcaptcha/errors/enum.ServiceError.html | 48 +- mcaptcha/errors/index.html | 4 +- mcaptcha/errors/sidebar-items.js | 2 +- mcaptcha/errors/struct.DBErrorWrapper.html | 38 + mcaptcha/errors/struct.ErrorToResponse.html | 6 +- mcaptcha/errors/struct.SmtpErrorWrapper.html | 8 +- mcaptcha/errors/type.PageResult.html | 2 +- mcaptcha/errors/type.ServiceResult.html | 2 +- mcaptcha/fn.get_identity_service.html | 2 +- mcaptcha/fn.get_json_err.html | 2 +- mcaptcha/fn.main.html | 2 +- mcaptcha/index.html | 4 +- mcaptcha/pages/auth/login/constant.PAGE.html | 2 +- mcaptcha/pages/auth/login/index.html | 2 +- mcaptcha/pages/auth/login/struct.INDEX.html | 8 +- .../pages/auth/login/struct.IndexPage.html | 10 +- mcaptcha/pages/auth/login/struct.login.html | 2 +- mcaptcha/pages/constant.NAME.html | 2 +- .../pages/errors/constant.ERROR_ROUTE.html | 2 +- mcaptcha/pages/errors/constant.PAGE.html | 2 +- mcaptcha/pages/errors/fn.services.html | 2 +- mcaptcha/pages/errors/index.html | 2 +- mcaptcha/pages/errors/routes/index.html | 2 +- .../pages/errors/routes/struct.Errors.html | 4 +- mcaptcha/pages/errors/struct.ErrorPage.html | 10 +- .../struct.INTERNAL_SERVER_ERROR_BODY.html | 8 +- .../errors/struct.UNKNOWN_ERROR_BODY.html | 8 +- mcaptcha/pages/errors/struct.error.html | 2 +- mcaptcha/pages/fn.get_middleware.html | 2 +- mcaptcha/pages/fn.services.html | 2 +- mcaptcha/pages/index.html | 2 +- mcaptcha/pages/panel/constant.PAGE.html | 2 +- mcaptcha/pages/panel/fn.services.html | 2 +- mcaptcha/pages/panel/index.html | 2 +- .../panel/notifications/constant.PAGE.html | 2 +- .../panel/notifications/struct.IndexPage.html | 8 +- .../notifications/struct.Notification.html | 4 +- .../notifications/struct.notifications.html | 2 +- mcaptcha/pages/panel/routes/index.html | 2 +- mcaptcha/pages/panel/routes/struct.Panel.html | 4 +- mcaptcha/pages/panel/settings/index.html | 2 +- .../panel/settings/struct.delete_account.html | 2 +- .../panel/settings/struct.update_secret.html | 2 +- .../panel/sitekey/edit/constant.PAGE.html | 2 +- mcaptcha/pages/panel/sitekey/edit/index.html | 4 +- .../pages/panel/sitekey/edit/sidebar-items.js | 2 +- .../sitekey/edit/struct.AdvanceEditPage.html | 12 +- .../sitekey/edit/struct.EasyEditPage.html | 12 +- .../panel/sitekey/edit/struct.advance.html | 4 +- .../pages/panel/sitekey/edit/struct.easy.html | 4 +- .../panel/sitekey/list/constant.PAGE.html | 2 +- .../sitekey/list/fn.get_list_sitekeys.html | 9 - mcaptcha/pages/panel/sitekey/list/index.html | 9 +- .../pages/panel/sitekey/list/sidebar-items.js | 2 +- .../panel/sitekey/list/struct.IndexPage.html | 12 +- .../sitekey/list/struct.list_sitekeys.html | 4 +- .../panel/sitekey/list/type.SiteKeys.html | 8 - .../panel/sitekey/view/constant.PAGE.html | 2 +- mcaptcha/pages/panel/sitekey/view/index.html | 4 +- .../pages/panel/sitekey/view/sidebar-items.js | 2 +- .../panel/sitekey/view/struct.IndexPage.html | 14 +- .../sitekey/view/struct.view_sitekey.html | 4 +- mcaptcha/pages/panel/struct.IndexPage.html | 12 +- mcaptcha/pages/panel/struct.panel.html | 2 +- mcaptcha/settings/fn.check_url.html | 2 +- mcaptcha/settings/fn.set_database_url.html | 2 +- .../settings/fn.set_from_database_url.html | 2 +- mcaptcha/settings/index.html | 2 +- mcaptcha/settings/struct.Captcha.html | 7 +- mcaptcha/settings/struct.Database.html | 8 +- mcaptcha/settings/struct.DatabaseBuilder.html | 8 +- .../struct.DefaultDifficultyStrategy.html | 8 +- mcaptcha/settings/struct.Redis.html | 8 +- mcaptcha/settings/struct.Server.html | 2 +- mcaptcha/settings/struct.Settings.html | 8 +- mcaptcha/settings/struct.Smtp.html | 8 +- mcaptcha/sidebar-items.js | 2 +- .../static_files/fn.handle_favicons.html | 2 +- .../static_assets/static_files/index.html | 2 +- .../static_files/struct.Favicons.html | 8 +- .../static_files/struct.favicons.html | 2 +- .../static_files/struct.static_files.html | 2 +- mcaptcha/stats/fetch/index.html | 10 - .../runners/fn.fetch_config_fetched.html | 9 - .../stats/fetch/runners/fn.fetch_confirm.html | 9 - .../stats/fetch/runners/fn.fetch_solve.html | 9 - mcaptcha/stats/fetch/runners/index.html | 12 - mcaptcha/stats/fetch/runners/sidebar-items.js | 1 - mcaptcha/stats/fetch/sidebar-items.js | 1 - mcaptcha/stats/index.html | 8 +- mcaptcha/stats/record/fn.record_confirm.html | 9 - mcaptcha/stats/record/fn.record_fetch.html | 9 - mcaptcha/stats/record/fn.record_solve.html | 9 - mcaptcha/stats/record/index.html | 12 - mcaptcha/stats/record/sidebar-items.js | 1 - mcaptcha/stats/sidebar-items.js | 2 +- ...imestamp.html => struct.CaptchaStats.html} | 27 +- mcaptcha/stats/struct.Dummy.html | 42 + mcaptcha/stats/struct.Real.html | 42 + mcaptcha/stats/trait.CloneStats.html | 12 + mcaptcha/stats/trait.Stats.html | 17 + mcaptcha/struct.Data.html | 16 +- mcaptcha/struct.Settings.html | 8 +- mcaptcha/type.AppData.html | 2 +- mcaptcha/type.ArcData.html | 8 + search-index.js | 5 +- source-files.js | 5 +- src/db_core/errors.rs.html | 130 ++ src/db_core/lib.rs.html | 712 +++++++ src/db_core/ops.rs.html | 106 + src/db_core/tests.rs.html | 576 +++++ src/db_sqlx_postgres/errors.rs.html | 120 ++ src/db_sqlx_postgres/lib.rs.html | 1888 +++++++++++++++++ src/mcaptcha/api/mod.rs.html | 30 +- src/mcaptcha/api/v1/account/delete.rs.html | 76 +- src/mcaptcha/api/v1/account/email.rs.html | 68 +- src/mcaptcha/api/v1/account/password.rs.html | 78 +- src/mcaptcha/api/v1/account/secret.rs.html | 100 +- src/mcaptcha/api/v1/account/username.rs.html | 72 +- src/mcaptcha/api/v1/auth.rs.html | 170 +- src/mcaptcha/api/v1/mcaptcha/create.rs.html | 156 +- src/mcaptcha/api/v1/mcaptcha/delete.rs.html | 96 +- src/mcaptcha/api/v1/mcaptcha/easy.rs.html | 296 +-- src/mcaptcha/api/v1/mcaptcha/get.rs.html | 56 +- src/mcaptcha/api/v1/mcaptcha/stats.rs.html | 36 +- src/mcaptcha/api/v1/mcaptcha/update.rs.html | 174 +- src/mcaptcha/api/v1/meta.rs.html | 56 +- src/mcaptcha/api/v1/mod.rs.html | 30 +- src/mcaptcha/api/v1/notifications/add.rs.html | 88 +- src/mcaptcha/api/v1/notifications/get.rs.html | 136 +- .../api/v1/notifications/mark_read.rs.html | 90 +- src/mcaptcha/api/v1/notifications/mod.rs.html | 30 +- src/mcaptcha/api/v1/pow/get_config.rs.html | 162 +- src/mcaptcha/api/v1/pow/mod.rs.html | 30 +- src/mcaptcha/api/v1/pow/verify_pow.rs.html | 50 +- src/mcaptcha/api/v1/pow/verify_token.rs.html | 50 +- src/mcaptcha/api/v1/routes.rs.html | 30 +- src/mcaptcha/data.rs.html | 90 +- src/mcaptcha/date.rs.html | 12 + src/mcaptcha/demo.rs.html | 16 +- src/mcaptcha/docs.rs.html | 2 - src/mcaptcha/email/mod.rs.html | 30 +- src/mcaptcha/email/verification.rs.html | 40 +- src/mcaptcha/errors.rs.html | 130 +- src/mcaptcha/main.rs.html | 30 +- src/mcaptcha/pages/auth/login.rs.html | 32 +- src/mcaptcha/pages/auth/mod.rs.html | 30 +- src/mcaptcha/pages/auth/register.rs.html | 30 +- src/mcaptcha/pages/errors.rs.html | 30 +- src/mcaptcha/pages/mod.rs.html | 16 +- src/mcaptcha/pages/panel/mod.rs.html | 12 +- .../pages/panel/notifications.rs.html | 10 +- src/mcaptcha/pages/panel/settings.rs.html | 28 +- src/mcaptcha/pages/panel/sitekey/add.rs.html | 30 +- .../pages/panel/sitekey/delete.rs.html | 30 +- src/mcaptcha/pages/panel/sitekey/edit.rs.html | 210 +- src/mcaptcha/pages/panel/sitekey/list.rs.html | 52 +- src/mcaptcha/pages/panel/sitekey/mod.rs.html | 30 +- src/mcaptcha/pages/panel/sitekey/view.rs.html | 98 +- src/mcaptcha/pages/routes.rs.html | 30 +- src/mcaptcha/settings.rs.html | 8 +- .../static_assets/static_files.rs.html | 108 +- src/mcaptcha/stats.rs.html | 268 +++ src/mcaptcha/stats/fetch.rs.html | 446 ---- src/mcaptcha/stats/mod.rs.html | 46 - src/mcaptcha/stats/record.rs.html | 130 -- src/tests_migrate/settings.rs.html | 490 ----- src/tests_migrate/tests-migrate.rs.html | 178 -- tests_migrate/all.html | 7 - tests_migrate/fn.build.html | 8 - tests_migrate/fn.cache_bust.html | 8 - tests_migrate/fn.main.html | 8 - tests_migrate/index.html | 11 - tests_migrate/settings/fn.check_url.html | 8 - .../settings/fn.set_database_url.html | 8 - .../settings/fn.set_from_database_url.html | 8 - tests_migrate/settings/index.html | 10 - tests_migrate/settings/sidebar-items.js | 1 - tests_migrate/settings/struct.Captcha.html | 31 - tests_migrate/settings/struct.Database.html | 30 - .../settings/struct.DatabaseBuilder.html | 33 - .../struct.DefaultDifficultyStrategy.html | 32 - tests_migrate/settings/struct.Redis.html | 30 - tests_migrate/settings/struct.Server.html | 34 - tests_migrate/settings/struct.Settings.html | 38 - tests_migrate/settings/struct.Smtp.html | 34 - tests_migrate/sidebar-items.js | 1 - tests_migrate/struct.SETTINGS.html | 24 - tests_migrate/struct.Settings.html | 38 - 608 files changed, 13753 insertions(+), 4723 deletions(-) create mode 100644 db_core/all.html create mode 100644 db_core/dev/attr.async_trait.html create mode 100644 db_core/dev/index.html create mode 100644 db_core/dev/sidebar-items.js create mode 100644 db_core/enum.Login.html create mode 100644 db_core/errors/enum.DBError.html create mode 100644 db_core/errors/index.html create mode 100644 db_core/errors/sidebar-items.js create mode 100644 db_core/errors/type.BoxDynError.html create mode 100644 db_core/errors/type.DBResult.html create mode 100644 db_core/index.html create mode 100644 db_core/ops/index.html create mode 100644 db_core/ops/sidebar-items.js create mode 100644 db_core/ops/trait.Connect.html create mode 100644 db_core/ops/trait.DBOps.html create mode 100644 db_core/ops/trait.GetConnection.html create mode 100644 db_core/ops/trait.Migrate.html create mode 100644 db_core/prelude/index.html create mode 100644 db_core/prelude/sidebar-items.js create mode 100644 db_core/sidebar-items.js create mode 100644 db_core/struct.AddNotification.html create mode 100644 db_core/struct.Captcha.html create mode 100644 db_core/struct.CreateCaptcha.html create mode 100644 db_core/struct.Level.html create mode 100644 db_core/struct.NameHash.html create mode 100644 db_core/struct.Notification.html create mode 100644 db_core/struct.Register.html create mode 100644 db_core/struct.Secret.html create mode 100644 db_core/struct.StatsUnixTimestamp.html create mode 100644 db_core/struct.TrafficPattern.html create mode 100644 db_core/struct.UpdateEmail.html create mode 100644 db_core/tests/fn.database_works.html create mode 100644 db_core/tests/index.html create mode 100644 db_core/tests/sidebar-items.js create mode 100644 db_core/trait.CloneSPDatabase.html create mode 100644 db_core/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/all.html create mode 100644 db_sqlx_postgres/dev/attr.async_trait.html create mode 100644 db_sqlx_postgres/dev/dev/attr.async_trait.html create mode 100644 db_sqlx_postgres/dev/dev/enum.DBError.html create mode 100644 db_sqlx_postgres/dev/dev/enum.Login.html create mode 100644 db_sqlx_postgres/dev/dev/index.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/enum.DBError.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/enum.Login.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/index.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/sidebar-items.js create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.AddNotification.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.Captcha.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.CreateCaptcha.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.Level.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.NameHash.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.Notification.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.Register.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.Secret.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.StatsUnixTimestamp.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.TrafficPattern.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/struct.UpdateEmail.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/trait.CloneSPDatabase.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/trait.Connect.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/trait.DBOps.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/trait.GetConnection.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/trait.Migrate.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/type.BoxDynError.html create mode 100644 db_sqlx_postgres/dev/dev/prelude/type.DBResult.html create mode 100644 db_sqlx_postgres/dev/dev/sidebar-items.js create mode 100644 db_sqlx_postgres/dev/dev/struct.AddNotification.html create mode 100644 db_sqlx_postgres/dev/dev/struct.Captcha.html create mode 100644 db_sqlx_postgres/dev/dev/struct.CreateCaptcha.html create mode 100644 db_sqlx_postgres/dev/dev/struct.Level.html create mode 100644 db_sqlx_postgres/dev/dev/struct.NameHash.html create mode 100644 db_sqlx_postgres/dev/dev/struct.Notification.html create mode 100644 db_sqlx_postgres/dev/dev/struct.Register.html rename mcaptcha/stats/fetch/struct.StatsPayload.html => db_sqlx_postgres/dev/dev/struct.Secret.html (56%) create mode 100644 db_sqlx_postgres/dev/dev/struct.StatsUnixTimestamp.html create mode 100644 db_sqlx_postgres/dev/dev/struct.TrafficPattern.html create mode 100644 db_sqlx_postgres/dev/dev/struct.UpdateEmail.html create mode 100644 db_sqlx_postgres/dev/dev/trait.CloneSPDatabase.html create mode 100644 db_sqlx_postgres/dev/dev/trait.Connect.html create mode 100644 db_sqlx_postgres/dev/dev/trait.DBOps.html create mode 100644 db_sqlx_postgres/dev/dev/trait.GetConnection.html create mode 100644 db_sqlx_postgres/dev/dev/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/dev/dev/trait.Migrate.html create mode 100644 db_sqlx_postgres/dev/dev/type.BoxDynError.html create mode 100644 db_sqlx_postgres/dev/dev/type.DBResult.html create mode 100644 db_sqlx_postgres/dev/enum.DBError.html create mode 100644 db_sqlx_postgres/dev/enum.Error.html create mode 100644 db_sqlx_postgres/dev/enum.Login.html create mode 100644 db_sqlx_postgres/dev/errors/enum.DBError.html create mode 100644 db_sqlx_postgres/dev/errors/index.html create mode 100644 db_sqlx_postgres/dev/errors/sidebar-items.js create mode 100644 db_sqlx_postgres/dev/errors/type.BoxDynError.html create mode 100644 db_sqlx_postgres/dev/errors/type.DBResult.html create mode 100644 db_sqlx_postgres/dev/index.html create mode 100644 db_sqlx_postgres/dev/ops/index.html create mode 100644 db_sqlx_postgres/dev/ops/sidebar-items.js create mode 100644 db_sqlx_postgres/dev/ops/trait.Connect.html create mode 100644 db_sqlx_postgres/dev/ops/trait.DBOps.html create mode 100644 db_sqlx_postgres/dev/ops/trait.GetConnection.html create mode 100644 db_sqlx_postgres/dev/ops/trait.Migrate.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/attr.async_trait.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/enum.DBError.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/enum.Login.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/index.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/sidebar-items.js create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.AddNotification.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.Captcha.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.CreateCaptcha.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.Level.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.NameHash.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.Notification.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.Register.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.Secret.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.StatsUnixTimestamp.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.TrafficPattern.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/struct.UpdateEmail.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/trait.CloneSPDatabase.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/trait.Connect.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/trait.DBOps.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/trait.GetConnection.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/trait.Migrate.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/type.BoxDynError.html create mode 100644 db_sqlx_postgres/dev/prelude/dev/type.DBResult.html create mode 100644 db_sqlx_postgres/dev/prelude/enum.DBError.html create mode 100644 db_sqlx_postgres/dev/prelude/enum.Login.html create mode 100644 db_sqlx_postgres/dev/prelude/index.html create mode 100644 db_sqlx_postgres/dev/prelude/sidebar-items.js create mode 100644 db_sqlx_postgres/dev/prelude/struct.AddNotification.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.Captcha.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.CreateCaptcha.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.Level.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.NameHash.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.Notification.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.Register.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.Secret.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.StatsUnixTimestamp.html create mode 100644 db_sqlx_postgres/dev/prelude/struct.TrafficPattern.html rename mcaptcha/stats/fetch/struct.Stats.html => db_sqlx_postgres/dev/prelude/struct.UpdateEmail.html (54%) create mode 100644 db_sqlx_postgres/dev/prelude/trait.CloneSPDatabase.html create mode 100644 db_sqlx_postgres/dev/prelude/trait.Connect.html create mode 100644 db_sqlx_postgres/dev/prelude/trait.DBOps.html create mode 100644 db_sqlx_postgres/dev/prelude/trait.GetConnection.html create mode 100644 db_sqlx_postgres/dev/prelude/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/dev/prelude/trait.Migrate.html create mode 100644 db_sqlx_postgres/dev/prelude/type.BoxDynError.html create mode 100644 db_sqlx_postgres/dev/prelude/type.DBResult.html create mode 100644 db_sqlx_postgres/dev/sidebar-items.js create mode 100644 db_sqlx_postgres/dev/struct.AddNotification.html create mode 100644 db_sqlx_postgres/dev/struct.Captcha.html create mode 100644 db_sqlx_postgres/dev/struct.CreateCaptcha.html create mode 100644 db_sqlx_postgres/dev/struct.Level.html create mode 100644 db_sqlx_postgres/dev/struct.NameHash.html create mode 100644 db_sqlx_postgres/dev/struct.Notification.html create mode 100644 db_sqlx_postgres/dev/struct.Register.html create mode 100644 db_sqlx_postgres/dev/struct.Secret.html create mode 100644 db_sqlx_postgres/dev/struct.StatsUnixTimestamp.html create mode 100644 db_sqlx_postgres/dev/struct.TrafficPattern.html create mode 100644 db_sqlx_postgres/dev/struct.UpdateEmail.html create mode 100644 db_sqlx_postgres/dev/tests/fn.database_works.html create mode 100644 db_sqlx_postgres/dev/tests/index.html create mode 100644 db_sqlx_postgres/dev/tests/sidebar-items.js create mode 100644 db_sqlx_postgres/dev/trait.CloneSPDatabase.html create mode 100644 db_sqlx_postgres/dev/trait.Connect.html create mode 100644 db_sqlx_postgres/dev/trait.DBOps.html create mode 100644 db_sqlx_postgres/dev/trait.GetConnection.html create mode 100644 db_sqlx_postgres/dev/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/dev/trait.Migrate.html create mode 100644 db_sqlx_postgres/dev/type.BoxDynError.html create mode 100644 db_sqlx_postgres/dev/type.DBResult.html rename mcaptcha/pages/panel/sitekey/edit/struct.Level.html => db_sqlx_postgres/enum.ConnectionOptions.html (56%) create mode 100644 db_sqlx_postgres/errors/fn.map_register_err.html create mode 100644 db_sqlx_postgres/errors/fn.map_row_not_found_err.html create mode 100644 db_sqlx_postgres/errors/index.html create mode 100644 db_sqlx_postgres/errors/sidebar-items.js create mode 100644 db_sqlx_postgres/index.html create mode 100644 db_sqlx_postgres/prelude/dev/attr.async_trait.html create mode 100644 db_sqlx_postgres/prelude/dev/enum.DBError.html create mode 100644 db_sqlx_postgres/prelude/dev/enum.Login.html create mode 100644 db_sqlx_postgres/prelude/dev/index.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/enum.DBError.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/enum.Login.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/index.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/sidebar-items.js create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.AddNotification.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.Captcha.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.CreateCaptcha.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.Level.html rename mcaptcha/pages/panel/sitekey/edit/struct.McaptchaConfig.html => db_sqlx_postgres/prelude/dev/prelude/struct.NameHash.html (54%) create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.Notification.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.Register.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.Secret.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.StatsUnixTimestamp.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.TrafficPattern.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/struct.UpdateEmail.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/trait.CloneSPDatabase.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/trait.Connect.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/trait.DBOps.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/trait.GetConnection.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/trait.Migrate.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/type.BoxDynError.html create mode 100644 db_sqlx_postgres/prelude/dev/prelude/type.DBResult.html create mode 100644 db_sqlx_postgres/prelude/dev/sidebar-items.js create mode 100644 db_sqlx_postgres/prelude/dev/struct.AddNotification.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.Captcha.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.CreateCaptcha.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.Level.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.NameHash.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.Notification.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.Register.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.Secret.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.StatsUnixTimestamp.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.TrafficPattern.html create mode 100644 db_sqlx_postgres/prelude/dev/struct.UpdateEmail.html create mode 100644 db_sqlx_postgres/prelude/dev/trait.CloneSPDatabase.html create mode 100644 db_sqlx_postgres/prelude/dev/trait.Connect.html create mode 100644 db_sqlx_postgres/prelude/dev/trait.DBOps.html create mode 100644 db_sqlx_postgres/prelude/dev/trait.GetConnection.html create mode 100644 db_sqlx_postgres/prelude/dev/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/prelude/dev/trait.Migrate.html create mode 100644 db_sqlx_postgres/prelude/dev/type.BoxDynError.html create mode 100644 db_sqlx_postgres/prelude/dev/type.DBResult.html create mode 100644 db_sqlx_postgres/prelude/enum.DBError.html create mode 100644 db_sqlx_postgres/prelude/enum.Login.html create mode 100644 db_sqlx_postgres/prelude/errors/enum.DBError.html create mode 100644 db_sqlx_postgres/prelude/errors/index.html create mode 100644 db_sqlx_postgres/prelude/errors/sidebar-items.js create mode 100644 db_sqlx_postgres/prelude/errors/type.BoxDynError.html create mode 100644 db_sqlx_postgres/prelude/errors/type.DBResult.html create mode 100644 db_sqlx_postgres/prelude/index.html create mode 100644 db_sqlx_postgres/prelude/ops/index.html create mode 100644 db_sqlx_postgres/prelude/ops/sidebar-items.js create mode 100644 db_sqlx_postgres/prelude/ops/trait.Connect.html create mode 100644 db_sqlx_postgres/prelude/ops/trait.DBOps.html create mode 100644 db_sqlx_postgres/prelude/ops/trait.GetConnection.html create mode 100644 db_sqlx_postgres/prelude/ops/trait.Migrate.html create mode 100644 db_sqlx_postgres/prelude/sidebar-items.js create mode 100644 db_sqlx_postgres/prelude/struct.AddNotification.html create mode 100644 db_sqlx_postgres/prelude/struct.Captcha.html create mode 100644 db_sqlx_postgres/prelude/struct.CreateCaptcha.html create mode 100644 db_sqlx_postgres/prelude/struct.Level.html create mode 100644 db_sqlx_postgres/prelude/struct.NameHash.html create mode 100644 db_sqlx_postgres/prelude/struct.Notification.html create mode 100644 db_sqlx_postgres/prelude/struct.Register.html create mode 100644 db_sqlx_postgres/prelude/struct.Secret.html create mode 100644 db_sqlx_postgres/prelude/struct.StatsUnixTimestamp.html create mode 100644 db_sqlx_postgres/prelude/struct.TrafficPattern.html create mode 100644 db_sqlx_postgres/prelude/struct.UpdateEmail.html create mode 100644 db_sqlx_postgres/prelude/tests/fn.database_works.html create mode 100644 db_sqlx_postgres/prelude/tests/index.html create mode 100644 db_sqlx_postgres/prelude/tests/sidebar-items.js create mode 100644 db_sqlx_postgres/prelude/trait.CloneSPDatabase.html create mode 100644 db_sqlx_postgres/prelude/trait.Connect.html create mode 100644 db_sqlx_postgres/prelude/trait.DBOps.html create mode 100644 db_sqlx_postgres/prelude/trait.GetConnection.html create mode 100644 db_sqlx_postgres/prelude/trait.MCDatabase.html create mode 100644 db_sqlx_postgres/prelude/trait.Migrate.html create mode 100644 db_sqlx_postgres/prelude/type.BoxDynError.html create mode 100644 db_sqlx_postgres/prelude/type.DBResult.html create mode 100644 db_sqlx_postgres/sidebar-items.js rename mcaptcha/pages/panel/sitekey/view/struct.McaptchaConfig.html => db_sqlx_postgres/struct.Conn.html (55%) create mode 100644 db_sqlx_postgres/struct.Database.html rename mcaptcha/pages/panel/sitekey/view/struct.Level.html => db_sqlx_postgres/struct.Fresh.html (56%) create mode 100644 db_sqlx_postgres/struct.InnerNotification.html create mode 100644 implementors/db_core/trait.CloneSPDatabase.js create mode 100644 implementors/db_sqlx_postgres/prelude/trait.CloneSPDatabase.js create mode 100644 implementors/db_sqlx_postgres/prelude/trait.Connect.js create mode 100644 implementors/db_sqlx_postgres/prelude/trait.MCDatabase.js create mode 100644 implementors/db_sqlx_postgres/prelude/trait.Migrate.js create mode 100644 implementors/mcaptcha/stats/trait.CloneStats.js create mode 100644 implementors/mcaptcha/stats/trait.Stats.js create mode 100644 mcaptcha/api/v1/mcaptcha/easy/fn.calculate.html rename mcaptcha/api/v1/mcaptcha/easy/{struct.TrafficPattern.html => struct.TrafficPatternRequest.html} (57%) delete mode 100644 mcaptcha/api/v1/mcaptcha/get/runner/fn.get_captcha.html delete mode 100644 mcaptcha/api/v1/mcaptcha/get/runner/index.html delete mode 100644 mcaptcha/api/v1/mcaptcha/get/runner/sidebar-items.js delete mode 100644 mcaptcha/api/v1/mcaptcha/update/runner/fn.update_key.html delete mode 100644 mcaptcha/api/v1/notifications/add/struct.AddNotification.html rename mcaptcha/api/v1/{account/secret/struct.Secret.html => notifications/add/struct.AddNotificationRequest.html} (58%) delete mode 100644 mcaptcha/api/v1/notifications/get/runner/fn.get_notification.html delete mode 100644 mcaptcha/api/v1/notifications/get/runner/index.html delete mode 100644 mcaptcha/api/v1/notifications/get/runner/sidebar-items.js delete mode 100644 mcaptcha/api/v1/notifications/get/struct.Notification.html delete mode 100644 mcaptcha/api/v1/notifications/mark_read/struct.NotificationResp.html create mode 100644 mcaptcha/errors/struct.DBErrorWrapper.html delete mode 100644 mcaptcha/pages/panel/sitekey/list/fn.get_list_sitekeys.html delete mode 100644 mcaptcha/pages/panel/sitekey/list/type.SiteKeys.html delete mode 100644 mcaptcha/stats/fetch/index.html delete mode 100644 mcaptcha/stats/fetch/runners/fn.fetch_config_fetched.html delete mode 100644 mcaptcha/stats/fetch/runners/fn.fetch_confirm.html delete mode 100644 mcaptcha/stats/fetch/runners/fn.fetch_solve.html delete mode 100644 mcaptcha/stats/fetch/runners/index.html delete mode 100644 mcaptcha/stats/fetch/runners/sidebar-items.js delete mode 100644 mcaptcha/stats/fetch/sidebar-items.js delete mode 100644 mcaptcha/stats/record/fn.record_confirm.html delete mode 100644 mcaptcha/stats/record/fn.record_fetch.html delete mode 100644 mcaptcha/stats/record/fn.record_solve.html delete mode 100644 mcaptcha/stats/record/index.html delete mode 100644 mcaptcha/stats/record/sidebar-items.js rename mcaptcha/stats/{fetch/struct.StatsUnixTimestamp.html => struct.CaptchaStats.html} (56%) create mode 100644 mcaptcha/stats/struct.Dummy.html create mode 100644 mcaptcha/stats/struct.Real.html create mode 100644 mcaptcha/stats/trait.CloneStats.html create mode 100644 mcaptcha/stats/trait.Stats.html create mode 100644 mcaptcha/type.ArcData.html create mode 100644 src/db_core/errors.rs.html create mode 100644 src/db_core/lib.rs.html create mode 100644 src/db_core/ops.rs.html create mode 100644 src/db_core/tests.rs.html create mode 100644 src/db_sqlx_postgres/errors.rs.html create mode 100644 src/db_sqlx_postgres/lib.rs.html create mode 100644 src/mcaptcha/stats.rs.html delete mode 100644 src/mcaptcha/stats/fetch.rs.html delete mode 100644 src/mcaptcha/stats/mod.rs.html delete mode 100644 src/mcaptcha/stats/record.rs.html delete mode 100644 src/tests_migrate/settings.rs.html delete mode 100644 src/tests_migrate/tests-migrate.rs.html delete mode 100644 tests_migrate/all.html delete mode 100644 tests_migrate/fn.build.html delete mode 100644 tests_migrate/fn.cache_bust.html delete mode 100644 tests_migrate/fn.main.html delete mode 100644 tests_migrate/index.html delete mode 100644 tests_migrate/settings/fn.check_url.html delete mode 100644 tests_migrate/settings/fn.set_database_url.html delete mode 100644 tests_migrate/settings/fn.set_from_database_url.html delete mode 100644 tests_migrate/settings/index.html delete mode 100644 tests_migrate/settings/sidebar-items.js delete mode 100644 tests_migrate/settings/struct.Captcha.html delete mode 100644 tests_migrate/settings/struct.Database.html delete mode 100644 tests_migrate/settings/struct.DatabaseBuilder.html delete mode 100644 tests_migrate/settings/struct.DefaultDifficultyStrategy.html delete mode 100644 tests_migrate/settings/struct.Redis.html delete mode 100644 tests_migrate/settings/struct.Server.html delete mode 100644 tests_migrate/settings/struct.Settings.html delete mode 100644 tests_migrate/settings/struct.Smtp.html delete mode 100644 tests_migrate/sidebar-items.js delete mode 100644 tests_migrate/struct.SETTINGS.html delete mode 100644 tests_migrate/struct.Settings.html diff --git a/crates.js b/crates.js index e343d53a..33cb38b3 100644 --- a/crates.js +++ b/crates.js @@ -1 +1 @@ -window.ALL_CRATES = ["mcaptcha","tests_migrate"]; \ No newline at end of file +window.ALL_CRATES = ["db_core","db_sqlx_postgres","mcaptcha"]; \ No newline at end of file diff --git a/db_core/all.html b/db_core/all.html new file mode 100644 index 00000000..387959f7 --- /dev/null +++ b/db_core/all.html @@ -0,0 +1,7 @@ +List of all items in this crate + +
+ \ No newline at end of file diff --git a/db_core/dev/attr.async_trait.html b/db_core/dev/attr.async_trait.html new file mode 100644 index 00000000..bf4558a4 --- /dev/null +++ b/db_core/dev/attr.async_trait.html @@ -0,0 +1,8 @@ +async_trait in db_core::dev - Rust + +
+

Attribute Macro db_core::dev::async_trait

[]
#[async_trait]
+ \ No newline at end of file diff --git a/db_core/dev/index.html b/db_core/dev/index.html new file mode 100644 index 00000000..a33df17b --- /dev/null +++ b/db_core/dev/index.html @@ -0,0 +1,11 @@ +db_core::dev - Rust + +
+

Module db_core::dev

source · []
Expand description

useful imports for supporting a new database

+

Re-exports

+
pub use super::prelude::*;

Attribute Macros

+
+ \ No newline at end of file diff --git a/db_core/dev/sidebar-items.js b/db_core/dev/sidebar-items.js new file mode 100644 index 00000000..9a6293c3 --- /dev/null +++ b/db_core/dev/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"attr":[["async_trait",""]]}); \ No newline at end of file diff --git a/db_core/enum.Login.html b/db_core/enum.Login.html new file mode 100644 index 00000000..4198880f --- /dev/null +++ b/db_core/enum.Login.html @@ -0,0 +1,45 @@ +Login in db_core - Rust + +
pub enum Login<'a> {
+    Username(&'a str),
+    Email(&'a str),
+}
Expand description

types of credentials used as identifiers during login

+

Variants

Username(&'a str)

username as login

+

Email(&'a str)

email as login

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/errors/enum.DBError.html b/db_core/errors/enum.DBError.html new file mode 100644 index 00000000..bd1ea61c --- /dev/null +++ b/db_core/errors/enum.DBError.html @@ -0,0 +1,55 @@ +DBError in db_core::errors - Rust + +
pub enum DBError {
+    DBError(BoxDynError),
+    UsernameTaken,
+    EmailTaken,
+    SecretTaken,
+    CaptchaKeyTaken,
+    AccountNotFound,
+    CaptchaNotFound,
+    TrafficPatternNotFound,
+    NotificationNotFound,
+}
Expand description

Error data structure grouping various error subtypes

+

Variants

DBError(BoxDynError)

errors that are specific to a database implementation

+

UsernameTaken

Username is taken

+

EmailTaken

Email is taken

+

SecretTaken

Secret is taken

+

CaptchaKeyTaken

Captcha key is taken

+

AccountNotFound

Account not found

+

CaptchaNotFound

Captcha not found

+

TrafficPatternNotFound

Traffic pattern not found

+

NotificationNotFound

Notification not found

+

Trait Implementations

Formats the value using the given formatter. Read more

+

Formats the value using the given formatter. Read more

+

The lower-level source of this error, if any. Read more

+
🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

+
👎 Deprecated since 1.42.0:

use the Display impl or to_string()

+
👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/errors/index.html b/db_core/errors/index.html new file mode 100644 index 00000000..a8c9f808 --- /dev/null +++ b/db_core/errors/index.html @@ -0,0 +1,14 @@ +db_core::errors - Rust + +
+

Module db_core::errors

source · []
Expand description

represents all the ways a trait can fail using this crate

+

Enums

+

Error data structure grouping various error subtypes

+

Type Definitions

+

Convenience type alias for grouping driver-specific errors

+

Generic result data structure

+
+ \ No newline at end of file diff --git a/db_core/errors/sidebar-items.js b/db_core/errors/sidebar-items.js new file mode 100644 index 00000000..fdad20af --- /dev/null +++ b/db_core/errors/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"enum":[["DBError","Error data structure grouping various error subtypes"]],"type":[["BoxDynError","Convenience type alias for grouping driver-specific errors"],["DBResult","Generic result data structure"]]}); \ No newline at end of file diff --git a/db_core/errors/type.BoxDynError.html b/db_core/errors/type.BoxDynError.html new file mode 100644 index 00000000..62d39857 --- /dev/null +++ b/db_core/errors/type.BoxDynError.html @@ -0,0 +1,9 @@ +BoxDynError in db_core::errors - Rust + +
+

Type Definition db_core::errors::BoxDynError

source · []
pub type BoxDynError = Box<dyn StdError + Send + Sync + 'static>;
Expand description

Convenience type alias for grouping driver-specific errors

+
+ \ No newline at end of file diff --git a/db_core/errors/type.DBResult.html b/db_core/errors/type.DBResult.html new file mode 100644 index 00000000..a410f535 --- /dev/null +++ b/db_core/errors/type.DBResult.html @@ -0,0 +1,9 @@ +DBResult in db_core::errors - Rust + +
+

Type Definition db_core::errors::DBResult

source · []
pub type DBResult<V> = Result<V, DBError>;
Expand description

Generic result data structure

+
+ \ No newline at end of file diff --git a/db_core/index.html b/db_core/index.html new file mode 100644 index 00000000..45fa1fe8 --- /dev/null +++ b/db_core/index.html @@ -0,0 +1,44 @@ +db_core - Rust + +
+

Crate db_core

source · []
Expand description

mCaptcha database operations

+

Traits and datastructures used in mCaptcha to interact with database.

+

To use an unsupported database with mCaptcha, traits present within this crate should be +implemented.

+

Organisation

+

Database functionallity is divided accross various modules:

+
    +
  • errors: error data structures used in this crate
  • +
  • ops: meta operations like connection pool creation, migrations and getting +connection from pool
  • +
+

Re-exports

+
pub use ops::GetConnection;

Modules

+

useful imports for supporting a new database

+

represents all the ways a trait can fail using this crate

+

meta operations like migration and connecting to a database

+

useful imports for users working with a supported database

+

Test utilities

+

Structs

+

Data required to add notification

+

Data representing a captcha

+

data requried to create new captcha

+

Level struct that describes threshold-difficulty factor mapping

+

type encapsulating username and hashed password of a user

+

Represents notification

+

Data required to register a new user

+

datastructure representing a user’s secret

+

Captcha statistics with time recorded in UNIX epoch formats

+

User’s traffic pattern; used in generating a captcha configuration

+

data required to update them email of a user

+

Enums

+

types of credentials used as identifiers during login

+

Traits

+

Trait to clone MCDatabase

+

mCaptcha’s database requirements. To implement support for $Database, kindly implement this +trait.

+
+ \ No newline at end of file diff --git a/db_core/ops/index.html b/db_core/ops/index.html new file mode 100644 index 00000000..bcf2af3e --- /dev/null +++ b/db_core/ops/index.html @@ -0,0 +1,14 @@ +db_core::ops - Rust + +
+

Module db_core::ops

source · []
Expand description

meta operations like migration and connecting to a database

+

Traits

+

Create databse connection

+

Database operations trait(migrations, pool creation and fetching connection from pool)

+

Get database connection

+

database migrations

+
+ \ No newline at end of file diff --git a/db_core/ops/sidebar-items.js b/db_core/ops/sidebar-items.js new file mode 100644 index 00000000..f3fbc137 --- /dev/null +++ b/db_core/ops/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"trait":[["Connect","Create databse connection"],["DBOps","Database operations trait(migrations, pool creation and fetching connection from pool)"],["GetConnection","Get database connection"],["Migrate","database migrations"]]}); \ No newline at end of file diff --git a/db_core/ops/trait.Connect.html b/db_core/ops/trait.Connect.html new file mode 100644 index 00000000..a9b7b4dd --- /dev/null +++ b/db_core/ops/trait.Connect.html @@ -0,0 +1,15 @@ +Connect in db_core::ops - Rust + +
pub trait Connect {
+    type Pool: MCDatabase;
+    fn connect<'async_trait>(
        self
    ) -> Pin<Box<dyn Future<Output = DBResult<Self::Pool>> + Send + 'async_trait>>
    where
        Self: 'async_trait
; +}
Expand description

Create databse connection

+

Associated Types

database specific pool-type

+

Required methods

database specific error-type +create connection pool

+

Implementors

+ \ No newline at end of file diff --git a/db_core/ops/trait.DBOps.html b/db_core/ops/trait.DBOps.html new file mode 100644 index 00000000..53249cbf --- /dev/null +++ b/db_core/ops/trait.DBOps.html @@ -0,0 +1,9 @@ +DBOps in db_core::ops - Rust + +
pub trait DBOps: GetConnection + Migrate { }
Expand description

Database operations trait(migrations, pool creation and fetching connection from pool)

+

Implementors

+ \ No newline at end of file diff --git a/db_core/ops/trait.GetConnection.html b/db_core/ops/trait.GetConnection.html new file mode 100644 index 00000000..61eb2603 --- /dev/null +++ b/db_core/ops/trait.GetConnection.html @@ -0,0 +1,15 @@ +GetConnection in db_core::ops - Rust + +
pub trait GetConnection {
+    type Conn;
+    fn get_conn<'life0, 'async_trait>(
        &'life0 self
    ) -> Pin<Box<dyn Future<Output = DBResult<Self::Conn>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        Self: 'async_trait
; +}
Expand description

Get database connection

+

Associated Types

database connection type

+

Required methods

database specific error-type +get connection from connection pool

+

Implementors

+ \ No newline at end of file diff --git a/db_core/ops/trait.Migrate.html b/db_core/ops/trait.Migrate.html new file mode 100644 index 00000000..7e0ccb48 --- /dev/null +++ b/db_core/ops/trait.Migrate.html @@ -0,0 +1,13 @@ +Migrate in db_core::ops - Rust + +
pub trait Migrate: MCDatabase {
+    fn migrate<'life0, 'async_trait>(
        &'life0 self
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        Self: 'async_trait
; +}
Expand description

database migrations

+

Required methods

database specific error-type +run migrations

+

Implementors

+ \ No newline at end of file diff --git a/db_core/prelude/index.html b/db_core/prelude/index.html new file mode 100644 index 00000000..f6c6d37f --- /dev/null +++ b/db_core/prelude/index.html @@ -0,0 +1,10 @@ +db_core::prelude - Rust + +
Expand description

useful imports for users working with a supported database

+

Re-exports

+
pub use super::errors::*;
pub use super::ops::*;
pub use super::*;
+ \ No newline at end of file diff --git a/db_core/prelude/sidebar-items.js b/db_core/prelude/sidebar-items.js new file mode 100644 index 00000000..48333d31 --- /dev/null +++ b/db_core/prelude/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({}); \ No newline at end of file diff --git a/db_core/sidebar-items.js b/db_core/sidebar-items.js new file mode 100644 index 00000000..ca4c1fcf --- /dev/null +++ b/db_core/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"enum":[["Login","types of credentials used as identifiers during login"]],"mod":[["dev","useful imports for supporting a new database"],["errors","represents all the ways a trait can fail using this crate"],["ops","meta operations like migration and connecting to a database"],["prelude","useful imports for users working with a supported database"],["tests","Test utilities"]],"struct":[["AddNotification","Data required to add notification"],["Captcha","Data representing a captcha"],["CreateCaptcha","data requried to create new captcha"],["Level","Level struct that describes threshold-difficulty factor mapping"],["NameHash","type encapsulating username and hashed password of a user"],["Notification","Represents notification"],["Register","Data required to register a new user"],["Secret","datastructure representing a user’s secret"],["StatsUnixTimestamp","Captcha statistics with time recorded in UNIX epoch formats"],["TrafficPattern","User’s traffic pattern; used in generating a captcha configuration"],["UpdateEmail","data required to update them email of a user"]],"trait":[["CloneSPDatabase","Trait to clone MCDatabase"],["MCDatabase","mCaptcha’s database requirements. To implement support for $Database, kindly implement this trait."]]}); \ No newline at end of file diff --git a/db_core/struct.AddNotification.html b/db_core/struct.AddNotification.html new file mode 100644 index 00000000..3659f137 --- /dev/null +++ b/db_core/struct.AddNotification.html @@ -0,0 +1,50 @@ +AddNotification in db_core - Rust + +
pub struct AddNotification<'a> {
+    pub to: &'a str,
+    pub from: &'a str,
+    pub heading: &'a str,
+    pub message: &'a str,
+}
Expand description

Data required to add notification

+

Fields

to: &'a str

who is the notification addressed to?

+
from: &'a str

notification sender

+
heading: &'a str

heading of the notification

+
message: &'a str

mesage of the notification

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.Captcha.html b/db_core/struct.Captcha.html new file mode 100644 index 00000000..6688b8a2 --- /dev/null +++ b/db_core/struct.Captcha.html @@ -0,0 +1,50 @@ +Captcha in db_core - Rust + +
pub struct Captcha {
+    pub config_id: i32,
+    pub duration: i32,
+    pub description: String,
+    pub key: String,
+}
Expand description

Data representing a captcha

+

Fields

config_id: i32

Database assigned ID

+
duration: i32

cool down duration

+
description: String

description of the captcha

+
key: String

secret key of the captcha

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.CreateCaptcha.html b/db_core/struct.CreateCaptcha.html new file mode 100644 index 00000000..deb50aeb --- /dev/null +++ b/db_core/struct.CreateCaptcha.html @@ -0,0 +1,48 @@ +CreateCaptcha in db_core - Rust + +
pub struct CreateCaptcha<'a> {
+    pub duration: i32,
+    pub description: &'a str,
+    pub key: &'a str,
+}
Expand description

data requried to create new captcha

+

Fields

duration: i32

cool down duration

+
description: &'a str

description of the captcha

+
key: &'a str

secret key of the captcha

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.Level.html b/db_core/struct.Level.html new file mode 100644 index 00000000..9916196e --- /dev/null +++ b/db_core/struct.Level.html @@ -0,0 +1,43 @@ +Level in db_core - Rust + +
+

Struct db_core::Level

[]
pub struct Level {
+    pub visitor_threshold: u32,
+    pub difficulty_factor: u32,
+}
Expand description

Level struct that describes threshold-difficulty factor mapping

+

Fields

visitor_threshold: u32difficulty_factor: u32

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.NameHash.html b/db_core/struct.NameHash.html new file mode 100644 index 00000000..dbb07a97 --- /dev/null +++ b/db_core/struct.NameHash.html @@ -0,0 +1,45 @@ +NameHash in db_core - Rust + +
pub struct NameHash {
+    pub username: String,
+    pub hash: String,
+}
Expand description

type encapsulating username and hashed password of a user

+

Fields

username: String

username

+
hash: String

hashed password

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.Notification.html b/db_core/struct.Notification.html new file mode 100644 index 00000000..517475c9 --- /dev/null +++ b/db_core/struct.Notification.html @@ -0,0 +1,52 @@ +Notification in db_core - Rust + +
pub struct Notification {
+    pub name: Option<String>,
+    pub heading: Option<String>,
+    pub message: Option<String>,
+    pub received: Option<i64>,
+    pub id: Option<i32>,
+}
Expand description

Represents notification

+

Fields

name: Option<String>

receiver name of the notification

+
heading: Option<String>

heading of the notification

+
message: Option<String>

message of the notification

+
received: Option<i64>

when notification was received

+
id: Option<i32>

db assigned ID of the notification

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.Register.html b/db_core/struct.Register.html new file mode 100644 index 00000000..321afe1d --- /dev/null +++ b/db_core/struct.Register.html @@ -0,0 +1,49 @@ +Register in db_core - Rust + +
pub struct Register<'a> {
+    pub username: &'a str,
+    pub secret: &'a str,
+    pub hash: &'a str,
+    pub email: Option<&'a str>,
+}
Expand description

Data required to register a new user

+

Fields

username: &'a str

username of new user

+
secret: &'a str

secret of new user

+
hash: &'a str

hashed password of new use

+
email: Option<&'a str>

Optionally, email of new use

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.Secret.html b/db_core/struct.Secret.html new file mode 100644 index 00000000..576c957c --- /dev/null +++ b/db_core/struct.Secret.html @@ -0,0 +1,44 @@ +Secret in db_core - Rust + +
+

Struct db_core::Secret

source · []
pub struct Secret {
+    pub secret: String,
+}
Expand description

datastructure representing a user’s secret

+

Fields

secret: String

user’s secret

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.StatsUnixTimestamp.html b/db_core/struct.StatsUnixTimestamp.html new file mode 100644 index 00000000..b2835e0a --- /dev/null +++ b/db_core/struct.StatsUnixTimestamp.html @@ -0,0 +1,48 @@ +StatsUnixTimestamp in db_core - Rust + +
pub struct StatsUnixTimestamp {
+    pub config_fetches: Vec<i64>,
+    pub solves: Vec<i64>,
+    pub confirms: Vec<i64>,
+}
Expand description

Captcha statistics with time recorded in UNIX epoch formats

+

Fields

config_fetches: Vec<i64>

times at which the configuration were fetched

+
solves: Vec<i64>

times at which the PoW was solved

+
confirms: Vec<i64>

times at which the PoW token was verified

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.TrafficPattern.html b/db_core/struct.TrafficPattern.html new file mode 100644 index 00000000..953109cd --- /dev/null +++ b/db_core/struct.TrafficPattern.html @@ -0,0 +1,48 @@ +TrafficPattern in db_core - Rust + +
pub struct TrafficPattern {
+    pub avg_traffic: u32,
+    pub peak_sustainable_traffic: u32,
+    pub broke_my_site_traffic: Option<u32>,
+}
Expand description

User’s traffic pattern; used in generating a captcha configuration

+

Fields

avg_traffic: u32

average traffic of user’s website

+
peak_sustainable_traffic: u32

the peak traffic that the user’s website can handle

+
broke_my_site_traffic: Option<u32>

trafic that bought the user’s website down; optional

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/struct.UpdateEmail.html b/db_core/struct.UpdateEmail.html new file mode 100644 index 00000000..a3b89775 --- /dev/null +++ b/db_core/struct.UpdateEmail.html @@ -0,0 +1,45 @@ +UpdateEmail in db_core - Rust + +
pub struct UpdateEmail<'a> {
+    pub username: &'a str,
+    pub new_email: &'a str,
+}
Expand description

data required to update them email of a user

+

Fields

username: &'a str

username of the user

+
new_email: &'a str

new email address of the user

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_core/tests/fn.database_works.html b/db_core/tests/fn.database_works.html new file mode 100644 index 00000000..a7e968dc --- /dev/null +++ b/db_core/tests/fn.database_works.html @@ -0,0 +1,9 @@ +database_works in db_core::tests - Rust + +
pub async fn database_works<'a, T: MCDatabase>(
    db: &T,
    p: &Register<'a>,
    c: &CreateCaptcha<'a>,
    l: &[Level],
    tp: &TrafficPattern,
    an: &AddNotification<'a>
)
Expand description

test all database functions

+
+ \ No newline at end of file diff --git a/db_core/tests/index.html b/db_core/tests/index.html new file mode 100644 index 00000000..b5e55817 --- /dev/null +++ b/db_core/tests/index.html @@ -0,0 +1,11 @@ +db_core::tests - Rust + +
+

Module db_core::tests

source · []
Expand description

Test utilities

+

Functions

+

test all database functions

+
+ \ No newline at end of file diff --git a/db_core/tests/sidebar-items.js b/db_core/tests/sidebar-items.js new file mode 100644 index 00000000..55eac0b3 --- /dev/null +++ b/db_core/tests/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"fn":[["database_works","test all database functions"]]}); \ No newline at end of file diff --git a/db_core/trait.CloneSPDatabase.html b/db_core/trait.CloneSPDatabase.html new file mode 100644 index 00000000..96c4b4f4 --- /dev/null +++ b/db_core/trait.CloneSPDatabase.html @@ -0,0 +1,12 @@ +CloneSPDatabase in db_core - Rust + +
pub trait CloneSPDatabase {
+    fn clone_db(&self) -> Box<dyn MCDatabase>;
+}
Expand description

Trait to clone MCDatabase

+

Required methods

clone DB

+

Implementors

+ \ No newline at end of file diff --git a/db_core/trait.MCDatabase.html b/db_core/trait.MCDatabase.html new file mode 100644 index 00000000..26e3f85d --- /dev/null +++ b/db_core/trait.MCDatabase.html @@ -0,0 +1,81 @@ +MCDatabase in db_core - Rust + +
pub trait MCDatabase: Send + Sync + CloneSPDatabase {
+
Show 35 methods fn ping<'life0, 'async_trait>(
        &'life0 self
    ) -> Pin<Box<dyn Future<Output = bool> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        Self: 'async_trait
; + fn register<'life0, 'life1, 'async_trait>(
        &'life0 self,
        p: &'life1 Register<'_>
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn delete_user<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn username_exists<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<bool>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn get_email<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Option<String>>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn email_exists<'life0, 'life1, 'async_trait>(
        &'life0 self,
        email: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<bool>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_email<'life0, 'life1, 'async_trait>(
        &'life0 self,
        p: &'life1 UpdateEmail<'_>
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn get_password<'life0, 'life1, 'async_trait>(
        &'life0 self,
        l: &'life1 Login<'_>
    ) -> Pin<Box<dyn Future<Output = DBResult<NameHash>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_password<'life0, 'life1, 'async_trait>(
        &'life0 self,
        p: &'life1 NameHash
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_username<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        current: &'life1 str,
        new: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_secret<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Secret>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_secret<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        secret: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn create_captcha<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        p: &'life2 CreateCaptcha<'_>
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_captcha_config<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Captcha>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_all_user_captchas<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Vec<Captcha>>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_captcha_metadata<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        p: &'life2 CreateCaptcha<'_>
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn update_captcha_key<'life0, 'life1, 'life2, 'life3, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        old_key: &'life2 str,
        new_key: &'life3 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        'life3: 'async_trait,
        Self: 'async_trait
; + fn add_captcha_levels<'life0, 'life1, 'life2, 'life3, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str,
        levels: &'life3 [Level]
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        'life3: 'async_trait,
        Self: 'async_trait
; + fn captcha_exists<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: Option<&'life1 str>,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<bool>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn delete_captcha_levels<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn delete_captcha<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_captcha_levels<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: Option<&'life1 str>,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Vec<Level>>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_captcha_cooldown<'life0, 'life1, 'async_trait>(
        &'life0 self,
        captcha_key: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<i32>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn add_traffic_pattern<'life0, 'life1, 'life2, 'life3, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str,
        pattern: &'life3 TrafficPattern
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        'life3: 'async_trait,
        Self: 'async_trait
; + fn get_traffic_pattern<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<TrafficPattern>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn delete_traffic_pattern<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn create_notification<'life0, 'life1, 'async_trait>(
        &'life0 self,
        p: &'life1 AddNotification<'_>
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn get_all_unread_notifications<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Vec<Notification>>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn mark_notification_read<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        id: i32
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn record_fetch<'life0, 'life1, 'async_trait>(
        &'life0 self,
        key: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn record_solve<'life0, 'life1, 'async_trait>(
        &'life0 self,
        key: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn record_confirm<'life0, 'life1, 'async_trait>(
        &'life0 self,
        key: &'life1 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn fetch_config_fetched<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        user: &'life1 str,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Vec<i64>>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn fetch_solve<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        user: &'life1 str,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Vec<i64>>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn fetch_confirm<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        user: &'life1 str,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<Vec<i64>>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; +
}
Expand description

mCaptcha’s database requirements. To implement support for $Database, kindly implement this +trait.

+

Required methods

ping DB

+

register a new user

+

delete a user

+

check if username exists

+

get user email

+

check if email exists

+

update a user’s email

+

get a user’s password

+

update user’s password

+

update username

+

get a user’s secret

+

update a user’s secret

+

create new captcha

+

Get captcha config

+

Get all captchas belonging to user

+

update captcha metadata; doesn’t change captcha key

+

update captcha key; doesn’t change metadata

+

Add levels to captcha

+

check if captcha exists

+

Delete all levels of a captcha

+

Delete captcha

+

Get captcha levels

+

Get captcha’s cooldown period

+

Add traffic configuration

+

Get traffic configuration

+

Delete traffic configuration

+

create new notification

+

get all unread notifications

+

mark a notification read

+

record PoWConfig fetches

+

record PoWConfig solves

+

record PoWConfig confirms

+

featch PoWConfig fetches

+

featch PoWConfig solves

+

featch PoWConfig confirms

+

Implementors

+ \ No newline at end of file diff --git a/db_sqlx_postgres/all.html b/db_sqlx_postgres/all.html new file mode 100644 index 00000000..28170a5a --- /dev/null +++ b/db_sqlx_postgres/all.html @@ -0,0 +1,7 @@ +List of all items in this crate + +

List of all items

Structs

Enums

Traits

Attribute Macros

Functions

Typedefs

+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/attr.async_trait.html b/db_sqlx_postgres/dev/attr.async_trait.html new file mode 100644 index 00000000..64734fe8 --- /dev/null +++ b/db_sqlx_postgres/dev/attr.async_trait.html @@ -0,0 +1,8 @@ +async_trait in db_sqlx_postgres::dev - Rust + +
#[async_trait]
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/attr.async_trait.html b/db_sqlx_postgres/dev/dev/attr.async_trait.html new file mode 100644 index 00000000..1eaa5ed8 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/attr.async_trait.html @@ -0,0 +1,8 @@ +async_trait in db_sqlx_postgres::dev::dev - Rust + +
#[async_trait]
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/enum.DBError.html b/db_sqlx_postgres/dev/dev/enum.DBError.html new file mode 100644 index 00000000..4301b80c --- /dev/null +++ b/db_sqlx_postgres/dev/dev/enum.DBError.html @@ -0,0 +1,55 @@ +DBError in db_sqlx_postgres::dev::dev - Rust + +
pub enum DBError {
+    DBError(Box<dyn Error + Send + Sync + 'static, Global>),
+    UsernameTaken,
+    EmailTaken,
+    SecretTaken,
+    CaptchaKeyTaken,
+    AccountNotFound,
+    CaptchaNotFound,
+    TrafficPatternNotFound,
+    NotificationNotFound,
+}
Expand description

Error data structure grouping various error subtypes

+

Variants

DBError(Box<dyn Error + Send + Sync + 'static, Global>)

errors that are specific to a database implementation

+

UsernameTaken

Username is taken

+

EmailTaken

Email is taken

+

SecretTaken

Secret is taken

+

CaptchaKeyTaken

Captcha key is taken

+

AccountNotFound

Account not found

+

CaptchaNotFound

Captcha not found

+

TrafficPatternNotFound

Traffic pattern not found

+

NotificationNotFound

Notification not found

+

Trait Implementations

Formats the value using the given formatter. Read more

+

Formats the value using the given formatter. Read more

+

The lower-level source of this error, if any. Read more

+
🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

+
👎 Deprecated since 1.42.0:

use the Display impl or to_string()

+
👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/enum.Login.html b/db_sqlx_postgres/dev/dev/enum.Login.html new file mode 100644 index 00000000..1230ec23 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/enum.Login.html @@ -0,0 +1,45 @@ +Login in db_sqlx_postgres::dev::dev - Rust + +
pub enum Login<'a> {
+    Username(&'a str),
+    Email(&'a str),
+}
Expand description

types of credentials used as identifiers during login

+

Variants

Username(&'a str)

username as login

+

Email(&'a str)

email as login

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/index.html b/db_sqlx_postgres/dev/dev/index.html new file mode 100644 index 00000000..21a2a0ae --- /dev/null +++ b/db_sqlx_postgres/dev/dev/index.html @@ -0,0 +1,38 @@ +db_sqlx_postgres::dev::dev - Rust + +
Expand description

useful imports for supporting a new database

+

Modules

+

useful imports for users working with a supported database

+

Structs

+

Data required to add notification

+

Data representing a captcha

+

data requried to create new captcha

+

Level struct that describes threshold-difficulty factor mapping

+

type encapsulating username and hashed password of a user

+

Represents notification

+

Data required to register a new user

+

datastructure representing a user’s secret

+

Captcha statistics with time recorded in UNIX epoch formats

+

User’s traffic pattern; used in generating a captcha configuration

+

data required to update them email of a user

+

Enums

+

Error data structure grouping various error subtypes

+

types of credentials used as identifiers during login

+

Traits

+

Trait to clone MCDatabase

+

Create databse connection

+

Database operations trait(migrations, pool creation and fetching connection from pool)

+

Get database connection

+

mCaptcha’s database requirements. To implement support for $Database, kindly implement this +trait.

+

database migrations

+

Type Definitions

+

Convenience type alias for grouping driver-specific errors

+

Generic result data structure

+

Attribute Macros

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/enum.DBError.html b/db_sqlx_postgres/dev/dev/prelude/enum.DBError.html new file mode 100644 index 00000000..632e64e0 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/enum.DBError.html @@ -0,0 +1,55 @@ +DBError in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub enum DBError {
+    DBError(Box<dyn Error + Send + Sync + 'static, Global>),
+    UsernameTaken,
+    EmailTaken,
+    SecretTaken,
+    CaptchaKeyTaken,
+    AccountNotFound,
+    CaptchaNotFound,
+    TrafficPatternNotFound,
+    NotificationNotFound,
+}
Expand description

Error data structure grouping various error subtypes

+

Variants

DBError(Box<dyn Error + Send + Sync + 'static, Global>)

errors that are specific to a database implementation

+

UsernameTaken

Username is taken

+

EmailTaken

Email is taken

+

SecretTaken

Secret is taken

+

CaptchaKeyTaken

Captcha key is taken

+

AccountNotFound

Account not found

+

CaptchaNotFound

Captcha not found

+

TrafficPatternNotFound

Traffic pattern not found

+

NotificationNotFound

Notification not found

+

Trait Implementations

Formats the value using the given formatter. Read more

+

Formats the value using the given formatter. Read more

+

The lower-level source of this error, if any. Read more

+
🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

+
👎 Deprecated since 1.42.0:

use the Display impl or to_string()

+
👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/enum.Login.html b/db_sqlx_postgres/dev/dev/prelude/enum.Login.html new file mode 100644 index 00000000..00a1a57c --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/enum.Login.html @@ -0,0 +1,45 @@ +Login in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub enum Login<'a> {
+    Username(&'a str),
+    Email(&'a str),
+}
Expand description

types of credentials used as identifiers during login

+

Variants

Username(&'a str)

username as login

+

Email(&'a str)

email as login

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/index.html b/db_sqlx_postgres/dev/dev/prelude/index.html new file mode 100644 index 00000000..8a29732f --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/index.html @@ -0,0 +1,35 @@ +db_sqlx_postgres::dev::dev::prelude - Rust + +
Expand description

useful imports for users working with a supported database

+

Structs

+

Data required to add notification

+

Data representing a captcha

+

data requried to create new captcha

+

Level struct that describes threshold-difficulty factor mapping

+

type encapsulating username and hashed password of a user

+

Represents notification

+

Data required to register a new user

+

datastructure representing a user’s secret

+

Captcha statistics with time recorded in UNIX epoch formats

+

User’s traffic pattern; used in generating a captcha configuration

+

data required to update them email of a user

+

Enums

+

Error data structure grouping various error subtypes

+

types of credentials used as identifiers during login

+

Traits

+

Trait to clone MCDatabase

+

Create databse connection

+

Database operations trait(migrations, pool creation and fetching connection from pool)

+

Get database connection

+

mCaptcha’s database requirements. To implement support for $Database, kindly implement this +trait.

+

database migrations

+

Type Definitions

+

Convenience type alias for grouping driver-specific errors

+

Generic result data structure

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/sidebar-items.js b/db_sqlx_postgres/dev/dev/prelude/sidebar-items.js new file mode 100644 index 00000000..2d916772 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"enum":[["DBError","Error data structure grouping various error subtypes"],["Login","types of credentials used as identifiers during login"]],"struct":[["AddNotification","Data required to add notification"],["Captcha","Data representing a captcha"],["CreateCaptcha","data requried to create new captcha"],["Level","Level struct that describes threshold-difficulty factor mapping"],["NameHash","type encapsulating username and hashed password of a user"],["Notification","Represents notification"],["Register","Data required to register a new user"],["Secret","datastructure representing a user’s secret"],["StatsUnixTimestamp","Captcha statistics with time recorded in UNIX epoch formats"],["TrafficPattern","User’s traffic pattern; used in generating a captcha configuration"],["UpdateEmail","data required to update them email of a user"]],"trait":[["CloneSPDatabase","Trait to clone MCDatabase"],["Connect","Create databse connection"],["DBOps","Database operations trait(migrations, pool creation and fetching connection from pool)"],["GetConnection","Get database connection"],["MCDatabase","mCaptcha’s database requirements. To implement support for $Database, kindly implement this trait."],["Migrate","database migrations"]],"type":[["BoxDynError","Convenience type alias for grouping driver-specific errors"],["DBResult","Generic result data structure"]]}); \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.AddNotification.html b/db_sqlx_postgres/dev/dev/prelude/struct.AddNotification.html new file mode 100644 index 00000000..4f0e555b --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.AddNotification.html @@ -0,0 +1,50 @@ +AddNotification in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct AddNotification<'a> {
+    pub to: &'a str,
+    pub from: &'a str,
+    pub heading: &'a str,
+    pub message: &'a str,
+}
Expand description

Data required to add notification

+

Fields

to: &'a str

who is the notification addressed to?

+
from: &'a str

notification sender

+
heading: &'a str

heading of the notification

+
message: &'a str

mesage of the notification

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.Captcha.html b/db_sqlx_postgres/dev/dev/prelude/struct.Captcha.html new file mode 100644 index 00000000..a1e266f8 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.Captcha.html @@ -0,0 +1,50 @@ +Captcha in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct Captcha {
+    pub config_id: i32,
+    pub duration: i32,
+    pub description: String,
+    pub key: String,
+}
Expand description

Data representing a captcha

+

Fields

config_id: i32

Database assigned ID

+
duration: i32

cool down duration

+
description: String

description of the captcha

+
key: String

secret key of the captcha

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.CreateCaptcha.html b/db_sqlx_postgres/dev/dev/prelude/struct.CreateCaptcha.html new file mode 100644 index 00000000..ca814d86 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.CreateCaptcha.html @@ -0,0 +1,48 @@ +CreateCaptcha in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct CreateCaptcha<'a> {
+    pub duration: i32,
+    pub description: &'a str,
+    pub key: &'a str,
+}
Expand description

data requried to create new captcha

+

Fields

duration: i32

cool down duration

+
description: &'a str

description of the captcha

+
key: &'a str

secret key of the captcha

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.Level.html b/db_sqlx_postgres/dev/dev/prelude/struct.Level.html new file mode 100644 index 00000000..d7b6b982 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.Level.html @@ -0,0 +1,43 @@ +Level in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct Level {
+    pub visitor_threshold: u32,
+    pub difficulty_factor: u32,
+}
Expand description

Level struct that describes threshold-difficulty factor mapping

+

Fields

visitor_threshold: u32difficulty_factor: u32

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.NameHash.html b/db_sqlx_postgres/dev/dev/prelude/struct.NameHash.html new file mode 100644 index 00000000..8cec30d6 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.NameHash.html @@ -0,0 +1,45 @@ +NameHash in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct NameHash {
+    pub username: String,
+    pub hash: String,
+}
Expand description

type encapsulating username and hashed password of a user

+

Fields

username: String

username

+
hash: String

hashed password

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.Notification.html b/db_sqlx_postgres/dev/dev/prelude/struct.Notification.html new file mode 100644 index 00000000..4c5cc06d --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.Notification.html @@ -0,0 +1,53 @@ +Notification in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct Notification {
+    pub name: Option<String>,
+    pub heading: Option<String>,
+    pub message: Option<String>,
+    pub received: Option<i64>,
+    pub id: Option<i32>,
+}
Expand description

Represents notification

+

Fields

name: Option<String>

receiver name of the notification

+
heading: Option<String>

heading of the notification

+
message: Option<String>

message of the notification

+
received: Option<i64>

when notification was received

+
id: Option<i32>

db assigned ID of the notification

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Converts to this type from the input type.

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.Register.html b/db_sqlx_postgres/dev/dev/prelude/struct.Register.html new file mode 100644 index 00000000..bf30c153 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.Register.html @@ -0,0 +1,49 @@ +Register in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct Register<'a> {
+    pub username: &'a str,
+    pub secret: &'a str,
+    pub hash: &'a str,
+    pub email: Option<&'a str>,
+}
Expand description

Data required to register a new user

+

Fields

username: &'a str

username of new user

+
secret: &'a str

secret of new user

+
hash: &'a str

hashed password of new use

+
email: Option<&'a str>

Optionally, email of new use

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.Secret.html b/db_sqlx_postgres/dev/dev/prelude/struct.Secret.html new file mode 100644 index 00000000..43456794 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.Secret.html @@ -0,0 +1,44 @@ +Secret in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct Secret {
+    pub secret: String,
+}
Expand description

datastructure representing a user’s secret

+

Fields

secret: String

user’s secret

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.StatsUnixTimestamp.html b/db_sqlx_postgres/dev/dev/prelude/struct.StatsUnixTimestamp.html new file mode 100644 index 00000000..85f2f1bb --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.StatsUnixTimestamp.html @@ -0,0 +1,48 @@ +StatsUnixTimestamp in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct StatsUnixTimestamp {
+    pub config_fetches: Vec<i64, Global>,
+    pub solves: Vec<i64, Global>,
+    pub confirms: Vec<i64, Global>,
+}
Expand description

Captcha statistics with time recorded in UNIX epoch formats

+

Fields

config_fetches: Vec<i64, Global>

times at which the configuration were fetched

+
solves: Vec<i64, Global>

times at which the PoW was solved

+
confirms: Vec<i64, Global>

times at which the PoW token was verified

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.TrafficPattern.html b/db_sqlx_postgres/dev/dev/prelude/struct.TrafficPattern.html new file mode 100644 index 00000000..f98dfbde --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.TrafficPattern.html @@ -0,0 +1,48 @@ +TrafficPattern in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct TrafficPattern {
+    pub avg_traffic: u32,
+    pub peak_sustainable_traffic: u32,
+    pub broke_my_site_traffic: Option<u32>,
+}
Expand description

User’s traffic pattern; used in generating a captcha configuration

+

Fields

avg_traffic: u32

average traffic of user’s website

+
peak_sustainable_traffic: u32

the peak traffic that the user’s website can handle

+
broke_my_site_traffic: Option<u32>

trafic that bought the user’s website down; optional

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/struct.UpdateEmail.html b/db_sqlx_postgres/dev/dev/prelude/struct.UpdateEmail.html new file mode 100644 index 00000000..bb81aa62 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/struct.UpdateEmail.html @@ -0,0 +1,45 @@ +UpdateEmail in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub struct UpdateEmail<'a> {
+    pub username: &'a str,
+    pub new_email: &'a str,
+}
Expand description

data required to update them email of a user

+

Fields

username: &'a str

username of the user

+
new_email: &'a str

new email address of the user

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/trait.CloneSPDatabase.html b/db_sqlx_postgres/dev/dev/prelude/trait.CloneSPDatabase.html new file mode 100644 index 00000000..507aca7a --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/trait.CloneSPDatabase.html @@ -0,0 +1,12 @@ +CloneSPDatabase in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub trait CloneSPDatabase {
+    fn clone_db(&self) -> Box<dyn MCDatabase + 'static, Global>;
+}
Expand description

Trait to clone MCDatabase

+

Required methods

clone DB

+

Implementors

+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/trait.Connect.html b/db_sqlx_postgres/dev/dev/prelude/trait.Connect.html new file mode 100644 index 00000000..793dff0c --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/trait.Connect.html @@ -0,0 +1,15 @@ +Connect in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub trait Connect {
+    type Pool: MCDatabase;
+    fn connect<'async_trait>(
        self
    ) -> Pin<Box<dyn Future<Output = Result<Self::Pool, DBError>> + Send + 'async_trait, Global>>
    where
        Self: 'async_trait
; +}
Expand description

Create databse connection

+

Associated Types

database specific pool-type

+

Required methods

database specific error-type +create connection pool

+

Implementors

+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/trait.DBOps.html b/db_sqlx_postgres/dev/dev/prelude/trait.DBOps.html new file mode 100644 index 00000000..48d247c6 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/trait.DBOps.html @@ -0,0 +1,9 @@ +DBOps in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub trait DBOps: GetConnection + Migrate { }
Expand description

Database operations trait(migrations, pool creation and fetching connection from pool)

+

Implementors

+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/trait.GetConnection.html b/db_sqlx_postgres/dev/dev/prelude/trait.GetConnection.html new file mode 100644 index 00000000..3478718f --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/trait.GetConnection.html @@ -0,0 +1,15 @@ +GetConnection in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub trait GetConnection {
+    type Conn;
+    fn get_conn<'life0, 'async_trait>(
        &'life0 self
    ) -> Pin<Box<dyn Future<Output = Result<Self::Conn, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        Self: 'async_trait
; +}
Expand description

Get database connection

+

Associated Types

database connection type

+

Required methods

database specific error-type +get connection from connection pool

+

Implementors

+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/trait.MCDatabase.html b/db_sqlx_postgres/dev/dev/prelude/trait.MCDatabase.html new file mode 100644 index 00000000..5c557a3c --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/trait.MCDatabase.html @@ -0,0 +1,81 @@ +MCDatabase in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub trait MCDatabase: Send + Sync + CloneSPDatabase {
+
Show 35 methods fn ping<'life0, 'async_trait>(
        &'life0 self
    ) -> Pin<Box<dyn Future<Output = bool> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        Self: 'async_trait
; + fn register<'life0, 'life1, 'async_trait>(
        &'life0 self,
        p: &'life1 Register<'_>
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn delete_user<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn username_exists<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<bool, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn get_email<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<Option<String>, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn email_exists<'life0, 'life1, 'async_trait>(
        &'life0 self,
        email: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<bool, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_email<'life0, 'life1, 'async_trait>(
        &'life0 self,
        p: &'life1 UpdateEmail<'_>
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn get_password<'life0, 'life1, 'async_trait>(
        &'life0 self,
        l: &'life1 Login<'_>
    ) -> Pin<Box<dyn Future<Output = Result<NameHash, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_password<'life0, 'life1, 'async_trait>(
        &'life0 self,
        p: &'life1 NameHash
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_username<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        current: &'life1 str,
        new: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_secret<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<Secret, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_secret<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        secret: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn create_captcha<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        p: &'life2 CreateCaptcha<'_>
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_captcha_config<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<Captcha, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_all_user_captchas<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<Vec<Captcha, Global>, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn update_captcha_metadata<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        p: &'life2 CreateCaptcha<'_>
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn update_captcha_key<'life0, 'life1, 'life2, 'life3, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        old_key: &'life2 str,
        new_key: &'life3 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        'life3: 'async_trait,
        Self: 'async_trait
; + fn add_captcha_levels<'life0, 'life1, 'life2, 'life3, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str,
        levels: &'life3 [Level]
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        'life3: 'async_trait,
        Self: 'async_trait
; + fn captcha_exists<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: Option<&'life1 str>,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<bool, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn delete_captcha_levels<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn delete_captcha<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_captcha_levels<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: Option<&'life1 str>,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<Vec<Level, Global>, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn get_captcha_cooldown<'life0, 'life1, 'async_trait>(
        &'life0 self,
        captcha_key: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<i32, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn add_traffic_pattern<'life0, 'life1, 'life2, 'life3, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str,
        pattern: &'life3 TrafficPattern
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        'life3: 'async_trait,
        Self: 'async_trait
; + fn get_traffic_pattern<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<TrafficPattern, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn delete_traffic_pattern<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        captcha_key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn create_notification<'life0, 'life1, 'async_trait>(
        &'life0 self,
        p: &'life1 AddNotification<'_>
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn get_all_unread_notifications<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<Vec<Notification, Global>, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn mark_notification_read<'life0, 'life1, 'async_trait>(
        &'life0 self,
        username: &'life1 str,
        id: i32
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn record_fetch<'life0, 'life1, 'async_trait>(
        &'life0 self,
        key: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn record_solve<'life0, 'life1, 'async_trait>(
        &'life0 self,
        key: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn record_confirm<'life0, 'life1, 'async_trait>(
        &'life0 self,
        key: &'life1 str
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        Self: 'async_trait
; + fn fetch_config_fetched<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        user: &'life1 str,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<Vec<i64, Global>, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn fetch_solve<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        user: &'life1 str,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<Vec<i64, Global>, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn fetch_confirm<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        user: &'life1 str,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = Result<Vec<i64, Global>, DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; +
}
Expand description

mCaptcha’s database requirements. To implement support for $Database, kindly implement this +trait.

+

Required methods

ping DB

+

register a new user

+

delete a user

+

check if username exists

+

get user email

+

check if email exists

+

update a user’s email

+

get a user’s password

+

update user’s password

+

update username

+

get a user’s secret

+

update a user’s secret

+

create new captcha

+

Get captcha config

+

Get all captchas belonging to user

+

update captcha metadata; doesn’t change captcha key

+

update captcha key; doesn’t change metadata

+

Add levels to captcha

+

check if captcha exists

+

Delete all levels of a captcha

+

Delete captcha

+

Get captcha levels

+

Get captcha’s cooldown period

+

Add traffic configuration

+

Get traffic configuration

+

Delete traffic configuration

+

create new notification

+

get all unread notifications

+

mark a notification read

+

record PoWConfig fetches

+

record PoWConfig solves

+

record PoWConfig confirms

+

featch PoWConfig fetches

+

featch PoWConfig solves

+

featch PoWConfig confirms

+

Implementors

+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/trait.Migrate.html b/db_sqlx_postgres/dev/dev/prelude/trait.Migrate.html new file mode 100644 index 00000000..7769bdba --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/trait.Migrate.html @@ -0,0 +1,13 @@ +Migrate in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub trait Migrate: MCDatabase {
+    fn migrate<'life0, 'async_trait>(
        &'life0 self
    ) -> Pin<Box<dyn Future<Output = Result<(), DBError>> + Send + 'async_trait, Global>>
    where
        'life0: 'async_trait,
        Self: 'async_trait
; +}
Expand description

database migrations

+

Required methods

database specific error-type +run migrations

+

Implementors

+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/type.BoxDynError.html b/db_sqlx_postgres/dev/dev/prelude/type.BoxDynError.html new file mode 100644 index 00000000..00de945c --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/type.BoxDynError.html @@ -0,0 +1,9 @@ +BoxDynError in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub type BoxDynError = Box<dyn Error + Send + Sync + 'static, Global>;
Expand description

Convenience type alias for grouping driver-specific errors

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/prelude/type.DBResult.html b/db_sqlx_postgres/dev/dev/prelude/type.DBResult.html new file mode 100644 index 00000000..d2670082 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/prelude/type.DBResult.html @@ -0,0 +1,9 @@ +DBResult in db_sqlx_postgres::dev::dev::prelude - Rust + +
pub type DBResult<V> = Result<V, DBError>;
Expand description

Generic result data structure

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/sidebar-items.js b/db_sqlx_postgres/dev/dev/sidebar-items.js new file mode 100644 index 00000000..2dd42ee4 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/sidebar-items.js @@ -0,0 +1 @@ +initSidebarItems({"attr":[["async_trait",""]],"enum":[["DBError","Error data structure grouping various error subtypes"],["Login","types of credentials used as identifiers during login"]],"mod":[["prelude","useful imports for users working with a supported database"]],"struct":[["AddNotification","Data required to add notification"],["Captcha","Data representing a captcha"],["CreateCaptcha","data requried to create new captcha"],["Level","Level struct that describes threshold-difficulty factor mapping"],["NameHash","type encapsulating username and hashed password of a user"],["Notification","Represents notification"],["Register","Data required to register a new user"],["Secret","datastructure representing a user’s secret"],["StatsUnixTimestamp","Captcha statistics with time recorded in UNIX epoch formats"],["TrafficPattern","User’s traffic pattern; used in generating a captcha configuration"],["UpdateEmail","data required to update them email of a user"]],"trait":[["CloneSPDatabase","Trait to clone MCDatabase"],["Connect","Create databse connection"],["DBOps","Database operations trait(migrations, pool creation and fetching connection from pool)"],["GetConnection","Get database connection"],["MCDatabase","mCaptcha’s database requirements. To implement support for $Database, kindly implement this trait."],["Migrate","database migrations"]],"type":[["BoxDynError","Convenience type alias for grouping driver-specific errors"],["DBResult","Generic result data structure"]]}); \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/struct.AddNotification.html b/db_sqlx_postgres/dev/dev/struct.AddNotification.html new file mode 100644 index 00000000..43b3d9c2 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/struct.AddNotification.html @@ -0,0 +1,50 @@ +AddNotification in db_sqlx_postgres::dev::dev - Rust + +
pub struct AddNotification<'a> {
+    pub to: &'a str,
+    pub from: &'a str,
+    pub heading: &'a str,
+    pub message: &'a str,
+}
Expand description

Data required to add notification

+

Fields

to: &'a str

who is the notification addressed to?

+
from: &'a str

notification sender

+
heading: &'a str

heading of the notification

+
message: &'a str

mesage of the notification

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/struct.Captcha.html b/db_sqlx_postgres/dev/dev/struct.Captcha.html new file mode 100644 index 00000000..9c862619 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/struct.Captcha.html @@ -0,0 +1,50 @@ +Captcha in db_sqlx_postgres::dev::dev - Rust + +
pub struct Captcha {
+    pub config_id: i32,
+    pub duration: i32,
+    pub description: String,
+    pub key: String,
+}
Expand description

Data representing a captcha

+

Fields

config_id: i32

Database assigned ID

+
duration: i32

cool down duration

+
description: String

description of the captcha

+
key: String

secret key of the captcha

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/struct.CreateCaptcha.html b/db_sqlx_postgres/dev/dev/struct.CreateCaptcha.html new file mode 100644 index 00000000..0f521b8d --- /dev/null +++ b/db_sqlx_postgres/dev/dev/struct.CreateCaptcha.html @@ -0,0 +1,48 @@ +CreateCaptcha in db_sqlx_postgres::dev::dev - Rust + +
pub struct CreateCaptcha<'a> {
+    pub duration: i32,
+    pub description: &'a str,
+    pub key: &'a str,
+}
Expand description

data requried to create new captcha

+

Fields

duration: i32

cool down duration

+
description: &'a str

description of the captcha

+
key: &'a str

secret key of the captcha

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/struct.Level.html b/db_sqlx_postgres/dev/dev/struct.Level.html new file mode 100644 index 00000000..b1b688f6 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/struct.Level.html @@ -0,0 +1,43 @@ +Level in db_sqlx_postgres::dev::dev - Rust + +
pub struct Level {
+    pub visitor_threshold: u32,
+    pub difficulty_factor: u32,
+}
Expand description

Level struct that describes threshold-difficulty factor mapping

+

Fields

visitor_threshold: u32difficulty_factor: u32

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/struct.NameHash.html b/db_sqlx_postgres/dev/dev/struct.NameHash.html new file mode 100644 index 00000000..4a4b5d7d --- /dev/null +++ b/db_sqlx_postgres/dev/dev/struct.NameHash.html @@ -0,0 +1,45 @@ +NameHash in db_sqlx_postgres::dev::dev - Rust + +
pub struct NameHash {
+    pub username: String,
+    pub hash: String,
+}
Expand description

type encapsulating username and hashed password of a user

+

Fields

username: String

username

+
hash: String

hashed password

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/struct.Notification.html b/db_sqlx_postgres/dev/dev/struct.Notification.html new file mode 100644 index 00000000..369fc6e0 --- /dev/null +++ b/db_sqlx_postgres/dev/dev/struct.Notification.html @@ -0,0 +1,53 @@ +Notification in db_sqlx_postgres::dev::dev - Rust + +
pub struct Notification {
+    pub name: Option<String>,
+    pub heading: Option<String>,
+    pub message: Option<String>,
+    pub received: Option<i64>,
+    pub id: Option<i32>,
+}
Expand description

Represents notification

+

Fields

name: Option<String>

receiver name of the notification

+
heading: Option<String>

heading of the notification

+
message: Option<String>

message of the notification

+
received: Option<i64>

when notification was received

+
id: Option<i32>

db assigned ID of the notification

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Converts to this type from the input type.

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/db_sqlx_postgres/dev/dev/struct.Register.html b/db_sqlx_postgres/dev/dev/struct.Register.html new file mode 100644 index 00000000..18b6669f --- /dev/null +++ b/db_sqlx_postgres/dev/dev/struct.Register.html @@ -0,0 +1,49 @@ +Register in db_sqlx_postgres::dev::dev - Rust + +
pub struct Register<'a> {
+    pub username: &'a str,
+    pub secret: &'a str,
+    pub hash: &'a str,
+    pub email: Option<&'a str>,
+}
Expand description

Data required to register a new user

+

Fields

username: &'a str

username of new user

+
secret: &'a str

secret of new user

+
hash: &'a str

hashed password of new use

+
email: Option<&'a str>

Optionally, email of new use

+

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/mcaptcha/stats/fetch/struct.StatsPayload.html b/db_sqlx_postgres/dev/dev/struct.Secret.html similarity index 56% rename from mcaptcha/stats/fetch/struct.StatsPayload.html rename to db_sqlx_postgres/dev/dev/struct.Secret.html index 4072f092..f79aa3e2 100644 --- a/mcaptcha/stats/fetch/struct.StatsPayload.html +++ b/db_sqlx_postgres/dev/dev/struct.Secret.html @@ -1,17 +1,23 @@ -StatsPayload in mcaptcha::stats::fetch - Rust -

Functions

\ No newline at end of file diff --git a/mcaptcha/api/v1/account/email/fn.services.html b/mcaptcha/api/v1/account/email/fn.services.html index d151b060..64a36510 100644 --- a/mcaptcha/api/v1/account/email/fn.services.html +++ b/mcaptcha/api/v1/account/email/fn.services.html @@ -4,5 +4,5 @@
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::api::v1::account::email::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/api/v1/account/email/index.html b/mcaptcha/api/v1/account/email/index.html index a8c10ef9..d5803a0c 100644 --- a/mcaptcha/api/v1/account/email/index.html +++ b/mcaptcha/api/v1/account/email/index.html @@ -4,7 +4,7 @@

Structs

Functions

diff --git a/mcaptcha/api/v1/account/email/struct.Email.html b/mcaptcha/api/v1/account/email/struct.Email.html index 2f614f43..acadbf41 100644 --- a/mcaptcha/api/v1/account/email/struct.Email.html +++ b/mcaptcha/api/v1/account/email/struct.Email.html @@ -4,13 +4,13 @@
pub struct Email {
+    

Struct mcaptcha::api::v1::account::email::Email

source · []
pub struct Email {
     pub email: String,
-}

Fields

email: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

email: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/account/email/struct.email_exists.html b/mcaptcha/api/v1/account/email/struct.email_exists.html index 115d3b27..666b23f2 100644 --- a/mcaptcha/api/v1/account/email/struct.email_exists.html +++ b/mcaptcha/api/v1/account/email/struct.email_exists.html @@ -4,7 +4,7 @@
pub struct email_exists;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::account::email::email_exists

source · []
pub struct email_exists;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/account/email/struct.set_email.html b/mcaptcha/api/v1/account/email/struct.set_email.html index 56a3b6b4..7fcbe432 100644 --- a/mcaptcha/api/v1/account/email/struct.set_email.html +++ b/mcaptcha/api/v1/account/email/struct.set_email.html @@ -4,8 +4,8 @@
pub struct set_email;
Expand description

update email

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::account::email::set_email

source · []
pub struct set_email;
Expand description

update email

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/account/password/fn.services.html b/mcaptcha/api/v1/account/password/fn.services.html index 03fe8a2a..3d3d7e9d 100644 --- a/mcaptcha/api/v1/account/password/fn.services.html +++ b/mcaptcha/api/v1/account/password/fn.services.html @@ -4,5 +4,5 @@
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::api::v1::account::password::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/api/v1/account/password/fn.update_password_runner.html b/mcaptcha/api/v1/account/password/fn.update_password_runner.html index de22605d..57e62fe1 100644 --- a/mcaptcha/api/v1/account/password/fn.update_password_runner.html +++ b/mcaptcha/api/v1/account/password/fn.update_password_runner.html @@ -4,5 +4,5 @@
async fn update_password_runner(
    user: &str,
    update: UpdatePassword,
    data: &Data
) -> Result<(), ServiceError>
+

Function mcaptcha::api::v1::account::password::update_password_runner

source · []
async fn update_password_runner(
    user: &str,
    update: UpdatePassword,
    data: &Data
) -> Result<(), ServiceError>
\ No newline at end of file diff --git a/mcaptcha/api/v1/account/password/index.html b/mcaptcha/api/v1/account/password/index.html index 41cdb3c8..faa5ed6e 100644 --- a/mcaptcha/api/v1/account/password/index.html +++ b/mcaptcha/api/v1/account/password/index.html @@ -4,7 +4,7 @@

Structs

Functions

\ No newline at end of file diff --git a/mcaptcha/api/v1/account/password/struct.ChangePasswordReqest.html b/mcaptcha/api/v1/account/password/struct.ChangePasswordReqest.html index 78b8bd20..5b14aeb2 100644 --- a/mcaptcha/api/v1/account/password/struct.ChangePasswordReqest.html +++ b/mcaptcha/api/v1/account/password/struct.ChangePasswordReqest.html @@ -4,16 +4,16 @@
pub struct ChangePasswordReqest {
+    

Struct mcaptcha::api::v1::account::password::ChangePasswordReqest

source · []
pub struct ChangePasswordReqest {
     pub password: String,
     pub new_password: String,
     pub confirm_new_password: String,
-}

Fields

password: Stringnew_password: Stringconfirm_new_password: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

password: Stringnew_password: Stringconfirm_new_password: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Converts to this type from the input type.

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Converts to this type from the input type.

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/account/password/struct.UpdatePassword.html b/mcaptcha/api/v1/account/password/struct.UpdatePassword.html index bd5fc8ff..bce14f52 100644 --- a/mcaptcha/api/v1/account/password/struct.UpdatePassword.html +++ b/mcaptcha/api/v1/account/password/struct.UpdatePassword.html @@ -4,10 +4,10 @@
pub struct UpdatePassword {
+    

Struct mcaptcha::api::v1::account::password::UpdatePassword

source · []
pub struct UpdatePassword {
     pub new_password: String,
     pub confirm_new_password: String,
-}

Fields

new_password: Stringconfirm_new_password: String

Trait Implementations

Converts to this type from the input type.

+}

Fields

new_password: Stringconfirm_new_password: String

Trait Implementations

Converts to this type from the input type.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/account/password/struct.update_user_password.html b/mcaptcha/api/v1/account/password/struct.update_user_password.html index b608e099..65bd911a 100644 --- a/mcaptcha/api/v1/account/password/struct.update_user_password.html +++ b/mcaptcha/api/v1/account/password/struct.update_user_password.html @@ -4,7 +4,7 @@
pub struct update_user_password;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::account::password::update_user_password

source · []
pub struct update_user_password;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/account/secret/fn.services.html b/mcaptcha/api/v1/account/secret/fn.services.html index 5c4584b2..f21f0635 100644 --- a/mcaptcha/api/v1/account/secret/fn.services.html +++ b/mcaptcha/api/v1/account/secret/fn.services.html @@ -4,5 +4,5 @@
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::api::v1::account::secret::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/index.html b/mcaptcha/api/v1/account/secret/index.html index 5095571f..2a3659f8 100644 --- a/mcaptcha/api/v1/account/secret/index.html +++ b/mcaptcha/api/v1/account/secret/index.html @@ -4,7 +4,7 @@

Structs

+

Functions

\ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/sidebar-items.js b/mcaptcha/api/v1/account/secret/sidebar-items.js index ccb374a9..7f1f1f31 100644 --- a/mcaptcha/api/v1/account/secret/sidebar-items.js +++ b/mcaptcha/api/v1/account/secret/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["services",""]],"struct":[["Secret",""],["get_secret",""],["update_user_secret",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["services",""]],"struct":[["get_secret",""],["update_user_secret",""]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/struct.get_secret.html b/mcaptcha/api/v1/account/secret/struct.get_secret.html index c9675a87..482b35ca 100644 --- a/mcaptcha/api/v1/account/secret/struct.get_secret.html +++ b/mcaptcha/api/v1/account/secret/struct.get_secret.html @@ -4,7 +4,7 @@
pub struct get_secret;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::account::secret::get_secret

source · []
pub struct get_secret;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/account/secret/struct.update_user_secret.html b/mcaptcha/api/v1/account/secret/struct.update_user_secret.html index 337700d4..beb2f1e1 100644 --- a/mcaptcha/api/v1/account/secret/struct.update_user_secret.html +++ b/mcaptcha/api/v1/account/secret/struct.update_user_secret.html @@ -4,7 +4,7 @@
pub struct update_user_secret;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::account::secret::update_user_secret

source · []
pub struct update_user_secret;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/account/username/fn.services.html b/mcaptcha/api/v1/account/username/fn.services.html index 8e2e3513..99480b56 100644 --- a/mcaptcha/api/v1/account/username/fn.services.html +++ b/mcaptcha/api/v1/account/username/fn.services.html @@ -4,5 +4,5 @@
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::api::v1::account::username::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/api/v1/account/username/index.html b/mcaptcha/api/v1/account/username/index.html index a2af22a4..ad91b894 100644 --- a/mcaptcha/api/v1/account/username/index.html +++ b/mcaptcha/api/v1/account/username/index.html @@ -4,7 +4,7 @@

Modules

Structs

Functions

diff --git a/mcaptcha/api/v1/account/username/runners/fn.username_exists.html b/mcaptcha/api/v1/account/username/runners/fn.username_exists.html index 3538f24e..a79ca753 100644 --- a/mcaptcha/api/v1/account/username/runners/fn.username_exists.html +++ b/mcaptcha/api/v1/account/username/runners/fn.username_exists.html @@ -4,5 +4,5 @@
pub async fn username_exists(
    payload: &AccountCheckPayload,
    data: &AppData
) -> Result<AccountCheckResp, ServiceError>
+

Function mcaptcha::api::v1::account::username::runners::username_exists

source · []
pub async fn username_exists(
    payload: &AccountCheckPayload,
    data: &AppData
) -> Result<AccountCheckResp, ServiceError>
\ No newline at end of file diff --git a/mcaptcha/api/v1/account/username/runners/index.html b/mcaptcha/api/v1/account/username/runners/index.html index 6fc47da0..d7a361ab 100644 --- a/mcaptcha/api/v1/account/username/runners/index.html +++ b/mcaptcha/api/v1/account/username/runners/index.html @@ -4,6 +4,6 @@

Functions

\ No newline at end of file diff --git a/mcaptcha/api/v1/account/username/struct.Username.html b/mcaptcha/api/v1/account/username/struct.Username.html index e45cb375..93d03443 100644 --- a/mcaptcha/api/v1/account/username/struct.Username.html +++ b/mcaptcha/api/v1/account/username/struct.Username.html @@ -4,13 +4,13 @@
pub struct Username {
+    

Struct mcaptcha::api::v1::account::username::Username

source · []
pub struct Username {
     pub username: String,
-}

Fields

username: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

username: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/account/username/struct.set_username.html b/mcaptcha/api/v1/account/username/struct.set_username.html index a159d8f0..6018c880 100644 --- a/mcaptcha/api/v1/account/username/struct.set_username.html +++ b/mcaptcha/api/v1/account/username/struct.set_username.html @@ -4,8 +4,8 @@
pub struct set_username;
Expand description

update username

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::account::username::set_username

source · []
pub struct set_username;
Expand description

update username

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/account/username/struct.username_exists.html b/mcaptcha/api/v1/account/username/struct.username_exists.html index fbbccb4c..8cbfc7dc 100644 --- a/mcaptcha/api/v1/account/username/struct.username_exists.html +++ b/mcaptcha/api/v1/account/username/struct.username_exists.html @@ -4,7 +4,7 @@
pub struct username_exists;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::account::username::username_exists

source · []
pub struct username_exists;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/auth/fn.services.html b/mcaptcha/api/v1/auth/fn.services.html index 96042319..71b40cf2 100644 --- a/mcaptcha/api/v1/auth/fn.services.html +++ b/mcaptcha/api/v1/auth/fn.services.html @@ -4,5 +4,5 @@
-

Function mcaptcha::api::v1::auth::services

source · []
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::api::v1::auth::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/api/v1/auth/index.html b/mcaptcha/api/v1/auth/index.html index f86141fc..0761373c 100644 --- a/mcaptcha/api/v1/auth/index.html +++ b/mcaptcha/api/v1/auth/index.html @@ -4,7 +4,7 @@

Modules

Structs

Functions

diff --git a/mcaptcha/api/v1/auth/routes/index.html b/mcaptcha/api/v1/auth/routes/index.html index e0798290..62c11a44 100644 --- a/mcaptcha/api/v1/auth/routes/index.html +++ b/mcaptcha/api/v1/auth/routes/index.html @@ -4,6 +4,6 @@

Structs

\ No newline at end of file diff --git a/mcaptcha/api/v1/auth/routes/struct.Auth.html b/mcaptcha/api/v1/auth/routes/struct.Auth.html index 54280691..51de3ea4 100644 --- a/mcaptcha/api/v1/auth/routes/struct.Auth.html +++ b/mcaptcha/api/v1/auth/routes/struct.Auth.html @@ -4,11 +4,11 @@
pub struct Auth {
+    

Struct mcaptcha::api::v1::auth::routes::Auth

source · []
pub struct Auth {
     pub logout: &'static str,
     pub login: &'static str,
     pub register: &'static str,
-}

Fields

logout: &'static strlogin: &'static strregister: &'static str

Implementations

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+}

Fields

logout: &'static strlogin: &'static strregister: &'static str

Implementations

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/auth/runners/fn.login_runner.html b/mcaptcha/api/v1/auth/runners/fn.login_runner.html index 07cdef76..0f38085c 100644 --- a/mcaptcha/api/v1/auth/runners/fn.login_runner.html +++ b/mcaptcha/api/v1/auth/runners/fn.login_runner.html @@ -4,6 +4,6 @@
pub async fn login_runner(
    payload: Login,
    data: &AppData
) -> Result<String, ServiceError>
Expand description

returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise

+

Function mcaptcha::api::v1::auth::runners::login_runner

source · []
pub async fn login_runner(
    payload: Login,
    data: &AppData
) -> Result<String, ServiceError>
Expand description

returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise

\ No newline at end of file diff --git a/mcaptcha/api/v1/auth/runners/fn.register_runner.html b/mcaptcha/api/v1/auth/runners/fn.register_runner.html index 36847637..d46631da 100644 --- a/mcaptcha/api/v1/auth/runners/fn.register_runner.html +++ b/mcaptcha/api/v1/auth/runners/fn.register_runner.html @@ -4,5 +4,5 @@
pub async fn register_runner(
    payload: &Register,
    data: &AppData
) -> Result<(), ServiceError>
+

Function mcaptcha::api::v1::auth::runners::register_runner

source · []
pub async fn register_runner(
    payload: &Register,
    data: &AppData
) -> Result<(), ServiceError>
\ No newline at end of file diff --git a/mcaptcha/api/v1/auth/runners/index.html b/mcaptcha/api/v1/auth/runners/index.html index e9bfd8d6..eaaa0bf8 100644 --- a/mcaptcha/api/v1/auth/runners/index.html +++ b/mcaptcha/api/v1/auth/runners/index.html @@ -4,7 +4,7 @@

Structs

Functions

returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise

diff --git a/mcaptcha/api/v1/auth/runners/struct.Login.html b/mcaptcha/api/v1/auth/runners/struct.Login.html index 2408e7b1..33b3474e 100644 --- a/mcaptcha/api/v1/auth/runners/struct.Login.html +++ b/mcaptcha/api/v1/auth/runners/struct.Login.html @@ -4,14 +4,14 @@
pub struct Login {
+    

Struct mcaptcha::api::v1::auth::runners::Login

source · []
pub struct Login {
     pub login: String,
     pub password: String,
-}

Fields

login: Stringpassword: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

login: Stringpassword: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/auth/runners/struct.Password.html b/mcaptcha/api/v1/auth/runners/struct.Password.html index b6da59fe..727ec187 100644 --- a/mcaptcha/api/v1/auth/runners/struct.Password.html +++ b/mcaptcha/api/v1/auth/runners/struct.Password.html @@ -4,13 +4,13 @@
pub struct Password {
+    

Struct mcaptcha::api::v1::auth::runners::Password

source · []
pub struct Password {
     pub password: String,
-}

Fields

password: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

password: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/auth/runners/struct.Register.html b/mcaptcha/api/v1/auth/runners/struct.Register.html index 5eb29c0b..f4a046c4 100644 --- a/mcaptcha/api/v1/auth/runners/struct.Register.html +++ b/mcaptcha/api/v1/auth/runners/struct.Register.html @@ -4,16 +4,16 @@
pub struct Register {
+    

Struct mcaptcha::api::v1::auth::runners::Register

source · []
pub struct Register {
     pub username: String,
     pub password: String,
     pub confirm_password: String,
     pub email: Option<String>,
-}

Fields

username: Stringpassword: Stringconfirm_password: Stringemail: Option<String>

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

username: Stringpassword: Stringconfirm_password: Stringemail: Option<String>

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/auth/struct.login.html b/mcaptcha/api/v1/auth/struct.login.html index dfd7f46e..8b67c67f 100644 --- a/mcaptcha/api/v1/auth/struct.login.html +++ b/mcaptcha/api/v1/auth/struct.login.html @@ -4,7 +4,7 @@
-

Struct mcaptcha::api::v1::auth::login

source · []
pub struct login;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::auth::login

source · []
pub struct login;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/auth/struct.register.html b/mcaptcha/api/v1/auth/struct.register.html index dd411161..54a7ccb8 100644 --- a/mcaptcha/api/v1/auth/struct.register.html +++ b/mcaptcha/api/v1/auth/struct.register.html @@ -4,7 +4,7 @@
pub struct register;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::auth::register

source · []
pub struct register;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/auth/struct.signout.html b/mcaptcha/api/v1/auth/struct.signout.html index 81e63054..cad2ee08 100644 --- a/mcaptcha/api/v1/auth/struct.signout.html +++ b/mcaptcha/api/v1/auth/struct.signout.html @@ -4,7 +4,7 @@
pub struct signout;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::auth::signout

source · []
pub struct signout;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/create/index.html b/mcaptcha/api/v1/mcaptcha/create/index.html index afa975a3..5826f01b 100644 --- a/mcaptcha/api/v1/mcaptcha/create/index.html +++ b/mcaptcha/api/v1/mcaptcha/create/index.html @@ -4,7 +4,7 @@

Modules

Structs

\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/create/runner/fn.create.html b/mcaptcha/api/v1/mcaptcha/create/runner/fn.create.html index c3d2748f..e5e3ad7e 100644 --- a/mcaptcha/api/v1/mcaptcha/create/runner/fn.create.html +++ b/mcaptcha/api/v1/mcaptcha/create/runner/fn.create.html @@ -4,5 +4,5 @@
pub async fn create(
    payload: &CreateCaptcha,
    data: &AppData,
    username: &str
) -> Result<MCaptchaDetails, ServiceError>
+

Function mcaptcha::api::v1::mcaptcha::create::runner::create

source · []
pub async fn create(
    payload: &CreateCaptcha,
    data: &AppData,
    username: &str
) -> Result<MCaptchaDetails, ServiceError>
\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/create/runner/index.html b/mcaptcha/api/v1/mcaptcha/create/runner/index.html index 90b4efa7..cb3a4264 100644 --- a/mcaptcha/api/v1/mcaptcha/create/runner/index.html +++ b/mcaptcha/api/v1/mcaptcha/create/runner/index.html @@ -4,6 +4,6 @@

Functions

\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/create/struct.CreateCaptcha.html b/mcaptcha/api/v1/mcaptcha/create/struct.CreateCaptcha.html index c24295d0..533670d3 100644 --- a/mcaptcha/api/v1/mcaptcha/create/struct.CreateCaptcha.html +++ b/mcaptcha/api/v1/mcaptcha/create/struct.CreateCaptcha.html @@ -4,12 +4,12 @@
pub struct CreateCaptcha {
+    

Struct mcaptcha::api::v1::mcaptcha::create::CreateCaptcha

source · []
pub struct CreateCaptcha {
     pub levels: Vec<Level>,
     pub duration: u32,
     pub description: String,
-}

Fields

levels: Vec<Level>duration: u32description: String

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+}

Fields

levels: Vec<Level>duration: u32description: String

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/mcaptcha/create/struct.MCaptchaDetails.html b/mcaptcha/api/v1/mcaptcha/create/struct.MCaptchaDetails.html index de8a6cfa..c4f169e1 100644 --- a/mcaptcha/api/v1/mcaptcha/create/struct.MCaptchaDetails.html +++ b/mcaptcha/api/v1/mcaptcha/create/struct.MCaptchaDetails.html @@ -4,14 +4,14 @@
pub struct MCaptchaDetails {
+    

Struct mcaptcha::api::v1::mcaptcha::create::MCaptchaDetails

source · []
pub struct MCaptchaDetails {
     pub name: String,
     pub key: String,
-}

Fields

name: Stringkey: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

name: Stringkey: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/mcaptcha/create/struct.create.html b/mcaptcha/api/v1/mcaptcha/create/struct.create.html index e2190fa1..fcbd8edc 100644 --- a/mcaptcha/api/v1/mcaptcha/create/struct.create.html +++ b/mcaptcha/api/v1/mcaptcha/create/struct.create.html @@ -4,7 +4,7 @@
pub struct create;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::mcaptcha::create::create

source · []
pub struct create;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/delete/index.html b/mcaptcha/api/v1/mcaptcha/delete/index.html index d9be2320..3e9fd754 100644 --- a/mcaptcha/api/v1/mcaptcha/delete/index.html +++ b/mcaptcha/api/v1/mcaptcha/delete/index.html @@ -4,6 +4,6 @@

Structs

\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/delete/struct.DeleteCaptcha.html b/mcaptcha/api/v1/mcaptcha/delete/struct.DeleteCaptcha.html index 88425407..1c9e54dd 100644 --- a/mcaptcha/api/v1/mcaptcha/delete/struct.DeleteCaptcha.html +++ b/mcaptcha/api/v1/mcaptcha/delete/struct.DeleteCaptcha.html @@ -4,14 +4,14 @@
pub struct DeleteCaptcha {
+    

Struct mcaptcha::api::v1::mcaptcha::delete::DeleteCaptcha

source · []
pub struct DeleteCaptcha {
     pub key: String,
     pub password: String,
-}

Fields

key: Stringpassword: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

key: Stringpassword: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/mcaptcha/delete/struct.delete.html b/mcaptcha/api/v1/mcaptcha/delete/struct.delete.html index cf63c57e..09d66f0e 100644 --- a/mcaptcha/api/v1/mcaptcha/delete/struct.delete.html +++ b/mcaptcha/api/v1/mcaptcha/delete/struct.delete.html @@ -4,7 +4,7 @@
pub struct delete;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::mcaptcha::delete::delete

source · []
pub struct delete;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/easy/fn.calculate.html b/mcaptcha/api/v1/mcaptcha/easy/fn.calculate.html new file mode 100644 index 00000000..e7e16c1f --- /dev/null +++ b/mcaptcha/api/v1/mcaptcha/easy/fn.calculate.html @@ -0,0 +1,8 @@ +calculate in mcaptcha::api::v1::mcaptcha::easy - Rust + +
pub fn calculate(
    tp: &TrafficPattern,
    strategy: &DefaultDifficultyStrategy
) -> Result<Vec<Level>, ServiceError>
+ \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/easy/fn.services.html b/mcaptcha/api/v1/mcaptcha/easy/fn.services.html index 97c3dc97..a557fb1f 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/fn.services.html +++ b/mcaptcha/api/v1/mcaptcha/easy/fn.services.html @@ -4,5 +4,5 @@
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::api::v1::mcaptcha::easy::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/easy/index.html b/mcaptcha/api/v1/mcaptcha/easy/index.html index f7a03e9d..31650320 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/index.html +++ b/mcaptcha/api/v1/mcaptcha/easy/index.html @@ -4,8 +4,9 @@

Modules

Structs

-

Functions

-
+

User’s traffic pattern; used in generating a captcha configuration

+

Functions

+
\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/easy/routes/index.html b/mcaptcha/api/v1/mcaptcha/easy/routes/index.html index d306ab44..c258ec44 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/routes/index.html +++ b/mcaptcha/api/v1/mcaptcha/easy/routes/index.html @@ -4,6 +4,6 @@

Structs

\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/easy/routes/struct.Easy.html b/mcaptcha/api/v1/mcaptcha/easy/routes/struct.Easy.html index 8c291397..fbb397be 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/routes/struct.Easy.html +++ b/mcaptcha/api/v1/mcaptcha/easy/routes/struct.Easy.html @@ -4,11 +4,11 @@
pub struct Easy {
+    

Struct mcaptcha::api::v1::mcaptcha::easy::routes::Easy

source · []
pub struct Easy {
     pub create: &'static str,
     pub update: &'static str,
 }

Fields

create: &'static str

easy is using defaults

-
update: &'static str

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+
update: &'static str

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/easy/sidebar-items.js b/mcaptcha/api/v1/mcaptcha/easy/sidebar-items.js index 4425a4c3..504c8b3a 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/sidebar-items.js +++ b/mcaptcha/api/v1/mcaptcha/easy/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["services",""]],"mod":[["routes",""]],"struct":[["TrafficPattern",""],["UpdateTrafficPattern",""],["create",""],["update",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["calculate",""],["services",""]],"mod":[["routes",""]],"struct":[["TrafficPatternRequest","User’s traffic pattern; used in generating a captcha configuration"],["UpdateTrafficPattern",""],["create",""],["update",""]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/easy/struct.TrafficPattern.html b/mcaptcha/api/v1/mcaptcha/easy/struct.TrafficPatternRequest.html similarity index 57% rename from mcaptcha/api/v1/mcaptcha/easy/struct.TrafficPattern.html rename to mcaptcha/api/v1/mcaptcha/easy/struct.TrafficPatternRequest.html index 77bc1ed4..a3033908 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/struct.TrafficPattern.html +++ b/mcaptcha/api/v1/mcaptcha/easy/struct.TrafficPatternRequest.html @@ -1,23 +1,30 @@ -TrafficPattern in mcaptcha::api::v1::mcaptcha::easy - Rust +TrafficPatternRequest in mcaptcha::api::v1::mcaptcha::easy - Rust
Expand description

User’s traffic pattern; used in generating a captcha configuration

+

Fields

avg_traffic: u32

average traffic of user’s website

+
peak_sustainable_traffic: u32

the peak traffic that the user’s website can handle

+
broke_my_site_traffic: Option<u32>

trafic that bought the user’s website down; optional

+
description: String

Captcha description

+

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Converts to this type from the input type.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

+

Returns the argument unchanged.

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more

Instruments this type with the current Span, returning an diff --git a/mcaptcha/api/v1/mcaptcha/easy/struct.UpdateTrafficPattern.html b/mcaptcha/api/v1/mcaptcha/easy/struct.UpdateTrafficPattern.html index e42fdfb4..7557edf8 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/struct.UpdateTrafficPattern.html +++ b/mcaptcha/api/v1/mcaptcha/easy/struct.UpdateTrafficPattern.html @@ -4,14 +4,14 @@

pub struct UpdateTrafficPattern {
-    pub pattern: TrafficPattern,
+    

Struct mcaptcha::api::v1::mcaptcha::easy::UpdateTrafficPattern

source · []
pub struct UpdateTrafficPattern {
+    pub pattern: TrafficPatternRequest,
     pub key: String,
-}

Fields

pattern: TrafficPatternkey: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

pattern: TrafficPatternRequestkey: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/mcaptcha/easy/struct.create.html b/mcaptcha/api/v1/mcaptcha/easy/struct.create.html index f1935e21..b7a3a6e6 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/struct.create.html +++ b/mcaptcha/api/v1/mcaptcha/easy/struct.create.html @@ -4,7 +4,7 @@
pub struct create;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::mcaptcha::easy::create

source · []
pub struct create;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/easy/struct.update.html b/mcaptcha/api/v1/mcaptcha/easy/struct.update.html index 74970bee..624fdec3 100644 --- a/mcaptcha/api/v1/mcaptcha/easy/struct.update.html +++ b/mcaptcha/api/v1/mcaptcha/easy/struct.update.html @@ -4,7 +4,7 @@
pub struct update;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::mcaptcha::easy::update

source · []
pub struct update;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/get/index.html b/mcaptcha/api/v1/mcaptcha/get/index.html index 97b6c5d4..21df49be 100644 --- a/mcaptcha/api/v1/mcaptcha/get/index.html +++ b/mcaptcha/api/v1/mcaptcha/get/index.html @@ -3,8 +3,7 @@

Modules

-

Structs

+

Module get

\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/get/runner/fn.get_captcha.html b/mcaptcha/api/v1/mcaptcha/get/runner/fn.get_captcha.html deleted file mode 100644 index bf6a4a3f..00000000 --- a/mcaptcha/api/v1/mcaptcha/get/runner/fn.get_captcha.html +++ /dev/null @@ -1,8 +0,0 @@ -get_captcha in mcaptcha::api::v1::mcaptcha::get::runner - Rust - -
pub async fn get_captcha(
    key: &str,
    username: &str,
    data: &AppData
) -> Result<Vec<I32Levels>, ServiceError>
- \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/get/runner/index.html b/mcaptcha/api/v1/mcaptcha/get/runner/index.html deleted file mode 100644 index 0a7faf27..00000000 --- a/mcaptcha/api/v1/mcaptcha/get/runner/index.html +++ /dev/null @@ -1,9 +0,0 @@ -mcaptcha::api::v1::mcaptcha::get::runner - Rust - -
- \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/get/runner/sidebar-items.js b/mcaptcha/api/v1/mcaptcha/get/runner/sidebar-items.js deleted file mode 100644 index 9042fe85..00000000 --- a/mcaptcha/api/v1/mcaptcha/get/runner/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -initSidebarItems({"fn":[["get_captcha",""]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/get/sidebar-items.js b/mcaptcha/api/v1/mcaptcha/get/sidebar-items.js index 3bb6f411..eb480e2c 100644 --- a/mcaptcha/api/v1/mcaptcha/get/sidebar-items.js +++ b/mcaptcha/api/v1/mcaptcha/get/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"mod":[["runner",""]],"struct":[["I32Levels",""],["Levels",""],["get_captcha",""]]}); \ No newline at end of file +initSidebarItems({"struct":[["I32Levels",""],["Levels",""],["get_captcha",""]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/get/struct.I32Levels.html b/mcaptcha/api/v1/mcaptcha/get/struct.I32Levels.html index d6137544..26309c24 100644 --- a/mcaptcha/api/v1/mcaptcha/get/struct.I32Levels.html +++ b/mcaptcha/api/v1/mcaptcha/get/struct.I32Levels.html @@ -4,14 +4,14 @@
pub struct I32Levels {
+    

Struct mcaptcha::api::v1::mcaptcha::get::I32Levels

source · []
pub struct I32Levels {
     pub difficulty_factor: i32,
     pub visitor_threshold: i32,
-}

Fields

difficulty_factor: i32visitor_threshold: i32

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

difficulty_factor: i32visitor_threshold: i32

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/mcaptcha/get/struct.Levels.html b/mcaptcha/api/v1/mcaptcha/get/struct.Levels.html index 159d47f3..715f5496 100644 --- a/mcaptcha/api/v1/mcaptcha/get/struct.Levels.html +++ b/mcaptcha/api/v1/mcaptcha/get/struct.Levels.html @@ -4,13 +4,13 @@
pub struct Levels {
+    

Struct mcaptcha::api::v1::mcaptcha::get::Levels

source · []
pub struct Levels {
     levels: I32Levels,
-}

Fields

levels: I32Levels

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

levels: I32Levels

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/mcaptcha/stats/index.html b/mcaptcha/api/v1/mcaptcha/stats/index.html index 0a7ae145..9e7f426e 100644 --- a/mcaptcha/api/v1/mcaptcha/stats/index.html +++ b/mcaptcha/api/v1/mcaptcha/stats/index.html @@ -4,7 +4,7 @@

Modules

Structs

\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/stats/routes/index.html b/mcaptcha/api/v1/mcaptcha/stats/routes/index.html index 6c3974a7..50fd122e 100644 --- a/mcaptcha/api/v1/mcaptcha/stats/routes/index.html +++ b/mcaptcha/api/v1/mcaptcha/stats/routes/index.html @@ -4,6 +4,6 @@

Structs

\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/stats/routes/struct.Stats.html b/mcaptcha/api/v1/mcaptcha/stats/routes/struct.Stats.html index d158352e..1cda8f17 100644 --- a/mcaptcha/api/v1/mcaptcha/stats/routes/struct.Stats.html +++ b/mcaptcha/api/v1/mcaptcha/stats/routes/struct.Stats.html @@ -4,9 +4,9 @@
pub struct Stats {
+    

Struct mcaptcha::api::v1::mcaptcha::stats::routes::Stats

source · []
pub struct Stats {
     pub get: &'static str,
-}

Fields

get: &'static str

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+}

Fields

get: &'static str

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/stats/struct.StatsPayload.html b/mcaptcha/api/v1/mcaptcha/stats/struct.StatsPayload.html index a64493ff..17ba9eb9 100644 --- a/mcaptcha/api/v1/mcaptcha/stats/struct.StatsPayload.html +++ b/mcaptcha/api/v1/mcaptcha/stats/struct.StatsPayload.html @@ -4,13 +4,13 @@
pub struct StatsPayload {
+    

Struct mcaptcha::api::v1::mcaptcha::stats::StatsPayload

source · []
pub struct StatsPayload {
     pub key: String,
-}

Fields

key: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

key: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/mcaptcha/stats/struct.get.html b/mcaptcha/api/v1/mcaptcha/stats/struct.get.html index eba34155..58b10e11 100644 --- a/mcaptcha/api/v1/mcaptcha/stats/struct.get.html +++ b/mcaptcha/api/v1/mcaptcha/stats/struct.get.html @@ -4,7 +4,7 @@
pub struct get;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::mcaptcha::stats::get

source · []
pub struct get;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/update/index.html b/mcaptcha/api/v1/mcaptcha/update/index.html index 2644a701..8ea874a1 100644 --- a/mcaptcha/api/v1/mcaptcha/update/index.html +++ b/mcaptcha/api/v1/mcaptcha/update/index.html @@ -4,7 +4,7 @@

Modules

Structs

\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/update/runner/fn.update_captcha.html b/mcaptcha/api/v1/mcaptcha/update/runner/fn.update_captcha.html index 7f0aa491..65b402ae 100644 --- a/mcaptcha/api/v1/mcaptcha/update/runner/fn.update_captcha.html +++ b/mcaptcha/api/v1/mcaptcha/update/runner/fn.update_captcha.html @@ -4,5 +4,5 @@
pub async fn update_captcha(
    payload: &UpdateCaptcha,
    data: &AppData,
    username: &str
) -> Result<(), ServiceError>
+

Function mcaptcha::api::v1::mcaptcha::update::runner::update_captcha

source · []
pub async fn update_captcha(
    payload: &UpdateCaptcha,
    data: &AppData,
    username: &str
) -> Result<(), ServiceError>
\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/update/runner/fn.update_key.html b/mcaptcha/api/v1/mcaptcha/update/runner/fn.update_key.html deleted file mode 100644 index 89a2e6db..00000000 --- a/mcaptcha/api/v1/mcaptcha/update/runner/fn.update_key.html +++ /dev/null @@ -1,8 +0,0 @@ -update_key in mcaptcha::api::v1::mcaptcha::update::runner - Rust - -
pub async fn update_key(
    key: &str,
    old_key: &str,
    username: &str,
    data: &AppData
) -> Result<(), Error>
- \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/update/runner/index.html b/mcaptcha/api/v1/mcaptcha/update/runner/index.html index 178bab55..fb1c0b18 100644 --- a/mcaptcha/api/v1/mcaptcha/update/runner/index.html +++ b/mcaptcha/api/v1/mcaptcha/update/runner/index.html @@ -4,6 +4,6 @@
+

Module mcaptcha::api::v1::mcaptcha::update::runner

source · []

Functions

+
\ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/update/runner/sidebar-items.js b/mcaptcha/api/v1/mcaptcha/update/runner/sidebar-items.js index eef0f1be..42e25f60 100644 --- a/mcaptcha/api/v1/mcaptcha/update/runner/sidebar-items.js +++ b/mcaptcha/api/v1/mcaptcha/update/runner/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"fn":[["update_captcha",""],["update_key",""]]}); \ No newline at end of file +initSidebarItems({"fn":[["update_captcha",""]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/mcaptcha/update/struct.UpdateCaptcha.html b/mcaptcha/api/v1/mcaptcha/update/struct.UpdateCaptcha.html index 093904cd..fb3b8c35 100644 --- a/mcaptcha/api/v1/mcaptcha/update/struct.UpdateCaptcha.html +++ b/mcaptcha/api/v1/mcaptcha/update/struct.UpdateCaptcha.html @@ -4,13 +4,13 @@
pub struct UpdateCaptcha {
+    

Struct mcaptcha::api::v1::mcaptcha::update::UpdateCaptcha

source · []
pub struct UpdateCaptcha {
     pub levels: Vec<Level>,
     pub duration: u32,
     pub description: String,
     pub key: String,
-}

Fields

levels: Vec<Level>duration: u32description: Stringkey: String

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+}

Fields

levels: Vec<Level>duration: u32description: Stringkey: String

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/mcaptcha/update/struct.update_captcha.html b/mcaptcha/api/v1/mcaptcha/update/struct.update_captcha.html index 5ae7405a..677fd555 100644 --- a/mcaptcha/api/v1/mcaptcha/update/struct.update_captcha.html +++ b/mcaptcha/api/v1/mcaptcha/update/struct.update_captcha.html @@ -4,7 +4,7 @@
pub struct update_captcha;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::mcaptcha::update::update_captcha

source · []
pub struct update_captcha;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/mcaptcha/update/struct.update_key.html b/mcaptcha/api/v1/mcaptcha/update/struct.update_key.html index 6c0e2c14..ce16364a 100644 --- a/mcaptcha/api/v1/mcaptcha/update/struct.update_key.html +++ b/mcaptcha/api/v1/mcaptcha/update/struct.update_key.html @@ -4,7 +4,7 @@
pub struct update_key;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::mcaptcha::update::update_key

source · []
pub struct update_key;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/meta/fn.services.html b/mcaptcha/api/v1/meta/fn.services.html index 5af493f4..9aabd2c9 100644 --- a/mcaptcha/api/v1/meta/fn.services.html +++ b/mcaptcha/api/v1/meta/fn.services.html @@ -4,5 +4,5 @@
-

Function mcaptcha::api::v1::meta::services

source · []
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::api::v1::meta::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/api/v1/meta/index.html b/mcaptcha/api/v1/meta/index.html index c762c51a..8542fa1e 100644 --- a/mcaptcha/api/v1/meta/index.html +++ b/mcaptcha/api/v1/meta/index.html @@ -4,7 +4,7 @@

Modules

Structs

Health check return datatype

diff --git a/mcaptcha/api/v1/notifications/add/index.html b/mcaptcha/api/v1/notifications/add/index.html index b5db68f6..9f9ea1fb 100644 --- a/mcaptcha/api/v1/notifications/add/index.html +++ b/mcaptcha/api/v1/notifications/add/index.html @@ -4,7 +4,7 @@

Structs

-

route handler that adds a notification message

+

Module mcaptcha::api::v1::notifications::add

source · []

Structs

+

route handler that adds a notification message

\ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/add/sidebar-items.js b/mcaptcha/api/v1/notifications/add/sidebar-items.js index d3f70f05..d086047e 100644 --- a/mcaptcha/api/v1/notifications/add/sidebar-items.js +++ b/mcaptcha/api/v1/notifications/add/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"struct":[["AddNotification",""],["add_notification","route handler that adds a notification message"]]}); \ No newline at end of file +initSidebarItems({"struct":[["AddNotificationRequest",""],["add_notification","route handler that adds a notification message"]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/add/struct.AddNotification.html b/mcaptcha/api/v1/notifications/add/struct.AddNotification.html deleted file mode 100644 index c152e3ed..00000000 --- a/mcaptcha/api/v1/notifications/add/struct.AddNotification.html +++ /dev/null @@ -1,34 +0,0 @@ -AddNotification in mcaptcha::api::v1::notifications::add - Rust - -
pub struct AddNotification {
-    pub to: String,
-    pub heading: String,
-    pub message: String,
-}

Fields

to: Stringheading: Stringmessage: String

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Instruments this type with the provided Span, returning an -Instrumented wrapper. Read more

-

Instruments this type with the current Span, returning an -Instrumented wrapper. Read more

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

Attaches the provided Subscriber to this type, returning a -WithDispatch wrapper. Read more

-

Attaches the current default Subscriber to this type, returning a -WithDispatch wrapper. Read more

-
- \ No newline at end of file diff --git a/mcaptcha/api/v1/account/secret/struct.Secret.html b/mcaptcha/api/v1/notifications/add/struct.AddNotificationRequest.html similarity index 58% rename from mcaptcha/api/v1/account/secret/struct.Secret.html rename to mcaptcha/api/v1/notifications/add/struct.AddNotificationRequest.html index f5faeb6d..eb37a655 100644 --- a/mcaptcha/api/v1/account/secret/struct.Secret.html +++ b/mcaptcha/api/v1/notifications/add/struct.AddNotificationRequest.html @@ -1,17 +1,23 @@ -Secret in mcaptcha::api::v1::account::secret - Rust +AddNotificationRequest in mcaptcha::api::v1::notifications::add - Rust
pub struct Secret {
-    pub secret: String,
-}

Fields

secret: String

Trait Implementations

Returns a copy of the value. Read more

+

AddNotificationRequest

pub struct AddNotificationRequest {
+    pub to: String,
+    pub heading: String,
+    pub message: String,
+}

Fields

to: Stringheading: Stringmessage: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/notifications/add/struct.add_notification.html b/mcaptcha/api/v1/notifications/add/struct.add_notification.html index a8f83bf9..51bee966 100644 --- a/mcaptcha/api/v1/notifications/add/struct.add_notification.html +++ b/mcaptcha/api/v1/notifications/add/struct.add_notification.html @@ -4,8 +4,8 @@
pub struct add_notification;
Expand description

route handler that adds a notification message

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::notifications::add::add_notification

source · []
pub struct add_notification;
Expand description

route handler that adds a notification message

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/notifications/get/index.html b/mcaptcha/api/v1/notifications/get/index.html index 7aae2c18..aa343314 100644 --- a/mcaptcha/api/v1/notifications/get/index.html +++ b/mcaptcha/api/v1/notifications/get/index.html @@ -3,9 +3,8 @@

Modules

-

Structs

-

route handler that gets all unread notifications

+

Module get

Structs

+

route handler that gets all unread notifications

\ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/runner/fn.get_notification.html b/mcaptcha/api/v1/notifications/get/runner/fn.get_notification.html deleted file mode 100644 index 8a9a0d12..00000000 --- a/mcaptcha/api/v1/notifications/get/runner/fn.get_notification.html +++ /dev/null @@ -1,8 +0,0 @@ -get_notification in mcaptcha::api::v1::notifications::get::runner - Rust - -
pub async fn get_notification(
    data: &AppData,
    receiver: &str
) -> Result<Vec<Notification>, ServiceError>
- \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/runner/index.html b/mcaptcha/api/v1/notifications/get/runner/index.html deleted file mode 100644 index 60916f5c..00000000 --- a/mcaptcha/api/v1/notifications/get/runner/index.html +++ /dev/null @@ -1,9 +0,0 @@ -mcaptcha::api::v1::notifications::get::runner - Rust - -
- \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/runner/sidebar-items.js b/mcaptcha/api/v1/notifications/get/runner/sidebar-items.js deleted file mode 100644 index 6d3f4511..00000000 --- a/mcaptcha/api/v1/notifications/get/runner/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -initSidebarItems({"fn":[["get_notification",""]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/sidebar-items.js b/mcaptcha/api/v1/notifications/get/sidebar-items.js index 07ddc27d..73fc2a78 100644 --- a/mcaptcha/api/v1/notifications/get/sidebar-items.js +++ b/mcaptcha/api/v1/notifications/get/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"mod":[["runner",""]],"struct":[["Notification",""],["NotificationResp",""],["get_notification","route handler that gets all unread notifications"]]}); \ No newline at end of file +initSidebarItems({"struct":[["NotificationResp",""],["get_notification","route handler that gets all unread notifications"]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/struct.Notification.html b/mcaptcha/api/v1/notifications/get/struct.Notification.html deleted file mode 100644 index b4d13269..00000000 --- a/mcaptcha/api/v1/notifications/get/struct.Notification.html +++ /dev/null @@ -1,36 +0,0 @@ -Notification in mcaptcha::api::v1::notifications::get - Rust - -
pub struct Notification {
-    pub name: Option<String>,
-    pub heading: Option<String>,
-    pub message: Option<String>,
-    pub received: Option<OffsetDateTime>,
-    pub id: Option<i32>,
-}

Fields

name: Option<String>heading: Option<String>message: Option<String>received: Option<OffsetDateTime>id: Option<i32>

Trait Implementations

Converts to this type from the input type.

-

Converts to this type from the input type.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Instruments this type with the provided Span, returning an -Instrumented wrapper. Read more

-

Instruments this type with the current Span, returning an -Instrumented wrapper. Read more

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

Attaches the provided Subscriber to this type, returning a -WithDispatch wrapper. Read more

-

Attaches the current default Subscriber to this type, returning a -WithDispatch wrapper. Read more

-
- \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/get/struct.NotificationResp.html b/mcaptcha/api/v1/notifications/get/struct.NotificationResp.html index 6389aebd..df1896dd 100644 --- a/mcaptcha/api/v1/notifications/get/struct.NotificationResp.html +++ b/mcaptcha/api/v1/notifications/get/struct.NotificationResp.html @@ -3,17 +3,23 @@

pub struct NotificationResp {
+        

NotificationResp

pub struct NotificationResp {
     pub name: String,
     pub heading: String,
     pub message: String,
     pub received: i64,
     pub id: i32,
-}

Fields

name: Stringheading: Stringmessage: Stringreceived: i64id: i32

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

-

Converts to this type from the input type.

-

Serialize this value into the given Serde serializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+}

Fields

name: Stringheading: Stringmessage: Stringreceived: i64id: i32

Implementations

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Returns the “default value” for a type. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Converts to this type from the input type.

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Serialize this value into the given Serde serializer. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

@@ -25,6 +31,9 @@

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

The type returned in the event of a conversion error.

Performs the conversion.

The type returned in the event of a conversion error.

diff --git a/mcaptcha/api/v1/notifications/get/struct.get_notification.html b/mcaptcha/api/v1/notifications/get/struct.get_notification.html index 21a66d1b..02b6bea3 100644 --- a/mcaptcha/api/v1/notifications/get/struct.get_notification.html +++ b/mcaptcha/api/v1/notifications/get/struct.get_notification.html @@ -4,8 +4,8 @@
pub struct get_notification;
Expand description

route handler that gets all unread notifications

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::notifications::get::get_notification

source · []
pub struct get_notification;
Expand description

route handler that gets all unread notifications

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/notifications/mark_read/index.html b/mcaptcha/api/v1/notifications/mark_read/index.html index 8d2f2997..b80c646b 100644 --- a/mcaptcha/api/v1/notifications/mark_read/index.html +++ b/mcaptcha/api/v1/notifications/mark_read/index.html @@ -4,7 +4,7 @@

Structs

-

route handler that marks a notification read

+

Module mcaptcha::api::v1::notifications::mark_read

source · []

Structs

+

route handler that marks a notification read

\ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/mark_read/sidebar-items.js b/mcaptcha/api/v1/notifications/mark_read/sidebar-items.js index 16ad4a74..af9b9b01 100644 --- a/mcaptcha/api/v1/notifications/mark_read/sidebar-items.js +++ b/mcaptcha/api/v1/notifications/mark_read/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"struct":[["MarkReadReq",""],["NotificationResp",""],["mark_read","route handler that marks a notification read"]]}); \ No newline at end of file +initSidebarItems({"struct":[["MarkReadReq",""],["mark_read","route handler that marks a notification read"]]}); \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/mark_read/struct.NotificationResp.html b/mcaptcha/api/v1/notifications/mark_read/struct.NotificationResp.html deleted file mode 100644 index b79f7418..00000000 --- a/mcaptcha/api/v1/notifications/mark_read/struct.NotificationResp.html +++ /dev/null @@ -1,36 +0,0 @@ -NotificationResp in mcaptcha::api::v1::notifications::mark_read - Rust - -
pub struct NotificationResp {
-    pub name: String,
-    pub heading: String,
-    pub message: String,
-    pub received: i64,
-    pub id: i32,
-}

Fields

name: Stringheading: Stringmessage: Stringreceived: i64id: i32

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Instruments this type with the provided Span, returning an -Instrumented wrapper. Read more

-

Instruments this type with the current Span, returning an -Instrumented wrapper. Read more

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

Attaches the provided Subscriber to this type, returning a -WithDispatch wrapper. Read more

-

Attaches the current default Subscriber to this type, returning a -WithDispatch wrapper. Read more

-
- \ No newline at end of file diff --git a/mcaptcha/api/v1/notifications/mark_read/struct.mark_read.html b/mcaptcha/api/v1/notifications/mark_read/struct.mark_read.html index 3164c264..7fbb40f2 100644 --- a/mcaptcha/api/v1/notifications/mark_read/struct.mark_read.html +++ b/mcaptcha/api/v1/notifications/mark_read/struct.mark_read.html @@ -4,8 +4,8 @@
pub struct mark_read;
Expand description

route handler that marks a notification read

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::notifications::mark_read::mark_read

source · []
pub struct mark_read;
Expand description

route handler that marks a notification read

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/pow/get_config/fn.init_mcaptcha.html b/mcaptcha/api/v1/pow/get_config/fn.init_mcaptcha.html index f86015cb..c42994f0 100644 --- a/mcaptcha/api/v1/pow/get_config/fn.init_mcaptcha.html +++ b/mcaptcha/api/v1/pow/get_config/fn.init_mcaptcha.html @@ -4,7 +4,7 @@
async fn init_mcaptcha(data: &AppData, key: &str) -> Result<(), ServiceError>
Expand description

Call this when [MCaptcha][libmcaptcha::MCaptcha] is not in master.

+

Function mcaptcha::api::v1::pow::get_config::init_mcaptcha

source · []
async fn init_mcaptcha(data: &AppData, key: &str) -> Result<(), ServiceError>
Expand description

Call this when [MCaptcha][libmcaptcha::MCaptcha] is not in master.

This fn gets mcaptcha config from database, builds [Defense][libmcaptcha::Defense], creates [MCaptcha][libmcaptcha::MCaptcha] and adds it to [Master][libmcaptcha::Defense]

diff --git a/mcaptcha/api/v1/pow/get_config/index.html b/mcaptcha/api/v1/pow/get_config/index.html index 37037f75..05dee566 100644 --- a/mcaptcha/api/v1/pow/get_config/index.html +++ b/mcaptcha/api/v1/pow/get_config/index.html @@ -4,7 +4,7 @@

Structs

get PoW configuration for an mcaptcha key

Functions

Call this when [MCaptcha][libmcaptcha::MCaptcha] is not in master.

diff --git a/mcaptcha/api/v1/pow/get_config/struct.GetConfigPayload.html b/mcaptcha/api/v1/pow/get_config/struct.GetConfigPayload.html index 745d88e0..fd17bb60 100644 --- a/mcaptcha/api/v1/pow/get_config/struct.GetConfigPayload.html +++ b/mcaptcha/api/v1/pow/get_config/struct.GetConfigPayload.html @@ -4,13 +4,13 @@
pub struct GetConfigPayload {
+    

Struct mcaptcha::api::v1::pow::get_config::GetConfigPayload

source · []
pub struct GetConfigPayload {
     pub key: String,
-}

Fields

key: String

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

key: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/pow/get_config/struct.get_config.html b/mcaptcha/api/v1/pow/get_config/struct.get_config.html index 52f55b86..78641881 100644 --- a/mcaptcha/api/v1/pow/get_config/struct.get_config.html +++ b/mcaptcha/api/v1/pow/get_config/struct.get_config.html @@ -4,8 +4,8 @@
pub struct get_config;
Expand description

get PoW configuration for an mcaptcha key

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::pow::get_config::get_config

source · []
pub struct get_config;
Expand description

get PoW configuration for an mcaptcha key

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/pow/verify_pow/index.html b/mcaptcha/api/v1/pow/verify_pow/index.html index 0ff13ebc..8e2b2246 100644 --- a/mcaptcha/api/v1/pow/verify_pow/index.html +++ b/mcaptcha/api/v1/pow/verify_pow/index.html @@ -4,7 +4,7 @@
Expand description

PoW Verification module

+

Module mcaptcha::api::v1::pow::verify_pow

source · []
Expand description

PoW Verification module

Structs

validation token that clients receive as proof for submiting valid PoW

diff --git a/mcaptcha/api/v1/pow/verify_pow/struct.ValidationToken.html b/mcaptcha/api/v1/pow/verify_pow/struct.ValidationToken.html index c9ca1d77..ce38835d 100644 --- a/mcaptcha/api/v1/pow/verify_pow/struct.ValidationToken.html +++ b/mcaptcha/api/v1/pow/verify_pow/struct.ValidationToken.html @@ -4,15 +4,15 @@
pub struct ValidationToken {
+    

Struct mcaptcha::api::v1::pow::verify_pow::ValidationToken

source · []
pub struct ValidationToken {
     pub token: String,
 }
Expand description

validation token that clients receive as proof for submiting valid PoW

-

Fields

token: String

Trait Implementations

Returns a copy of the value. Read more

+

Fields

token: String

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/pow/verify_pow/struct.verify_pow.html b/mcaptcha/api/v1/pow/verify_pow/struct.verify_pow.html index b4d6ef1d..d21d41d4 100644 --- a/mcaptcha/api/v1/pow/verify_pow/struct.verify_pow.html +++ b/mcaptcha/api/v1/pow/verify_pow/struct.verify_pow.html @@ -4,9 +4,9 @@
pub struct verify_pow;
Expand description

route handler that verifies PoW and issues a solution token +

Struct mcaptcha::api::v1::pow::verify_pow::verify_pow

source · []
pub struct verify_pow;
Expand description

route handler that verifies PoW and issues a solution token if verification is successful

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/api/v1/pow/verify_token/index.html b/mcaptcha/api/v1/pow/verify_token/index.html index ab93ee43..705c9192 100644 --- a/mcaptcha/api/v1/pow/verify_token/index.html +++ b/mcaptcha/api/v1/pow/verify_token/index.html @@ -4,7 +4,7 @@
Expand description

PoW success token module

+

Module mcaptcha::api::v1::pow::verify_token

source · []
Expand description

PoW success token module

Structs

route hander that validates a PoW solution token

diff --git a/mcaptcha/api/v1/pow/verify_token/struct.CaptchaValidateResp.html b/mcaptcha/api/v1/pow/verify_token/struct.CaptchaValidateResp.html index bb3904b6..4f31fb38 100644 --- a/mcaptcha/api/v1/pow/verify_token/struct.CaptchaValidateResp.html +++ b/mcaptcha/api/v1/pow/verify_token/struct.CaptchaValidateResp.html @@ -4,13 +4,13 @@
pub struct CaptchaValidateResp {
+    

Struct mcaptcha::api::v1::pow::verify_token::CaptchaValidateResp

source · []
pub struct CaptchaValidateResp {
     pub valid: bool,
-}

Fields

valid: bool

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

valid: bool

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/api/v1/pow/verify_token/struct.validate_captcha_token.html b/mcaptcha/api/v1/pow/verify_token/struct.validate_captcha_token.html index 5f3fd14d..48b22eee 100644 --- a/mcaptcha/api/v1/pow/verify_token/struct.validate_captcha_token.html +++ b/mcaptcha/api/v1/pow/verify_token/struct.validate_captcha_token.html @@ -4,8 +4,8 @@
pub struct validate_captcha_token;
Expand description

route hander that validates a PoW solution token

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::api::v1::pow::verify_token::validate_captcha_token

source · []
pub struct validate_captcha_token;
Expand description

route hander that validates a PoW solution token

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/constant.GIT_COMMIT_HASH.html b/mcaptcha/constant.GIT_COMMIT_HASH.html index aa157c17..3912a44b 100644 --- a/mcaptcha/constant.GIT_COMMIT_HASH.html +++ b/mcaptcha/constant.GIT_COMMIT_HASH.html @@ -4,5 +4,5 @@
pub const GIT_COMMIT_HASH: &str = "8b7164635da29ba04799ac59cc1c00d35577d4db";
+

Constant mcaptcha::GIT_COMMIT_HASH

source · []
pub const GIT_COMMIT_HASH: &str = "3710c8f653b52e66f6d8a6a885a3e21514b346cd";
\ No newline at end of file diff --git a/mcaptcha/data/enum.SystemGroup.html b/mcaptcha/data/enum.SystemGroup.html index 858a32ee..05a9638e 100644 --- a/mcaptcha/data/enum.SystemGroup.html +++ b/mcaptcha/data/enum.SystemGroup.html @@ -4,13 +4,13 @@
pub enum SystemGroup {
+    

Enum mcaptcha::data::SystemGroup

source · []
pub enum SystemGroup {
     Embedded(System<HashCache, EmbeddedMaster>),
     Redis(System<RedisCache, RedisMaster>),
 }
Expand description

Represents mCaptcha cache and master system. When Redis is configured, SystemGroup::Redis is used and in its absense, SystemGroup::Embedded is used

-

Variants

Embedded(System<HashCache, EmbeddedMaster>)

Redis(System<RedisCache, RedisMaster>)

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Variants

Embedded(System<HashCache, EmbeddedMaster>)

Redis(System<RedisCache, RedisMaster>)

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/data/index.html b/mcaptcha/data/index.html index 08c7b31c..271999da 100644 --- a/mcaptcha/data/index.html +++ b/mcaptcha/data/index.html @@ -4,7 +4,7 @@
-

Module mcaptcha::data

source · []
Expand description

App data: redis cache, database connections, etc.

+

Module mcaptcha::data

source · []
Expand description

App data: redis cache, database connections, etc.

Macros

Structs

App data

diff --git a/mcaptcha/data/macro.enum_system_actor.html b/mcaptcha/data/macro.enum_system_actor.html index 85aa4078..d734dc60 100644 --- a/mcaptcha/data/macro.enum_system_actor.html +++ b/mcaptcha/data/macro.enum_system_actor.html @@ -4,7 +4,7 @@
macro_rules! enum_system_actor {
+    

Macro mcaptcha::data::enum_system_actor

source · []
macro_rules! enum_system_actor {
     ($name:ident, $type:ident) => { ... };
 }
diff --git a/mcaptcha/data/macro.enum_system_wrapper.html b/mcaptcha/data/macro.enum_system_wrapper.html index 03d36ff5..8c74cb03 100644 --- a/mcaptcha/data/macro.enum_system_wrapper.html +++ b/mcaptcha/data/macro.enum_system_wrapper.html @@ -4,7 +4,7 @@
macro_rules! enum_system_wrapper {
+    

Macro mcaptcha::data::enum_system_wrapper

source · []
macro_rules! enum_system_wrapper {
     ($name:ident, $type:ty, $return_type:ty) => { ... };
 }
diff --git a/mcaptcha/data/struct.Data.html b/mcaptcha/data/struct.Data.html index 4bd5b1e6..757e3bd2 100644 --- a/mcaptcha/data/struct.Data.html +++ b/mcaptcha/data/struct.Data.html @@ -3,19 +3,23 @@

Fields

db: Box<dyn MCDatabase>

database ops defined by db crates

creds: Config

credential management configuration

captcha: SystemGroup

mCaptcha system: Redis cache, etc.

mailer: Option<AsyncSmtpTransport<Tokio1Executor>>

email client

-

Implementations

create new instance of app data

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+
settings: Settings

app settings

+
stats: Box<dyn Stats>

stats recorder

+

Implementations

create new instance of app data

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/data/type.Mailer.html b/mcaptcha/data/type.Mailer.html index b393d5f7..6e1f233e 100644 --- a/mcaptcha/data/type.Mailer.html +++ b/mcaptcha/data/type.Mailer.html @@ -4,6 +4,6 @@
-

Type Definition mcaptcha::data::Mailer

source · []
Expand description

Mailer data type AsyncSmtpTransport

+

Type Definition mcaptcha::data::Mailer

source · []
Expand description

Mailer data type AsyncSmtpTransport

\ No newline at end of file diff --git a/mcaptcha/date/index.html b/mcaptcha/date/index.html index a15eb470..08f2e923 100644 --- a/mcaptcha/date/index.html +++ b/mcaptcha/date/index.html @@ -4,7 +4,7 @@

Structs

Constants

\ No newline at end of file diff --git a/mcaptcha/date/struct.Date.html b/mcaptcha/date/struct.Date.html index 0dbedbac..7acd4a85 100644 --- a/mcaptcha/date/struct.Date.html +++ b/mcaptcha/date/struct.Date.html @@ -3,12 +3,12 @@

+

Date

pub struct Date {
     pub time: OffsetDateTime,
-}

Fields

time: OffsetDateTime

Implementations

print relative time from date

+}

Fields

time: OffsetDateTime

Implementations

print relative time from date

print date

-

Trait Implementations

Returns a copy of the value. Read more

+

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

diff --git a/mcaptcha/demo/index.html b/mcaptcha/demo/index.html index 50dc1ab4..15259eae 100644 --- a/mcaptcha/demo/index.html +++ b/mcaptcha/demo/index.html @@ -4,7 +4,7 @@

Structs

Constants

Demo password

Demo username

diff --git a/mcaptcha/docs/constant.OPEN_API_SPEC.html b/mcaptcha/docs/constant.OPEN_API_SPEC.html index 81d39052..682446ea 100644 --- a/mcaptcha/docs/constant.OPEN_API_SPEC.html +++ b/mcaptcha/docs/constant.OPEN_API_SPEC.html @@ -4,5 +4,5 @@
const OPEN_API_SPEC: &str = "openapi: 3.0.0\ninfo:\n  version: 0.1.0\n  title: mCaptcha/guard\nservers:\n  - url: /\npaths:\n  /api/v1/signup:\n    post:\n      summary: Registration endpoint\n      operationId: registerUser\n      tags:\n        - user\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/RegisterUser\'\n            example:\n              username: testuser\n              password: mysuperlongandsecurepassword\n              email: testuser@example.com\n      responses:\n        \'200\':\n          description: Successful registration\n        \'400\':\n          description: \'Bad request: username contains profainity/blacklisted words or email not acceptable or password too long/short or duplicate username/password\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/signin:\n    post:\n      summary: Login endpoint\n      operationId: loginUser\n      tags:\n        - user\n        - authentication\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/LoginUser\'\n            example:\n              username: testuser\n              password: mysuperlongandsecurepassword\n      responses:\n        \'200\':\n          description: Successful authentication\n        \'401\':\n          description: \'authentication failed, wrong password\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'404\':\n          description: username not found\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/signout:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Signout endpoint\n      operationId: signoutUser\n      tags:\n        - user\n        - authentication\n      responses:\n        \'200\':\n          description: OK\n  /api/v1/account/delete:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Delete account\n      operationId: deleteAccount\n      tags:\n        - user\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/DeleteUser\'\n            example:\n              password: mysuperlongandsecurepassword\n      responses:\n        \'200\':\n          description: OK\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'404\':\n          description: username not found\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/account/username/exists:\n    post:\n      summary: Check if username exists\n      operationId: usernameExists\n      tags:\n        - user\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/UserDetailCheck\'\n            example:\n              val: testuser\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/UserDetailCheckRes\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/account/email/exists:\n    post:\n      summary: Check if email exists\n      operationId: emailExists\n      tags:\n        - user\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/UserDetailCheck\'\n            example:\n              val: testuser@example.com\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/UserDetailCheckRes\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/meta/health:\n    get:\n      summary: Health check\n      operationId: healthCheck\n      tags:\n        - meta\n        - health\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Health\'\n  /api/v1/meta/build:\n    get:\n      summary: Get server binary build details\n      operationId: buildDetails\n      tags:\n        - meta\n        - build\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/BuildDetails\'\n  /api/v1/mcaptcha/domain/token/add:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Add token for registered domain\n      operationId: addToken\n      tags:\n        - mcaptcha\n        - domain\n        - token\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/MCaptchaID\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/MCaptchaDetails\'\n        \'400\':\n          description: \'Bad request: Submited URI is not a URI or duplicate token name\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/update:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Update token key\n      operationId: updateTokenKey\n      tags:\n        - mcaptcha\n        - domain\n        - token\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/MCaptchaID\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/MCaptchaDetails\'\n        \'400\':\n          description: \'Bad request: Submited URI is not a URI or duplicate token name\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/get:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Get token key\n      operationId: getTokenKey\n      tags:\n        - mcaptcha\n        - domain\n        - token\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/MCaptchaID\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/MCaptchaDetails\'\n        \'400\':\n          description: \'Bad request: Submited URI is not a URI\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'404\':\n          description: token name not found\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/delete:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Delete token from mcaptcha\n      operationId: deleteToken\n      tags:\n        - mcaptcha\n        - domain\n        - token\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/MCaptchaID\'\n      responses:\n        \'200\':\n          description: OK\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/levels/add:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Add levels to a token\n      operationId: addTokenLevels\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/AddLevels\'\n      responses:\n        \'200\':\n          description: OK\n        \'400\':\n          description: duplicate visitor count or difficulty_factor is zero or difficulty_factor decreases with increase in visitor count\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/levels/update:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Update levels of a token\n      operationId: updateTokenLevels\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/AddLevels\'\n      responses:\n        \'200\':\n          description: OK\n        \'400\':\n          description: duplicate visitor count or difficulty_factor is zero or difficulty_factor decreases with increase in visitor count\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/levels/delete:\n    post:\n      security:\n        - cookieAuth: []\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n      summary: Delete levels of a token\n      operationId: deleteTokenLevels\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/AddLevels\'\n      responses:\n        \'200\':\n          description: OK\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/levels/get:\n    post:\n      security:\n        - cookieAuth: []\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n      summary: Get levels of a token\n      operationId: getTokenLevels\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/AddLevels\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Levels\'\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/token/get:\n    post:\n      security:\n        - cookieAuth: []\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n        - duration\n      summary: Get duration of a token\n      operationId: getTokenDuration\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/GetDuration\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Duration\'\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/token/update:\n    post:\n      security:\n        - cookieAuth: []\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n        - duration\n      summary: update duration of a token\n      operationId: updateTokenDuration\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/UpdateDuration\'\n      responses:\n        \'200\':\n          description: OK\n        \'400\':\n          description: \'Bad request: Duration must be greater than 0\'\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\ncomponents:\n  schemas:\n    RegisterUser:\n      type: object\n      required:\n        - username\n        - password\n        - email\n      properties:\n        username:\n          type: string\n        email:\n          type: string\n        password:\n          type: string\n          format: password\n    LoginUser:\n      type: object\n      required:\n        - username\n        - password\n      properties:\n        username:\n          type: string\n        password:\n          type: string\n          format: password\n    DeleteUser:\n      type: object\n      required:\n        - password\n      properties:\n        password:\n          type: string\n          format: password\n    Error:\n      type: object\n      required:\n        - error\n      properties:\n        error:\n          type: string\n    User:\n      type: object\n      required:\n        - id\n        - name\n      properties:\n        id:\n          type: integer\n          format: int64\n        name:\n          type: string\n    UserDetailCheck:\n      type: object\n      required:\n        - val\n      properties:\n        val:\n          type: string\n    Health:\n      type: object\n      required:\n        - db\n      properties:\n        db:\n          type: boolean\n    UserDetailCheckRes:\n      type: object\n      required:\n        - exists\n      properties:\n        val:\n          type: boolean\n    BuildDetails:\n      type: object\n      required:\n        - version\n        - git_commit_hash\n      properties:\n        version:\n          type: string\n        git_commit_hash:\n          type: string\n    AddDomain:\n      type: object\n      required:\n        - name\n      properties:\n        name:\n          type: string\n    DomainVerificationChallenge:\n      type: object\n      required:\n        - verification_challenge\n      properties:\n        verification_challenge:\n          type: string\n    MCaptchaID:\n      type: object\n      required:\n        - name\n        - domain\n      properties:\n        name:\n          type: string\n        domain:\n          type: string\n    MCaptchaDetails:\n      type: object\n      required:\n        - name\n        - key\n      properties:\n        name:\n          type: string\n        key:\n          type: string\n    Level:\n      type: object\n      required:\n        - visitor_threshold\n        - difficulty_factor\n      properties:\n        visitor_threshold:\n          type: number\n          minimum: 1\n          maximum: 2147483647\n        difficulty_factor:\n          type: number\n          minimum: 1\n    GetLevels:\n      type: object\n      required:\n        - token\n      properties:\n        token:\n          type: string\n    Levels:\n      type: array\n      items:\n        $ref: \'#/components/schemas/Level\'\n    AddLevels:\n      type: object\n      required:\n        - name\n        - levels\n      properties:\n        name:\n          type: string\n        levels:\n          type: array\n          items:\n            $ref: \'#/components/schemas/Level\'\n    GetDuration:\n      type: object\n      required:\n        - token\n      properties:\n        token:\n          type: string\n    Duration:\n      type: object\n      required:\n        - duration\n      properties:\n        duration:\n          type: number\n          minimum: 1\n          maximum: 2147483647\n    UpdateDuration:\n      type: object\n      required:\n        - duration\n        - token_name\n      properties:\n        token_name:\n          type: string\n        duration:\n          type: number\n          minimum: 1\n          maximum: 2147483647\n  securitySchemes:\n    cookieAuth:\n      type: apiKey\n      in: cookie\n      name: Authorization\n";
+

Constant mcaptcha::docs::OPEN_API_SPEC

source · []
const OPEN_API_SPEC: &str = "openapi: 3.0.0\ninfo:\n  version: 0.1.0\n  title: mCaptcha/guard\nservers:\n  - url: /\npaths:\n  /api/v1/signup:\n    post:\n      summary: Registration endpoint\n      operationId: registerUser\n      tags:\n        - user\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/RegisterUser\'\n            example:\n              username: testuser\n              password: mysuperlongandsecurepassword\n              email: testuser@example.com\n      responses:\n        \'200\':\n          description: Successful registration\n        \'400\':\n          description: \'Bad request: username contains profainity/blacklisted words or email not acceptable or password too long/short or duplicate username/password\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/signin:\n    post:\n      summary: Login endpoint\n      operationId: loginUser\n      tags:\n        - user\n        - authentication\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/LoginUser\'\n            example:\n              username: testuser\n              password: mysuperlongandsecurepassword\n      responses:\n        \'200\':\n          description: Successful authentication\n        \'401\':\n          description: \'authentication failed, wrong password\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'404\':\n          description: username not found\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/signout:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Signout endpoint\n      operationId: signoutUser\n      tags:\n        - user\n        - authentication\n      responses:\n        \'200\':\n          description: OK\n  /api/v1/account/delete:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Delete account\n      operationId: deleteAccount\n      tags:\n        - user\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/DeleteUser\'\n            example:\n              password: mysuperlongandsecurepassword\n      responses:\n        \'200\':\n          description: OK\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'404\':\n          description: username not found\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/account/username/exists:\n    post:\n      summary: Check if username exists\n      operationId: usernameExists\n      tags:\n        - user\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/UserDetailCheck\'\n            example:\n              val: testuser\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/UserDetailCheckRes\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/account/email/exists:\n    post:\n      summary: Check if email exists\n      operationId: emailExists\n      tags:\n        - user\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/UserDetailCheck\'\n            example:\n              val: testuser@example.com\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/UserDetailCheckRes\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/meta/health:\n    get:\n      summary: Health check\n      operationId: healthCheck\n      tags:\n        - meta\n        - health\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Health\'\n  /api/v1/meta/build:\n    get:\n      summary: Get server binary build details\n      operationId: buildDetails\n      tags:\n        - meta\n        - build\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/BuildDetails\'\n  /api/v1/mcaptcha/domain/token/add:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Add token for registered domain\n      operationId: addToken\n      tags:\n        - mcaptcha\n        - domain\n        - token\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/MCaptchaID\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/MCaptchaDetails\'\n        \'400\':\n          description: \'Bad request: Submited URI is not a URI or duplicate token name\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/update:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Update token key\n      operationId: updateTokenKey\n      tags:\n        - mcaptcha\n        - domain\n        - token\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/MCaptchaID\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/MCaptchaDetails\'\n        \'400\':\n          description: \'Bad request: Submited URI is not a URI or duplicate token name\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/get:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Get token key\n      operationId: getTokenKey\n      tags:\n        - mcaptcha\n        - domain\n        - token\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/MCaptchaID\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/MCaptchaDetails\'\n        \'400\':\n          description: \'Bad request: Submited URI is not a URI\'\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'404\':\n          description: token name not found\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/delete:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Delete token from mcaptcha\n      operationId: deleteToken\n      tags:\n        - mcaptcha\n        - domain\n        - token\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/MCaptchaID\'\n      responses:\n        \'200\':\n          description: OK\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/levels/add:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Add levels to a token\n      operationId: addTokenLevels\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/AddLevels\'\n      responses:\n        \'200\':\n          description: OK\n        \'400\':\n          description: duplicate visitor count or difficulty_factor is zero or difficulty_factor decreases with increase in visitor count\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/levels/update:\n    post:\n      security:\n        - cookieAuth: []\n      summary: Update levels of a token\n      operationId: updateTokenLevels\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/AddLevels\'\n      responses:\n        \'200\':\n          description: OK\n        \'400\':\n          description: duplicate visitor count or difficulty_factor is zero or difficulty_factor decreases with increase in visitor count\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'401\':\n          description: authentication failed\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/levels/delete:\n    post:\n      security:\n        - cookieAuth: []\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n      summary: Delete levels of a token\n      operationId: deleteTokenLevels\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/AddLevels\'\n      responses:\n        \'200\':\n          description: OK\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/levels/get:\n    post:\n      security:\n        - cookieAuth: []\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n      summary: Get levels of a token\n      operationId: getTokenLevels\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/AddLevels\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Levels\'\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/token/get:\n    post:\n      security:\n        - cookieAuth: []\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n        - duration\n      summary: Get duration of a token\n      operationId: getTokenDuration\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/GetDuration\'\n      responses:\n        \'200\':\n          description: OK\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Duration\'\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n  /api/v1/mcaptcha/domain/token/token/update:\n    post:\n      security:\n        - cookieAuth: []\n      tags:\n        - mcaptcha\n        - domain\n        - token\n        - levels\n        - duration\n      summary: update duration of a token\n      operationId: updateTokenDuration\n      requestBody:\n        required: true\n        content:\n          application/json:\n            schema:\n              $ref: \'#/components/schemas/UpdateDuration\'\n      responses:\n        \'200\':\n          description: OK\n        \'400\':\n          description: \'Bad request: Duration must be greater than 0\'\n        \'401\':\n          description: (cookie)authentication required or wrong password\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\n        \'500\':\n          description: Internal server error\n          content:\n            application/json:\n              schema:\n                $ref: \'#/components/schemas/Error\'\ncomponents:\n  schemas:\n    RegisterUser:\n      type: object\n      required:\n        - username\n        - password\n        - email\n      properties:\n        username:\n          type: string\n        email:\n          type: string\n        password:\n          type: string\n          format: password\n    LoginUser:\n      type: object\n      required:\n        - username\n        - password\n      properties:\n        username:\n          type: string\n        password:\n          type: string\n          format: password\n    DeleteUser:\n      type: object\n      required:\n        - password\n      properties:\n        password:\n          type: string\n          format: password\n    Error:\n      type: object\n      required:\n        - error\n      properties:\n        error:\n          type: string\n    User:\n      type: object\n      required:\n        - id\n        - name\n      properties:\n        id:\n          type: integer\n          format: int64\n        name:\n          type: string\n    UserDetailCheck:\n      type: object\n      required:\n        - val\n      properties:\n        val:\n          type: string\n    Health:\n      type: object\n      required:\n        - db\n      properties:\n        db:\n          type: boolean\n    UserDetailCheckRes:\n      type: object\n      required:\n        - exists\n      properties:\n        val:\n          type: boolean\n    BuildDetails:\n      type: object\n      required:\n        - version\n        - git_commit_hash\n      properties:\n        version:\n          type: string\n        git_commit_hash:\n          type: string\n    AddDomain:\n      type: object\n      required:\n        - name\n      properties:\n        name:\n          type: string\n    DomainVerificationChallenge:\n      type: object\n      required:\n        - verification_challenge\n      properties:\n        verification_challenge:\n          type: string\n    MCaptchaID:\n      type: object\n      required:\n        - name\n        - domain\n      properties:\n        name:\n          type: string\n        domain:\n          type: string\n    MCaptchaDetails:\n      type: object\n      required:\n        - name\n        - key\n      properties:\n        name:\n          type: string\n        key:\n          type: string\n    Level:\n      type: object\n      required:\n        - visitor_threshold\n        - difficulty_factor\n      properties:\n        visitor_threshold:\n          type: number\n          minimum: 1\n          maximum: 2147483647\n        difficulty_factor:\n          type: number\n          minimum: 1\n    GetLevels:\n      type: object\n      required:\n        - token\n      properties:\n        token:\n          type: string\n    Levels:\n      type: array\n      items:\n        $ref: \'#/components/schemas/Level\'\n    AddLevels:\n      type: object\n      required:\n        - name\n        - levels\n      properties:\n        name:\n          type: string\n        levels:\n          type: array\n          items:\n            $ref: \'#/components/schemas/Level\'\n    GetDuration:\n      type: object\n      required:\n        - token\n      properties:\n        token:\n          type: string\n    Duration:\n      type: object\n      required:\n        - duration\n      properties:\n        duration:\n          type: number\n          minimum: 1\n          maximum: 2147483647\n    UpdateDuration:\n      type: object\n      required:\n        - duration\n        - token_name\n      properties:\n        token_name:\n          type: string\n        duration:\n          type: number\n          minimum: 1\n          maximum: 2147483647\n  securitySchemes:\n    cookieAuth:\n      type: apiKey\n      in: cookie\n      name: Authorization\n";
\ No newline at end of file diff --git a/mcaptcha/docs/index.html b/mcaptcha/docs/index.html index 486da9d9..d0eb6b40 100644 --- a/mcaptcha/docs/index.html +++ b/mcaptcha/docs/index.html @@ -4,7 +4,7 @@

Modules

Structs

Constants

Functions

diff --git a/mcaptcha/docs/struct.dist.html b/mcaptcha/docs/struct.dist.html index 753e0e5e..2e20c67f 100644 --- a/mcaptcha/docs/struct.dist.html +++ b/mcaptcha/docs/struct.dist.html @@ -4,7 +4,7 @@
-

Struct mcaptcha::docs::dist

source · []
pub struct dist;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::docs::dist

source · []
pub struct dist;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/docs/struct.index.html b/mcaptcha/docs/struct.index.html index 9919555b..f6930474 100644 --- a/mcaptcha/docs/struct.index.html +++ b/mcaptcha/docs/struct.index.html @@ -4,7 +4,7 @@
pub struct index;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::docs::index

source · []
pub struct index;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/docs/struct.spec.html b/mcaptcha/docs/struct.spec.html index 4db5acd2..b7a615ba 100644 --- a/mcaptcha/docs/struct.spec.html +++ b/mcaptcha/docs/struct.spec.html @@ -4,7 +4,7 @@
-

Struct mcaptcha::docs::spec

source · []
pub struct spec;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::docs::spec

source · []
pub struct spec;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/email/verification/constant.PAGE.html b/mcaptcha/email/verification/constant.PAGE.html index 0180927d..56c6b805 100644 --- a/mcaptcha/email/verification/constant.PAGE.html +++ b/mcaptcha/email/verification/constant.PAGE.html @@ -4,5 +4,5 @@
const PAGE: &str = "Login";
+

Constant mcaptcha::email::verification::PAGE

source · []
const PAGE: &str = "Login";
\ No newline at end of file diff --git a/mcaptcha/email/verification/fn.verification.html b/mcaptcha/email/verification/fn.verification.html index db5b98ca..fc12492f 100644 --- a/mcaptcha/email/verification/fn.verification.html +++ b/mcaptcha/email/verification/fn.verification.html @@ -4,5 +4,5 @@
async fn verification(
    data: &Data,
    to: &str,
    verification_link: &str
) -> Result<(), ServiceError>
+

Function mcaptcha::email::verification::verification

source · []
async fn verification(
    data: &Data,
    to: &str,
    verification_link: &str
) -> Result<(), ServiceError>
\ No newline at end of file diff --git a/mcaptcha/email/verification/struct.IndexPage.html b/mcaptcha/email/verification/struct.IndexPage.html index ccb2139f..03506abf 100644 --- a/mcaptcha/email/verification/struct.IndexPage.html +++ b/mcaptcha/email/verification/struct.IndexPage.html @@ -4,13 +4,13 @@
struct IndexPage<'a> {
+    

Struct mcaptcha::email::verification::IndexPage

source · []
struct IndexPage<'a> {
     verification_link: &'a str,
-}

Fields

verification_link: &'a str

Implementations

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

verification_link: &'a str

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/errors/enum.PageError.html b/mcaptcha/errors/enum.PageError.html index 071b9cdd..7f46bc85 100644 --- a/mcaptcha/errors/enum.PageError.html +++ b/mcaptcha/errors/enum.PageError.html @@ -3,24 +3,24 @@

pub enum PageError {
+        

PageError

pub enum PageError {
     InternalServerError,
     ServiceError(ServiceError),
-}

Variants

InternalServerError

ServiceError(ServiceError)

Trait Implementations

Formats the value using the given formatter. Read more

-

Formats the value using the given formatter. Read more

-

The lower-level source of this error, if any. Read more

+}

Variants

InternalServerError

ServiceError(ServiceError)

Trait Implementations

Formats the value using the given formatter. Read more

+

Formats the value using the given formatter. Read more

+

The lower-level source of this error, if any. Read more

🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

👎 Deprecated since 1.42.0:

use the Display impl or to_string()

👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

This method tests for self and other values to be equal, and is used +

Converts to this type from the input type.

+

Converts to this type from the input type.

+

This method tests for self and other values to be equal, and is used by ==. Read more

-

This method tests for !=.

-

Creates full response for error. Read more

-

Returns appropriate status code for error. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

This method tests for !=.

+

Creates full response for error. Read more

+

Returns appropriate status code for error. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/errors/enum.ServiceError.html b/mcaptcha/errors/enum.ServiceError.html index 48340855..109f28de 100644 --- a/mcaptcha/errors/enum.ServiceError.html +++ b/mcaptcha/errors/enum.ServiceError.html @@ -3,9 +3,9 @@

pub enum ServiceError {
-
Show 18 variants InternalServerError, +

ServiceError

pub enum ServiceError {
+
Show 21 variants InternalServerError, ClosedForRegistration, NotAnEmail, NotAUrl, @@ -23,6 +23,9 @@ UnableToSendEmail(SmtpErrorWrapper), TokenNotFound, CaptchaError(CaptchaError), + DBError(DBErrorWrapper), + CaptchaNotFound, + TrafficPatternNotFound,
}

Variants

InternalServerError

ClosedForRegistration

NotAnEmail

NotAUrl

WrongPassword

UsernameNotFound

AccountNotFound

ProfainityError

when the value passed contains profainity

BlacklistError

when the value passed contains blacklisted words see blacklist

@@ -32,29 +35,30 @@ profile

PasswordTooShort

PasswordTooLong

PasswordsDontMatch

UsernameTaken

when the a username is already taken

EmailTaken

email is already taken

UnableToSendEmail(SmtpErrorWrapper)

Unable to send email

-

TokenNotFound

when the a token name is already taken -token not found

-

CaptchaError(CaptchaError)

Trait Implementations

Formats the value using the given formatter. Read more

-

Formats the value using the given formatter. Read more

-

The lower-level source of this error, if any. Read more

+

TokenNotFound

token not found

+

CaptchaError(CaptchaError)

DBError(DBErrorWrapper)

CaptchaNotFound

captcha not found

+

TrafficPatternNotFound

Traffic pattern not found

+

Trait Implementations

Formats the value using the given formatter. Read more

+

Formats the value using the given formatter. Read more

+

The lower-level source of this error, if any. Read more

🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

👎 Deprecated since 1.42.0:

use the Display impl or to_string()

👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

Converts to this type from the input type.

-

This method tests for self and other values to be equal, and is used +

Converts to this type from the input type.

+

Converts to this type from the input type.

+

Converts to this type from the input type.

+

Converts to this type from the input type.

+

Converts to this type from the input type.

+

Converts to this type from the input type.

+

Converts to this type from the input type.

+

Converts to this type from the input type.

+

Converts to this type from the input type.

+

This method tests for self and other values to be equal, and is used by ==. Read more

-

This method tests for !=.

-

Creates full response for error. Read more

-

Returns appropriate status code for error. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

This method tests for !=.

+

Creates full response for error. Read more

+

Returns appropriate status code for error. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/errors/index.html b/mcaptcha/errors/index.html index 70489b89..9dce0af6 100644 --- a/mcaptcha/errors/index.html +++ b/mcaptcha/errors/index.html @@ -4,8 +4,8 @@

Structs

+

Enums

Type Definitions

\ No newline at end of file diff --git a/mcaptcha/errors/sidebar-items.js b/mcaptcha/errors/sidebar-items.js index 8213d9cc..20e700f8 100644 --- a/mcaptcha/errors/sidebar-items.js +++ b/mcaptcha/errors/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"enum":[["PageError",""],["ServiceError",""]],"struct":[["ErrorToResponse",""],["SmtpErrorWrapper",""]],"type":[["PageResult",""],["ServiceResult",""]]}); \ No newline at end of file +initSidebarItems({"enum":[["PageError",""],["ServiceError",""]],"struct":[["DBErrorWrapper",""],["ErrorToResponse",""],["SmtpErrorWrapper",""]],"type":[["PageResult",""],["ServiceResult",""]]}); \ No newline at end of file diff --git a/mcaptcha/errors/struct.DBErrorWrapper.html b/mcaptcha/errors/struct.DBErrorWrapper.html new file mode 100644 index 00000000..4a6d3e56 --- /dev/null +++ b/mcaptcha/errors/struct.DBErrorWrapper.html @@ -0,0 +1,38 @@ +DBErrorWrapper in mcaptcha::errors - Rust + +
pub struct DBErrorWrapper(DBError);

Tuple Fields

0: DBError

Trait Implementations

Formats the value using the given formatter. Read more

+

Formats the value using the given formatter. Read more

+

The lower-level source of this error, if any. Read more

+
🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

+
👎 Deprecated since 1.42.0:

use the Display impl or to_string()

+
👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

Converts the given value to a String. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/mcaptcha/errors/struct.ErrorToResponse.html b/mcaptcha/errors/struct.ErrorToResponse.html index e69bbcfe..e569afca 100644 --- a/mcaptcha/errors/struct.ErrorToResponse.html +++ b/mcaptcha/errors/struct.ErrorToResponse.html @@ -4,10 +4,10 @@
pub struct ErrorToResponse {
+    

Struct mcaptcha::errors::ErrorToResponse

source · []
pub struct ErrorToResponse {
     pub error: String,
-}

Fields

error: String

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

-

Serialize this value into the given Serde serializer. Read more

+}

Fields

error: String

Trait Implementations

Deserialize this value from the given Serde deserializer. Read more

+

Serialize this value into the given Serde serializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/errors/struct.SmtpErrorWrapper.html b/mcaptcha/errors/struct.SmtpErrorWrapper.html index e45013eb..56e01cf6 100644 --- a/mcaptcha/errors/struct.SmtpErrorWrapper.html +++ b/mcaptcha/errors/struct.SmtpErrorWrapper.html @@ -4,13 +4,13 @@
pub struct SmtpErrorWrapper(SmtpError);

Tuple Fields

0: SmtpError

Trait Implementations

Formats the value using the given formatter. Read more

-

Formats the value using the given formatter. Read more

-

The lower-level source of this error, if any. Read more

+

Struct mcaptcha::errors::SmtpErrorWrapper

source · []
pub struct SmtpErrorWrapper(SmtpError);

Tuple Fields

0: SmtpError

Trait Implementations

Formats the value using the given formatter. Read more

+

Formats the value using the given formatter. Read more

+

The lower-level source of this error, if any. Read more

🔬 This is a nightly-only experimental API. (backtrace)

Returns a stack backtrace, if available, of where this error occurred. Read more

👎 Deprecated since 1.42.0:

use the Display impl or to_string()

👎 Deprecated since 1.33.0:

replaced by Error::source, which can support downcasting

-

This method tests for self and other values to be equal, and is used +

This method tests for self and other values to be equal, and is used by ==. Read more

This method tests for !=.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

diff --git a/mcaptcha/errors/type.PageResult.html b/mcaptcha/errors/type.PageResult.html index a0fbfb4e..e75d5f59 100644 --- a/mcaptcha/errors/type.PageResult.html +++ b/mcaptcha/errors/type.PageResult.html @@ -4,5 +4,5 @@
-

Type Definition mcaptcha::errors::PageResult

source · []
pub type PageResult<V> = Result<V, PageError>;
+

Type Definition mcaptcha::errors::PageResult

source · []
pub type PageResult<V> = Result<V, PageError>;
\ No newline at end of file diff --git a/mcaptcha/errors/type.ServiceResult.html b/mcaptcha/errors/type.ServiceResult.html index 209598d7..5ec216a4 100644 --- a/mcaptcha/errors/type.ServiceResult.html +++ b/mcaptcha/errors/type.ServiceResult.html @@ -4,5 +4,5 @@
-

Type Definition mcaptcha::errors::ServiceResult

source · []
pub type ServiceResult<V> = Result<V, ServiceError>;
+

Type Definition mcaptcha::errors::ServiceResult

source · []
pub type ServiceResult<V> = Result<V, ServiceError>;
\ No newline at end of file diff --git a/mcaptcha/fn.get_identity_service.html b/mcaptcha/fn.get_identity_service.html index 3d1d4e79..941dea73 100644 --- a/mcaptcha/fn.get_identity_service.html +++ b/mcaptcha/fn.get_identity_service.html @@ -4,5 +4,5 @@
pub fn get_identity_service() -> IdentityService<CookieIdentityPolicy>
+

Function mcaptcha::get_identity_service

source · []
pub fn get_identity_service(
    settings: &Settings
) -> IdentityService<CookieIdentityPolicy>
\ No newline at end of file diff --git a/mcaptcha/fn.get_json_err.html b/mcaptcha/fn.get_json_err.html index b45b6187..6092a2b1 100644 --- a/mcaptcha/fn.get_json_err.html +++ b/mcaptcha/fn.get_json_err.html @@ -4,5 +4,5 @@
pub fn get_json_err() -> JsonConfig
+

Function mcaptcha::get_json_err

source · []
pub fn get_json_err() -> JsonConfig
\ No newline at end of file diff --git a/mcaptcha/fn.main.html b/mcaptcha/fn.main.html index fdd384cf..8c2790a6 100644 --- a/mcaptcha/fn.main.html +++ b/mcaptcha/fn.main.html @@ -4,5 +4,5 @@
-

Function mcaptcha::main

source · []
pub(crate) fn main() -> Result<()>
+

Function mcaptcha::main

source · []
pub(crate) fn main() -> Result<()>
\ No newline at end of file diff --git a/mcaptcha/index.html b/mcaptcha/index.html index 29f89fdd..8f0d6682 100644 --- a/mcaptcha/index.html +++ b/mcaptcha/index.html @@ -4,7 +4,7 @@

Modules

api 🔒
data 🔒

App data: redis cache, database connections, etc.

date 🔒
demo 🔒
docs 🔒
email 🔒
errors 🔒
pages 🔒
routes 🔒
settings 🔒
stats 🔒
widget 🔒

User facing CAPTCHA widget

Structs

@@ -13,5 +13,5 @@

Constants

Functions

Type Definitions

-
+
\ No newline at end of file diff --git a/mcaptcha/pages/auth/login/constant.PAGE.html b/mcaptcha/pages/auth/login/constant.PAGE.html index 45fdc4f5..a950dd11 100644 --- a/mcaptcha/pages/auth/login/constant.PAGE.html +++ b/mcaptcha/pages/auth/login/constant.PAGE.html @@ -4,5 +4,5 @@
const PAGE: &str = "Login";
+

Constant mcaptcha::pages::auth::login::PAGE

source · []
const PAGE: &str = "Login";
\ No newline at end of file diff --git a/mcaptcha/pages/auth/login/index.html b/mcaptcha/pages/auth/login/index.html index aa646262..62651f1a 100644 --- a/mcaptcha/pages/auth/login/index.html +++ b/mcaptcha/pages/auth/login/index.html @@ -4,7 +4,7 @@

Structs

INDEX 🔒
IndexPage 🔒

Constants

PAGE 🔒
\ No newline at end of file diff --git a/mcaptcha/pages/auth/login/struct.INDEX.html b/mcaptcha/pages/auth/login/struct.INDEX.html index 25087e4f..3e80ce88 100644 --- a/mcaptcha/pages/auth/login/struct.INDEX.html +++ b/mcaptcha/pages/auth/login/struct.INDEX.html @@ -4,7 +4,7 @@
struct INDEX {
+    

Struct mcaptcha::pages::auth::login::INDEX

source · []
struct INDEX {
     __private_field: (),
 }

Fields

__private_field: ()

Methods from Deref<Target = String>

Extracts a string slice containing the entire String.

Examples
@@ -1205,9 +1205,9 @@ but non-ASCII letters are unchanged.

let s = "Grüße, Jürgen ❤";
 
 assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

The resulting type after dereferencing.

-

Dereferences the value.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Trait Implementations

The resulting type after dereferencing.

+

Dereferences the value.

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/auth/login/struct.IndexPage.html b/mcaptcha/pages/auth/login/struct.IndexPage.html index 1b3fc1fe..223196ac 100644 --- a/mcaptcha/pages/auth/login/struct.IndexPage.html +++ b/mcaptcha/pages/auth/login/struct.IndexPage.html @@ -4,12 +4,12 @@
struct IndexPage;

Trait Implementations

Returns a copy of the value. Read more

+

Struct mcaptcha::pages::auth::login::IndexPage

source · []
struct IndexPage;

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Returns the “default value” for a type. Read more

-

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Returns the “default value” for a type. Read more

+

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/auth/login/struct.login.html b/mcaptcha/pages/auth/login/struct.login.html index feadd766..5c40a397 100644 --- a/mcaptcha/pages/auth/login/struct.login.html +++ b/mcaptcha/pages/auth/login/struct.login.html @@ -4,7 +4,7 @@
pub struct login;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::auth::login::login

source · []
pub struct login;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/constant.NAME.html b/mcaptcha/pages/constant.NAME.html index 28e57ccf..bea38eab 100644 --- a/mcaptcha/pages/constant.NAME.html +++ b/mcaptcha/pages/constant.NAME.html @@ -4,5 +4,5 @@
-

Constant mcaptcha::pages::NAME

source · []
pub const NAME: &str = "mCaptcha";
+

Constant mcaptcha::pages::NAME

source · []
pub const NAME: &str = "mCaptcha";
\ No newline at end of file diff --git a/mcaptcha/pages/errors/constant.ERROR_ROUTE.html b/mcaptcha/pages/errors/constant.ERROR_ROUTE.html index 0973c610..463fb93e 100644 --- a/mcaptcha/pages/errors/constant.ERROR_ROUTE.html +++ b/mcaptcha/pages/errors/constant.ERROR_ROUTE.html @@ -4,5 +4,5 @@
const ERROR_ROUTE: &str = "/error/{id}";
+

Constant mcaptcha::pages::errors::ERROR_ROUTE

source · []
const ERROR_ROUTE: &str = "/error/{id}";
\ No newline at end of file diff --git a/mcaptcha/pages/errors/constant.PAGE.html b/mcaptcha/pages/errors/constant.PAGE.html index 8576fb7f..15504c60 100644 --- a/mcaptcha/pages/errors/constant.PAGE.html +++ b/mcaptcha/pages/errors/constant.PAGE.html @@ -4,5 +4,5 @@
const PAGE: &str = "Error";
+

Constant mcaptcha::pages::errors::PAGE

source · []
const PAGE: &str = "Error";
\ No newline at end of file diff --git a/mcaptcha/pages/errors/fn.services.html b/mcaptcha/pages/errors/fn.services.html index ef25b0fa..5be1771e 100644 --- a/mcaptcha/pages/errors/fn.services.html +++ b/mcaptcha/pages/errors/fn.services.html @@ -4,5 +4,5 @@
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::pages::errors::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/pages/errors/index.html b/mcaptcha/pages/errors/index.html index 55e8c814..5a08cdd0 100644 --- a/mcaptcha/pages/errors/index.html +++ b/mcaptcha/pages/errors/index.html @@ -4,7 +4,7 @@

Modules

Structs

Constants

PAGE 🔒

Functions

diff --git a/mcaptcha/pages/errors/routes/index.html b/mcaptcha/pages/errors/routes/index.html index d17b838e..5a682de6 100644 --- a/mcaptcha/pages/errors/routes/index.html +++ b/mcaptcha/pages/errors/routes/index.html @@ -4,6 +4,6 @@

Structs

\ No newline at end of file diff --git a/mcaptcha/pages/errors/routes/struct.Errors.html b/mcaptcha/pages/errors/routes/struct.Errors.html index 5f89a48b..9bc595d7 100644 --- a/mcaptcha/pages/errors/routes/struct.Errors.html +++ b/mcaptcha/pages/errors/routes/struct.Errors.html @@ -4,10 +4,10 @@
pub struct Errors {
+    

Struct mcaptcha::pages::errors::routes::Errors

source · []
pub struct Errors {
     pub internal_server_error: &'static str,
     pub unknown_error: &'static str,
-}

Fields

internal_server_error: &'static strunknown_error: &'static str

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+}

Fields

internal_server_error: &'static strunknown_error: &'static str

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/errors/struct.ErrorPage.html b/mcaptcha/pages/errors/struct.ErrorPage.html index f6b0564d..203f32d6 100644 --- a/mcaptcha/pages/errors/struct.ErrorPage.html +++ b/mcaptcha/pages/errors/struct.ErrorPage.html @@ -4,14 +4,14 @@
struct ErrorPage<'a> {
+    

Struct mcaptcha::pages::errors::ErrorPage

source · []
struct ErrorPage<'a> {
     title: &'a str,
     message: &'a str,
-}

Fields

title: &'a strmessage: &'a str

Implementations

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

title: &'a strmessage: &'a str

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/errors/struct.INTERNAL_SERVER_ERROR_BODY.html b/mcaptcha/pages/errors/struct.INTERNAL_SERVER_ERROR_BODY.html index 630d9eee..58c3af6d 100644 --- a/mcaptcha/pages/errors/struct.INTERNAL_SERVER_ERROR_BODY.html +++ b/mcaptcha/pages/errors/struct.INTERNAL_SERVER_ERROR_BODY.html @@ -4,7 +4,7 @@
struct INTERNAL_SERVER_ERROR_BODY {
+    

Struct mcaptcha::pages::errors::INTERNAL_SERVER_ERROR_BODY

source · []
struct INTERNAL_SERVER_ERROR_BODY {
     __private_field: (),
 }

Fields

__private_field: ()

Methods from Deref<Target = String>

Extracts a string slice containing the entire String.

Examples
@@ -1205,9 +1205,9 @@ but non-ASCII letters are unchanged.

let s = "Grüße, Jürgen ❤";
 
 assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

The resulting type after dereferencing.

-

Dereferences the value.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Trait Implementations

The resulting type after dereferencing.

+

Dereferences the value.

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/errors/struct.UNKNOWN_ERROR_BODY.html b/mcaptcha/pages/errors/struct.UNKNOWN_ERROR_BODY.html index aac990ff..5603d4a8 100644 --- a/mcaptcha/pages/errors/struct.UNKNOWN_ERROR_BODY.html +++ b/mcaptcha/pages/errors/struct.UNKNOWN_ERROR_BODY.html @@ -4,7 +4,7 @@
struct UNKNOWN_ERROR_BODY {
+    

Struct mcaptcha::pages::errors::UNKNOWN_ERROR_BODY

source · []
struct UNKNOWN_ERROR_BODY {
     __private_field: (),
 }

Fields

__private_field: ()

Methods from Deref<Target = String>

Extracts a string slice containing the entire String.

Examples
@@ -1205,9 +1205,9 @@ but non-ASCII letters are unchanged.

let s = "Grüße, Jürgen ❤";
 
 assert_eq!("grüße, jürgen ❤", s.to_ascii_lowercase());
-

Trait Implementations

The resulting type after dereferencing.

-

Dereferences the value.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Trait Implementations

The resulting type after dereferencing.

+

Dereferences the value.

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/errors/struct.error.html b/mcaptcha/pages/errors/struct.error.html index 43c5eb5f..cb3fc5a5 100644 --- a/mcaptcha/pages/errors/struct.error.html +++ b/mcaptcha/pages/errors/struct.error.html @@ -4,7 +4,7 @@
pub struct error;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::errors::error

source · []
pub struct error;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/fn.get_middleware.html b/mcaptcha/pages/fn.get_middleware.html index cd436746..d40a0fbc 100644 --- a/mcaptcha/pages/fn.get_middleware.html +++ b/mcaptcha/pages/fn.get_middleware.html @@ -4,5 +4,5 @@
pub fn get_middleware() -> Authentication<Routes>
+

Function mcaptcha::pages::get_middleware

source · []
pub fn get_middleware() -> Authentication<Routes>
\ No newline at end of file diff --git a/mcaptcha/pages/fn.services.html b/mcaptcha/pages/fn.services.html index 8b137a2b..a56ff717 100644 --- a/mcaptcha/pages/fn.services.html +++ b/mcaptcha/pages/fn.services.html @@ -4,5 +4,5 @@
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::pages::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/pages/index.html b/mcaptcha/pages/index.html index 8ede4df6..b7d3a471 100644 --- a/mcaptcha/pages/index.html +++ b/mcaptcha/pages/index.html @@ -4,7 +4,7 @@

Modules

auth 🔒
panel 🔒
sitemap 🔒

Constants

Functions

diff --git a/mcaptcha/pages/panel/constant.PAGE.html b/mcaptcha/pages/panel/constant.PAGE.html index 9ccad14f..0420a85e 100644 --- a/mcaptcha/pages/panel/constant.PAGE.html +++ b/mcaptcha/pages/panel/constant.PAGE.html @@ -4,5 +4,5 @@
-

Constant mcaptcha::pages::panel::PAGE

source · []
const PAGE: &str = "Dashboard";
+

Constant mcaptcha::pages::panel::PAGE

source · []
const PAGE: &str = "Dashboard";
\ No newline at end of file diff --git a/mcaptcha/pages/panel/fn.services.html b/mcaptcha/pages/panel/fn.services.html index aa4c20c3..8b35a50e 100644 --- a/mcaptcha/pages/panel/fn.services.html +++ b/mcaptcha/pages/panel/fn.services.html @@ -4,5 +4,5 @@
pub fn services(cfg: &mut ServiceConfig)
+

Function mcaptcha::pages::panel::services

source · []
pub fn services(cfg: &mut ServiceConfig)
\ No newline at end of file diff --git a/mcaptcha/pages/panel/index.html b/mcaptcha/pages/panel/index.html index 1aaf117a..fd05ac1f 100644 --- a/mcaptcha/pages/panel/index.html +++ b/mcaptcha/pages/panel/index.html @@ -4,7 +4,7 @@

Modules

Structs

Constants

PAGE 🔒

Functions

diff --git a/mcaptcha/pages/panel/notifications/constant.PAGE.html b/mcaptcha/pages/panel/notifications/constant.PAGE.html index 9a080f4b..c1ea38a1 100644 --- a/mcaptcha/pages/panel/notifications/constant.PAGE.html +++ b/mcaptcha/pages/panel/notifications/constant.PAGE.html @@ -4,5 +4,5 @@
const PAGE: &str = "Notifications";
+

Constant mcaptcha::pages::panel::notifications::PAGE

source · []
const PAGE: &str = "Notifications";
\ No newline at end of file diff --git a/mcaptcha/pages/panel/notifications/struct.IndexPage.html b/mcaptcha/pages/panel/notifications/struct.IndexPage.html index 1a78f09b..b3055f81 100644 --- a/mcaptcha/pages/panel/notifications/struct.IndexPage.html +++ b/mcaptcha/pages/panel/notifications/struct.IndexPage.html @@ -4,12 +4,12 @@
pub struct IndexPage {
+    

Struct mcaptcha::pages::panel::notifications::IndexPage

source · []
pub struct IndexPage {
     n: Vec<Notification>,
 }

Fields

n: Vec<Notification>

notifications

-

Implementations

Trait Implementations

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Implementations

Trait Implementations

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/notifications/struct.Notification.html b/mcaptcha/pages/panel/notifications/struct.Notification.html index cb2f7b97..c122dcbb 100644 --- a/mcaptcha/pages/panel/notifications/struct.Notification.html +++ b/mcaptcha/pages/panel/notifications/struct.Notification.html @@ -4,13 +4,13 @@
pub struct Notification {
+    

Struct mcaptcha::pages::panel::notifications::Notification

source · []
pub struct Notification {
     pub name: String,
     pub heading: String,
     pub message: String,
     pub received: OffsetDateTime,
     pub id: i32,
-}

Fields

name: Stringheading: Stringmessage: Stringreceived: OffsetDateTimeid: i32

Implementations

Trait Implementations

Converts to this type from the input type.

+}

Fields

name: Stringheading: Stringmessage: Stringreceived: OffsetDateTimeid: i32

Implementations

Trait Implementations

Converts to this type from the input type.

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/pages/panel/notifications/struct.notifications.html b/mcaptcha/pages/panel/notifications/struct.notifications.html index ed00f6e3..11cb2dbe 100644 --- a/mcaptcha/pages/panel/notifications/struct.notifications.html +++ b/mcaptcha/pages/panel/notifications/struct.notifications.html @@ -4,7 +4,7 @@
pub struct notifications;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::panel::notifications::notifications

source · []
pub struct notifications;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/routes/index.html b/mcaptcha/pages/panel/routes/index.html index 9e96aa77..055692d4 100644 --- a/mcaptcha/pages/panel/routes/index.html +++ b/mcaptcha/pages/panel/routes/index.html @@ -4,6 +4,6 @@

Structs

\ No newline at end of file diff --git a/mcaptcha/pages/panel/routes/struct.Panel.html b/mcaptcha/pages/panel/routes/struct.Panel.html index d8537b38..69d4c13f 100644 --- a/mcaptcha/pages/panel/routes/struct.Panel.html +++ b/mcaptcha/pages/panel/routes/struct.Panel.html @@ -4,12 +4,12 @@
pub struct Panel {
+    

Struct mcaptcha::pages::panel::routes::Panel

source · []
pub struct Panel {
     pub home: &'static str,
     pub sitekey: Sitekey,
     pub notifications: &'static str,
     pub settings: Settings,
-}

Fields

home: &'static strsitekey: Sitekeynotifications: &'static strsettings: Settings

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+}

Fields

home: &'static strsitekey: Sitekeynotifications: &'static strsettings: Settings

Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/settings/index.html b/mcaptcha/pages/panel/settings/index.html index f0cd1395..c5954324 100644 --- a/mcaptcha/pages/panel/settings/index.html +++ b/mcaptcha/pages/panel/settings/index.html @@ -4,7 +4,7 @@

Modules

Structs

Constants

PAGE 🔒

Functions

diff --git a/mcaptcha/pages/panel/settings/struct.delete_account.html b/mcaptcha/pages/panel/settings/struct.delete_account.html index 6a2a32f6..583b37f2 100644 --- a/mcaptcha/pages/panel/settings/struct.delete_account.html +++ b/mcaptcha/pages/panel/settings/struct.delete_account.html @@ -4,7 +4,7 @@
pub struct delete_account;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::panel::settings::delete_account

source · []
pub struct delete_account;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/settings/struct.update_secret.html b/mcaptcha/pages/panel/settings/struct.update_secret.html index 61a3484d..2bdb189e 100644 --- a/mcaptcha/pages/panel/settings/struct.update_secret.html +++ b/mcaptcha/pages/panel/settings/struct.update_secret.html @@ -4,7 +4,7 @@
pub struct update_secret;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::panel::settings::update_secret

source · []
pub struct update_secret;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/sitekey/edit/constant.PAGE.html b/mcaptcha/pages/panel/sitekey/edit/constant.PAGE.html index 00fb5d59..bef9baf2 100644 --- a/mcaptcha/pages/panel/sitekey/edit/constant.PAGE.html +++ b/mcaptcha/pages/panel/sitekey/edit/constant.PAGE.html @@ -4,5 +4,5 @@
const PAGE: &str = "Edit Sitekey";
+

Constant mcaptcha::pages::panel::sitekey::edit::PAGE

source · []
const PAGE: &str = "Edit Sitekey";
\ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/edit/index.html b/mcaptcha/pages/panel/sitekey/edit/index.html index a135b23a..7e1d2d5f 100644 --- a/mcaptcha/pages/panel/sitekey/edit/index.html +++ b/mcaptcha/pages/panel/sitekey/edit/index.html @@ -4,8 +4,8 @@

Structs

-
Level 🔒

route handler that renders individual views for sitekeys

+

Module mcaptcha::pages::panel::sitekey::edit

source · []

Structs

+

route handler that renders individual views for sitekeys

route handler that renders individual views for sitekeys

Constants

PAGE 🔒
diff --git a/mcaptcha/pages/panel/sitekey/edit/sidebar-items.js b/mcaptcha/pages/panel/sitekey/edit/sidebar-items.js index 85a6c3be..ff283f2c 100644 --- a/mcaptcha/pages/panel/sitekey/edit/sidebar-items.js +++ b/mcaptcha/pages/panel/sitekey/edit/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"constant":[["PAGE",""]],"struct":[["AdvanceEditPage",""],["EasyEditPage",""],["Level",""],["McaptchaConfig",""],["advance","route handler that renders individual views for sitekeys"],["easy","route handler that renders individual views for sitekeys"]]}); \ No newline at end of file +initSidebarItems({"constant":[["PAGE",""]],"struct":[["AdvanceEditPage",""],["EasyEditPage",""],["advance","route handler that renders individual views for sitekeys"],["easy","route handler that renders individual views for sitekeys"]]}); \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/edit/struct.AdvanceEditPage.html b/mcaptcha/pages/panel/sitekey/edit/struct.AdvanceEditPage.html index 0fc1d44e..dac674b9 100644 --- a/mcaptcha/pages/panel/sitekey/edit/struct.AdvanceEditPage.html +++ b/mcaptcha/pages/panel/sitekey/edit/struct.AdvanceEditPage.html @@ -4,16 +4,16 @@
struct AdvanceEditPage {
+    

Struct mcaptcha::pages::panel::sitekey::edit::AdvanceEditPage

source · []
struct AdvanceEditPage {
     duration: u32,
     name: String,
     key: String,
-    levels: Vec<Level>,
-}

Fields

duration: u32name: Stringkey: Stringlevels: Vec<Level>

Implementations

Trait Implementations

Returns a copy of the value. Read more

+ levels: Vec<Level>, +}

Fields

duration: u32name: Stringkey: Stringlevels: Vec<Level>

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/sitekey/edit/struct.EasyEditPage.html b/mcaptcha/pages/panel/sitekey/edit/struct.EasyEditPage.html index ada65c19..c1679469 100644 --- a/mcaptcha/pages/panel/sitekey/edit/struct.EasyEditPage.html +++ b/mcaptcha/pages/panel/sitekey/edit/struct.EasyEditPage.html @@ -4,15 +4,15 @@
pub struct EasyEditPage<'a> {
+    

Struct mcaptcha::pages::panel::sitekey::edit::EasyEditPage

source · []
pub struct EasyEditPage<'a> {
     pub form_title: &'a str,
-    pub pattern: TrafficPattern,
+    pub pattern: TrafficPatternRequest,
     pub key: String,
-}

Fields

form_title: &'a strpattern: TrafficPatternkey: String

Implementations

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

form_title: &'a strpattern: TrafficPatternRequestkey: String

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/sitekey/edit/struct.advance.html b/mcaptcha/pages/panel/sitekey/edit/struct.advance.html index 608cf31e..c89f443b 100644 --- a/mcaptcha/pages/panel/sitekey/edit/struct.advance.html +++ b/mcaptcha/pages/panel/sitekey/edit/struct.advance.html @@ -4,8 +4,8 @@
pub struct advance;
Expand description

route handler that renders individual views for sitekeys

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::panel::sitekey::edit::advance

source · []
pub struct advance;
Expand description

route handler that renders individual views for sitekeys

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/sitekey/edit/struct.easy.html b/mcaptcha/pages/panel/sitekey/edit/struct.easy.html index a060b6f1..43eda0ef 100644 --- a/mcaptcha/pages/panel/sitekey/edit/struct.easy.html +++ b/mcaptcha/pages/panel/sitekey/edit/struct.easy.html @@ -4,8 +4,8 @@
pub struct easy;
Expand description

route handler that renders individual views for sitekeys

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::panel::sitekey::edit::easy

source · []
pub struct easy;
Expand description

route handler that renders individual views for sitekeys

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/sitekey/list/constant.PAGE.html b/mcaptcha/pages/panel/sitekey/list/constant.PAGE.html index 417d566c..621f467d 100644 --- a/mcaptcha/pages/panel/sitekey/list/constant.PAGE.html +++ b/mcaptcha/pages/panel/sitekey/list/constant.PAGE.html @@ -4,5 +4,5 @@
const PAGE: &str = "SiteKeys";
+

Constant mcaptcha::pages::panel::sitekey::list::PAGE

source · []
const PAGE: &str = "SiteKeys";
\ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/fn.get_list_sitekeys.html b/mcaptcha/pages/panel/sitekey/list/fn.get_list_sitekeys.html deleted file mode 100644 index fae6a387..00000000 --- a/mcaptcha/pages/panel/sitekey/list/fn.get_list_sitekeys.html +++ /dev/null @@ -1,9 +0,0 @@ -get_list_sitekeys in mcaptcha::pages::panel::sitekey::list - Rust - -
pub async fn get_list_sitekeys(
    data: &AppData,
    id: &Identity
) -> Result<Vec<MCaptchaDetails>, PageError>
Expand description

utility function to get a list of all sitekeys that a user owns

-
- \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/index.html b/mcaptcha/pages/panel/sitekey/list/index.html index 127d8fbc..304b11eb 100644 --- a/mcaptcha/pages/panel/sitekey/list/index.html +++ b/mcaptcha/pages/panel/sitekey/list/index.html @@ -3,12 +3,9 @@

Structs

+

Module list

Structs

render a list of all sitekeys that a user has

Constants

-
PAGE 🔒

Functions

-

utility function to get a list of all sitekeys that a user owns

-

Type Definitions

-
+
PAGE 🔒
\ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/sidebar-items.js b/mcaptcha/pages/panel/sitekey/list/sidebar-items.js index 21f28889..f31f6674 100644 --- a/mcaptcha/pages/panel/sitekey/list/sidebar-items.js +++ b/mcaptcha/pages/panel/sitekey/list/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"constant":[["PAGE",""]],"fn":[["get_list_sitekeys","utility function to get a list of all sitekeys that a user owns"]],"struct":[["IndexPage",""],["list_sitekeys","render a list of all sitekeys that a user has"]],"type":[["SiteKeys",""]]}); \ No newline at end of file +initSidebarItems({"constant":[["PAGE",""]],"struct":[["IndexPage",""],["list_sitekeys","render a list of all sitekeys that a user has"]]}); \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/list/struct.IndexPage.html b/mcaptcha/pages/panel/sitekey/list/struct.IndexPage.html index b9e64815..b08cb493 100644 --- a/mcaptcha/pages/panel/sitekey/list/struct.IndexPage.html +++ b/mcaptcha/pages/panel/sitekey/list/struct.IndexPage.html @@ -4,13 +4,13 @@
pub struct IndexPage {
-    sitekeys: Vec<MCaptchaDetails>,
-}

Fields

sitekeys: Vec<MCaptchaDetails>

Implementations

Trait Implementations

Returns a copy of the value. Read more

+

Struct mcaptcha::pages::panel::sitekey::list::IndexPage

source · []
pub struct IndexPage {
+    sitekeys: Vec<Captcha>,
+}

Fields

sitekeys: Vec<Captcha>

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/sitekey/list/struct.list_sitekeys.html b/mcaptcha/pages/panel/sitekey/list/struct.list_sitekeys.html index 410c9b56..f9479cde 100644 --- a/mcaptcha/pages/panel/sitekey/list/struct.list_sitekeys.html +++ b/mcaptcha/pages/panel/sitekey/list/struct.list_sitekeys.html @@ -4,8 +4,8 @@
pub struct list_sitekeys;
Expand description

render a list of all sitekeys that a user has

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::panel::sitekey::list::list_sitekeys

source · []
pub struct list_sitekeys;
Expand description

render a list of all sitekeys that a user has

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/sitekey/list/type.SiteKeys.html b/mcaptcha/pages/panel/sitekey/list/type.SiteKeys.html deleted file mode 100644 index 2f7eb69c..00000000 --- a/mcaptcha/pages/panel/sitekey/list/type.SiteKeys.html +++ /dev/null @@ -1,8 +0,0 @@ -SiteKeys in mcaptcha::pages::panel::sitekey::list - Rust - -
-

Type Definition mcaptcha::pages::panel::sitekey::list::SiteKeys

source · []
pub type SiteKeys = Vec<MCaptchaDetails>;
- \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/constant.PAGE.html b/mcaptcha/pages/panel/sitekey/view/constant.PAGE.html index 6fdf9975..c13614cd 100644 --- a/mcaptcha/pages/panel/sitekey/view/constant.PAGE.html +++ b/mcaptcha/pages/panel/sitekey/view/constant.PAGE.html @@ -4,5 +4,5 @@
const PAGE: &str = "SiteKeys";
+

Constant mcaptcha::pages::panel::sitekey::view::PAGE

source · []
const PAGE: &str = "SiteKeys";
\ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/index.html b/mcaptcha/pages/panel/sitekey/view/index.html index 252128a4..67282c6a 100644 --- a/mcaptcha/pages/panel/sitekey/view/index.html +++ b/mcaptcha/pages/panel/sitekey/view/index.html @@ -4,8 +4,8 @@

Structs

-
IndexPage 🔒
Level 🔒

route handler that renders individual views for sitekeys

+

Module mcaptcha::pages::panel::sitekey::view

source · []

Structs

+
IndexPage 🔒

route handler that renders individual views for sitekeys

Constants

PAGE 🔒
\ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/sidebar-items.js b/mcaptcha/pages/panel/sitekey/view/sidebar-items.js index 9c75b800..14a5ee36 100644 --- a/mcaptcha/pages/panel/sitekey/view/sidebar-items.js +++ b/mcaptcha/pages/panel/sitekey/view/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"constant":[["PAGE",""]],"struct":[["IndexPage",""],["Level",""],["McaptchaConfig",""],["view_sitekey","route handler that renders individual views for sitekeys"]]}); \ No newline at end of file +initSidebarItems({"constant":[["PAGE",""]],"struct":[["IndexPage",""],["view_sitekey","route handler that renders individual views for sitekeys"]]}); \ No newline at end of file diff --git a/mcaptcha/pages/panel/sitekey/view/struct.IndexPage.html b/mcaptcha/pages/panel/sitekey/view/struct.IndexPage.html index 566d9fec..83b898c1 100644 --- a/mcaptcha/pages/panel/sitekey/view/struct.IndexPage.html +++ b/mcaptcha/pages/panel/sitekey/view/struct.IndexPage.html @@ -4,17 +4,17 @@
struct IndexPage {
+    

Struct mcaptcha::pages::panel::sitekey::view::IndexPage

source · []
struct IndexPage {
     duration: u32,
     name: String,
     key: String,
-    levels: Vec<Level>,
-    stats: Stats,
-}

Fields

duration: u32name: Stringkey: Stringlevels: Vec<Level>stats: Stats

Implementations

Trait Implementations

Returns a copy of the value. Read more

+ levels: Vec<Level>, + stats: CaptchaStats, +}

Fields

duration: u32name: Stringkey: Stringlevels: Vec<Level>stats: CaptchaStats

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/sitekey/view/struct.view_sitekey.html b/mcaptcha/pages/panel/sitekey/view/struct.view_sitekey.html index 42c1b3f0..aaca1398 100644 --- a/mcaptcha/pages/panel/sitekey/view/struct.view_sitekey.html +++ b/mcaptcha/pages/panel/sitekey/view/struct.view_sitekey.html @@ -4,8 +4,8 @@
pub struct view_sitekey;
Expand description

route handler that renders individual views for sitekeys

-

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::panel::sitekey::view::view_sitekey

source · []
pub struct view_sitekey;
Expand description

route handler that renders individual views for sitekeys

+

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/struct.IndexPage.html b/mcaptcha/pages/panel/struct.IndexPage.html index ad8693c3..755f4d25 100644 --- a/mcaptcha/pages/panel/struct.IndexPage.html +++ b/mcaptcha/pages/panel/struct.IndexPage.html @@ -4,13 +4,13 @@
pub struct IndexPage {
-    sitekeys: Vec<MCaptchaDetails>,
-}

Fields

sitekeys: Vec<MCaptchaDetails>

Implementations

Trait Implementations

Returns a copy of the value. Read more

+

Struct mcaptcha::pages::panel::IndexPage

source · []
pub struct IndexPage {
+    sitekeys: Vec<Captcha>,
+}

Fields

sitekeys: Vec<Captcha>

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Render the template and return the rendering result as RenderResult Read more

-

Render the template and append the result to buf. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Render the template and return the rendering result as RenderResult Read more

+

Render the template and append the result to buf. Read more

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/pages/panel/struct.panel.html b/mcaptcha/pages/panel/struct.panel.html index 1a8bbd4d..a3996723 100644 --- a/mcaptcha/pages/panel/struct.panel.html +++ b/mcaptcha/pages/panel/struct.panel.html @@ -4,7 +4,7 @@
pub struct panel;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::pages::panel::panel

source · []
pub struct panel;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/settings/fn.check_url.html b/mcaptcha/settings/fn.check_url.html index ffc779d4..2c1adffc 100644 --- a/mcaptcha/settings/fn.check_url.html +++ b/mcaptcha/settings/fn.check_url.html @@ -4,5 +4,5 @@
fn check_url(s: &Config)
+

Function mcaptcha::settings::check_url

source · []
fn check_url(s: &Config)
\ No newline at end of file diff --git a/mcaptcha/settings/fn.set_database_url.html b/mcaptcha/settings/fn.set_database_url.html index 1ba8388c..2bdd8c18 100644 --- a/mcaptcha/settings/fn.set_database_url.html +++ b/mcaptcha/settings/fn.set_database_url.html @@ -4,5 +4,5 @@
fn set_database_url(s: &mut Config)
+

Function mcaptcha::settings::set_database_url

source · []
fn set_database_url(s: &mut Config)
\ No newline at end of file diff --git a/mcaptcha/settings/fn.set_from_database_url.html b/mcaptcha/settings/fn.set_from_database_url.html index d8d5bd76..88e144f2 100644 --- a/mcaptcha/settings/fn.set_from_database_url.html +++ b/mcaptcha/settings/fn.set_from_database_url.html @@ -4,5 +4,5 @@
fn set_from_database_url(s: &mut Config, database_conf: &DatabaseBuilder)
+

Function mcaptcha::settings::set_from_database_url

source · []
fn set_from_database_url(s: &mut Config, database_conf: &DatabaseBuilder)
\ No newline at end of file diff --git a/mcaptcha/settings/index.html b/mcaptcha/settings/index.html index ebbf4752..abdaddbe 100644 --- a/mcaptcha/settings/index.html +++ b/mcaptcha/settings/index.html @@ -4,7 +4,7 @@

Structs

Functions

\ No newline at end of file diff --git a/mcaptcha/settings/struct.Captcha.html b/mcaptcha/settings/struct.Captcha.html index a11348b9..23709fcb 100644 --- a/mcaptcha/settings/struct.Captcha.html +++ b/mcaptcha/settings/struct.Captcha.html @@ -3,12 +3,13 @@

Fields

salt: Stringgc: u64enable_stats: booldefault_difficulty_strategy: DefaultDifficultyStrategy

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Deserialize this value from the given Serde deserializer. Read more

diff --git a/mcaptcha/settings/struct.Database.html b/mcaptcha/settings/struct.Database.html index 2aa1d872..4e1cf921 100644 --- a/mcaptcha/settings/struct.Database.html +++ b/mcaptcha/settings/struct.Database.html @@ -4,13 +4,13 @@
pub struct Database {
+    

Struct mcaptcha::settings::Database

source · []
pub struct Database {
     pub url: String,
     pub pool: u32,
-}

Fields

url: Stringpool: u32

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

url: Stringpool: u32

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/settings/struct.DatabaseBuilder.html b/mcaptcha/settings/struct.DatabaseBuilder.html index 54644491..b7b7fa7a 100644 --- a/mcaptcha/settings/struct.DatabaseBuilder.html +++ b/mcaptcha/settings/struct.DatabaseBuilder.html @@ -4,16 +4,16 @@
struct DatabaseBuilder {
+    

Struct mcaptcha::settings::DatabaseBuilder

source · []
struct DatabaseBuilder {
     pub port: u32,
     pub hostname: String,
     pub username: String,
     pub password: String,
     pub name: String,
-}

Fields

port: u32hostname: Stringusername: Stringpassword: Stringname: String

Implementations

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

port: u32hostname: Stringusername: Stringpassword: Stringname: String

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/settings/struct.DefaultDifficultyStrategy.html b/mcaptcha/settings/struct.DefaultDifficultyStrategy.html index 0101d80c..ab4eabde 100644 --- a/mcaptcha/settings/struct.DefaultDifficultyStrategy.html +++ b/mcaptcha/settings/struct.DefaultDifficultyStrategy.html @@ -4,15 +4,15 @@
pub struct DefaultDifficultyStrategy {
+    

Struct mcaptcha::settings::DefaultDifficultyStrategy

source · []
pub struct DefaultDifficultyStrategy {
     pub avg_traffic_difficulty: u32,
     pub broke_my_site_traffic_difficulty: u32,
     pub peak_sustainable_traffic_difficulty: u32,
     pub duration: u32,
-}

Fields

avg_traffic_difficulty: u32broke_my_site_traffic_difficulty: u32peak_sustainable_traffic_difficulty: u32duration: u32

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

avg_traffic_difficulty: u32broke_my_site_traffic_difficulty: u32peak_sustainable_traffic_difficulty: u32duration: u32

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/settings/struct.Redis.html b/mcaptcha/settings/struct.Redis.html index 848e8909..a99665c1 100644 --- a/mcaptcha/settings/struct.Redis.html +++ b/mcaptcha/settings/struct.Redis.html @@ -4,13 +4,13 @@
pub struct Redis {
+    

Struct mcaptcha::settings::Redis

source · []
pub struct Redis {
     pub url: String,
     pub pool: u32,
-}

Fields

url: Stringpool: u32

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

url: Stringpool: u32

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/settings/struct.Server.html b/mcaptcha/settings/struct.Server.html index 259f7707..b7626e22 100644 --- a/mcaptcha/settings/struct.Server.html +++ b/mcaptcha/settings/struct.Server.html @@ -11,7 +11,7 @@ pub ip: String, pub url_prefix: Option<String>, pub proxy_has_tls: bool, -}

Fields

port: u32domain: Stringcookie_secret: Stringip: Stringurl_prefix: Option<String>proxy_has_tls: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

port: u32domain: Stringcookie_secret: Stringip: Stringurl_prefix: Option<String>proxy_has_tls: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

Formats the value using the given formatter. Read more

Deserialize this value from the given Serde deserializer. Read more

diff --git a/mcaptcha/settings/struct.Settings.html b/mcaptcha/settings/struct.Settings.html index 6a2d075b..c398880c 100644 --- a/mcaptcha/settings/struct.Settings.html +++ b/mcaptcha/settings/struct.Settings.html @@ -4,7 +4,7 @@
pub struct Settings {
+    

Struct mcaptcha::settings::Settings

source · []
pub struct Settings {
     pub debug: bool,
     pub commercial: bool,
     pub database: Database,
@@ -15,10 +15,10 @@
     pub smtp: Option<Smtp>,
     pub allow_registration: bool,
     pub allow_demo: bool,
-}

Fields

debug: boolcommercial: booldatabase: Databaseredis: Option<Redis>server: Servercaptcha: Captchasource_code: Stringsmtp: Option<Smtp>allow_registration: boolallow_demo: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

debug: boolcommercial: booldatabase: Databaseredis: Option<Redis>server: Servercaptcha: Captchasource_code: Stringsmtp: Option<Smtp>allow_registration: boolallow_demo: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/settings/struct.Smtp.html b/mcaptcha/settings/struct.Smtp.html index 324fac3d..8feb9d13 100644 --- a/mcaptcha/settings/struct.Smtp.html +++ b/mcaptcha/settings/struct.Smtp.html @@ -4,17 +4,17 @@
pub struct Smtp {
+    

Struct mcaptcha::settings::Smtp

source · []
pub struct Smtp {
     pub from: String,
     pub reply: String,
     pub url: String,
     pub username: String,
     pub password: String,
     pub port: u16,
-}

Fields

from: Stringreply: Stringurl: Stringusername: Stringpassword: Stringport: u16

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

from: Stringreply: Stringurl: Stringusername: Stringpassword: Stringport: u16

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/sidebar-items.js b/mcaptcha/sidebar-items.js index 5f30edf6..b4d150cf 100644 --- a/mcaptcha/sidebar-items.js +++ b/mcaptcha/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"constant":[["CACHE_AGE",""],["COMPILED_DATE",""],["DOCS",""],["GIT_COMMIT_HASH",""],["PAGES",""],["PKG_DESCRIPTION",""],["PKG_HOMEPAGE",""],["PKG_NAME",""],["V1_API_ROUTES",""],["VERSION",""],["WIDGET_ROUTES",""]],"fn":[["get_identity_service",""],["get_json_err",""],["main",""]],"mod":[["api",""],["data","App data: redis cache, database connections, etc."],["date",""],["demo",""],["docs",""],["email",""],["errors",""],["pages",""],["routes",""],["settings",""],["static_assets",""],["stats",""],["widget","User facing CAPTCHA widget"]],"struct":[["BAR_CHART",""],["CREDIT_CARD",""],["CSS",""],["DOCS_ICON",""],["Data","App data"],["FILES",""],["GITHUB",""],["HELP_CIRCLE",""],["HOME",""],["JS",""],["KEY",""],["MCAPTCHA_TRANS_ICON",""],["MESSAGE",""],["MOBILE_CSS",""],["SETTINGS",""],["SETTINGS_ICON",""],["SOURCE_FILES_OF_INSTANCE","points to source files matching build commit"],["Settings",""],["VERIFICATIN_WIDGET_CSS",""],["VERIFICATIN_WIDGET_JS",""]],"type":[["AppData",""]]}); \ No newline at end of file +initSidebarItems({"constant":[["CACHE_AGE",""],["COMPILED_DATE",""],["DOCS",""],["GIT_COMMIT_HASH",""],["PAGES",""],["PKG_DESCRIPTION",""],["PKG_HOMEPAGE",""],["PKG_NAME",""],["V1_API_ROUTES",""],["VERSION",""],["WIDGET_ROUTES",""]],"fn":[["get_identity_service",""],["get_json_err",""],["main",""]],"mod":[["api",""],["data","App data: redis cache, database connections, etc."],["date",""],["demo",""],["docs",""],["email",""],["errors",""],["pages",""],["routes",""],["settings",""],["static_assets",""],["stats",""],["widget","User facing CAPTCHA widget"]],"struct":[["BAR_CHART",""],["CREDIT_CARD",""],["CSS",""],["DOCS_ICON",""],["Data","App data"],["FILES",""],["GITHUB",""],["HELP_CIRCLE",""],["HOME",""],["JS",""],["KEY",""],["MCAPTCHA_TRANS_ICON",""],["MESSAGE",""],["MOBILE_CSS",""],["SETTINGS",""],["SETTINGS_ICON",""],["SOURCE_FILES_OF_INSTANCE","points to source files matching build commit"],["Settings",""],["VERIFICATIN_WIDGET_CSS",""],["VERIFICATIN_WIDGET_JS",""]],"type":[["AppData",""],["ArcData",""]]}); \ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/fn.handle_favicons.html b/mcaptcha/static_assets/static_files/fn.handle_favicons.html index 6f2ad56b..ee393271 100644 --- a/mcaptcha/static_assets/static_files/fn.handle_favicons.html +++ b/mcaptcha/static_assets/static_files/fn.handle_favicons.html @@ -4,5 +4,5 @@
fn handle_favicons(path: &str) -> HttpResponse
+

Function mcaptcha::static_assets::static_files::handle_favicons

source · []
fn handle_favicons(path: &str) -> HttpResponse
\ No newline at end of file diff --git a/mcaptcha/static_assets/static_files/index.html b/mcaptcha/static_assets/static_files/index.html index c24f7b55..b68ee651 100644 --- a/mcaptcha/static_assets/static_files/index.html +++ b/mcaptcha/static_assets/static_files/index.html @@ -4,7 +4,7 @@

Modules

Structs

Functions

diff --git a/mcaptcha/static_assets/static_files/struct.Favicons.html b/mcaptcha/static_assets/static_files/struct.Favicons.html index fc9763b7..d43e7937 100644 --- a/mcaptcha/static_assets/static_files/struct.Favicons.html +++ b/mcaptcha/static_assets/static_files/struct.Favicons.html @@ -4,10 +4,10 @@
struct Favicons;

Implementations

Get an embedded file and its metadata.

-

Iterates over the file paths in the folder.

-

Trait Implementations

Get an embedded file and its metadata. Read more

-

Iterates over the file paths in the folder. Read more

+

Struct mcaptcha::static_assets::static_files::Favicons

source · []
struct Favicons;

Implementations

Get an embedded file and its metadata.

+

Iterates over the file paths in the folder.

+

Trait Implementations

Get an embedded file and its metadata. Read more

+

Iterates over the file paths in the folder. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/static_assets/static_files/struct.favicons.html b/mcaptcha/static_assets/static_files/struct.favicons.html index 2a6b4aeb..379cd5ef 100644 --- a/mcaptcha/static_assets/static_files/struct.favicons.html +++ b/mcaptcha/static_assets/static_files/struct.favicons.html @@ -4,7 +4,7 @@
pub struct favicons;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::static_assets::static_files::favicons

source · []
pub struct favicons;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/static_assets/static_files/struct.static_files.html b/mcaptcha/static_assets/static_files/struct.static_files.html index 456bf512..09bb7dc9 100644 --- a/mcaptcha/static_assets/static_files/struct.static_files.html +++ b/mcaptcha/static_assets/static_files/struct.static_files.html @@ -4,7 +4,7 @@
pub struct static_files;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Struct mcaptcha::static_assets::static_files::static_files

source · []
pub struct static_files;

Trait Implementations

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/stats/fetch/index.html b/mcaptcha/stats/fetch/index.html deleted file mode 100644 index f1dd941f..00000000 --- a/mcaptcha/stats/fetch/index.html +++ /dev/null @@ -1,10 +0,0 @@ -mcaptcha::stats::fetch - Rust - -
- \ No newline at end of file diff --git a/mcaptcha/stats/fetch/runners/fn.fetch_config_fetched.html b/mcaptcha/stats/fetch/runners/fn.fetch_config_fetched.html deleted file mode 100644 index 2d4fa162..00000000 --- a/mcaptcha/stats/fetch/runners/fn.fetch_config_fetched.html +++ /dev/null @@ -1,9 +0,0 @@ -fetch_config_fetched in mcaptcha::stats::fetch::runners - Rust - -
pub async fn fetch_config_fetched(
    user: &str,
    key: &str,
    db: &PgPool
) -> Result<Vec<Date>, ServiceError>
Expand description

featch PoWConfig fetches

-
- \ No newline at end of file diff --git a/mcaptcha/stats/fetch/runners/fn.fetch_confirm.html b/mcaptcha/stats/fetch/runners/fn.fetch_confirm.html deleted file mode 100644 index 0b8f946e..00000000 --- a/mcaptcha/stats/fetch/runners/fn.fetch_confirm.html +++ /dev/null @@ -1,9 +0,0 @@ -fetch_confirm in mcaptcha::stats::fetch::runners - Rust - -
pub async fn fetch_confirm(
    user: &str,
    key: &str,
    db: &PgPool
) -> Result<Vec<Date>, ServiceError>
Expand description

featch PoWConfig confirms

-
- \ No newline at end of file diff --git a/mcaptcha/stats/fetch/runners/fn.fetch_solve.html b/mcaptcha/stats/fetch/runners/fn.fetch_solve.html deleted file mode 100644 index 06cf0d9b..00000000 --- a/mcaptcha/stats/fetch/runners/fn.fetch_solve.html +++ /dev/null @@ -1,9 +0,0 @@ -fetch_solve in mcaptcha::stats::fetch::runners - Rust - -
pub async fn fetch_solve(
    user: &str,
    key: &str,
    db: &PgPool
) -> Result<Vec<Date>, ServiceError>
Expand description

featch PoWConfig solves

-
- \ No newline at end of file diff --git a/mcaptcha/stats/fetch/runners/index.html b/mcaptcha/stats/fetch/runners/index.html deleted file mode 100644 index 049dfa3a..00000000 --- a/mcaptcha/stats/fetch/runners/index.html +++ /dev/null @@ -1,12 +0,0 @@ -mcaptcha::stats::fetch::runners - Rust - -

Functions

-

featch PoWConfig fetches

-

featch PoWConfig confirms

-

featch PoWConfig solves

-
- \ No newline at end of file diff --git a/mcaptcha/stats/fetch/runners/sidebar-items.js b/mcaptcha/stats/fetch/runners/sidebar-items.js deleted file mode 100644 index ff0bae0d..00000000 --- a/mcaptcha/stats/fetch/runners/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -initSidebarItems({"fn":[["fetch_config_fetched","featch PoWConfig fetches"],["fetch_confirm","featch PoWConfig confirms"],["fetch_solve","featch PoWConfig solves"]]}); \ No newline at end of file diff --git a/mcaptcha/stats/fetch/sidebar-items.js b/mcaptcha/stats/fetch/sidebar-items.js deleted file mode 100644 index 334b3b10..00000000 --- a/mcaptcha/stats/fetch/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -initSidebarItems({"mod":[["runners",""]],"struct":[["Stats",""],["StatsPayload",""],["StatsUnixTimestamp",""]]}); \ No newline at end of file diff --git a/mcaptcha/stats/index.html b/mcaptcha/stats/index.html index bc93c049..d50c2edb 100644 --- a/mcaptcha/stats/index.html +++ b/mcaptcha/stats/index.html @@ -3,7 +3,9 @@

+

Module stats

\ No newline at end of file diff --git a/mcaptcha/stats/record/fn.record_confirm.html b/mcaptcha/stats/record/fn.record_confirm.html deleted file mode 100644 index 4735a863..00000000 --- a/mcaptcha/stats/record/fn.record_confirm.html +++ /dev/null @@ -1,9 +0,0 @@ -record_confirm in mcaptcha::stats::record - Rust - -
pub async fn record_confirm(key: &str, db: &PgPool)
Expand description

record PoWConfig confirms

-
- \ No newline at end of file diff --git a/mcaptcha/stats/record/fn.record_fetch.html b/mcaptcha/stats/record/fn.record_fetch.html deleted file mode 100644 index 9eeb0ae1..00000000 --- a/mcaptcha/stats/record/fn.record_fetch.html +++ /dev/null @@ -1,9 +0,0 @@ -record_fetch in mcaptcha::stats::record - Rust - -
pub async fn record_fetch(key: &str, db: &PgPool)
Expand description

record PoWConfig fetches

-
- \ No newline at end of file diff --git a/mcaptcha/stats/record/fn.record_solve.html b/mcaptcha/stats/record/fn.record_solve.html deleted file mode 100644 index a2faf8d0..00000000 --- a/mcaptcha/stats/record/fn.record_solve.html +++ /dev/null @@ -1,9 +0,0 @@ -record_solve in mcaptcha::stats::record - Rust - -
pub async fn record_solve(key: &str, db: &PgPool)
Expand description

record PoWConfig solves

-
- \ No newline at end of file diff --git a/mcaptcha/stats/record/index.html b/mcaptcha/stats/record/index.html deleted file mode 100644 index 780460dd..00000000 --- a/mcaptcha/stats/record/index.html +++ /dev/null @@ -1,12 +0,0 @@ -mcaptcha::stats::record - Rust - -

Functions

-

record PoWConfig confirms

-

record PoWConfig fetches

-

record PoWConfig solves

-
- \ No newline at end of file diff --git a/mcaptcha/stats/record/sidebar-items.js b/mcaptcha/stats/record/sidebar-items.js deleted file mode 100644 index f9a9be93..00000000 --- a/mcaptcha/stats/record/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -initSidebarItems({"fn":[["record_confirm","record PoWConfig confirms"],["record_fetch","record PoWConfig fetches"],["record_solve","record PoWConfig solves"]]}); \ No newline at end of file diff --git a/mcaptcha/stats/sidebar-items.js b/mcaptcha/stats/sidebar-items.js index b0c258e3..1f6d9b95 100644 --- a/mcaptcha/stats/sidebar-items.js +++ b/mcaptcha/stats/sidebar-items.js @@ -1 +1 @@ -initSidebarItems({"mod":[["fetch",""],["record",""]]}); \ No newline at end of file +initSidebarItems({"struct":[["CaptchaStats",""],["Dummy",""],["Real",""]],"trait":[["CloneStats","Trait to clone MCDatabase"],["Stats",""]]}); \ No newline at end of file diff --git a/mcaptcha/stats/fetch/struct.StatsUnixTimestamp.html b/mcaptcha/stats/struct.CaptchaStats.html similarity index 56% rename from mcaptcha/stats/fetch/struct.StatsUnixTimestamp.html rename to mcaptcha/stats/struct.CaptchaStats.html index 57329729..5155d510 100644 --- a/mcaptcha/stats/fetch/struct.StatsUnixTimestamp.html +++ b/mcaptcha/stats/struct.CaptchaStats.html @@ -1,20 +1,23 @@ -StatsUnixTimestamp in mcaptcha::stats::fetch - Rust -
\ No newline at end of file diff --git a/mcaptcha/stats/struct.Dummy.html b/mcaptcha/stats/struct.Dummy.html new file mode 100644 index 00000000..002ce7d7 --- /dev/null +++ b/mcaptcha/stats/struct.Dummy.html @@ -0,0 +1,42 @@ +Dummy in mcaptcha::stats - Rust + +
pub struct Dummy;

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

record PoWConfig fetches

+

record PoWConfig solves

+

record PoWConfig confirms

+

fetch stats

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/mcaptcha/stats/struct.Real.html b/mcaptcha/stats/struct.Real.html new file mode 100644 index 00000000..49761f4d --- /dev/null +++ b/mcaptcha/stats/struct.Real.html @@ -0,0 +1,42 @@ +Real in mcaptcha::stats - Rust + +
pub struct Real;

Trait Implementations

Returns a copy of the value. Read more

+

Performs copy-assignment from source. Read more

+

Formats the value using the given formatter. Read more

+

Returns the “default value” for a type. Read more

+

This method tests for self and other values to be equal, and is used +by ==. Read more

+

This method tests for !=.

+

record PoWConfig fetches

+

record PoWConfig solves

+

record PoWConfig confirms

+

fetch stats

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+

Immutably borrows from an owned value. Read more

+

Mutably borrows from an owned value. Read more

+

Returns the argument unchanged.

+

Instruments this type with the provided Span, returning an +Instrumented wrapper. Read more

+

Instruments this type with the current Span, returning an +Instrumented wrapper. Read more

+

Calls U::from(self).

+

That is, this conversion is whatever the implementation of +From<T> for U chooses to do.

+

Should always be Self

+

The resulting type after obtaining ownership.

+

Creates owned data from borrowed data, usually by cloning. Read more

+
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

The type returned in the event of a conversion error.

+

Performs the conversion.

+

Attaches the provided Subscriber to this type, returning a +WithDispatch wrapper. Read more

+

Attaches the current default Subscriber to this type, returning a +WithDispatch wrapper. Read more

+
+ \ No newline at end of file diff --git a/mcaptcha/stats/trait.CloneStats.html b/mcaptcha/stats/trait.CloneStats.html new file mode 100644 index 00000000..e7b735e8 --- /dev/null +++ b/mcaptcha/stats/trait.CloneStats.html @@ -0,0 +1,12 @@ +CloneStats in mcaptcha::stats - Rust + +
pub trait CloneStats {
+    fn clone_stats(&self) -> Box<dyn Stats>;
+}
Expand description

Trait to clone MCDatabase

+

Required methods

clone DB

+

Implementors

+ \ No newline at end of file diff --git a/mcaptcha/stats/trait.Stats.html b/mcaptcha/stats/trait.Stats.html new file mode 100644 index 00000000..a81fd35d --- /dev/null +++ b/mcaptcha/stats/trait.Stats.html @@ -0,0 +1,17 @@ +Stats in mcaptcha::stats - Rust + +
pub trait Stats: Send + Sync + CloneStats {
+    fn record_fetch<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        d: &'life1 Data,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn record_solve<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        d: &'life1 Data,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn record_confirm<'life0, 'life1, 'life2, 'async_trait>(
        &'life0 self,
        d: &'life1 Data,
        key: &'life2 str
    ) -> Pin<Box<dyn Future<Output = DBResult<()>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        Self: 'async_trait
; + fn fetch<'life0, 'life1, 'life2, 'life3, 'async_trait>(
        &'life0 self,
        d: &'life1 Data,
        user: &'life2 str,
        key: &'life3 str
    ) -> Pin<Box<dyn Future<Output = DBResult<CaptchaStats>> + Send + 'async_trait>>
    where
        'life0: 'async_trait,
        'life1: 'async_trait,
        'life2: 'async_trait,
        'life3: 'async_trait,
        Self: 'async_trait
; +}

Required methods

record PoWConfig fetches

+

record PoWConfig solves

+

record PoWConfig confirms

+

fetch stats

+

Implementors

+ \ No newline at end of file diff --git a/mcaptcha/struct.Data.html b/mcaptcha/struct.Data.html index 0f6243d0..a77e2250 100644 --- a/mcaptcha/struct.Data.html +++ b/mcaptcha/struct.Data.html @@ -3,19 +3,23 @@

Fields

db: Box<dyn MCDatabase>

database ops defined by db crates

creds: Config

credential management configuration

captcha: SystemGroup

mCaptcha system: Redis cache, etc.

mailer: Option<AsyncSmtpTransport<Tokio1Executor>>

email client

-

Implementations

create new instance of app data

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

+
settings: Settings

app settings

+
stats: Box<dyn Stats>

stats recorder

+

Implementations

create new instance of app data

+

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

Returns the argument unchanged.

diff --git a/mcaptcha/struct.Settings.html b/mcaptcha/struct.Settings.html index 182cd402..168d2c2f 100644 --- a/mcaptcha/struct.Settings.html +++ b/mcaptcha/struct.Settings.html @@ -4,7 +4,7 @@
pub struct Settings {
+    

Struct mcaptcha::Settings

source · []
pub struct Settings {
     pub debug: bool,
     pub commercial: bool,
     pub database: Database,
@@ -15,10 +15,10 @@
     pub smtp: Option<Smtp>,
     pub allow_registration: bool,
     pub allow_demo: bool,
-}

Fields

debug: boolcommercial: booldatabase: Databaseredis: Option<Redis>server: Servercaptcha: Captchasource_code: Stringsmtp: Option<Smtp>allow_registration: boolallow_demo: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

+}

Fields

debug: boolcommercial: booldatabase: Databaseredis: Option<Redis>server: Servercaptcha: Captchasource_code: Stringsmtp: Option<Smtp>allow_registration: boolallow_demo: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

+

Formats the value using the given formatter. Read more

+

Deserialize this value from the given Serde deserializer. Read more

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

Immutably borrows from an owned value. Read more

Mutably borrows from an owned value. Read more

diff --git a/mcaptcha/type.AppData.html b/mcaptcha/type.AppData.html index b387b61c..a827bb05 100644 --- a/mcaptcha/type.AppData.html +++ b/mcaptcha/type.AppData.html @@ -4,5 +4,5 @@
-

Type Definition mcaptcha::AppData

source · []
pub type AppData = Data<Arc<Data>>;
+

Type Definition mcaptcha::AppData

source · []
pub type AppData = Data<ArcData>;
\ No newline at end of file diff --git a/mcaptcha/type.ArcData.html b/mcaptcha/type.ArcData.html new file mode 100644 index 00000000..af3ede82 --- /dev/null +++ b/mcaptcha/type.ArcData.html @@ -0,0 +1,8 @@ +ArcData in mcaptcha - Rust + +
+

Type Definition mcaptcha::ArcData

source · []
pub type ArcData = Arc<Data>;
+ \ No newline at end of file diff --git a/search-index.js b/search-index.js index 148e5fe1..1cfaf8ce 100644 --- a/search-index.js +++ b/search-index.js @@ -1,5 +1,6 @@ var searchIndex = JSON.parse('{\ -"mcaptcha":{"doc":"","t":[6,3,17,17,3,3,17,3,3,3,3,17,3,3,3,3,3,3,3,17,17,17,17,3,3,3,3,17,3,3,17,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,0,12,0,12,12,0,11,11,11,11,11,11,11,11,0,0,0,11,11,11,11,11,11,11,11,5,5,11,11,11,11,11,11,11,11,12,5,0,12,0,12,0,12,12,0,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,3,0,0,11,11,11,11,5,11,0,0,0,0,12,0,5,11,11,11,11,3,3,11,11,11,11,11,11,11,11,0,11,11,0,12,11,11,11,11,11,11,0,0,0,11,11,5,11,11,11,11,11,11,11,11,0,12,11,11,11,11,3,11,11,11,0,5,11,11,11,11,5,3,11,11,11,11,11,11,11,11,11,12,3,11,11,11,11,11,11,11,11,11,11,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,12,12,12,11,11,5,11,11,11,11,11,11,11,11,11,11,5,3,11,11,11,3,11,11,12,12,11,12,11,11,11,11,11,12,12,12,12,12,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,12,11,5,11,11,11,11,11,11,11,11,11,11,3,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,5,3,11,11,11,11,11,11,11,11,11,11,12,3,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,0,0,5,3,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,12,12,11,12,11,11,11,11,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,11,11,11,11,12,5,12,12,12,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,0,0,0,0,5,0,5,0,0,3,3,11,11,11,11,11,11,11,11,3,12,11,11,12,11,11,11,11,11,11,11,12,12,12,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,3,11,11,11,11,11,11,3,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,3,3,12,11,11,11,11,11,11,11,11,12,11,11,11,11,11,3,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,11,0,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,3,11,11,12,11,11,11,11,11,11,12,11,3,3,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,3,11,11,11,12,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,5,3,11,11,12,12,12,11,12,11,11,12,11,11,11,12,12,11,3,11,11,11,11,11,11,11,11,11,11,3,11,11,12,11,0,11,11,11,11,11,11,11,11,11,11,3,11,11,11,12,11,11,11,11,11,11,3,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,12,12,11,11,0,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,5,5,3,3,4,3,3,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,3,11,11,11,11,11,11,11,11,11,11,12,12,11,11,0,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,12,12,12,12,3,11,11,12,11,12,11,11,11,11,11,11,0,0,0,0,5,3,3,11,11,11,11,11,11,11,12,11,11,12,11,11,12,11,11,11,11,11,11,11,11,3,3,11,11,11,11,11,11,11,11,11,11,11,3,12,12,12,12,11,11,11,12,12,12,12,12,12,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,5,3,3,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,11,11,3,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,12,11,12,11,11,11,11,11,0,0,5,0,0,3,11,11,11,11,11,11,11,11,11,11,3,5,11,11,12,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,12,11,11,14,12,11,11,11,11,12,11,12,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,3,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,3,11,11,17,3,12,12,11,11,12,11,11,11,12,11,12,12,11,11,11,11,3,13,6,13,4,11,11,11,11,11,12,12,12,14,14,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,17,3,17,17,17,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,17,17,3,11,11,11,11,11,12,11,11,11,11,11,11,11,11,3,17,17,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,5,3,11,11,11,11,11,11,11,11,11,0,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,12,11,11,12,11,11,11,11,0,3,17,11,11,11,11,11,11,11,11,11,11,11,11,11,5,12,11,12,13,13,13,13,13,3,13,13,13,13,4,6,13,13,13,13,4,13,6,3,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,17,0,0,5,0,0,5,0,0,0,0,5,0,3,3,17,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,17,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,12,12,11,11,11,11,11,17,3,11,11,11,11,12,11,11,11,11,11,11,11,11,11,12,11,17,3,3,17,3,12,12,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,12,11,11,11,11,0,5,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,12,11,11,11,11,11,12,11,3,17,11,11,11,11,11,11,11,11,11,11,11,0,3,11,11,11,0,5,0,0,12,11,11,11,11,11,11,11,11,11,3,3,17,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,12,12,12,11,3,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,12,11,11,12,12,12,11,11,11,11,3,17,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,11,11,11,11,11,11,11,11,11,0,12,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,3,11,11,12,11,11,12,11,11,11,11,11,12,11,0,0,0,0,0,5,0,3,3,3,3,17,12,12,3,12,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,3,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,3,3,3,3,17,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,3,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,3,17,6,11,11,11,11,11,11,11,11,5,11,11,3,11,11,11,11,12,11,11,11,11,11,11,11,11,11,3,12,12,11,11,12,12,12,11,11,11,11,11,11,11,12,11,11,11,11,12,11,3,3,3,17,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,11,11,11,11,11,11,11,11,12,12,12,12,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,17,3,12,12,11,11,12,12,11,11,11,12,11,11,12,12,12,12,12,11,11,11,11,3,3,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,12,11,11,11,5,3,3,3,3,3,3,3,3,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,12,11,11,11,11,11,11,11,11,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,5,5,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,11,11,11,11,11,11,11,11,0,5,0,3,11,11,12,11,11,11,11,11,11,11,11,3,3,0,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,5,5,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,3,3,3,3,6,3,3,3,3,12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,11,0,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,5,5,5,5,5,3,3,17,17,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,12,11],"n":["AppData","BAR_CHART","CACHE_AGE","COMPILED_DATE","CREDIT_CARD","CSS","DOCS","DOCS_ICON","Data","FILES","GITHUB","GIT_COMMIT_HASH","HELP_CIRCLE","HOME","JS","KEY","MCAPTCHA_TRANS_ICON","MESSAGE","MOBILE_CSS","PAGES","PKG_DESCRIPTION","PKG_HOMEPAGE","PKG_NAME","SETTINGS","SETTINGS_ICON","SOURCE_FILES_OF_INSTANCE","Settings","V1_API_ROUTES","VERIFICATIN_WIDGET_CSS","VERIFICATIN_WIDGET_JS","VERSION","WIDGET_ROUTES","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","allow_demo","allow_registration","api","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","captcha","captcha","commercial","creds","data","database","date","db","debug","demo","deref","deref","deref","deref","deref","deref","deref","deref","docs","email","errors","from","from","from","from","from","from","from","from","get_identity_service","get_json_err","into","into","into","into","into","into","into","into","mailer","main","pages","redis","routes","server","settings","smtp","source_code","static_assets","stats","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","widget","v1","RedirectQuery","account","auth","borrow","borrow_mut","deserialize","from","get_middleware","into","mcaptcha","meta","notifications","pow","redirect_to","routes","services","try_from","try_into","type_id","vzip","AccountCheckPayload","AccountCheckResp","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","delete","deserialize","deserialize","email","exists","fmt","fmt","from","from","into","into","password","routes","secret","serialize","serialize","services","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","username","val","vzip","vzip","borrow","borrow_mut","delete_account","from","into","register","runners","services","try_from","try_into","type_id","vzip","delete_user","Email","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deserialize","email","email_exists","fmt","from","from","from","into","into","into","register","register","serialize","services","set_email","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","ChangePasswordReqest","UpdatePassword","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","confirm_new_password","confirm_new_password","deserialize","fmt","from","from","from","from","into","into","into","new_password","new_password","password","register","serialize","services","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_password_runner","update_user_password","vzip","vzip","vzip","Account","borrow","borrow_mut","delete","email_exists","from","get_secret","into","new","try_from","try_into","type_id","update_email","update_password","update_secret","update_username","username_exists","vzip","Secret","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","from","get_secret","into","into","into","register","register","secret","serialize","services","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_user_secret","vzip","vzip","vzip","Username","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","from","into","into","into","register","register","runners","serialize","services","set_username","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","username","username_exists","vzip","vzip","vzip","username_exists","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","from","from","from","into","into","into","login","register","register","register","register","routes","runners","services","signout","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Auth","borrow","borrow_mut","from","get_login_route","into","login","logout","new","register","try_from","try_into","type_id","vzip","Login","Password","Register","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","confirm_password","deserialize","deserialize","deserialize","email","fmt","fmt","fmt","from","from","from","into","into","into","login","login_runner","password","password","password","register_runner","serialize","serialize","serialize","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","username","vzip","vzip","vzip","create","delete","easy","get","get_random","routes","services","stats","update","CreateCaptcha","MCaptchaDetails","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","create","description","deserialize","deserialize","duration","fmt","from","from","from","into","into","into","key","levels","name","register","runner","serialize","serialize","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","create","DeleteCaptcha","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","delete","deserialize","fmt","from","from","into","into","key","password","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","TrafficPattern","UpdateTrafficPattern","avg_traffic","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic","calculate","clone","clone","clone_into","clone_into","create","description","deserialize","deserialize","fmt","fmt","from","from","from","from","into","into","into","into","key","pattern","peak_sustainable_traffic","register","register","routes","serialize","serialize","services","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","update","vzip","vzip","vzip","vzip","Easy","borrow","borrow_mut","create","from","into","new","try_from","try_into","type_id","update","vzip","I32Levels","Levels","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","deserialize","deserialize","difficulty_factor","fmt","fmt","from","from","from","get_captcha","into","into","into","levels","register","runner","serialize","serialize","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","visitor_threshold","vzip","vzip","vzip","get_captcha","Captcha","borrow","borrow_mut","create","delete","easy","from","get","into","new","stats","try_from","try_into","type_id","update","update_key","vzip","StatsPayload","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","get","into","into","key","register","routes","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Stats","borrow","borrow_mut","from","get","into","new","try_from","try_into","type_id","vzip","UpdateCaptcha","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","description","deserialize","duration","from","from","from","into","into","into","key","levels","register","register","runner","serialize","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_captcha","update_key","vzip","vzip","vzip","update_captcha","update_key","BuildDetails","BuildDetailsBuilder","BuildDetailsBuilderError","Health","HealthBuilder","HealthBuilderError","UninitializedField","UninitializedField","ValidationError","ValidationError","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build_details","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","create_empty","create_empty","db","db","db","default","default","deserialize","deserialize","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","git_commit_hash","git_commit_hash","git_commit_hash","health","into","into","into","into","into","into","into","into","is_redis","redis","redis","redis","register","register","routes","serialize","serialize","services","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","version","version","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","0","0","0","0","Meta","borrow","borrow_mut","build_details","from","health","into","new","try_from","try_into","type_id","vzip","add","get","mark_read","routes","services","AddNotification","add_notification","borrow","borrow","borrow_mut","borrow_mut","deserialize","from","from","heading","into","into","message","register","serialize","to","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Notification","NotificationResp","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","deserialize","from","from","from","from","get_notification","heading","heading","id","id","into","into","into","message","message","name","name","received","received","register","runner","serialize","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","get_notification","MarkReadReq","NotificationResp","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","deserialize","deserialize","from","from","from","heading","id","id","into","into","into","mark_read","message","name","received","register","serialize","serialize","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Notifications","add","borrow","borrow_mut","from","get","into","mark_read","new","try_from","try_into","type_id","vzip","get_config","routes","services","verify_pow","verify_token","GetConfigPayload","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","get_config","init_mcaptcha","into","into","key","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","PoW","borrow","borrow_mut","from","get_config","get_config","into","new","rm_scope","scope","try_from","try_into","type_id","validate_captcha_token","validate_captcha_token","verify_pow","verify_pow","vzip","ValidationToken","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","into","into","register","serialize","to_owned","token","try_from","try_from","try_into","try_into","type_id","type_id","verify_pow","vzip","vzip","CaptchaValidateResp","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","into","into","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","valid","validate_captcha_token","vzip","vzip","ROUTES","Routes","account","auth","borrow","borrow_mut","captcha","from","get_login_route","into","meta","new","notifications","pow","try_from","try_into","type_id","vzip","Data","Embedded","Mailer","Redis","SystemGroup","add_site","borrow","borrow","borrow_mut","borrow_mut","captcha","creds","db","enum_system_actor","enum_system_wrapper","from","from","get_creds","get_mailer","get_pow","into","into","mailer","new","new","new_system","remove","rename","try_from","try_from","try_into","try_into","type_id","type_id","validate_verification_tokens","verify_pow","vzip","vzip","0","0","DAY","Date","HOUR","MINUTE","WEEK","borrow","borrow_mut","clone","clone_into","date","fmt","format","from","into","print_date","time","to_owned","try_from","try_into","type_id","vzip","DEMO_PASSWORD","DEMO_USER","DemoUser","abort","borrow","borrow_mut","delete_demo_user","from","handle","into","register_demo_user","run","spawn","try_from","try_into","type_id","vzip","Asset","DOCS","OPEN_API_SPEC","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","dist","from","from","from","from","get","get","handle_embedded_file","index","into","into","into","into","iter","iter","register","register","register","routes","services","spec","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","Docs","assets","borrow","borrow_mut","from","home","into","new","spec","try_from","try_into","type_id","vzip","verification","IndexPage","PAGE","borrow","borrow_mut","clone","clone_into","from","into","new","render_once","render_once_to","to_owned","try_from","try_into","type_id","verification","verification_link","vzip","0","AccountNotFound","BlacklistError","CaptchaError","ClosedForRegistration","EmailTaken","ErrorToResponse","InternalServerError","InternalServerError","NotAUrl","NotAnEmail","PageError","PageResult","PasswordTooLong","PasswordTooShort","PasswordsDontMatch","ProfainityError","ServiceError","ServiceError","ServiceResult","SmtpErrorWrapper","TokenNotFound","UnableToSendEmail","UsernameCaseMappedError","UsernameNotFound","UsernameTaken","WrongPassword","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","deserialize","eq","eq","eq","error","error_response","error_response","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","into","into","into","into","ne","ne","serialize","source","source","source","status_code","status_code","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","0","0","0","NAME","auth","errors","get_middleware","panel","routes","services","sitemap","login","register","routes","services","sudo","INDEX","IndexPage","PAGE","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","from","from","from","into","into","into","login","register","render_once","render_once_to","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","INDEX","IndexPage","PAGE","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","from","from","from","into","into","into","join","register","render_once","render_once_to","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Auth","borrow","borrow_mut","from","get_login_route","get_sitemap","into","join","login","new","try_from","try_into","type_id","vzip","PAGE","SudoPage","borrow","borrow_mut","clone","clone_into","data","from","into","new","render_once","render_once_to","to_owned","try_from","try_into","type_id","url","vzip","ERROR_ROUTE","ErrorPage","INTERNAL_SERVER_ERROR_BODY","PAGE","UNKNOWN_ERROR_BODY","__private_field","__private_field","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deref","deref","error","from","from","from","from","into","into","into","into","message","new","register","render_once","render_once_to","routes","services","title","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","Errors","borrow","borrow_mut","from","internal_server_error","into","new","try_from","try_into","type_id","unknown_error","vzip","IndexPage","PAGE","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","from","from","into","into","new","notifications","panel","register","render_once","render_once_to","routes","services","settings","sitekey","sitekeys","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","IndexPage","Notification","PAGE","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","from","from","from","from","heading","id","into","into","into","message","n","name","new","notifications","print_date","received","register","render_once","render_once_to","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Panel","borrow","borrow_mut","from","get_sitemap","home","into","new","notifications","settings","sitekey","try_from","try_into","type_id","vzip","IndexPage","PAGE","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","delete_account","email","from","from","from","from","into","into","into","into","register","register","register","render_once","render_once_to","routes","secret","services","settings","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","update_secret","username","vzip","vzip","vzip","vzip","Settings","borrow","borrow_mut","delete_account","from","get_sitemap","home","into","new","try_from","try_into","type_id","update_secret","vzip","add","delete","edit","list","routes","services","view","ADVANCE_INDEX","AdvanceIndexPage","EASY_INDEX","EasyIndexPage","PAGE","__private_field","__private_field","advance","avg_traffic","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic","clone","clone","clone_into","clone_into","default","default","deref","deref","easy","form_description","form_description","form_duration","form_title","form_title","from","from","from","from","from","from","into","into","into","into","into","into","levels","peak_sustainable_traffic","register","register","render_once","render_once","render_once_to","render_once_to","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","borrow","borrow_mut","delete_sitekey","from","into","register","try_from","try_into","type_id","vzip","AdvanceEditPage","EasyEditPage","Level","McaptchaConfig","PAGE","advance","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","config_id","difficulty_factor","duration","duration","easy","form_title","from","from","from","from","from","from","into","into","into","into","into","into","key","key","levels","name","name","new","new","pattern","register","register","render_once","render_once","render_once_to","render_once_to","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","visitor_threshold","vzip","vzip","vzip","vzip","vzip","vzip","IndexPage","PAGE","SiteKeys","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","from","from","get_list_sitekeys","into","into","list_sitekeys","new","register","render_once","render_once_to","sitekeys","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Sitekey","add_advance","add_easy","borrow","borrow_mut","delete","edit_advance","edit_easy","from","get_delete","get_edit_advance","get_edit_easy","get_sitemap","get_view","into","list","new","try_from","try_into","type_id","view","vzip","IndexPage","Level","McaptchaConfig","PAGE","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","config_id","difficulty_factor","duration","duration","from","from","from","from","into","into","into","into","key","levels","name","name","new","register","render_once","render_once_to","stats","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","view_sitekey","visitor_threshold","vzip","vzip","vzip","vzip","ROUTES","Routes","about","auth","borrow","borrow_mut","donate","errors","from","get_login_route","get_sitemap","home","into","new","panel","privacy","security","sitemap","thanks","try_from","try_into","type_id","vzip","INDEX","IndexPage","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","domain","from","from","from","into","into","into","register","render_once","render_once_to","sitemap","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","urls","vzip","vzip","vzip","services","Captcha","Database","DatabaseBuilder","DefaultDifficultyStrategy","Redis","Server","Settings","Smtp","allow_demo","allow_registration","avg_traffic_difficulty","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic_difficulty","captcha","check_url","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","commercial","cookie_secret","database","debug","default_difficulty_strategy","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","domain","duration","extract_database_url","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","gc","get_ip","hostname","into","into","into","into","into","into","into","into","ip","name","new","password","password","peak_sustainable_traffic_difficulty","pool","pool","port","port","port","proxy_has_tls","redis","reply","salt","server","set_database_url","set_from_database_url","smtp","source_code","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","url","url","url","url_prefix","username","username","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","filemap","services","static_files","FileMap","borrow","borrow_mut","files","from","get","into","new","try_from","try_into","type_id","vzip","Asset","Favicons","assets","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","favicons","from","from","from","from","get","get","get","get","handle_assets","handle_favicons","into","into","into","into","iter","iter","iter","iter","register","register","static_files","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","BAR_CHART","CREDIT_CARD","DOCS_ICON","GITHUB","HELP_CIRCLE","HOME","Img","KEY","MCAPTCHA_TRANS_ICON","MESSAGE","SETTINGS_ICON","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","fetch","record","Stats","StatsPayload","StatsUnixTimestamp","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","config_fetches","config_fetches","confirms","confirms","deserialize","deserialize","fmt","fmt","fmt","from","from","from","from_stats","into","into","into","key","new","runners","serialize","serialize","solves","solves","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","unix_timestamp","vzip","vzip","vzip","fetch_config_fetched","fetch_confirm","fetch_solve","record_confirm","record_fetch","record_solve","INDEX_PAGE","IndexPage","PAGE","WIDGET_ROUTES","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deref","from","from","from","into","into","into","new","register","render_once","render_once_to","routes","services","show_widget","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Widget","borrow","borrow_mut","from","into","new","try_from","try_into","type_id","verification_widget","vzip"],"q":["mcaptcha","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api","mcaptcha::api::v1","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::delete","","","","","","","","","","","","mcaptcha::api::v1::account::delete::runners","mcaptcha::api::v1::account::email","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::password","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::routes","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::secret","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::username","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::username::runners","mcaptcha::api::v1::auth","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::auth::routes","","","","","","","","","","","","","","mcaptcha::api::v1::auth::runners","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha","","","","","","","","","mcaptcha::api::v1::mcaptcha::create","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::create::runner","mcaptcha::api::v1::mcaptcha::delete","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::easy","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::easy::routes","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::get","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::get::runner","mcaptcha::api::v1::mcaptcha::routes","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::stats","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::stats::routes","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::update","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::update::runner","","mcaptcha::api::v1::meta","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::meta::BuildDetailsBuilderError","","mcaptcha::api::v1::meta::HealthBuilderError","","mcaptcha::api::v1::meta::routes","","","","","","","","","","","","mcaptcha::api::v1::notifications","","","","","mcaptcha::api::v1::notifications::add","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::get","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::get::runner","mcaptcha::api::v1::notifications::mark_read","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::routes","","","","","","","","","","","","","mcaptcha::api::v1::pow","","","","","mcaptcha::api::v1::pow::get_config","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::pow::routes","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::pow::verify_pow","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::pow::verify_token","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::routes","","","","","","","","","","","","","","","","","","mcaptcha::data","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::data::SystemGroup","","mcaptcha::date","","","","","","","","","","","","","","","","","","","","","mcaptcha::demo","","","","","","","","","","","","","","","","","mcaptcha::docs","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::docs::routes","","","","","","","","","","","","","mcaptcha::email","mcaptcha::email::verification","","","","","","","","","","","","","","","","","","mcaptcha::errors","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::errors::PageError","mcaptcha::errors::ServiceError","","mcaptcha::pages","","","","","","","","mcaptcha::pages::auth","","","","","mcaptcha::pages::auth::login","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::auth::register","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::auth::routes","","","","","","","","","","","","","","mcaptcha::pages::auth::sudo","","","","","","","","","","","","","","","","","","mcaptcha::pages::errors","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::errors::routes","","","","","","","","","","","","mcaptcha::pages::panel","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::notifications","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::routes","","","","","","","","","","","","","","","mcaptcha::pages::panel::settings","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::settings::routes","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey","","","","","","","mcaptcha::pages::panel::sitekey::add","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::delete","","","","","","","","","","mcaptcha::pages::panel::sitekey::edit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::list","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::routes","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::view","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::routes","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::sitemap","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::routes","mcaptcha::settings","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::static_assets","","","mcaptcha::static_assets::filemap","","","","","","","","","","","","mcaptcha::static_assets::static_files","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::static_assets::static_files::assets","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::stats","","mcaptcha::stats::fetch","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::stats::fetch::runners","","","mcaptcha::stats::record","","","mcaptcha::widget","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::widget::routes","","","","","","","","","",""],"d":["","","","","","","","","App data","","","","","","","","","","","","","","","","","points to source files matching build commit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mCaptcha system: Redis cache, etc.","","","credential management configuration","App data: redis cache, database connections, etc.","","","databse pool","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","email client","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","User facing CAPTCHA widget","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","update email","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","update username","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","returns Ok(()) when everything checks out and the user is …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","easy is using defaults","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","Builder for BuildDetails.","Error type for BuildDetailsBuilder","Health check return datatype","Builder for Health.","Error type for HealthBuilder","Uninitialized field","Uninitialized field","Custom validation error","Custom validation error","","","","","","","","","","","","","","","","","Builds a new BuildDetails.","Builds a new Health.","emmits build details of the bninary","","","","","","","","","Create an empty builder, with all fields set to None or …","Create an empty builder, with all fields set to None or …","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","","","","checks all components of the system","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","route handler that adds a notification message","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","route handler that gets all unread notifications","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","route handler that marks a notification read","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","PoW Verification module","PoW success token module","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","get PoW configuration for an mcaptcha key","Call this when MCaptcha is not in master.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","Returns the argument unchanged.","remove scope for $name route","","Calls U::from(self).","","","","","","","remove scope for $name route","","remove scope for $name route","","","validation token that clients receive as proof for …","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","route handler that verifies PoW and issues a solution token","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","route hander that validates a PoW solution token","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","App data","","Mailer data type AsyncSmtpTransport","","Represents mCaptcha cache and master system. When Redis is …","","","","","","mCaptcha system: Redis cache, etc.","credential management configuration","databse pool","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","Calls U::from(self).","Calls U::from(self).","email client","","create new instance of app data","","","","","","","","","","","","","","","","","","","","","","","","","print date","","","Returns the argument unchanged.","Calls U::from(self).","print relative time from date","","","","","","","Demo password","Demo username","","","","","","Returns the argument unchanged.","","Calls U::from(self).","register demo user runner","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Get an embedded file and its metadata.","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Iterates over the file paths in the folder.","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","Email operations: verification, notification, etc","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","when the value passed contains blacklisted words see …","","","email is already taken","","","","","","","","","","","when the value passed contains profainity","","","","","when the a token name is already taken token not found","Unable to send email","when the value passed contains characters not present in …","","when the a username is already taken","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","notifications","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","route handler that renders individual views for sitekeys","","","","","","","","","","","","","","","","","","","","","","","","","route handler that renders individual views for sitekeys","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","utility function to get a list of all sitekeys that a user …","Calls U::from(self).","Calls U::from(self).","render a list of all sitekeys that a user has","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","route handler that renders individual views for sitekeys","","","","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Get an embedded file and its metadata.","Get an embedded file and its metadata.","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Iterates over the file paths in the folder.","","","Iterates over the file paths in the folder.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","featch PoWConfig confirms","","","","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","widget services","render a client side widget for CAPTCHA verification","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","",""],"i":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,19,0,11,12,13,14,15,16,17,18,11,12,13,14,15,16,17,18,20,19,19,20,0,19,0,20,19,0,11,12,13,14,15,16,17,18,0,0,0,11,12,13,14,15,16,17,18,0,0,11,12,13,14,15,16,17,18,20,0,0,19,0,19,0,19,19,0,0,11,12,13,14,15,16,17,18,11,12,13,14,15,16,17,18,11,12,13,14,15,16,17,18,11,12,13,14,15,16,17,18,0,0,0,0,0,21,21,21,21,0,21,0,0,0,0,21,0,0,21,21,21,21,0,0,22,23,22,23,22,23,22,23,0,22,23,0,23,22,23,22,23,22,23,0,0,0,22,23,0,22,23,22,23,22,23,22,23,0,22,22,23,24,24,0,24,24,24,0,0,24,24,24,24,0,0,25,26,27,25,26,27,25,25,25,25,0,25,25,26,27,25,26,27,26,27,25,0,0,25,25,26,27,25,26,27,25,26,27,25,26,27,0,0,28,29,30,28,29,30,29,29,28,29,29,29,28,28,29,30,28,29,30,28,29,29,30,29,0,29,28,29,30,28,29,30,28,29,30,0,0,28,29,30,0,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,0,32,33,34,32,33,34,32,32,32,32,32,33,34,0,32,33,34,33,34,32,32,0,32,32,33,34,32,33,34,32,33,34,0,32,33,34,0,35,36,37,35,36,37,36,36,36,36,35,36,37,35,36,37,35,37,0,36,0,0,36,35,36,37,35,36,37,35,36,37,36,0,35,36,37,0,38,39,40,38,39,40,38,39,40,38,39,40,0,0,38,39,40,0,0,0,0,38,39,40,38,39,40,38,39,40,38,39,40,0,41,41,41,41,41,41,41,41,41,41,41,41,41,0,0,0,42,43,44,42,43,44,42,43,44,42,43,44,42,42,43,44,42,42,43,44,42,43,44,42,43,44,43,0,42,43,44,0,42,43,44,42,43,44,42,43,44,42,43,44,42,43,44,42,42,43,44,0,0,0,0,0,0,0,0,0,0,0,45,46,47,45,46,47,46,46,0,45,45,46,45,46,45,46,47,45,46,47,46,45,46,47,0,45,46,46,45,46,47,45,46,47,45,46,47,45,46,47,0,0,48,49,48,49,48,48,0,48,48,48,49,48,49,48,48,49,48,48,48,49,48,49,48,49,48,49,0,0,50,50,51,52,53,50,51,52,53,50,50,50,52,50,52,0,50,50,52,50,52,50,51,52,53,50,51,52,53,52,52,50,51,53,0,50,52,0,50,52,50,51,52,53,50,51,52,53,50,51,52,53,0,50,51,52,53,0,54,54,54,54,54,54,54,54,54,54,54,0,0,55,56,57,55,56,57,56,57,56,57,56,57,57,56,57,55,56,57,0,55,56,57,56,55,0,56,57,56,57,55,56,57,55,56,57,55,56,57,57,55,56,57,0,0,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,58,0,59,60,59,60,59,59,59,59,59,60,0,59,60,59,60,0,59,59,59,60,59,60,59,60,59,60,0,61,61,61,61,61,61,61,61,61,61,0,62,63,64,62,63,64,63,63,63,62,63,64,62,63,64,63,63,62,64,0,63,62,63,64,62,63,64,62,63,64,0,0,62,63,64,0,0,0,0,0,0,0,0,65,66,65,66,67,68,65,69,70,71,66,72,67,68,65,69,70,71,66,72,68,71,0,67,68,70,71,67,68,70,71,68,71,71,70,71,68,71,67,70,67,65,65,70,66,66,67,68,65,65,65,69,70,71,66,66,66,72,68,67,68,0,67,68,65,69,70,71,66,72,70,71,70,71,69,72,0,67,70,0,67,68,70,71,65,66,67,68,65,69,70,71,66,72,67,68,65,69,70,71,66,72,67,68,65,69,70,71,66,72,68,67,68,67,68,65,69,70,71,66,72,73,74,75,76,0,77,77,77,77,77,77,77,77,77,77,77,0,0,0,0,0,0,0,78,79,78,79,78,78,79,78,78,79,78,79,78,78,78,79,78,79,78,79,78,79,0,0,80,81,82,80,81,82,81,80,81,81,82,0,80,81,80,81,80,81,82,80,81,80,81,80,81,82,0,81,80,81,82,80,81,82,80,81,82,80,81,82,0,0,0,83,84,85,83,84,85,83,84,83,84,85,84,83,84,83,84,85,0,84,84,84,85,83,84,83,84,85,83,84,85,83,84,85,83,84,85,0,86,86,86,86,86,86,86,86,86,86,86,86,0,0,0,0,0,0,87,88,87,88,87,87,87,87,87,88,0,0,87,88,87,88,87,87,87,88,87,88,87,88,87,88,0,89,89,89,89,89,89,89,0,89,89,89,89,89,89,89,89,89,0,90,91,90,91,90,90,90,90,90,91,90,91,91,90,90,90,90,91,90,91,90,91,0,90,91,0,92,93,92,93,92,92,92,92,92,93,92,93,93,92,92,92,93,92,93,92,93,92,0,92,93,0,0,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,94,0,95,0,95,0,95,95,20,95,20,20,20,20,0,0,95,20,20,20,95,95,20,20,95,20,95,95,95,95,20,95,20,95,20,95,95,95,20,96,97,0,0,0,0,0,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,98,0,0,0,99,99,99,99,99,99,99,99,99,99,99,99,99,99,0,0,0,100,101,102,103,100,101,102,103,0,100,101,102,103,100,100,0,0,100,101,102,103,100,100,101,102,103,0,0,0,100,101,102,103,100,101,102,103,100,101,102,103,100,101,102,103,0,104,104,104,104,104,104,104,104,104,104,104,104,0,0,0,105,105,105,105,105,105,105,105,105,105,105,105,105,0,105,105,106,107,107,107,107,107,0,107,108,107,107,0,0,107,107,107,107,0,108,0,0,107,107,107,107,107,107,106,107,109,108,106,107,109,108,109,106,107,108,109,107,108,106,106,107,107,108,108,106,107,107,107,107,107,107,107,107,107,109,108,108,108,106,107,109,108,107,108,109,106,107,108,107,108,106,107,108,106,107,109,108,106,107,109,108,106,107,109,108,106,107,109,108,110,111,112,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,113,114,113,115,114,113,115,114,114,114,113,114,113,115,114,113,115,0,115,114,114,114,114,113,115,114,113,115,114,113,115,114,113,115,0,0,0,116,117,116,118,117,116,118,117,117,117,116,117,116,118,117,116,118,0,118,117,117,117,117,116,118,117,116,118,117,116,118,117,116,118,0,119,119,119,119,119,119,119,119,119,119,119,119,119,0,0,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,120,0,0,0,0,0,121,122,123,121,122,124,123,121,122,124,123,123,121,122,0,123,121,122,124,123,121,122,124,123,123,124,123,123,0,0,123,123,123,121,122,124,123,121,122,124,123,121,122,124,123,121,122,124,0,125,125,125,125,125,125,125,125,125,125,125,0,0,126,127,126,127,126,126,126,127,126,127,126,0,0,127,126,126,0,0,0,0,126,126,126,127,126,127,126,127,126,127,0,0,0,128,129,130,128,129,130,128,128,129,130,128,128,128,129,130,128,129,128,129,0,128,128,130,129,129,128,129,130,128,129,130,128,129,130,128,129,130,0,131,131,131,131,131,131,131,131,131,131,131,131,131,131,0,0,132,133,134,135,132,133,134,135,132,132,0,132,132,133,134,135,132,133,134,135,133,134,135,132,132,0,132,0,0,132,132,133,134,135,132,133,134,135,132,133,134,135,0,132,132,133,134,135,0,136,136,136,136,136,136,136,136,136,136,136,136,136,0,0,0,0,0,0,0,0,0,0,0,0,137,138,0,139,137,138,140,141,139,142,137,138,140,141,139,142,139,140,139,140,139,140,139,137,138,0,140,139,140,140,139,137,138,140,141,139,142,137,138,140,141,139,142,140,139,141,142,140,139,140,139,140,139,137,138,140,141,139,142,137,138,140,141,139,142,137,138,140,141,139,142,137,138,140,141,139,142,143,143,0,143,143,143,143,143,143,143,0,0,0,0,0,0,144,145,146,147,148,149,144,145,146,147,148,149,144,145,146,148,144,145,146,148,144,145,144,146,0,148,144,145,146,147,148,149,144,145,146,147,148,149,146,148,146,144,146,146,148,148,147,149,146,148,146,148,144,145,146,148,144,145,146,147,148,149,144,145,146,147,148,149,144,145,146,147,148,149,145,144,145,146,147,148,149,0,0,0,150,151,150,151,150,150,150,151,0,150,151,0,150,151,150,150,150,150,150,151,150,151,150,151,150,151,0,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,0,0,0,0,153,154,155,156,153,154,155,156,153,154,155,153,154,155,153,154,153,155,153,154,155,156,153,154,155,156,155,155,153,155,155,156,155,155,155,153,154,155,153,154,155,156,153,154,155,156,153,154,155,156,0,154,153,154,155,156,0,0,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,157,0,0,158,159,158,160,159,158,160,159,159,159,158,159,159,158,160,159,158,160,160,159,159,0,159,159,158,160,159,158,160,159,158,160,159,159,158,160,0,0,0,0,0,0,0,0,0,19,19,161,162,163,161,164,165,166,167,19,162,163,161,164,165,166,167,19,161,19,0,162,163,161,164,165,166,167,19,162,163,161,164,165,166,167,19,19,162,19,19,163,162,163,161,164,165,166,167,19,162,161,165,162,163,161,164,165,166,167,19,162,163,161,164,165,166,167,19,164,163,162,165,162,163,161,164,165,166,167,19,162,165,19,164,165,161,166,167,162,164,165,162,19,164,163,19,0,0,19,19,162,163,161,164,165,166,167,19,162,163,161,164,165,166,167,19,162,163,161,164,165,166,167,19,162,163,161,164,165,166,167,19,164,166,167,162,164,165,162,163,161,164,165,166,167,19,0,0,0,0,168,168,168,168,168,168,168,168,168,168,168,0,0,0,169,170,171,172,169,170,171,172,0,169,170,171,172,169,169,171,171,0,0,169,170,171,172,169,169,171,171,170,172,0,169,170,171,172,169,170,171,172,169,170,171,172,169,170,171,172,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,0,0,0,0,0,173,174,175,173,174,175,173,174,175,173,174,175,173,174,173,174,173,175,173,174,175,173,174,175,173,173,174,175,175,174,0,173,175,173,174,173,174,175,173,174,175,173,174,175,173,174,175,173,173,174,175,0,0,0,0,0,0,0,0,0,0,176,177,176,178,177,176,178,177,177,176,177,176,178,177,176,178,177,178,177,177,0,0,0,177,177,176,178,177,176,178,177,176,178,177,176,178,0,179,179,179,179,179,179,179,179,179,179],"f":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,null,null,null,null,null,null,null,null,null,[[["",0]],["settings",3]],[[["",0]],["filemap",3]],[[["",0]],["str",0]],[[["",0]],["str",0]],[[["",0]],["str",0]],[[["",0]],["str",0]],[[["",0]],["str",0]],[[["",0]],["string",3]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["identityservice",3,[["cookieidentitypolicy",3]]]],[[],["jsonconfig",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[],["result",6]],null,null,null,null,null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[],["result",4]],[[]],[[],["authentication",3,[["routes",3]]]],[[]],null,null,null,null,null,null,[[["serviceconfig",3]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["accountcheckpayload",3]],[[["",0]],["accountcheckresp",3]],[[["",0],["",0]]],[[["",0],["",0]]],null,[[],["result",4]],[[],["result",4]],null,null,[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],null,null,null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[["appservice",3]]],null,[[["serviceconfig",3]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],[[["str",0],["appdata",6]]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["email",3]],[[["",0],["",0]]],[[],["result",4]],null,null,[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[["",0]],["result",4]],[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["changepasswordreqest",3]],[[["",0],["",0]]],null,null,[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[["changepasswordreqest",3]]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[["appservice",3]]],[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["str",0],["updatepassword",3],["data",3]]],null,[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,[[]],null,[[]],[[],["account",3]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,null,null,null,null,[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["secret",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],null,[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["username",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[]],[[["accountcheckpayload",3],["appdata",6]]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],null,null,[[["serviceconfig",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[["",0],["option",4,[["str",0]]]],["string",3]],[[]],null,null,[[],["auth",3]],null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["register",3]],[[["",0]],["login",3]],[[["",0]],["password",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["login",3],["appdata",6]]],null,null,null,[[["register",3],["appdata",6]]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],null,null,null,null,[[["usize",0]],["string",3]],null,[[["serviceconfig",3]]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["mcaptchadetails",3]],[[["",0],["",0]]],null,null,[[],["result",4]],[[],["result",4]],null,[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[["createcaptcha",3],["appdata",6],["str",0]]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["deletecaptcha",3]],[[["",0],["",0]]],null,[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[["",0],["defaultdifficultystrategy",3]],["result",4,[["vec",3,[["level",3]]],["serviceerror",4]]]],[[["",0]],["trafficpattern",3]],[[["",0]],["updatetrafficpattern",3]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,[[],["result",4]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["levels",3]],[[["",0]],["i32levels",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[],["result",4]],[[],["result",4]],null,[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],null,[[]],[[]],[[]],null,[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],[[["str",0],["str",0],["appdata",6]]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,null,[[]],null,[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,null,[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["statspayload",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],null,[[]],[[]],null,[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[],["result",4]],null,[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[]],[[["updatecaptcha",3],["appdata",6],["str",0]]],[[["str",0],["str",0],["str",0],["appdata",6]]],null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["result",4,[["builddetails",3],["builddetailsbuildererror",4]]]],[[["",0]],["result",4,[["health",3],["healthbuildererror",4]]]],null,[[["",0]],["builddetails",3]],[[["",0]],["builddetailsbuilder",3]],[[["",0]],["health",3]],[[["",0]],["healthbuilder",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[]],[[]],[[["",0],["bool",0]],["",0]],null,null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[["uninitializedfielderror",3]]],[[["string",3]]],[[]],[[]],[[]],[[]],[[["uninitializedfielderror",3]]],[[["string",3]]],[[]],[[["",0],["str",0]],["",0]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["option",4]],["bool",0]],[[["",0],["option",4,[["bool",0]]]],["",0]],null,null,[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]],["string",3]],[[["",0]],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0],["str",0]],["",0]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,null,[[["serviceconfig",3]]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[],["result",4]],[[]],[[]],null,[[]],[[]],null,[[["appservice",3]]],[[["",0]],["result",4]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[],["result",4]],[[]],[[]],[[["notification",3]]],[[]],null,null,null,null,null,[[]],[[]],[[]],null,null,null,null,null,null,[[["appservice",3]]],null,[[["",0]],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[["appdata",6],["str",0]]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[],["result",4]],[[],["result",4]],[[]],[[]],[[]],null,null,null,[[]],[[]],[[]],null,null,null,null,[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],null,[[]],null,[[],["notifications",3]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,[[["serviceconfig",3]]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["getconfigpayload",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],null,[[["appdata",6],["str",0]]],[[]],[[]],null,[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[["",0]],["str",0]],null,[[]],[[]],null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["str",0]],null,[[["",0]],["str",0]],null,[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["validationtoken",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["captchavalidateresp",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[["",0],["option",4,[["str",0]]]],["string",3]],[[]],null,[[],["routes",3]],null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,null,null,[[["",0],["addsite",3]]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,null,null,null,null,[[]],[[]],[[],["config",3]],[[],["option",4,[["asyncsmtptransport",3,[["tokio1executor",3]]]]]],[[["",0],["string",3]]],[[]],[[]],null,[[]],[[]],[[["addr",3,[["mastertrait",8]]],["addr",3,[["save",8]]]],["system",3,[["save",8],["mastertrait",8]]]],[[["",0],["removecaptcha",3]]],[[["",0],["rename",3]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0],["verifycaptcharesult",3]]],[[["",0],["work",3]]],[[]],[[]],null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["date",3]],[[["",0],["",0]]],[[["",0]],["string",3]],[[["",0],["formatter",3]],["result",6]],[[["offsetdatetime",3]],["string",3]],[[]],[[]],[[["",0]],["string",3]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]]],[[["",0]],["",0]],[[["",0]],["",0]],[[["appdata",6]]],[[]],null,[[]],[[["appdata",6]]],[[["appdata",6],["duration",3]]],[[["appdata",6],["duration",3]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[]],[[]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["httpresponse",3]],null,[[]],[[]],[[]],[[]],[[],["filenames",4]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],null,[[["serviceconfig",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],null,[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[]],[[["str",0]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["data",3],["str",0],["str",0]]],null,[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[],["result",4]],[[["",0],["",0]],["bool",0]],[[["",0],["serviceerror",4]],["bool",0]],[[["",0],["pageerror",4]],["bool",0]],null,[[["",0]],["httpresponse",3]],[[["",0]],["httpresponse",3]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[["credserror",4]],["serviceerror",4]],[[["parseerror",4]],["serviceerror",4]],[[["captchaerror",4]],["serviceerror",4]],[[["error",4]]],[[["smtperror",3]]],[[["recverror",3]]],[[["mailboxerror",4]]],[[["validationerrors",3]],["serviceerror",4]],[[]],[[["serviceerror",4]]],[[]],[[["error",4]]],[[]],[[]],[[]],[[]],[[["",0],["serviceerror",4]],["bool",0]],[[["",0],["pageerror",4]],["bool",0]],[[["",0]],["result",4]],[[["",0]],["option",4,[["error",8]]]],[[["",0]],["option",4,[["error",8]]]],[[["",0]],["option",4,[["error",8]]]],[[["",0]],["statuscode",3]],[[["",0]],["statuscode",3]],[[["",0]],["string",3]],[[["",0]],["string",3]],[[["",0]],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,[[],["authentication",3,[["routes",3]]]],null,null,[[["serviceconfig",3]]],null,null,null,null,[[["serviceconfig",3]]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[["",0]],["string",3]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[["",0]],["string",3]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[["",0],["option",4,[["str",0]]]],["string",3]],[[]],[[]],null,null,[[],["auth",3]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["sudopage",3]],[[["",0],["",0]]],null,[[]],[[]],[[["str",0],["option",4,[["vec",3]]]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["errorpage",3]],[[["",0],["",0]]],[[["",0]],["string",3]],[[["",0]],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["str",0],["str",0]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[]],[[]],[[]],[[["vec",3,[["mcaptchadetails",3]]]]],null,null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["serviceconfig",3]]],null,null,null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[["notification",3]]],[[]],[[]],null,null,[[]],[[]],[[]],null,null,null,[[["vec",3,[["notification",3]]]]],null,[[["",0]],["string",3]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[]],null,[[]],[[]],null,null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,null,[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,null,null,null,[[["serviceconfig",3]]],null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[["",0]],["advanceindexpage",3]],[[["",0]],["easyindexpage",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[]],[[]],[[["",0]],["string",3]],[[["",0]],["string",3]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[["appservice",3]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["mcaptchaconfig",3]],[[["",0]],["level",3]],[[["",0]],["advanceeditpage",3]],[[["",0]],["easyeditpage",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,[[["mcaptchaconfig",3],["vec",3,[["level",3]]],["string",3]]],[[["string",3],["trafficpattern",3]]],null,[[["appservice",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[]],[[["appdata",6],["identity",3]]],[[]],[[]],null,[[["vec",3,[["mcaptchadetails",3]]]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,null,[[]],[[["",0],["str",0]],["string",3]],[[["",0],["str",0]],["string",3]],[[["",0],["str",0]],["string",3]],[[]],[[["",0],["str",0]],["string",3]],[[]],null,[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["mcaptchaconfig",3]],[[["",0]],["level",3]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,[[["stats",3],["mcaptchaconfig",3],["vec",3,[["level",3]]],["string",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[]],[[]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,[[]],[[["",0],["option",4,[["str",0]]]],["string",3]],[[]],null,[[]],[[],["routes",3]],null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[["",0]],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],[[["serviceconfig",3]]],null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,null,[[["config",3]]],[[["",0]],["server",3]],[[["",0]],["captcha",3]],[[["",0]],["defaultdifficultystrategy",3]],[[["",0]],["smtp",3]],[[["",0]],["databasebuilder",3]],[[["",0]],["database",3]],[[["",0]],["redis",3]],[[["",0]],["settings",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,null,[[["url",3]]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["",0]],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[],["result",4,[["configerror",4]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,[[["config",3]]],[[["config",3],["databasebuilder",3]]],null,null,[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["serviceconfig",3]]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[["",0],["str",0]],["option",4,[["str",0]]]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[]],[[]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["httpresponse",3]],[[["str",0]],["httpresponse",3]],[[]],[[]],[[]],[[]],[[]],[[],["filenames",4]],[[],["filenames",4]],[[]],[[["appservice",3]]],[[["appservice",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["statsunixtimestamp",3]],[[["",0]],["stats",3]],[[["",0]],["statspayload",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,null,[[],["result",4]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[["stats",3]]],[[]],[[]],[[]],null,[[["str",0],["str",0],["pgpool",6]]],null,[[["",0]],["result",4]],[[["",0]],["result",4]],null,null,[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[],["vec",3,[["i64",0]]]],[[]],[[]],[[]],[[["str",0],["str",0],["pgpool",6]]],[[["str",0],["str",0],["pgpool",6]]],[[["str",0],["str",0],["pgpool",6]]],[[["str",0],["pgpool",6]]],[[["str",0],["pgpool",6]]],[[["str",0],["pgpool",6]]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[["",0]],["string",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]]],"p":[[3,"KEY"],[3,"GITHUB"],[3,"HOME"],[3,"SETTINGS_ICON"],[3,"CREDIT_CARD"],[3,"HELP_CIRCLE"],[3,"MESSAGE"],[3,"DOCS_ICON"],[3,"MCAPTCHA_TRANS_ICON"],[3,"BAR_CHART"],[3,"SETTINGS"],[3,"FILES"],[3,"JS"],[3,"CSS"],[3,"MOBILE_CSS"],[3,"VERIFICATIN_WIDGET_JS"],[3,"VERIFICATIN_WIDGET_CSS"],[3,"SOURCE_FILES_OF_INSTANCE"],[3,"Settings"],[3,"Data"],[3,"RedirectQuery"],[3,"AccountCheckPayload"],[3,"AccountCheckResp"],[3,"delete_account"],[3,"Email"],[3,"email_exists"],[3,"set_email"],[3,"UpdatePassword"],[3,"ChangePasswordReqest"],[3,"update_user_password"],[3,"Account"],[3,"Secret"],[3,"get_secret"],[3,"update_user_secret"],[3,"username_exists"],[3,"Username"],[3,"set_username"],[3,"register"],[3,"login"],[3,"signout"],[3,"Auth"],[3,"Register"],[3,"Login"],[3,"Password"],[3,"CreateCaptcha"],[3,"MCaptchaDetails"],[3,"create"],[3,"DeleteCaptcha"],[3,"delete"],[3,"TrafficPattern"],[3,"create"],[3,"UpdateTrafficPattern"],[3,"update"],[3,"Easy"],[3,"get_captcha"],[3,"Levels"],[3,"I32Levels"],[3,"Captcha"],[3,"StatsPayload"],[3,"get"],[3,"Stats"],[3,"update_key"],[3,"UpdateCaptcha"],[3,"update_captcha"],[4,"BuildDetailsBuilderError"],[4,"HealthBuilderError"],[3,"BuildDetails"],[3,"BuildDetailsBuilder"],[3,"build_details"],[3,"Health"],[3,"HealthBuilder"],[3,"health"],[13,"UninitializedField"],[13,"ValidationError"],[13,"UninitializedField"],[13,"ValidationError"],[3,"Meta"],[3,"AddNotification"],[3,"add_notification"],[3,"Notification"],[3,"NotificationResp"],[3,"get_notification"],[3,"MarkReadReq"],[3,"NotificationResp"],[3,"mark_read"],[3,"Notifications"],[3,"GetConfigPayload"],[3,"get_config"],[3,"PoW"],[3,"ValidationToken"],[3,"verify_pow"],[3,"CaptchaValidateResp"],[3,"validate_captcha_token"],[3,"Routes"],[4,"SystemGroup"],[13,"Embedded"],[13,"Redis"],[3,"Date"],[3,"DemoUser"],[3,"Asset"],[3,"dist"],[3,"spec"],[3,"index"],[3,"Docs"],[3,"IndexPage"],[3,"SmtpErrorWrapper"],[4,"ServiceError"],[4,"PageError"],[3,"ErrorToResponse"],[13,"ServiceError"],[13,"UnableToSendEmail"],[13,"CaptchaError"],[3,"INDEX"],[3,"IndexPage"],[3,"login"],[3,"INDEX"],[3,"IndexPage"],[3,"join"],[3,"Auth"],[3,"SudoPage"],[3,"INTERNAL_SERVER_ERROR_BODY"],[3,"UNKNOWN_ERROR_BODY"],[3,"ErrorPage"],[3,"error"],[3,"Errors"],[3,"IndexPage"],[3,"panel"],[3,"Notification"],[3,"IndexPage"],[3,"notifications"],[3,"Panel"],[3,"IndexPage"],[3,"settings"],[3,"delete_account"],[3,"update_secret"],[3,"Settings"],[3,"ADVANCE_INDEX"],[3,"EASY_INDEX"],[3,"EasyIndexPage"],[3,"AdvanceIndexPage"],[3,"advance"],[3,"easy"],[3,"delete_sitekey"],[3,"McaptchaConfig"],[3,"Level"],[3,"AdvanceEditPage"],[3,"advance"],[3,"EasyEditPage"],[3,"easy"],[3,"IndexPage"],[3,"list_sitekeys"],[3,"Sitekey"],[3,"McaptchaConfig"],[3,"Level"],[3,"IndexPage"],[3,"view_sitekey"],[3,"Routes"],[3,"INDEX"],[3,"IndexPage"],[3,"sitemap"],[3,"DefaultDifficultyStrategy"],[3,"Server"],[3,"Captcha"],[3,"Smtp"],[3,"DatabaseBuilder"],[3,"Database"],[3,"Redis"],[3,"FileMap"],[3,"Asset"],[3,"static_files"],[3,"Favicons"],[3,"favicons"],[3,"StatsUnixTimestamp"],[3,"Stats"],[3,"StatsPayload"],[3,"INDEX_PAGE"],[3,"IndexPage"],[3,"show_widget"],[3,"Widget"]]},\ -"tests_migrate":{"doc":"","t":[3,3,12,12,12,11,11,5,5,12,12,12,12,11,11,11,5,12,12,0,12,12,11,11,11,11,3,3,3,3,3,3,3,3,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,12,11,11,11,11,11,11,11,11,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,5,5,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,11,11,11,11,11,11,11,11],"n":["SETTINGS","Settings","__private_field","allow_demo","allow_registration","borrow","borrow_mut","build","cache_bust","captcha","commercial","database","debug","deref","from","into","main","redis","server","settings","smtp","source_code","try_from","try_into","type_id","vzip","Captcha","Database","DatabaseBuilder","DefaultDifficultyStrategy","Redis","Server","Settings","Smtp","allow_demo","allow_registration","avg_traffic_difficulty","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic_difficulty","captcha","check_url","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","commercial","cookie_secret","database","debug","default_difficulty_strategy","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","domain","duration","extract_database_url","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","gc","get_ip","hostname","into","into","into","into","into","into","into","into","ip","name","new","password","password","peak_sustainable_traffic_difficulty","pool","pool","port","port","port","proxy_has_tls","redis","reply","salt","server","set_database_url","set_from_database_url","smtp","source_code","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","url","url","url","url_prefix","username","username","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip"],"q":["tests_migrate","","","","","","","","","","","","","","","","","","","","","","","","","","tests_migrate::settings","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"d":["","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","",""],"i":[0,0,1,2,2,1,1,0,0,2,2,2,2,1,1,1,0,2,2,0,2,2,1,1,1,1,0,0,0,0,0,0,0,0,2,2,3,4,5,3,6,7,8,9,2,4,5,3,6,7,8,9,2,3,2,0,4,5,3,6,7,8,9,2,4,5,3,6,7,8,9,2,2,4,2,2,5,4,5,3,6,7,8,9,2,4,3,7,4,5,3,6,7,8,9,2,4,5,3,6,7,8,9,2,6,5,4,7,4,5,3,6,7,8,9,2,4,7,2,6,7,3,8,9,4,6,7,4,2,6,5,2,0,0,2,2,4,5,3,6,7,8,9,2,4,5,3,6,7,8,9,2,4,5,3,6,7,8,9,2,4,5,3,6,7,8,9,2,6,8,9,4,6,7,4,5,3,6,7,8,9,2],"f":[null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[]],null,null,null,null,[[["",0]],["settings",3]],[[]],[[]],[[]],null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,null,[[["config",3]]],[[["",0]],["server",3]],[[["",0]],["captcha",3]],[[["",0]],["defaultdifficultystrategy",3]],[[["",0]],["smtp",3]],[[["",0]],["databasebuilder",3]],[[["",0]],["database",3]],[[["",0]],["redis",3]],[[["",0]],["settings",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,null,[[["url",3]]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["",0]],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[],["result",4,[["configerror",4]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,[[["config",3]]],[[["config",3],["databasebuilder",3]]],null,null,[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]]],"p":[[3,"SETTINGS"],[3,"Settings"],[3,"DefaultDifficultyStrategy"],[3,"Server"],[3,"Captcha"],[3,"Smtp"],[3,"DatabaseBuilder"],[3,"Database"],[3,"Redis"]]}\ +"db_core":{"doc":"mCaptcha database operations","t":[3,3,8,3,13,3,4,8,3,3,3,3,3,3,3,13,10,10,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,10,10,11,11,11,11,11,11,11,10,10,10,10,12,12,11,11,11,11,11,11,11,11,11,11,11,11,0,12,12,12,12,10,11,11,11,11,11,11,11,11,11,11,11,11,0,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,10,10,10,10,10,10,10,10,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,10,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,0,12,10,0,12,10,10,10,10,12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,12,12,12,10,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,23,13,6,13,13,4,13,6,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,12,16,8,8,8,8,16,10,10,10,5],"n":["AddNotification","Captcha","CloneSPDatabase","CreateCaptcha","Email","Level","Login","MCDatabase","NameHash","Notification","Register","Secret","StatsUnixTimestamp","TrafficPattern","UpdateEmail","Username","add_captcha_levels","add_traffic_pattern","avg_traffic","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic","captcha_exists","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_db","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","config_fetches","config_id","confirms","create_captcha","create_notification","default","default","default","default","default","default","default","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","description","description","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","dev","difficulty_factor","duration","duration","email","email_exists","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","errors","fetch_config_fetched","fetch_confirm","fetch_solve","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_email","get_password","get_secret","get_traffic_pattern","hash","hash","heading","heading","id","into","into","into","into","into","into","into","into","into","into","into","into","key","key","mark_notification_read","message","message","name","ne","ne","ne","ne","ne","ne","ne","ne","ne","ne","ne","ne","new_email","ops","peak_sustainable_traffic","ping","prelude","received","record_confirm","record_fetch","record_solve","register","secret","secret","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","solves","tests","to","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","username","username","username","username_exists","visitor_threshold","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","0","0","async_trait","AccountNotFound","BoxDynError","CaptchaKeyTaken","CaptchaNotFound","DBError","DBError","DBResult","EmailTaken","NotificationNotFound","SecretTaken","TrafficPatternNotFound","UsernameTaken","borrow","borrow_mut","fmt","fmt","from","into","source","to_string","try_from","try_into","type_id","vzip","0","Conn","Connect","DBOps","GetConnection","Migrate","Pool","connect","get_conn","migrate","database_works"],"q":["db_core","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_core::Login","","db_core::dev","db_core::errors","","","","","","","","","","","","","","","","","","","","","","","","db_core::errors::DBError","db_core::ops","","","","","","","","","db_core::tests"],"d":["Data required to add notification","Data representing a captcha","Trait to clone MCDatabase","data requried to create new captcha","email as login","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","type encapsulating username and hashed password of a user","Represents notification","Data required to register a new user","datastructure representing a user’s secret","Captcha statistics with time recorded in UNIX epoch formats","User’s traffic pattern; used in generating a captcha …","data required to update them email of a user","username as login","Add levels to captcha","Add traffic configuration","average traffic of user’s website","","","","","","","","","","","","","","","","","","","","","","","","","trafic that bought the user’s website down; optional","check if captcha exists","","","","","","","","","","","","","clone DB","","","","","","","","","","","","","times at which the configuration were fetched","Database assigned ID","times at which the PoW token was verified","create new captcha","create new notification","","","","","","","","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","description of the captcha","description of the captcha","","","","","","","","","","","","","useful imports for supporting a new database","","cool down duration","cool down duration","Optionally, email of new use","check if email exists","","","","","","","","","","","","","represents all the ways a trait can fail using this crate","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","notification sender","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","get user email","get a user’s password","get a user’s secret","Get traffic configuration","hashed password of new use","hashed password","heading of the notification","heading of the notification","db assigned ID of the notification","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","secret key of the captcha","secret key of the captcha","mark a notification read","message of the notification","mesage of the notification","receiver name of the notification","","","","","","","","","","","","","new email address of the user","meta operations like migration and connecting to a database","the peak traffic that the user’s website can handle","ping DB","useful imports for users working with a supported database","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","secret of new user","user’s secret","","","","","","","","","","","","","times at which the PoW was solved","Test utilities","who is the notification addressed to?","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","username of new user","username of the user","username","check if username exists","","","","","","","","","","","","","","","","","Account not found","Convenience type alias for grouping driver-specific errors","Captcha key is taken","Captcha not found","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Generic result data structure","Email is taken","Notification not found","Secret is taken","Traffic pattern not found","Username is taken","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","database connection type","Create databse connection","Database operations trait(migrations, pool creation and …","Get database connection","database migrations","database specific pool-type","database specific error-type create connection pool","database specific error-type get connection from …","database specific error-type run migrations","test all database functions"],"i":[0,0,0,0,1,0,0,0,0,0,0,0,0,0,0,1,2,2,3,4,5,1,6,7,8,9,10,3,11,12,13,4,5,1,6,7,8,9,10,3,11,12,13,3,2,4,5,1,6,7,8,9,10,3,11,12,13,14,4,5,1,6,7,8,9,10,3,11,12,13,7,12,7,2,2,7,8,9,3,11,12,13,2,2,2,2,11,12,4,5,1,6,7,8,9,10,3,11,12,13,0,10,11,12,4,2,4,5,1,6,7,8,9,10,3,11,12,13,0,2,2,2,4,5,1,6,7,8,9,10,3,11,12,13,4,5,1,6,7,8,9,10,3,11,12,13,9,2,2,2,2,2,2,2,2,2,4,6,8,9,8,4,5,1,6,7,8,9,10,3,11,12,13,11,12,2,8,9,8,4,5,1,6,7,8,9,10,3,11,12,13,5,0,3,2,0,8,2,2,2,2,4,13,4,5,1,6,7,8,9,10,3,11,12,13,7,0,9,4,5,1,6,7,8,9,10,3,11,12,13,4,5,1,6,7,8,9,10,3,11,12,13,4,5,1,6,7,8,9,10,3,11,12,13,4,5,1,6,7,8,9,10,3,11,12,13,2,2,2,2,2,2,4,5,6,2,10,4,5,1,6,7,8,9,10,3,11,12,13,15,16,0,17,0,17,17,0,17,0,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,17,18,19,0,0,0,0,20,20,19,21,0],"f":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8]]]]]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0]],["register",3]],[[["",0]],["updateemail",3]],[[["",0]],["login",4]],[[["",0]],["namehash",3]],[[["",0]],["statsunixtimestamp",3]],[[["",0]],["notification",3]],[[["",0]],["addnotification",3]],[[["",0]],["level",3]],[[["",0]],["trafficpattern",3]],[[["",0]],["createcaptcha",3]],[[["",0]],["captcha",3]],[[["",0]],["secret",3]],[[["",0]],["box",3,[["mcdatabase",8]]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8]]]]]],[[],["statsunixtimestamp",3]],[[],["notification",3]],[[],["addnotification",3]],[[],["trafficpattern",3]],[[],["createcaptcha",3]],[[],["captcha",3]],[[],["secret",3]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4,[["level",3]]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["register",3]],["bool",0]],[[["",0],["updateemail",3]],["bool",0]],[[["",0],["login",4]],["bool",0]],[[["",0],["namehash",3]],["bool",0]],[[["",0],["statsunixtimestamp",3]],["bool",0]],[[["",0],["notification",3]],["bool",0]],[[["",0],["addnotification",3]],["bool",0]],[[["",0],["level",3]],["bool",0]],[[["",0],["trafficpattern",3]],["bool",0]],[[["",0],["createcaptcha",3]],["bool",0]],[[["",0],["captcha",3]],["bool",0]],[[["",0],["secret",3]],["bool",0]],null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8]]]]]],null,null,null,[[["",0],["register",3]],["bool",0]],[[["",0],["updateemail",3]],["bool",0]],[[["",0],["login",4]],["bool",0]],[[["",0],["namehash",3]],["bool",0]],[[["",0],["statsunixtimestamp",3]],["bool",0]],[[["",0],["notification",3]],["bool",0]],[[["",0],["addnotification",3]],["bool",0]],[[["",0],["level",3]],["bool",0]],[[["",0],["trafficpattern",3]],["bool",0]],[[["",0],["createcaptcha",3]],["bool",0]],[[["",0],["captcha",3]],["bool",0]],[[["",0],["secret",3]],["bool",0]],null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8]]]]]],null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8]]]]]],null,null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],null,null,null,[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[["",0]],["option",4,[["error",8]]]],[[["",0]],["string",3]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,null,null,null,null,[[],["pin",3,[["box",3,[["future",8]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["register",3],["createcaptcha",3],["trafficpattern",3],["addnotification",3]]]],"p":[[4,"Login"],[8,"MCDatabase"],[3,"TrafficPattern"],[3,"Register"],[3,"UpdateEmail"],[3,"NameHash"],[3,"StatsUnixTimestamp"],[3,"Notification"],[3,"AddNotification"],[3,"Level"],[3,"CreateCaptcha"],[3,"Captcha"],[3,"Secret"],[8,"CloneSPDatabase"],[13,"Username"],[13,"Email"],[4,"DBError"],[13,"DBError"],[8,"GetConnection"],[8,"Connect"],[8,"Migrate"]]},\ +"db_sqlx_postgres":{"doc":"","t":[12,3,4,3,13,3,13,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,12,11,12,11,11,12,12,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,12,12,13,13,3,3,6,6,3,3,13,13,13,13,8,8,13,13,13,13,16,16,8,8,3,3,4,4,13,13,8,8,6,6,13,13,13,13,13,13,4,8,8,13,3,3,4,4,8,8,8,8,13,3,3,3,3,13,13,16,16,13,13,13,3,3,13,3,3,13,13,3,3,13,3,3,13,13,13,3,3,13,13,13,13,13,10,10,10,10,11,23,12,12,11,11,12,12,10,10,10,10,12,12,12,12,12,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,0,12,12,12,12,12,12,12,12,10,10,0,0,10,10,10,10,10,10,11,11,11,11,11,11,11,12,12,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,12,12,12,11,11,12,12,12,12,10,10,12,12,12,12,10,10,12,12,12,12,0,0,12,12,10,10,0,12,12,10,10,10,10,10,10,10,10,12,12,12,12,12,12,11,0,0,12,12,11,11,11,11,10,10,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,10,10,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,13,3,6,3,13,13,8,16,8,3,4,13,8,6,13,13,8,3,4,8,8,3,3,13,16,3,3,13,3,3,13,3,13,13,10,10,23,12,12,10,10,12,12,12,10,10,10,10,10,10,10,12,12,12,12,12,12,10,10,10,10,12,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,10,12,12,10,12,12,12,10,0,12,10,10,10,10,12,12,12,12,10,10,10,10,10,10,12,12,12,10,12,12,12,12,13,3,6,3,13,13,8,16,8,3,4,13,8,6,13,13,8,3,4,8,8,3,3,13,16,3,3,13,3,3,13,3,13,13,10,10,12,12,10,10,12,12,12,10,10,10,10,10,10,10,12,12,12,12,12,12,10,10,10,10,12,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,10,12,12,10,12,12,12,10,12,10,10,10,10,12,12,12,12,10,10,10,10,10,10,12,12,12,10,12,12,12,12,13,13,6,6,13,13,13,13,4,4,13,13,6,6,13,13,13,13,13,13,13,13,13,13,12,12,16,16,8,8,8,8,8,8,8,8,16,16,10,10,10,10,10,10,13,3,6,3,13,13,8,16,8,3,4,13,8,6,13,13,8,3,4,8,8,3,3,13,16,3,3,13,3,3,13,3,13,13,10,10,12,12,10,10,12,12,12,10,10,10,10,10,10,10,12,12,0,12,12,12,12,10,10,10,10,12,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,10,12,12,10,12,12,12,10,12,10,10,10,10,12,12,12,12,10,10,10,10,10,10,12,12,12,10,12,12,12,12,13,3,6,3,13,13,8,16,8,3,4,13,8,6,13,13,8,3,4,8,8,3,3,13,16,3,3,13,3,3,13,3,13,13,10,10,23,12,12,10,10,12,12,12,10,10,10,10,10,10,10,12,12,12,12,12,12,10,10,10,10,12,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,10,12,12,10,12,12,12,10,12,10,10,10,10,12,12,12,12,10,10,10,10,10,10,12,12,12,10,12,12,12,12,5,5,5,5,13,3,6,3,13,13,8,16,8,3,4,13,8,6,13,13,8,3,4,8,8,3,3,13,16,3,3,13,3,3,13,3,13,13,10,10,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,11,11,11,11,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,12,12,12,10,10,10,11,11,11,11,11,11,11,10,10,10,10,12,12,11,11,11,11,11,11,11,11,11,11,11,0,12,12,12,12,10,11,11,11,11,11,11,11,11,11,11,11,0,10,10,10,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,10,12,12,10,12,11,11,11,11,11,11,11,11,11,11,11,12,0,12,10,12,10,10,10,10,12,12,11,11,11,11,11,11,11,11,11,11,11,12,11,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,10,10,10,10,10,10,12,12,12,10,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,13,3,6,3,13,13,8,16,8,3,4,13,8,6,13,13,8,3,4,8,8,3,3,13,16,3,3,13,3,3,13,3,13,13,10,10,23,12,12,10,10,12,12,12,10,10,10,10,10,10,10,12,12,12,12,12,12,10,10,10,10,12,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,12,12,10,12,12,10,12,12,12,10,0,12,10,10,10,10,12,12,12,12,10,10,10,10,10,10,12,12,12,10,12,12,12,12,13,3,6,3,13,13,8,16,8,3,4,13,8,6,13,13,8,3,4,8,8,3,3,13,16,3,3,13,3,3,13,3,13,13,10,10,12,11,11,12,10,11,10,11,12,12,12,10,10,10,10,10,10,10,12,12,11,12,12,12,12,10,11,10,10,10,11,11,12,10,10,10,10,10,10,10,10,10,10,12,12,12,12,12,11,12,12,10,12,12,10,12,11,12,12,10,12,10,10,10,10,12,12,11,12,12,11,11,11,11,10,10,10,10,10,10,12,12,12,10,12,11,12,12,12,13,6,13,13,4,13,6,13,13,13,13,13,12,16,8,8,8,8,16,10,10,10,5],"n":["0","Conn","ConnectionOptions","Database","Existing","Fresh","Fresh","InnerNotification","add_captcha_levels","add_traffic_pattern","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","captcha_exists","clone","clone","clone_db","clone_into","clone_into","connect","create_captcha","create_notification","default","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","dev","email_exists","eq","errors","fetch_config_fetched","fetch_confirm","fetch_solve","fmt","from","from","from","from","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_email","get_password","get_secret","get_traffic_pattern","heading","id","into","into","into","into","into","mark_notification_read","message","migrate","name","ne","ping","pool","pool_options","prelude","received","record_confirm","record_fetch","record_solve","register","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","url","username_exists","vzip","vzip","vzip","vzip","vzip","0","0","AccountNotFound","AccountNotFound","AddNotification","AddNotification","BoxDynError","BoxDynError","Captcha","Captcha","CaptchaKeyTaken","CaptchaKeyTaken","CaptchaNotFound","CaptchaNotFound","CloneSPDatabase","CloneSPDatabase","ColumnDecode","ColumnIndexOutOfBounds","ColumnNotFound","Configuration","Conn","Conn","Connect","Connect","CreateCaptcha","CreateCaptcha","DBError","DBError","DBError","DBError","DBOps","DBOps","DBResult","DBResult","Database","Decode","Email","Email","EmailTaken","EmailTaken","Error","GetConnection","GetConnection","Io","Level","Level","Login","Login","MCDatabase","MCDatabase","Migrate","Migrate","Migrate","NameHash","NameHash","Notification","Notification","NotificationNotFound","NotificationNotFound","Pool","Pool","PoolClosed","PoolTimedOut","Protocol","Register","Register","RowNotFound","Secret","Secret","SecretTaken","SecretTaken","StatsUnixTimestamp","StatsUnixTimestamp","Tls","TrafficPattern","TrafficPattern","TrafficPatternNotFound","TrafficPatternNotFound","TypeNotFound","UpdateEmail","UpdateEmail","Username","Username","UsernameTaken","UsernameTaken","WorkerCrashed","add_captcha_levels","add_captcha_levels","add_traffic_pattern","add_traffic_pattern","as_database_error","async_trait","avg_traffic","avg_traffic","borrow","borrow_mut","broke_my_site_traffic","broke_my_site_traffic","captcha_exists","captcha_exists","clone_db","clone_db","config_fetches","config_fetches","config_id","config_id","confirms","confirms","connect","connect","create_captcha","create_captcha","create_notification","create_notification","delete_captcha","delete_captcha","delete_captcha_levels","delete_captcha_levels","delete_traffic_pattern","delete_traffic_pattern","delete_user","delete_user","description","description","description","description","dev","difficulty_factor","difficulty_factor","duration","duration","duration","duration","email","email","email_exists","email_exists","errors","errors","fetch_config_fetched","fetch_config_fetched","fetch_confirm","fetch_confirm","fetch_solve","fetch_solve","fmt","fmt","from","from","from","from","from","from","from","get_all_unread_notifications","get_all_unread_notifications","get_all_user_captchas","get_all_user_captchas","get_captcha_config","get_captcha_config","get_captcha_cooldown","get_captcha_cooldown","get_captcha_levels","get_captcha_levels","get_conn","get_conn","get_email","get_email","get_password","get_password","get_secret","get_secret","get_traffic_pattern","get_traffic_pattern","hash","hash","hash","hash","heading","heading","heading","heading","id","id","into","into_database_error","key","key","key","key","mark_notification_read","mark_notification_read","message","message","message","message","migrate","migrate","name","name","new_email","new_email","ops","ops","peak_sustainable_traffic","peak_sustainable_traffic","ping","ping","prelude","received","received","record_confirm","record_confirm","record_fetch","record_fetch","record_solve","record_solve","register","register","secret","secret","secret","secret","solves","solves","source","tests","tests","to","to","to_string","try_from","try_into","type_id","update_captcha_key","update_captcha_key","update_captcha_metadata","update_captcha_metadata","update_email","update_email","update_password","update_password","update_secret","update_secret","update_username","update_username","username","username","username","username","username","username","username_exists","username_exists","visitor_threshold","visitor_threshold","vzip","0","0","0","0","0","0","0","0","0","0","index","index","len","source","type_name","0","0","0","0","AccountNotFound","AddNotification","BoxDynError","Captcha","CaptchaKeyTaken","CaptchaNotFound","CloneSPDatabase","Conn","Connect","CreateCaptcha","DBError","DBError","DBOps","DBResult","Email","EmailTaken","GetConnection","Level","Login","MCDatabase","Migrate","NameHash","Notification","NotificationNotFound","Pool","Register","Secret","SecretTaken","StatsUnixTimestamp","TrafficPattern","TrafficPatternNotFound","UpdateEmail","Username","UsernameTaken","add_captcha_levels","add_traffic_pattern","async_trait","avg_traffic","broke_my_site_traffic","captcha_exists","clone_db","config_fetches","config_id","confirms","connect","create_captcha","create_notification","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","description","description","difficulty_factor","duration","duration","email","email_exists","fetch_config_fetched","fetch_confirm","fetch_solve","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_conn","get_email","get_password","get_secret","get_traffic_pattern","hash","hash","heading","heading","id","key","key","mark_notification_read","message","message","migrate","name","new_email","peak_sustainable_traffic","ping","prelude","received","record_confirm","record_fetch","record_solve","register","secret","secret","solves","to","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","username","username","username","username_exists","visitor_threshold","0","0","0","AccountNotFound","AddNotification","BoxDynError","Captcha","CaptchaKeyTaken","CaptchaNotFound","CloneSPDatabase","Conn","Connect","CreateCaptcha","DBError","DBError","DBOps","DBResult","Email","EmailTaken","GetConnection","Level","Login","MCDatabase","Migrate","NameHash","Notification","NotificationNotFound","Pool","Register","Secret","SecretTaken","StatsUnixTimestamp","TrafficPattern","TrafficPatternNotFound","UpdateEmail","Username","UsernameTaken","add_captcha_levels","add_traffic_pattern","avg_traffic","broke_my_site_traffic","captcha_exists","clone_db","config_fetches","config_id","confirms","connect","create_captcha","create_notification","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","description","description","difficulty_factor","duration","duration","email","email_exists","fetch_config_fetched","fetch_confirm","fetch_solve","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_conn","get_email","get_password","get_secret","get_traffic_pattern","hash","hash","heading","heading","id","key","key","mark_notification_read","message","message","migrate","name","new_email","peak_sustainable_traffic","ping","received","record_confirm","record_fetch","record_solve","register","secret","secret","solves","to","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","username","username","username","username_exists","visitor_threshold","0","0","0","AccountNotFound","AccountNotFound","BoxDynError","BoxDynError","CaptchaKeyTaken","CaptchaKeyTaken","CaptchaNotFound","CaptchaNotFound","DBError","DBError","DBError","DBError","DBResult","DBResult","EmailTaken","EmailTaken","NotificationNotFound","NotificationNotFound","SecretTaken","SecretTaken","TrafficPatternNotFound","TrafficPatternNotFound","UsernameTaken","UsernameTaken","0","0","Conn","Conn","Connect","Connect","DBOps","DBOps","GetConnection","GetConnection","Migrate","Migrate","Pool","Pool","connect","connect","get_conn","get_conn","migrate","migrate","AccountNotFound","AddNotification","BoxDynError","Captcha","CaptchaKeyTaken","CaptchaNotFound","CloneSPDatabase","Conn","Connect","CreateCaptcha","DBError","DBError","DBOps","DBResult","Email","EmailTaken","GetConnection","Level","Login","MCDatabase","Migrate","NameHash","Notification","NotificationNotFound","Pool","Register","Secret","SecretTaken","StatsUnixTimestamp","TrafficPattern","TrafficPatternNotFound","UpdateEmail","Username","UsernameTaken","add_captcha_levels","add_traffic_pattern","avg_traffic","broke_my_site_traffic","captcha_exists","clone_db","config_fetches","config_id","confirms","connect","create_captcha","create_notification","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","description","description","dev","difficulty_factor","duration","duration","email","email_exists","fetch_config_fetched","fetch_confirm","fetch_solve","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_conn","get_email","get_password","get_secret","get_traffic_pattern","hash","hash","heading","heading","id","key","key","mark_notification_read","message","message","migrate","name","new_email","peak_sustainable_traffic","ping","received","record_confirm","record_fetch","record_solve","register","secret","secret","solves","to","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","username","username","username","username_exists","visitor_threshold","0","0","0","AccountNotFound","AddNotification","BoxDynError","Captcha","CaptchaKeyTaken","CaptchaNotFound","CloneSPDatabase","Conn","Connect","CreateCaptcha","DBError","DBError","DBOps","DBResult","Email","EmailTaken","GetConnection","Level","Login","MCDatabase","Migrate","NameHash","Notification","NotificationNotFound","Pool","Register","Secret","SecretTaken","StatsUnixTimestamp","TrafficPattern","TrafficPatternNotFound","UpdateEmail","Username","UsernameTaken","add_captcha_levels","add_traffic_pattern","async_trait","avg_traffic","broke_my_site_traffic","captcha_exists","clone_db","config_fetches","config_id","confirms","connect","create_captcha","create_notification","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","description","description","difficulty_factor","duration","duration","email","email_exists","fetch_config_fetched","fetch_confirm","fetch_solve","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_conn","get_email","get_password","get_secret","get_traffic_pattern","hash","hash","heading","heading","id","key","key","mark_notification_read","message","message","migrate","name","new_email","peak_sustainable_traffic","ping","received","record_confirm","record_fetch","record_solve","register","secret","secret","solves","to","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","username","username","username","username_exists","visitor_threshold","0","0","0","database_works","database_works","map_register_err","map_row_not_found_err","AccountNotFound","AddNotification","BoxDynError","Captcha","CaptchaKeyTaken","CaptchaNotFound","CloneSPDatabase","Conn","Connect","CreateCaptcha","DBError","DBError","DBOps","DBResult","Email","EmailTaken","GetConnection","Level","Login","MCDatabase","Migrate","NameHash","Notification","NotificationNotFound","Pool","Register","Secret","SecretTaken","StatsUnixTimestamp","TrafficPattern","TrafficPatternNotFound","UpdateEmail","Username","UsernameTaken","add_captcha_levels","add_traffic_pattern","avg_traffic","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic","captcha_exists","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone","clone_db","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","config_fetches","config_id","confirms","connect","create_captcha","create_notification","default","default","default","default","default","default","default","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","description","description","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","dev","difficulty_factor","duration","duration","email","email_exists","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","eq","errors","fetch_config_fetched","fetch_confirm","fetch_solve","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_conn","get_email","get_password","get_secret","get_traffic_pattern","hash","hash","heading","heading","id","into","into","into","into","into","into","into","into","into","into","into","into","key","key","mark_notification_read","message","message","migrate","name","ne","ne","ne","ne","ne","ne","ne","ne","ne","ne","ne","new_email","ops","peak_sustainable_traffic","ping","received","record_confirm","record_fetch","record_solve","register","secret","secret","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","serialize","solves","source","tests","to","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","username","username","username","username_exists","visitor_threshold","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","0","0","0","AccountNotFound","AddNotification","BoxDynError","Captcha","CaptchaKeyTaken","CaptchaNotFound","CloneSPDatabase","Conn","Connect","CreateCaptcha","DBError","DBError","DBOps","DBResult","Email","EmailTaken","GetConnection","Level","Login","MCDatabase","Migrate","NameHash","Notification","NotificationNotFound","Pool","Register","Secret","SecretTaken","StatsUnixTimestamp","TrafficPattern","TrafficPatternNotFound","UpdateEmail","Username","UsernameTaken","add_captcha_levels","add_traffic_pattern","async_trait","avg_traffic","broke_my_site_traffic","captcha_exists","clone_db","config_fetches","config_id","confirms","connect","create_captcha","create_notification","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","description","description","difficulty_factor","duration","duration","email","email_exists","fetch_config_fetched","fetch_confirm","fetch_solve","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_conn","get_email","get_password","get_secret","get_traffic_pattern","hash","hash","heading","heading","id","key","key","mark_notification_read","message","message","migrate","name","new_email","peak_sustainable_traffic","ping","prelude","received","record_confirm","record_fetch","record_solve","register","secret","secret","solves","to","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","username","username","username","username_exists","visitor_threshold","0","0","0","AccountNotFound","AddNotification","BoxDynError","Captcha","CaptchaKeyTaken","CaptchaNotFound","CloneSPDatabase","Conn","Connect","CreateCaptcha","DBError","DBError","DBOps","DBResult","Email","EmailTaken","GetConnection","Level","Login","MCDatabase","Migrate","NameHash","Notification","NotificationNotFound","Pool","Register","Secret","SecretTaken","StatsUnixTimestamp","TrafficPattern","TrafficPatternNotFound","UpdateEmail","Username","UsernameTaken","add_captcha_levels","add_traffic_pattern","avg_traffic","borrow","borrow_mut","broke_my_site_traffic","captcha_exists","clone","clone_db","clone_into","config_fetches","config_id","confirms","connect","create_captcha","create_notification","delete_captcha","delete_captcha_levels","delete_traffic_pattern","delete_user","description","description","deserialize","difficulty_factor","duration","duration","email","email_exists","eq","fetch_config_fetched","fetch_confirm","fetch_solve","fmt","from","from","get_all_unread_notifications","get_all_user_captchas","get_captcha_config","get_captcha_cooldown","get_captcha_levels","get_conn","get_email","get_password","get_secret","get_traffic_pattern","hash","hash","heading","heading","id","into","key","key","mark_notification_read","message","message","migrate","name","ne","new_email","peak_sustainable_traffic","ping","received","record_confirm","record_fetch","record_solve","register","secret","secret","serialize","solves","to","to_owned","try_from","try_into","type_id","update_captcha_key","update_captcha_metadata","update_email","update_password","update_secret","update_username","username","username","username","username_exists","visitor_threshold","vzip","0","0","0","AccountNotFound","BoxDynError","CaptchaKeyTaken","CaptchaNotFound","DBError","DBError","DBResult","EmailTaken","NotificationNotFound","SecretTaken","TrafficPatternNotFound","UsernameTaken","0","Conn","Connect","DBOps","GetConnection","Migrate","Pool","connect","get_conn","migrate","database_works"],"q":["db_sqlx_postgres","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::ConnectionOptions","","db_sqlx_postgres::dev","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::dev::DBError","","db_sqlx_postgres::dev::Error","","","","","","","","","","","","","db_sqlx_postgres::dev::Login","","","","db_sqlx_postgres::dev::dev","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::dev::dev::DBError","db_sqlx_postgres::dev::dev::Login","","db_sqlx_postgres::dev::dev::prelude","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::dev::dev::prelude::DBError","db_sqlx_postgres::dev::dev::prelude::Login","","db_sqlx_postgres::dev::errors","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::dev::errors::DBError","","db_sqlx_postgres::dev::ops","","","","","","","","","","","","","","","","","","db_sqlx_postgres::dev::prelude","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::dev::prelude::DBError","db_sqlx_postgres::dev::prelude::Login","","db_sqlx_postgres::dev::prelude::dev","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::dev::prelude::dev::DBError","db_sqlx_postgres::dev::prelude::dev::Login","","db_sqlx_postgres::dev::tests","","db_sqlx_postgres::errors","","db_sqlx_postgres::prelude","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::prelude::DBError","db_sqlx_postgres::prelude::Login","","db_sqlx_postgres::prelude::dev","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::prelude::dev::DBError","db_sqlx_postgres::prelude::dev::Login","","db_sqlx_postgres::prelude::dev::prelude","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","db_sqlx_postgres::prelude::dev::prelude::DBError","db_sqlx_postgres::prelude::dev::prelude::Login","","db_sqlx_postgres::prelude::errors","","","","","","","","","","","","db_sqlx_postgres::prelude::errors::DBError","db_sqlx_postgres::prelude::ops","","","","","","","","","db_sqlx_postgres::prelude::tests"],"d":["","Use an existing database pool","Connect to databse","","existing connection","","fresh connection","Represents notification","Add levels to captcha","Add traffic configuration","","","","","","","","","","","check if captcha exists","","","","","","","create new captcha","create new notification","","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","","check if email exists","","Error-handling utilities","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","get user email","get a user’s password","get a user’s secret","Get traffic configuration","heading of the notification","db assigned ID of the notification","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","mark a notification read","message of the notification","","receiver name of the notification","","ping DB","","","","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","","","","","","","","","","","","","","","","","","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","","check if username exists","","","","","","","","Account not found","Account not found","Data required to add notification","Data required to add notification","Convenience type alias for grouping driver-specific errors","Convenience type alias for grouping driver-specific errors","Data representing a captcha","Data representing a captcha","Captcha key is taken","Captcha key is taken","Captcha not found","Captcha not found","Trait to clone MCDatabase","Trait to clone MCDatabase","Error occurred while decoding a value from a specific …","Column index was out of bounds.","No column found for the given name.","Error occurred while parsing a connection string.","database connection type","database connection type","Create databse connection","Create databse connection","data requried to create new captcha","data requried to create new captcha","Error data structure grouping various error subtypes","Error data structure grouping various error subtypes","errors that are specific to a database implementation","errors that are specific to a database implementation","Database operations trait(migrations, pool creation and …","Database operations trait(migrations, pool creation and …","Generic result data structure","Generic result data structure","Error returned from the database.","Error occurred while decoding a value.","email as login","email as login","Email is taken","Email is taken","Represents all the ways a method can fail within SQLx.","Get database connection","Get database connection","Error communicating with the database backend.","Level struct that describes threshold-difficulty factor …","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","mCaptcha’s database requirements. To implement support …","database migrations","database migrations","","type encapsulating username and hashed password of a user","type encapsulating username and hashed password of a user","Represents notification","Represents notification","Notification not found","Notification not found","database specific pool-type","database specific pool-type","Pool::close was called while we were waiting in …","A Pool::acquire timed out due to connections not becoming …","Unexpected or invalid data encountered while communicating …","Data required to register a new user","Data required to register a new user","No rows returned by a query that expected to return at …","datastructure representing a user’s secret","datastructure representing a user’s secret","Secret is taken","Secret is taken","Captcha statistics with time recorded in UNIX epoch formats","Captcha statistics with time recorded in UNIX epoch formats","Error occurred while attempting to establish a TLS …","User’s traffic pattern; used in generating a captcha …","User’s traffic pattern; used in generating a captcha …","Traffic pattern not found","Traffic pattern not found","Type in query doesn’t exist. Likely due to typo or …","data required to update them email of a user","data required to update them email of a user","username as login","username as login","Username is taken","Username is taken","A background worker has crashed.","Add levels to captcha","Add levels to captcha","Add traffic configuration","Add traffic configuration","","","average traffic of user’s website","average traffic of user’s website","","","trafic that bought the user’s website down; optional","trafic that bought the user’s website down; optional","check if captcha exists","check if captcha exists","clone DB","clone DB","times at which the configuration were fetched","times at which the configuration were fetched","Database assigned ID","Database assigned ID","times at which the PoW token was verified","times at which the PoW token was verified","database specific error-type create connection pool","database specific error-type create connection pool","create new captcha","create new captcha","create new notification","create new notification","Delete captcha","Delete captcha","Delete all levels of a captcha","Delete all levels of a captcha","Delete traffic configuration","Delete traffic configuration","delete a user","delete a user","description of the captcha","description of the captcha","description of the captcha","description of the captcha","useful imports for supporting a new database","","","cool down duration","cool down duration","cool down duration","cool down duration","Optionally, email of new use","Optionally, email of new use","check if email exists","check if email exists","represents all the ways a trait can fail using this crate","represents all the ways a trait can fail using this crate","featch PoWConfig fetches","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig confirms","featch PoWConfig solves","featch PoWConfig solves","","","Returns the argument unchanged.","","","","","notification sender","notification sender","get all unread notifications","get all unread notifications","Get all captchas belonging to user","Get all captchas belonging to user","Get captcha config","Get captcha config","Get captcha’s cooldown period","Get captcha’s cooldown period","Get captcha levels","Get captcha levels","database specific error-type get connection from …","database specific error-type get connection from …","get user email","get user email","get a user’s password","get a user’s password","get a user’s secret","get a user’s secret","Get traffic configuration","Get traffic configuration","hashed password of new use","hashed password of new use","hashed password","hashed password","heading of the notification","heading of the notification","heading of the notification","heading of the notification","db assigned ID of the notification","db assigned ID of the notification","Calls U::from(self).","","secret key of the captcha","secret key of the captcha","secret key of the captcha","secret key of the captcha","mark a notification read","mark a notification read","message of the notification","message of the notification","mesage of the notification","mesage of the notification","database specific error-type run migrations","database specific error-type run migrations","receiver name of the notification","receiver name of the notification","new email address of the user","new email address of the user","meta operations like migration and connecting to a database","meta operations like migration and connecting to a database","the peak traffic that the user’s website can handle","the peak traffic that the user’s website can handle","ping DB","ping DB","useful imports for users working with a supported database","when notification was received","when notification was received","record PoWConfig confirms","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig fetches","record PoWConfig solves","record PoWConfig solves","register a new user","register a new user","secret of new user","secret of new user","user’s secret","user’s secret","times at which the PoW was solved","times at which the PoW was solved","","Test utilities","Test utilities","who is the notification addressed to?","who is the notification addressed to?","","","","","update captcha key; doesn’t change metadata","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update captcha metadata; doesn’t change captcha key","update a user’s email","update a user’s email","update user’s password","update user’s password","update a user’s secret","update a user’s secret","update username","update username","username of new user","username of new user","username of the user","username of the user","username","username","check if username exists","check if username exists","","","","","","","","","","","","","","","","","","","","","","","Account not found","Data required to add notification","Convenience type alias for grouping driver-specific errors","Data representing a captcha","Captcha key is taken","Captcha not found","Trait to clone MCDatabase","database connection type","Create databse connection","data requried to create new captcha","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Database operations trait(migrations, pool creation and …","Generic result data structure","email as login","Email is taken","Get database connection","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","database migrations","type encapsulating username and hashed password of a user","Represents notification","Notification not found","database specific pool-type","Data required to register a new user","datastructure representing a user’s secret","Secret is taken","Captcha statistics with time recorded in UNIX epoch formats","User’s traffic pattern; used in generating a captcha …","Traffic pattern not found","data required to update them email of a user","username as login","Username is taken","Add levels to captcha","Add traffic configuration","","average traffic of user’s website","trafic that bought the user’s website down; optional","check if captcha exists","clone DB","times at which the configuration were fetched","Database assigned ID","times at which the PoW token was verified","database specific error-type create connection pool","create new captcha","create new notification","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","description of the captcha","description of the captcha","","cool down duration","cool down duration","Optionally, email of new use","check if email exists","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","notification sender","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","database specific error-type get connection from …","get user email","get a user’s password","get a user’s secret","Get traffic configuration","hashed password of new use","hashed password","heading of the notification","heading of the notification","db assigned ID of the notification","secret key of the captcha","secret key of the captcha","mark a notification read","message of the notification","mesage of the notification","database specific error-type run migrations","receiver name of the notification","new email address of the user","the peak traffic that the user’s website can handle","ping DB","useful imports for users working with a supported database","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","secret of new user","user’s secret","times at which the PoW was solved","who is the notification addressed to?","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","username of new user","username of the user","username","check if username exists","","","","","Account not found","Data required to add notification","Convenience type alias for grouping driver-specific errors","Data representing a captcha","Captcha key is taken","Captcha not found","Trait to clone MCDatabase","database connection type","Create databse connection","data requried to create new captcha","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Database operations trait(migrations, pool creation and …","Generic result data structure","email as login","Email is taken","Get database connection","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","database migrations","type encapsulating username and hashed password of a user","Represents notification","Notification not found","database specific pool-type","Data required to register a new user","datastructure representing a user’s secret","Secret is taken","Captcha statistics with time recorded in UNIX epoch formats","User’s traffic pattern; used in generating a captcha …","Traffic pattern not found","data required to update them email of a user","username as login","Username is taken","Add levels to captcha","Add traffic configuration","average traffic of user’s website","trafic that bought the user’s website down; optional","check if captcha exists","clone DB","times at which the configuration were fetched","Database assigned ID","times at which the PoW token was verified","database specific error-type create connection pool","create new captcha","create new notification","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","description of the captcha","description of the captcha","","cool down duration","cool down duration","Optionally, email of new use","check if email exists","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","notification sender","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","database specific error-type get connection from …","get user email","get a user’s password","get a user’s secret","Get traffic configuration","hashed password of new use","hashed password","heading of the notification","heading of the notification","db assigned ID of the notification","secret key of the captcha","secret key of the captcha","mark a notification read","message of the notification","mesage of the notification","database specific error-type run migrations","receiver name of the notification","new email address of the user","the peak traffic that the user’s website can handle","ping DB","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","secret of new user","user’s secret","times at which the PoW was solved","who is the notification addressed to?","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","username of new user","username of the user","username","check if username exists","","","","","Account not found","Account not found","Convenience type alias for grouping driver-specific errors","Convenience type alias for grouping driver-specific errors","Captcha key is taken","Captcha key is taken","Captcha not found","Captcha not found","Error data structure grouping various error subtypes","Error data structure grouping various error subtypes","errors that are specific to a database implementation","errors that are specific to a database implementation","Generic result data structure","Generic result data structure","Email is taken","Email is taken","Notification not found","Notification not found","Secret is taken","Secret is taken","Traffic pattern not found","Traffic pattern not found","Username is taken","Username is taken","","","database connection type","database connection type","Create databse connection","Create databse connection","Database operations trait(migrations, pool creation and …","Database operations trait(migrations, pool creation and …","Get database connection","Get database connection","database migrations","database migrations","database specific pool-type","database specific pool-type","database specific error-type create connection pool","database specific error-type create connection pool","database specific error-type get connection from …","database specific error-type get connection from …","database specific error-type run migrations","database specific error-type run migrations","Account not found","Data required to add notification","Convenience type alias for grouping driver-specific errors","Data representing a captcha","Captcha key is taken","Captcha not found","Trait to clone MCDatabase","database connection type","Create databse connection","data requried to create new captcha","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Database operations trait(migrations, pool creation and …","Generic result data structure","email as login","Email is taken","Get database connection","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","database migrations","type encapsulating username and hashed password of a user","Represents notification","Notification not found","database specific pool-type","Data required to register a new user","datastructure representing a user’s secret","Secret is taken","Captcha statistics with time recorded in UNIX epoch formats","User’s traffic pattern; used in generating a captcha …","Traffic pattern not found","data required to update them email of a user","username as login","Username is taken","Add levels to captcha","Add traffic configuration","average traffic of user’s website","trafic that bought the user’s website down; optional","check if captcha exists","clone DB","times at which the configuration were fetched","Database assigned ID","times at which the PoW token was verified","database specific error-type create connection pool","create new captcha","create new notification","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","description of the captcha","description of the captcha","useful imports for supporting a new database","","cool down duration","cool down duration","Optionally, email of new use","check if email exists","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","notification sender","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","database specific error-type get connection from …","get user email","get a user’s password","get a user’s secret","Get traffic configuration","hashed password of new use","hashed password","heading of the notification","heading of the notification","db assigned ID of the notification","secret key of the captcha","secret key of the captcha","mark a notification read","message of the notification","mesage of the notification","database specific error-type run migrations","receiver name of the notification","new email address of the user","the peak traffic that the user’s website can handle","ping DB","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","secret of new user","user’s secret","times at which the PoW was solved","who is the notification addressed to?","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","username of new user","username of the user","username","check if username exists","","","","","Account not found","Data required to add notification","Convenience type alias for grouping driver-specific errors","Data representing a captcha","Captcha key is taken","Captcha not found","Trait to clone MCDatabase","database connection type","Create databse connection","data requried to create new captcha","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Database operations trait(migrations, pool creation and …","Generic result data structure","email as login","Email is taken","Get database connection","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","database migrations","type encapsulating username and hashed password of a user","Represents notification","Notification not found","database specific pool-type","Data required to register a new user","datastructure representing a user’s secret","Secret is taken","Captcha statistics with time recorded in UNIX epoch formats","User’s traffic pattern; used in generating a captcha …","Traffic pattern not found","data required to update them email of a user","username as login","Username is taken","Add levels to captcha","Add traffic configuration","","average traffic of user’s website","trafic that bought the user’s website down; optional","check if captcha exists","clone DB","times at which the configuration were fetched","Database assigned ID","times at which the PoW token was verified","database specific error-type create connection pool","create new captcha","create new notification","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","description of the captcha","description of the captcha","","cool down duration","cool down duration","Optionally, email of new use","check if email exists","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","notification sender","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","database specific error-type get connection from …","get user email","get a user’s password","get a user’s secret","Get traffic configuration","hashed password of new use","hashed password","heading of the notification","heading of the notification","db assigned ID of the notification","secret key of the captcha","secret key of the captcha","mark a notification read","message of the notification","mesage of the notification","database specific error-type run migrations","receiver name of the notification","new email address of the user","the peak traffic that the user’s website can handle","ping DB","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","secret of new user","user’s secret","times at which the PoW was solved","who is the notification addressed to?","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","username of new user","username of the user","username","check if username exists","","","","","test all database functions","test all database functions","map postgres errors to DBError types","map custom row not found error to DB error","Account not found","Data required to add notification","Convenience type alias for grouping driver-specific errors","Data representing a captcha","Captcha key is taken","Captcha not found","Trait to clone MCDatabase","database connection type","Create databse connection","data requried to create new captcha","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Database operations trait(migrations, pool creation and …","Generic result data structure","email as login","Email is taken","Get database connection","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","database migrations","type encapsulating username and hashed password of a user","Represents notification","Notification not found","database specific pool-type","Data required to register a new user","datastructure representing a user’s secret","Secret is taken","Captcha statistics with time recorded in UNIX epoch formats","User’s traffic pattern; used in generating a captcha …","Traffic pattern not found","data required to update them email of a user","username as login","Username is taken","Add levels to captcha","Add traffic configuration","average traffic of user’s website","","","","","","","","","","","","","","","","","","","","","","","","","trafic that bought the user’s website down; optional","check if captcha exists","","","","","","","","","","","","clone DB","","","","","","","","","","","","times at which the configuration were fetched","Database assigned ID","times at which the PoW token was verified","database specific error-type create connection pool","create new captcha","create new notification","","","","","","","","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","description of the captcha","description of the captcha","","","","","","","","","","","","useful imports for supporting a new database","","cool down duration","cool down duration","Optionally, email of new use","check if email exists","","","","","","","","","","","","represents all the ways a trait can fail using this crate","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","notification sender","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","database specific error-type get connection from …","get user email","get a user’s password","get a user’s secret","Get traffic configuration","hashed password of new use","hashed password","heading of the notification","heading of the notification","db assigned ID of the notification","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","secret key of the captcha","secret key of the captcha","mark a notification read","message of the notification","mesage of the notification","database specific error-type run migrations","receiver name of the notification","","","","","","","","","","","","new email address of the user","meta operations like migration and connecting to a database","the peak traffic that the user’s website can handle","ping DB","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","secret of new user","user’s secret","","","","","","","","","","","","times at which the PoW was solved","","Test utilities","who is the notification addressed to?","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","username of new user","username of the user","username","check if username exists","","","","","","","","","","","","","","","","","Account not found","Data required to add notification","Convenience type alias for grouping driver-specific errors","Data representing a captcha","Captcha key is taken","Captcha not found","Trait to clone MCDatabase","database connection type","Create databse connection","data requried to create new captcha","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Database operations trait(migrations, pool creation and …","Generic result data structure","email as login","Email is taken","Get database connection","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","database migrations","type encapsulating username and hashed password of a user","Represents notification","Notification not found","database specific pool-type","Data required to register a new user","datastructure representing a user’s secret","Secret is taken","Captcha statistics with time recorded in UNIX epoch formats","User’s traffic pattern; used in generating a captcha …","Traffic pattern not found","data required to update them email of a user","username as login","Username is taken","Add levels to captcha","Add traffic configuration","","average traffic of user’s website","trafic that bought the user’s website down; optional","check if captcha exists","clone DB","times at which the configuration were fetched","Database assigned ID","times at which the PoW token was verified","database specific error-type create connection pool","create new captcha","create new notification","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","description of the captcha","description of the captcha","","cool down duration","cool down duration","Optionally, email of new use","check if email exists","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","notification sender","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","database specific error-type get connection from …","get user email","get a user’s password","get a user’s secret","Get traffic configuration","hashed password of new use","hashed password","heading of the notification","heading of the notification","db assigned ID of the notification","secret key of the captcha","secret key of the captcha","mark a notification read","message of the notification","mesage of the notification","database specific error-type run migrations","receiver name of the notification","new email address of the user","the peak traffic that the user’s website can handle","ping DB","useful imports for users working with a supported database","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","secret of new user","user’s secret","times at which the PoW was solved","who is the notification addressed to?","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","username of new user","username of the user","username","check if username exists","","","","","Account not found","Data required to add notification","Convenience type alias for grouping driver-specific errors","Data representing a captcha","Captcha key is taken","Captcha not found","Trait to clone MCDatabase","database connection type","Create databse connection","data requried to create new captcha","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Database operations trait(migrations, pool creation and …","Generic result data structure","email as login","Email is taken","Get database connection","Level struct that describes threshold-difficulty factor …","types of credentials used as identifiers during login","mCaptcha’s database requirements. To implement support …","database migrations","type encapsulating username and hashed password of a user","Represents notification","Notification not found","database specific pool-type","Data required to register a new user","datastructure representing a user’s secret","Secret is taken","Captcha statistics with time recorded in UNIX epoch formats","User’s traffic pattern; used in generating a captcha …","Traffic pattern not found","data required to update them email of a user","username as login","Username is taken","Add levels to captcha","Add traffic configuration","average traffic of user’s website","","","trafic that bought the user’s website down; optional","check if captcha exists","","clone DB","","times at which the configuration were fetched","Database assigned ID","times at which the PoW token was verified","database specific error-type create connection pool","create new captcha","create new notification","Delete captcha","Delete all levels of a captcha","Delete traffic configuration","delete a user","description of the captcha","description of the captcha","","","cool down duration","cool down duration","Optionally, email of new use","check if email exists","","featch PoWConfig fetches","featch PoWConfig confirms","featch PoWConfig solves","","Returns the argument unchanged.","notification sender","get all unread notifications","Get all captchas belonging to user","Get captcha config","Get captcha’s cooldown period","Get captcha levels","database specific error-type get connection from …","get user email","get a user’s password","get a user’s secret","Get traffic configuration","hashed password of new use","hashed password","heading of the notification","heading of the notification","db assigned ID of the notification","Calls U::from(self).","secret key of the captcha","secret key of the captcha","mark a notification read","message of the notification","mesage of the notification","database specific error-type run migrations","receiver name of the notification","","new email address of the user","the peak traffic that the user’s website can handle","ping DB","when notification was received","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig solves","register a new user","secret of new user","user’s secret","","times at which the PoW was solved","who is the notification addressed to?","","","","","update captcha key; doesn’t change metadata","update captcha metadata; doesn’t change captcha key","update a user’s email","update user’s password","update a user’s secret","update username","username of new user","username of the user","username","check if username exists","","","","","","Account not found","Convenience type alias for grouping driver-specific errors","Captcha key is taken","Captcha not found","Error data structure grouping various error subtypes","errors that are specific to a database implementation","Generic result data structure","Email is taken","Notification not found","Secret is taken","Traffic pattern not found","Username is taken","","database connection type","Create databse connection","Database operations trait(migrations, pool creation and …","Get database connection","database migrations","database specific pool-type","database specific error-type create connection pool","database specific error-type get connection from …","database specific error-type run migrations","test all database functions"],"i":[1,0,0,0,2,0,2,0,3,3,1,2,4,3,5,1,2,4,3,5,3,3,5,3,3,5,2,3,3,5,3,3,3,3,0,3,5,0,3,3,3,5,1,2,4,3,5,3,3,3,3,3,3,3,3,3,5,5,1,2,4,3,5,3,5,3,5,5,3,3,4,0,5,3,3,3,3,3,5,1,2,4,3,5,1,2,4,3,5,1,2,4,3,5,3,3,3,3,3,3,4,3,1,2,4,3,5,6,7,8,8,0,0,0,0,0,0,8,8,8,8,0,0,9,9,9,9,10,10,0,0,0,0,0,0,8,8,0,0,0,0,9,9,11,11,8,8,0,0,0,9,0,0,0,0,0,0,0,0,9,0,0,0,0,8,8,12,12,9,9,9,0,0,9,0,0,8,8,0,0,9,0,0,8,8,9,0,0,11,11,8,8,9,13,13,13,13,9,0,14,14,9,9,14,14,13,13,15,15,16,16,17,17,16,16,12,12,13,13,13,13,13,13,13,13,13,13,13,13,18,18,17,17,0,19,19,18,18,17,17,20,20,13,13,0,0,13,13,13,13,13,13,9,9,9,9,9,9,9,21,21,13,13,13,13,13,13,13,13,13,13,10,10,13,13,13,13,13,13,13,13,20,20,22,22,23,23,21,21,23,23,9,9,18,18,17,17,13,13,23,23,21,21,24,24,23,23,25,25,0,0,14,14,13,13,0,23,23,13,13,13,13,13,13,13,13,20,20,26,26,16,16,9,0,0,21,21,9,9,9,9,13,13,13,13,13,13,13,13,13,13,13,13,20,20,25,25,22,22,13,13,19,19,9,27,27,28,29,30,31,32,33,34,35,36,37,36,37,38,39,39,40,40,8,0,0,0,8,8,0,10,0,0,0,8,0,0,11,8,0,0,0,0,0,0,0,8,12,0,0,8,0,0,8,0,11,8,13,13,0,14,14,13,15,16,17,16,12,13,13,13,13,13,13,18,17,19,18,17,20,13,13,13,13,21,13,13,13,13,13,10,13,13,13,13,20,22,23,21,23,18,17,13,23,21,24,23,25,14,13,0,23,13,13,13,13,20,26,16,21,13,13,13,13,13,13,20,25,22,13,19,27,39,40,8,0,0,0,8,8,0,10,0,0,0,8,0,0,11,8,0,0,0,0,0,0,0,8,12,0,0,8,0,0,8,0,11,8,13,13,14,14,13,15,16,17,16,12,13,13,13,13,13,13,18,17,19,18,17,20,13,13,13,13,21,13,13,13,13,13,10,13,13,13,13,20,22,23,21,23,18,17,13,23,21,24,23,25,14,13,23,13,13,13,13,20,26,16,21,13,13,13,13,13,13,20,25,22,13,19,27,39,40,8,8,0,0,8,8,8,8,0,0,8,8,0,0,8,8,8,8,8,8,8,8,8,8,27,27,10,10,0,0,0,0,0,0,0,0,12,12,12,12,10,10,24,24,8,0,0,0,8,8,0,10,0,0,0,8,0,0,11,8,0,0,0,0,0,0,0,8,12,0,0,8,0,0,8,0,11,8,13,13,14,14,13,15,16,17,16,12,13,13,13,13,13,13,18,17,0,19,18,17,20,13,13,13,13,21,13,13,13,13,13,10,13,13,13,13,20,22,23,21,23,18,17,13,23,21,24,23,25,14,13,23,13,13,13,13,20,26,16,21,13,13,13,13,13,13,20,25,22,13,19,27,39,40,8,0,0,0,8,8,0,10,0,0,0,8,0,0,11,8,0,0,0,0,0,0,0,8,12,0,0,8,0,0,8,0,11,8,13,13,0,14,14,13,15,16,17,16,12,13,13,13,13,13,13,18,17,19,18,17,20,13,13,13,13,21,13,13,13,13,13,10,13,13,13,13,20,22,23,21,23,18,17,13,23,21,24,23,25,14,13,23,13,13,13,13,20,26,16,21,13,13,13,13,13,13,20,25,22,13,19,27,39,40,0,0,0,0,8,0,0,0,8,8,0,10,0,0,0,8,0,0,11,8,0,0,0,0,0,0,0,8,12,0,0,8,0,0,8,0,11,8,13,13,14,8,20,25,11,22,16,23,21,14,18,17,26,8,20,25,11,22,16,23,21,14,18,17,26,14,13,20,25,11,22,16,23,21,14,18,17,26,15,20,25,11,22,16,23,21,14,18,17,26,16,17,16,12,13,13,16,23,21,14,18,17,26,13,13,13,13,18,17,20,25,11,22,16,23,21,14,18,17,26,0,19,18,17,20,13,20,25,11,22,16,23,21,14,18,17,26,0,13,13,13,8,8,20,25,11,22,16,23,21,14,18,17,26,8,20,25,11,22,16,23,23,21,14,18,17,26,21,13,13,13,13,13,10,13,13,13,13,20,22,23,21,23,8,20,25,11,22,16,23,21,14,18,17,26,18,17,13,23,21,24,23,20,25,11,22,16,23,21,14,18,17,26,25,0,14,13,23,13,13,13,13,20,26,20,25,11,22,16,23,21,14,18,17,26,16,8,0,21,20,25,11,22,16,23,21,14,18,17,26,8,8,20,25,11,22,16,23,21,14,18,17,26,8,20,25,11,22,16,23,21,14,18,17,26,8,20,25,11,22,16,23,21,14,18,17,26,13,13,13,13,13,13,20,25,22,13,19,8,20,25,11,22,16,23,21,14,18,17,26,27,39,40,8,0,0,0,8,8,0,10,0,0,0,8,0,0,11,8,0,0,0,0,0,0,0,8,12,0,0,8,0,0,8,0,11,8,13,13,0,14,14,13,15,16,17,16,12,13,13,13,13,13,13,18,17,19,18,17,20,13,13,13,13,21,13,13,13,13,13,10,13,13,13,13,20,22,23,21,23,18,17,13,23,21,24,23,25,14,13,0,23,13,13,13,13,20,26,16,21,13,13,13,13,13,13,20,25,22,13,19,27,39,40,8,0,0,0,8,8,0,10,0,0,0,8,0,0,11,8,0,0,0,0,0,0,0,8,12,0,0,8,0,0,8,0,11,8,13,13,14,19,19,14,13,19,15,19,16,17,16,12,13,13,13,13,13,13,18,17,19,19,18,17,20,13,19,13,13,13,19,19,21,13,13,13,13,13,10,13,13,13,13,20,22,23,21,23,19,18,17,13,23,21,24,23,19,25,14,13,23,13,13,13,13,20,26,19,16,21,19,19,19,19,13,13,13,13,13,13,20,25,22,13,19,19,27,39,40,8,0,8,8,0,8,0,8,8,8,8,8,27,10,0,0,0,0,12,12,10,24,0],"f":[null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0]],["database",3]],[[["",0]],["innernotification",3]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],[[["",0],["",0]]],[[["",0],["",0]]],[[],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8]]]]]],[[],["innernotification",3]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["innernotification",3]],["bool",0]],null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],null,null,[[]],[[]],[[]],[[]],[[]],[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8]]]]]],null,[[["",0]],["pin",3,[["box",3,[["future",8]]]]]],null,[[["",0],["innernotification",3]],["bool",0]],[[["",0]],["pin",3,[["box",3,[["future",8]]]]]],null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["option",4,[["databaseerror",8]]]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],null,null,null,null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[]],[[],["error",4]],[[["error",3]],["error",4]],[[["invaliddnsnameerror",3]],["error",4]],[[["migrateerror",4]],["error",4]],null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,null,null,null,[[]],[[],["option",4,[["box",3,[["databaseerror",8],["global",3]]]]]],null,null,null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,[[["",0]],["option",4,[["error",8]]]],null,null,null,null,[[["",0]],["string",3]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,[[["",0],["register",3],["createcaptcha",3],["trafficpattern",3],["addnotification",3]]],[[["",0],["register",3],["createcaptcha",3],["trafficpattern",3],["addnotification",3]]],[[["error",4]],["dberror",4]],[[["error",4],["dberror",4]],["dberror",4]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["register",3]],[[["",0]],["updateemail",3]],[[["",0]],["login",4]],[[["",0]],["namehash",3]],[[["",0]],["statsunixtimestamp",3]],[[["",0]],["notification",3]],[[["",0]],["addnotification",3]],[[["",0]],["trafficpattern",3]],[[["",0]],["createcaptcha",3]],[[["",0]],["captcha",3]],[[["",0]],["secret",3]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[],["statsunixtimestamp",3]],[[],["notification",3]],[[],["addnotification",3]],[[],["trafficpattern",3]],[[],["createcaptcha",3]],[[],["captcha",3]],[[],["secret",3]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[],["result",4,[["register",3]]]],[[],["result",4,[["updateemail",3]]]],[[],["result",4,[["login",4]]]],[[],["result",4,[["namehash",3]]]],[[],["result",4,[["statsunixtimestamp",3]]]],[[],["result",4,[["notification",3]]]],[[],["result",4,[["addnotification",3]]]],[[],["result",4,[["trafficpattern",3]]]],[[],["result",4,[["createcaptcha",3]]]],[[],["result",4,[["captcha",3]]]],[[],["result",4,[["secret",3]]]],null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["bool",0]],[[["",0],["updateemail",3]],["bool",0]],[[["",0],["login",4]],["bool",0]],[[["",0],["namehash",3]],["bool",0]],[[["",0],["statsunixtimestamp",3]],["bool",0]],[[["",0],["notification",3]],["bool",0]],[[["",0],["addnotification",3]],["bool",0]],[[["",0],["trafficpattern",3]],["bool",0]],[[["",0],["createcaptcha",3]],["bool",0]],[[["",0],["captcha",3]],["bool",0]],[[["",0],["secret",3]],["bool",0]],null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["innernotification",3]]],[[]],[[]],[[]],[[]],[[]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["register",3]],["bool",0]],[[["",0],["updateemail",3]],["bool",0]],[[["",0],["login",4]],["bool",0]],[[["",0],["namehash",3]],["bool",0]],[[["",0],["statsunixtimestamp",3]],["bool",0]],[[["",0],["notification",3]],["bool",0]],[[["",0],["addnotification",3]],["bool",0]],[[["",0],["trafficpattern",3]],["bool",0]],[[["",0],["createcaptcha",3]],["bool",0]],[[["",0],["captcha",3]],["bool",0]],[[["",0],["secret",3]],["bool",0]],null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],null,[[["",0]],["option",4,[["error",8]]]],null,null,[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0],["trafficpattern",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["level",3]],[[["",0]],["box",3,[["mcdatabase",8],["global",3]]]],[[["",0],["",0]]],null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["addnotification",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[],["result",4,[["level",3]]]],null,null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["level",3]],["bool",0]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["formatter",3]],["result",4,[["error",3]]]],[[]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["option",4,[["str",0]]],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["login",4]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,null,null,[[]],null,null,[[["",0],["str",0],["i32",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["level",3]],["bool",0]],null,null,[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,[[["",0]],["result",4]],null,null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0],["str",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["createcaptcha",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["updateemail",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["namehash",3]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["str",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,null,null,[[["",0],["str",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],null,[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0]],["pin",3,[["box",3,[["future",8],["global",3]]]]]],[[["",0],["register",3],["createcaptcha",3],["trafficpattern",3],["addnotification",3]]]],"p":[[3,"Conn"],[4,"ConnectionOptions"],[3,"Database"],[3,"Fresh"],[3,"InnerNotification"],[13,"Fresh"],[13,"Existing"],[4,"DBError"],[4,"Error"],[8,"GetConnection"],[4,"Login"],[8,"Connect"],[8,"MCDatabase"],[3,"TrafficPattern"],[8,"CloneSPDatabase"],[3,"StatsUnixTimestamp"],[3,"Captcha"],[3,"CreateCaptcha"],[3,"Level"],[3,"Register"],[3,"AddNotification"],[3,"NameHash"],[3,"Notification"],[8,"Migrate"],[3,"UpdateEmail"],[3,"Secret"],[13,"DBError"],[13,"Configuration"],[13,"Database"],[13,"Io"],[13,"Tls"],[13,"Protocol"],[13,"ColumnNotFound"],[13,"Decode"],[13,"Migrate"],[13,"ColumnIndexOutOfBounds"],[13,"ColumnDecode"],[13,"TypeNotFound"],[13,"Username"],[13,"Email"]]},\ +"mcaptcha":{"doc":"","t":[6,6,3,17,17,3,3,17,3,3,3,3,17,3,3,3,3,3,3,3,17,17,17,17,3,3,3,3,17,3,3,17,17,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,12,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,0,12,0,12,12,0,11,11,11,11,11,11,11,11,0,0,0,11,11,11,11,11,11,11,11,5,5,11,11,11,11,11,11,11,11,12,5,0,12,0,12,0,12,12,12,0,0,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,0,3,0,0,11,11,11,11,5,11,0,0,0,0,12,0,5,11,11,11,11,3,3,11,11,11,11,11,11,11,11,0,11,11,0,12,11,11,11,11,11,11,0,0,0,11,11,5,11,11,11,11,11,11,11,11,0,12,11,11,11,11,3,11,11,11,0,5,11,11,11,11,5,3,11,11,11,11,11,11,11,11,11,12,3,11,11,11,11,11,11,11,11,11,11,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,12,12,12,11,11,5,11,11,11,11,11,11,11,11,11,11,5,3,11,11,11,3,11,11,12,12,11,12,11,11,11,11,11,12,12,12,12,12,11,11,11,11,11,11,11,3,11,11,11,11,5,11,11,11,11,11,11,3,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,11,5,3,11,11,11,11,11,11,11,11,11,11,12,3,11,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,0,0,5,3,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,12,12,11,12,11,11,11,11,3,3,3,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,12,11,11,11,11,11,11,11,11,11,12,5,12,12,12,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,0,0,0,0,5,0,5,0,0,3,3,11,11,11,11,11,11,11,11,3,12,11,11,12,11,11,11,11,11,11,11,12,12,12,11,0,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,5,3,11,11,11,11,11,11,3,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,3,3,12,11,11,11,11,11,11,11,11,12,5,11,11,11,11,3,11,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,11,11,0,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,3,11,11,12,11,11,11,11,11,11,12,11,3,3,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,3,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,3,11,11,12,12,12,11,12,11,11,12,11,11,11,12,12,11,3,11,11,11,11,11,11,11,11,11,11,3,11,11,12,11,0,11,11,11,11,11,11,11,11,11,11,3,11,11,11,12,11,11,11,11,11,11,3,11,11,11,11,11,11,12,11,12,11,11,11,11,11,11,12,12,11,11,0,11,11,11,11,11,11,11,11,11,11,3,3,11,11,11,5,3,3,4,3,3,4,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,3,11,11,11,11,11,11,11,11,11,11,12,12,11,11,0,11,11,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,12,12,12,12,3,11,11,12,11,12,11,11,11,11,11,11,0,0,0,0,5,3,3,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,12,11,11,11,12,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,12,11,11,12,12,11,12,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,12,11,11,3,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,12,11,12,11,11,11,11,11,0,0,5,0,0,3,11,11,11,11,11,11,11,11,11,11,3,5,11,11,12,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,12,11,11,14,12,11,11,11,11,12,11,12,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,3,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,3,11,11,17,3,12,12,11,11,12,11,11,11,12,11,12,12,11,11,11,11,3,13,6,13,4,11,11,11,11,11,12,12,12,14,14,11,11,11,11,11,11,11,12,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,12,12,17,3,17,17,17,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,17,17,3,11,11,11,11,11,12,11,11,11,11,11,11,11,11,3,17,17,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,5,3,11,11,11,11,11,11,11,11,11,0,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,12,11,11,12,11,11,11,11,0,3,17,11,11,11,11,11,11,11,11,11,11,11,11,11,5,12,11,12,12,13,13,13,13,13,13,3,13,3,13,13,13,13,4,6,13,13,13,13,4,13,6,3,13,13,13,13,13,13,13,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,17,0,0,5,0,0,5,0,0,0,0,5,0,3,3,17,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,17,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,12,12,11,11,11,11,11,17,3,11,11,11,11,12,11,11,11,11,11,11,11,11,11,12,11,17,3,3,17,3,12,12,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,12,11,11,11,11,0,5,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,12,11,11,11,11,11,12,11,3,17,11,11,11,11,11,11,11,11,11,11,11,0,3,11,11,11,0,5,0,0,12,11,11,11,11,11,11,11,11,11,3,3,17,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,12,12,12,11,3,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,12,11,11,12,12,12,11,11,11,11,3,17,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,11,11,11,11,11,11,11,11,11,0,12,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,12,11,11,11,11,3,11,11,12,11,11,12,11,11,11,11,11,12,11,0,0,0,0,0,5,0,3,3,3,3,17,12,12,3,12,11,11,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,3,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,3,3,17,3,11,11,11,11,11,11,11,11,11,11,11,11,12,3,12,11,11,11,11,11,11,11,11,12,12,12,12,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,17,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,12,11,11,11,11,11,11,11,11,11,3,12,12,11,11,12,12,12,11,11,11,11,11,11,11,12,11,11,11,11,12,11,3,17,11,11,11,11,11,11,12,11,11,11,11,12,12,12,11,11,11,11,12,11,11,11,11,11,11,11,3,11,11,17,3,12,12,11,11,12,12,11,11,11,12,11,11,12,12,12,12,12,11,11,11,11,3,3,12,11,11,11,11,11,11,11,11,11,11,12,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,12,11,11,11,5,3,3,3,3,3,3,3,3,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,5,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,11,11,11,11,11,11,11,11,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,11,12,11,11,11,11,11,11,11,11,12,12,11,12,12,12,12,12,12,12,12,12,12,12,12,12,5,5,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,12,12,12,12,12,12,11,11,11,11,11,11,11,11,0,5,0,3,11,11,12,11,11,11,11,11,11,11,11,3,3,0,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,5,5,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,3,3,3,3,6,3,3,3,3,12,12,12,12,12,12,12,12,12,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,8,3,3,8,11,11,11,11,11,11,11,11,11,11,11,11,10,12,12,11,11,11,11,11,11,11,10,11,11,11,11,11,11,11,11,11,11,11,11,10,11,11,10,11,11,10,11,11,11,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,3,3,17,17,12,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,11,0,5,3,11,11,11,11,11,11,11,11,11,11,11,11,11,3,11,11,11,11,11,11,11,11,12,11],"n":["AppData","ArcData","BAR_CHART","CACHE_AGE","COMPILED_DATE","CREDIT_CARD","CSS","DOCS","DOCS_ICON","Data","FILES","GITHUB","GIT_COMMIT_HASH","HELP_CIRCLE","HOME","JS","KEY","MCAPTCHA_TRANS_ICON","MESSAGE","MOBILE_CSS","PAGES","PKG_DESCRIPTION","PKG_HOMEPAGE","PKG_NAME","SETTINGS","SETTINGS_ICON","SOURCE_FILES_OF_INSTANCE","Settings","V1_API_ROUTES","VERIFICATIN_WIDGET_CSS","VERIFICATIN_WIDGET_JS","VERSION","WIDGET_ROUTES","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","allow_demo","allow_registration","api","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","captcha","captcha","commercial","creds","data","database","date","db","debug","demo","deref","deref","deref","deref","deref","deref","deref","deref","docs","email","errors","from","from","from","from","from","from","from","from","get_identity_service","get_json_err","into","into","into","into","into","into","into","into","mailer","main","pages","redis","routes","server","settings","settings","smtp","source_code","static_assets","stats","stats","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","widget","v1","RedirectQuery","account","auth","borrow","borrow_mut","deserialize","from","get_middleware","into","mcaptcha","meta","notifications","pow","redirect_to","routes","services","try_from","try_into","type_id","vzip","AccountCheckPayload","AccountCheckResp","borrow","borrow","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","delete","deserialize","deserialize","email","exists","fmt","fmt","from","from","into","into","password","routes","secret","serialize","serialize","services","to_owned","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","username","val","vzip","vzip","borrow","borrow_mut","delete_account","from","into","register","runners","services","try_from","try_into","type_id","vzip","delete_user","Email","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deserialize","email","email_exists","fmt","from","from","from","into","into","into","register","register","serialize","services","set_email","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","ChangePasswordReqest","UpdatePassword","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","confirm_new_password","confirm_new_password","deserialize","fmt","from","from","from","from","into","into","into","new_password","new_password","password","register","serialize","services","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_password_runner","update_user_password","vzip","vzip","vzip","Account","borrow","borrow_mut","delete","email_exists","from","get_secret","into","new","try_from","try_into","type_id","update_email","update_password","update_secret","update_username","username_exists","vzip","borrow","borrow","borrow_mut","borrow_mut","from","from","get_secret","into","into","register","register","services","try_from","try_from","try_into","try_into","type_id","type_id","update_user_secret","vzip","vzip","Username","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","from","into","into","into","register","register","runners","serialize","services","set_username","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","username","username_exists","vzip","vzip","vzip","username_exists","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","from","from","from","into","into","into","login","register","register","register","register","routes","runners","services","signout","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Auth","borrow","borrow_mut","from","get_login_route","into","login","logout","new","register","try_from","try_into","type_id","vzip","Login","Password","Register","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","confirm_password","deserialize","deserialize","deserialize","email","fmt","fmt","fmt","from","from","from","into","into","into","login","login_runner","password","password","password","register_runner","serialize","serialize","serialize","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","username","vzip","vzip","vzip","create","delete","easy","get","get_random","routes","services","stats","update","CreateCaptcha","MCaptchaDetails","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","create","description","deserialize","deserialize","duration","fmt","from","from","from","into","into","into","key","levels","name","register","runner","serialize","serialize","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","create","DeleteCaptcha","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","delete","deserialize","fmt","from","from","into","into","key","password","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","TrafficPatternRequest","UpdateTrafficPattern","avg_traffic","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic","calculate","clone","clone","clone_into","clone_into","create","default","description","deserialize","deserialize","fmt","fmt","from","from","from","from","into","into","into","into","key","pattern","peak_sustainable_traffic","register","register","routes","serialize","serialize","services","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","update","vzip","vzip","vzip","vzip","Easy","borrow","borrow_mut","create","from","into","new","try_from","try_into","type_id","update","vzip","I32Levels","Levels","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","deserialize","deserialize","difficulty_factor","fmt","fmt","from","from","from","get_captcha","into","into","into","levels","register","serialize","serialize","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","visitor_threshold","vzip","vzip","vzip","Captcha","borrow","borrow_mut","create","delete","easy","from","get","into","new","stats","try_from","try_into","type_id","update","update_key","vzip","StatsPayload","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","get","into","into","key","register","routes","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Stats","borrow","borrow_mut","from","get","into","new","try_from","try_into","type_id","vzip","UpdateCaptcha","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","description","deserialize","duration","from","from","from","into","into","into","key","levels","register","register","runner","serialize","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","update_captcha","update_key","vzip","vzip","vzip","update_captcha","BuildDetails","BuildDetailsBuilder","BuildDetailsBuilderError","Health","HealthBuilder","HealthBuilderError","UninitializedField","UninitializedField","ValidationError","ValidationError","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","build","build","build_details","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","create_empty","create_empty","db","db","db","default","default","deserialize","deserialize","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","git_commit_hash","git_commit_hash","git_commit_hash","health","into","into","into","into","into","into","into","into","is_redis","redis","redis","redis","register","register","routes","serialize","serialize","services","to_owned","to_owned","to_owned","to_owned","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","version","version","version","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","0","0","0","0","Meta","borrow","borrow_mut","build_details","from","health","into","new","try_from","try_into","type_id","vzip","add","get","mark_read","routes","services","AddNotificationRequest","add_notification","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","deserialize","eq","fmt","from","from","heading","into","into","message","ne","register","serialize","to","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","NotificationResp","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","default","deserialize","eq","from","from","from","from_notifications","get_notification","heading","id","into","into","message","name","ne","received","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","MarkReadReq","borrow","borrow","borrow_mut","borrow_mut","deserialize","from","from","id","into","into","mark_read","register","serialize","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Notifications","add","borrow","borrow_mut","from","get","into","mark_read","new","try_from","try_into","type_id","vzip","get_config","routes","services","verify_pow","verify_token","GetConfigPayload","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","get_config","init_mcaptcha","into","into","key","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","PoW","borrow","borrow_mut","from","get_config","get_config","into","new","rm_scope","scope","try_from","try_into","type_id","validate_captcha_token","validate_captcha_token","verify_pow","verify_pow","vzip","ValidationToken","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","into","into","register","serialize","to_owned","token","try_from","try_from","try_into","try_into","type_id","type_id","verify_pow","vzip","vzip","CaptchaValidateResp","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","deserialize","fmt","from","from","into","into","register","serialize","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","valid","validate_captcha_token","vzip","vzip","ROUTES","Routes","account","auth","borrow","borrow_mut","captcha","from","get_login_route","into","meta","new","notifications","pow","try_from","try_into","type_id","vzip","Data","Embedded","Mailer","Redis","SystemGroup","add_site","borrow","borrow","borrow_mut","borrow_mut","captcha","creds","db","enum_system_actor","enum_system_wrapper","from","from","get_creds","get_mailer","get_pow","into","into","mailer","new","new","new_system","remove","rename","settings","stats","try_from","try_from","try_into","try_into","type_id","type_id","validate_verification_tokens","verify_pow","vzip","vzip","0","0","DAY","Date","HOUR","MINUTE","WEEK","borrow","borrow_mut","clone","clone_into","date","fmt","format","from","into","new","print_date","time","to_owned","try_from","try_into","type_id","vzip","DEMO_PASSWORD","DEMO_USER","DemoUser","abort","borrow","borrow_mut","delete_demo_user","from","handle","into","register_demo_user","run","spawn","try_from","try_into","type_id","vzip","Asset","DOCS","OPEN_API_SPEC","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","dist","from","from","from","from","get","get","handle_embedded_file","index","into","into","into","into","iter","iter","register","register","register","routes","services","spec","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","Docs","assets","borrow","borrow_mut","from","home","into","new","spec","try_from","try_into","type_id","vzip","verification","IndexPage","PAGE","borrow","borrow_mut","clone","clone_into","from","into","new","render_once","render_once_to","to_owned","try_from","try_into","type_id","verification","verification_link","vzip","0","0","AccountNotFound","BlacklistError","CaptchaError","CaptchaNotFound","ClosedForRegistration","DBError","DBErrorWrapper","EmailTaken","ErrorToResponse","InternalServerError","InternalServerError","NotAUrl","NotAnEmail","PageError","PageResult","PasswordTooLong","PasswordTooShort","PasswordsDontMatch","ProfainityError","ServiceError","ServiceError","ServiceResult","SmtpErrorWrapper","TokenNotFound","TrafficPatternNotFound","UnableToSendEmail","UsernameCaseMappedError","UsernameNotFound","UsernameTaken","WrongPassword","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","deserialize","eq","eq","eq","eq","error","error_response","error_response","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","ne","ne","serialize","source","source","source","source","status_code","status_code","to_string","to_string","to_string","to_string","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","0","0","0","0","NAME","auth","errors","get_middleware","panel","routes","services","sitemap","login","register","routes","services","sudo","INDEX","IndexPage","PAGE","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","from","from","from","into","into","into","login","register","render_once","render_once_to","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","INDEX","IndexPage","PAGE","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","from","from","from","into","into","into","join","register","render_once","render_once_to","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Auth","borrow","borrow_mut","from","get_login_route","get_sitemap","into","join","login","new","try_from","try_into","type_id","vzip","PAGE","SudoPage","borrow","borrow_mut","clone","clone_into","data","from","into","new","render_once","render_once_to","to_owned","try_from","try_into","type_id","url","vzip","ERROR_ROUTE","ErrorPage","INTERNAL_SERVER_ERROR_BODY","PAGE","UNKNOWN_ERROR_BODY","__private_field","__private_field","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deref","deref","error","from","from","from","from","into","into","into","into","message","new","register","render_once","render_once_to","routes","services","title","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","Errors","borrow","borrow_mut","from","internal_server_error","into","new","try_from","try_into","type_id","unknown_error","vzip","IndexPage","PAGE","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","from","from","into","into","new","notifications","panel","register","render_once","render_once_to","routes","services","settings","sitekey","sitekeys","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","IndexPage","Notification","PAGE","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","from","from","from","from","heading","id","into","into","into","message","n","name","new","notifications","print_date","received","register","render_once","render_once_to","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Panel","borrow","borrow_mut","from","get_sitemap","home","into","new","notifications","settings","sitekey","try_from","try_into","type_id","vzip","IndexPage","PAGE","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","delete_account","email","from","from","from","from","into","into","into","into","register","register","register","render_once","render_once_to","routes","secret","services","settings","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","update_secret","username","vzip","vzip","vzip","vzip","Settings","borrow","borrow_mut","delete_account","from","get_sitemap","home","into","new","try_from","try_into","type_id","update_secret","vzip","add","delete","edit","list","routes","services","view","ADVANCE_INDEX","AdvanceIndexPage","EASY_INDEX","EasyIndexPage","PAGE","__private_field","__private_field","advance","avg_traffic","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic","clone","clone","clone_into","clone_into","default","default","deref","deref","easy","form_description","form_description","form_duration","form_title","form_title","from","from","from","from","from","from","into","into","into","into","into","into","levels","peak_sustainable_traffic","register","register","render_once","render_once","render_once_to","render_once_to","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","borrow","borrow_mut","delete_sitekey","from","into","register","try_from","try_into","type_id","vzip","AdvanceEditPage","EasyEditPage","PAGE","advance","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone_into","clone_into","duration","easy","form_title","from","from","from","from","into","into","into","into","key","key","levels","name","new","new","pattern","register","register","render_once","render_once","render_once_to","render_once_to","to_owned","to_owned","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","IndexPage","PAGE","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","from","from","into","into","list_sitekeys","new","register","render_once","render_once_to","sitekeys","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","vzip","vzip","Sitekey","add_advance","add_easy","borrow","borrow_mut","delete","edit_advance","edit_easy","from","get_delete","get_edit_advance","get_edit_easy","get_sitemap","get_view","into","list","new","try_from","try_into","type_id","view","vzip","IndexPage","PAGE","borrow","borrow","borrow_mut","borrow_mut","clone","clone_into","duration","from","from","into","into","key","levels","name","new","register","render_once","render_once_to","stats","to_owned","try_from","try_from","try_into","try_into","type_id","type_id","view_sitekey","vzip","vzip","ROUTES","Routes","about","auth","borrow","borrow_mut","donate","errors","from","get_login_route","get_sitemap","home","into","new","panel","privacy","security","sitemap","thanks","try_from","try_into","type_id","vzip","INDEX","IndexPage","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","default","deref","domain","from","from","from","into","into","into","register","render_once","render_once_to","sitemap","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","urls","vzip","vzip","vzip","services","Captcha","Database","DatabaseBuilder","DefaultDifficultyStrategy","Redis","Server","Settings","Smtp","allow_demo","allow_registration","avg_traffic_difficulty","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","broke_my_site_traffic_difficulty","captcha","check_url","clone","clone","clone","clone","clone","clone","clone","clone","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","clone_into","commercial","cookie_secret","database","debug","default_difficulty_strategy","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","deserialize","domain","duration","enable_stats","extract_database_url","fmt","fmt","fmt","fmt","fmt","fmt","fmt","fmt","from","from","from","from","from","from","from","from","from","gc","get_ip","hostname","into","into","into","into","into","into","into","into","ip","name","new","password","password","peak_sustainable_traffic_difficulty","pool","pool","port","port","port","proxy_has_tls","redis","reply","salt","server","set_database_url","set_from_database_url","smtp","source_code","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","url","url","url","url_prefix","username","username","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","filemap","services","static_files","FileMap","borrow","borrow_mut","files","from","get","into","new","try_from","try_into","type_id","vzip","Asset","Favicons","assets","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","favicons","from","from","from","from","get","get","get","get","handle_assets","handle_favicons","into","into","into","into","iter","iter","iter","iter","register","register","static_files","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","BAR_CHART","CREDIT_CARD","DOCS_ICON","GITHUB","HELP_CIRCLE","HOME","Img","KEY","MCAPTCHA_TRANS_ICON","MESSAGE","SETTINGS_ICON","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","__private_field","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","borrow_mut","deref","deref","deref","deref","deref","deref","deref","deref","deref","deref","from","from","from","from","from","from","from","from","from","from","into","into","into","into","into","into","into","into","into","into","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_from","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","try_into","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","type_id","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","vzip","CaptchaStats","CloneStats","Dummy","Real","Stats","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone","clone","clone_into","clone_into","clone_into","clone_stats","config_fetches","confirms","default","default","default","deserialize","eq","eq","eq","fetch","fetch","fetch","fmt","fmt","fmt","from","from","from","into","into","into","ne","record_confirm","record_confirm","record_confirm","record_fetch","record_fetch","record_fetch","record_solve","record_solve","record_solve","serialize","solves","to_owned","to_owned","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","INDEX_PAGE","IndexPage","PAGE","WIDGET_ROUTES","__private_field","borrow","borrow","borrow","borrow_mut","borrow_mut","borrow_mut","clone","clone_into","deref","from","from","from","into","into","into","new","register","render_once","render_once_to","routes","services","show_widget","to_owned","try_from","try_from","try_from","try_into","try_into","try_into","type_id","type_id","type_id","vzip","vzip","vzip","Widget","borrow","borrow_mut","from","into","new","try_from","try_into","type_id","verification_widget","vzip"],"q":["mcaptcha","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api","mcaptcha::api::v1","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::delete","","","","","","","","","","","","mcaptcha::api::v1::account::delete::runners","mcaptcha::api::v1::account::email","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::password","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::routes","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::secret","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::username","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::account::username::runners","mcaptcha::api::v1::auth","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::auth::routes","","","","","","","","","","","","","","mcaptcha::api::v1::auth::runners","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha","","","","","","","","","mcaptcha::api::v1::mcaptcha::create","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::create::runner","mcaptcha::api::v1::mcaptcha::delete","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::easy","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::easy::routes","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::get","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::routes","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::stats","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::stats::routes","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::update","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::mcaptcha::update::runner","mcaptcha::api::v1::meta","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::meta::BuildDetailsBuilderError","","mcaptcha::api::v1::meta::HealthBuilderError","","mcaptcha::api::v1::meta::routes","","","","","","","","","","","","mcaptcha::api::v1::notifications","","","","","mcaptcha::api::v1::notifications::add","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::get","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::mark_read","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::notifications::routes","","","","","","","","","","","","","mcaptcha::api::v1::pow","","","","","mcaptcha::api::v1::pow::get_config","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::pow::routes","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::pow::verify_pow","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::pow::verify_token","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::api::v1::routes","","","","","","","","","","","","","","","","","","mcaptcha::data","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::data::SystemGroup","","mcaptcha::date","","","","","","","","","","","","","","","","","","","","","","mcaptcha::demo","","","","","","","","","","","","","","","","","mcaptcha::docs","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::docs::routes","","","","","","","","","","","","","mcaptcha::email","mcaptcha::email::verification","","","","","","","","","","","","","","","","","","mcaptcha::errors","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::errors::PageError","mcaptcha::errors::ServiceError","","","mcaptcha::pages","","","","","","","","mcaptcha::pages::auth","","","","","mcaptcha::pages::auth::login","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::auth::register","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::auth::routes","","","","","","","","","","","","","","mcaptcha::pages::auth::sudo","","","","","","","","","","","","","","","","","","mcaptcha::pages::errors","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::errors::routes","","","","","","","","","","","","mcaptcha::pages::panel","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::notifications","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::routes","","","","","","","","","","","","","","","mcaptcha::pages::panel::settings","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::settings::routes","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey","","","","","","","mcaptcha::pages::panel::sitekey::add","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::delete","","","","","","","","","","mcaptcha::pages::panel::sitekey::edit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::list","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::routes","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::panel::sitekey::view","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::routes","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::pages::sitemap","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::routes","mcaptcha::settings","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::static_assets","","","mcaptcha::static_assets::filemap","","","","","","","","","","","","mcaptcha::static_assets::static_files","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::static_assets::static_files::assets","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::stats","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::widget","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mcaptcha::widget::routes","","","","","","","","","",""],"d":["","","","","","","","","","App data","","","","","","","","","","","","","","","","","points to source files matching build commit","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","mCaptcha system: Redis cache, etc.","","","credential management configuration","App data: redis cache, database connections, etc.","","","database ops defined by db crates","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","email client","","","","","","","app settings","","","","","stats recorder","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","User facing CAPTCHA widget","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","update email","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","update username","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","returns Ok(()) when everything checks out and the user is …","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","User’s traffic pattern; used in generating a captcha …","","average traffic of user’s website","","","","","","","","","trafic that bought the user’s website down; optional","","","","","","","","Captcha description","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","the peak traffic that the user’s website can handle","","","","","","","","","","","","","","","","","","","","","","","","","","","","","easy is using defaults","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","Builder for BuildDetails.","Error type for BuildDetailsBuilder","Health check return datatype","Builder for Health.","Error type for HealthBuilder","Uninitialized field","Uninitialized field","Custom validation error","Custom validation error","","","","","","","","","","","","","","","","","Builds a new BuildDetails.","Builds a new Health.","emmits build details of the bninary","","","","","","","","","Create an empty builder, with all fields set to None or …","Create an empty builder, with all fields set to None or …","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Returns the argument unchanged.","","Returns the argument unchanged.","","","","checks all components of the system","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","route handler that adds a notification message","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","route handler that gets all unread notifications","","","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","route handler that marks a notification read","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","PoW Verification module","PoW success token module","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","get PoW configuration for an mcaptcha key","Call this when MCaptcha is not in master.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","Returns the argument unchanged.","remove scope for $name route","","Calls U::from(self).","","","","","","","remove scope for $name route","","remove scope for $name route","","","validation token that clients receive as proof for …","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","route handler that verifies PoW and issues a solution token","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","route hander that validates a PoW solution token","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","App data","","Mailer data type AsyncSmtpTransport","","Represents mCaptcha cache and master system. When Redis is …","","","","","","mCaptcha system: Redis cache, etc.","credential management configuration","database ops defined by db crates","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","Calls U::from(self).","Calls U::from(self).","email client","","create new instance of app data","","","","app settings","stats recorder","","","","","","","","","","","","","","","","","","","","","","print date","","","Returns the argument unchanged.","Calls U::from(self).","","print relative time from date","","","","","","","Demo password","Demo username","","","","","","Returns the argument unchanged.","","Calls U::from(self).","register demo user runner","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","Get an embedded file and its metadata.","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Iterates over the file paths in the folder.","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","Email operations: verification, notification, etc","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","","when the value passed contains blacklisted words see …","","captcha not found","","","","email is already taken","","","","","","","","","","","when the value passed contains profainity","","","","","token not found","Traffic pattern not found","Unable to send email","when the value passed contains characters not present in …","","when the a username is already taken","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","","","","","","","Returns the argument unchanged.","","","Returns the argument unchanged.","","Returns the argument unchanged.","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Returns the argument unchanged.","Returns the argument unchanged.","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","notifications","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","","","","","route handler that renders individual views for sitekeys","","","","","","","","","","","","","","route handler that renders individual views for sitekeys","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","render a list of all sitekeys that a user has","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","route handler that renders individual views for sitekeys","","","","","","","","","","","Returns the argument unchanged.","","","","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","","Calls U::from(self).","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Get an embedded file and its metadata.","","Get an embedded file and its metadata.","","","","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","Iterates over the file paths in the folder.","","Iterates over the file paths in the folder.","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Trait to clone MCDatabase","","","","","","","","","","","","","","","","clone DB","","","","","","","","","","fetch stats","fetch stats","fetch stats","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","record PoWConfig confirms","record PoWConfig confirms","record PoWConfig confirms","record PoWConfig fetches","record PoWConfig fetches","record PoWConfig fetches","record PoWConfig solves","record PoWConfig solves","record PoWConfig solves","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Returns the argument unchanged.","Returns the argument unchanged.","Calls U::from(self).","Calls U::from(self).","Calls U::from(self).","","","","","","widget services","render a client side widget for CAPTCHA verification","","","","","","","","","","","","","","","","","Returns the argument unchanged.","Calls U::from(self).","","","","","",""],"i":[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,19,0,11,12,13,14,15,16,17,18,11,12,13,14,15,16,17,18,20,19,19,20,0,19,0,20,19,0,11,12,13,14,15,16,17,18,0,0,0,11,12,13,14,15,16,17,18,0,0,11,12,13,14,15,16,17,18,20,0,0,19,0,19,0,20,19,19,0,0,20,11,12,13,14,15,16,17,18,11,12,13,14,15,16,17,18,11,12,13,14,15,16,17,18,11,12,13,14,15,16,17,18,0,0,0,0,0,21,21,21,21,0,21,0,0,0,0,21,0,0,21,21,21,21,0,0,22,23,22,23,22,23,22,23,0,22,23,0,23,22,23,22,23,22,23,0,0,0,22,23,0,22,23,22,23,22,23,22,23,0,22,22,23,24,24,0,24,24,24,0,0,24,24,24,24,0,0,25,26,27,25,26,27,25,25,25,25,0,25,25,26,27,25,26,27,26,27,25,0,0,25,25,26,27,25,26,27,25,26,27,25,26,27,0,0,28,29,30,28,29,30,29,29,28,29,29,29,28,28,29,30,28,29,30,28,29,29,30,29,0,29,28,29,30,28,29,30,28,29,30,0,0,28,29,30,0,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,31,32,33,32,33,32,33,0,32,33,32,33,0,32,33,32,33,32,33,0,32,33,0,34,35,36,34,35,36,35,35,35,35,34,35,36,34,35,36,34,36,0,35,0,0,35,34,35,36,34,35,36,34,35,36,35,0,34,35,36,0,37,38,39,37,38,39,37,38,39,37,38,39,0,0,37,38,39,0,0,0,0,37,38,39,37,38,39,37,38,39,37,38,39,0,40,40,40,40,40,40,40,40,40,40,40,40,40,0,0,0,41,42,43,41,42,43,41,42,43,41,42,43,41,41,42,43,41,41,42,43,41,42,43,41,42,43,42,0,41,42,43,0,41,42,43,41,42,43,41,42,43,41,42,43,41,42,43,41,41,42,43,0,0,0,0,0,0,0,0,0,0,0,44,45,46,44,45,46,45,45,0,44,44,45,44,45,44,45,46,44,45,46,45,44,45,46,0,44,45,45,44,45,46,44,45,46,44,45,46,44,45,46,0,0,47,48,47,48,47,47,0,47,47,47,48,47,48,47,47,48,47,47,47,48,47,48,47,48,47,48,0,0,49,49,50,51,52,49,50,51,52,49,0,49,51,49,51,0,49,49,49,51,49,51,49,50,51,52,49,50,51,52,51,51,49,50,52,0,49,51,0,49,51,49,50,51,52,49,50,51,52,49,50,51,52,0,49,50,51,52,0,53,53,53,53,53,53,53,53,53,53,53,0,0,54,55,56,54,55,56,55,56,55,56,55,56,56,55,56,54,55,56,0,54,55,56,55,54,55,56,55,56,54,55,56,54,55,56,54,55,56,56,54,55,56,0,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,57,0,58,59,58,59,58,58,58,58,58,59,0,58,59,58,59,0,58,58,58,59,58,59,58,59,58,59,0,60,60,60,60,60,60,60,60,60,60,0,61,62,63,61,62,63,62,62,62,61,62,63,61,62,63,62,62,61,63,0,62,61,62,63,61,62,63,61,62,63,0,0,61,62,63,0,0,0,0,0,0,0,64,65,64,65,66,67,64,68,69,70,65,71,66,67,64,68,69,70,65,71,67,70,0,66,67,69,70,66,67,69,70,67,70,70,69,70,67,70,66,69,66,64,64,69,65,65,66,67,64,64,64,68,69,70,65,65,65,71,67,66,67,0,66,67,64,68,69,70,65,71,69,70,69,70,68,71,0,66,69,0,66,67,69,70,64,65,66,67,64,68,69,70,65,71,66,67,64,68,69,70,65,71,66,67,64,68,69,70,65,71,67,66,67,66,67,64,68,69,70,65,71,72,73,74,75,0,76,76,76,76,76,76,76,76,76,76,76,0,0,0,0,0,0,0,77,78,77,78,77,77,77,77,77,77,77,78,77,77,78,77,77,78,77,77,77,77,78,77,78,77,78,77,78,0,79,80,79,80,79,79,79,79,79,79,79,80,79,0,79,79,79,80,79,79,79,79,80,79,79,79,80,79,80,79,80,79,80,0,81,82,81,82,81,81,82,81,81,82,0,82,81,81,82,81,82,81,82,81,82,0,83,83,83,83,83,83,83,83,83,83,83,83,0,0,0,0,0,0,84,85,84,85,84,84,84,84,84,85,0,0,84,85,84,85,84,84,84,85,84,85,84,85,84,85,0,86,86,86,86,86,86,86,0,86,86,86,86,86,86,86,86,86,0,87,88,87,88,87,87,87,87,87,88,87,88,88,87,87,87,87,88,87,88,87,88,0,87,88,0,89,90,89,90,89,89,89,89,89,90,89,90,90,89,89,89,90,89,90,89,90,89,0,89,90,0,0,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,91,0,92,0,92,0,92,92,20,92,20,20,20,20,0,0,92,20,20,20,92,92,20,20,92,20,92,92,92,20,20,92,20,92,20,92,20,92,92,92,20,93,94,0,0,0,0,0,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,95,0,0,0,96,96,96,96,96,96,96,96,96,96,96,96,96,96,0,0,0,97,98,99,100,97,98,99,100,0,97,98,99,100,97,97,0,0,97,98,99,100,97,97,98,99,100,0,0,0,97,98,99,100,97,98,99,100,97,98,99,100,97,98,99,100,0,101,101,101,101,101,101,101,101,101,101,101,101,0,0,0,102,102,102,102,102,102,102,102,102,102,102,102,102,0,102,102,103,104,105,105,105,105,105,105,0,105,0,105,106,105,105,0,0,105,105,105,105,0,106,0,0,105,105,105,105,105,105,105,103,104,105,107,106,103,104,105,107,106,107,103,104,105,106,107,105,106,103,103,104,104,105,105,106,106,103,104,105,105,105,105,105,105,105,105,105,107,106,106,106,103,104,105,107,106,105,106,107,103,104,105,106,105,106,103,104,105,106,103,104,105,107,106,103,104,105,107,106,103,104,105,107,106,103,104,105,107,106,108,109,110,111,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,112,113,112,114,113,112,114,113,113,113,112,113,112,114,113,112,114,0,114,113,113,113,113,112,114,113,112,114,113,112,114,113,112,114,0,0,0,115,116,115,117,116,115,117,116,116,116,115,116,115,117,116,115,117,0,117,116,116,116,116,115,117,116,115,117,116,115,117,116,115,117,0,118,118,118,118,118,118,118,118,118,118,118,118,118,0,0,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,119,0,0,0,0,0,120,121,122,120,121,123,122,120,121,123,122,122,120,121,0,122,120,121,123,122,120,121,123,122,122,123,122,122,0,0,122,122,122,120,121,123,122,120,121,123,122,120,121,123,122,120,121,123,0,124,124,124,124,124,124,124,124,124,124,124,0,0,125,126,125,126,125,125,125,126,125,126,125,0,0,126,125,125,0,0,0,0,125,125,125,126,125,126,125,126,125,126,0,0,0,127,128,129,127,128,129,127,127,128,129,127,127,127,128,129,127,128,127,128,0,127,127,129,128,128,127,128,129,127,128,129,127,128,129,127,128,129,0,130,130,130,130,130,130,130,130,130,130,130,130,130,130,0,0,131,132,133,134,131,132,133,134,131,131,0,131,131,132,133,134,131,132,133,134,132,133,134,131,131,0,131,0,0,131,131,132,133,134,131,132,133,134,131,132,133,134,0,131,131,132,133,134,0,135,135,135,135,135,135,135,135,135,135,135,135,135,0,0,0,0,0,0,0,0,0,0,0,0,136,137,0,138,136,137,139,140,138,141,136,137,139,140,138,141,138,139,138,139,138,139,138,136,137,0,139,138,139,139,138,136,137,139,140,138,141,136,137,139,140,138,141,139,138,140,141,139,138,139,138,139,138,136,137,139,140,138,141,136,137,139,140,138,141,136,137,139,140,138,141,136,137,139,140,138,141,142,142,0,142,142,142,142,142,142,142,0,0,0,0,143,144,145,146,143,144,145,146,143,145,143,145,143,0,145,143,144,145,146,143,144,145,146,143,145,143,143,143,145,145,144,146,143,145,143,145,143,145,143,144,145,146,143,144,145,146,143,144,145,146,143,144,145,146,0,0,147,148,147,148,147,147,147,148,147,148,0,147,148,147,147,147,147,147,148,147,148,147,148,147,148,0,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,149,0,0,150,151,150,151,150,150,150,150,151,150,151,150,150,150,150,151,150,150,150,150,150,151,150,151,150,151,0,150,151,0,0,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,152,0,0,153,154,153,155,154,153,155,154,154,154,153,154,154,153,155,154,153,155,155,154,154,0,154,154,153,155,154,153,155,154,153,155,154,154,153,155,0,0,0,0,0,0,0,0,0,19,19,156,157,158,156,159,160,161,162,19,157,158,156,159,160,161,162,19,156,19,0,157,158,156,159,160,161,162,19,157,158,156,159,160,161,162,19,19,157,19,19,158,157,158,156,159,160,161,162,19,157,156,158,160,157,158,156,159,160,161,162,19,157,158,156,159,160,161,162,19,159,158,157,160,157,158,156,159,160,161,162,19,157,160,19,159,160,156,161,162,157,159,160,157,19,159,158,19,0,0,19,19,157,158,156,159,160,161,162,19,157,158,156,159,160,161,162,19,157,158,156,159,160,161,162,19,157,158,156,159,160,161,162,19,159,161,162,157,159,160,157,158,156,159,160,161,162,19,0,0,0,0,163,163,163,163,163,163,163,163,163,163,163,0,0,0,164,165,166,167,164,165,166,167,0,164,165,166,167,164,164,166,166,0,0,164,165,166,167,164,164,166,166,165,167,0,164,165,166,167,164,165,166,167,164,165,166,167,164,165,166,167,0,0,0,0,0,0,0,0,0,0,0,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,1,2,3,4,5,6,7,8,9,10,0,0,0,0,0,168,169,170,168,169,170,168,169,170,168,169,170,171,168,168,168,169,170,168,168,169,170,172,169,170,168,169,170,168,169,170,168,169,170,168,172,169,170,172,169,170,172,169,170,168,168,168,169,170,168,169,170,168,169,170,168,169,170,168,169,170,0,0,0,0,173,174,173,175,174,173,175,174,174,173,174,173,175,174,173,175,174,175,174,174,0,0,0,174,174,173,175,174,173,175,174,173,175,174,173,175,0,176,176,176,176,176,176,176,176,176,176],"f":[null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,null,null,null,null,null,null,null,null,null,[[["",0]],["settings",3]],[[["",0]],["filemap",3]],[[["",0]],["str",0]],[[["",0]],["str",0]],[[["",0]],["str",0]],[[["",0]],["str",0]],[[["",0]],["str",0]],[[["",0]],["string",3]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["settings",3]],["identityservice",3,[["cookieidentitypolicy",3]]]],[[],["jsonconfig",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[],["result",6]],null,null,null,null,null,null,null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[],["result",4]],[[]],[[],["authentication",3,[["routes",3]]]],[[]],null,null,null,null,null,null,[[["serviceconfig",3]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["accountcheckpayload",3]],[[["",0]],["accountcheckresp",3]],[[["",0],["",0]]],[[["",0],["",0]]],null,[[],["result",4]],[[],["result",4]],null,null,[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],null,null,null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[["appservice",3]]],null,[[["serviceconfig",3]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],[[["str",0],["appdata",6]]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["email",3]],[[["",0],["",0]]],[[],["result",4]],null,null,[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[["",0]],["result",4]],[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["changepasswordreqest",3]],[[["",0],["",0]]],null,null,[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[["changepasswordreqest",3]]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[["appservice",3]]],[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["str",0],["updatepassword",3],["data",3]]],null,[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,[[]],null,[[]],[[],["account",3]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,null,null,null,null,[[]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[]],null,[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[["serviceconfig",3]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["username",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[]],[[["accountcheckpayload",3],["appdata",6]]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],null,null,[[["serviceconfig",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[["",0],["option",4,[["str",0]]]],["string",3]],[[]],null,null,[[],["auth",3]],null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["register",3]],[[["",0]],["login",3]],[[["",0]],["password",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],null,[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["login",3],["appdata",6]]],null,null,null,[[["register",3],["appdata",6]]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],null,null,null,null,[[["usize",0]],["string",3]],null,[[["serviceconfig",3]]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["mcaptchadetails",3]],[[["",0],["",0]]],null,null,[[],["result",4]],[[],["result",4]],null,[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[["createcaptcha",3],["appdata",6],["str",0]]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["deletecaptcha",3]],[[["",0],["",0]]],null,[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[["trafficpattern",3],["defaultdifficultystrategy",3]],["result",4,[["vec",3,[["level",3]]],["serviceerror",4]]]],[[["",0]],["trafficpatternrequest",3]],[[["",0]],["updatetrafficpattern",3]],[[["",0],["",0]]],[[["",0],["",0]]],null,[[],["trafficpatternrequest",3]],null,[[],["result",4]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["levels",3]],[[["",0]],["i32levels",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[],["result",4]],[[],["result",4]],null,[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],null,[[]],[[]],[[]],null,[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]],["result",4]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,null,[[]],null,[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,null,[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["statspayload",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],null,[[]],[[]],null,[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[],["result",4]],null,[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[]],[[["updatecaptcha",3],["appdata",6],["str",0]]],null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["result",4,[["builddetails",3],["builddetailsbuildererror",4]]]],[[["",0]],["result",4,[["health",3],["healthbuildererror",4]]]],null,[[["",0]],["builddetails",3]],[[["",0]],["builddetailsbuilder",3]],[[["",0]],["health",3]],[[["",0]],["healthbuilder",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[]],[[]],[[["",0],["bool",0]],["",0]],null,null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[["string",3]]],[[["uninitializedfielderror",3]]],[[]],[[]],[[]],[[["string",3]]],[[]],[[["uninitializedfielderror",3]]],[[]],[[["",0],["str",0]],["",0]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["option",4]],["bool",0]],[[["",0],["option",4,[["bool",0]]]],["",0]],null,null,[[["appservice",3]]],[[["appservice",3]]],null,[[["",0]],["result",4]],[[["",0]],["result",4]],[[["serviceconfig",3]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]],["string",3]],[[["",0]],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0],["str",0]],["",0]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,null,[[["serviceconfig",3]]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["addnotificationrequest",3]],[[["",0],["",0]]],[[],["addnotificationrequest",3]],[[],["result",4]],[[["",0],["addnotificationrequest",3]],["bool",0]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],null,[[]],[[]],null,[[["",0],["addnotificationrequest",3]],["bool",0]],[[["appservice",3]]],[[["",0]],["result",4]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["notificationresp",3]],[[["",0],["",0]]],[[],["notificationresp",3]],[[],["result",4]],[[["",0],["notificationresp",3]],["bool",0]],[[["notification",3]]],[[]],[[]],[[["vec",3,[["notification",3]]]],["vec",3]],null,null,null,[[]],[[]],null,null,[[["",0],["notificationresp",3]],["bool",0]],null,[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[],["result",4]],[[]],[[]],null,[[]],[[]],null,[[["appservice",3]]],[[["",0]],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],null,[[]],null,[[],["notifications",3]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,[[["serviceconfig",3]]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["getconfigpayload",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],null,[[["appdata",6],["str",0]]],[[]],[[]],null,[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[["",0]],["str",0]],null,[[]],[[]],null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["str",0]],null,[[["",0]],["str",0]],null,[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["validationtoken",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["captchavalidateresp",3]],[[["",0],["",0]]],[[],["result",4]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["",0]],["result",4]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[["",0],["option",4,[["str",0]]]],["string",3]],[[]],null,[[],["routes",3]],null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,null,null,[[["",0],["addsite",3]]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,null,null,null,null,[[]],[[]],[[],["config",3]],[[["settings",3]],["option",4,[["asyncsmtptransport",3,[["tokio1executor",3]]]]]],[[["",0],["string",3]]],[[]],[[]],null,[[["settings",3]]],[[["settings",3]]],[[["settings",3],["addr",3,[["mastertrait",8]]],["addr",3,[["save",8]]]],["system",3,[["save",8],["mastertrait",8]]]],[[["",0],["removecaptcha",3]]],[[["",0],["rename",3]]],null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0],["verifycaptcharesult",3]]],[[["",0],["work",3]]],[[]],[[]],null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["date",3]],[[["",0],["",0]]],[[["",0]],["string",3]],[[["",0],["formatter",3]],["result",6]],[[["offsetdatetime",3]],["string",3]],[[]],[[]],[[["i64",0]]],[[["",0]],["string",3]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]]],[[["",0]],["",0]],[[["",0]],["",0]],[[["appdata",6]]],[[]],null,[[]],[[["appdata",6]]],[[["appdata",6],["duration",3]]],[[["appdata",6],["duration",3]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[]],[[]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["httpresponse",3]],null,[[]],[[]],[[]],[[]],[[],["filenames",4]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],null,[[["serviceconfig",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],null,[[]],[[]],null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[]],[[["str",0]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["data",3],["str",0],["str",0]]],null,[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[],["result",4]],[[["",0],["",0]],["bool",0]],[[["",0],["",0]],["bool",0]],[[["",0],["serviceerror",4]],["bool",0]],[[["",0],["pageerror",4]],["bool",0]],null,[[["",0]],["httpresponse",3]],[[["",0]],["httpresponse",3]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[["dberror",4]],["serviceerror",4]],[[["validationerrors",3]],["serviceerror",4]],[[["credserror",4]],["serviceerror",4]],[[["mailboxerror",4]]],[[["parseerror",4]],["serviceerror",4]],[[["captchaerror",4]],["serviceerror",4]],[[]],[[["smtperror",3]]],[[["recverror",3]]],[[]],[[["dberror",4]]],[[]],[[["serviceerror",4]]],[[]],[[]],[[]],[[]],[[]],[[["",0],["serviceerror",4]],["bool",0]],[[["",0],["pageerror",4]],["bool",0]],[[["",0]],["result",4]],[[["",0]],["option",4,[["error",8]]]],[[["",0]],["option",4,[["error",8]]]],[[["",0]],["option",4,[["error",8]]]],[[["",0]],["option",4,[["error",8]]]],[[["",0]],["statuscode",3]],[[["",0]],["statuscode",3]],[[["",0]],["string",3]],[[["",0]],["string",3]],[[["",0]],["string",3]],[[["",0]],["string",3]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,[[],["authentication",3,[["routes",3]]]],null,null,[[["serviceconfig",3]]],null,null,null,null,[[["serviceconfig",3]]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[["",0]],["string",3]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[["",0]],["string",3]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[["",0],["option",4,[["str",0]]]],["string",3]],[[]],[[]],null,null,[[],["auth",3]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["sudopage",3]],[[["",0],["",0]]],null,[[]],[[]],[[["str",0],["option",4,[["vec",3]]]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["errorpage",3]],[[["",0],["",0]]],[[["",0]],["string",3]],[[["",0]],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["str",0],["str",0]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[]],[[]],[[]],[[["vec",3,[["captcha",3]]]]],null,null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["serviceconfig",3]]],null,null,null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[["notification",3]]],[[]],[[]],null,null,[[]],[[]],[[]],null,null,null,[[["vec",3,[["notification",3]]]]],null,[[["",0]],["string",3]],null,[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[]],null,[[]],[[]],null,null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[["appservice",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,null,[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,[[]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],null,[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,null,null,null,[[["serviceconfig",3]]],null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[["",0]],["advanceindexpage",3]],[[["",0]],["easyindexpage",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[]],[[]],[[["",0]],["string",3]],[[["",0]],["string",3]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["appservice",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[["appservice",3]]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["advanceeditpage",3]],[[["",0]],["easyeditpage",3]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,[[["captcha",3],["vec",3,[["level",3]]],["string",3]]],[[["string",3],["trafficpatternrequest",3]]],null,[[["appservice",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["buffer",3]],["result",4,[["rendererror",4]]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[]],[[]],[[]],null,[[["vec",3,[["captcha",3]]]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,null,[[]],[[["",0],["str",0]],["string",3]],[[["",0],["str",0]],["string",3]],[[["",0],["str",0]],["string",3]],[[]],[[["",0],["str",0]],["string",3]],[[]],null,[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],null,[[]],[[]],[[]],[[]],null,null,null,[[["captchastats",3],["captcha",3],["vec",3,[["level",3]]],["string",3]]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,null,[[]],[[["",0],["option",4,[["str",0]]]],["string",3]],[[]],null,[[]],[[],["routes",3]],null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[]],[[["",0]],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,[[]],[[]],[[]],[[["serviceconfig",3]]],null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,null,[[["config",3]]],[[["",0]],["server",3]],[[["",0]],["captcha",3]],[[["",0]],["defaultdifficultystrategy",3]],[[["",0]],["smtp",3]],[[["",0]],["databasebuilder",3]],[[["",0]],["database",3]],[[["",0]],["redis",3]],[[["",0]],["settings",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],null,null,null,null,null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],null,null,null,[[["url",3]]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[["",0]],["string",3]],null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,[[],["result",4,[["configerror",4]]]],null,null,null,null,null,null,null,null,null,null,null,null,null,[[["config",3]]],[[["config",3],["databasebuilder",3]]],null,null,[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],null,null,null,null,null,null,[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,[[["serviceconfig",3]]],null,null,[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[["",0],["str",0]],["option",4,[["str",0]]]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[]],null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],null,[[]],[[]],[[]],[[]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["option",4,[["embeddedfile",3]]]],[[["str",0]],["httpresponse",3]],[[["str",0]],["httpresponse",3]],[[]],[[]],[[]],[[]],[[],["filenames",4]],[[]],[[],["filenames",4]],[[]],[[["appservice",3]]],[[["appservice",3]]],null,[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[["",0]]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["captchastats",3]],[[["",0]],["real",3]],[[["",0]],["dummy",3]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0],["",0]]],[[["",0]],["box",3,[["stats",8]]]],null,null,[[],["captchastats",3]],[[],["real",3]],[[],["dummy",3]],[[],["result",4]],[[["",0],["captchastats",3]],["bool",0]],[[["",0],["real",3]],["bool",0]],[[["",0],["dummy",3]],["bool",0]],[[["",0],["data",3],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[["",0],["formatter",3]],["result",6]],[[]],[[]],[[]],[[]],[[]],[[]],[[["",0],["captchastats",3]],["bool",0]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0],["data",3],["str",0]],["pin",3,[["box",3,[["future",8]]]]]],[[["",0]],["result",4]],null,[[["",0]]],[[["",0]]],[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,null,null,null,null,[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["",0]],[[["",0]],["indexpage",3]],[[["",0],["",0]]],[[["",0]],["string",3]],[[]],[[]],[[]],[[]],[[]],[[]],[[]],[[["appservice",3]]],[[],["renderresult",6]],[[["buffer",3]],["result",4,[["rendererror",4]]]],null,[[["serviceconfig",3]]],null,[[["",0]]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[["",0]],["typeid",3]],[[]],[[]],[[]],null,[[["",0]],["",0]],[[["",0]],["",0]],[[]],[[]],[[]],[[],["result",4]],[[],["result",4]],[[["",0]],["typeid",3]],null,[[]]],"p":[[3,"KEY"],[3,"GITHUB"],[3,"HOME"],[3,"SETTINGS_ICON"],[3,"CREDIT_CARD"],[3,"HELP_CIRCLE"],[3,"MESSAGE"],[3,"DOCS_ICON"],[3,"MCAPTCHA_TRANS_ICON"],[3,"BAR_CHART"],[3,"SETTINGS"],[3,"FILES"],[3,"JS"],[3,"CSS"],[3,"MOBILE_CSS"],[3,"VERIFICATIN_WIDGET_JS"],[3,"VERIFICATIN_WIDGET_CSS"],[3,"SOURCE_FILES_OF_INSTANCE"],[3,"Settings"],[3,"Data"],[3,"RedirectQuery"],[3,"AccountCheckPayload"],[3,"AccountCheckResp"],[3,"delete_account"],[3,"Email"],[3,"email_exists"],[3,"set_email"],[3,"UpdatePassword"],[3,"ChangePasswordReqest"],[3,"update_user_password"],[3,"Account"],[3,"get_secret"],[3,"update_user_secret"],[3,"username_exists"],[3,"Username"],[3,"set_username"],[3,"register"],[3,"login"],[3,"signout"],[3,"Auth"],[3,"Register"],[3,"Login"],[3,"Password"],[3,"CreateCaptcha"],[3,"MCaptchaDetails"],[3,"create"],[3,"DeleteCaptcha"],[3,"delete"],[3,"TrafficPatternRequest"],[3,"create"],[3,"UpdateTrafficPattern"],[3,"update"],[3,"Easy"],[3,"get_captcha"],[3,"Levels"],[3,"I32Levels"],[3,"Captcha"],[3,"StatsPayload"],[3,"get"],[3,"Stats"],[3,"update_key"],[3,"UpdateCaptcha"],[3,"update_captcha"],[4,"BuildDetailsBuilderError"],[4,"HealthBuilderError"],[3,"BuildDetails"],[3,"BuildDetailsBuilder"],[3,"build_details"],[3,"Health"],[3,"HealthBuilder"],[3,"health"],[13,"UninitializedField"],[13,"ValidationError"],[13,"UninitializedField"],[13,"ValidationError"],[3,"Meta"],[3,"AddNotificationRequest"],[3,"add_notification"],[3,"NotificationResp"],[3,"get_notification"],[3,"MarkReadReq"],[3,"mark_read"],[3,"Notifications"],[3,"GetConfigPayload"],[3,"get_config"],[3,"PoW"],[3,"ValidationToken"],[3,"verify_pow"],[3,"CaptchaValidateResp"],[3,"validate_captcha_token"],[3,"Routes"],[4,"SystemGroup"],[13,"Embedded"],[13,"Redis"],[3,"Date"],[3,"DemoUser"],[3,"Asset"],[3,"dist"],[3,"spec"],[3,"index"],[3,"Docs"],[3,"IndexPage"],[3,"SmtpErrorWrapper"],[3,"DBErrorWrapper"],[4,"ServiceError"],[4,"PageError"],[3,"ErrorToResponse"],[13,"ServiceError"],[13,"UnableToSendEmail"],[13,"CaptchaError"],[13,"DBError"],[3,"INDEX"],[3,"IndexPage"],[3,"login"],[3,"INDEX"],[3,"IndexPage"],[3,"join"],[3,"Auth"],[3,"SudoPage"],[3,"INTERNAL_SERVER_ERROR_BODY"],[3,"UNKNOWN_ERROR_BODY"],[3,"ErrorPage"],[3,"error"],[3,"Errors"],[3,"IndexPage"],[3,"panel"],[3,"Notification"],[3,"IndexPage"],[3,"notifications"],[3,"Panel"],[3,"IndexPage"],[3,"settings"],[3,"delete_account"],[3,"update_secret"],[3,"Settings"],[3,"ADVANCE_INDEX"],[3,"EASY_INDEX"],[3,"EasyIndexPage"],[3,"AdvanceIndexPage"],[3,"advance"],[3,"easy"],[3,"delete_sitekey"],[3,"AdvanceEditPage"],[3,"advance"],[3,"EasyEditPage"],[3,"easy"],[3,"IndexPage"],[3,"list_sitekeys"],[3,"Sitekey"],[3,"IndexPage"],[3,"view_sitekey"],[3,"Routes"],[3,"INDEX"],[3,"IndexPage"],[3,"sitemap"],[3,"DefaultDifficultyStrategy"],[3,"Server"],[3,"Captcha"],[3,"Smtp"],[3,"DatabaseBuilder"],[3,"Database"],[3,"Redis"],[3,"FileMap"],[3,"Asset"],[3,"static_files"],[3,"Favicons"],[3,"favicons"],[3,"CaptchaStats"],[3,"Real"],[3,"Dummy"],[8,"CloneStats"],[8,"Stats"],[3,"INDEX_PAGE"],[3,"IndexPage"],[3,"show_widget"],[3,"Widget"]]}\ }'); if (window.initSearch) {window.initSearch(searchIndex)}; \ No newline at end of file diff --git a/source-files.js b/source-files.js index 707899c1..9dcca70d 100644 --- a/source-files.js +++ b/source-files.js @@ -1,4 +1,5 @@ var N = null;var sourcesIndex = {}; -sourcesIndex["mcaptcha"] = {"name":"","dirs":[{"name":"api","dirs":[{"name":"v1","dirs":[{"name":"account","files":["delete.rs","email.rs","mod.rs","password.rs","secret.rs","username.rs"]},{"name":"mcaptcha","files":["create.rs","delete.rs","easy.rs","get.rs","mod.rs","stats.rs","update.rs"]},{"name":"notifications","files":["add.rs","get.rs","mark_read.rs","mod.rs"]},{"name":"pow","files":["get_config.rs","mod.rs","verify_pow.rs","verify_token.rs"]}],"files":["auth.rs","meta.rs","mod.rs","routes.rs"]}],"files":["mod.rs"]},{"name":"email","files":["mod.rs","verification.rs"]},{"name":"pages","dirs":[{"name":"auth","files":["login.rs","mod.rs","register.rs","sudo.rs"]},{"name":"panel","dirs":[{"name":"sitekey","files":["add.rs","delete.rs","edit.rs","list.rs","mod.rs","view.rs"]}],"files":["mod.rs","notifications.rs","settings.rs"]}],"files":["errors.rs","mod.rs","routes.rs","sitemap.rs"]},{"name":"static_assets","files":["filemap.rs","mod.rs","static_files.rs"]},{"name":"stats","files":["fetch.rs","mod.rs","record.rs"]},{"name":"widget","files":["mod.rs"]}],"files":["data.rs","date.rs","demo.rs","docs.rs","errors.rs","main.rs","routes.rs","settings.rs"]}; -sourcesIndex["tests_migrate"] = {"name":"","files":["settings.rs","tests-migrate.rs"]}; +sourcesIndex["db_core"] = {"name":"","files":["errors.rs","lib.rs","ops.rs","tests.rs"]}; +sourcesIndex["db_sqlx_postgres"] = {"name":"","files":["errors.rs","lib.rs"]}; +sourcesIndex["mcaptcha"] = {"name":"","dirs":[{"name":"api","dirs":[{"name":"v1","dirs":[{"name":"account","files":["delete.rs","email.rs","mod.rs","password.rs","secret.rs","username.rs"]},{"name":"mcaptcha","files":["create.rs","delete.rs","easy.rs","get.rs","mod.rs","stats.rs","update.rs"]},{"name":"notifications","files":["add.rs","get.rs","mark_read.rs","mod.rs"]},{"name":"pow","files":["get_config.rs","mod.rs","verify_pow.rs","verify_token.rs"]}],"files":["auth.rs","meta.rs","mod.rs","routes.rs"]}],"files":["mod.rs"]},{"name":"email","files":["mod.rs","verification.rs"]},{"name":"pages","dirs":[{"name":"auth","files":["login.rs","mod.rs","register.rs","sudo.rs"]},{"name":"panel","dirs":[{"name":"sitekey","files":["add.rs","delete.rs","edit.rs","list.rs","mod.rs","view.rs"]}],"files":["mod.rs","notifications.rs","settings.rs"]}],"files":["errors.rs","mod.rs","routes.rs","sitemap.rs"]},{"name":"static_assets","files":["filemap.rs","mod.rs","static_files.rs"]},{"name":"widget","files":["mod.rs"]}],"files":["data.rs","date.rs","demo.rs","docs.rs","errors.rs","main.rs","routes.rs","settings.rs","stats.rs"]}; createSourceSidebar(); diff --git a/src/db_core/errors.rs.html b/src/db_core/errors.rs.html new file mode 100644 index 00000000..e197a1ff --- /dev/null +++ b/src/db_core/errors.rs.html @@ -0,0 +1,130 @@ +errors.rs - source + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+
/*
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+//! represents all the ways a trait can fail using this crate
+use std::error::Error as StdError;
+
+//use derive_more::{error, Error as DeriveError};
+use thiserror::Error;
+
+/// Error data structure grouping various error subtypes
+#[derive(Debug, Error)]
+pub enum DBError {
+    /// errors that are specific to a database implementation
+    #[error("{0}")]
+    DBError(#[source] BoxDynError),
+    /// Username is taken
+    #[error("Username is taken")]
+    UsernameTaken,
+    /// Email is taken
+    #[error("Email is taken")]
+    EmailTaken,
+    /// Secret is taken
+    #[error("Secret is taken")]
+    SecretTaken,
+    /// Captcha key is taken
+    #[error("Captcha key is taken")]
+    CaptchaKeyTaken,
+    /// Account not found
+    #[error("Account not found")]
+    AccountNotFound,
+
+    /// Captcha not found
+    #[error("Captcha not found")]
+    CaptchaNotFound,
+    /// Traffic pattern not found
+    #[error("Traffic pattern not found")]
+    TrafficPatternNotFound,
+
+    /// Notification not found
+    #[error("Notification not found")]
+    NotificationNotFound,
+}
+
+/// Convenience type alias for grouping driver-specific errors
+pub type BoxDynError = Box<dyn StdError + 'static + Send + Sync>;
+
+/// Generic result data structure
+pub type DBResult<V> = std::result::Result<V, DBError>;
+
+
+ \ No newline at end of file diff --git a/src/db_core/lib.rs.html b/src/db_core/lib.rs.html new file mode 100644 index 00000000..0ee54d1a --- /dev/null +++ b/src/db_core/lib.rs.html @@ -0,0 +1,712 @@ +lib.rs - source + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+
/*
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+#![warn(missing_docs)]
+//! # `mCaptcha` database operations
+//!
+//! Traits and datastructures used in mCaptcha to interact with database.
+//!
+//! To use an unsupported database with mCaptcha, traits present within this crate should be
+//! implemented.
+//!
+//!
+//! ## Organisation
+//!
+//! Database functionallity is divided accross various modules:
+//!
+//! - [errors](crate::auth): error data structures used in this crate
+//! - [ops](crate::ops): meta operations like connection pool creation, migrations and getting
+//! connection from pool
+use serde::{Deserialize, Serialize};
+
+pub use libmcaptcha::defense::Level;
+
+pub mod errors;
+pub mod ops;
+#[cfg(feature = "test")]
+pub mod tests;
+
+use dev::*;
+pub use ops::GetConnection;
+
+pub mod prelude {
+    //! useful imports for users working with a supported database
+
+    pub use super::errors::*;
+    pub use super::ops::*;
+    pub use super::*;
+}
+
+pub mod dev {
+    //! useful imports for supporting a new database
+    pub use super::prelude::*;
+    pub use async_trait::async_trait;
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// Data required to register a new user
+pub struct Register<'a> {
+    /// username of new user
+    pub username: &'a str,
+    /// secret of new user
+    pub secret: &'a str,
+    /// hashed password of new use
+    pub hash: &'a str,
+    /// Optionally, email of new use
+    pub email: Option<&'a str>,
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// data required to update them email of a user
+pub struct UpdateEmail<'a> {
+    /// username of the user
+    pub username: &'a str,
+    /// new email address of the user
+    pub new_email: &'a str,
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// types of credentials used as identifiers during login
+pub enum Login<'a> {
+    /// username as login
+    Username(&'a str),
+    /// email as login
+    Email(&'a str),
+}
+
+#[derive(Clone, Debug, Deserialize, Serialize, PartialEq)]
+/// type encapsulating username and hashed password of a user
+pub struct NameHash {
+    /// username
+    pub username: String,
+    /// hashed password
+    pub hash: String,
+}
+
+#[async_trait]
+/// mCaptcha's database requirements. To implement support for $Database, kindly implement this
+/// trait.
+pub trait MCDatabase: std::marker::Send + std::marker::Sync + CloneSPDatabase {
+    /// ping DB
+    async fn ping(&self) -> bool;
+
+    /// register a new user
+    async fn register(&self, p: &Register) -> DBResult<()>;
+
+    /// delete a user
+    async fn delete_user(&self, username: &str) -> DBResult<()>;
+
+    /// check if username exists
+    async fn username_exists(&self, username: &str) -> DBResult<bool>;
+
+    /// get user email
+    async fn get_email(&self, username: &str) -> DBResult<Option<String>>;
+
+    /// check if email exists
+    async fn email_exists(&self, email: &str) -> DBResult<bool>;
+
+    /// update a user's email
+    async fn update_email(&self, p: &UpdateEmail) -> DBResult<()>;
+
+    /// get a user's password
+    async fn get_password(&self, l: &Login) -> DBResult<NameHash>;
+
+    /// update user's password
+    async fn update_password(&self, p: &NameHash) -> DBResult<()>;
+
+    /// update username
+    async fn update_username(&self, current: &str, new: &str) -> DBResult<()>;
+
+    /// get a user's secret
+    async fn get_secret(&self, username: &str) -> DBResult<Secret>;
+
+    /// update a user's secret
+    async fn update_secret(&self, username: &str, secret: &str) -> DBResult<()>;
+
+    /// create new captcha
+    async fn create_captcha(&self, username: &str, p: &CreateCaptcha) -> DBResult<()>;
+
+    /// Get captcha config
+    async fn get_captcha_config(&self, username: &str, key: &str) -> DBResult<Captcha>;
+
+    /// Get all captchas belonging to user
+    async fn get_all_user_captchas(&self, username: &str) -> DBResult<Vec<Captcha>>;
+
+    /// update captcha metadata; doesn't change captcha key
+    async fn update_captcha_metadata(
+        &self,
+        username: &str,
+        p: &CreateCaptcha,
+    ) -> DBResult<()>;
+
+    /// update captcha key; doesn't change metadata
+    async fn update_captcha_key(
+        &self,
+        username: &str,
+        old_key: &str,
+        new_key: &str,
+    ) -> DBResult<()>;
+
+    /// Add levels to captcha
+    async fn add_captcha_levels(
+        &self,
+        username: &str,
+        captcha_key: &str,
+        levels: &[Level],
+    ) -> DBResult<()>;
+
+    /// check if captcha exists
+    async fn captcha_exists(
+        &self,
+        username: Option<&str>,
+        captcha_key: &str,
+    ) -> DBResult<bool>;
+
+    /// Delete all levels of a captcha
+    async fn delete_captcha_levels(
+        &self,
+        username: &str,
+        captcha_key: &str,
+    ) -> DBResult<()>;
+
+    /// Delete captcha
+    async fn delete_captcha(&self, username: &str, captcha_key: &str) -> DBResult<()>;
+
+    /// Get captcha levels
+    async fn get_captcha_levels(
+        &self,
+        username: Option<&str>,
+        captcha_key: &str,
+    ) -> DBResult<Vec<Level>>;
+
+    /// Get captcha's cooldown period
+    async fn get_captcha_cooldown(&self, captcha_key: &str) -> DBResult<i32>;
+
+    /// Add traffic configuration
+    async fn add_traffic_pattern(
+        &self,
+        username: &str,
+        captcha_key: &str,
+        pattern: &TrafficPattern,
+    ) -> DBResult<()>;
+
+    /// Get traffic configuration
+    async fn get_traffic_pattern(
+        &self,
+        username: &str,
+        captcha_key: &str,
+    ) -> DBResult<TrafficPattern>;
+
+    /// Delete traffic configuration
+    async fn delete_traffic_pattern(
+        &self,
+        username: &str,
+        captcha_key: &str,
+    ) -> DBResult<()>;
+
+    /// create new notification
+    async fn create_notification(&self, p: &AddNotification) -> DBResult<()>;
+
+    /// get all unread notifications
+    async fn get_all_unread_notifications(
+        &self,
+        username: &str,
+    ) -> DBResult<Vec<Notification>>;
+
+    /// mark a notification read
+    async fn mark_notification_read(&self, username: &str, id: i32) -> DBResult<()>;
+
+    /// record PoWConfig fetches
+    async fn record_fetch(&self, key: &str) -> DBResult<()>;
+
+    /// record PoWConfig solves
+    async fn record_solve(&self, key: &str) -> DBResult<()>;
+
+    /// record PoWConfig confirms
+    async fn record_confirm(&self, key: &str) -> DBResult<()>;
+
+    /// featch PoWConfig fetches
+    async fn fetch_config_fetched(&self, user: &str, key: &str) -> DBResult<Vec<i64>>;
+
+    /// featch PoWConfig solves
+    async fn fetch_solve(&self, user: &str, key: &str) -> DBResult<Vec<i64>>;
+
+    /// featch PoWConfig confirms
+    async fn fetch_confirm(&self, user: &str, key: &str) -> DBResult<Vec<i64>>;
+}
+
+#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)]
+/// Captcha statistics with time recorded in UNIX epoch formats
+pub struct StatsUnixTimestamp {
+    /// times at which the configuration were fetched
+    pub config_fetches: Vec<i64>,
+    /// times at which the PoW was solved
+    pub solves: Vec<i64>,
+    /// times at which the PoW token was verified
+    pub confirms: Vec<i64>,
+}
+
+#[derive(Debug, Clone, Default, Deserialize, Serialize, PartialEq)]
+/// Represents notification
+pub struct Notification {
+    /// receiver name  of the notification
+    pub name: Option<String>,
+    /// heading of the notification
+    pub heading: Option<String>,
+    /// message of the notification
+    pub message: Option<String>,
+    /// when notification was received
+    pub received: Option<i64>,
+    /// db assigned ID of the notification
+    pub id: Option<i32>,
+}
+
+#[derive(Debug, Clone, Default, PartialEq, Serialize, Deserialize)]
+/// Data required to add notification
+pub struct AddNotification<'a> {
+    /// who is the notification addressed to?
+    pub to: &'a str,
+    /// notification sender
+    pub from: &'a str,
+    /// heading of the notification
+    pub heading: &'a str,
+    /// mesage of the notification
+    pub message: &'a str,
+}
+
+#[derive(Default, PartialEq, Serialize, Deserialize, Clone, Debug)]
+/// User's traffic pattern; used in generating a captcha configuration
+pub struct TrafficPattern {
+    /// average traffic of user's website
+    pub avg_traffic: u32,
+    /// the peak traffic that the user's website can handle
+    pub peak_sustainable_traffic: u32,
+    /// trafic that bought the user's website down; optional
+    pub broke_my_site_traffic: Option<u32>,
+}
+
+#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
+/// data requried to create new captcha
+pub struct CreateCaptcha<'a> {
+    /// cool down duration
+    pub duration: i32,
+    /// description of the captcha
+    pub description: &'a str,
+    /// secret key of the captcha
+    pub key: &'a str,
+}
+
+#[derive(Clone, Debug, Default, PartialEq, Deserialize, Serialize)]
+/// Data representing a captcha
+pub struct Captcha {
+    /// Database assigned ID
+    pub config_id: i32,
+    /// cool down duration
+    pub duration: i32,
+    /// description of the captcha
+    pub description: String,
+    /// secret key of the captcha
+    pub key: String,
+}
+
+#[derive(Clone, Debug, Deserialize, PartialEq, Default, Serialize)]
+/// datastructure representing a user's secret
+pub struct Secret {
+    /// user's secret
+    pub secret: String,
+}
+
+/// Trait to clone MCDatabase
+pub trait CloneSPDatabase {
+    /// clone DB
+    fn clone_db(&self) -> Box<dyn MCDatabase>;
+}
+
+impl<T> CloneSPDatabase for T
+where
+    T: MCDatabase + Clone + 'static,
+{
+    fn clone_db(&self) -> Box<dyn MCDatabase> {
+        Box::new(self.clone())
+    }
+}
+
+impl Clone for Box<dyn MCDatabase> {
+    fn clone(&self) -> Self {
+        (**self).clone_db()
+    }
+}
+
+
+ \ No newline at end of file diff --git a/src/db_core/ops.rs.html b/src/db_core/ops.rs.html new file mode 100644 index 00000000..2e4ce354 --- /dev/null +++ b/src/db_core/ops.rs.html @@ -0,0 +1,106 @@ +ops.rs - source + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+
/*
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+//! meta operations like migration and connecting to a database
+use crate::dev::*;
+
+/// Database operations trait(migrations, pool creation and fetching connection from pool)
+pub trait DBOps: GetConnection + Migrate {}
+
+/// Get database connection
+#[async_trait]
+pub trait GetConnection {
+    /// database connection type
+    type Conn;
+    /// database specific error-type
+    /// get connection from connection pool
+    async fn get_conn(&self) -> DBResult<Self::Conn>;
+}
+
+/// Create databse connection
+#[async_trait]
+pub trait Connect {
+    /// database specific pool-type
+    type Pool: MCDatabase;
+    /// database specific error-type
+    /// create connection pool
+    async fn connect(self) -> DBResult<Self::Pool>;
+}
+
+/// database migrations
+#[async_trait]
+pub trait Migrate: MCDatabase {
+    /// database specific error-type
+    /// run migrations
+    async fn migrate(&self) -> DBResult<()>;
+}
+
+
+ \ No newline at end of file diff --git a/src/db_core/tests.rs.html b/src/db_core/tests.rs.html new file mode 100644 index 00000000..4a974e99 --- /dev/null +++ b/src/db_core/tests.rs.html @@ -0,0 +1,576 @@ +tests.rs - source + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+
/*
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+//! Test utilities
+use crate::errors::*;
+use crate::prelude::*;
+
+/// test all database functions
+pub async fn database_works<'a, T: MCDatabase>(
+    db: &T,
+    p: &Register<'a>,
+    c: &CreateCaptcha<'a>,
+    l: &[Level],
+    tp: &TrafficPattern,
+    an: &AddNotification<'a>,
+) {
+    assert!(db.ping().await, "ping test");
+    if db.username_exists(p.username).await.unwrap() {
+        db.delete_user(p.username).await.unwrap();
+        assert!(
+            !db.username_exists(p.username).await.unwrap(),
+            "user is deleted so username shouldn't exsit"
+        );
+    }
+    db.register(p).await.unwrap();
+
+    // testing get secret
+    let secret = db.get_secret(p.username).await.unwrap();
+    assert_eq!(secret.secret, p.secret, "user secret matches");
+
+    // testing update secret: setting secret = username
+    db.update_secret(p.username, p.username).await.unwrap();
+    let secret = db.get_secret(p.username).await.unwrap();
+    assert_eq!(
+        secret.secret, p.username,
+        "user secret matches username; as set by previous step"
+    );
+
+    // testing get_password
+
+    // with username
+    let name_hash = db.get_password(&Login::Username(p.username)).await.unwrap();
+    assert_eq!(name_hash.hash, p.hash, "user password matches");
+
+    assert_eq!(name_hash.username, p.username, "username matches");
+
+    // with email
+    let mut name_hash = db
+        .get_password(&Login::Email(p.email.as_ref().unwrap()))
+        .await
+        .unwrap();
+    assert_eq!(name_hash.hash, p.hash, "user password matches");
+    assert_eq!(name_hash.username, p.username, "username matches");
+
+    // testing get_email
+    assert_eq!(
+        db.get_email(p.username)
+            .await
+            .unwrap()
+            .as_ref()
+            .unwrap()
+            .as_str(),
+        p.email.unwrap()
+    );
+
+    // testing email exists
+    assert!(
+        db.email_exists(p.email.as_ref().unwrap()).await.unwrap(),
+        "user is registered so email should exsit"
+    );
+    assert!(
+        db.username_exists(p.username).await.unwrap(),
+        "user is registered so username should exsit"
+    );
+
+    // update password test. setting password = username
+    name_hash.hash = name_hash.username.clone();
+    db.update_password(&name_hash).await.unwrap();
+
+    let name_hash = db.get_password(&Login::Username(p.username)).await.unwrap();
+    assert_eq!(
+        name_hash.hash, p.username,
+        "user password matches with changed value"
+    );
+    assert_eq!(name_hash.username, p.username, "username matches");
+
+    // update username to p.email
+    assert!(
+        !db.username_exists(p.email.as_ref().unwrap()).await.unwrap(),
+        "user with p.email doesn't exist. pre-check to update username to p.email"
+    );
+    db.update_username(p.username, p.email.as_ref().unwrap())
+        .await
+        .unwrap();
+    assert!(
+        db.username_exists(p.email.as_ref().unwrap()).await.unwrap(),
+        "user with p.email exist post-update"
+    );
+
+    // deleting user for re-registration with email = None
+    db.delete_user(p.email.as_ref().unwrap()).await.unwrap();
+    assert!(
+        !db.username_exists(p.email.as_ref().unwrap()).await.unwrap(),
+        "user is deleted so username shouldn't exsit"
+    );
+
+    // register with email = None
+    let mut p2 = p.clone();
+    p2.email = None;
+    db.register(&p2).await.unwrap();
+    assert!(
+        db.username_exists(p2.username).await.unwrap(),
+        "user is registered so username should exsit"
+    );
+    assert!(
+        !db.email_exists(p.email.as_ref().unwrap()).await.unwrap(),
+        "user registration with email is deleted; so email shouldn't exsit"
+    );
+
+    // testing get_email = None
+    assert_eq!(db.get_email(p.username).await.unwrap(), None);
+
+    // testing update email
+    let update_email = UpdateEmail {
+        username: p.username,
+        new_email: p.email.as_ref().unwrap(),
+    };
+    db.update_email(&update_email).await.unwrap();
+    println!(
+        "null user email: {}",
+        db.email_exists(p.email.as_ref().unwrap()).await.unwrap()
+    );
+    assert!(
+        db.email_exists(p.email.as_ref().unwrap()).await.unwrap(),
+        "user was with empty email but email is set; so email should exsit"
+    );
+
+    /*
+     * test notification workflows
+     * 1. Add notifications: a minimum of two, to mark as read and test if it has affected it
+     * 2. Get unread notifications
+     * 3. Mark a notification read, check if it has affected Step #2
+     */
+
+    // 1. add notification
+    db.create_notification(an).await.unwrap();
+    db.create_notification(an).await.unwrap();
+
+    // 2. Get notifications
+    let notifications = db.get_all_unread_notifications(an.to).await.unwrap();
+    assert_eq!(notifications.len(), 2);
+    assert_eq!(notifications[0].heading.as_ref().unwrap(), an.heading);
+
+    // 3. mark a notification read
+    db.mark_notification_read(an.to, notifications[0].id.unwrap())
+        .await
+        .unwrap();
+    let new_notifications = db.get_all_unread_notifications(an.to).await.unwrap();
+    assert_eq!(new_notifications.len(), 1);
+
+    // create captcha
+    db.create_captcha(p.username, c).await.unwrap();
+    assert!(db.captcha_exists(None, c.key).await.unwrap());
+    assert!(db.captcha_exists(Some(p.username), c.key).await.unwrap());
+
+    // get captcha configuration
+    let captcha = db.get_captcha_config(p.username, c.key).await.unwrap();
+    assert_eq!(captcha.key, c.key);
+    assert_eq!(captcha.duration, c.duration);
+    assert_eq!(captcha.description, c.description);
+
+    // get all captchas that belong to user
+    let all_user_captchas = db.get_all_user_captchas(p.username).await.unwrap();
+    assert_eq!(all_user_captchas.len(), 1);
+    assert_eq!(all_user_captchas[0], captcha);
+
+    // get captcha cooldown duration
+    assert_eq!(db.get_captcha_cooldown(c.key).await.unwrap(), c.duration);
+
+    // add traffic pattern
+    db.add_traffic_pattern(p.username, c.key, tp).await.unwrap();
+    assert_eq!(
+        &db.get_traffic_pattern(p.username, c.key).await.unwrap(),
+        tp
+    );
+
+    // delete traffic pattern
+    db.delete_traffic_pattern(p.username, c.key).await.unwrap();
+    assert!(
+        matches!(
+            db.get_traffic_pattern(p.username, c.key).await,
+            Err(DBError::TrafficPatternNotFound)
+        ),
+        "deletion successful; traffic pattern no longer exists"
+    );
+
+    // add captcha levels
+    db.add_captcha_levels(p.username, c.key, l).await.unwrap();
+
+    // get captcha levels with username
+    let levels = db
+        .get_captcha_levels(Some(p.username), c.key)
+        .await
+        .unwrap();
+    assert_eq!(levels, l);
+    // get captcha levels without username
+    let levels = db.get_captcha_levels(None, c.key).await.unwrap();
+    assert_eq!(levels, l);
+
+    /*
+     * Test stats
+     * 1. record fetch config
+     * 2. record solve
+     * 3. record token verify
+     * 4. fetch config fetches
+     * 5. fetch solves
+     * 6. fetch token verify
+     */
+
+    assert!(db
+        .fetch_config_fetched(p.username, c.key)
+        .await
+        .unwrap()
+        .is_empty());
+    assert!(db.fetch_solve(p.username, c.key).await.unwrap().is_empty());
+    assert!(db
+        .fetch_confirm(p.username, c.key)
+        .await
+        .unwrap()
+        .is_empty());
+
+    db.record_fetch(c.key).await.unwrap();
+    db.record_solve(c.key).await.unwrap();
+    db.record_confirm(c.key).await.unwrap();
+
+    assert_eq!(db.fetch_solve(p.username, c.key).await.unwrap().len(), 1);
+    assert_eq!(
+        db.fetch_config_fetched(p.username, c.key)
+            .await
+            .unwrap()
+            .len(),
+        1
+    );
+    assert_eq!(db.fetch_solve(p.username, c.key).await.unwrap().len(), 1);
+    assert_eq!(db.fetch_confirm(p.username, c.key).await.unwrap().len(), 1);
+
+    // update captcha key; set key = username;
+    db.update_captcha_key(p.username, c.key, p.username)
+        .await
+        .unwrap();
+    // checking for captcha with old key; shouldn't exist
+    assert!(!db.captcha_exists(Some(p.username), c.key).await.unwrap());
+    // checking for captcha with new key; shouldn exist
+    assert!(db
+        .captcha_exists(Some(p.username), p.username)
+        .await
+        .unwrap());
+
+    // delete captcha levels
+    db.delete_captcha_levels(p.username, c.key).await.unwrap();
+
+    // update captcha; set description = username and duration *= duration;
+    let mut c2 = c.clone();
+    c2.duration *= c2.duration;
+    c2.description = p.username;
+    db.update_captcha_metadata(p.username, &c2).await.unwrap();
+
+    // delete captcha; updated key = p.username so invoke delete with it
+    db.delete_captcha(p.username, p.username).await.unwrap();
+    assert!(!db.captcha_exists(Some(p.username), c.key).await.unwrap());
+}
+
+
+ \ No newline at end of file diff --git a/src/db_sqlx_postgres/errors.rs.html b/src/db_sqlx_postgres/errors.rs.html new file mode 100644 index 00000000..20fca940 --- /dev/null +++ b/src/db_sqlx_postgres/errors.rs.html @@ -0,0 +1,120 @@ +errors.rs - source + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+
/*
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+//! Error-handling utilities
+use std::borrow::Cow;
+
+use db_core::dev::*;
+use sqlx::Error;
+
+/// map custom row not found error to DB error
+pub fn map_row_not_found_err(e: Error, row_not_found: DBError) -> DBError {
+    if let Error::RowNotFound = e {
+        row_not_found
+    } else {
+        map_register_err(e)
+    }
+}
+
+/// map postgres errors to [DBError](DBError) types
+pub fn map_register_err(e: Error) -> DBError {
+    if let Error::Database(err) = e {
+        if err.code() == Some(Cow::from("23505")) {
+            let msg = err.message();
+            println!("{}", msg);
+            if msg.contains("mcaptcha_users_name_key") {
+                DBError::UsernameTaken
+            } else if msg.contains("mcaptcha_users_email_key") {
+                DBError::EmailTaken
+            } else if msg.contains("mcaptcha_users_secret_key") {
+                DBError::SecretTaken
+            } else if msg.contains("mcaptcha_config_key_key") {
+                DBError::CaptchaKeyTaken
+            } else {
+                DBError::DBError(Box::new(Error::Database(err)))
+            }
+        } else {
+            DBError::DBError(Box::new(Error::Database(err)))
+        }
+    } else {
+        DBError::DBError(Box::new(e))
+    }
+}
+
+
+ \ No newline at end of file diff --git a/src/db_sqlx_postgres/lib.rs.html b/src/db_sqlx_postgres/lib.rs.html new file mode 100644 index 00000000..e4c1ea21 --- /dev/null +++ b/src/db_sqlx_postgres/lib.rs.html @@ -0,0 +1,1888 @@ +lib.rs - source + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+131
+132
+133
+134
+135
+136
+137
+138
+139
+140
+141
+142
+143
+144
+145
+146
+147
+148
+149
+150
+151
+152
+153
+154
+155
+156
+157
+158
+159
+160
+161
+162
+163
+164
+165
+166
+167
+168
+169
+170
+171
+172
+173
+174
+175
+176
+177
+178
+179
+180
+181
+182
+183
+184
+185
+186
+187
+188
+189
+190
+191
+192
+193
+194
+195
+196
+197
+198
+199
+200
+201
+202
+203
+204
+205
+206
+207
+208
+209
+210
+211
+212
+213
+214
+215
+216
+217
+218
+219
+220
+221
+222
+223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
+247
+248
+249
+250
+251
+252
+253
+254
+255
+256
+257
+258
+259
+260
+261
+262
+263
+264
+265
+266
+267
+268
+269
+270
+271
+272
+273
+274
+275
+276
+277
+278
+279
+280
+281
+282
+283
+284
+285
+286
+287
+288
+289
+290
+291
+292
+293
+294
+295
+296
+297
+298
+299
+300
+301
+302
+303
+304
+305
+306
+307
+308
+309
+310
+311
+312
+313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
+340
+341
+342
+343
+344
+345
+346
+347
+348
+349
+350
+351
+352
+353
+354
+355
+356
+357
+358
+359
+360
+361
+362
+363
+364
+365
+366
+367
+368
+369
+370
+371
+372
+373
+374
+375
+376
+377
+378
+379
+380
+381
+382
+383
+384
+385
+386
+387
+388
+389
+390
+391
+392
+393
+394
+395
+396
+397
+398
+399
+400
+401
+402
+403
+404
+405
+406
+407
+408
+409
+410
+411
+412
+413
+414
+415
+416
+417
+418
+419
+420
+421
+422
+423
+424
+425
+426
+427
+428
+429
+430
+431
+432
+433
+434
+435
+436
+437
+438
+439
+440
+441
+442
+443
+444
+445
+446
+447
+448
+449
+450
+451
+452
+453
+454
+455
+456
+457
+458
+459
+460
+461
+462
+463
+464
+465
+466
+467
+468
+469
+470
+471
+472
+473
+474
+475
+476
+477
+478
+479
+480
+481
+482
+483
+484
+485
+486
+487
+488
+489
+490
+491
+492
+493
+494
+495
+496
+497
+498
+499
+500
+501
+502
+503
+504
+505
+506
+507
+508
+509
+510
+511
+512
+513
+514
+515
+516
+517
+518
+519
+520
+521
+522
+523
+524
+525
+526
+527
+528
+529
+530
+531
+532
+533
+534
+535
+536
+537
+538
+539
+540
+541
+542
+543
+544
+545
+546
+547
+548
+549
+550
+551
+552
+553
+554
+555
+556
+557
+558
+559
+560
+561
+562
+563
+564
+565
+566
+567
+568
+569
+570
+571
+572
+573
+574
+575
+576
+577
+578
+579
+580
+581
+582
+583
+584
+585
+586
+587
+588
+589
+590
+591
+592
+593
+594
+595
+596
+597
+598
+599
+600
+601
+602
+603
+604
+605
+606
+607
+608
+609
+610
+611
+612
+613
+614
+615
+616
+617
+618
+619
+620
+621
+622
+623
+624
+625
+626
+627
+628
+629
+630
+631
+632
+633
+634
+635
+636
+637
+638
+639
+640
+641
+642
+643
+644
+645
+646
+647
+648
+649
+650
+651
+652
+653
+654
+655
+656
+657
+658
+659
+660
+661
+662
+663
+664
+665
+666
+667
+668
+669
+670
+671
+672
+673
+674
+675
+676
+677
+678
+679
+680
+681
+682
+683
+684
+685
+686
+687
+688
+689
+690
+691
+692
+693
+694
+695
+696
+697
+698
+699
+700
+701
+702
+703
+704
+705
+706
+707
+708
+709
+710
+711
+712
+713
+714
+715
+716
+717
+718
+719
+720
+721
+722
+723
+724
+725
+726
+727
+728
+729
+730
+731
+732
+733
+734
+735
+736
+737
+738
+739
+740
+741
+742
+743
+744
+745
+746
+747
+748
+749
+750
+751
+752
+753
+754
+755
+756
+757
+758
+759
+760
+761
+762
+763
+764
+765
+766
+767
+768
+769
+770
+771
+772
+773
+774
+775
+776
+777
+778
+779
+780
+781
+782
+783
+784
+785
+786
+787
+788
+789
+790
+791
+792
+793
+794
+795
+796
+797
+798
+799
+800
+801
+802
+803
+804
+805
+806
+807
+808
+809
+810
+811
+812
+813
+814
+815
+816
+817
+818
+819
+820
+821
+822
+823
+824
+825
+826
+827
+828
+829
+830
+831
+832
+833
+834
+835
+836
+837
+838
+839
+840
+841
+842
+843
+844
+845
+846
+847
+848
+849
+850
+851
+852
+853
+854
+855
+856
+857
+858
+859
+860
+861
+862
+863
+864
+865
+866
+867
+868
+869
+870
+871
+872
+873
+874
+875
+876
+877
+878
+879
+880
+881
+882
+883
+884
+885
+886
+887
+888
+889
+890
+891
+892
+893
+894
+895
+896
+897
+898
+899
+900
+901
+902
+903
+904
+905
+906
+907
+908
+909
+910
+911
+912
+913
+914
+915
+916
+917
+918
+919
+920
+921
+922
+923
+924
+925
+926
+927
+928
+929
+930
+931
+932
+933
+934
+935
+936
+937
+938
+939
+940
+
/*
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+use db_core::dev::*;
+
+use sqlx::postgres::PgPoolOptions;
+use sqlx::types::time::OffsetDateTime;
+use sqlx::PgPool;
+
+pub mod errors;
+#[cfg(test)]
+pub mod tests;
+
+#[derive(Clone)]
+pub struct Database {
+    pub pool: PgPool,
+}
+
+/// Use an existing database pool
+pub struct Conn(pub PgPool);
+
+/// Connect to databse
+pub enum ConnectionOptions {
+    /// fresh connection
+    Fresh(Fresh),
+    /// existing connection
+    Existing(Conn),
+}
+
+pub struct Fresh {
+    pub pool_options: PgPoolOptions,
+    pub url: String,
+}
+
+pub mod dev {
+    pub use super::errors::*;
+    pub use super::Database;
+    pub use db_core::dev::*;
+    pub use prelude::*;
+    pub use sqlx::Error;
+}
+
+pub mod prelude {
+    pub use super::*;
+    pub use db_core::prelude::*;
+}
+
+#[async_trait]
+impl Connect for ConnectionOptions {
+    type Pool = Database;
+    async fn connect(self) -> DBResult<Self::Pool> {
+        let pool = match self {
+            Self::Fresh(fresh) => fresh
+                .pool_options
+                .connect(&fresh.url)
+                .await
+                .map_err(|e| DBError::DBError(Box::new(e)))?,
+            Self::Existing(conn) => conn.0,
+        };
+        Ok(Database { pool })
+    }
+}
+
+use dev::*;
+
+#[async_trait]
+impl Migrate for Database {
+    async fn migrate(&self) -> DBResult<()> {
+        sqlx::migrate!("./migrations/")
+            .run(&self.pool)
+            .await
+            .map_err(|e| DBError::DBError(Box::new(e)))?;
+        Ok(())
+    }
+}
+
+#[async_trait]
+impl MCDatabase for Database {
+    /// ping DB
+    async fn ping(&self) -> bool {
+        use sqlx::Connection;
+
+        if let Ok(mut con) = self.pool.acquire().await {
+            con.ping().await.is_ok()
+        } else {
+            false
+        }
+    }
+
+    /// register a new user
+    async fn register(&self, p: &Register) -> DBResult<()> {
+        let res = if let Some(email) = &p.email {
+            sqlx::query!(
+                "insert into mcaptcha_users 
+        (name , password, email, secret) values ($1, $2, $3, $4)",
+                &p.username,
+                &p.hash,
+                &email,
+                &p.secret,
+            )
+            .execute(&self.pool)
+            .await
+        } else {
+            sqlx::query!(
+                "INSERT INTO mcaptcha_users 
+        (name , password,  secret) VALUES ($1, $2, $3)",
+                &p.username,
+                &p.hash,
+                &p.secret,
+            )
+            .execute(&self.pool)
+            .await
+        };
+        res.map_err(map_register_err)?;
+        Ok(())
+    }
+
+    /// delete a user
+    async fn delete_user(&self, username: &str) -> DBResult<()> {
+        sqlx::query!("DELETE FROM mcaptcha_users WHERE name = ($1)", username)
+            .execute(&self.pool)
+            .await
+            .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+        Ok(())
+    }
+
+    /// check if username exists
+    async fn username_exists(&self, username: &str) -> DBResult<bool> {
+        let res = sqlx::query!(
+            "SELECT EXISTS (SELECT 1 from mcaptcha_users WHERE name = $1)",
+            username,
+        )
+        .fetch_one(&self.pool)
+        .await
+        .map_err(map_register_err)?;
+
+        let mut resp = false;
+        if let Some(x) = res.exists {
+            resp = x;
+        }
+
+        Ok(resp)
+    }
+
+    /// get user email
+    async fn get_email(&self, username: &str) -> DBResult<Option<String>> {
+        struct Email {
+            email: Option<String>,
+        }
+
+        let res = sqlx::query_as!(
+            Email,
+            "SELECT email FROM mcaptcha_users WHERE name = $1",
+            username
+        )
+        .fetch_one(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+        Ok(res.email)
+    }
+
+    /// check if email exists
+    async fn email_exists(&self, email: &str) -> DBResult<bool> {
+        let res = sqlx::query!(
+            "SELECT EXISTS (SELECT 1 from mcaptcha_users WHERE email = $1)",
+            email
+        )
+        .fetch_one(&self.pool)
+        .await
+        .map_err(map_register_err)?;
+
+        let mut resp = false;
+        if let Some(x) = res.exists {
+            resp = x;
+        }
+
+        Ok(resp)
+    }
+
+    /// update a user's email
+    async fn update_email(&self, p: &UpdateEmail) -> DBResult<()> {
+        sqlx::query!(
+            "UPDATE mcaptcha_users set email = $1
+            WHERE name = $2",
+            &p.new_email,
+            &p.username,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+
+        Ok(())
+    }
+
+    /// get a user's password
+    async fn get_password(&self, l: &Login) -> DBResult<NameHash> {
+        struct Password {
+            name: String,
+            password: String,
+        }
+
+        let rec = match l {
+            Login::Username(u) => sqlx::query_as!(
+                Password,
+                r#"SELECT name, password  FROM mcaptcha_users WHERE name = ($1)"#,
+                u,
+            )
+            .fetch_one(&self.pool)
+            .await
+            .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?,
+
+            Login::Email(e) => sqlx::query_as!(
+                Password,
+                r#"SELECT name, password  FROM mcaptcha_users WHERE email = ($1)"#,
+                e,
+            )
+            .fetch_one(&self.pool)
+            .await
+            .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?,
+        };
+
+        let res = NameHash {
+            hash: rec.password,
+            username: rec.name,
+        };
+
+        Ok(res)
+    }
+
+    /// update user's password
+    async fn update_password(&self, p: &NameHash) -> DBResult<()> {
+        sqlx::query!(
+            "UPDATE mcaptcha_users set password = $1
+            WHERE name = $2",
+            &p.hash,
+            &p.username,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+
+        Ok(())
+    }
+
+    /// update username
+    async fn update_username(&self, current: &str, new: &str) -> DBResult<()> {
+        sqlx::query!(
+            "UPDATE mcaptcha_users set name = $1
+            WHERE name = $2",
+            new,
+            current,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+
+        Ok(())
+    }
+
+    /// get a user's secret
+    async fn get_secret(&self, username: &str) -> DBResult<Secret> {
+        let secret = sqlx::query_as!(
+            Secret,
+            r#"SELECT secret  FROM mcaptcha_users WHERE name = ($1)"#,
+            username,
+        )
+        .fetch_one(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+
+        Ok(secret)
+    }
+
+    /// update a user's secret
+    async fn update_secret(&self, username: &str, secret: &str) -> DBResult<()> {
+        sqlx::query!(
+            "UPDATE mcaptcha_users set secret = $1
+        WHERE name = $2",
+            &secret,
+            &username,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+
+        Ok(())
+    }
+
+    /// create new captcha
+    async fn create_captcha(&self, username: &str, p: &CreateCaptcha) -> DBResult<()> {
+        sqlx::query!(
+            "INSERT INTO mcaptcha_config
+        (key, user_id, duration, name)
+        VALUES ($1, (SELECT ID FROM mcaptcha_users WHERE name = $2), $3, $4)",
+            p.key,
+            username,
+            p.duration as i32,
+            p.description,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+
+        Ok(())
+    }
+
+    /// Get captcha config
+    async fn get_captcha_config(&self, username: &str, key: &str) -> DBResult<Captcha> {
+        let captcha = sqlx::query_as!(
+            InternaleCaptchaConfig,
+            "SELECT config_id, duration, name, key from mcaptcha_config WHERE
+                        key = $1 AND
+                        user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2) ",
+            &key,
+            &username,
+        )
+        .fetch_one(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(captcha.into())
+    }
+
+    /// Get all captchas belonging to user
+    async fn get_all_user_captchas(&self, username: &str) -> DBResult<Vec<Captcha>> {
+        let mut res = sqlx::query_as!(
+            InternaleCaptchaConfig,
+            "SELECT key, name, config_id, duration FROM mcaptcha_config WHERE
+            user_id = (SELECT ID FROM mcaptcha_users WHERE name = $1) ",
+            &username,
+        )
+        .fetch_all(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+
+        let mut captchas = Vec::with_capacity(res.len());
+
+        res.drain(0..).for_each(|r| captchas.push(r.into()));
+
+        Ok(captchas)
+    }
+
+    /// update captcha metadata; doesn't change captcha key
+    async fn update_captcha_metadata(
+        &self,
+        username: &str,
+        p: &CreateCaptcha,
+    ) -> DBResult<()> {
+        sqlx::query!(
+            "UPDATE mcaptcha_config SET name = $1, duration = $2
+            WHERE user_id = (SELECT ID FROM mcaptcha_users WHERE name = $3)
+            AND key = $4",
+            p.description,
+            p.duration,
+            username,
+            p.key,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(())
+    }
+
+    /// update captcha key; doesn't change metadata
+    async fn update_captcha_key(
+        &self,
+        username: &str,
+        old_key: &str,
+        new_key: &str,
+    ) -> DBResult<()> {
+        sqlx::query!(
+            "UPDATE mcaptcha_config SET key = $1 
+        WHERE key = $2 AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $3)",
+            new_key,
+            old_key,
+            username,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(())
+    }
+
+    /// Add levels to captcha
+    async fn add_captcha_levels(
+        &self,
+        username: &str,
+        captcha_key: &str,
+        levels: &[Level],
+    ) -> DBResult<()> {
+        use futures::future::try_join_all;
+        let mut futs = Vec::with_capacity(levels.len());
+
+        for level in levels.iter() {
+            let difficulty_factor = level.difficulty_factor as i32;
+            let visitor_threshold = level.visitor_threshold as i32;
+            let fut = sqlx::query!(
+                "INSERT INTO mcaptcha_levels (
+            difficulty_factor, 
+            visitor_threshold,
+            config_id) VALUES  (
+            $1, $2, (
+                SELECT config_id FROM mcaptcha_config WHERE
+                key = ($3) AND user_id = (
+                SELECT ID FROM mcaptcha_users WHERE name = $4
+                    )));",
+                difficulty_factor,
+                visitor_threshold,
+                &captcha_key,
+                username,
+            )
+            .execute(&self.pool);
+            futs.push(fut);
+        }
+
+        try_join_all(futs)
+            .await
+            .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(())
+    }
+
+    /// check if captcha exists
+    async fn captcha_exists(
+        &self,
+        username: Option<&str>,
+        captcha_key: &str,
+    ) -> DBResult<bool> {
+        let mut exists = false;
+
+        match username {
+            Some(username) => {
+                let x = sqlx::query!(
+                    "SELECT EXISTS (
+            SELECT 1 from mcaptcha_config WHERE key = $1 
+            AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2)
+            )",
+                    captcha_key,
+                    username
+                )
+                .fetch_one(&self.pool)
+                .await
+                .map_err(map_register_err)?;
+                if let Some(x) = x.exists {
+                    exists = x;
+                };
+            }
+
+            None => {
+                let x = sqlx::query!(
+                    "SELECT EXISTS (SELECT 1 from mcaptcha_config WHERE key = $1)",
+                    &captcha_key,
+                )
+                .fetch_one(&self.pool)
+                .await
+                .map_err(map_register_err)?;
+                if let Some(x) = x.exists {
+                    exists = x;
+                };
+            }
+        };
+
+        Ok(exists)
+    }
+
+    /// Delete all levels of a captcha
+    async fn delete_captcha_levels(
+        &self,
+        username: &str,
+        captcha_key: &str,
+    ) -> DBResult<()> {
+        sqlx::query!(
+            "DELETE FROM mcaptcha_levels 
+        WHERE config_id = (
+            SELECT config_id FROM mcaptcha_config where key = ($1) 
+            AND user_id = (
+            SELECT ID from mcaptcha_users WHERE name = $2
+            )
+            )",
+            captcha_key,
+            username
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(())
+    }
+
+    /// Delete captcha
+    async fn delete_captcha(&self, username: &str, captcha_key: &str) -> DBResult<()> {
+        sqlx::query!(
+            "DELETE FROM mcaptcha_config WHERE key = ($1)
+                AND
+            user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2)",
+            captcha_key,
+            username,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(())
+    }
+
+    /// Get captcha levels
+    async fn get_captcha_levels(
+        &self,
+        username: Option<&str>,
+        captcha_key: &str,
+    ) -> DBResult<Vec<Level>> {
+        struct I32Levels {
+            difficulty_factor: i32,
+            visitor_threshold: i32,
+        }
+        let levels = match username {
+            None => sqlx::query_as!(
+                I32Levels,
+                "SELECT difficulty_factor, visitor_threshold FROM mcaptcha_levels  WHERE
+            config_id = (
+                SELECT config_id FROM mcaptcha_config WHERE key = ($1)
+                ) ORDER BY difficulty_factor ASC;",
+                captcha_key,
+            )
+            .fetch_all(&self.pool)
+            .await
+            .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?,
+
+            Some(username) => sqlx::query_as!(
+                I32Levels,
+                "SELECT difficulty_factor, visitor_threshold FROM mcaptcha_levels  WHERE
+            config_id = (
+                SELECT config_id FROM mcaptcha_config WHERE key = ($1)
+                AND user_id = (SELECT ID from mcaptcha_users WHERE name = $2)
+                )
+            ORDER BY difficulty_factor ASC;",
+                captcha_key,
+                username
+            )
+            .fetch_all(&self.pool)
+            .await
+            .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?,
+        };
+
+        let mut new_levels = Vec::with_capacity(levels.len());
+        for l in levels.iter() {
+            new_levels.push(Level {
+                difficulty_factor: l.difficulty_factor as u32,
+                visitor_threshold: l.visitor_threshold as u32,
+            });
+        }
+        Ok(new_levels)
+    }
+
+    /// Get captcha's cooldown period
+    async fn get_captcha_cooldown(&self, captcha_key: &str) -> DBResult<i32> {
+        struct DurationResp {
+            duration: i32,
+        }
+
+        let resp = sqlx::query_as!(
+            DurationResp,
+            "SELECT duration FROM mcaptcha_config  
+            WHERE key = $1",
+            captcha_key,
+        )
+        .fetch_one(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(resp.duration)
+    }
+    /// Add traffic configuration
+    async fn add_traffic_pattern(
+        &self,
+        username: &str,
+        captcha_key: &str,
+        pattern: &TrafficPattern,
+    ) -> DBResult<()> {
+        sqlx::query!(
+            "INSERT INTO mcaptcha_sitekey_user_provided_avg_traffic (
+            config_id,
+            avg_traffic,
+            peak_sustainable_traffic,
+            broke_my_site_traffic
+            ) VALUES ( 
+             (SELECT config_id FROM mcaptcha_config WHERE key = ($1)
+             AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2)
+            ), $3, $4, $5)",
+            //payload.avg_traffic,
+            captcha_key,
+            username,
+            pattern.avg_traffic as i32,
+            pattern.peak_sustainable_traffic as i32,
+            pattern.broke_my_site_traffic.as_ref().map(|v| *v as i32),
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+        Ok(())
+    }
+
+    /// Get traffic configuration
+    async fn get_traffic_pattern(
+        &self,
+        username: &str,
+        captcha_key: &str,
+    ) -> DBResult<TrafficPattern> {
+        struct Traffic {
+            peak_sustainable_traffic: i32,
+            avg_traffic: i32,
+            broke_my_site_traffic: Option<i32>,
+        }
+        let res = sqlx::query_as!(
+            Traffic,
+            "SELECT 
+          avg_traffic, 
+          peak_sustainable_traffic, 
+          broke_my_site_traffic 
+        FROM 
+          mcaptcha_sitekey_user_provided_avg_traffic 
+        WHERE 
+          config_id = (
+            SELECT 
+              config_id 
+            FROM 
+              mcaptcha_config 
+            WHERE 
+              KEY = $1 
+              AND user_id = (
+                SELECT 
+                  id 
+                FROM 
+                  mcaptcha_users 
+                WHERE 
+                  NAME = $2
+              )
+          )
+        ",
+            captcha_key,
+            username
+        )
+        .fetch_one(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::TrafficPatternNotFound))?;
+        Ok(TrafficPattern {
+            broke_my_site_traffic: res.broke_my_site_traffic.as_ref().map(|v| *v as u32),
+            avg_traffic: res.avg_traffic as u32,
+            peak_sustainable_traffic: res.peak_sustainable_traffic as u32,
+        })
+    }
+
+    /// Delete traffic configuration
+    async fn delete_traffic_pattern(
+        &self,
+        username: &str,
+        captcha_key: &str,
+    ) -> DBResult<()> {
+        sqlx::query!(
+            "DELETE FROM mcaptcha_sitekey_user_provided_avg_traffic
+        WHERE config_id = (
+            SELECT config_id 
+            FROM 
+                mcaptcha_config 
+            WHERE
+                key = ($1) 
+            AND 
+                user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2)
+            );",
+            captcha_key,
+            username,
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::TrafficPatternNotFound))?;
+        Ok(())
+    }
+
+    /// create new notification
+    async fn create_notification(&self, p: &AddNotification) -> DBResult<()> {
+        let now = now_unix_time_stamp();
+        sqlx::query!(
+            "INSERT INTO mcaptcha_notifications (
+              heading, message, tx, rx, received)
+              VALUES  (
+              $1, $2,
+                  (SELECT ID FROM mcaptcha_users WHERE name = $3),
+                  (SELECT ID FROM mcaptcha_users WHERE name = $4),
+                  $5
+                      );",
+            p.heading,
+            p.message,
+            p.from,
+            p.to,
+            now
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(map_register_err)?;
+
+        Ok(())
+    }
+
+    /// get all unread notifications
+    async fn get_all_unread_notifications(
+        &self,
+        username: &str,
+    ) -> DBResult<Vec<Notification>> {
+        let mut inner_notifications = sqlx::query_file_as!(
+            InnerNotification,
+            "./src/get_all_unread_notifications.sql",
+            &username
+        )
+        .fetch_all(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::AccountNotFound))?;
+
+        let mut notifications = Vec::with_capacity(inner_notifications.len());
+
+        inner_notifications
+            .drain(0..)
+            .for_each(|n| notifications.push(n.into()));
+
+        Ok(notifications)
+    }
+
+    /// mark a notification read
+    async fn mark_notification_read(&self, username: &str, id: i32) -> DBResult<()> {
+        sqlx::query_file_as!(
+            Notification,
+            "./src/mark_notification_read.sql",
+            id,
+            &username
+        )
+        .execute(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::NotificationNotFound))?;
+
+        Ok(())
+    }
+
+    /// record PoWConfig fetches
+    async fn record_fetch(&self, key: &str) -> DBResult<()> {
+        let now = now_unix_time_stamp();
+        let _ = sqlx::query!(
+        "INSERT INTO mcaptcha_pow_fetched_stats 
+        (config_id, time) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1), $2)",
+        key,
+        &now,
+    )
+    .execute(&self.pool)
+    .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+        Ok(())
+    }
+
+    /// record PoWConfig solves
+    async fn record_solve(&self, key: &str) -> DBResult<()> {
+        let now = OffsetDateTime::now_utc();
+        let _ = sqlx::query!(
+        "INSERT INTO mcaptcha_pow_solved_stats 
+        (config_id, time) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1), $2)",
+        key,
+        &now,
+    )
+    .execute(&self.pool)
+    .await
+    .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+        Ok(())
+    }
+
+    /// record PoWConfig confirms
+    async fn record_confirm(&self, key: &str) -> DBResult<()> {
+        let now = now_unix_time_stamp();
+        let _ = sqlx::query!(
+        "INSERT INTO mcaptcha_pow_confirmed_stats 
+        (config_id, time) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1), $2)",
+        key,
+        &now
+    )
+    .execute(&self.pool)
+    .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+        Ok(())
+    }
+
+    /// featch PoWConfig fetches
+    async fn fetch_config_fetched(&self, user: &str, key: &str) -> DBResult<Vec<i64>> {
+        let records = sqlx::query_as!(
+            Date,
+            "SELECT time FROM mcaptcha_pow_fetched_stats
+            WHERE 
+                config_id = (
+                    SELECT 
+                        config_id FROM mcaptcha_config 
+                    WHERE 
+                        key = $1
+                    AND
+                        user_id = (
+                        SELECT 
+                            ID FROM mcaptcha_users WHERE name = $2))
+                ORDER BY time DESC",
+            &key,
+            &user,
+        )
+        .fetch_all(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(Date::dates_to_unix(records))
+    }
+
+    /// featch PoWConfig solves
+    async fn fetch_solve(&self, user: &str, key: &str) -> DBResult<Vec<i64>> {
+        let records = sqlx::query_as!(
+            Date,
+            "SELECT time FROM mcaptcha_pow_solved_stats 
+            WHERE config_id = (
+                SELECT config_id FROM mcaptcha_config 
+                WHERE 
+                    key = $1
+                AND
+                     user_id = (
+                        SELECT 
+                            ID FROM mcaptcha_users WHERE name = $2)) 
+                ORDER BY time DESC",
+            &key,
+            &user
+        )
+        .fetch_all(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(Date::dates_to_unix(records))
+    }
+
+    /// featch PoWConfig confirms
+    async fn fetch_confirm(&self, user: &str, key: &str) -> DBResult<Vec<i64>> {
+        let records = sqlx::query_as!(
+            Date,
+            "SELECT time FROM mcaptcha_pow_confirmed_stats 
+            WHERE 
+                config_id = (
+                    SELECT config_id FROM mcaptcha_config 
+                WHERE 
+                    key = $1
+                AND
+                     user_id = (
+                        SELECT 
+                            ID FROM mcaptcha_users WHERE name = $2))
+                ORDER BY time DESC",
+            &key,
+            &user
+        )
+        .fetch_all(&self.pool)
+        .await
+        .map_err(|e| map_row_not_found_err(e, DBError::CaptchaNotFound))?;
+
+        Ok(Date::dates_to_unix(records))
+    }
+}
+
+#[derive(Clone)]
+struct Date {
+    time: OffsetDateTime,
+}
+
+impl Date {
+    fn dates_to_unix(mut d: Vec<Self>) -> Vec<i64> {
+        let mut dates = Vec::with_capacity(d.len());
+        d.drain(0..)
+            .for_each(|x| dates.push(x.time.unix_timestamp()));
+        dates
+    }
+}
+
+fn now_unix_time_stamp() -> OffsetDateTime {
+    OffsetDateTime::now_utc()
+}
+
+#[derive(Debug, Clone, Default, PartialEq)]
+/// Represents notification
+pub struct InnerNotification {
+    /// receiver name  of the notification
+    pub name: Option<String>,
+    /// heading of the notification
+    pub heading: Option<String>,
+    /// message of the notification
+    pub message: Option<String>,
+    /// when notification was received
+    pub received: Option<OffsetDateTime>,
+    /// db assigned ID of the notification
+    pub id: Option<i32>,
+}
+
+impl From<InnerNotification> for Notification {
+    fn from(n: InnerNotification) -> Self {
+        Notification {
+            name: n.name,
+            heading: n.heading,
+            message: n.message,
+            received: n.received.map(|t| t.unix_timestamp()),
+            id: n.id,
+        }
+    }
+}
+
+#[derive(Clone)]
+struct InternaleCaptchaConfig {
+    config_id: i32,
+    duration: i32,
+    name: String,
+    key: String,
+}
+
+impl From<InternaleCaptchaConfig> for Captcha {
+    fn from(i: InternaleCaptchaConfig) -> Self {
+        Self {
+            config_id: i.config_id,
+            duration: i.duration,
+            description: i.name,
+            key: i.key,
+        }
+    }
+}
+
+
+ \ No newline at end of file diff --git a/src/mcaptcha/api/mod.rs.html b/src/mcaptcha/api/mod.rs.html index 291ea817..36cd728a 100644 --- a/src/mcaptcha/api/mod.rs.html +++ b/src/mcaptcha/api/mod.rs.html @@ -22,21 +22,21 @@ 17 18
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 pub mod v1;
 
diff --git a/src/mcaptcha/api/v1/account/delete.rs.html b/src/mcaptcha/api/v1/account/delete.rs.html index 73c03b11..c64547f9 100644 --- a/src/mcaptcha/api/v1/account/delete.rs.html +++ b/src/mcaptcha/api/v1/account/delete.rs.html @@ -67,34 +67,22 @@ 62 63 64 -65 -66 -67 -68 -69 -70 -71 -72 -73 -74 -75 -76
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
@@ -113,30 +101,20 @@
     data: AppData,
 ) -> ServiceResult<impl Responder> {
     use argon2_creds::Config;
-    use sqlx::Error::RowNotFound;
 
     let username = id.identity().unwrap();
 
-    let rec = sqlx::query_as!(
-        Password,
-        r#"SELECT password  FROM mcaptcha_users WHERE name = ($1)"#,
-        &username,
-    )
-    .fetch_one(&data.db)
-    .await;
+    let hash = data
+        .db
+        .get_password(&db_core::Login::Username(&username))
+        .await?;
 
-    match rec {
-        Ok(s) => {
-            if Config::verify(&s.password, &payload.password)? {
-                runners::delete_user(&username, &data).await?;
-                id.forget();
-                Ok(HttpResponse::Ok())
-            } else {
-                Err(ServiceError::WrongPassword)
-            }
-        }
-        Err(RowNotFound) => Err(ServiceError::AccountNotFound),
-        Err(_) => Err(ServiceError::InternalServerError),
+    if Config::verify(&hash.hash, &payload.password)? {
+        runners::delete_user(&username, &data).await?;
+        id.forget();
+        Ok(HttpResponse::Ok())
+    } else {
+        Err(ServiceError::WrongPassword)
     }
 }
 
@@ -145,9 +123,7 @@
     use super::*;
 
     pub async fn delete_user(name: &str, data: &AppData) -> ServiceResult<()> {
-        sqlx::query!("DELETE FROM mcaptcha_users WHERE name = ($1)", name,)
-            .execute(&data.db)
-            .await?;
+        data.db.delete_user(name).await?;
         Ok(())
     }
 }
diff --git a/src/mcaptcha/api/v1/account/email.rs.html b/src/mcaptcha/api/v1/account/email.rs.html
index 8333e47c..58b07265 100644
--- a/src/mcaptcha/api/v1/account/email.rs.html
+++ b/src/mcaptcha/api/v1/account/email.rs.html
@@ -73,30 +73,6 @@
 68
 69
 70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -113,10 +89,9 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-use std::borrow::Cow;
-
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
+use db_core::UpdateEmail;
 use serde::{Deserialize, Serialize};
 
 use super::{AccountCheckPayload, AccountCheckResp};
@@ -133,20 +108,9 @@
     payload: web::Json<AccountCheckPayload>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
-    let res = sqlx::query!(
-        "SELECT EXISTS (SELECT 1 from mcaptcha_users WHERE email = $1)",
-        &payload.val,
-    )
-    .fetch_one(&data.db)
-    .await?;
+    let exists = data.db.email_exists(&payload.val).await?;
 
-    let mut resp = AccountCheckResp { exists: false };
-
-    if let Some(x) = res.exists {
-        if x {
-            resp.exists = true;
-        }
-    }
+    let resp = AccountCheckResp { exists };
 
     Ok(HttpResponse::Ok().json(resp))
 }
@@ -165,25 +129,13 @@
 
     data.creds.email(&payload.email)?;
 
-    let res = sqlx::query!(
-        "UPDATE mcaptcha_users set email = $1
-        WHERE name = $2",
-        &payload.email,
-        &username,
-    )
-    .execute(&data.db)
-    .await;
-    if res.is_err() {
-        if let Err(sqlx::Error::Database(err)) = res {
-            if err.code() == Some(Cow::from("23505"))
-                && err.message().contains("mcaptcha_users_email_key")
-            {
-                return Err(ServiceError::EmailTaken);
-            } else {
-                return Err(sqlx::Error::Database(err).into());
-            }
-        };
-    }
+    let update_email = UpdateEmail {
+        username: &username,
+        new_email: &payload.email,
+    };
+
+    data.db.update_email(&update_email).await?;
+
     Ok(HttpResponse::Ok())
 }
 
diff --git a/src/mcaptcha/api/v1/account/password.rs.html b/src/mcaptcha/api/v1/account/password.rs.html
index c3036194..cede02a2 100644
--- a/src/mcaptcha/api/v1/account/password.rs.html
+++ b/src/mcaptcha/api/v1/account/password.rs.html
@@ -195,20 +195,6 @@
 190
 191
 192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -228,10 +214,9 @@
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use argon2_creds::Config;
+use db_core::Login;
 use serde::{Deserialize, Serialize};
-use sqlx::Error::RowNotFound;
 
-use crate::api::v1::auth::runners::Password;
 use crate::errors::*;
 use crate::*;
 
@@ -267,15 +252,12 @@
 
     let new_hash = data.creds.password(&update.new_password)?;
 
-    sqlx::query!(
-        "UPDATE mcaptcha_users set password = $1
-        WHERE name = $2",
-        &new_hash,
-        &user,
-    )
-    .execute(&data.db)
-    .await?;
+    let p = db_core::NameHash {
+        username: user.to_owned(),
+        hash: new_hash,
+    };
 
+    data.db.update_password(&p).await?;
     Ok(())
 }
 
@@ -294,26 +276,15 @@
 
     let username = id.identity().unwrap();
 
-    let rec = sqlx::query_as!(
-        Password,
-        r#"SELECT password  FROM mcaptcha_users WHERE name = ($1)"#,
-        &username,
-    )
-    .fetch_one(&data.db)
-    .await;
+    // TODO: verify behavior when account is not found
+    let res = data.db.get_password(&Login::Username(&username)).await?;
 
-    match rec {
-        Ok(s) => {
-            if Config::verify(&s.password, &payload.password)? {
-                let update: UpdatePassword = payload.into_inner().into();
-                update_password_runner(&username, update, &data).await?;
-                Ok(HttpResponse::Ok())
-            } else {
-                Err(ServiceError::WrongPassword)
-            }
-        }
-        Err(RowNotFound) => Err(ServiceError::AccountNotFound),
-        Err(_) => Err(ServiceError::InternalServerError),
+    if Config::verify(&res.hash, &payload.password)? {
+        let update: UpdatePassword = payload.into_inner().into();
+        update_password_runner(&username, update, &data).await?;
+        Ok(HttpResponse::Ok())
+    } else {
+        Err(ServiceError::WrongPassword)
     }
 }
 
@@ -322,28 +293,27 @@
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
     use super::*;
 
     use actix_web::http::StatusCode;
     use actix_web::test;
 
     use crate::api::v1::ROUTES;
-    use crate::data::Data;
     use crate::tests::*;
 
     #[actix_rt::test]
-    async fn update_password_works() {
+    pub async fn update_password_works() {
         const NAME: &str = "updatepassuser";
         const PASSWORD: &str = "longpassword2";
         const EMAIL: &str = "updatepassuser@a.com";
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
 
-        let (data, _, signin_resp) = register_and_signin(NAME, EMAIL, PASSWORD).await;
+        delete_user(data, NAME).await;
+
+        let (_, signin_resp) = register_and_signin(data, NAME, EMAIL, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
         let app = get_app!(data).await;
 
@@ -355,7 +325,7 @@
             confirm_new_password: PASSWORD.into(),
         };
 
-        let res = update_password_runner(NAME, update_password.into(), &data).await;
+        let res = update_password_runner(NAME, update_password.into(), data).await;
         assert!(res.is_err());
         assert_eq!(res, Err(ServiceError::PasswordsDontMatch));
 
@@ -365,7 +335,7 @@
             confirm_new_password: new_password.into(),
         };
 
-        assert!(update_password_runner(NAME, update_password.into(), &data)
+        assert!(update_password_runner(NAME, update_password.into(), data)
             .await
             .is_ok());
 
@@ -376,6 +346,7 @@
         };
 
         bad_post_req_test(
+            data,
             NAME,
             new_password,
             ROUTES.account.update_password,
@@ -391,6 +362,7 @@
         };
 
         bad_post_req_test(
+            data,
             NAME,
             new_password,
             ROUTES.account.update_password,
diff --git a/src/mcaptcha/api/v1/account/secret.rs.html b/src/mcaptcha/api/v1/account/secret.rs.html
index 89f1f71e..f202c526 100644
--- a/src/mcaptcha/api/v1/account/secret.rs.html
+++ b/src/mcaptcha/api/v1/account/secret.rs.html
@@ -66,79 +66,37 @@
 61
 62
 63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-use std::borrow::Cow;
-
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 use actix_identity::Identity;
 use actix_web::{HttpResponse, Responder};
-use serde::{Deserialize, Serialize};
+use db_core::prelude::*;
 
 use crate::api::v1::mcaptcha::get_random;
 use crate::errors::*;
 use crate::AppData;
 
-#[derive(Clone, Debug, Deserialize, Serialize)]
-pub struct Secret {
-    pub secret: String,
-}
-
 #[my_codegen::get(
     path = "crate::V1_API_ROUTES.account.get_secret",
     wrap = "crate::api::v1::get_middleware()"
 )]
 async fn get_secret(id: Identity, data: AppData) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
-
-    let secret = sqlx::query_as!(
-        Secret,
-        r#"SELECT secret  FROM mcaptcha_users WHERE name = ($1)"#,
-        &username,
-    )
-    .fetch_one(&data.db)
-    .await?;
-
+    let secret = data.db.get_secret(&username).await?;
     Ok(HttpResponse::Ok().json(secret))
 }
 
@@ -156,26 +114,14 @@
 
     loop {
         secret = get_random(32);
-        let res = sqlx::query!(
-            "UPDATE mcaptcha_users set secret = $1
-        WHERE name = $2",
-            &secret,
-            &username,
-        )
-        .execute(&data.db)
-        .await;
-        if res.is_ok() {
-            break;
-        } else if let Err(sqlx::Error::Database(err)) = res {
-            if err.code() == Some(Cow::from("23505"))
-                && err.message().contains("mcaptcha_users_secret_key")
-            {
-                continue;
-            } else {
-                return Err(sqlx::Error::Database(err).into());
-            }
+
+        match data.db.update_secret(&username, &secret).await {
+            Ok(_) => break,
+            Err(DBError::SecretTaken) => continue,
+            Err(e) => return Err(e.into()),
         }
     }
+
     Ok(HttpResponse::Ok())
 }
 
diff --git a/src/mcaptcha/api/v1/account/username.rs.html b/src/mcaptcha/api/v1/account/username.rs.html
index 451ab9ff..4203c53e 100644
--- a/src/mcaptcha/api/v1/account/username.rs.html
+++ b/src/mcaptcha/api/v1/account/username.rs.html
@@ -80,39 +80,6 @@
 75
 76
 77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
-95
-96
-97
-98
-99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -129,8 +96,6 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-use std::borrow::Cow;
-
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
@@ -155,22 +120,9 @@
         payload: &AccountCheckPayload,
         data: &AppData,
     ) -> ServiceResult<AccountCheckResp> {
-        let res = sqlx::query!(
-            "SELECT EXISTS (SELECT 1 from mcaptcha_users WHERE name = $1)",
-            &payload.val,
-        )
-        .fetch_one(&data.db)
-        .await?;
+        let exists = data.db.username_exists(&payload.val).await?;
 
-        let mut resp = AccountCheckResp { exists: false };
-
-        if let Some(x) = res.exists {
-            if x {
-                resp.exists = true;
-            }
-        }
-
-        Ok(resp)
+        Ok(AccountCheckResp { exists })
     }
 }
 
@@ -193,26 +145,8 @@
 
     let processed_uname = data.creds.username(&payload.username)?;
 
-    let res = sqlx::query!(
-        "UPDATE mcaptcha_users set name = $1
-        WHERE name = $2",
-        &processed_uname,
-        &username,
-    )
-    .execute(&data.db)
-    .await;
+    data.db.update_username(&username, &processed_uname).await?;
 
-    if res.is_err() {
-        if let Err(sqlx::Error::Database(err)) = res {
-            if err.code() == Some(Cow::from("23505"))
-                && err.message().contains("mcaptcha_users_name_key")
-            {
-                return Err(ServiceError::UsernameTaken);
-            } else {
-                return Err(sqlx::Error::Database(err).into());
-            }
-        };
-    }
     id.forget();
     id.remember(processed_uname);
 
diff --git a/src/mcaptcha/api/v1/auth.rs.html b/src/mcaptcha/api/v1/auth.rs.html
index 700aea29..0dce9147 100644
--- a/src/mcaptcha/api/v1/auth.rs.html
+++ b/src/mcaptcha/api/v1/auth.rs.html
@@ -204,66 +204,6 @@
 199
 200
 201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -284,6 +224,7 @@
 use actix_identity::Identity;
 use actix_web::http::header;
 use actix_web::{web, HttpResponse, Responder};
+use db_core::errors::DBError;
 use serde::{Deserialize, Serialize};
 
 use super::mcaptcha::get_random;
@@ -328,8 +269,6 @@
 }
 
 pub mod runners {
-    use std::borrow::Cow;
-
     use super::*;
 
     #[derive(Clone, Debug, Deserialize, Serialize)]
@@ -356,7 +295,6 @@
     /// returns Ok(()) when everything checks out and the user is authenticated. Erros otherwise
     pub async fn login_runner(payload: Login, data: &AppData) -> ServiceResult<String> {
         use argon2_creds::Config;
-        use sqlx::Error::RowNotFound;
 
         let verify = |stored: &str, received: &str| {
             if Config::verify(stored, received)? {
@@ -366,55 +304,24 @@
             }
         };
 
-        if payload.login.contains('@') {
-            #[derive(Clone, Debug)]
-            struct EmailLogin {
-                name: String,
-                password: String,
-            }
-
-            let email_fut = sqlx::query_as!(
-                EmailLogin,
-                r#"SELECT name, password  FROM mcaptcha_users WHERE email = ($1)"#,
-                &payload.login,
-            )
-            .fetch_one(&data.db)
-            .await;
-
-            match email_fut {
-                Ok(s) => {
-                    verify(&s.password, &payload.password)?;
-                    Ok(s.name)
-                }
-
-                Err(RowNotFound) => Err(ServiceError::AccountNotFound),
-                Err(_) => Err(ServiceError::InternalServerError),
-            }
+        let s = if payload.login.contains('@') {
+            data.db
+                .get_password(&db_core::Login::Email(&payload.login))
+                .await?
         } else {
-            let username_fut = sqlx::query_as!(
-                Password,
-                r#"SELECT password  FROM mcaptcha_users WHERE name = ($1)"#,
-                &payload.login,
-            )
-            .fetch_one(&data.db)
-            .await;
+            data.db
+                .get_password(&db_core::Login::Username(&payload.login))
+                .await?
+        };
 
-            match username_fut {
-                Ok(s) => {
-                    verify(&s.password, &payload.password)?;
-                    Ok(payload.login)
-                }
-                Err(RowNotFound) => Err(ServiceError::AccountNotFound),
-                Err(_) => Err(ServiceError::InternalServerError),
-            }
-        }
+        verify(&s.hash, &payload.password)?;
+        Ok(s.username)
     }
-
     pub async fn register_runner(
         payload: &Register,
         data: &AppData,
     ) -> ServiceResult<()> {
-        if !crate::SETTINGS.allow_registration {
+        if !data.settings.allow_registration {
             return Err(ServiceError::ClosedForRegistration);
         }
 
@@ -432,48 +339,21 @@
 
         loop {
             secret = get_random(32);
-            let res;
-            if let Some(email) = &payload.email {
-                res = sqlx::query!(
-                    "insert into mcaptcha_users 
-        (name , password, email, secret) values ($1, $2, $3, $4)",
-                    &username,
-                    &hash,
-                    &email,
-                    &secret,
-                )
-                .execute(&data.db)
-                .await;
-            } else {
-                res = sqlx::query!(
-                    "INSERT INTO mcaptcha_users 
-        (name , password,  secret) VALUES ($1, $2, $3)",
-                    &username,
-                    &hash,
-                    &secret,
-                )
-                .execute(&data.db)
-                .await;
-            }
-            if res.is_ok() {
-                break;
-            } else if let Err(sqlx::Error::Database(err)) = res {
-                if err.code() == Some(Cow::from("23505")) {
-                    let msg = err.message();
-                    if msg.contains("mcaptcha_users_name_key") {
-                        return Err(ServiceError::UsernameTaken);
-                    } else if msg.contains("mcaptcha_users_email_key") {
-                        return Err(ServiceError::EmailTaken);
-                    } else if msg.contains("mcaptcha_users_secret_key") {
-                        continue;
-                    } else {
-                        return Err(ServiceError::InternalServerError);
-                    }
-                } else {
-                    return Err(sqlx::Error::Database(err).into());
-                }
+
+            let p = db_core::Register {
+                username: &username,
+                hash: &hash,
+                email: payload.email.as_deref(),
+                secret: &secret,
             };
+
+            match data.db.register(&p).await {
+                Ok(_) => break,
+                Err(DBError::SecretTaken) => continue,
+                Err(e) => return Err(e.into()),
+            }
         }
+
         Ok(())
     }
 }
diff --git a/src/mcaptcha/api/v1/mcaptcha/create.rs.html b/src/mcaptcha/api/v1/mcaptcha/create.rs.html
index 88a62bbf..9b0a4f1e 100644
--- a/src/mcaptcha/api/v1/mcaptcha/create.rs.html
+++ b/src/mcaptcha/api/v1/mcaptcha/create.rs.html
@@ -102,60 +102,6 @@
 97
 98
 99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -172,13 +118,14 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-use std::borrow::Cow;
-
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use libmcaptcha::defense::Level;
 use serde::{Deserialize, Serialize};
 
+use db_core::errors::DBError;
+use db_core::CreateCaptcha as DBCreateCaptcha;
+
 use super::get_random;
 use crate::errors::*;
 use crate::AppData;
@@ -213,11 +160,8 @@
 }
 
 pub mod runner {
-    use futures::future::try_join_all;
-    use libmcaptcha::DefenseBuilder;
-    use log::debug;
-
     use super::*;
+    use libmcaptcha::DefenseBuilder;
 
     pub async fn create(
         payload: &CreateCaptcha,
@@ -231,81 +175,29 @@
 
         defense.build()?;
 
-        debug!("creating config");
-        let mcaptcha_config =
-       // add_mcaptcha_util(payload.duration, &payload.description, &data, username).await?;
+        let mut key;
+        let duration = payload.duration as i32;
+        loop {
+            key = get_random(32);
+            let p = DBCreateCaptcha {
+                description: &payload.description,
+                key: &key,
+                duration,
+            };
 
-    {
-    let mut key;
-
-    let resp;
-
-    loop {
-        key = get_random(32);
-
-        let res = sqlx::query!(
-            "INSERT INTO mcaptcha_config
-        (key, user_id, duration, name)
-        VALUES ($1, (SELECT ID FROM mcaptcha_users WHERE name = $2), $3, $4)",
-            &key,
-            &username,
-            payload.duration as i32,
-            &payload.description,
-        )
-        .execute(&data.db)
-        .await;
-
-        match res {
-            Err(sqlx::Error::Database(err)) => {
-                if err.code() == Some(Cow::from("23505"))
-                    && err.message().contains("mcaptcha_config_key_key")
-                {
-                    continue;
-                } else {
-                    return Err(sqlx::Error::Database(err).into());
-                }
-            }
-            Err(e) => return Err(e.into()),
-
-            Ok(_) => {
-                resp = MCaptchaDetails {
-                    key,
-                    name: payload.description.to_owned(),
-                };
-                break;
+            match data.db.create_captcha(username, &p).await {
+                Ok(_) => break,
+                Err(DBError::SecretTaken) => continue,
+                Err(e) => return Err(e.into()),
             }
         }
-    }
-    resp
-    };
-
-        debug!("config created");
-
-        let mut futs = Vec::with_capacity(payload.levels.len());
-
-        for level in payload.levels.iter() {
-            let difficulty_factor = level.difficulty_factor as i32;
-            let visitor_threshold = level.visitor_threshold as i32;
-            let fut = sqlx::query!(
-                "INSERT INTO mcaptcha_levels (
-            difficulty_factor, 
-            visitor_threshold,
-            config_id) VALUES  (
-            $1, $2, (
-                SELECT config_id FROM mcaptcha_config WHERE
-                key = ($3) AND user_id = (
-                SELECT ID FROM mcaptcha_users WHERE name = $4
-                    )));",
-                difficulty_factor,
-                visitor_threshold,
-                &mcaptcha_config.key,
-                &username,
-            )
-            .execute(&data.db);
-            futs.push(fut);
-        }
-
-        try_join_all(futs).await?;
+        data.db
+            .add_captcha_levels(username, &key, &payload.levels)
+            .await?;
+        let mcaptcha_config = MCaptchaDetails {
+            name: payload.description.clone(),
+            key,
+        };
         Ok(mcaptcha_config)
     }
 }
diff --git a/src/mcaptcha/api/v1/mcaptcha/delete.rs.html b/src/mcaptcha/api/v1/mcaptcha/delete.rs.html
index 02a2e5eb..12c12e51 100644
--- a/src/mcaptcha/api/v1/mcaptcha/delete.rs.html
+++ b/src/mcaptcha/api/v1/mcaptcha/delete.rs.html
@@ -61,43 +61,6 @@
 56
 57
 58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
-95
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -119,6 +82,8 @@
 use libmcaptcha::master::messages::RemoveCaptcha;
 use serde::{Deserialize, Serialize};
 
+use db_core::Login;
+
 use crate::errors::*;
 use crate::AppData;
 
@@ -138,60 +103,21 @@
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     use argon2_creds::Config;
-    use sqlx::Error::RowNotFound;
 
     let username = id.identity().unwrap();
 
-    struct PasswordID {
-        password: String,
-        id: i32,
+    let hash = data.db.get_password(&Login::Username(&username)).await?;
+
+    if !Config::verify(&hash.hash, &payload.password)? {
+        return Err(ServiceError::WrongPassword);
     }
+    let payload = payload.into_inner();
+    data.db.delete_captcha(&username, &payload.key).await?;
 
-    let rec = sqlx::query_as!(
-        PasswordID,
-        r#"SELECT ID, password  FROM mcaptcha_users WHERE name = ($1)"#,
-        &username,
-    )
-    .fetch_one(&data.db)
-    .await;
-
-    match rec {
-        Ok(rec) => {
-            if Config::verify(&rec.password, &payload.password)? {
-                let payload = payload.into_inner();
-                sqlx::query!(
-                    "DELETE FROM mcaptcha_levels 
-                     WHERE config_id = (
-                        SELECT config_id FROM mcaptcha_config 
-                        WHERE key = $1 AND user_id = $2
-                    );",
-                    &payload.key,
-                    &rec.id,
-                )
-                .execute(&data.db)
-                .await?;
-
-                sqlx::query!(
-                    "DELETE FROM mcaptcha_config WHERE key = ($1) AND user_id = $2;",
-                    &payload.key,
-                    &rec.id,
-                )
-                .execute(&data.db)
-                .await?;
-                if let Err(err) = data.captcha.remove(RemoveCaptcha(payload.key)).await {
-                    log::error!(
-                        "Error while trying to remove captcha from cache {}",
-                        err
-                    );
-                }
-                Ok(HttpResponse::Ok())
-            } else {
-                Err(ServiceError::WrongPassword)
-            }
-        }
-        Err(RowNotFound) => Err(ServiceError::UsernameNotFound),
-        Err(_) => Err(ServiceError::InternalServerError),
+    if let Err(err) = data.captcha.remove(RemoveCaptcha(payload.key)).await {
+        log::error!("Error while trying to remove captcha from cache {}", err);
     }
+    Ok(HttpResponse::Ok())
 }
 
diff --git a/src/mcaptcha/api/v1/mcaptcha/easy.rs.html b/src/mcaptcha/api/v1/mcaptcha/easy.rs.html index ed81c5a9..21d1ee23 100644 --- a/src/mcaptcha/api/v1/mcaptcha/easy.rs.html +++ b/src/mcaptcha/api/v1/mcaptcha/easy.rs.html @@ -391,64 +391,29 @@ 386 387 388 -389 -390 -391 -392 -393 -394 -395 -396 -397 -398 -399 -400 -401 -402 -403 -404 -405 -406 -407 -408 -409 -410 -411 -412 -413 -414 -415 -416 -417 -418 -419 -420 -421 -422 -423 -424 -425
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use libmcaptcha::{defense::Level, defense::LevelBuilder};
 use serde::{Deserialize, Serialize};
 
+use db_core::TrafficPattern;
+
 use super::create::{runner::create as create_runner, CreateCaptcha};
 use super::update::{runner::update_captcha as update_captcha_runner, UpdateCaptcha};
 use crate::errors::*;
@@ -477,103 +442,96 @@
     cfg.service(create);
 }
 
-#[derive(Serialize, Deserialize, Clone, Debug)]
-pub struct TrafficPattern {
+#[derive(Default, Serialize, Deserialize, Clone, Debug)]
+/// User's traffic pattern; used in generating a captcha configuration
+pub struct TrafficPatternRequest {
+    /// average traffic of user's website
     pub avg_traffic: u32,
+    /// the peak traffic that the user's website can handle
     pub peak_sustainable_traffic: u32,
+    /// trafic that bought the user's website down; optional
     pub broke_my_site_traffic: Option<u32>,
+    /// Captcha description
     pub description: String,
 }
 
-impl TrafficPattern {
-    pub fn calculate(
-        &self,
-        strategy: &DefaultDifficultyStrategy,
-    ) -> ServiceResult<Vec<Level>> {
-        let mut levels = vec![
-            LevelBuilder::default()
-                .difficulty_factor(strategy.avg_traffic_difficulty)?
-                .visitor_threshold(self.avg_traffic)
-                .build()?,
-            LevelBuilder::default()
-                .difficulty_factor(strategy.peak_sustainable_traffic_difficulty)?
-                .visitor_threshold(self.peak_sustainable_traffic)
-                .build()?,
-        ];
-        let mut highest_level = LevelBuilder::default();
-        highest_level.difficulty_factor(strategy.broke_my_site_traffic_difficulty)?;
-
-        match self.broke_my_site_traffic {
-            Some(broke_my_site_traffic) => {
-                highest_level.visitor_threshold(broke_my_site_traffic)
-            }
-            None => match self
-                .peak_sustainable_traffic
-                .checked_add(self.peak_sustainable_traffic / 2)
-            {
-                Some(num) => highest_level.visitor_threshold(num),
-                // TODO check for overflow: database saves these values as i32, so this u32 is cast
-                // into i32. Should choose bigger number or casts properly
-                None => highest_level.visitor_threshold(u32::MAX),
-            },
-        };
-
-        levels.push(highest_level.build()?);
-
-        Ok(levels)
+impl From<&TrafficPatternRequest> for TrafficPattern {
+    fn from(t: &TrafficPatternRequest) -> Self {
+        TrafficPattern {
+            avg_traffic: t.avg_traffic,
+            peak_sustainable_traffic: t.peak_sustainable_traffic,
+            broke_my_site_traffic: t.broke_my_site_traffic,
+        }
     }
 }
 
+pub fn calculate(
+    tp: &TrafficPattern,
+    strategy: &DefaultDifficultyStrategy,
+) -> ServiceResult<Vec<Level>> {
+    let mut levels = vec![
+        LevelBuilder::default()
+            .difficulty_factor(strategy.avg_traffic_difficulty)?
+            .visitor_threshold(tp.avg_traffic)
+            .build()?,
+        LevelBuilder::default()
+            .difficulty_factor(strategy.peak_sustainable_traffic_difficulty)?
+            .visitor_threshold(tp.peak_sustainable_traffic)
+            .build()?,
+    ];
+    let mut highest_level = LevelBuilder::default();
+    highest_level.difficulty_factor(strategy.broke_my_site_traffic_difficulty)?;
+
+    match tp.broke_my_site_traffic {
+        Some(broke_my_site_traffic) => {
+            highest_level.visitor_threshold(broke_my_site_traffic)
+        }
+        None => match tp
+            .peak_sustainable_traffic
+            .checked_add(tp.peak_sustainable_traffic / 2)
+        {
+            Some(num) => highest_level.visitor_threshold(num),
+            // TODO check for overflow: database saves these values as i32, so this u32 is cast
+            // into i32. Should choose bigger number or casts properly
+            None => highest_level.visitor_threshold(u32::MAX),
+        },
+    };
+
+    levels.push(highest_level.build()?);
+
+    Ok(levels)
+}
+
 #[my_codegen::post(
     path = "crate::V1_API_ROUTES.captcha.easy.create",
     wrap = "crate::api::v1::get_middleware()"
 )]
 async fn create(
-    payload: web::Json<TrafficPattern>,
+    payload: web::Json<TrafficPatternRequest>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
     let payload = payload.into_inner();
+    let pattern = (&payload).into();
     let levels =
-        payload.calculate(&crate::SETTINGS.captcha.default_difficulty_strategy)?;
+        calculate(&pattern, &data.settings.captcha.default_difficulty_strategy)?;
     let msg = CreateCaptcha {
         levels,
-        duration: crate::SETTINGS.captcha.default_difficulty_strategy.duration,
+        duration: data.settings.captcha.default_difficulty_strategy.duration,
         description: payload.description,
     };
 
-    let broke_my_site_traffic = payload.broke_my_site_traffic.map(|n| n as i32);
-
     let mcaptcha_config = create_runner(&msg, &data, &username).await?;
-    sqlx::query!(
-        "INSERT INTO mcaptcha_sitekey_user_provided_avg_traffic (
-        config_id,
-        avg_traffic,
-        peak_sustainable_traffic,
-        broke_my_site_traffic
-    ) VALUES ( 
-         (SELECT config_id FROM mcaptcha_config 
-          WHERE
-            key = ($1)
-          AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2)
-         ), $3, $4, $5)",
-        //payload.avg_traffic,
-        &mcaptcha_config.key,
-        &username,
-        payload.avg_traffic as i32,
-        payload.peak_sustainable_traffic as i32,
-        broke_my_site_traffic,
-    )
-    .execute(&data.db)
-    .await?;
-
+    data.db
+        .add_traffic_pattern(&username, &mcaptcha_config.key, &pattern)
+        .await?;
     Ok(HttpResponse::Ok().json(mcaptcha_config))
 }
 
 #[derive(Serialize, Deserialize, Clone, Debug)]
 pub struct UpdateTrafficPattern {
-    pub pattern: TrafficPattern,
+    pub pattern: TrafficPatternRequest,
     pub key: String,
 }
 
@@ -588,65 +546,30 @@
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
     let payload = payload.into_inner();
-    let levels = payload
-        .pattern
-        .calculate(&crate::SETTINGS.captcha.default_difficulty_strategy)?;
+    let pattern = (&payload.pattern).into();
+    let levels =
+        calculate(&pattern, &data.settings.captcha.default_difficulty_strategy)?;
 
     let msg = UpdateCaptcha {
         levels,
-        duration: crate::SETTINGS.captcha.default_difficulty_strategy.duration,
+        duration: data.settings.captcha.default_difficulty_strategy.duration,
         description: payload.pattern.description,
         key: payload.key,
     };
 
     update_captcha_runner(&msg, &data, &username).await?;
 
-    sqlx::query!(
-        "DELETE FROM mcaptcha_sitekey_user_provided_avg_traffic 
-        WHERE config_id = (
-            SELECT config_id 
-            FROM 
-                mcaptcha_config 
-            WHERE
-                key = ($1) 
-            AND 
-                user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2)
-            );",
-        &msg.key,
-        &username,
-    )
-    .execute(&data.db)
-    .await?;
+    data.db.delete_traffic_pattern(&username, &msg.key).await?;
 
-    let broke_my_site_traffic = payload.pattern.broke_my_site_traffic.map(|n| n as i32);
-
-    sqlx::query!(
-        "INSERT INTO mcaptcha_sitekey_user_provided_avg_traffic (
-        config_id,
-        avg_traffic,
-        peak_sustainable_traffic,
-        broke_my_site_traffic
-    ) VALUES ( 
-         (SELECT config_id FROM mcaptcha_config 
-          WHERE
-            key = ($1)
-          AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2)
-         ), $3, $4, $5)",
-        //payload.avg_traffic,
-        &msg.key,
-        &username,
-        payload.pattern.avg_traffic as i32,
-        payload.pattern.peak_sustainable_traffic as i32,
-        broke_my_site_traffic,
-    )
-    .execute(&data.db)
-    .await?;
+    data.db
+        .add_traffic_pattern(&username, &msg.key, &pattern)
+        .await?;
 
     Ok(HttpResponse::Ok())
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
     use actix_web::http::StatusCode;
     use actix_web::test;
     use actix_web::web::Bytes;
@@ -657,22 +580,22 @@
     use crate::tests::*;
     use crate::*;
 
-    #[cfg(test)]
     mod isoloated_test {
-        use super::{LevelBuilder, TrafficPattern};
+        use super::{calculate, LevelBuilder};
+
+        use db_core::TrafficPattern;
 
         #[test]
         fn easy_configuration_works() {
-            const NAME: &str = "defaultuserconfgworks";
+            let settings = crate::tests::get_settings();
 
             let mut payload = TrafficPattern {
                 avg_traffic: 100_000,
                 peak_sustainable_traffic: 1_000_000,
                 broke_my_site_traffic: Some(10_000_000),
-                description: NAME.into(),
             };
 
-            let strategy = &crate::SETTINGS.captcha.default_difficulty_strategy;
+            let strategy = &settings.captcha.default_difficulty_strategy;
             let l1 = LevelBuilder::default()
                 .difficulty_factor(strategy.avg_traffic_difficulty)
                 .unwrap()
@@ -694,7 +617,7 @@
                 .unwrap();
 
             let levels = vec![l1, l2, l3];
-            assert_eq!(payload.calculate(strategy).unwrap(), levels);
+            assert_eq!(calculate(&payload, strategy).unwrap(), levels);
 
             let estimated_lmax = LevelBuilder::default()
                 .difficulty_factor(strategy.broke_my_site_traffic_difficulty)
@@ -704,7 +627,7 @@
                 .unwrap();
             payload.broke_my_site_traffic = None;
             assert_eq!(
-                payload.calculate(strategy).unwrap(),
+                calculate(&payload, strategy).unwrap(),
                 vec![l1, l2, estimated_lmax]
             );
 
@@ -726,38 +649,39 @@
             //        payload.broke_my_site_traffic = Some(very_large_l2_peak_traffic);
             payload.peak_sustainable_traffic = very_large_l2_peak_traffic;
             assert_eq!(
-                payload.calculate(strategy).unwrap(),
+                calculate(&payload, strategy).unwrap(),
                 vec![l1, very_large_l2, lmax]
             );
         }
     }
 
     #[actix_rt::test]
-    async fn easy_works() {
+    pub async fn easy_works() {
         const NAME: &str = "defaultuserconfgworks";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "defaultuserconfgworks@a.com";
+        let data = crate::tests::get_data().await;
+        let data = &data;
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        delete_user(data, NAME).await;
 
-        let (data, _creds, signin_resp) =
-            register_and_signin(NAME, EMAIL, PASSWORD).await;
+        let (_creds, signin_resp) =
+            register_and_signin(data, NAME, EMAIL, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
         let app = get_app!(data).await;
 
-        let payload = TrafficPattern {
+        let payload = TrafficPatternRequest {
             avg_traffic: 100_000,
             peak_sustainable_traffic: 1_000_000,
             broke_my_site_traffic: Some(10_000_000),
             description: NAME.into(),
         };
 
-        let default_levels = payload
-            .calculate(&crate::SETTINGS.captcha.default_difficulty_strategy)
-            .unwrap();
+        let default_levels = calculate(
+            &(&payload).into(),
+            &data.settings.captcha.default_difficulty_strategy,
+        )
+        .unwrap();
 
         // START create_easy
 
@@ -785,16 +709,18 @@
         // END create_easy
 
         // START update_easy
-        let update_pattern = TrafficPattern {
+        let update_pattern = TrafficPatternRequest {
             avg_traffic: 1_000,
             peak_sustainable_traffic: 10_000,
             broke_my_site_traffic: Some(1_000_000),
             description: NAME.into(),
         };
 
-        let updated_default_values = update_pattern
-            .calculate(&crate::SETTINGS.captcha.default_difficulty_strategy)
-            .unwrap();
+        let updated_default_values = calculate(
+            &(&update_pattern).into(),
+            &data.settings.captcha.default_difficulty_strategy,
+        )
+        .unwrap();
 
         let payload = UpdateTrafficPattern {
             pattern: update_pattern,
diff --git a/src/mcaptcha/api/v1/mcaptcha/get.rs.html b/src/mcaptcha/api/v1/mcaptcha/get.rs.html
index 2c0f9e15..07054d85 100644
--- a/src/mcaptcha/api/v1/mcaptcha/get.rs.html
+++ b/src/mcaptcha/api/v1/mcaptcha/get.rs.html
@@ -55,30 +55,6 @@
 50
 51
 52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -114,7 +90,10 @@
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
-    let levels = runner::get_captcha(&payload.key, &username, &data).await?;
+    let levels = data
+        .db
+        .get_captcha_levels(Some(&username), &payload.key)
+        .await?;
     Ok(HttpResponse::Ok().json(levels))
 }
 
@@ -128,33 +107,6 @@
     pub difficulty_factor: i32,
     pub visitor_threshold: i32,
 }
-
-pub mod runner {
-    use super::*;
-
-    // TODO get metadata from mcaptcha_config table
-    pub async fn get_captcha(
-        key: &str,
-        username: &str,
-        data: &AppData,
-    ) -> ServiceResult<Vec<I32Levels>> {
-        let levels = sqlx::query_as!(
-            I32Levels,
-            "SELECT difficulty_factor, visitor_threshold FROM mcaptcha_levels  WHERE
-            config_id = (
-                SELECT config_id FROM mcaptcha_config WHERE key = ($1)
-                AND user_id = (SELECT ID from mcaptcha_users WHERE name = $2)
-                )
-            ORDER BY difficulty_factor ASC;",
-            key,
-            &username
-        )
-        .fetch_all(&data.db)
-        .await?;
-
-        Ok(levels)
-    }
-}
 
\ No newline at end of file diff --git a/src/mcaptcha/api/v1/mcaptcha/stats.rs.html b/src/mcaptcha/api/v1/mcaptcha/stats.rs.html index 35031dd5..970e2042 100644 --- a/src/mcaptcha/api/v1/mcaptcha/stats.rs.html +++ b/src/mcaptcha/api/v1/mcaptcha/stats.rs.html @@ -57,30 +57,27 @@ 52 53 54 -55 -56
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
 
 use crate::errors::*;
-use crate::stats::fetch::{Stats, StatsUnixTimestamp};
 use crate::AppData;
 
 pub mod routes {
@@ -111,8 +108,7 @@
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let username = id.identity().unwrap();
-    let stats = Stats::new(&username, &payload.key, &data.db).await?;
-    let stats = StatsUnixTimestamp::from_stats(&stats);
+    let stats = data.stats.fetch(&data, &username, &payload.key).await?;
     Ok(HttpResponse::Ok().json(&stats))
 }
 
diff --git a/src/mcaptcha/api/v1/mcaptcha/update.rs.html b/src/mcaptcha/api/v1/mcaptcha/update.rs.html index 2cfb9e15..71134fdc 100644 --- a/src/mcaptcha/api/v1/mcaptcha/update.rs.html +++ b/src/mcaptcha/api/v1/mcaptcha/update.rs.html @@ -210,63 +210,6 @@ 205 206 207 -208 -209 -210 -211 -212 -213 -214 -215 -216 -217 -218 -219 -220 -221 -222 -223 -224 -225 -226 -227 -228 -229 -230 -231 -232 -233 -234 -235 -236 -237 -238 -239 -240 -241 -242 -243 -244 -245 -246 -247 -248 -249 -250 -251 -252 -253 -254 -255 -256 -257 -258 -259 -260 -261 -262 -263 -264
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -283,14 +226,15 @@
  * You should have received a copy of the GNU Affero General Public License
  * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
-use std::borrow::Cow;
-
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
 use libmcaptcha::defense::Level;
 use libmcaptcha::master::messages::RenameBuilder;
 use serde::{Deserialize, Serialize};
 
+use db_core::errors::DBError;
+use db_core::CreateCaptcha;
+
 use super::create::MCaptchaDetails;
 use super::get_random;
 use crate::errors::*;
@@ -310,16 +254,16 @@
 
     loop {
         key = get_random(32);
-        let res = runner::update_key(&key, &payload.key, &username, &data).await;
-        if res.is_ok() {
-            break;
-        } else if let Err(sqlx::Error::Database(err)) = res {
-            if err.code() == Some(Cow::from("23505")) {
-                continue;
-            } else {
-                return Err(sqlx::Error::Database(err).into());
-            }
-        };
+
+        match data
+            .db
+            .update_captcha_key(&username, &payload.key, &key)
+            .await
+        {
+            Ok(_) => break,
+            Err(DBError::SecretTaken) => continue,
+            Err(e) => return Err(e.into()),
+        }
     }
 
     let payload = payload.into_inner();
@@ -361,29 +305,10 @@
 }
 
 pub mod runner {
-    use futures::future::try_join_all;
     use libmcaptcha::{master::messages::RemoveCaptcha, DefenseBuilder};
 
     use super::*;
 
-    pub async fn update_key(
-        key: &str,
-        old_key: &str,
-        username: &str,
-        data: &AppData,
-    ) -> Result<(), sqlx::Error> {
-        sqlx::query!(
-            "UPDATE mcaptcha_config SET key = $1 
-        WHERE key = $2 AND user_id = (SELECT ID FROM mcaptcha_users WHERE name = $3)",
-            &key,
-            &old_key,
-            &username,
-        )
-        .execute(&data.db)
-        .await?;
-        Ok(())
-    }
-
     pub async fn update_captcha(
         payload: &UpdateCaptcha,
         data: &AppData,
@@ -400,58 +325,21 @@
         // still, needs to be benchmarked
         defense.build()?;
 
-        let mut futs = Vec::with_capacity(payload.levels.len() + 2);
-        sqlx::query!(
-            "DELETE FROM mcaptcha_levels 
-        WHERE config_id = (
-            SELECT config_id FROM mcaptcha_config where key = ($1) 
-            AND user_id = (
-            SELECT ID from mcaptcha_users WHERE name = $2
-            )
-            )",
-            &payload.key,
-            &username
-        )
-        .execute(&data.db)
-        .await?;
+        data.db
+            .delete_captcha_levels(username, &payload.key)
+            .await?;
 
-        let update_fut = sqlx::query!(
-            "UPDATE mcaptcha_config SET name = $1, duration = $2 
-            WHERE user_id = (SELECT ID FROM mcaptcha_users WHERE name = $3)
-            AND key = $4",
-            &payload.description,
-            payload.duration as i32,
-            &username,
-            &payload.key,
-        )
-        .execute(&data.db); //.await?;
+        let m = CreateCaptcha {
+            key: &payload.key,
+            duration: payload.duration as i32,
+            description: &payload.description,
+        };
 
-        futs.push(update_fut);
+        data.db.update_captcha_metadata(username, &m).await?;
 
-        for level in payload.levels.iter() {
-            let difficulty_factor = level.difficulty_factor as i32;
-            let visitor_threshold = level.visitor_threshold as i32;
-            let fut = sqlx::query!(
-                "INSERT INTO mcaptcha_levels (
-            difficulty_factor, 
-            visitor_threshold,
-            config_id) VALUES  (
-            $1, $2, (
-                    SELECT config_id FROM mcaptcha_config WHERE key = ($3) AND
-                    user_id = (
-                        SELECT ID from mcaptcha_users WHERE name = $4
-                    )
-                ));",
-                difficulty_factor,
-                visitor_threshold,
-                &payload.key,
-                &username,
-            )
-            .execute(&data.db); //.await?;
-            futs.push(fut);
-        }
-
-        try_join_all(futs).await?;
+        data.db
+            .add_captcha_levels(username, &payload.key, &payload.levels)
+            .await?;
         if let Err(ServiceError::CaptchaError(e)) = data
             .captcha
             .remove(RemoveCaptcha(payload.key.clone()))
@@ -483,15 +371,13 @@
         const NAME: &str = "updateusermcaptcha";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "testupdateusermcaptcha@a.com";
-
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
+        delete_user(data, NAME).await;
 
         // 1. add mcaptcha token
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (data, _, signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
+        register_and_signin(data, NAME, EMAIL, PASSWORD).await;
+        let (_, signin_resp, token_key) = add_levels_util(data, NAME, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
         let app = get_app!(data).await;
 
diff --git a/src/mcaptcha/api/v1/meta.rs.html b/src/mcaptcha/api/v1/meta.rs.html
index ac1089fd..e82ae2f0 100644
--- a/src/mcaptcha/api/v1/meta.rs.html
+++ b/src/mcaptcha/api/v1/meta.rs.html
@@ -146,29 +146,22 @@
 141
 142
 143
-144
-145
-146
-147
-148
-149
-150
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_web::{web, HttpResponse, Responder};
 use derive_builder::Builder;
@@ -228,21 +221,13 @@
 /// checks all components of the system
 #[my_codegen::get(path = "crate::V1_API_ROUTES.meta.health")]
 async fn health(data: AppData) -> impl Responder {
-    use sqlx::Connection;
-
     let mut resp_builder = HealthBuilder::default();
-    resp_builder.db(false);
-    resp_builder.redis = None;
 
-    if let Ok(mut con) = data.db.acquire().await {
-        if con.ping().await.is_ok() {
-            resp_builder.db(true);
-        }
-    };
+    resp_builder.db(data.db.ping().await);
 
     if let SystemGroup::Redis(_) = data.captcha {
         if let Ok(r) = Redis::new(RedisConfig::Single(
-            crate::SETTINGS.redis.as_ref().unwrap().url.clone(),
+            data.settings.redis.as_ref().unwrap().url.clone(),
         ))
         .await
         {
@@ -262,7 +247,7 @@
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
     use actix_web::{http::StatusCode, test, App};
 
     use super::*;
@@ -284,9 +269,10 @@
     }
 
     #[actix_rt::test]
-    async fn health_works() {
+    pub async fn health_works() {
         println!("{}", V1_API_ROUTES.meta.health);
-        let data = Data::new().await;
+        let data = crate::tests::get_data().await;
+        let data = &data;
         let app = get_app!(data).await;
 
         let resp = test::call_service(
diff --git a/src/mcaptcha/api/v1/mod.rs.html b/src/mcaptcha/api/v1/mod.rs.html
index 2b54aa82..53ba084c 100644
--- a/src/mcaptcha/api/v1/mod.rs.html
+++ b/src/mcaptcha/api/v1/mod.rs.html
@@ -55,21 +55,21 @@
 50
 51
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_auth_middleware::Authentication;
 use actix_web::web::ServiceConfig;
diff --git a/src/mcaptcha/api/v1/notifications/add.rs.html b/src/mcaptcha/api/v1/notifications/add.rs.html
index d8561e1c..dcdf052e 100644
--- a/src/mcaptcha/api/v1/notifications/add.rs.html
+++ b/src/mcaptcha/api/v1/notifications/add.rs.html
@@ -106,25 +106,22 @@
 101
 102
 103
-104
-105
-106
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
@@ -133,8 +130,10 @@
 use crate::errors::*;
 use crate::AppData;
 
-#[derive(Serialize, Deserialize)]
-pub struct AddNotification {
+use db_core::AddNotification;
+
+#[derive(Debug, Clone, PartialEq, Default, Serialize, Deserialize)]
+pub struct AddNotificationRequest {
     pub to: String,
     pub heading: String,
     pub message: String,
@@ -146,32 +145,27 @@
     wrap = "crate::api::v1::get_middleware()"
 )]
 pub async fn add_notification(
-    payload: web::Json<AddNotification>,
+    payload: web::Json<AddNotificationRequest>,
     data: AppData,
     id: Identity,
 ) -> ServiceResult<impl Responder> {
     let sender = id.identity().unwrap();
     // TODO handle error where payload.to doesnt exist
-    sqlx::query!(
-        "INSERT INTO mcaptcha_notifications (
-              heading, message, tx, rx)
-              VALUES  (
-              $1, $2,
-                  (SELECT ID FROM mcaptcha_users WHERE name = $3),
-                  (SELECT ID FROM mcaptcha_users WHERE name = $4)
-                      );",
-        &payload.heading,
-        &payload.message,
-        &sender,
-        &payload.to,
-    )
-    .execute(&data.db)
-    .await?;
+
+    let p = AddNotification {
+        from: &sender,
+        to: &payload.to,
+        message: &payload.message,
+        heading: &payload.heading,
+    };
+
+    data.db.create_notification(&p).await?;
+
     Ok(HttpResponse::Ok())
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
     use actix_web::http::StatusCode;
     use actix_web::test;
 
@@ -180,26 +174,26 @@
     use crate::*;
 
     #[actix_rt::test]
-    async fn notification_works() {
+    pub async fn notification_works() {
         const NAME1: &str = "notifuser1";
         const NAME2: &str = "notiuser2";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL1: &str = "testnotification1@a.com";
         const EMAIL2: &str = "testnotification2@a.com";
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME1, &data).await;
-            delete_user(NAME2, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
 
-        register_and_signin(NAME1, EMAIL1, PASSWORD).await;
-        register_and_signin(NAME2, EMAIL2, PASSWORD).await;
-        let (data, _creds, signin_resp) = signin(NAME1, PASSWORD).await;
+        delete_user(data, NAME1).await;
+        delete_user(data, NAME2).await;
+
+        register_and_signin(data, NAME1, EMAIL1, PASSWORD).await;
+        register_and_signin(data, NAME2, EMAIL2, PASSWORD).await;
+        let (_creds, signin_resp) = signin(data, NAME1, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
         let app = get_app!(data).await;
 
-        let msg = AddNotification {
+        let msg = AddNotificationRequest {
             to: NAME2.into(),
             heading: "Test notification".into(),
             message: "Testeing notifications with a dummy message".into(),
diff --git a/src/mcaptcha/api/v1/notifications/get.rs.html b/src/mcaptcha/api/v1/notifications/get.rs.html
index 0bed0fdd..2d093835 100644
--- a/src/mcaptcha/api/v1/notifications/get.rs.html
+++ b/src/mcaptcha/api/v1/notifications/get.rs.html
@@ -147,61 +147,33 @@
 142
 143
 144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_identity::Identity;
 use actix_web::{HttpResponse, Responder};
 use serde::{Deserialize, Serialize};
-use sqlx::types::time::OffsetDateTime;
 
 use crate::errors::*;
 use crate::AppData;
 
-pub struct Notification {
-    pub name: Option<String>,
-    pub heading: Option<String>,
-    pub message: Option<String>,
-    pub received: Option<OffsetDateTime>,
-    pub id: Option<i32>,
-}
+use db_core::Notification;
 
-#[derive(Deserialize, Serialize)]
+#[derive(Default, PartialEq, Clone, Deserialize, Serialize)]
 pub struct NotificationResp {
     pub name: String,
     pub heading: String,
@@ -215,13 +187,26 @@
         NotificationResp {
             name: n.name.unwrap(),
             heading: n.heading.unwrap(),
-            received: n.received.unwrap().unix_timestamp(),
+            received: n.received.unwrap(),
             id: n.id.unwrap(),
             message: n.message.unwrap(),
         }
     }
 }
 
+impl NotificationResp {
+    pub fn from_notifications(mut n: Vec<Notification>) -> Vec<Self> {
+        let mut notifications = Vec::with_capacity(n.len());
+
+        n.drain(0..).for_each(|x| {
+            let y: NotificationResp = x.into();
+            notifications.push(y)
+        });
+
+        notifications
+    }
+}
+
 /// route handler that gets all unread notifications
 #[my_codegen::get(
     path = "crate::V1_API_ROUTES.notifications.get",
@@ -234,50 +219,23 @@
     let receiver = id.identity().unwrap();
     // TODO handle error where payload.to doesnt exist
 
-    let mut notifications = runner::get_notification(&data, &receiver).await?;
-    let resp: Vec<NotificationResp> = notifications
-        .drain(0..)
-        .map(|x| {
-            let y: NotificationResp = x.into();
-            y
-        })
-        .collect();
-
-    Ok(HttpResponse::Ok().json(resp))
-}
-
-pub mod runner {
-    use super::*;
-    pub async fn get_notification(
-        data: &AppData,
-        receiver: &str,
-    ) -> ServiceResult<Vec<Notification>> {
-        // TODO handle error where payload.to doesnt exist
-
-        let notifications = sqlx::query_file_as!(
-            Notification,
-            "src/api/v1/notifications/get_all_unread.sql",
-            &receiver
-        )
-        .fetch_all(&data.db)
-        .await?;
-
-        Ok(notifications)
-    }
+    let notifications = data.db.get_all_unread_notifications(&receiver).await?;
+    let notifications = NotificationResp::from_notifications(notifications);
+    Ok(HttpResponse::Ok().json(notifications))
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
     use actix_web::http::StatusCode;
     use actix_web::test;
 
     use super::*;
-    use crate::api::v1::notifications::add::AddNotification;
+    use crate::api::v1::notifications::add::AddNotificationRequest;
     use crate::tests::*;
     use crate::*;
 
     #[actix_rt::test]
-    async fn notification_get_works() {
+    pub async fn notification_get_works() {
         const NAME1: &str = "notifuser12";
         const NAME2: &str = "notiuser22";
         const PASSWORD: &str = "longpassworddomain";
@@ -286,21 +244,21 @@
         const HEADING: &str = "testing notifications get";
         const MESSAGE: &str = "testing notifications get message";
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME1, &data).await;
-            delete_user(NAME2, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
 
-        register_and_signin(NAME1, EMAIL1, PASSWORD).await;
-        register_and_signin(NAME2, EMAIL2, PASSWORD).await;
-        let (data, _creds, signin_resp) = signin(NAME1, PASSWORD).await;
-        let (_data, _creds2, signin_resp2) = signin(NAME2, PASSWORD).await;
+        delete_user(data, NAME1).await;
+        delete_user(data, NAME2).await;
+
+        register_and_signin(data, NAME1, EMAIL1, PASSWORD).await;
+        register_and_signin(data, NAME2, EMAIL2, PASSWORD).await;
+        let (_creds, signin_resp) = signin(data, NAME1, PASSWORD).await;
+        let (_creds2, signin_resp2) = signin(data, NAME2, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
         let cookies2 = get_cookie!(signin_resp2);
         let app = get_app!(data).await;
 
-        let msg = AddNotification {
+        let msg = AddNotificationRequest {
             to: NAME2.into(),
             heading: HEADING.into(),
             message: MESSAGE.into(),
diff --git a/src/mcaptcha/api/v1/notifications/mark_read.rs.html b/src/mcaptcha/api/v1/notifications/mark_read.rs.html
index 6c6e87d8..c39de9bd 100644
--- a/src/mcaptcha/api/v1/notifications/mark_read.rs.html
+++ b/src/mcaptcha/api/v1/notifications/mark_read.rs.html
@@ -145,35 +145,22 @@
 140
 141
 142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
@@ -187,15 +174,6 @@
     pub id: i32,
 }
 
-#[derive(Deserialize, Serialize)]
-pub struct NotificationResp {
-    pub name: String,
-    pub heading: String,
-    pub message: String,
-    pub received: i64,
-    pub id: i32,
-}
-
 /// route handler that marks a notification read
 #[my_codegen::post(
     path = "crate::V1_API_ROUTES.notifications.mark_read",
@@ -209,30 +187,27 @@
     let receiver = id.identity().unwrap();
     // TODO handle error where payload.to doesnt exist
 
-    sqlx::query_file_as!(
-        Notification,
-        "src/api/v1/notifications/mark_read.sql",
-        payload.id,
-        &receiver
-    )
-    .execute(&data.db)
-    .await?;
+    // TODO get payload from path /api/v1/notifications/{id}/read"
+    data.db
+        .mark_notification_read(&receiver, payload.id)
+        .await?;
 
     Ok(HttpResponse::Ok())
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
     use actix_web::http::StatusCode;
     use actix_web::test;
 
     use super::*;
-    use crate::api::v1::notifications::add::AddNotification;
+    use crate::api::v1::notifications::add::AddNotificationRequest;
+    use crate::api::v1::notifications::get::NotificationResp;
     use crate::tests::*;
     use crate::*;
 
     #[actix_rt::test]
-    async fn notification_mark_read_works() {
+    pub async fn notification_mark_read_works() {
         const NAME1: &str = "notifuser122";
         const NAME2: &str = "notiuser222";
         const PASSWORD: &str = "longpassworddomain";
@@ -240,22 +215,21 @@
         const EMAIL2: &str = "testnotification222@a.com";
         const HEADING: &str = "testing notifications get";
         const MESSAGE: &str = "testing notifications get message";
+        let data = get_data().await;
+        let data = &data;
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME1, &data).await;
-            delete_user(NAME2, &data).await;
-        }
+        delete_user(data, NAME1).await;
+        delete_user(data, NAME2).await;
 
-        register_and_signin(NAME1, EMAIL1, PASSWORD).await;
-        register_and_signin(NAME2, EMAIL2, PASSWORD).await;
-        let (data, _creds, signin_resp) = signin(NAME1, PASSWORD).await;
-        let (_data, _creds2, signin_resp2) = signin(NAME2, PASSWORD).await;
+        register_and_signin(data, NAME1, EMAIL1, PASSWORD).await;
+        register_and_signin(data, NAME2, EMAIL2, PASSWORD).await;
+        let (_creds, signin_resp) = signin(data, NAME1, PASSWORD).await;
+        let (_creds2, signin_resp2) = signin(data, NAME2, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
         let cookies2 = get_cookie!(signin_resp2);
         let app = get_app!(data).await;
 
-        let msg = AddNotification {
+        let msg = AddNotificationRequest {
             to: NAME2.into(),
             heading: HEADING.into(),
             message: MESSAGE.into(),
diff --git a/src/mcaptcha/api/v1/notifications/mod.rs.html b/src/mcaptcha/api/v1/notifications/mod.rs.html
index 8c1adf6f..5ae1e5a3 100644
--- a/src/mcaptcha/api/v1/notifications/mod.rs.html
+++ b/src/mcaptcha/api/v1/notifications/mod.rs.html
@@ -49,21 +49,21 @@
 44
 45
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 pub mod add;
 pub mod get;
diff --git a/src/mcaptcha/api/v1/pow/get_config.rs.html b/src/mcaptcha/api/v1/pow/get_config.rs.html
index 626ae772..cb8fa456 100644
--- a/src/mcaptcha/api/v1/pow/get_config.rs.html
+++ b/src/mcaptcha/api/v1/pow/get_config.rs.html
@@ -188,28 +188,22 @@
 183
 184
 185
-186
-187
-188
-189
-190
-191
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 //use actix::prelude::*;
 use actix_web::{web, HttpResponse, Responder};
@@ -219,9 +213,8 @@
 };
 use serde::{Deserialize, Serialize};
 
-use super::I32Levels;
 use crate::errors::*;
-use crate::stats::record::record_fetch;
+//use crate::stats::record::record_fetch;
 use crate::AppData;
 use crate::V1_API_ROUTES;
 
@@ -238,43 +231,58 @@
     payload: web::Json<GetConfigPayload>,
     data: AppData,
 ) -> ServiceResult<impl Responder> {
-    let res = sqlx::query!(
-        "SELECT EXISTS (SELECT 1 from mcaptcha_config WHERE key = $1)",
-        &payload.key,
-    )
-    .fetch_one(&data.db)
-    .await?;
-
-    if res.exists.is_none() {
+    //if res.exists.is_none() {
+    if !data.db.captcha_exists(None, &payload.key).await? {
         return Err(ServiceError::TokenNotFound);
     }
     let payload = payload.into_inner();
-    match res.exists {
-        Some(true) => {
-            match data.captcha.get_pow(payload.key.clone()).await {
-                Ok(Some(config)) => {
-                    record_fetch(&payload.key, &data.db).await;
-                    Ok(HttpResponse::Ok().json(config))
-                }
-                Ok(None) => {
-                    init_mcaptcha(&data, &payload.key).await?;
-                    let config = data
-                        .captcha
-                        .get_pow(payload.key.clone())
-                        .await
-                        .expect("mcaptcha should be initialized and ready to go");
-                    // background it. would require data::Data to be static
-                    // to satidfy lifetime
-                    record_fetch(&payload.key, &data.db).await;
-                    Ok(HttpResponse::Ok().json(config))
-                }
-                Err(e) => Err(e.into()),
-            }
-        }
 
-        Some(false) => Err(ServiceError::TokenNotFound),
-        None => Err(ServiceError::TokenNotFound),
+    match data.captcha.get_pow(payload.key.clone()).await {
+        Ok(Some(config)) => {
+            data.stats.record_fetch(&data, &payload.key).await?;
+            Ok(HttpResponse::Ok().json(config))
+        }
+        Ok(None) => {
+            init_mcaptcha(&data, &payload.key).await?;
+            let config = data
+                .captcha
+                .get_pow(payload.key.clone())
+                .await
+                .expect("mcaptcha should be initialized and ready to go");
+            // background it. would require data::Data to be static
+            // to satidfy lifetime
+            data.stats.record_fetch(&data, &payload.key).await?;
+            Ok(HttpResponse::Ok().json(config))
+        }
+        Err(e) => Err(e.into()),
     }
+
+    //    match res.exists {
+    //        Some(true) => {
+    //            match data.captcha.get_pow(payload.key.clone()).await {
+    //                Ok(Some(config)) => {
+    //                    record_fetch(&payload.key, &data.db).await;
+    //                    Ok(HttpResponse::Ok().json(config))
+    //                }
+    //                Ok(None) => {
+    //                    init_mcaptcha(&data, &payload.key).await?;
+    //                    let config = data
+    //                        .captcha
+    //                        .get_pow(payload.key.clone())
+    //                        .await
+    //                        .expect("mcaptcha should be initialized and ready to go");
+    //                    // background it. would require data::Data to be static
+    //                    // to satidfy lifetime
+    //                    record_fetch(&payload.key, &data.db).await;
+    //                    Ok(HttpResponse::Ok().json(config))
+    //                }
+    //                Err(e) => Err(e.into()),
+    //            }
+    //        }
+    //
+    //        Some(false) => Err(ServiceError::TokenNotFound),
+    //        None => Err(ServiceError::TokenNotFound),
+    //    }
 }
 /// Call this when [MCaptcha][libmcaptcha::MCaptcha] is not in master.
 ///
@@ -282,29 +290,8 @@
 /// creates [MCaptcha][libmcaptcha::MCaptcha] and adds it to [Master][libmcaptcha::Defense]
 async fn init_mcaptcha(data: &AppData, key: &str) -> ServiceResult<()> {
     // get levels
-    let levels_fut = sqlx::query_as!(
-        I32Levels,
-        "SELECT difficulty_factor, visitor_threshold FROM mcaptcha_levels  WHERE
-            config_id = (
-                SELECT config_id FROM mcaptcha_config WHERE key = ($1)
-                ) ORDER BY difficulty_factor ASC;",
-        &key,
-    )
-    .fetch_all(&data.db);
-
-    struct DurationResp {
-        duration: i32,
-    }
-    // get duration
-    let duration_fut = sqlx::query_as!(
-        DurationResp,
-        "SELECT duration FROM mcaptcha_config  
-        WHERE key = $1",
-        &key,
-    )
-    .fetch_one(&data.db);
-    //let (levels, duration) = futures::try_join!(levels_fut, duration_fut).await?;
-    let (levels, duration) = futures::try_join!(levels_fut, duration_fut)?;
+    let levels = data.db.get_captcha_levels(None, key).await?;
+    let duration = data.db.get_captcha_cooldown(key).await?;
 
     // build defense
     let mut defense = DefenseBuilder::default();
@@ -325,7 +312,7 @@
     let mcaptcha = MCaptchaBuilder::default()
         .defense(defense)
         // leaky bucket algorithm's emission interval
-        .duration(duration.duration as u64)
+        .duration(duration as u64)
         //   .cache(cache)
         .build()
         .unwrap();
@@ -343,11 +330,12 @@
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
+    use crate::*;
     use libmcaptcha::pow::PoWConfig;
 
     #[actix_rt::test]
-    async fn get_pow_config_works() {
+    pub async fn get_pow_config_works() {
         use super::*;
         use crate::tests::*;
         use crate::*;
@@ -357,13 +345,13 @@
         const PASSWORD: &str = "testingpas";
         const EMAIL: &str = "randomuser@a.com";
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
 
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (data, _, _signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
+        delete_user(data, NAME).await;
+
+        register_and_signin(data, NAME, EMAIL, PASSWORD).await;
+        let (_, _signin_resp, token_key) = add_levels_util(data, NAME, PASSWORD).await;
         let app = get_app!(data).await;
 
         let get_config_payload = GetConfigPayload {
diff --git a/src/mcaptcha/api/v1/pow/mod.rs.html b/src/mcaptcha/api/v1/pow/mod.rs.html
index 17d13dc8..4c431040 100644
--- a/src/mcaptcha/api/v1/pow/mod.rs.html
+++ b/src/mcaptcha/api/v1/pow/mod.rs.html
@@ -100,21 +100,21 @@
 95
 96
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_web::web;
 
diff --git a/src/mcaptcha/api/v1/pow/verify_pow.rs.html b/src/mcaptcha/api/v1/pow/verify_pow.rs.html
index f837954a..30d213a1 100644
--- a/src/mcaptcha/api/v1/pow/verify_pow.rs.html
+++ b/src/mcaptcha/api/v1/pow/verify_pow.rs.html
@@ -136,24 +136,22 @@
 131
 132
 133
-134
-135
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 //! PoW Verification module
 
 use actix_web::{web, HttpResponse, Responder};
@@ -161,7 +159,6 @@
 use serde::{Deserialize, Serialize};
 
 use crate::errors::*;
-use crate::stats::record::record_solve;
 use crate::AppData;
 use crate::V1_API_ROUTES;
 
@@ -183,13 +180,13 @@
 ) -> ServiceResult<impl Responder> {
     let key = payload.key.clone();
     let res = data.captcha.verify_pow(payload.into_inner()).await?;
-    record_solve(&key, &data.db).await;
+    data.stats.record_solve(&data, &key).await?;
     let payload = ValidationToken { token: res };
     Ok(HttpResponse::Ok().json(payload))
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
     use actix_web::http::StatusCode;
     use actix_web::test;
     use libmcaptcha::pow::PoWConfig;
@@ -200,18 +197,17 @@
     use crate::*;
 
     #[actix_rt::test]
-    async fn verify_pow_works() {
+    pub async fn verify_pow_works() {
         const NAME: &str = "powverifyusr";
         const PASSWORD: &str = "testingpas";
         const EMAIL: &str = "verifyuser@a.com";
+        let data = get_data().await;
+        let data = &data;
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        delete_user(data, NAME).await;
 
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (data, _, _signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
+        register_and_signin(data, NAME, EMAIL, PASSWORD).await;
+        let (_, _signin_resp, token_key) = add_levels_util(data, NAME, PASSWORD).await;
         let app = get_app!(data).await;
 
         let get_config_payload = GetConfigPayload {
diff --git a/src/mcaptcha/api/v1/pow/verify_token.rs.html b/src/mcaptcha/api/v1/pow/verify_token.rs.html
index b65d0b68..95ab2391 100644
--- a/src/mcaptcha/api/v1/pow/verify_token.rs.html
+++ b/src/mcaptcha/api/v1/pow/verify_token.rs.html
@@ -160,24 +160,22 @@
 155
 156
 157
-158
-159
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 //! PoW success token module
 
 use actix_web::{web, HttpResponse, Responder};
@@ -185,7 +183,6 @@
 use serde::{Deserialize, Serialize};
 
 use crate::errors::*;
-use crate::stats::record::record_confirm;
 use crate::AppData;
 use crate::V1_API_ROUTES;
 
@@ -208,13 +205,13 @@
         .validate_verification_tokens(payload.into_inner())
         .await?;
     let payload = CaptchaValidateResp { valid: res };
-    record_confirm(&key, &data.db).await;
+    data.stats.record_confirm(&data, &key).await?;
     //println!("{:?}", &payload);
     Ok(HttpResponse::Ok().json(payload))
 }
 
 #[cfg(test)]
-mod tests {
+pub mod tests {
     use actix_web::http::StatusCode;
     use actix_web::test;
     use libmcaptcha::pow::PoWConfig;
@@ -227,7 +224,7 @@
     use crate::*;
 
     #[actix_rt::test]
-    async fn validate_captcha_token_works() {
+    pub async fn validate_captcha_token_works() {
         const NAME: &str = "enterprisetken";
         const PASSWORD: &str = "testingpas";
         const EMAIL: &str = "verifyuser@enter.com";
@@ -236,13 +233,12 @@
         const VERIFY_TOKEN_URL: &str = "/api/v1/pow/siteverify";
         //        const UPDATE_URL: &str = "/api/v1/mcaptcha/domain/token/duration/update";
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
+        delete_user(data, NAME).await;
 
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (data, _, _signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
+        register_and_signin(data, NAME, EMAIL, PASSWORD).await;
+        let (_, _signin_resp, token_key) = add_levels_util(data, NAME, PASSWORD).await;
         let app = get_app!(data).await;
 
         let get_config_payload = GetConfigPayload {
diff --git a/src/mcaptcha/api/v1/routes.rs.html b/src/mcaptcha/api/v1/routes.rs.html
index b8b5615f..3b6e1abe 100644
--- a/src/mcaptcha/api/v1/routes.rs.html
+++ b/src/mcaptcha/api/v1/routes.rs.html
@@ -58,21 +58,21 @@
 53
 54
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 use actix_auth_middleware::GetLoginRoute;
 
 use super::account::routes::Account;
diff --git a/src/mcaptcha/data.rs.html b/src/mcaptcha/data.rs.html
index ed994a79..5b7336e7 100644
--- a/src/mcaptcha/data.rs.html
+++ b/src/mcaptcha/data.rs.html
@@ -226,6 +226,29 @@
 221
 222
 223
+224
+225
+226
+227
+228
+229
+230
+231
+232
+233
+234
+235
+236
+237
+238
+239
+240
+241
+242
+243
+244
+245
+246
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -247,6 +270,8 @@
 
 use actix::prelude::*;
 use argon2_creds::{Config, ConfigBuilder, PasswordPolicy};
+use db_core::prelude::*;
+use db_sqlx_postgres::{ConnectionOptions, Fresh};
 use lettre::transport::smtp::authentication::Mechanism;
 use lettre::{
     transport::smtp::authentication::Credentials, AsyncSmtpTransport, Tokio1Executor,
@@ -267,10 +292,12 @@
     system::{System, SystemBuilder},
 };
 use sqlx::postgres::PgPoolOptions;
-use sqlx::PgPool;
+
+use db_core::MCDatabase;
 
 use crate::errors::ServiceResult;
-use crate::SETTINGS;
+use crate::settings::Settings;
+use crate::stats::{Dummy, Real, Stats};
 
 macro_rules! enum_system_actor {
     ($name:ident, $type:ident) => {
@@ -329,9 +356,13 @@
     // utility function to remove captcha
     enum_system_actor!(remove, RemoveCaptcha);
 
-    fn new_system<A: Save, B: MasterTrait>(m: Addr<B>, c: Addr<A>) -> System<A, B> {
+    fn new_system<A: Save, B: MasterTrait>(
+        s: &Settings,
+        m: Addr<B>,
+        c: Addr<A>,
+    ) -> System<A, B> {
         let pow = PoWConfigBuilder::default()
-            .salt(SETTINGS.captcha.salt.clone())
+            .salt(s.captcha.salt.clone())
             .build()
             .unwrap();
 
@@ -340,8 +371,8 @@
 
     // read settings, if Redis is configured then produce a Redis mCaptcha cache
     // based SystemGroup
-    async fn new() -> Self {
-        match &SETTINGS.redis {
+    async fn new(s: &Settings) -> Self {
+        match &s.redis {
             Some(val) => {
                 let master = RedisMaster::new(RedisConfig::Single(val.url.clone()))
                     .await
@@ -351,14 +382,14 @@
                     .await
                     .unwrap()
                     .start();
-                let captcha = Self::new_system(master, cache);
+                let captcha = Self::new_system(s, master, cache);
 
                 SystemGroup::Redis(captcha)
             }
             None => {
-                let master = EmbeddedMaster::new(SETTINGS.captcha.gc).start();
+                let master = EmbeddedMaster::new(s.captcha.gc).start();
                 let cache = HashCache::default().start();
-                let captcha = Self::new_system(master, cache);
+                let captcha = Self::new_system(s, master, cache);
 
                 SystemGroup::Embedded(captcha)
             }
@@ -368,14 +399,18 @@
 
 /// App data
 pub struct Data {
-    /// databse pool
-    pub db: PgPool,
+    /// database ops defined by db crates
+    pub db: Box<dyn MCDatabase>,
     /// credential management configuration
     pub creds: Config,
     /// mCaptcha system: Redis cache, etc.
     pub captcha: SystemGroup,
     /// email client
     pub mailer: Option<Mailer>,
+    /// app settings
+    pub settings: Settings,
+    /// stats recorder
+    pub stats: Box<dyn Stats>,
 }
 
 impl Data {
@@ -390,7 +425,7 @@
     }
     #[cfg(not(tarpaulin_include))]
     /// create new instance of app data
-    pub async fn new() -> Arc<Self> {
+    pub async fn new(s: &Settings) -> Arc<Self> {
         let creds = Self::get_creds();
         let c = creds.clone();
 
@@ -401,17 +436,28 @@
             log::info!("Initialized credential manager");
         });
 
-        let db = PgPoolOptions::new()
-            .max_connections(SETTINGS.database.pool)
-            .connect(&SETTINGS.database.url)
-            .await
-            .expect("Unable to form database pool");
+        let pool = s.database.pool;
+        let pool_options = PgPoolOptions::new().max_connections(pool);
+        let connection_options = ConnectionOptions::Fresh(Fresh {
+            pool_options,
+            url: s.database.url.clone(),
+        });
+        let db = connection_options.connect().await.unwrap();
+        db.migrate().await.unwrap();
+
+        let stats: Box<dyn Stats> = if s.captcha.enable_stats {
+            Box::new(Real::default())
+        } else {
+            Box::new(Dummy::default())
+        };
 
         let data = Data {
             creds,
-            db,
-            captcha: SystemGroup::new().await,
-            mailer: Self::get_mailer(),
+            db: Box::new(db),
+            captcha: SystemGroup::new(s).await,
+            mailer: Self::get_mailer(s),
+            settings: s.clone(),
+            stats,
         };
 
         #[cfg(not(debug_assertions))]
@@ -420,8 +466,8 @@
         Arc::new(data)
     }
 
-    fn get_mailer() -> Option<Mailer> {
-        if let Some(smtp) = SETTINGS.smtp.as_ref() {
+    fn get_mailer(s: &Settings) -> Option<Mailer> {
+        if let Some(smtp) = s.smtp.as_ref() {
             let creds =
                 Credentials::new(smtp.username.to_string(), smtp.password.to_string()); // "smtp_username".to_string(), "smtp_password".to_string());
 
diff --git a/src/mcaptcha/date.rs.html b/src/mcaptcha/date.rs.html
index 1ec68af1..c3fb76b2 100644
--- a/src/mcaptcha/date.rs.html
+++ b/src/mcaptcha/date.rs.html
@@ -112,6 +112,12 @@
 107
 108
 109
+110
+111
+112
+113
+114
+115
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -179,6 +185,12 @@
     pub fn date(&self) -> String {
         self.time.format("%F %r %z")
     }
+
+    pub fn new(unix: i64) -> Self {
+        Self {
+            time: OffsetDateTime::from_unix_timestamp(unix),
+        }
+    }
 }
 
 #[cfg(test)]
diff --git a/src/mcaptcha/demo.rs.html b/src/mcaptcha/demo.rs.html
index c579ac82..8e941fe0 100644
--- a/src/mcaptcha/demo.rs.html
+++ b/src/mcaptcha/demo.rs.html
@@ -171,7 +171,6 @@
 166
 167
 168
-169
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -289,11 +288,10 @@
 
     #[actix_rt::test]
     async fn demo_account_works() {
-        {
-            let data = Data::new().await;
-            crate::tests::delete_user(DEMO_USER, &data).await;
-        }
-        let data = AppData::new(Data::new().await);
+        let data_inner = get_data().await;
+        let data_inner = &data_inner;
+        let data = AppData::new(data_inner.clone());
+        crate::tests::delete_user(data_inner, DEMO_USER).await;
         let duration = Duration::from_secs(DURATION);
 
         // register works
@@ -302,7 +300,7 @@
             val: DEMO_USER.into(),
         };
         assert!(username_exists(&payload, &data).await.unwrap().exists);
-        signin(DEMO_USER, DEMO_PASSWORD).await;
+        signin(data_inner, DEMO_USER, DEMO_PASSWORD).await;
 
         // deletion works
         assert!(DemoUser::delete_demo_user(&data).await.is_ok());
@@ -310,8 +308,8 @@
 
         // test the runner
         let user = DemoUser::spawn(data, duration).await.unwrap();
-        let (data_inner, _, signin_resp, token_key) =
-            add_levels_util(DEMO_USER, DEMO_PASSWORD).await;
+        let (_, signin_resp, token_key) =
+            add_levels_util(data_inner, DEMO_USER, DEMO_PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
         let app = get_app!(data_inner).await;
 
diff --git a/src/mcaptcha/docs.rs.html b/src/mcaptcha/docs.rs.html
index 42b4fbe9..7a3634a5 100644
--- a/src/mcaptcha/docs.rs.html
+++ b/src/mcaptcha/docs.rs.html
@@ -138,7 +138,6 @@
 133
 134
 135
-136
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -213,7 +212,6 @@
     }
 }
 
-
 #[my_codegen::get(path = "DOCS.assets")]
 async fn dist(path: web::Path<String>) -> impl Responder {
     handle_embedded_file(&path)
diff --git a/src/mcaptcha/email/mod.rs.html b/src/mcaptcha/email/mod.rs.html
index 052c0dac..7bc476d1 100644
--- a/src/mcaptcha/email/mod.rs.html
+++ b/src/mcaptcha/email/mod.rs.html
@@ -22,21 +22,21 @@
 17
 18
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 pub mod verification;
 
diff --git a/src/mcaptcha/email/verification.rs.html b/src/mcaptcha/email/verification.rs.html index cd58e3ac..cba1259c 100644 --- a/src/mcaptcha/email/verification.rs.html +++ b/src/mcaptcha/email/verification.rs.html @@ -134,21 +134,21 @@ 129 130
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 //! Email operations: verification, notification, etc
 use lettre::{
     message::{header, MultiPart, SinglePart},
@@ -158,7 +158,6 @@
 
 use crate::errors::*;
 use crate::Data;
-use crate::SETTINGS;
 
 const PAGE: &str = "Login";
 
@@ -179,7 +178,7 @@
     to: &str,
     verification_link: &str,
 ) -> ServiceResult<()> {
-    if let Some(smtp) = SETTINGS.smtp.as_ref() {
+    if let Some(smtp) = data.settings.smtp.as_ref() {
         let from = format!("mCaptcha Admin <{}>", smtp.from);
         let reply_to = format!("mCaptcha Admin <{}>", smtp.reply);
         const SUBJECT: &str = "[mCaptcha] Please verify your email";
@@ -199,7 +198,7 @@ Admin
 instance: {}
 project website: {}",
             verification_link,
-            SETTINGS.server.domain,
+            &data.settings.server.domain,
             crate::PKG_HOMEPAGE
         );
 
@@ -240,7 +239,8 @@ project website: {}",
     async fn email_verification_works() {
         const TO_ADDR: &str = "Hello <realaravinth@localhost>";
         const VERIFICATION_LINK: &str = "https://localhost";
-        let data = Data::new().await;
+        let data = crate::tests::get_data().await;
+        let settings = &data.settings;
         verification(&data, TO_ADDR, VERIFICATION_LINK)
             .await
             .unwrap();
@@ -253,7 +253,7 @@ project website: {}",
             .unwrap();
         let data: serde_json::Value = resp.json().await.unwrap();
         let data = &data[0];
-        let smtp = SETTINGS.smtp.as_ref().unwrap();
+        let smtp = settings.smtp.as_ref().unwrap();
 
         let from_addr = &data["headers"]["from"];
 
diff --git a/src/mcaptcha/errors.rs.html b/src/mcaptcha/errors.rs.html
index 6190240b..6c9acb20 100644
--- a/src/mcaptcha/errors.rs.html
+++ b/src/mcaptcha/errors.rs.html
@@ -316,22 +316,48 @@
 311
 312
 313
+314
+315
+316
+317
+318
+319
+320
+321
+322
+323
+324
+325
+326
+327
+328
+329
+330
+331
+332
+333
+334
+335
+336
+337
+338
+339
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use std::convert::From;
 
@@ -342,6 +368,7 @@
     HttpResponse, HttpResponseBuilder,
 };
 use argon2_creds::errors::CredsError;
+use db_core::errors::DBError;
 use derive_more::{Display, Error};
 use lettre::transport::smtp::Error as SmtpError;
 use libmcaptcha::errors::CaptchaError;
@@ -353,6 +380,15 @@
 #[derive(Debug, Display, Error)]
 pub struct SmtpErrorWrapper(SmtpError);
 
+#[derive(Debug, Display, Error)]
+pub struct DBErrorWrapper(DBError);
+
+impl std::cmp::PartialEq for DBErrorWrapper {
+    fn eq(&self, other: &Self) -> bool {
+        format!("{}", self.0) == format!("{}", other.0)
+    }
+}
+
 impl std::cmp::PartialEq for SmtpErrorWrapper {
     fn eq(&self, other: &Self) -> bool {
         self.0.status() == other.0.status()
@@ -414,13 +450,23 @@
     #[display(fmt = "Unable to send email, contact admin")]
     UnableToSendEmail(SmtpErrorWrapper),
 
-    /// when the a token name is already taken
     /// token not found
     #[display(fmt = "Token not found. Is token registered?")]
     TokenNotFound,
 
     #[display(fmt = "{}", _0)]
     CaptchaError(CaptchaError),
+
+    #[display(fmt = "{}", _0)]
+    DBError(DBErrorWrapper),
+
+    /// captcha not found
+    #[display(fmt = "Captcha not found.")]
+    CaptchaNotFound,
+
+    /// Traffic pattern not found
+    #[display(fmt = "Traffic pattern not found")]
+    TrafficPatternNotFound,
 }
 
 #[derive(Serialize, Deserialize)]
@@ -478,6 +524,10 @@
                 log::error!("{}", e.0);
                 StatusCode::INTERNAL_SERVER_ERROR
             }
+
+            ServiceError::DBError(_) => StatusCode::INTERNAL_SERVER_ERROR,
+            ServiceError::CaptchaNotFound => StatusCode::NOT_FOUND,
+            ServiceError::TrafficPatternNotFound => StatusCode::NOT_FOUND,
         }
     }
 }
@@ -497,6 +547,22 @@
     }
 }
 
+impl From<DBError> for ServiceError {
+    #[cfg(not(tarpaulin_include))]
+    fn from(e: DBError) -> ServiceError {
+        println!("from conversin: {}", e);
+        match e {
+            DBError::UsernameTaken => ServiceError::UsernameTaken,
+            DBError::SecretTaken => ServiceError::InternalServerError,
+            DBError::EmailTaken => ServiceError::EmailTaken,
+            DBError::AccountNotFound => ServiceError::AccountNotFound,
+            DBError::CaptchaNotFound => ServiceError::CaptchaNotFound,
+            DBError::TrafficPatternNotFound => ServiceError::TrafficPatternNotFound,
+            _ => ServiceError::DBError(DBErrorWrapper(e)),
+        }
+    }
+}
+
 impl From<ValidationErrors> for ServiceError {
     #[cfg(not(tarpaulin_include))]
     fn from(_: ValidationErrors) -> ServiceError {
@@ -518,21 +584,6 @@
     }
 }
 
-#[cfg(not(tarpaulin_include))]
-impl From<sqlx::Error> for ServiceError {
-    #[cfg(not(tarpaulin_include))]
-    fn from(e: sqlx::Error) -> Self {
-        use sqlx::error::Error;
-        use std::borrow::Cow;
-        if let Error::Database(err) = e {
-            if err.code() == Some(Cow::from("23505")) {
-                return ServiceError::UsernameTaken;
-            }
-        }
-        ServiceError::InternalServerError
-    }
-}
-
 #[cfg(not(tarpaulin_include))]
 impl From<SmtpError> for ServiceError {
     #[cfg(not(tarpaulin_include))]
@@ -572,14 +623,6 @@
     ServiceError(ServiceError),
 }
 
-#[cfg(not(tarpaulin_include))]
-impl From<sqlx::Error> for PageError {
-    #[cfg(not(tarpaulin_include))]
-    fn from(_: sqlx::Error) -> Self {
-        PageError::InternalServerError
-    }
-}
-
 #[cfg(not(tarpaulin_include))]
 impl From<ServiceError> for PageError {
     #[cfg(not(tarpaulin_include))]
@@ -588,6 +631,15 @@
     }
 }
 
+#[cfg(not(tarpaulin_include))]
+impl From<DBError> for PageError {
+    #[cfg(not(tarpaulin_include))]
+    fn from(e: DBError) -> Self {
+        let se: ServiceError = e.into();
+        se.into()
+    }
+}
+
 impl ResponseError for PageError {
     fn error_response(&self) -> HttpResponse {
         use crate::PAGES;
diff --git a/src/mcaptcha/main.rs.html b/src/mcaptcha/main.rs.html
index 580e9f30..af7e5d83 100644
--- a/src/mcaptcha/main.rs.html
+++ b/src/mcaptcha/main.rs.html
@@ -191,6 +191,10 @@
 186
 187
 188
+189
+190
+191
+192
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -287,7 +291,8 @@
 
 pub const CACHE_AGE: u32 = 604800;
 
-pub type AppData = actix_web::web::Data<Arc<crate::data::Data>>;
+pub type ArcData = Arc<crate::data::Data>;
+pub type AppData = actix_web::web::Data<ArcData>;
 
 #[cfg(not(tarpaulin_include))]
 #[actix_web::main]
@@ -302,13 +307,13 @@
         PKG_NAME, PKG_DESCRIPTION, PKG_HOMEPAGE, VERSION, GIT_COMMIT_HASH
     );
 
-    let data = Data::new().await;
-    sqlx::migrate!("./migrations/").run(&data.db).await.unwrap();
+    let settings = Settings::new().unwrap();
+    let data = Data::new(&settings).await;
     let data = actix_web::web::Data::new(data);
 
     let mut demo_user: Option<DemoUser> = None;
 
-    if SETTINGS.allow_demo && SETTINGS.allow_registration {
+    if settings.allow_demo && settings.allow_registration {
         demo_user = Some(
             DemoUser::spawn(data.clone(), Duration::from_secs(60 * 30))
                 .await
@@ -316,16 +321,17 @@
         );
     }
 
-    println!("Starting server on: http://{}", SETTINGS.server.get_ip());
+    let ip = settings.server.get_ip();
+    println!("Starting server on: http://{ip}");
 
     HttpServer::new(move || {
         App::new()
             .wrap(actix_middleware::Logger::default())
             .wrap(
                 actix_middleware::DefaultHeaders::new()
-                    .header("Permissions-Policy", "interest-cohort=()"),
+                    .add(("Permissions-Policy", "interest-cohort=()")),
             )
-            .wrap(get_identity_service())
+            .wrap(get_identity_service(&settings))
             .wrap(actix_middleware::Compress::default())
             .app_data(data.clone())
             .wrap(actix_middleware::NormalizePath::new(
@@ -334,7 +340,7 @@
             .configure(routes::services)
             .app_data(get_json_err())
     })
-    .bind(SETTINGS.server.get_ip())
+    .bind(&ip)
     .unwrap()
     .run()
     .await?;
@@ -354,14 +360,16 @@
 }
 
 #[cfg(not(tarpaulin_include))]
-pub fn get_identity_service() -> IdentityService<CookieIdentityPolicy> {
-    let cookie_secret = &SETTINGS.server.cookie_secret;
+pub fn get_identity_service(
+    settings: &Settings,
+) -> IdentityService<CookieIdentityPolicy> {
+    let cookie_secret = &settings.server.cookie_secret;
     IdentityService::new(
         CookieIdentityPolicy::new(cookie_secret.as_bytes())
             .name("Authorization")
             //TODO change cookie age
             .max_age_secs(216000)
-            .domain(&SETTINGS.server.domain)
+            .domain(&settings.server.domain)
             .secure(false),
     )
 }
diff --git a/src/mcaptcha/pages/auth/login.rs.html b/src/mcaptcha/pages/auth/login.rs.html
index 62f4fba7..20dabb2b 100644
--- a/src/mcaptcha/pages/auth/login.rs.html
+++ b/src/mcaptcha/pages/auth/login.rs.html
@@ -48,30 +48,28 @@
 43
 44
 45
-46
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_web::{HttpResponse, Responder};
 use lazy_static::lazy_static;
 use my_codegen::get;
 use sailfish::TemplateOnce;
 
-use crate::api::v1::RedirectQuery;
 use crate::PAGES;
 
 #[derive(Clone, TemplateOnce)]
diff --git a/src/mcaptcha/pages/auth/mod.rs.html b/src/mcaptcha/pages/auth/mod.rs.html
index d39ab5f1..bed666e3 100644
--- a/src/mcaptcha/pages/auth/mod.rs.html
+++ b/src/mcaptcha/pages/auth/mod.rs.html
@@ -65,21 +65,21 @@
 60
 61
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 pub mod login;
 pub mod register;
diff --git a/src/mcaptcha/pages/auth/register.rs.html b/src/mcaptcha/pages/auth/register.rs.html
index 3ffedb8d..8d5500eb 100644
--- a/src/mcaptcha/pages/auth/register.rs.html
+++ b/src/mcaptcha/pages/auth/register.rs.html
@@ -47,21 +47,21 @@
 42
 43
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_web::{HttpResponse, Responder};
 use lazy_static::lazy_static;
diff --git a/src/mcaptcha/pages/errors.rs.html b/src/mcaptcha/pages/errors.rs.html
index f5836bb7..366eda17 100644
--- a/src/mcaptcha/pages/errors.rs.html
+++ b/src/mcaptcha/pages/errors.rs.html
@@ -121,20 +121,24 @@
 116
 117
 118
+119
+120
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>. */
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_web::{web, HttpResponse, Responder};
 use lazy_static::lazy_static;
diff --git a/src/mcaptcha/pages/mod.rs.html b/src/mcaptcha/pages/mod.rs.html
index 12dffa42..89ea7400 100644
--- a/src/mcaptcha/pages/mod.rs.html
+++ b/src/mcaptcha/pages/mod.rs.html
@@ -130,7 +130,8 @@
  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  * GNU Affero General Public License for more details.
  *
- * You should have received a copy of the GNU Affero General Public License along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
  */
 use actix_auth_middleware::Authentication;
 use actix_web::web::ServiceConfig;
@@ -170,13 +171,12 @@
         const PASSWORD: &str = "longpassword";
         const EMAIL: &str = "templateuser@a.com";
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
+        delete_user(data, NAME).await;
 
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (data, _, signin_resp, token_key) = add_levels_util(NAME, PASSWORD).await;
+        register_and_signin(data, NAME, EMAIL, PASSWORD).await;
+        let (_, signin_resp, token_key) = add_levels_util(data, NAME, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
 
         let app = get_app!(data).await;
@@ -214,7 +214,7 @@
             assert_eq!(authenticated_resp.status(), StatusCode::OK);
         }
 
-        delete_user(NAME, &data).await;
+        delete_user(data, NAME).await;
     }
 
     #[actix_rt::test]
diff --git a/src/mcaptcha/pages/panel/mod.rs.html b/src/mcaptcha/pages/panel/mod.rs.html
index 75af3858..280d8346 100644
--- a/src/mcaptcha/pages/panel/mod.rs.html
+++ b/src/mcaptcha/pages/panel/mod.rs.html
@@ -100,6 +100,8 @@
 95
 96
 97
+98
+99
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -125,18 +127,19 @@
 mod settings;
 pub mod sitekey;
 
+use db_core::Captcha;
+
 use crate::errors::PageResult;
 use crate::AppData;
-use sitekey::list::{get_list_sitekeys, SiteKeys};
 
 #[derive(TemplateOnce, Clone)]
 #[template(path = "panel/index.html")]
 pub struct IndexPage {
-    sitekeys: SiteKeys,
+    sitekeys: Vec<Captcha>,
 }
 
 impl IndexPage {
-    fn new(sitekeys: SiteKeys) -> Self {
+    fn new(sitekeys: Vec<Captcha>) -> Self {
         IndexPage { sitekeys }
     }
 }
@@ -148,7 +151,8 @@
     wrap = "crate::pages::get_middleware()"
 )]
 async fn panel(data: AppData, id: Identity) -> PageResult<impl Responder> {
-    let sitekeys = get_list_sitekeys(&data, &id).await?;
+    let username = id.identity().unwrap();
+    let sitekeys = data.db.get_all_user_captchas(&username).await?;
     let body = IndexPage::new(sitekeys).render_once().unwrap();
     Ok(HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
diff --git a/src/mcaptcha/pages/panel/notifications.rs.html b/src/mcaptcha/pages/panel/notifications.rs.html
index acc87f83..c5834f93 100644
--- a/src/mcaptcha/pages/panel/notifications.rs.html
+++ b/src/mcaptcha/pages/panel/notifications.rs.html
@@ -155,7 +155,6 @@
 use sailfish::TemplateOnce;
 use sqlx::types::time::OffsetDateTime;
 
-use crate::api::v1::notifications::get::{self, runner};
 use crate::date::Date;
 use crate::errors::PageResult;
 use crate::AppData;
@@ -181,12 +180,12 @@
     pub id: i32,
 }
 
-impl From<get::Notification> for Notification {
-    fn from(n: get::Notification) -> Self {
+impl From<db_core::Notification> for Notification {
+    fn from(n: db_core::Notification) -> Self {
         Notification {
             name: n.name.unwrap(),
             heading: n.heading.unwrap(),
-            received: n.received.unwrap(),
+            received: OffsetDateTime::from_unix_timestamp(n.received.unwrap()),
             id: n.id.unwrap(),
             message: n.message.unwrap(),
         }
@@ -209,7 +208,8 @@
     let receiver = id.identity().unwrap();
     // TODO handle error where payload.to doesnt exist
 
-    let mut notifications = runner::get_notification(&data, &receiver).await?;
+    //    let mut notifications = runner::get_notification(&data, &receiver).await?;
+    let mut notifications = data.db.get_all_unread_notifications(&receiver).await?;
     let notifications = notifications.drain(0..).map(|x| x.into()).collect();
 
     let body = IndexPage::new(notifications).render_once().unwrap();
diff --git a/src/mcaptcha/pages/panel/settings.rs.html b/src/mcaptcha/pages/panel/settings.rs.html
index af1294ff..06219801 100644
--- a/src/mcaptcha/pages/panel/settings.rs.html
+++ b/src/mcaptcha/pages/panel/settings.rs.html
@@ -115,15 +115,6 @@
 110
 111
 112
-113
-114
-115
-116
-117
-118
-119
-120
-121
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -195,22 +186,13 @@
 async fn settings(data: AppData, id: Identity) -> PageResult<impl Responder> {
     let username = id.identity().unwrap();
 
-    struct DBResult {
-        email: Option<String>,
-        secret: String,
-    }
-
-    let details = sqlx::query_as!(
-        DBResult,
-        r#"SELECT email, secret  FROM mcaptcha_users WHERE name = ($1)"#,
-        &username,
-    )
-    .fetch_one(&data.db)
-    .await?;
+    let secret = data.db.get_secret(&username).await?;
+    let secret = secret.secret;
+    let email = data.db.get_email(&username).await?;
 
     let data = IndexPage {
-        email: details.email,
-        secret: details.secret,
+        email,
+        secret,
         username: &username,
     };
 
diff --git a/src/mcaptcha/pages/panel/sitekey/add.rs.html b/src/mcaptcha/pages/panel/sitekey/add.rs.html
index 3cc7a600..0c77db2f 100644
--- a/src/mcaptcha/pages/panel/sitekey/add.rs.html
+++ b/src/mcaptcha/pages/panel/sitekey/add.rs.html
@@ -94,21 +94,21 @@
 89
 90
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_web::{HttpResponse, Responder};
 use lazy_static::lazy_static;
diff --git a/src/mcaptcha/pages/panel/sitekey/delete.rs.html b/src/mcaptcha/pages/panel/sitekey/delete.rs.html
index dd7731ae..4f5aa4ee 100644
--- a/src/mcaptcha/pages/panel/sitekey/delete.rs.html
+++ b/src/mcaptcha/pages/panel/sitekey/delete.rs.html
@@ -42,21 +42,21 @@
 37
 38
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 use actix_web::{web, HttpResponse, Responder};
 use my_codegen::get;
diff --git a/src/mcaptcha/pages/panel/sitekey/edit.rs.html b/src/mcaptcha/pages/panel/sitekey/edit.rs.html
index 6271d84b..eea0fc43 100644
--- a/src/mcaptcha/pages/panel/sitekey/edit.rs.html
+++ b/src/mcaptcha/pages/panel/sitekey/edit.rs.html
@@ -200,86 +200,6 @@
 195
 196
 197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-242
-243
-244
-245
-246
-247
-248
-249
-250
-251
-252
-253
-254
-255
-256
-257
-258
-259
-260
-261
-262
-263
-264
-265
-266
-267
-268
-269
-270
-271
-272
-273
-274
-275
-276
-277
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -299,27 +219,17 @@
 use actix_identity::Identity;
 use actix_web::{http, web, HttpResponse, Responder};
 use sailfish::TemplateOnce;
-use sqlx::Error::RowNotFound;
 
-use crate::api::v1::mcaptcha::easy::TrafficPattern;
+use db_core::errors::DBError;
+use db_core::Captcha;
+use libmcaptcha::defense::Level;
+
+use crate::api::v1::mcaptcha::easy::TrafficPatternRequest;
 use crate::errors::*;
 use crate::AppData;
 
 const PAGE: &str = "Edit Sitekey";
 
-#[derive(Clone)]
-struct McaptchaConfig {
-    config_id: i32,
-    duration: i32,
-    name: String,
-}
-
-#[derive(Clone)]
-struct Level {
-    difficulty_factor: i32,
-    visitor_threshold: i32,
-}
-
 #[derive(TemplateOnce, Clone)]
 #[template(path = "panel/sitekey/edit/advance.html")]
 struct AdvanceEditPage {
@@ -330,10 +240,10 @@
 }
 
 impl AdvanceEditPage {
-    fn new(config: McaptchaConfig, levels: Vec<Level>, key: String) -> Self {
+    fn new(config: Captcha, levels: Vec<Level>, key: String) -> Self {
         AdvanceEditPage {
             duration: config.duration as u32,
-            name: config.name,
+            name: config.description,
             levels,
             key,
         }
@@ -353,28 +263,8 @@
     let username = id.identity().unwrap();
     let key = path.into_inner();
 
-    let config = sqlx::query_as!(
-        McaptchaConfig,
-        "SELECT config_id, duration, name from mcaptcha_config WHERE
-        key = $1 AND
-        user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2) ",
-        &key,
-        &username,
-    )
-    .fetch_one(&data.db)
-    .await?;
-
-    let levels = sqlx::query_as!(
-        Level,
-        "SELECT 
-            difficulty_factor, visitor_threshold 
-        FROM 
-            mcaptcha_levels 
-        WHERE config_id = $1 ORDER BY difficulty_factor ASC",
-        &config.config_id
-    )
-    .fetch_all(&data.db)
-    .await?;
+    let config = data.db.get_captcha_config(&username, &key).await?;
+    let levels = data.db.get_captcha_levels(Some(&username), &key).await?;
 
     let body = AdvanceEditPage::new(config, levels, key)
         .render_once()
@@ -388,12 +278,12 @@
 #[template(path = "panel/sitekey/edit/easy/index.html")]
 pub struct EasyEditPage<'a> {
     pub form_title: &'a str,
-    pub pattern: TrafficPattern,
+    pub pattern: TrafficPatternRequest,
     pub key: String,
 }
 
 impl<'a> EasyEditPage<'a> {
-    pub fn new(key: String, pattern: TrafficPattern) -> Self {
+    pub fn new(key: String, pattern: TrafficPatternRequest) -> Self {
         Self {
             form_title: PAGE,
             pattern,
@@ -415,65 +305,14 @@
     let username = id.identity().unwrap();
     let key = path.into_inner();
 
-    struct Traffic {
-        peak_sustainable_traffic: i32,
-        avg_traffic: i32,
-        broke_my_site_traffic: Option<i32>,
-    }
-
-    match sqlx::query_as!(
-        Traffic,
-        "SELECT 
-          avg_traffic, 
-          peak_sustainable_traffic, 
-          broke_my_site_traffic 
-        FROM 
-          mcaptcha_sitekey_user_provided_avg_traffic 
-        WHERE 
-          config_id = (
-            SELECT 
-              config_id 
-            FROM 
-              mcaptcha_config 
-            WHERE 
-              KEY = $1 
-              AND user_id = (
-                SELECT 
-                  id 
-                FROM 
-                  mcaptcha_users 
-                WHERE 
-                  NAME = $2
-              )
-          )
-        ",
-        &key,
-        &username
-    )
-    .fetch_one(&data.db)
-    .await
-    {
+    match data.db.get_traffic_pattern(&username, &key).await {
         Ok(c) => {
-            struct Description {
-                name: String,
-            }
-            let description = sqlx::query_as!(
-                Description,
-                "SELECT name FROM mcaptcha_config 
-                WHERE key = $1 
-                AND user_id = (
-                    SELECT user_id FROM mcaptcha_users WHERE NAME = $2)",
-                &key,
-                &username
-            )
-            .fetch_one(&data.db)
-            .await?;
-
-            let pattern = TrafficPattern {
+            let config = data.db.get_captcha_config(&username, &key).await?;
+            let pattern = TrafficPatternRequest {
                 peak_sustainable_traffic: c.peak_sustainable_traffic as u32,
                 avg_traffic: c.avg_traffic as u32,
                 broke_my_site_traffic: c.broke_my_site_traffic.map(|n| n as u32),
-                description: description.name,
+                description: config.description,
             };
 
             let page = EasyEditPage::new(key, pattern).render_once().unwrap();
@@ -481,7 +320,7 @@
                 .content_type("text/html; charset=utf-8")
                 .body(page));
         }
-        Err(RowNotFound) => {
+        Err(DBError::TrafficPatternNotFound) => {
             return Ok(HttpResponse::Found()
                 .insert_header((
                     http::header::LOCATION,
@@ -489,7 +328,10 @@
                 ))
                 .finish());
         }
-        Err(e) => Err(e.into()),
+        Err(e) => {
+            let e: ServiceError = e.into();
+            Err(e.into())
+        }
     }
 }
 
@@ -507,14 +349,12 @@
         const NAME: &str = "editsitekeyuser";
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "editsitekeyuser@a.com";
+        let data = get_data().await;
+        let data = &data;
+        delete_user(data, NAME).await;
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
-
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (data, _, signin_resp, key) = add_levels_util(NAME, PASSWORD).await;
+        register_and_signin(data, NAME, EMAIL, PASSWORD).await;
+        let (_, signin_resp, key) = add_levels_util(data, NAME, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
 
         let app = get_app!(data).await;
diff --git a/src/mcaptcha/pages/panel/sitekey/list.rs.html b/src/mcaptcha/pages/panel/sitekey/list.rs.html
index a006039e..4c4dc0ed 100644
--- a/src/mcaptcha/pages/panel/sitekey/list.rs.html
+++ b/src/mcaptcha/pages/panel/sitekey/list.rs.html
@@ -108,21 +108,6 @@
 103
 104
 105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -144,20 +129,21 @@
 use actix_web::{HttpResponse, Responder};
 use sailfish::TemplateOnce;
 
-use crate::api::v1::mcaptcha::create::MCaptchaDetails;
+use db_core::Captcha;
+
 use crate::errors::*;
 use crate::AppData;
 
 #[derive(TemplateOnce, Clone)]
 #[template(path = "panel/sitekey/list/index.html")]
 pub struct IndexPage {
-    sitekeys: SiteKeys,
+    sitekeys: Vec<Captcha>,
 }
 
 const PAGE: &str = "SiteKeys";
 
 impl IndexPage {
-    fn new(sitekeys: SiteKeys) -> Self {
+    fn new(sitekeys: Vec<Captcha>) -> Self {
         IndexPage { sitekeys }
     }
 }
@@ -168,29 +154,14 @@
     wrap = "crate::pages::get_middleware()"
 )]
 pub async fn list_sitekeys(data: AppData, id: Identity) -> PageResult<impl Responder> {
-    let res = get_list_sitekeys(&data, &id).await?;
+    let username = id.identity().unwrap();
+    let res = data.db.get_all_user_captchas(&username).await?;
     let body = IndexPage::new(res).render_once().unwrap();
     Ok(HttpResponse::Ok()
         .content_type("text/html; charset=utf-8")
         .body(body))
 }
 
-/// utility function to get a list of all sitekeys that a user owns
-pub async fn get_list_sitekeys(data: &AppData, id: &Identity) -> PageResult<SiteKeys> {
-    let username = id.identity().unwrap();
-    let res = sqlx::query_as!(
-        MCaptchaDetails,
-        "SELECT key, name from mcaptcha_config WHERE
-        user_id = (SELECT ID FROM mcaptcha_users WHERE name = $1) ",
-        &username,
-    )
-    .fetch_all(&data.db)
-    .await?;
-    Ok(res)
-}
-
-pub type SiteKeys = Vec<MCaptchaDetails>;
-
 #[cfg(test)]
 mod test {
     use actix_web::http::StatusCode;
@@ -206,13 +177,12 @@
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "listsitekeyuser@a.com";
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
+        delete_user(data, NAME).await;
 
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (data, _, signin_resp, key) = add_levels_util(NAME, PASSWORD).await;
+        register_and_signin(data, NAME, EMAIL, PASSWORD).await;
+        let (_, signin_resp, key) = add_levels_util(data, NAME, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
 
         let app = get_app!(data).await;
diff --git a/src/mcaptcha/pages/panel/sitekey/mod.rs.html b/src/mcaptcha/pages/panel/sitekey/mod.rs.html
index 8886a610..3905c668 100644
--- a/src/mcaptcha/pages/panel/sitekey/mod.rs.html
+++ b/src/mcaptcha/pages/panel/sitekey/mod.rs.html
@@ -103,21 +103,21 @@
 98
 99
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 
 mod add;
 mod delete;
diff --git a/src/mcaptcha/pages/panel/sitekey/view.rs.html b/src/mcaptcha/pages/panel/sitekey/view.rs.html
index 10a3ef06..eb910396 100644
--- a/src/mcaptcha/pages/panel/sitekey/view.rs.html
+++ b/src/mcaptcha/pages/panel/sitekey/view.rs.html
@@ -133,39 +133,6 @@
 128
 129
 130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -185,27 +152,17 @@
 
 use actix_identity::Identity;
 use actix_web::{web, HttpResponse, Responder};
-use futures::{future::TryFutureExt, try_join};
 use sailfish::TemplateOnce;
 
+use db_core::Captcha;
+use libmcaptcha::defense::Level;
+
 use crate::errors::*;
-use crate::stats::fetch::Stats;
+use crate::stats::CaptchaStats;
 use crate::AppData;
 
 const PAGE: &str = "SiteKeys";
 
-#[derive(Clone)]
-struct McaptchaConfig {
-    config_id: i32,
-    duration: i32,
-    name: String,
-}
-
-#[derive(Clone)]
-struct Level {
-    difficulty_factor: i32,
-    visitor_threshold: i32,
-}
 #[derive(TemplateOnce, Clone)]
 #[template(path = "panel/sitekey/view/index.html")]
 struct IndexPage {
@@ -213,19 +170,19 @@
     name: String,
     key: String,
     levels: Vec<Level>,
-    stats: Stats,
+    stats: CaptchaStats,
 }
 
 impl IndexPage {
     fn new(
-        stats: Stats,
-        config: McaptchaConfig,
+        stats: CaptchaStats,
+        config: Captcha,
         levels: Vec<Level>,
         key: String,
     ) -> Self {
         IndexPage {
             duration: config.duration as u32,
-            name: config.name,
+            name: config.description,
             levels,
             key,
             stats,
@@ -245,31 +202,9 @@
 ) -> PageResult<impl Responder> {
     let username = id.identity().unwrap();
     let key = path.into_inner();
-
-    let config = sqlx::query_as!(
-        McaptchaConfig,
-        "SELECT config_id, duration, name from mcaptcha_config WHERE
-        key = $1 AND
-        user_id = (SELECT ID FROM mcaptcha_users WHERE name = $2) ",
-        &key,
-        &username,
-    )
-    .fetch_one(&data.db)
-    .await?;
-
-    let levels_fut = sqlx::query_as!(
-        Level,
-        "SELECT 
-            difficulty_factor, visitor_threshold 
-        FROM 
-            mcaptcha_levels 
-        WHERE config_id = $1 ORDER BY difficulty_factor ASC",
-        &config.config_id
-    )
-    .fetch_all(&data.db)
-    .err_into();
-
-    let (stats, levels) = try_join!(Stats::new(&username, &key, &data.db), levels_fut)?;
+    let config = data.db.get_captcha_config(&username, &key).await?;
+    let levels = data.db.get_captcha_levels(Some(&username), &key).await?;
+    let stats = data.stats.fetch(&data, &username, &key).await?;
 
     let body = IndexPage::new(stats, config, levels, key)
         .render_once()
@@ -294,13 +229,12 @@
         const PASSWORD: &str = "longpassworddomain";
         const EMAIL: &str = "viewsitekeyuser@a.com";
 
-        {
-            let data = Data::new().await;
-            delete_user(NAME, &data).await;
-        }
+        let data = get_data().await;
+        let data = &data;
+        delete_user(data, NAME).await;
 
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (data, _, signin_resp, key) = add_levels_util(NAME, PASSWORD).await;
+        register_and_signin(data, NAME, EMAIL, PASSWORD).await;
+        let (_, signin_resp, key) = add_levels_util(data, NAME, PASSWORD).await;
         let cookies = get_cookie!(signin_resp);
 
         let app = get_app!(data).await;
diff --git a/src/mcaptcha/pages/routes.rs.html b/src/mcaptcha/pages/routes.rs.html
index ca7872db..d536e277 100644
--- a/src/mcaptcha/pages/routes.rs.html
+++ b/src/mcaptcha/pages/routes.rs.html
@@ -81,21 +81,21 @@
 76
 77
 
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
 use actix_auth_middleware::GetLoginRoute;
 
 use super::auth::routes::Auth;
diff --git a/src/mcaptcha/settings.rs.html b/src/mcaptcha/settings.rs.html
index f277c565..35e596b4 100644
--- a/src/mcaptcha/settings.rs.html
+++ b/src/mcaptcha/settings.rs.html
@@ -244,6 +244,7 @@
 239
 240
 241
+242
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -282,6 +283,7 @@
 pub struct Captcha {
     pub salt: String,
     pub gc: u64,
+    pub enable_stats: bool,
     pub default_difficulty_strategy: DefaultDifficultyStrategy,
 }
 
@@ -367,10 +369,12 @@
     pub fn new() -> Result<Self, ConfigError> {
         let mut s = Config::new();
 
-
         const CURRENT_DIR: &str = "./config/default.toml";
         const ETC: &str = "/etc/mcaptcha/config.toml";
 
+        s.set("capatcha.enable_stats", true.to_string())
+            .expect("unable to set capatcha.enable_stats default config");
+
         if let Ok(path) = env::var("MCAPTCHA_CONFIG") {
             s.merge(File::with_name(&path))?;
         } else if Path::new(CURRENT_DIR).exists() {
@@ -409,8 +413,6 @@
         s.set("database.pool", 2.to_string())
             .expect("Couldn't set database pool count");
 
-
-
         match s.try_into() {
             Ok(val) => Ok(val),
             Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://github.com/mCaptcha/mcaptcha#configuration to learn more about how mcaptcha reads configuration\n\n", e))),
diff --git a/src/mcaptcha/static_assets/static_files.rs.html b/src/mcaptcha/static_assets/static_files.rs.html
index c5fb616d..60c840be 100644
--- a/src/mcaptcha/static_assets/static_files.rs.html
+++ b/src/mcaptcha/static_assets/static_files.rs.html
@@ -171,44 +171,6 @@
 166
 167
 168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
 
/*
  * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
  *
@@ -311,7 +273,6 @@
     }
 }
 
-
 #[get("/assets/{_:.*}")]
 pub async fn static_files(path: web::Path<String>) -> impl Responder {
     handle_assets(&path)
@@ -342,7 +303,6 @@
     }
 }
 
-
 #[get("/{file}")]
 pub async fn favicons(path: web::Path<String>) -> impl Responder {
     debug!("searching favicons");
@@ -354,65 +314,29 @@
     use actix_web::http::StatusCode;
     use actix_web::test;
 
-    use super::*;
     use crate::*;
 
     #[actix_rt::test]
     async fn static_assets_work() {
         let app = get_app!().await;
 
-        let resp = test::call_service(
-            &app,
-            test::TestRequest::get().uri(*crate::JS).to_request(),
-        )
-        .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        let urls = [
+            *crate::JS,
+            *crate::VERIFICATIN_WIDGET_JS,
+            *crate::VERIFICATIN_WIDGET_CSS,
+            crate::FILES
+                .get("./static/cache/img/icon-trans.png")
+                .unwrap(),
+            "/favicon.ico",
+        ];
 
-        let resp = test::call_service(
-            &app,
-            test::TestRequest::get()
-                .uri(*crate::VERIFICATIN_WIDGET_JS)
-                .to_request(),
-        )
-        .await;
-        assert_eq!(resp.status(), StatusCode::OK);
-
-        let resp = test::call_service(
-            &app,
-            test::TestRequest::get()
-                .uri(*crate::VERIFICATIN_WIDGET_CSS)
-                .to_request(),
-        )
-        .await;
-        assert_eq!(resp.status(), StatusCode::OK);
-
-        let resp = test::call_service(
-            &app,
-            test::TestRequest::get()
-                .uri(
-                    crate::FILES
-                        .get("./static/cache/img/icon-trans.png")
-                        .unwrap(),
-                )
-                .to_request(),
-        )
-        .await;
-        assert_eq!(resp.status(), StatusCode::OK);
-    }
-
-    #[actix_rt::test]
-    async fn favicons_work() {
-        assert!(Favicons::get("favicon.ico").is_some());
-
-        //let app = test::init_service(App::new().configure(services)).await;
-        let app = get_app!().await;
-
-        let resp = test::call_service(
-            &app,
-            test::TestRequest::get().uri("/favicon.ico").to_request(),
-        )
-        .await;
-        assert_eq!(resp.status(), StatusCode::OK);
+        for u in urls.iter() {
+            println!("[*] Testing static asset at URL: {u}");
+            let resp =
+                test::call_service(&app, test::TestRequest::get().uri(u).to_request())
+                    .await;
+            assert_eq!(resp.status(), StatusCode::OK);
+        }
     }
 }
 
diff --git a/src/mcaptcha/stats.rs.html b/src/mcaptcha/stats.rs.html new file mode 100644 index 00000000..0f9acbd6 --- /dev/null +++ b/src/mcaptcha/stats.rs.html @@ -0,0 +1,268 @@ +stats.rs - source + +
1
+2
+3
+4
+5
+6
+7
+8
+9
+10
+11
+12
+13
+14
+15
+16
+17
+18
+19
+20
+21
+22
+23
+24
+25
+26
+27
+28
+29
+30
+31
+32
+33
+34
+35
+36
+37
+38
+39
+40
+41
+42
+43
+44
+45
+46
+47
+48
+49
+50
+51
+52
+53
+54
+55
+56
+57
+58
+59
+60
+61
+62
+63
+64
+65
+66
+67
+68
+69
+70
+71
+72
+73
+74
+75
+76
+77
+78
+79
+80
+81
+82
+83
+84
+85
+86
+87
+88
+89
+90
+91
+92
+93
+94
+95
+96
+97
+98
+99
+100
+101
+102
+103
+104
+105
+106
+107
+108
+109
+110
+111
+112
+113
+114
+115
+116
+117
+118
+119
+120
+121
+122
+123
+124
+125
+126
+127
+128
+129
+130
+
/*
+ * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+use async_trait::async_trait;
+use db_core::errors::DBResult;
+use serde::{Deserialize, Serialize};
+
+use crate::data::Data;
+
+#[async_trait]
+pub trait Stats: std::marker::Send + std::marker::Sync + CloneStats {
+    /// record PoWConfig fetches
+    async fn record_fetch(&self, d: &Data, key: &str) -> DBResult<()>;
+
+    /// record PoWConfig solves
+    async fn record_solve(&self, d: &Data, key: &str) -> DBResult<()>;
+
+    /// record PoWConfig confirms
+    async fn record_confirm(&self, d: &Data, key: &str) -> DBResult<()>;
+
+    /// fetch stats
+    async fn fetch(&self, d: &Data, user: &str, key: &str) -> DBResult<CaptchaStats>;
+}
+
+/// Trait to clone MCDatabase
+pub trait CloneStats {
+    /// clone DB
+    fn clone_stats(&self) -> Box<dyn Stats>;
+}
+
+impl<T> CloneStats for T
+where
+    T: Stats + Clone + 'static,
+{
+    fn clone_stats(&self) -> Box<dyn Stats> {
+        Box::new(self.clone())
+    }
+}
+
+//impl Clone for Box<dyn CloneStats> {
+//    fn clone(&self) -> Self {
+//        Box::clone(self)
+//        //(*self).clone_stats()
+//    }
+//}
+
+#[derive(Debug, Default, PartialEq, Clone, Deserialize, Serialize)]
+pub struct CaptchaStats {
+    pub config_fetches: Vec<i64>,
+    pub solves: Vec<i64>,
+    pub confirms: Vec<i64>,
+}
+
+#[derive(Clone, Default, PartialEq, Debug)]
+pub struct Real;
+
+#[async_trait]
+impl Stats for Real {
+    /// record PoWConfig fetches
+    async fn record_fetch(&self, d: &Data, key: &str) -> DBResult<()> {
+        d.db.record_fetch(key).await
+    }
+
+    /// record PoWConfig solves
+    async fn record_solve(&self, d: &Data, key: &str) -> DBResult<()> {
+        d.db.record_solve(key).await
+    }
+
+    /// record PoWConfig confirms
+    async fn record_confirm(&self, d: &Data, key: &str) -> DBResult<()> {
+        d.db.record_confirm(key).await
+    }
+
+    /// fetch stats
+    async fn fetch(&self, d: &Data, user: &str, key: &str) -> DBResult<CaptchaStats> {
+        let config_fetches_fut = d.db.fetch_config_fetched(user, key);
+        let solves_fut = d.db.fetch_solve(user, key);
+        let confirms_fut = d.db.fetch_confirm(user, key);
+
+        let (config_fetches, solves, confirms) =
+            futures::try_join!(config_fetches_fut, solves_fut, confirms_fut)?;
+
+        let res = CaptchaStats {
+            config_fetches,
+            solves,
+            confirms,
+        };
+
+        Ok(res)
+    }
+}
+
+#[derive(Clone, Default, PartialEq, Debug)]
+pub struct Dummy;
+
+#[async_trait]
+impl Stats for Dummy {
+    /// record PoWConfig fetches
+    async fn record_fetch(&self, _: &Data, _: &str) -> DBResult<()> {
+        Ok(())
+    }
+
+    /// record PoWConfig solves
+    async fn record_solve(&self, _: &Data, _: &str) -> DBResult<()> {
+        Ok(())
+    }
+
+    /// record PoWConfig confirms
+    async fn record_confirm(&self, _: &Data, _: &str) -> DBResult<()> {
+        Ok(())
+    }
+
+    /// fetch stats
+    async fn fetch(&self, _: &Data, _: &str, _: &str) -> DBResult<CaptchaStats> {
+        Ok(CaptchaStats::default())
+    }
+}
+
+
+ \ No newline at end of file diff --git a/src/mcaptcha/stats/fetch.rs.html b/src/mcaptcha/stats/fetch.rs.html deleted file mode 100644 index f1fb3547..00000000 --- a/src/mcaptcha/stats/fetch.rs.html +++ /dev/null @@ -1,446 +0,0 @@ -fetch.rs - source - -
1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
-95
-96
-97
-98
-99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-
/*
- * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <https://www.gnu.org/licenses/>.
- */
-use serde::{Deserialize, Serialize};
-use sqlx::PgPool;
-
-use crate::date::Date;
-use crate::errors::*;
-
-#[derive(Debug, Clone, Deserialize, Serialize)]
-pub struct StatsUnixTimestamp {
-    pub config_fetches: Vec<i64>,
-    pub solves: Vec<i64>,
-    pub confirms: Vec<i64>,
-}
-
-#[derive(Debug, Clone)]
-pub struct Stats {
-    pub config_fetches: Vec<Date>,
-    pub solves: Vec<Date>,
-    pub confirms: Vec<Date>,
-}
-
-#[derive(Debug, Clone, Deserialize, Serialize)]
-pub struct StatsPayload {
-    pub key: String,
-}
-
-impl Stats {
-    pub async fn new(user: &str, key: &str, db: &PgPool) -> ServiceResult<Self> {
-        let config_fetches_fut = runners::fetch_config_fetched(user, key, db);
-        let solves_fut = runners::fetch_solve(user, key, db);
-        let confirms_fut = runners::fetch_confirm(user, key, db);
-
-        let (config_fetches, solves, confirms) =
-            futures::try_join!(config_fetches_fut, solves_fut, confirms_fut)?;
-
-        let res = Self {
-            config_fetches,
-            solves,
-            confirms,
-        };
-
-        Ok(res)
-    }
-}
-
-impl StatsUnixTimestamp {
-    pub fn from_stats(stats: &Stats) -> Self {
-        let config_fetches = Self::unix_timestamp(&stats.config_fetches);
-        let solves = Self::unix_timestamp(&stats.solves);
-        let confirms = Self::unix_timestamp(&stats.confirms);
-        Self {
-            config_fetches,
-            solves,
-            confirms,
-        }
-    }
-
-    /// featch PoWConfig confirms
-    #[inline]
-    fn unix_timestamp(dates: &[Date]) -> Vec<i64> {
-        let mut res: Vec<i64> = Vec::with_capacity(dates.len());
-
-        dates
-            .iter()
-            .for_each(|record| res.push(record.time.unix_timestamp()));
-
-        res
-    }
-}
-
-pub mod runners {
-    use super::*;
-    /// featch PoWConfig fetches
-    #[inline]
-    pub async fn fetch_config_fetched(
-        user: &str,
-        key: &str,
-        db: &PgPool,
-    ) -> ServiceResult<Vec<Date>> {
-        let records = sqlx::query_as!(
-            Date,
-            "SELECT time FROM mcaptcha_pow_fetched_stats
-            WHERE 
-                config_id = (
-                    SELECT 
-                        config_id FROM mcaptcha_config 
-                    WHERE 
-                        key = $1
-                    AND
-                        user_id = (
-                        SELECT 
-                            ID FROM mcaptcha_users WHERE name = $2))
-                ORDER BY time DESC",
-            &key,
-            &user,
-        )
-        .fetch_all(db)
-        .await?;
-
-        Ok(records)
-    }
-
-    /// featch PoWConfig solves
-    #[inline]
-    pub async fn fetch_solve(
-        user: &str,
-        key: &str,
-        db: &PgPool,
-    ) -> ServiceResult<Vec<Date>> {
-        let records = sqlx::query_as!(
-            Date,
-            "SELECT time FROM mcaptcha_pow_solved_stats 
-            WHERE config_id = (
-                SELECT config_id FROM mcaptcha_config 
-                WHERE 
-                    key = $1
-                AND
-                     user_id = (
-                        SELECT 
-                            ID FROM mcaptcha_users WHERE name = $2)) 
-                ORDER BY time DESC",
-            &key,
-            &user
-        )
-        .fetch_all(db)
-        .await?;
-
-        Ok(records)
-    }
-
-    /// featch PoWConfig confirms
-    #[inline]
-    pub async fn fetch_confirm(
-        user: &str,
-        key: &str,
-        db: &PgPool,
-    ) -> ServiceResult<Vec<Date>> {
-        let records = sqlx::query_as!(
-            Date,
-            "SELECT time FROM mcaptcha_pow_confirmed_stats 
-            WHERE 
-                config_id = (
-                    SELECT config_id FROM mcaptcha_config 
-                WHERE 
-                    key = $1
-                AND
-                     user_id = (
-                        SELECT 
-                            ID FROM mcaptcha_users WHERE name = $2))
-                ORDER BY time DESC",
-            &key,
-            &user
-        )
-        .fetch_all(db)
-        .await?;
-
-        Ok(records)
-    }
-}
-
-#[cfg(test)]
-mod tests {
-    use super::*;
-    use crate::stats::record::*;
-    use crate::tests::*;
-    use crate::*;
-
-    #[actix_rt::test]
-    async fn stats_works() {
-        const NAME: &str = "statsuser";
-        const PASSWORD: &str = "testingpas";
-        const EMAIL: &str = "statsuser@a.com";
-
-        let data = Data::new().await;
-        delete_user(NAME, &data).await;
-
-        register_and_signin(NAME, EMAIL, PASSWORD).await;
-        let (_, _, _, token_key) = add_levels_util(NAME, PASSWORD).await;
-        let key = token_key.key.clone();
-
-        let stats = Stats::new(NAME, &key, &data.db).await.unwrap();
-
-        assert_eq!(stats.config_fetches.len(), 0);
-        assert_eq!(stats.solves.len(), 0);
-        assert_eq!(stats.confirms.len(), 0);
-
-        futures::join!(
-            record_fetch(&key, &data.db),
-            record_solve(&key, &data.db),
-            record_confirm(&key, &data.db)
-        );
-
-        let stats = Stats::new(NAME, &key, &data.db).await.unwrap();
-
-        assert_eq!(stats.config_fetches.len(), 1);
-        assert_eq!(stats.solves.len(), 1);
-        assert_eq!(stats.confirms.len(), 1);
-
-        let ustats = StatsUnixTimestamp::from_stats(&stats);
-        assert_eq!(ustats.config_fetches.len(), 1);
-        assert_eq!(ustats.solves.len(), 1);
-        assert_eq!(ustats.confirms.len(), 1);
-    }
-}
-
-
- \ No newline at end of file diff --git a/src/mcaptcha/stats/mod.rs.html b/src/mcaptcha/stats/mod.rs.html deleted file mode 100644 index c702de80..00000000 --- a/src/mcaptcha/stats/mod.rs.html +++ /dev/null @@ -1,46 +0,0 @@ -mod.rs - source - -
1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-
/*
- * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <https://www.gnu.org/licenses/>.
- */
-
-pub mod fetch;
-pub mod record;
-
-
- \ No newline at end of file diff --git a/src/mcaptcha/stats/record.rs.html b/src/mcaptcha/stats/record.rs.html deleted file mode 100644 index 9d6d0589..00000000 --- a/src/mcaptcha/stats/record.rs.html +++ /dev/null @@ -1,130 +0,0 @@ -record.rs - source - -
1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-
/*
-* Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
-*
-* This program is free software: you can redistribute it and/or modify
-* it under the terms of the GNU Affero General Public License as
-* published by the Free Software Foundation, either version 3 of the
-* License, or (at your option) any later version.
-*
-* This program is distributed in the hope that it will be useful,
-* but WITHOUT ANY WARRANTY; without even the implied warranty of
-* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
-* GNU Affero General Public License for more details.
-*
-* You should have received a copy of the GNU Affero General Public License
-* along with this program.  If not, see <https://www.gnu.org/licenses/>.
-*/
-
-use sqlx::types::time::OffsetDateTime;
-use sqlx::PgPool;
-
-/// record PoWConfig fetches
-#[inline]
-pub async fn record_fetch(key: &str, db: &PgPool) {
-    let now = OffsetDateTime::now_utc();
-    let _ = sqlx::query!(
-        "INSERT INTO mcaptcha_pow_fetched_stats 
-        (config_id, time) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1), $2)",
-        &key,
-        &now,
-    )
-    .execute(db)
-    .await;
-}
-
-/// record PoWConfig solves
-#[inline]
-pub async fn record_solve(key: &str, db: &PgPool) {
-    let now = OffsetDateTime::now_utc();
-    let _ = sqlx::query!(
-        "INSERT INTO mcaptcha_pow_solved_stats 
-        (config_id, time) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1), $2)",
-        &key,
-        &now,
-    )
-    .execute(db)
-    .await;
-}
-
-/// record PoWConfig confirms
-#[inline]
-pub async fn record_confirm(key: &str, db: &PgPool) {
-    let now = OffsetDateTime::now_utc();
-    let _ = sqlx::query!(
-        "INSERT INTO mcaptcha_pow_confirmed_stats 
-        (config_id, time) VALUES ((SELECT config_id FROM mcaptcha_config WHERE key = $1), $2)",
-        &key,
-        &now
-    )
-    .execute(db)
-    .await;
-}
-
-
- \ No newline at end of file diff --git a/src/tests_migrate/settings.rs.html b/src/tests_migrate/settings.rs.html deleted file mode 100644 index 35ef2cb9..00000000 --- a/src/tests_migrate/settings.rs.html +++ /dev/null @@ -1,490 +0,0 @@ -settings.rs - source - -
1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-86
-87
-88
-89
-90
-91
-92
-93
-94
-95
-96
-97
-98
-99
-100
-101
-102
-103
-104
-105
-106
-107
-108
-109
-110
-111
-112
-113
-114
-115
-116
-117
-118
-119
-120
-121
-122
-123
-124
-125
-126
-127
-128
-129
-130
-131
-132
-133
-134
-135
-136
-137
-138
-139
-140
-141
-142
-143
-144
-145
-146
-147
-148
-149
-150
-151
-152
-153
-154
-155
-156
-157
-158
-159
-160
-161
-162
-163
-164
-165
-166
-167
-168
-169
-170
-171
-172
-173
-174
-175
-176
-177
-178
-179
-180
-181
-182
-183
-184
-185
-186
-187
-188
-189
-190
-191
-192
-193
-194
-195
-196
-197
-198
-199
-200
-201
-202
-203
-204
-205
-206
-207
-208
-209
-210
-211
-212
-213
-214
-215
-216
-217
-218
-219
-220
-221
-222
-223
-224
-225
-226
-227
-228
-229
-230
-231
-232
-233
-234
-235
-236
-237
-238
-239
-240
-241
-
/*
- * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <https://www.gnu.org/licenses/>.
- */
-use std::env;
-use std::path::Path;
-
-use config::{Config, ConfigError, Environment, File};
-use log::{debug, warn};
-use serde::Deserialize;
-use url::Url;
-
-#[derive(Debug, Clone, Deserialize)]
-pub struct Server {
-    pub port: u32,
-    pub domain: String,
-    pub cookie_secret: String,
-    pub ip: String,
-    pub url_prefix: Option<String>,
-    pub proxy_has_tls: bool,
-}
-
-#[derive(Debug, Clone, Deserialize)]
-pub struct Captcha {
-    pub salt: String,
-    pub gc: u64,
-    pub default_difficulty_strategy: DefaultDifficultyStrategy,
-}
-
-#[derive(Debug, Clone, Deserialize)]
-pub struct DefaultDifficultyStrategy {
-    pub avg_traffic_difficulty: u32,
-    pub broke_my_site_traffic_difficulty: u32,
-    pub peak_sustainable_traffic_difficulty: u32,
-    pub duration: u32,
-}
-
-#[derive(Debug, Clone, Deserialize)]
-pub struct Smtp {
-    pub from: String,
-    pub reply: String,
-    pub url: String,
-    pub username: String,
-    pub password: String,
-    pub port: u16,
-}
-
-impl Server {
-    #[cfg(not(tarpaulin_include))]
-    pub fn get_ip(&self) -> String {
-        format!("{}:{}", self.ip, self.port)
-    }
-}
-
-#[derive(Debug, Clone, Deserialize)]
-struct DatabaseBuilder {
-    pub port: u32,
-    pub hostname: String,
-    pub username: String,
-    pub password: String,
-    pub name: String,
-}
-
-impl DatabaseBuilder {
-    #[cfg(not(tarpaulin_include))]
-    fn extract_database_url(url: &Url) -> Self {
-        debug!("Databse name: {}", url.path());
-        let mut path = url.path().split('/');
-        path.next();
-        let name = path.next().expect("no database name").to_string();
-        DatabaseBuilder {
-            port: url.port().expect("Enter database port").into(),
-            hostname: url.host().expect("Enter database host").to_string(),
-            username: url.username().into(),
-            password: url.password().expect("Enter database password").into(),
-            name,
-        }
-    }
-}
-
-#[derive(Debug, Clone, Deserialize)]
-pub struct Database {
-    pub url: String,
-    pub pool: u32,
-}
-
-#[derive(Debug, Clone, Deserialize)]
-pub struct Redis {
-    pub url: String,
-    pub pool: u32,
-}
-
-#[derive(Debug, Clone, Deserialize)]
-pub struct Settings {
-    pub debug: bool,
-    pub commercial: bool,
-    pub database: Database,
-    pub redis: Option<Redis>,
-    pub server: Server,
-    pub captcha: Captcha,
-    pub source_code: String,
-    pub smtp: Option<Smtp>,
-    pub allow_registration: bool,
-    pub allow_demo: bool,
-}
-
-#[cfg(not(tarpaulin_include))]
-impl Settings {
-    pub fn new() -> Result<Self, ConfigError> {
-        let mut s = Config::new();
-
-
-        const CURRENT_DIR: &str = "./config/default.toml";
-        const ETC: &str = "/etc/mcaptcha/config.toml";
-
-        if let Ok(path) = env::var("MCAPTCHA_CONFIG") {
-            s.merge(File::with_name(&path))?;
-        } else if Path::new(CURRENT_DIR).exists() {
-            // merging default config from file
-            s.merge(File::with_name(CURRENT_DIR))?;
-        } else if Path::new(ETC).exists() {
-            s.merge(File::with_name(ETC))?;
-        } else {
-            log::warn!("configuration file not found");
-        }
-
-        s.merge(Environment::with_prefix("MCAPTCHA").separator("_"))?;
-
-        check_url(&s);
-
-        match env::var("PORT") {
-            Ok(val) => {
-                s.set("server.port", val).unwrap();
-            }
-            Err(e) => warn!("couldn't interpret PORT: {}", e),
-        }
-
-        match env::var("DATABASE_URL") {
-            Ok(val) => {
-                let url = Url::parse(&val).expect("couldn't parse Database URL");
-                let database_conf = DatabaseBuilder::extract_database_url(&url);
-                set_from_database_url(&mut s, &database_conf);
-            }
-            Err(e) => warn!("couldn't interpret DATABASE_URL: {}", e),
-        }
-
-        set_database_url(&mut s);
-
-        // setting default values
-        #[cfg(test)]
-        s.set("database.pool", 2.to_string())
-            .expect("Couldn't set database pool count");
-
-
-
-        match s.try_into() {
-            Ok(val) => Ok(val),
-            Err(e) => Err(ConfigError::Message(format!("\n\nError: {}. If it says missing fields, then please refer to https://github.com/mCaptcha/mcaptcha#configuration to learn more about how mcaptcha reads configuration\n\n", e))),
-        }
-    }
-}
-
-#[cfg(not(tarpaulin_include))]
-fn check_url(s: &Config) {
-    let url = s
-        .get::<String>("source_code")
-        .expect("Couldn't access source_code");
-
-    Url::parse(&url).expect("Please enter a URL for source_code in settings");
-}
-
-#[cfg(not(tarpaulin_include))]
-fn set_from_database_url(s: &mut Config, database_conf: &DatabaseBuilder) {
-    s.set("database.username", database_conf.username.clone())
-        .expect("Couldn't set database username");
-    s.set("database.password", database_conf.password.clone())
-        .expect("Couldn't access database password");
-    s.set("database.hostname", database_conf.hostname.clone())
-        .expect("Couldn't access database hostname");
-    s.set("database.port", database_conf.port as i64)
-        .expect("Couldn't access database port");
-    s.set("database.name", database_conf.name.clone())
-        .expect("Couldn't access database name");
-}
-
-#[cfg(not(tarpaulin_include))]
-fn set_database_url(s: &mut Config) {
-    s.set(
-        "database.url",
-        format!(
-            r"postgres://{}:{}@{}:{}/{}",
-            s.get::<String>("database.username")
-                .expect("Couldn't access database username"),
-            s.get::<String>("database.password")
-                .expect("Couldn't access database password"),
-            s.get::<String>("database.hostname")
-                .expect("Couldn't access database hostname"),
-            s.get::<String>("database.port")
-                .expect("Couldn't access database port"),
-            s.get::<String>("database.name")
-                .expect("Couldn't access database name")
-        ),
-    )
-    .expect("Couldn't set databse url");
-}
-
-//#[cfg(test)]
-//mod tests {
-//    use super::*;
-//
-//    #[test]
-//    fn url_prefix_test() {
-//        let mut settings = Settings::new().unwrap();
-//        assert!(settings.server.url_prefix.is_none());
-//        settings.server.url_prefix = Some("test".into());
-//        settings.server.check_url_prefix();
-//        settings.server.url_prefix = Some("    ".into());
-//        settings.server.check_url_prefix();
-//        assert!(settings.server.url_prefix.is_none());
-//    }
-//
-//    #[test]
-//    fn smtp_config_works() {
-//        let settings = Settings::new().unwrap();
-//        assert!(settings.smtp.is_some());
-//        assert_eq!(settings.smtp.as_ref().unwrap().password, "password");
-//        assert_eq!(settings.smtp.as_ref().unwrap().username, "admin");
-//    }
-//}
-
-
- \ No newline at end of file diff --git a/src/tests_migrate/tests-migrate.rs.html b/src/tests_migrate/tests-migrate.rs.html deleted file mode 100644 index 03038765..00000000 --- a/src/tests_migrate/tests-migrate.rs.html +++ /dev/null @@ -1,178 +0,0 @@ -tests-migrate.rs - source - -
1
-2
-3
-4
-5
-6
-7
-8
-9
-10
-11
-12
-13
-14
-15
-16
-17
-18
-19
-20
-21
-22
-23
-24
-25
-26
-27
-28
-29
-30
-31
-32
-33
-34
-35
-36
-37
-38
-39
-40
-41
-42
-43
-44
-45
-46
-47
-48
-49
-50
-51
-52
-53
-54
-55
-56
-57
-58
-59
-60
-61
-62
-63
-64
-65
-66
-67
-68
-69
-70
-71
-72
-73
-74
-75
-76
-77
-78
-79
-80
-81
-82
-83
-84
-85
-
/*
- * Copyright (C) 2022  Aravinth Manivannan <realaravinth@batsense.net>
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Affero General Public License as
- * published by the Free Software Foundation, either version 3 of the
- * License, or (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Affero General Public License for more details.
- *
- * You should have received a copy of the GNU Affero General Public License
- * along with this program.  If not, see <https://www.gnu.org/licenses/>.
- */
-use std::env;
-
-use lazy_static::lazy_static;
-use sqlx::postgres::PgPoolOptions;
-
-mod settings;
-
-pub use settings::Settings;
-
-#[cfg(not(tarpaulin_include))]
-lazy_static! {
-    #[cfg(not(tarpaulin_include))]
-    pub static ref SETTINGS: Settings = Settings::new().unwrap();
-}
-
-#[cfg(not(tarpaulin_include))]
-#[actix_rt::main]
-async fn main() {
-    let db = PgPoolOptions::new()
-        .max_connections(SETTINGS.database.pool)
-        .connect(&SETTINGS.database.url)
-        .await
-        .expect("Unable to form database pool");
-
-    for arg in env::args() {
-        if arg == "--build" {
-            println!("Building cache buster config");
-            build();
-        }
-    }
-
-    sqlx::migrate!("./migrations/").run(&db).await.unwrap();
-}
-
-fn build() {
-    use std::process::Command;
-
-    // note: add error checking yourself.
-    let output = Command::new("git")
-        .args(&["rev-parse", "HEAD"])
-        .output()
-        .unwrap();
-    let git_hash = String::from_utf8(output.stdout).unwrap();
-    println!("cargo:rustc-env=GIT_HASH={}", git_hash);
-
-    cache_bust();
-}
-
-fn cache_bust() {
-    use cache_buster::BusterBuilder;
-    let types = vec![
-        mime::IMAGE_PNG,
-        mime::IMAGE_SVG,
-        mime::IMAGE_JPEG,
-        mime::IMAGE_GIF,
-        mime::APPLICATION_JAVASCRIPT,
-        mime::TEXT_CSS,
-    ];
-
-    let config = BusterBuilder::default()
-        .source("./static/cache")
-        .result("./assets")
-        .mime_types(types)
-        .follow_links(true)
-        .build()
-        .unwrap();
-
-    config.process().unwrap();
-}
-
-
- \ No newline at end of file diff --git a/tests_migrate/all.html b/tests_migrate/all.html deleted file mode 100644 index 08a8ee17..00000000 --- a/tests_migrate/all.html +++ /dev/null @@ -1,7 +0,0 @@ -List of all items in this crate - -
- \ No newline at end of file diff --git a/tests_migrate/fn.build.html b/tests_migrate/fn.build.html deleted file mode 100644 index a5414fac..00000000 --- a/tests_migrate/fn.build.html +++ /dev/null @@ -1,8 +0,0 @@ -build in tests_migrate - Rust - -
pub(crate) fn build()
- \ No newline at end of file diff --git a/tests_migrate/fn.cache_bust.html b/tests_migrate/fn.cache_bust.html deleted file mode 100644 index a6adabf0..00000000 --- a/tests_migrate/fn.cache_bust.html +++ /dev/null @@ -1,8 +0,0 @@ -cache_bust in tests_migrate - Rust - -
pub(crate) fn cache_bust()
- \ No newline at end of file diff --git a/tests_migrate/fn.main.html b/tests_migrate/fn.main.html deleted file mode 100644 index 4e24358a..00000000 --- a/tests_migrate/fn.main.html +++ /dev/null @@ -1,8 +0,0 @@ -main in tests_migrate - Rust - -
pub(crate) fn main()
- \ No newline at end of file diff --git a/tests_migrate/index.html b/tests_migrate/index.html deleted file mode 100644 index e7c7fe72..00000000 --- a/tests_migrate/index.html +++ /dev/null @@ -1,11 +0,0 @@ -tests_migrate - Rust - -
- \ No newline at end of file diff --git a/tests_migrate/settings/fn.check_url.html b/tests_migrate/settings/fn.check_url.html deleted file mode 100644 index 6f9dad84..00000000 --- a/tests_migrate/settings/fn.check_url.html +++ /dev/null @@ -1,8 +0,0 @@ -check_url in tests_migrate::settings - Rust - -
fn check_url(s: &Config)
- \ No newline at end of file diff --git a/tests_migrate/settings/fn.set_database_url.html b/tests_migrate/settings/fn.set_database_url.html deleted file mode 100644 index 261771be..00000000 --- a/tests_migrate/settings/fn.set_database_url.html +++ /dev/null @@ -1,8 +0,0 @@ -set_database_url in tests_migrate::settings - Rust - -
fn set_database_url(s: &mut Config)
- \ No newline at end of file diff --git a/tests_migrate/settings/fn.set_from_database_url.html b/tests_migrate/settings/fn.set_from_database_url.html deleted file mode 100644 index b40bdcdf..00000000 --- a/tests_migrate/settings/fn.set_from_database_url.html +++ /dev/null @@ -1,8 +0,0 @@ -set_from_database_url in tests_migrate::settings - Rust - -
fn set_from_database_url(s: &mut Config, database_conf: &DatabaseBuilder)
- \ No newline at end of file diff --git a/tests_migrate/settings/index.html b/tests_migrate/settings/index.html deleted file mode 100644 index 80badbe9..00000000 --- a/tests_migrate/settings/index.html +++ /dev/null @@ -1,10 +0,0 @@ -tests_migrate::settings - Rust - -
- \ No newline at end of file diff --git a/tests_migrate/settings/sidebar-items.js b/tests_migrate/settings/sidebar-items.js deleted file mode 100644 index d7af58c6..00000000 --- a/tests_migrate/settings/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -initSidebarItems({"fn":[["check_url",""],["set_database_url",""],["set_from_database_url",""]],"struct":[["Captcha",""],["Database",""],["DatabaseBuilder",""],["DefaultDifficultyStrategy",""],["Redis",""],["Server",""],["Settings",""],["Smtp",""]]}); \ No newline at end of file diff --git a/tests_migrate/settings/struct.Captcha.html b/tests_migrate/settings/struct.Captcha.html deleted file mode 100644 index fd3de55b..00000000 --- a/tests_migrate/settings/struct.Captcha.html +++ /dev/null @@ -1,31 +0,0 @@ -Captcha in tests_migrate::settings - Rust - -
pub struct Captcha {
-    pub salt: String,
-    pub gc: u64,
-    pub default_difficulty_strategy: DefaultDifficultyStrategy,
-}

Fields

salt: Stringgc: u64default_difficulty_strategy: DefaultDifficultyStrategy

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/settings/struct.Database.html b/tests_migrate/settings/struct.Database.html deleted file mode 100644 index 8349c09c..00000000 --- a/tests_migrate/settings/struct.Database.html +++ /dev/null @@ -1,30 +0,0 @@ -Database in tests_migrate::settings - Rust - -
pub struct Database {
-    pub url: String,
-    pub pool: u32,
-}

Fields

url: Stringpool: u32

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/settings/struct.DatabaseBuilder.html b/tests_migrate/settings/struct.DatabaseBuilder.html deleted file mode 100644 index 17594c4c..00000000 --- a/tests_migrate/settings/struct.DatabaseBuilder.html +++ /dev/null @@ -1,33 +0,0 @@ -DatabaseBuilder in tests_migrate::settings - Rust - -
struct DatabaseBuilder {
-    pub port: u32,
-    pub hostname: String,
-    pub username: String,
-    pub password: String,
-    pub name: String,
-}

Fields

port: u32hostname: Stringusername: Stringpassword: Stringname: String

Implementations

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/settings/struct.DefaultDifficultyStrategy.html b/tests_migrate/settings/struct.DefaultDifficultyStrategy.html deleted file mode 100644 index aa4ab8a8..00000000 --- a/tests_migrate/settings/struct.DefaultDifficultyStrategy.html +++ /dev/null @@ -1,32 +0,0 @@ -DefaultDifficultyStrategy in tests_migrate::settings - Rust - -
pub struct DefaultDifficultyStrategy {
-    pub avg_traffic_difficulty: u32,
-    pub broke_my_site_traffic_difficulty: u32,
-    pub peak_sustainable_traffic_difficulty: u32,
-    pub duration: u32,
-}

Fields

avg_traffic_difficulty: u32broke_my_site_traffic_difficulty: u32peak_sustainable_traffic_difficulty: u32duration: u32

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/settings/struct.Redis.html b/tests_migrate/settings/struct.Redis.html deleted file mode 100644 index f7ddca12..00000000 --- a/tests_migrate/settings/struct.Redis.html +++ /dev/null @@ -1,30 +0,0 @@ -Redis in tests_migrate::settings - Rust - -
pub struct Redis {
-    pub url: String,
-    pub pool: u32,
-}

Fields

url: Stringpool: u32

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/settings/struct.Server.html b/tests_migrate/settings/struct.Server.html deleted file mode 100644 index c4b0b4a2..00000000 --- a/tests_migrate/settings/struct.Server.html +++ /dev/null @@ -1,34 +0,0 @@ -Server in tests_migrate::settings - Rust - -
pub struct Server {
-    pub port: u32,
-    pub domain: String,
-    pub cookie_secret: String,
-    pub ip: String,
-    pub url_prefix: Option<String>,
-    pub proxy_has_tls: bool,
-}

Fields

port: u32domain: Stringcookie_secret: Stringip: Stringurl_prefix: Option<String>proxy_has_tls: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/settings/struct.Settings.html b/tests_migrate/settings/struct.Settings.html deleted file mode 100644 index 5b46a7e7..00000000 --- a/tests_migrate/settings/struct.Settings.html +++ /dev/null @@ -1,38 +0,0 @@ -Settings in tests_migrate::settings - Rust - -
pub struct Settings {
-    pub debug: bool,
-    pub commercial: bool,
-    pub database: Database,
-    pub redis: Option<Redis>,
-    pub server: Server,
-    pub captcha: Captcha,
-    pub source_code: String,
-    pub smtp: Option<Smtp>,
-    pub allow_registration: bool,
-    pub allow_demo: bool,
-}

Fields

debug: boolcommercial: booldatabase: Databaseredis: Option<Redis>server: Servercaptcha: Captchasource_code: Stringsmtp: Option<Smtp>allow_registration: boolallow_demo: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/settings/struct.Smtp.html b/tests_migrate/settings/struct.Smtp.html deleted file mode 100644 index 51943587..00000000 --- a/tests_migrate/settings/struct.Smtp.html +++ /dev/null @@ -1,34 +0,0 @@ -Smtp in tests_migrate::settings - Rust - -
pub struct Smtp {
-    pub from: String,
-    pub reply: String,
-    pub url: String,
-    pub username: String,
-    pub password: String,
-    pub port: u16,
-}

Fields

from: Stringreply: Stringurl: Stringusername: Stringpassword: Stringport: u16

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/sidebar-items.js b/tests_migrate/sidebar-items.js deleted file mode 100644 index 01ed7bcc..00000000 --- a/tests_migrate/sidebar-items.js +++ /dev/null @@ -1 +0,0 @@ -initSidebarItems({"fn":[["build",""],["cache_bust",""],["main",""]],"mod":[["settings",""]],"struct":[["SETTINGS",""],["Settings",""]]}); \ No newline at end of file diff --git a/tests_migrate/struct.SETTINGS.html b/tests_migrate/struct.SETTINGS.html deleted file mode 100644 index 91d708e2..00000000 --- a/tests_migrate/struct.SETTINGS.html +++ /dev/null @@ -1,24 +0,0 @@ -SETTINGS in tests_migrate - Rust - -
pub struct SETTINGS {
-    pub(crate) __private_field: (),
-}

Fields

__private_field: ()

Trait Implementations

The resulting type after dereferencing.

-

Dereferences the value.

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file diff --git a/tests_migrate/struct.Settings.html b/tests_migrate/struct.Settings.html deleted file mode 100644 index 8bf449c3..00000000 --- a/tests_migrate/struct.Settings.html +++ /dev/null @@ -1,38 +0,0 @@ -Settings in tests_migrate - Rust - -
pub struct Settings {
-    pub debug: bool,
-    pub commercial: bool,
-    pub database: Database,
-    pub redis: Option<Redis>,
-    pub server: Server,
-    pub captcha: Captcha,
-    pub source_code: String,
-    pub smtp: Option<Smtp>,
-    pub allow_registration: bool,
-    pub allow_demo: bool,
-}

Fields

debug: boolcommercial: booldatabase: Databaseredis: Option<Redis>server: Servercaptcha: Captchasource_code: Stringsmtp: Option<Smtp>allow_registration: boolallow_demo: bool

Implementations

Trait Implementations

Returns a copy of the value. Read more

-

Performs copy-assignment from source. Read more

-

Formats the value using the given formatter. Read more

-

Deserialize this value from the given Serde deserializer. Read more

-

Auto Trait Implementations

Blanket Implementations

Gets the TypeId of self. Read more

-

Immutably borrows from an owned value. Read more

-

Mutably borrows from an owned value. Read more

-

Returns the argument unchanged.

-

Calls U::from(self).

-

That is, this conversion is whatever the implementation of -From<T> for U chooses to do.

-

Should always be Self

-

The resulting type after obtaining ownership.

-

Creates owned data from borrowed data, usually by cloning. Read more

-
🔬 This is a nightly-only experimental API. (toowned_clone_into)

Uses borrowed data to replace owned data, usually by cloning. Read more

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-

The type returned in the event of a conversion error.

-

Performs the conversion.

-
- \ No newline at end of file