From 5cd40c63ed230bee6dd54b79a9a7e768ad87978f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa?= Date: Sat, 10 Feb 2018 01:00:55 +0100 Subject: [PATCH] First working version --- .dockerignore | 22 + .env | 13 + .gitignore | 13 + Cargo.lock | 1884 ++++++++++++ Cargo.toml | 62 + Dockerfile | 62 + README.md | 97 + docker-compose.yml | 10 + libs/jsonwebtoken/Cargo.toml | 20 + libs/jsonwebtoken/LICENSE | 21 + libs/jsonwebtoken/src/crypto.rs | 120 + libs/jsonwebtoken/src/errors.rs | 68 + libs/jsonwebtoken/src/header.rs | 64 + libs/jsonwebtoken/src/lib.rs | 140 + libs/jsonwebtoken/src/serialization.rs | 42 + libs/jsonwebtoken/src/validation.rs | 377 +++ .../2018-01-14-171611_create_tables/down.sql | 7 + .../2018-01-14-171611_create_tables/up.sql | 50 + src/api/core/accounts.rs | 149 + src/api/core/ciphers.rs | 251 ++ src/api/core/folders.rs | 102 + src/api/core/mod.rs | 100 + src/api/core/two_factor.rs | 131 + src/api/icons.rs | 85 + src/api/identity.rs | 225 ++ src/api/mod.rs | 9 + src/api/web.rs | 43 + src/auth.rs | 164 + src/bin/proxy.rs | 168 ++ src/crypto.rs | 36 + src/db/mod.rs | 60 + src/db/models/cipher.rs | 112 + src/db/models/device.rs | 117 + src/db/models/folder.rs | 83 + src/db/models/mod.rs | 9 + src/db/models/user.rs | 159 + src/db/schema.rs | 71 + src/main.rs | 151 + src/tests.rs | 49 + src/util.rs | 84 + web-vault/LICENSE.txt | 674 +++++ web-vault/app-id.json | 15 + .../app/accounts/views/accountsLogin.html | 7 + .../app/accounts/views/accountsLoginInfo.html | 49 + .../views/accountsLoginTwoFactor.html | 167 ++ .../views/accountsOrganizationAccept.html | 32 + .../accounts/views/accountsPasswordHint.html | 39 + .../app/accounts/views/accountsRecover.html | 56 + .../accounts/views/accountsRecoverDelete.html | 39 + .../app/accounts/views/accountsRegister.html | 82 + .../views/accountsTwoFactorMethods.html | 25 + .../accounts/views/accountsVerifyEmail.html | 8 + .../views/accountsVerifyRecoverDelete.html | 21 + .../views/organizationBilling.html | 230 ++ .../views/organizationBillingAdjustSeats.html | 46 + .../views/organizationBillingChangePlan.html | 14 + .../views/organizationBillingVerifyBank.html | 43 + .../views/organizationCollections.html | 70 + .../views/organizationCollectionsAdd.html | 83 + .../views/organizationCollectionsEdit.html | 84 + .../views/organizationCollectionsUsers.html | 64 + .../views/organizationDashboard.html | 34 + .../views/organizationDelete.html | 34 + .../views/organizationEvents.html | 67 + .../views/organizationGroups.html | 70 + .../views/organizationGroupsAdd.html | 95 + .../views/organizationGroupsEdit.html | 95 + .../views/organizationGroupsUsers.html | 55 + .../views/organizationPeople.html | 96 + .../views/organizationPeopleEdit.html | 101 + .../views/organizationPeopleEvents.html | 56 + .../views/organizationPeopleGroups.html | 55 + .../views/organizationPeopleInvite.html | 110 + .../views/organizationSettings.html | 94 + .../organization/views/organizationVault.html | 95 + .../organizationVaultCipherCollections.html | 52 + .../views/organizationVaultCipherEvents.html | 60 + .../app/reports/views/reportsBreach.html | 74 + web-vault/app/settings/views/settings.html | 164 + .../settingsAddEditEquivalentDomain.html | 35 + .../app/settings/views/settingsBilling.html | 178 ++ .../views/settingsBillingAdjustStorage.html | 46 + .../views/settingsBillingChangePayment.html | 433 +++ .../views/settingsBillingUpdateLicense.html | 30 + .../settings/views/settingsChangeEmail.html | 58 + .../views/settingsChangePassword.html | 43 + .../views/settingsCreateOrganization.html | 697 +++++ .../app/settings/views/settingsDelete.html | 30 + .../app/settings/views/settingsDomains.html | 117 + .../app/settings/views/settingsPremium.html | 487 +++ .../app/settings/views/settingsPurge.html | 33 + .../app/settings/views/settingsSessions.html | 37 + .../app/settings/views/settingsTwoStep.html | 52 + .../views/settingsTwoStepAuthenticator.html | 116 + .../settings/views/settingsTwoStepDuo.html | 76 + .../settings/views/settingsTwoStepEmail.html | 77 + .../views/settingsTwoStepRecover.html | 48 + .../settings/views/settingsTwoStepU2f.html | 93 + .../settings/views/settingsTwoStepYubi.html | 127 + .../app/settings/views/settingsUpdateKey.html | 47 + web-vault/app/tools/views/tools.html | 32 + web-vault/app/tools/views/toolsExport.html | 33 + web-vault/app/tools/views/toolsImport.html | 48 + web-vault/app/vault/views/vault.html | 364 +++ web-vault/app/vault/views/vaultAddCipher.html | 584 ++++ web-vault/app/vault/views/vaultAddFolder.html | 24 + .../app/vault/views/vaultAttachments.html | 75 + .../vault/views/vaultCipherCollections.html | 55 + .../app/vault/views/vaultEditCipher.html | 585 ++++ .../app/vault/views/vaultEditFolder.html | 24 + .../app/vault/views/vaultMoveCiphers.html | 34 + .../app/vault/views/vaultShareCipher.html | 75 + web-vault/app/views/apps.html | 135 + web-vault/app/views/backendLayout.html | 10 + web-vault/app/views/frontendLayout.html | 2 + web-vault/app/views/organizationLayout.html | 118 + web-vault/app/views/paidOrgRequired.html | 13 + web-vault/app/views/premiumRequired.html | 36 + web-vault/app/views/userLayout.html | 168 ++ web-vault/css/vault.min.css | 1 + web-vault/duo-connector.html | 31 + web-vault/favicon.ico | Bin 0 -> 18686 bytes web-vault/images/boxed-bg-2x.png | Bin 0 -> 84138 bytes web-vault/images/boxed-bg.png | Bin 0 -> 63654 bytes web-vault/images/cards.png | Bin 0 -> 17093 bytes web-vault/images/fa-globe.png | Bin 0 -> 344 bytes .../images/icons/android-chrome-192x192.png | Bin 0 -> 4089 bytes .../images/icons/android-chrome-512x512.png | Bin 0 -> 10947 bytes web-vault/images/icons/apple-touch-icon.png | Bin 0 -> 15716 bytes web-vault/images/icons/favicon-16x16.png | Bin 0 -> 403 bytes web-vault/images/icons/favicon-32x32.png | Bin 0 -> 636 bytes web-vault/images/icons/mstile-150x150.png | Bin 0 -> 2637 bytes web-vault/images/icons/safari-pinned-tab.svg | 26 + web-vault/images/loading.svg | 6 + web-vault/images/totp-countdown.png | Bin 0 -> 1636 bytes web-vault/images/two-factor/authapp.png | Bin 0 -> 6054 bytes web-vault/images/two-factor/duo.png | Bin 0 -> 1211 bytes web-vault/images/two-factor/fido.png | Bin 0 -> 4810 bytes web-vault/images/two-factor/gmail.png | Bin 0 -> 2675 bytes web-vault/images/two-factor/u2fkey.jpg | Bin 0 -> 178171 bytes web-vault/images/two-factor/yubico.png | Bin 0 -> 1624 bytes web-vault/images/two-factor/yubikey.jpg | Bin 0 -> 28186 bytes web-vault/index.html | 56 + web-vault/js/app.min.js | 1 + web-vault/js/bw.min.js | 1 + web-vault/js/duo-connector.js | 40 + web-vault/js/duo.js | 430 +++ web-vault/js/fallback-scripts.min.js | 1 + web-vault/js/fallback-styles.min.js | 1 + web-vault/js/lib.min.js | 1 + web-vault/js/settings.js | 1 + web-vault/js/u2f.min.js | 1 + web-vault/lib/angular/angular.min.js | 336 +++ web-vault/lib/bootstrap/css/bootstrap.min.css | 6 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 ++ .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes web-vault/lib/bootstrap/js/bootstrap.min.js | 7 + .../lib/font-awesome/css/font-awesome.min.css | 4 + .../lib/font-awesome/fonts/FontAwesome.otf | Bin 0 -> 134808 bytes .../fonts/fontawesome-webfont.eot | Bin 0 -> 165742 bytes .../fonts/fontawesome-webfont.svg | 2671 +++++++++++++++++ .../fonts/fontawesome-webfont.ttf | Bin 0 -> 165548 bytes .../fonts/fontawesome-webfont.woff | Bin 0 -> 98024 bytes .../fonts/fontawesome-webfont.woff2 | Bin 0 -> 77160 bytes web-vault/lib/forge/prime.worker.min.js | 2 + web-vault/lib/forge/prime.worker.min.js.map | 1 + web-vault/lib/jquery/jquery.min.js | 4 + web-vault/manifest.json | 17 + web-vault/u2f-connector.html | 10 + 172 files changed, 17903 insertions(+) create mode 100644 .dockerignore create mode 100644 .env create mode 100644 .gitignore create mode 100644 Cargo.lock create mode 100644 Cargo.toml create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 docker-compose.yml create mode 100644 libs/jsonwebtoken/Cargo.toml create mode 100644 libs/jsonwebtoken/LICENSE create mode 100644 libs/jsonwebtoken/src/crypto.rs create mode 100644 libs/jsonwebtoken/src/errors.rs create mode 100644 libs/jsonwebtoken/src/header.rs create mode 100644 libs/jsonwebtoken/src/lib.rs create mode 100644 libs/jsonwebtoken/src/serialization.rs create mode 100644 libs/jsonwebtoken/src/validation.rs create mode 100644 migrations/2018-01-14-171611_create_tables/down.sql create mode 100644 migrations/2018-01-14-171611_create_tables/up.sql create mode 100644 src/api/core/accounts.rs create mode 100644 src/api/core/ciphers.rs create mode 100644 src/api/core/folders.rs create mode 100644 src/api/core/mod.rs create mode 100644 src/api/core/two_factor.rs create mode 100644 src/api/icons.rs create mode 100644 src/api/identity.rs create mode 100644 src/api/mod.rs create mode 100644 src/api/web.rs create mode 100644 src/auth.rs create mode 100644 src/bin/proxy.rs create mode 100644 src/crypto.rs create mode 100644 src/db/mod.rs create mode 100644 src/db/models/cipher.rs create mode 100644 src/db/models/device.rs create mode 100644 src/db/models/folder.rs create mode 100644 src/db/models/mod.rs create mode 100644 src/db/models/user.rs create mode 100644 src/db/schema.rs create mode 100644 src/main.rs create mode 100644 src/tests.rs create mode 100644 src/util.rs create mode 100644 web-vault/LICENSE.txt create mode 100644 web-vault/app-id.json create mode 100644 web-vault/app/accounts/views/accountsLogin.html create mode 100644 web-vault/app/accounts/views/accountsLoginInfo.html create mode 100644 web-vault/app/accounts/views/accountsLoginTwoFactor.html create mode 100644 web-vault/app/accounts/views/accountsOrganizationAccept.html create mode 100644 web-vault/app/accounts/views/accountsPasswordHint.html create mode 100644 web-vault/app/accounts/views/accountsRecover.html create mode 100644 web-vault/app/accounts/views/accountsRecoverDelete.html create mode 100644 web-vault/app/accounts/views/accountsRegister.html create mode 100644 web-vault/app/accounts/views/accountsTwoFactorMethods.html create mode 100644 web-vault/app/accounts/views/accountsVerifyEmail.html create mode 100644 web-vault/app/accounts/views/accountsVerifyRecoverDelete.html create mode 100644 web-vault/app/organization/views/organizationBilling.html create mode 100644 web-vault/app/organization/views/organizationBillingAdjustSeats.html create mode 100644 web-vault/app/organization/views/organizationBillingChangePlan.html create mode 100644 web-vault/app/organization/views/organizationBillingVerifyBank.html create mode 100644 web-vault/app/organization/views/organizationCollections.html create mode 100644 web-vault/app/organization/views/organizationCollectionsAdd.html create mode 100644 web-vault/app/organization/views/organizationCollectionsEdit.html create mode 100644 web-vault/app/organization/views/organizationCollectionsUsers.html create mode 100644 web-vault/app/organization/views/organizationDashboard.html create mode 100644 web-vault/app/organization/views/organizationDelete.html create mode 100644 web-vault/app/organization/views/organizationEvents.html create mode 100644 web-vault/app/organization/views/organizationGroups.html create mode 100644 web-vault/app/organization/views/organizationGroupsAdd.html create mode 100644 web-vault/app/organization/views/organizationGroupsEdit.html create mode 100644 web-vault/app/organization/views/organizationGroupsUsers.html create mode 100644 web-vault/app/organization/views/organizationPeople.html create mode 100644 web-vault/app/organization/views/organizationPeopleEdit.html create mode 100644 web-vault/app/organization/views/organizationPeopleEvents.html create mode 100644 web-vault/app/organization/views/organizationPeopleGroups.html create mode 100644 web-vault/app/organization/views/organizationPeopleInvite.html create mode 100644 web-vault/app/organization/views/organizationSettings.html create mode 100644 web-vault/app/organization/views/organizationVault.html create mode 100644 web-vault/app/organization/views/organizationVaultCipherCollections.html create mode 100644 web-vault/app/organization/views/organizationVaultCipherEvents.html create mode 100644 web-vault/app/reports/views/reportsBreach.html create mode 100644 web-vault/app/settings/views/settings.html create mode 100644 web-vault/app/settings/views/settingsAddEditEquivalentDomain.html create mode 100644 web-vault/app/settings/views/settingsBilling.html create mode 100644 web-vault/app/settings/views/settingsBillingAdjustStorage.html create mode 100644 web-vault/app/settings/views/settingsBillingChangePayment.html create mode 100644 web-vault/app/settings/views/settingsBillingUpdateLicense.html create mode 100644 web-vault/app/settings/views/settingsChangeEmail.html create mode 100644 web-vault/app/settings/views/settingsChangePassword.html create mode 100644 web-vault/app/settings/views/settingsCreateOrganization.html create mode 100644 web-vault/app/settings/views/settingsDelete.html create mode 100644 web-vault/app/settings/views/settingsDomains.html create mode 100644 web-vault/app/settings/views/settingsPremium.html create mode 100644 web-vault/app/settings/views/settingsPurge.html create mode 100644 web-vault/app/settings/views/settingsSessions.html create mode 100644 web-vault/app/settings/views/settingsTwoStep.html create mode 100644 web-vault/app/settings/views/settingsTwoStepAuthenticator.html create mode 100644 web-vault/app/settings/views/settingsTwoStepDuo.html create mode 100644 web-vault/app/settings/views/settingsTwoStepEmail.html create mode 100644 web-vault/app/settings/views/settingsTwoStepRecover.html create mode 100644 web-vault/app/settings/views/settingsTwoStepU2f.html create mode 100644 web-vault/app/settings/views/settingsTwoStepYubi.html create mode 100644 web-vault/app/settings/views/settingsUpdateKey.html create mode 100644 web-vault/app/tools/views/tools.html create mode 100644 web-vault/app/tools/views/toolsExport.html create mode 100644 web-vault/app/tools/views/toolsImport.html create mode 100644 web-vault/app/vault/views/vault.html create mode 100644 web-vault/app/vault/views/vaultAddCipher.html create mode 100644 web-vault/app/vault/views/vaultAddFolder.html create mode 100644 web-vault/app/vault/views/vaultAttachments.html create mode 100644 web-vault/app/vault/views/vaultCipherCollections.html create mode 100644 web-vault/app/vault/views/vaultEditCipher.html create mode 100644 web-vault/app/vault/views/vaultEditFolder.html create mode 100644 web-vault/app/vault/views/vaultMoveCiphers.html create mode 100644 web-vault/app/vault/views/vaultShareCipher.html create mode 100644 web-vault/app/views/apps.html create mode 100644 web-vault/app/views/backendLayout.html create mode 100644 web-vault/app/views/frontendLayout.html create mode 100644 web-vault/app/views/organizationLayout.html create mode 100644 web-vault/app/views/paidOrgRequired.html create mode 100644 web-vault/app/views/premiumRequired.html create mode 100644 web-vault/app/views/userLayout.html create mode 100644 web-vault/css/vault.min.css create mode 100644 web-vault/duo-connector.html create mode 100644 web-vault/favicon.ico create mode 100644 web-vault/images/boxed-bg-2x.png create mode 100644 web-vault/images/boxed-bg.png create mode 100644 web-vault/images/cards.png create mode 100644 web-vault/images/fa-globe.png create mode 100644 web-vault/images/icons/android-chrome-192x192.png create mode 100644 web-vault/images/icons/android-chrome-512x512.png create mode 100644 web-vault/images/icons/apple-touch-icon.png create mode 100644 web-vault/images/icons/favicon-16x16.png create mode 100644 web-vault/images/icons/favicon-32x32.png create mode 100644 web-vault/images/icons/mstile-150x150.png create mode 100644 web-vault/images/icons/safari-pinned-tab.svg create mode 100644 web-vault/images/loading.svg create mode 100644 web-vault/images/totp-countdown.png create mode 100644 web-vault/images/two-factor/authapp.png create mode 100644 web-vault/images/two-factor/duo.png create mode 100644 web-vault/images/two-factor/fido.png create mode 100644 web-vault/images/two-factor/gmail.png create mode 100644 web-vault/images/two-factor/u2fkey.jpg create mode 100644 web-vault/images/two-factor/yubico.png create mode 100644 web-vault/images/two-factor/yubikey.jpg create mode 100644 web-vault/index.html create mode 100644 web-vault/js/app.min.js create mode 100644 web-vault/js/bw.min.js create mode 100644 web-vault/js/duo-connector.js create mode 100644 web-vault/js/duo.js create mode 100644 web-vault/js/fallback-scripts.min.js create mode 100644 web-vault/js/fallback-styles.min.js create mode 100644 web-vault/js/lib.min.js create mode 100644 web-vault/js/settings.js create mode 100644 web-vault/js/u2f.min.js create mode 100644 web-vault/lib/angular/angular.min.js create mode 100644 web-vault/lib/bootstrap/css/bootstrap.min.css create mode 100644 web-vault/lib/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 web-vault/lib/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 web-vault/lib/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 web-vault/lib/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 web-vault/lib/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 web-vault/lib/bootstrap/js/bootstrap.min.js create mode 100644 web-vault/lib/font-awesome/css/font-awesome.min.css create mode 100644 web-vault/lib/font-awesome/fonts/FontAwesome.otf create mode 100644 web-vault/lib/font-awesome/fonts/fontawesome-webfont.eot create mode 100644 web-vault/lib/font-awesome/fonts/fontawesome-webfont.svg create mode 100644 web-vault/lib/font-awesome/fonts/fontawesome-webfont.ttf create mode 100644 web-vault/lib/font-awesome/fonts/fontawesome-webfont.woff create mode 100644 web-vault/lib/font-awesome/fonts/fontawesome-webfont.woff2 create mode 100644 web-vault/lib/forge/prime.worker.min.js create mode 100644 web-vault/lib/forge/prime.worker.min.js.map create mode 100644 web-vault/lib/jquery/jquery.min.js create mode 100644 web-vault/manifest.json create mode 100644 web-vault/u2f-connector.html diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..a81ce145 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,22 @@ +# Local build artifacts +target + +# Data folder +data + +# IDE files +.vscode +.idea +*.iml + +# Git and Docker files +.git +.gitignore +.gitmodules +Dockerfile +docker-compose.yml +.dockerignore + +# Documentation +*.md + diff --git a/.env b/.env new file mode 100644 index 00000000..4b481b62 --- /dev/null +++ b/.env @@ -0,0 +1,13 @@ +# DATABASE_URL=data/db.sqlite3 +# PRIVATE_RSA_KEY=data/private_rsa_key.der +# PUBLIC_RSA_KEY=data/public_rsa_key.der +# ICON_CACHE_FOLDER=data/icon_cache +# ATTACHMENTS_FOLDER=data/attachments + +# true for yes, anything else for no +SIGNUPS_ALLOWED=true + +# ROCKET_ENV=production +# ROCKET_ADDRESS=0.0.0.0 # Enable this to test mobile app +# ROCKET_PORT=8000 +# ROCKET_TLS={certs="/path/to/certs.pem",key="/path/to/key.pem"} diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..c579527d --- /dev/null +++ b/.gitignore @@ -0,0 +1,13 @@ +# Local build artifacts +target + +# Data folder +data + +# IDE files +.vscode +.idea +*.iml + +# Environment file +# .env diff --git a/Cargo.lock b/Cargo.lock new file mode 100644 index 00000000..e73e5a92 --- /dev/null +++ b/Cargo.lock @@ -0,0 +1,1884 @@ +[[package]] +name = "adler32" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "aho-corasick" +version = "0.6.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "antidote" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ascii" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "base64" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "base64" +version = "0.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "base64" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "bitflags" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bitflags" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bitwarden_rs" +version = "0.1.0" +dependencies = [ + "chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "diesel 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "diesel_migrations 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "dotenv 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "jsonwebtoken 4.0.0", + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "multipart 0.13.6 (registry+https://github.com/rust-lang/crates.io-index)", + "oath 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)", + "r2d2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", + "r2d2-diesel 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "reqwest 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket_codegen 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket_contrib 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "stainless 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "buf_redux" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)", + "safemem 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "build_const" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "byte-tools" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "byteorder" +version = "1.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "bytes" +version = "0.4.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "cc" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cfg-if" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "chrono" +version = "0.2.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "chrono" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "chunked_transfer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "coco" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "constant_time_eq" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "cookie" +version = "0.9.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "core-foundation" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "core-foundation-sys" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crc" +version = "1.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "build_const 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "crypto-mac" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "data-encoding" +version = "2.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "derive-error-chain" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "diesel" +version = "1.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "diesel_derives 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libsqlite3-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "diesel_derives" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "diesel_migrations" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "migrations_internals 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "migrations_macros 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "digest" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "generic-array 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "digest-buffer" +version = "0.3.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byte-tools 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "dotenv" +version = "0.10.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "derive-error-chain 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)", + "regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "dtoa" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "either" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "encoding" +version = "0.2.33" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-japanese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-korean" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-simpchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-singlebyte" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding-index-tradchinese" +version = "1.20141219.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "encoding_index_tests" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "error-chain" +version = "0.10.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "error-chain" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "fake-simd" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "foreign-types" +version = "0.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "foreign-types-shared" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "fuchsia-zircon" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "fuchsia-zircon-sys" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "futures-cpupool" +version = "0.1.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "gcc" +version = "0.3.54" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "generic-array" +version = "0.7.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "typenum 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hmac" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "crypto-mac 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "httparse" +version = "1.2.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "hyper" +version = "0.10.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hyper" +version = "0.11.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hyper-sync-rustls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki-roots 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hyper-tls" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.18 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "idna" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "iovec" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "iron" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 1.8.3 (registry+https://github.com/rust-lang/crates.io-index)", + "modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "isatty" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "itoa" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "jsonwebtoken" +version = "4.0.0" +dependencies = [ + "base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "kernel32-sys" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "language-tags" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "lazy_static" +version = "0.2.11" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "lazy_static" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "lazycell" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libc" +version = "0.2.36" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "libflate" +version = "0.1.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "libsqlite3-sys" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "log" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "log" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "matches" +version = "0.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "memchr" +version = "0.1.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "memchr" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "memchr" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "migrations_internals" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "diesel 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "migrations_macros" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "migrations_internals 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mime" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mime" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mime_guess" +version = "1.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mime_guess" +version = "2.0.0-alpha.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "mio" +version = "0.6.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "miow" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "modifier" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "multipart" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "buf_redux 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)", + "httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", + "iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 1.8.3 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "tiny_http 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)", + "twoway 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "native-tls" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)", + "schannel 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", + "tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "net2" +version = "0.2.31" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "nodrop" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "num" +version = "0.1.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-integer" +version = "0.1.36" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-iter" +version = "0.1.35" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.1.43" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "num-traits" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "num_cpus" +version = "1.8.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "oath" +version = "0.10.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "digest 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hmac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "sha-1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "sha2 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "openssl" +version = "0.9.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)", + "foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "openssl-sys 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "openssl-sys" +version = "0.9.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ordermap" +version = "0.2.13" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pear" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "pear_codegen" +version = "0.0.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "yansi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "percent-encoding" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "phf" +version = "0.7.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_codegen" +version = "0.7.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_generator" +version = "0.7.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "phf_shared" +version = "0.7.21" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "pkg-config" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "plugin" +version = "0.2.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "quote" +version = "0.3.15" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "r2d2" +version = "0.8.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "r2d2-diesel" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "diesel 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "r2d2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.3.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rand" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rayon" +version = "0.7.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rayon-core" +version = "1.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "redox_syscall" +version = "0.1.37" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "redox_termios" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", + "regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)", + "utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "regex-syntax" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "relay" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "remove_dir_all" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "reqwest" +version = "0.8.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.11.18 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "libflate 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mime_guess 2.0.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_urlencoded 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "ring" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "rayon 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rocket" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cookie 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)", + "hyper-sync-rustls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", + "num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ordermap 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)", + "pear 0.0.12 (registry+https://github.com/rust-lang/crates.io-index)", + "pear_codegen 0.0.12 (registry+https://github.com/rust-lang/crates.io-index)", + "rustls 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)", + "state 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "yansi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rocket_codegen" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "yansi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rocket_contrib" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "rocket 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "rustc-hex" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rustc-serialize" +version = "0.3.24" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rustls" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "ring 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "safemem" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "safemem" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "schannel" +version = "0.1.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "scheduled-thread-pool" +version = "0.2.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "scoped-tls" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "scopeguard" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "security-framework" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "security-framework-sys" +version = "0.1.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "serde_derive" +version = "1.0.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)", + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_derive_internals" +version = "0.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)", + "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_json" +version = "1.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "serde_urlencoded" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", + "url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha-1" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byte-tools 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "digest-buffer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "sha2" +version = "0.5.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "byte-tools 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", + "digest 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)", + "digest-buffer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "generic-array 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "siphasher" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "slab" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "smallvec" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "smallvec" +version = "0.4.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "stainless" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "state" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "syn" +version = "0.11.11" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)", + "synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "synom" +version = "0.11.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "take" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "tempdir" +version = "0.3.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "termion" +version = "1.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "thread_local" +version = "0.3.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "time" +version = "0.1.39" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tiny_http" +version = "0.5.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ascii 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", + "chrono 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)", + "chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-core" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", + "mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)", + "scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-io" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)", + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-proto" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", + "net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)", + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-service" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "tokio-tls" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", + "native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)", + "tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "toml" +version = "0.4.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "traitobject" +version = "0.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "twoway" +version = "0.1.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "typeable" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "typemap" +version = "0.3.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "typenum" +version = "1.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicase" +version = "1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicase" +version = "2.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-bidi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unicode-normalization" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unicode-xid" +version = "0.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "unreachable" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "unsafe-any" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "untrusted" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "url" +version = "0.2.38" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", + "uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "url" +version = "1.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", + "matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", + "percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "utf8-ranges" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "uuid" +version = "0.1.18" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", + "rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "uuid" +version = "0.5.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "vcpkg" +version = "0.2.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "version_check" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "void" +version = "1.0.2" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "webpki" +version = "0.14.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "ring 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)", + "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "webpki-roots" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", + "webpki 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "winapi-build" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "ws2_32-sys" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "yansi" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum adler32 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6cbd0b9af8587c72beadc9f72d35b9fbb070982c9e6203e46e93f10df25f8f45" +"checksum aho-corasick 0.6.4 (registry+https://github.com/rust-lang/crates.io-index)" = "d6531d44de723825aa81398a6415283229725a00fa30713812ab9323faa82fc4" +"checksum antidote 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "34fde25430d87a9388dadbe6e34d7f72a462c8b43ac8d309b42b0a8505d7e2a5" +"checksum ascii 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3ae7d751998c189c1d4468cf0a39bb2eae052a9c58d50ebb3b9591ee3813ad50" +"checksum base64 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "96434f987501f0ed4eb336a411e0631ecd1afa11574fe148587adc4ff96143c9" +"checksum base64 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c4a342b450b268e1be8036311e2c613d7f8a7ed31214dff1cc3b60852a3168d" +"checksum base64 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "229d032f1a99302697f10b27167ae6d03d49d032e6a8e2550e8d3fc13356d2b4" +"checksum bitflags 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4efd02e230a02e18f92fc2735f44597385ed02ad8f831e7c1c1156ee5e1ab3a5" +"checksum bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b3c30d3802dfb7281680d6285f2ccdaa8c2d8fee41f93805dba5c4cf50dc23cf" +"checksum buf_redux 0.6.2 (registry+https://github.com/rust-lang/crates.io-index)" = "5f659482025b65320c1746e6e7941918269681ada7adde3b92f9bbc510e68130" +"checksum build_const 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e90dc84f5e62d2ebe7676b83c22d33b6db8bd27340fb6ffbff0a364efa0cb9c9" +"checksum byte-tools 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "0919189ba800c7ffe8778278116b7e0de3905ab81c72abb69c85cbfef7991279" +"checksum byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "652805b7e73fada9d85e9a6682a4abd490cb52d96aeecc12e33a0de34dfd0d23" +"checksum bytes 0.4.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1b7db437d718977f6dc9b2e3fd6fc343c02ac6b899b73fdd2179163447bd9ce9" +"checksum cc 1.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "deaf9ec656256bb25b404c51ef50097207b9cbb29c933d31f92cae5a8a0ffee0" +"checksum cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "d4c819a1287eb618df47cc647173c5c4c66ba19d888a6e50d605672aed3140de" +"checksum chrono 0.2.25 (registry+https://github.com/rust-lang/crates.io-index)" = "9213f7cd7c27e95c2b57c49f0e69b1ea65b27138da84a170133fd21b07659c00" +"checksum chrono 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c20ebe0b2b08b0aeddba49c609fe7957ba2e33449882cb186a180bc60682fa9" +"checksum chunked_transfer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "498d20a7aaf62625b9bf26e637cf7736417cde1d0c99f1d04d1170229a85cf87" +"checksum coco 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c06169f5beb7e31c7c67ebf5540b8b472d23e3eade3b2ec7d1f5b504a85f91bd" +"checksum constant_time_eq 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "8ff012e225ce166d4422e0e78419d901719760f62ae2b7969ca6b564d1b54a9e" +"checksum cookie 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "477eb650753e319be2ae77ec368a58c638f9f0c4d941c39bad95e950fb1d1d0d" +"checksum core-foundation 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "25bfd746d203017f7d5cbd31ee5d8e17f94b6521c7af77ece6c9e4b2d4b16c67" +"checksum core-foundation-sys 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "065a5d7ffdcbc8fa145d6f0746f3555025b9097a9e9cda59f7467abae670c78d" +"checksum crc 1.7.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd5d02c0aac6bd68393ed69e00bbc2457f3e89075c6349db7189618dc4ddc1d7" +"checksum crypto-mac 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "dba62c86c26dcba13c278afcaac0c7452486fe604a2668a0dfa4e0edc98d8a9e" +"checksum data-encoding 2.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "67df0571a74bf0d97fb8b2ed22abdd9a48475c96bd327db968b7d9cace99655e" +"checksum derive-error-chain 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "3c9ca9ade651388daad7c993f005d0d20c4f6fe78c1cdc93e95f161c6f5ede4a" +"checksum diesel 1.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "925325c57038f2f14c0413bdf6a92ca72acff644959d0a1a9ebf8d19be7e9c01" +"checksum diesel_derives 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "28e2b2605ac6a3b9a586383f5f8b2b5f1108f07a421ade965b266289d2805e79" +"checksum diesel_migrations 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0928a7d6f27c849954185416bd59439837de55fbc89e2985b0e46e756ae4e3da" +"checksum digest 0.5.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7a68d759d7a66a4f63d5bd2a2b14ad7e8cf93fe8c9be227031cd4e72ab0e9ee8" +"checksum digest-buffer 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4eb92364e9f6d3da159257250532d448b218406d2acb149f724e8f48e9f5cb9a" +"checksum dotenv 0.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d6f0e2bb24d163428d8031d3ebd2d2bd903ad933205a97d0f18c7c1aade380f3" +"checksum dtoa 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "09c3753c3db574d215cba4ea76018483895d7bff25a31b49ba45db21c48e50ab" +"checksum either 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "740178ddf48b1a9e878e6d6509a1442a2d42fd2928aae8e7a6f8a36fb01981b3" +"checksum encoding 0.2.33 (registry+https://github.com/rust-lang/crates.io-index)" = "6b0d943856b990d12d3b55b359144ff341533e516d94098b1d3fc1ac666d36ec" +"checksum encoding-index-japanese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "04e8b2ff42e9a05335dbf8b5c6f7567e5591d0d916ccef4e0b1710d32a0d0c91" +"checksum encoding-index-korean 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "4dc33fb8e6bcba213fe2f14275f0963fd16f0a02c878e3095ecfdf5bee529d81" +"checksum encoding-index-simpchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "d87a7194909b9118fc707194baa434a4e3b0fb6a5a757c73c3adb07aa25031f7" +"checksum encoding-index-singlebyte 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "3351d5acffb224af9ca265f435b859c7c01537c0849754d3db3fdf2bfe2ae84a" +"checksum encoding-index-tradchinese 1.20141219.5 (registry+https://github.com/rust-lang/crates.io-index)" = "fd0e20d5688ce3cab59eb3ef3a2083a5c77bf496cb798dc6fcdb75f323890c18" +"checksum encoding_index_tests 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a246d82be1c9d791c5dfde9a2bd045fc3cbba3fa2b11ad558f27d01712f00569" +"checksum error-chain 0.10.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d9435d864e017c3c6afeac1654189b06cdb491cf2ff73dbf0d73b0f292f42ff8" +"checksum error-chain 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ff511d5dc435d703f4971bc399647c9bc38e20cb41452e3b9feb4765419ed3f3" +"checksum fake-simd 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" +"checksum foreign-types 0.3.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f6f339eb8adc052cd2ca78910fda869aefa38d22d5cb648e6485e4d3fc06f3b1" +"checksum foreign-types-shared 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b" +"checksum fuchsia-zircon 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "2e9763c69ebaae630ba35f74888db465e49e259ba1bc0eda7d06f4a067615d82" +"checksum fuchsia-zircon-sys 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "3dcaa9ae7725d12cdb85b3ad99a434db70b468c09ded17e012d86b5c1010f7a7" +"checksum futures 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "0bab5b5e94f5c31fc764ba5dd9ad16568aae5d4825538c01d6bca680c9bf94a7" +"checksum futures-cpupool 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "ab90cde24b3319636588d0c35fe03b1333857621051837ed769faefb4c2162e4" +"checksum gcc 0.3.54 (registry+https://github.com/rust-lang/crates.io-index)" = "5e33ec290da0d127825013597dbdfc28bee4964690c7ce1166cbc2a7bd08b1bb" +"checksum generic-array 0.7.3 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe043cf9b85297937897087de81f590361686e1ac2d4d471b45435de5dfb6a6" +"checksum hmac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bdb5aa9647ba4711e9d6968dc1c810cd23989ed435443ca962e1bf6d8b8b83ff" +"checksum httparse 1.2.4 (registry+https://github.com/rust-lang/crates.io-index)" = "c2f407128745b78abc95c0ffbe4e5d37427fdc0d45470710cfef8c44522a2e37" +"checksum hyper 0.10.13 (registry+https://github.com/rust-lang/crates.io-index)" = "368cb56b2740ebf4230520e2b90ebb0461e69034d85d1945febd9b3971426db2" +"checksum hyper 0.11.18 (registry+https://github.com/rust-lang/crates.io-index)" = "c4f9b276c87e3fc1902a8bdfcce264c3f7c8a1c35e5e0c946062739f55026664" +"checksum hyper-sync-rustls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7c6df6f419a9f116cc93b5f39a5ded1161e088a2c8424c8fcd1d4049193424a4" +"checksum hyper-tls 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9c81fa95203e2a6087242c38691a0210f23e9f3f8f944350bd676522132e2985" +"checksum idna 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "014b298351066f1512874135335d62a789ffe78a9974f94b43ed5621951eaf7d" +"checksum iovec 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dbe6e417e7d0975db6512b90796e8ce223145ac4e33c377e4a42882a0e88bb08" +"checksum iron 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1d8e17268922834707e1c29e8badbf9c712c9c43378e1b6a3388946baff10be2" +"checksum isatty 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "8f2a233726c7bb76995cec749d59582e5664823b7245d4970354408f1d79a7a2" +"checksum itoa 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8324a32baf01e2ae060e9de58ed0bc2320c9a2833491ee36cd3b4c414de4db8c" +"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d" +"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a" +"checksum lazy_static 0.2.11 (registry+https://github.com/rust-lang/crates.io-index)" = "76f033c7ad61445c5b347c7382dd1237847eb1bce590fe50365dcb33d546be73" +"checksum lazy_static 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c8f31047daa365f19be14b47c29df4f7c3b581832407daabe6ae77397619237d" +"checksum lazycell 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a6f08839bc70ef4a3fe1d566d5350f519c5912ea86be0df1740a7d247c7fc0ef" +"checksum libc 0.2.36 (registry+https://github.com/rust-lang/crates.io-index)" = "1e5d97d6708edaa407429faa671b942dc0f2727222fb6b6539bf1db936e4b121" +"checksum libflate 0.1.14 (registry+https://github.com/rust-lang/crates.io-index)" = "1a429b86418868c7ea91ee50e9170683f47fd9d94f5375438ec86ec3adb74e8e" +"checksum libsqlite3-sys 0.9.1 (registry+https://github.com/rust-lang/crates.io-index)" = "0e9eb7b8e152b6a01be6a4a2917248381875758250dc3df5d46caf9250341dda" +"checksum log 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "e19e8d5c34a3e0e2223db8e060f9e8264aeeb5c5fc64a4ee9965c062211c024b" +"checksum log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "89f010e843f2b1a31dbd316b3b8d443758bc634bed37aabade59c686d644e0a2" +"checksum matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "100aabe6b8ff4e4a7e32c1c13523379802df0772b82466207ac25b013f193376" +"checksum memchr 0.1.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d8b629fb514376c675b98c1421e80b151d3817ac42d7c667717d282761418d20" +"checksum memchr 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "148fab2e51b4f1cfc66da2a7c32981d1d3c083a803978268bb11fe4b86925e7a" +"checksum memchr 2.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "796fba70e76612589ed2ce7f45282f5af869e0fdd7cc6199fa1aa1f1d591ba9d" +"checksum migrations_internals 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "bd916de6df9ac7e811e7e1ac28e0abfebe5205f3b29a7bda9ec8a41ee980a4eb" +"checksum migrations_macros 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5a550cfd76f6cfdf15a7b541893d7c79b68277b0b309f12179211a373a56e617" +"checksum mime 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "ba626b8a6de5da682e1caa06bdb42a335aee5a84db8e5046a3e8ab17ba0a3ae0" +"checksum mime 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "e2e00e17be181010a91dbfefb01660b17311059dc8c7f48b9017677721e732bd" +"checksum mime_guess 1.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "dc7e82a15629bb4ecd9e72365bf33d1382be91e030f820edb8e2a21c02430da8" +"checksum mime_guess 2.0.0-alpha.3 (registry+https://github.com/rust-lang/crates.io-index)" = "013572795763289e14710c7b279461295f2673b2b338200c235082cd7ca9e495" +"checksum mio 0.6.13 (registry+https://github.com/rust-lang/crates.io-index)" = "7da01a5e23070d92d99b1ecd1cd0af36447c6fd44b0fe283c2db199fa136724f" +"checksum miow 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f2f3b1cf331de6896aabf6e9d55dca90356cc9960cca7eaaf408a355ae919" +"checksum modifier 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "41f5c9112cb662acd3b204077e0de5bc66305fa8df65c8019d5adb10e9ab6e58" +"checksum multipart 0.13.6 (registry+https://github.com/rust-lang/crates.io-index)" = "92f54eb45230c3aa20864ccf0c277eeaeadcf5e437e91731db498dbf7fbe0ec6" +"checksum native-tls 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "f74dbadc8b43df7864539cedb7bc91345e532fdd913cfdc23ad94f4d2d40fbc0" +"checksum net2 0.2.31 (registry+https://github.com/rust-lang/crates.io-index)" = "3a80f842784ef6c9a958b68b7516bc7e35883c614004dd94959a4dca1b716c09" +"checksum nodrop 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "9a2228dca57108069a5262f2ed8bd2e82496d2e074a06d1ccc7ce1687b6ae0a2" +"checksum num 0.1.41 (registry+https://github.com/rust-lang/crates.io-index)" = "cc4083e14b542ea3eb9b5f33ff48bd373a92d78687e74f4cc0a30caeb754f0ca" +"checksum num-integer 0.1.36 (registry+https://github.com/rust-lang/crates.io-index)" = "f8d26da319fb45674985c78f1d1caf99aa4941f785d384a2ae36d0740bc3e2fe" +"checksum num-iter 0.1.35 (registry+https://github.com/rust-lang/crates.io-index)" = "4b226df12c5a59b63569dd57fafb926d91b385dfce33d8074a412411b689d593" +"checksum num-traits 0.1.43 (registry+https://github.com/rust-lang/crates.io-index)" = "92e5113e9fd4cc14ded8e499429f396a20f98c772a47cc8622a736e1ec843c31" +"checksum num-traits 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e7de20f146db9d920c45ee8ed8f71681fd9ade71909b48c3acbd766aa504cf10" +"checksum num_cpus 1.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c51a3322e4bca9d212ad9a158a02abc6934d005490c054a2778df73a70aa0a30" +"checksum oath 0.10.2 (registry+https://github.com/rust-lang/crates.io-index)" = "ec6405dc6afe8219020d535f9ad888a12b191bbc8ce1c55f7ee663bde5be80ca" +"checksum openssl 0.9.23 (registry+https://github.com/rust-lang/crates.io-index)" = "169a4b9160baf9b9b1ab975418c673686638995ba921683a7f1e01470dcb8854" +"checksum openssl-sys 0.9.24 (registry+https://github.com/rust-lang/crates.io-index)" = "14ba54ac7d5a4eabd1d5f2c1fdeb7e7c14debfa669d94b983d01b465e767ba9e" +"checksum ordermap 0.2.13 (registry+https://github.com/rust-lang/crates.io-index)" = "b81cf3b8cb96aa0e73bbedfcdc9708d09fec2854ba8d474be4e6f666d7379e8b" +"checksum pear 0.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "b5c2dabd6c1650d9bfac8e46be7b518b31c3885ab4412de1aca330938616c5bd" +"checksum pear_codegen 0.0.12 (registry+https://github.com/rust-lang/crates.io-index)" = "df863bb78b3ee6b049278324eea8df6b2553a8db9a3504c0e32cfcc17bc8d18c" +"checksum percent-encoding 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "31010dd2e1ac33d5b46a5b413495239882813e0369f8ed8a5e266f173602f831" +"checksum phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "cb325642290f28ee14d8c6201159949a872f220c62af6e110a56ea914fbe42fc" +"checksum phf_codegen 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "d62594c0bb54c464f633175d502038177e90309daf2e0158be42ed5f023ce88f" +"checksum phf_generator 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "6b07ffcc532ccc85e3afc45865469bf5d9e4ef5bfcf9622e3cfe80c2d275ec03" +"checksum phf_shared 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)" = "07e24b0ca9643bdecd0632f2b3da6b1b89bbb0030e0b992afc1113b23a7bc2f2" +"checksum pkg-config 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "3a8b4c6b8165cd1a1cd4b9b120978131389f64bdaf456435caa41e630edba903" +"checksum plugin 0.2.6 (registry+https://github.com/rust-lang/crates.io-index)" = "1a6a0dc3910bc8db877ffed8e457763b317cf880df4ae19109b9f77d277cf6e0" +"checksum quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6e920b65c65f10b2ae65c831a81a073a89edd28c7cce89475bff467ab4167a" +"checksum r2d2 0.8.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f9078ca6a8a5568ed142083bb2f7dc9295b69d16f867ddcc9849e51b17d8db46" +"checksum r2d2-diesel 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "eb9c29bad92da76d02bc2c020452ebc3a3fe6fa74cfab91e711c43116e4fb1a3" +"checksum rand 0.3.22 (registry+https://github.com/rust-lang/crates.io-index)" = "15a732abf9d20f0ad8eeb6f909bf6868722d9a06e1e50802b6a70351f40b4eb1" +"checksum rand 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "eba5f8cb59cc50ed56be8880a5c7b496bfd9bd26394e176bc67884094145c2c5" +"checksum rayon 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a77c51c07654ddd93f6cb543c7a849863b03abc7e82591afda6dc8ad4ac3ac4a" +"checksum rayon-core 1.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e64b609139d83da75902f88fd6c01820046840a18471e4dfcd5ac7c0f46bea53" +"checksum redox_syscall 0.1.37 (registry+https://github.com/rust-lang/crates.io-index)" = "0d92eecebad22b767915e4d529f89f28ee96dbbf5a4810d2b844373f136417fd" +"checksum redox_termios 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7e891cfe48e9100a70a3b6eb652fef28920c117d366339687bd5576160db0f76" +"checksum regex 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "744554e01ccbd98fff8c457c3b092cd67af62a555a43bfe97ae8a0451f7799fa" +"checksum regex-syntax 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8e931c58b93d86f080c734bfd2bce7dd0079ae2331235818133c8be7f422e20e" +"checksum relay 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "1576e382688d7e9deecea24417e350d3062d97e32e45d70b1cde65994ff1489a" +"checksum remove_dir_all 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b5d2f806b0fcdabd98acd380dc8daef485e22bcb7cddc811d1337967f2528cf5" +"checksum reqwest 0.8.4 (registry+https://github.com/rust-lang/crates.io-index)" = "449c45f593ce9af9417c91e22f274fb8cea013bcf3d37ec1b5fb534b623bc708" +"checksum ring 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1f2a6dc7fc06a05e6de183c5b97058582e9da2de0c136eafe49609769c507724" +"checksum rocket 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "531c93452333bc5a13d3cbd776a8cac299215ba23be1583fdb307fef75ae0516" +"checksum rocket_codegen 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "a7ad25afa7baa27347981fc4d450713d1d9f7533fd5a0c4664519fe661bcd827" +"checksum rocket_contrib 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f8c65e9bac3d41a9011adb4adccc819ab4a182657eb5cd478fd0e2a3c1eb7dfe" +"checksum rustc-hex 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "0ceb8ce7a5e520de349e1fa172baeba4a9e8d5ef06c47471863530bc4972ee1e" +"checksum rustc-serialize 0.3.24 (registry+https://github.com/rust-lang/crates.io-index)" = "dcf128d1287d2ea9d80910b5f1120d0b8eede3fbf1abe91c40d39ea7d51e6fda" +"checksum rustls 0.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17727f4b991294da2c84d75a43c003151ff58072212768800f66c56ee46dca43" +"checksum safemem 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "725b3bf47ae40b4abcd27b5f0a9540369426a29f7b905649b3e1468e13e22009" +"checksum safemem 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e27a8b19b835f7aea908818e871f5cc3a5a186550c30773be987e155e8163d8f" +"checksum schannel 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "acece75e0f987c48863a6c792ec8b7d6c4177d4a027f8ccc72f849794f437016" +"checksum scheduled-thread-pool 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "1a2ff3fc5223829be817806c6441279c676e454cc7da608faf03b0ccc09d3889" +"checksum scoped-tls 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f417c22df063e9450888a7561788e9bd46d3bb3c1466435b4eccb903807f147d" +"checksum scopeguard 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "94258f53601af11e6a49f722422f6e3425c52b06245a5cf9bc09908b174f5e27" +"checksum security-framework 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "dfa44ee9c54ce5eecc9de7d5acbad112ee58755239381f687e564004ba4a2332" +"checksum security-framework-sys 0.1.16 (registry+https://github.com/rust-lang/crates.io-index)" = "5421621e836278a0b139268f36eee0dc7e389b784dc3f79d8f11aabadf41bead" +"checksum serde 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "db99f3919e20faa51bb2996057f5031d8685019b5a06139b1ce761da671b8526" +"checksum serde_derive 1.0.27 (registry+https://github.com/rust-lang/crates.io-index)" = "f4ba7591cfe93755e89eeecdbcc668885624829b020050e6aec99c2a03bd3fd0" +"checksum serde_derive_internals 0.19.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6e03f1c9530c3fb0a0a5c9b826bdd9246a5921ae995d75f512ac917fc4dd55b5" +"checksum serde_json 1.0.9 (registry+https://github.com/rust-lang/crates.io-index)" = "c9db7266c7d63a4c4b7fe8719656ccdd51acf1bed6124b174f933b009fb10bcb" +"checksum serde_urlencoded 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce0fd303af908732989354c6f02e05e2e6d597152870f2c6990efb0577137480" +"checksum sha-1 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8347606816471548cd60f0abd5ef0d513a81f5202dbdab9c09f17a15b5248484" +"checksum sha2 0.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "84920f9ac881e94e33ec89e1b3dcd36040523a308a92548e01217ce35d8cf6a8" +"checksum siphasher 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "0df90a788073e8d0235a67e50441d47db7c8ad9debd91cbf43736a2a92d36537" +"checksum slab 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "17b4fcaed89ab08ef143da37bc52adbcc04d4a69014f4c1208d6b51f0c47bc23" +"checksum slab 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fdeff4cd9ecff59ec7e3744cbca73dfe5ac35c2aedb2cfba8a1c715a18912e9d" +"checksum smallvec 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "4c8cbcd6df1e117c2210e13ab5109635ad68a929fcbb8964dc965b76cb5ee013" +"checksum smallvec 0.4.4 (registry+https://github.com/rust-lang/crates.io-index)" = "ee4f357e8cd37bf8822e1b964e96fd39e2cb5a0424f8aaa284ccaccc2162411c" +"checksum stainless 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "906ffcf8edc86f26acfe433f26329895a00f1884352c624033642d45537b4c78" +"checksum state 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "e2fe297055568778ddc83eb1d4292bcdab36bf9e5e7adf4d0ce4ee59caf778d9" +"checksum syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)" = "d3b891b9015c88c576343b9b3e41c2c11a51c219ef067b264bd9c8aa9b441dad" +"checksum synom 0.11.3 (registry+https://github.com/rust-lang/crates.io-index)" = "a393066ed9010ebaed60b9eafa373d4b1baac186dd7e008555b0f702b51945b6" +"checksum take 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b157868d8ac1f56b64604539990685fa7611d8fa9e5476cf0c02cf34d32917c5" +"checksum tempdir 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "f73eebdb68c14bcb24aef74ea96079830e7fa7b31a6106e42ea7ee887c1e134e" +"checksum termion 1.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "689a3bdfaab439fd92bc87df5c4c78417d3cbe537487274e9b0b2dce76e92096" +"checksum thread_local 0.3.5 (registry+https://github.com/rust-lang/crates.io-index)" = "279ef31c19ededf577bfd12dfae728040a21f635b06a24cd670ff510edd38963" +"checksum time 0.1.39 (registry+https://github.com/rust-lang/crates.io-index)" = "a15375f1df02096fb3317256ce2cee6a1f42fc84ea5ad5fc8c421cfe40c73098" +"checksum tiny_http 0.5.9 (registry+https://github.com/rust-lang/crates.io-index)" = "2f4d55c9a213880d1f0c89ded183f209c6e45b912ca6c7df6f93c163773572e1" +"checksum tokio-core 0.1.12 (registry+https://github.com/rust-lang/crates.io-index)" = "52b4e32d8edbf29501aabb3570f027c6ceb00ccef6538f4bddba0200503e74e8" +"checksum tokio-io 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "b9532748772222bf70297ec0e2ad0f17213b4a7dd0e6afb68e0a0768f69f4e4f" +"checksum tokio-proto 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "8fbb47ae81353c63c487030659494b295f6cb6576242f907f203473b191b0389" +"checksum tokio-service 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "24da22d077e0f15f55162bdbdc661228c1581892f52074fb242678d015b45162" +"checksum tokio-tls 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "772f4b04e560117fe3b0a53e490c16ddc8ba6ec437015d91fa385564996ed913" +"checksum toml 0.4.5 (registry+https://github.com/rust-lang/crates.io-index)" = "a7540f4ffc193e0d3c94121edb19b055670d369f77d5804db11ae053a45b6e7e" +"checksum traitobject 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "efd1f82c56340fdf16f2a953d7bda4f8fdffba13d93b00844c25572110b26079" +"checksum twoway 0.1.7 (registry+https://github.com/rust-lang/crates.io-index)" = "db65ddf5811ef1964163e55df0b0b8171e4afc8a53a606dcdb5df87be3dcc302" +"checksum typeable 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "1410f6f91f21d1612654e7cc69193b0334f909dcf2c790c4826254fbb86f8887" +"checksum typemap 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)" = "653be63c80a3296da5551e1bfd2cca35227e13cdd08c6668903ae2f4f77aa1f6" +"checksum typenum 1.9.0 (registry+https://github.com/rust-lang/crates.io-index)" = "13a99dc6780ef33c78780b826cf9d2a78840b72cae9474de4bcaf9051e60ebbd" +"checksum unicase 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7f4765f83163b74f957c797ad9253caf97f103fb064d3999aea9568d09fc8a33" +"checksum unicase 2.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "284b6d3db520d67fbe88fd778c21510d1b0ba4a551e5d0fbb023d33405f6de8a" +"checksum unicode-bidi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "49f2bd0c6468a8230e1db229cff8029217cf623c767ea5d60bfbd42729ea54d5" +"checksum unicode-normalization 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "51ccda9ef9efa3f7ef5d91e8f9b83bbe6955f9bf86aec89d5cce2c874625920f" +"checksum unicode-xid 0.0.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8c1f860d7d29cf02cb2f3f359fd35991af3d30bac52c57d265a3c461074cb4dc" +"checksum unreachable 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "382810877fe448991dfc7f0dd6e3ae5d58088fd0ea5e35189655f84e6814fa56" +"checksum unsafe-any 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f30360d7979f5e9c6e6cea48af192ea8fab4afb3cf72597154b8f08935bc9c7f" +"checksum untrusted 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "f392d7819dbe58833e26872f5f6f0d68b7bbbe90fc3667e98731c4a15ad9a7ae" +"checksum url 0.2.38 (registry+https://github.com/rust-lang/crates.io-index)" = "cbaa8377a162d88e7d15db0cf110c8523453edcbc5bc66d2b6fffccffa34a068" +"checksum url 1.6.0 (registry+https://github.com/rust-lang/crates.io-index)" = "fa35e768d4daf1d85733418a49fb42e10d7f633e394fccab4ab7aba897053fe2" +"checksum utf8-ranges 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "662fab6525a98beff2921d7f61a39e7d59e0b425ebc7d0d9e66d316e55124122" +"checksum uuid 0.1.18 (registry+https://github.com/rust-lang/crates.io-index)" = "78c590b5bd79ed10aad8fb75f078a59d8db445af6c743e55c4a53227fc01c13f" +"checksum uuid 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcc7e3b898aa6f6c08e5295b6c89258d1331e9ac578cc992fb818759951bdc22" +"checksum vcpkg 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "9e0a7d8bed3178a8fb112199d466eeca9ed09a14ba8ad67718179b4fd5487d0b" +"checksum version_check 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "6b772017e347561807c1aa192438c5fd74242a670a6cffacc40f2defd1dc069d" +"checksum void 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "6a02e4885ed3bc0f2de90ea6dd45ebcbb66dacffe03547fadbb0eeae2770887d" +"checksum webpki 0.14.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e499345fc4c6b7c79a5b8756d4592c4305510a13512e79efafe00dfbd67bbac6" +"checksum webpki-roots 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "5bfb3f50499f21ad2317f442845e3b5805b007f1e728f59885c99e61b8c181a7" +"checksum winapi 0.2.8 (registry+https://github.com/rust-lang/crates.io-index)" = "167dc9d6949a9b857f3451275e911c3f44255842c1f7a76f33c55103a909087a" +"checksum winapi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "04e3bd221fcbe8a271359c04f21a76db7d0c6028862d1bb5512d85e1e2eb5bb3" +"checksum winapi-build 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "2d315eee3b34aca4797b2da6b13ed88266e6d612562a0c46390af8299fc699bc" +"checksum winapi-i686-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" +"checksum winapi-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +"checksum ws2_32-sys 0.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d59cefebd0c892fa2dd6de581e937301d8552cb44489cdff035c6187cb63fa5e" +"checksum yansi 0.3.4 (registry+https://github.com/rust-lang/crates.io-index)" = "a503e4eea629f145a693c8ed1eddba88b3b9de5171c6ebd0e2820cf82d38f934" diff --git a/Cargo.toml b/Cargo.toml new file mode 100644 index 00000000..de307ae7 --- /dev/null +++ b/Cargo.toml @@ -0,0 +1,62 @@ +[package] +name = "bitwarden_rs" +version = "0.1.0" +authors = ["Daniel García "] + +[dependencies] + +# Test framework, similar to rspec +stainless = "0.1.12" + +# Web framework for nightly with a focus on ease-of-use, expressibility, and speed. +rocket = { version = "0.3.6", features = ["tls"] } +rocket_codegen = "0.3.6" +rocket_contrib = "0.3.6" + +# HTTP client +reqwest = "0.8.4" + +# multipart/form-data support +multipart = "0.13.6" + +# A generic serialization/deserialization framework +serde = "1.0.27" +serde_derive = "1.0.27" +serde_json = "1.0.9" + +# A safe, extensible ORM and Query builder +# If tables need more than 16 columns, add feature "large-tables" +diesel = { version = "1.1.1", features = ["sqlite", "chrono"] } +diesel_migrations = {version = "1.1.0", features = ["sqlite"] } + +# A generic connection pool +r2d2 = "0.8.2" +r2d2-diesel = "1.0.0" + +# Crypto library +ring = { version = "0.11.0", features = ["rsa_signing"]} + +# UUID generation +uuid = { version = "0.5.1", features = ["v4"] } + +# Date and time library for Rust +chrono = "0.4.0" +time = "0.1.39" + +# TOTP library +oath = "0.10.2" + +# Data encoding library +data-encoding = "2.1.1" + +# JWT library +jsonwebtoken = "4.0.0" + +# A `dotenv` implementation for Rust +dotenv = { version = "0.10.1", default-features = false } + +# Lazy static macro +lazy_static = "1.0.0" + +[patch.crates-io] +jsonwebtoken = { path = "libs/jsonwebtoken" } # Make jwt use ring 0.11, to match rocket diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 00000000..ca5707e0 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,62 @@ +# Using multistage build: +# https://docs.docker.com/develop/develop-images/multistage-build/ +# https://whitfin.io/speeding-up-rust-docker-builds/ +########################## BUILD IMAGE ########################## +# We need to use the Rust build image, because +# we need the Rust compiler and Cargo tooling +FROM rustlang/rust:nightly as build + +# Install the database libraries, in this case just sqlite3 +RUN apt-get update && \ + apt-get install -y sqlite3 + +# Install the diesel_cli tool, to manage migrations +# RUN cargo install diesel_cli --no-default-features --features sqlite + +# Creates a dummy project used to grab dependencies +RUN USER=root cargo new --bin app +WORKDIR /app + +# Copies over *only* your manifests and vendored dependencies +COPY ./Cargo.* ./ +COPY ./_libs ./_libs + +# Builds your dependencies and removes the +# dummy project, except the target folder +RUN cargo build --release +RUN find . -not -path "./target*" -delete + +# Copies the complete project +# To avoid copying unneeded files, use .dockerignore +COPY . . + +# Builds again, this time it'll just be +# your actual source files being built +RUN cargo build --release + +######################## RUNTIME IMAGE ######################## +# Create a new stage with a minimal image +# because we already have a binary built +FROM debian:stretch-slim + +# Install needed libraries +RUN apt-get update && \ + apt-get install -y sqlite3 openssl libssl-dev + +RUN mkdir /data +VOLUME /data +EXPOSE 80 + +# Copies the files from the context (migrations, web-vault, ...) +# and the binary from the "build" stage to the current stage + +# TODO Only needs web-vault and .env +# COPY . . +COPY .env . +COPY web-vault ./web-vault +COPY --from=build app/target/release/bitwarden_rs . + +# Configures the startup! +# Use production to disable Rocket logging +#CMD ROCKET_ENV=production ./bitwarden_rs +CMD ROCKET_ENV=staging ./bitwarden_rs \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 00000000..c8201c01 --- /dev/null +++ b/README.md @@ -0,0 +1,97 @@ +## Easy setup (Docker) +Install Docker to your system and then, from the project root, run: +``` +# Build the docker image: +docker build -t dani/bitwarden_rs . + +# Run the docker image with a docker volume: +docker volume create bw_data +docker run --name bitwarden_rs -it --init --rm --mount source=bw_data,target=/data -p 8000:80 dani/bitwarden_rs + +# OR, Run the docker image with a host bind, where is the absolute path to a folder in the host: +docker run --name bitwarden_rs -it --init --rm --mount type=bind,source=,target=/data -p 8000:80 dani/bitwarden_rs +``` + +## How to compile bitwarden_rs +Install `rust nightly`, in Windows the recommended way is through `rustup`. + +Install the `sqlite3`, and `openssl` libraries, in Windows the best option is Microsoft's `vcpkg`, +on other systems use their respective package managers. + +Then run: +``` +cargo run +# or +cargo build +``` + +## How to update the web-vault used +Install `node.js` and either `yarn` or `npm` (usually included with node) +Clone the web-vault outside the project: +``` +git clone https://github.com/bitwarden/web.git web-vault +``` + +Modify `web-vault/settings.json` to look like this: +```json +{ + "appSettings": { + "apiUri": "/api", + "identityUri": "/identity", + "iconsUri": "/icons", + "stripeKey": "", + "braintreeKey": "" + } +} +``` + +Then, run the following from the `web-vault` dir: +``` +# With yarn (recommended) +yarn +yarn gulp dist:selfHosted + +# With npm +npm install +npx gulp dist:selfHosted +``` + +Finally copy the contents of the `web-vault/dist` folder into the `bitwarden_rs/web-vault` folder. + +## How to create the RSA signing key for JWT +Generate the RSA key: +``` +openssl genrsa -out data/private_rsa_key.pem +``` + +Convert the generated key to .DER: +``` +openssl rsa -in data/private_rsa_key.pem -outform DER -out data/private_rsa_key.der +``` + +And generate the public key: +``` +openssl rsa -in data/private_rsa_key.der -inform DER -RSAPublicKey_out -outform DER -out data/public_rsa_key.der +``` + +## How to recreate database schemas +Install diesel-cli with cargo: +``` +cargo install diesel_cli --no-default-features --features sqlite +``` + +Make sure that the correct path to the database is in the `.env` file. + +If you want to modify the schemas, create a new migration with: +``` +diesel migration generate +``` + +Modify the *.sql files, making sure that any changes are reverted +in the down.sql file. + +Apply the migrations and save the generated schemas as follows: +``` +diesel migration redo +diesel print-schema > src/db/schema.rs +``` diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 00000000..64051dea --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,10 @@ +## Docker Compose file, experimental and untested +# Run 'docker compose up' to start the service +version: '3' +services: + web: + build: . + ports: + - "8000:80" + volumes: + - ./data:/data diff --git a/libs/jsonwebtoken/Cargo.toml b/libs/jsonwebtoken/Cargo.toml new file mode 100644 index 00000000..c3d8166b --- /dev/null +++ b/libs/jsonwebtoken/Cargo.toml @@ -0,0 +1,20 @@ +[package] +name = "jsonwebtoken" +version = "4.0.0" +authors = ["Vincent Prouillet "] +license = "MIT" +readme = "README.md" +description = "Create and parse JWT in a strongly typed way." +homepage = "https://github.com/Keats/rust-jwt" +repository = "https://github.com/Keats/rust-jwt" +keywords = ["jwt", "web", "api", "token", "json"] + +[dependencies] +error-chain = { version = "0.11", default-features = false } +serde_json = "1.0" +serde_derive = "1.0" +serde = "1.0" +ring = { version = "0.11.0", features = ["rsa_signing", "dev_urandom_fallback"] } +base64 = "0.8" +untrusted = "0.5" +chrono = "0.4" diff --git a/libs/jsonwebtoken/LICENSE b/libs/jsonwebtoken/LICENSE new file mode 100644 index 00000000..36272c3f --- /dev/null +++ b/libs/jsonwebtoken/LICENSE @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Vincent Prouillet + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/libs/jsonwebtoken/src/crypto.rs b/libs/jsonwebtoken/src/crypto.rs new file mode 100644 index 00000000..b2516b53 --- /dev/null +++ b/libs/jsonwebtoken/src/crypto.rs @@ -0,0 +1,120 @@ +use std::sync::Arc; + +use base64; +use ring::{rand, digest, hmac, signature}; +use ring::constant_time::verify_slices_are_equal; +use untrusted; + +use errors::{Result, ErrorKind}; + + +/// The algorithms supported for signing/verifying +#[derive(Debug, PartialEq, Copy, Clone, Serialize, Deserialize)] +pub enum Algorithm { + /// HMAC using SHA-256 + HS256, + /// HMAC using SHA-384 + HS384, + /// HMAC using SHA-512 + HS512, + + /// RSASSA-PKCS1-v1_5 using SHA-256 + RS256, + /// RSASSA-PKCS1-v1_5 using SHA-384 + RS384, + /// RSASSA-PKCS1-v1_5 using SHA-512 + RS512, +} + +/// The actual HS signing + encoding +fn sign_hmac(alg: &'static digest::Algorithm, key: &[u8], signing_input: &str) -> Result { + let signing_key = hmac::SigningKey::new(alg, key); + let digest = hmac::sign(&signing_key, signing_input.as_bytes()); + + Ok( + base64::encode_config::(&digest, base64::URL_SAFE_NO_PAD) + ) +} + +/// The actual RSA signing + encoding +/// Taken from Ring doc https://briansmith.org/rustdoc/ring/signature/index.html +fn sign_rsa(alg: Algorithm, key: &[u8], signing_input: &str) -> Result { + let ring_alg = match alg { + Algorithm::RS256 => &signature::RSA_PKCS1_SHA256, + Algorithm::RS384 => &signature::RSA_PKCS1_SHA384, + Algorithm::RS512 => &signature::RSA_PKCS1_SHA512, + _ => unreachable!(), + }; + + let key_pair = Arc::new( + signature::RSAKeyPair::from_der(untrusted::Input::from(key)) + .map_err(|_| ErrorKind::InvalidKey)? + ); + let mut signing_state = signature::RSASigningState::new(key_pair) + .map_err(|_| ErrorKind::InvalidKey)?; + let mut signature = vec![0; signing_state.key_pair().public_modulus_len()]; + let rng = rand::SystemRandom::new(); + signing_state.sign(ring_alg, &rng, signing_input.as_bytes(), &mut signature) + .map_err(|_| ErrorKind::InvalidKey)?; + + Ok( + base64::encode_config::<[u8]>(&signature, base64::URL_SAFE_NO_PAD) + ) +} + +/// Take the payload of a JWT, sign it using the algorithm given and return +/// the base64 url safe encoded of the result. +/// +/// Only use this function if you want to do something other than JWT. +pub fn sign(signing_input: &str, key: &[u8], algorithm: Algorithm) -> Result { + match algorithm { + Algorithm::HS256 => sign_hmac(&digest::SHA256, key, signing_input), + Algorithm::HS384 => sign_hmac(&digest::SHA384, key, signing_input), + Algorithm::HS512 => sign_hmac(&digest::SHA512, key, signing_input), + + Algorithm::RS256 | Algorithm::RS384 | Algorithm::RS512 => sign_rsa(algorithm, key, signing_input), +// TODO: if PKCS1 is made prublic, remove the line above and uncomment below +// Algorithm::RS256 => sign_rsa(&signature::RSA_PKCS1_SHA256, key, signing_input), +// Algorithm::RS384 => sign_rsa(&signature::RSA_PKCS1_SHA384, key, signing_input), +// Algorithm::RS512 => sign_rsa(&signature::RSA_PKCS1_SHA512, key, signing_input), + } +} + +/// See Ring RSA docs for more details +fn verify_rsa(alg: &signature::RSAParameters, signature: &str, signing_input: &str, key: &[u8]) -> Result { + let signature_bytes = base64::decode_config(signature, base64::URL_SAFE_NO_PAD)?; + let public_key_der = untrusted::Input::from(key); + let message = untrusted::Input::from(signing_input.as_bytes()); + let expected_signature = untrusted::Input::from(signature_bytes.as_slice()); + + let res = signature::verify(alg, public_key_der, message, expected_signature); + + Ok(res.is_ok()) +} + +/// Compares the signature given with a re-computed signature for HMAC or using the public key +/// for RSA. +/// +/// Only use this function if you want to do something other than JWT. +/// +/// `signature` is the signature part of a jwt (text after the second '.') +/// +/// `signing_input` is base64(header) + "." + base64(claims) +pub fn verify(signature: &str, signing_input: &str, key: &[u8], algorithm: Algorithm) -> Result { + match algorithm { + Algorithm::HS256 | Algorithm::HS384 | Algorithm::HS512 => { + // we just re-sign the data with the key and compare if they are equal + let signed = sign(signing_input, key, algorithm)?; + Ok(verify_slices_are_equal(signature.as_ref(), signed.as_ref()).is_ok()) + }, + Algorithm::RS256 => verify_rsa(&signature::RSA_PKCS1_2048_8192_SHA256, signature, signing_input, key), + Algorithm::RS384 => verify_rsa(&signature::RSA_PKCS1_2048_8192_SHA384, signature, signing_input, key), + Algorithm::RS512 => verify_rsa(&signature::RSA_PKCS1_2048_8192_SHA512, signature, signing_input, key), + } +} + +impl Default for Algorithm { + fn default() -> Self { + Algorithm::HS256 + } +} diff --git a/libs/jsonwebtoken/src/errors.rs b/libs/jsonwebtoken/src/errors.rs new file mode 100644 index 00000000..c0af0f79 --- /dev/null +++ b/libs/jsonwebtoken/src/errors.rs @@ -0,0 +1,68 @@ +use base64; +use serde_json; +use ring; + +error_chain! { + errors { + /// When a token doesn't have a valid JWT shape + InvalidToken { + description("invalid token") + display("Invalid token") + } + /// When the signature doesn't match + InvalidSignature { + description("invalid signature") + display("Invalid signature") + } + /// When the secret given is not a valid RSA key + InvalidKey { + description("invalid key") + display("Invalid Key") + } + + // Validation error + + /// When a token’s `exp` claim indicates that it has expired + ExpiredSignature { + description("expired signature") + display("Expired Signature") + } + /// When a token’s `iss` claim does not match the expected issuer + InvalidIssuer { + description("invalid issuer") + display("Invalid Issuer") + } + /// When a token’s `aud` claim does not match one of the expected audience values + InvalidAudience { + description("invalid audience") + display("Invalid Audience") + } + /// When a token’s `aud` claim does not match one of the expected audience values + InvalidSubject { + description("invalid subject") + display("Invalid Subject") + } + /// When a token’s `iat` claim is in the future + InvalidIssuedAt { + description("invalid issued at") + display("Invalid Issued At") + } + /// When a token’s nbf claim represents a time in the future + ImmatureSignature { + description("immature signature") + display("Immature Signature") + } + /// When the algorithm in the header doesn't match the one passed to `decode` + InvalidAlgorithm { + description("Invalid algorithm") + display("Invalid Algorithm") + } + } + + foreign_links { + Unspecified(ring::error::Unspecified) #[doc = "An error happened while signing/verifying a token with RSA"]; + Base64(base64::DecodeError) #[doc = "An error happened while decoding some base64 text"]; + Json(serde_json::Error) #[doc = "An error happened while serializing/deserializing JSON"]; + Utf8(::std::string::FromUtf8Error) #[doc = "An error happened while trying to convert the result of base64 decoding to a String"]; + } +} diff --git a/libs/jsonwebtoken/src/header.rs b/libs/jsonwebtoken/src/header.rs new file mode 100644 index 00000000..042149c6 --- /dev/null +++ b/libs/jsonwebtoken/src/header.rs @@ -0,0 +1,64 @@ +use crypto::Algorithm; + + +/// A basic JWT header, the alg defaults to HS256 and typ is automatically +/// set to `JWT`. All the other fields are optional. +#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)] +pub struct Header { + /// The type of JWS: it can only be "JWT" here + /// + /// Defined in [RFC7515#4.1.9](https://tools.ietf.org/html/rfc7515#section-4.1.9). + #[serde(skip_serializing_if = "Option::is_none")] + pub typ: Option, + /// The algorithm used + /// + /// Defined in [RFC7515#4.1.1](https://tools.ietf.org/html/rfc7515#section-4.1.1). + pub alg: Algorithm, + /// Content type + /// + /// Defined in [RFC7519#5.2](https://tools.ietf.org/html/rfc7519#section-5.2). + #[serde(skip_serializing_if = "Option::is_none")] + pub cty: Option, + /// JSON Key URL + /// + /// Defined in [RFC7515#4.1.2](https://tools.ietf.org/html/rfc7515#section-4.1.2). + #[serde(skip_serializing_if = "Option::is_none")] + pub jku: Option, + /// Key ID + /// + /// Defined in [RFC7515#4.1.4](https://tools.ietf.org/html/rfc7515#section-4.1.4). + #[serde(skip_serializing_if = "Option::is_none")] + pub kid: Option, + /// X.509 URL + /// + /// Defined in [RFC7515#4.1.5](https://tools.ietf.org/html/rfc7515#section-4.1.5). + #[serde(skip_serializing_if = "Option::is_none")] + pub x5u: Option, + /// X.509 certificate thumbprint + /// + /// Defined in [RFC7515#4.1.7](https://tools.ietf.org/html/rfc7515#section-4.1.7). + #[serde(skip_serializing_if = "Option::is_none")] + pub x5t: Option, +} + +impl Header { + /// Returns a JWT header with the algorithm given + pub fn new(algorithm: Algorithm) -> Header { + Header { + typ: Some("JWT".to_string()), + alg: algorithm, + cty: None, + jku: None, + kid: None, + x5u: None, + x5t: None, + } + } +} + +impl Default for Header { + /// Returns a JWT header using the default Algorithm, HS256 + fn default() -> Self { + Header::new(Algorithm::default()) + } +} diff --git a/libs/jsonwebtoken/src/lib.rs b/libs/jsonwebtoken/src/lib.rs new file mode 100644 index 00000000..2f1f4ab3 --- /dev/null +++ b/libs/jsonwebtoken/src/lib.rs @@ -0,0 +1,140 @@ +//! Create and parses JWT (JSON Web Tokens) +//! +//! Documentation: [stable](https://docs.rs/jsonwebtoken/) +#![recursion_limit = "300"] +#![deny(missing_docs)] + +#[macro_use] +extern crate error_chain; +#[macro_use] +extern crate serde_derive; +extern crate serde_json; +extern crate serde; +extern crate base64; +extern crate ring; +extern crate untrusted; +extern crate chrono; + +/// All the errors, generated using error-chain +pub mod errors; +mod header; +mod crypto; +mod serialization; +mod validation; + +pub use header::Header; +pub use crypto::{ + Algorithm, + sign, + verify, +}; +pub use validation::Validation; +pub use serialization::TokenData; + + +use serde::de::DeserializeOwned; +use serde::ser::Serialize; + +use errors::{Result, ErrorKind}; +use serialization::{from_jwt_part, from_jwt_part_claims, to_jwt_part}; +use validation::{validate}; + + +/// Encode the header and claims given and sign the payload using the algorithm from the header and the key +/// +/// ```rust,ignore +/// #[macro_use] +/// extern crate serde_derive; +/// use jsonwebtoken::{encode, Algorithm, Header}; +/// +/// /// #[derive(Debug, Serialize, Deserialize)] +/// struct Claims { +/// sub: String, +/// company: String +/// } +/// +/// let my_claims = Claims { +/// sub: "b@b.com".to_owned(), +/// company: "ACME".to_owned() +/// }; +/// +/// // my_claims is a struct that implements Serialize +/// // This will create a JWT using HS256 as algorithm +/// let token = encode(&Header::default(), &my_claims, "secret".as_ref()).unwrap(); +/// ``` +pub fn encode(header: &Header, claims: &T, key: &[u8]) -> Result { + let encoded_header = to_jwt_part(&header)?; + let encoded_claims = to_jwt_part(&claims)?; + let signing_input = [encoded_header.as_ref(), encoded_claims.as_ref()].join("."); + let signature = sign(&*signing_input, key.as_ref(), header.alg)?; + + Ok([signing_input, signature].join(".")) +} + +/// Used in decode: takes the result of a rsplit and ensure we only get 2 parts +/// Errors if we don't +macro_rules! expect_two { + ($iter:expr) => {{ + let mut i = $iter; + match (i.next(), i.next(), i.next()) { + (Some(first), Some(second), None) => (first, second), + _ => return Err(ErrorKind::InvalidToken.into()) + } + }} +} + +/// Decode a token into a struct containing 2 fields: `claims` and `header`. +/// +/// If the token or its signature is invalid or the claims fail validation, it will return an error. +/// +/// ```rust,ignore +/// #[macro_use] +/// extern crate serde_derive; +/// use jsonwebtoken::{decode, Validation, Algorithm}; +/// +/// #[derive(Debug, Serialize, Deserialize)] +/// struct Claims { +/// sub: String, +/// company: String +/// } +/// +/// let token = "a.jwt.token".to_string(); +/// // Claims is a struct that implements Deserialize +/// let token_data = decode::(&token, "secret", &Validation::new(Algorithm::HS256)); +/// ``` +pub fn decode(token: &str, key: &[u8], validation: &Validation) -> Result> { + let (signature, signing_input) = expect_two!(token.rsplitn(2, '.')); + let (claims, header) = expect_two!(signing_input.rsplitn(2, '.')); + let header: Header = from_jwt_part(header)?; + + if !verify(signature, signing_input, key, header.alg)? { + return Err(ErrorKind::InvalidSignature.into()); + } + + if !validation.algorithms.contains(&header.alg) { + return Err(ErrorKind::InvalidAlgorithm.into()); + } + + let (decoded_claims, claims_map): (T, _) = from_jwt_part_claims(claims)?; + + validate(&claims_map, validation)?; + + Ok(TokenData { header: header, claims: decoded_claims }) +} + +/// Decode a token and return the Header. This is not doing any kind of validation: it is meant to be +/// used when you don't know which `alg` the token is using and want to find out. +/// +/// If the token has an invalid format, it will return an error. +/// +/// ```rust,ignore +/// use jsonwebtoken::decode_header; +/// +/// let token = "a.jwt.token".to_string(); +/// let header = decode_header(&token); +/// ``` +pub fn decode_header(token: &str) -> Result
{ + let (_, signing_input) = expect_two!(token.rsplitn(2, '.')); + let (_, header) = expect_two!(signing_input.rsplitn(2, '.')); + from_jwt_part(header) +} diff --git a/libs/jsonwebtoken/src/serialization.rs b/libs/jsonwebtoken/src/serialization.rs new file mode 100644 index 00000000..60dd9fb9 --- /dev/null +++ b/libs/jsonwebtoken/src/serialization.rs @@ -0,0 +1,42 @@ +use base64; +use serde::de::DeserializeOwned; +use serde::ser::Serialize; +use serde_json::{from_str, to_string, Value}; +use serde_json::map::Map; + +use errors::{Result}; +use header::Header; + + +/// The return type of a successful call to decode +#[derive(Debug)] +pub struct TokenData { + /// The decoded JWT header + pub header: Header, + /// The decoded JWT claims + pub claims: T +} + +/// Serializes to JSON and encodes to base64 +pub fn to_jwt_part(input: &T) -> Result { + let encoded = to_string(input)?; + Ok(base64::encode_config(encoded.as_bytes(), base64::URL_SAFE_NO_PAD)) +} + +/// Decodes from base64 and deserializes from JSON to a struct +pub fn from_jwt_part, T: DeserializeOwned>(encoded: B) -> Result { + let decoded = base64::decode_config(encoded.as_ref(), base64::URL_SAFE_NO_PAD)?; + let s = String::from_utf8(decoded)?; + + Ok(from_str(&s)?) +} + +/// Decodes from base64 and deserializes from JSON to a struct AND a hashmap +pub fn from_jwt_part_claims, T: DeserializeOwned>(encoded: B) -> Result<(T, Map)> { + let decoded = base64::decode_config(encoded.as_ref(), base64::URL_SAFE_NO_PAD)?; + let s = String::from_utf8(decoded)?; + + let claims: T = from_str(&s)?; + let map: Map<_,_> = from_str(&s)?; + Ok((claims, map)) +} diff --git a/libs/jsonwebtoken/src/validation.rs b/libs/jsonwebtoken/src/validation.rs new file mode 100644 index 00000000..7025b913 --- /dev/null +++ b/libs/jsonwebtoken/src/validation.rs @@ -0,0 +1,377 @@ +use chrono::Utc; +use serde::ser::Serialize; +use serde_json::{Value, from_value, to_value}; +use serde_json::map::Map; + +use errors::{Result, ErrorKind}; +use crypto::Algorithm; + + +/// Contains the various validations that are applied after decoding a token. +/// +/// All time validation happen on UTC timestamps. +/// +/// ```rust +/// use jsonwebtoken::Validation; +/// +/// // Default value +/// let validation = Validation::default(); +/// +/// // Changing one parameter +/// let mut validation = Validation {leeway: 60, ..Default::default()}; +/// +/// // Setting audience +/// let mut validation = Validation::default(); +/// validation.set_audience(&"Me"); // string +/// validation.set_audience(&["Me", "You"]); // array of strings +/// ``` +#[derive(Debug, Clone, PartialEq)] +pub struct Validation { + /// Add some leeway (in seconds) to the `exp`, `iat` and `nbf` validation to + /// account for clock skew. + /// + /// Defaults to `0`. + pub leeway: i64, + /// Whether to validate the `exp` field. + /// + /// It will return an error if the time in the `exp` field is past. + /// + /// Defaults to `true`. + pub validate_exp: bool, + /// Whether to validate the `iat` field. + /// + /// It will return an error if the time in the `iat` field is in the future. + /// + /// Defaults to `true`. + pub validate_iat: bool, + /// Whether to validate the `nbf` field. + /// + /// It will return an error if the current timestamp is before the time in the `nbf` field. + /// + /// Defaults to `true`. + pub validate_nbf: bool, + /// If it contains a value, the validation will check that the `aud` field is the same as the + /// one provided and will error otherwise. + /// Since `aud` can be either a String or a Vec in the JWT spec, you will need to use + /// the [set_audience](struct.Validation.html#method.set_audience) method to set it. + /// + /// Defaults to `None`. + pub aud: Option, + /// If it contains a value, the validation will check that the `iss` field is the same as the + /// one provided and will error otherwise. + /// + /// Defaults to `None`. + pub iss: Option, + /// If it contains a value, the validation will check that the `sub` field is the same as the + /// one provided and will error otherwise. + /// + /// Defaults to `None`. + pub sub: Option, + /// If it contains a value, the validation will check that the `alg` of the header is contained + /// in the ones provided and will error otherwise. + /// + /// Defaults to `vec![Algorithm::HS256]`. + pub algorithms: Vec, +} + +impl Validation { + /// Create a default validation setup allowing the given alg + pub fn new(alg: Algorithm) -> Validation { + let mut validation = Validation::default(); + validation.algorithms = vec![alg]; + validation + } + + /// Since `aud` can be either a String or an array of String in the JWT spec, this method will take + /// care of serializing the value. + pub fn set_audience(&mut self, audience: &T) { + self.aud = Some(to_value(audience).unwrap()); + } +} + +impl Default for Validation { + fn default() -> Validation { + Validation { + leeway: 0, + + validate_exp: true, + validate_iat: true, + validate_nbf: true, + + iss: None, + sub: None, + aud: None, + + algorithms: vec![Algorithm::HS256], + } + } +} + + + +pub fn validate(claims: &Map, options: &Validation) -> Result<()> { + let now = Utc::now().timestamp(); + + if let Some(iat) = claims.get("iat") { + if options.validate_iat && from_value::(iat.clone())? > now + options.leeway { + return Err(ErrorKind::InvalidIssuedAt.into()); + } + } + + if let Some(exp) = claims.get("exp") { + if options.validate_exp && from_value::(exp.clone())? < now - options.leeway { + return Err(ErrorKind::ExpiredSignature.into()); + } + } + + if let Some(nbf) = claims.get("nbf") { + if options.validate_nbf && from_value::(nbf.clone())? > now + options.leeway { + return Err(ErrorKind::ImmatureSignature.into()); + } + } + + if let Some(iss) = claims.get("iss") { + if let Some(ref correct_iss) = options.iss { + if from_value::(iss.clone())? != *correct_iss { + return Err(ErrorKind::InvalidIssuer.into()); + } + } + } + + if let Some(sub) = claims.get("sub") { + if let Some(ref correct_sub) = options.sub { + if from_value::(sub.clone())? != *correct_sub { + return Err(ErrorKind::InvalidSubject.into()); + } + } + } + + if let Some(aud) = claims.get("aud") { + if let Some(ref correct_aud) = options.aud { + if aud != correct_aud { + return Err(ErrorKind::InvalidAudience.into()); + } + } + } + + Ok(()) +} + + +#[cfg(test)] +mod tests { + use serde_json::{to_value}; + use serde_json::map::Map; + use chrono::Utc; + + use super::{validate, Validation}; + + use errors::ErrorKind; + + #[test] + fn iat_in_past_ok() { + let mut claims = Map::new(); + claims.insert("iat".to_string(), to_value(Utc::now().timestamp() - 10000).unwrap()); + let res = validate(&claims, &Validation::default()); + assert!(res.is_ok()); + } + + #[test] + fn iat_in_future_fails() { + let mut claims = Map::new(); + claims.insert("iat".to_string(), to_value(Utc::now().timestamp() + 100000).unwrap()); + let res = validate(&claims, &Validation::default()); + assert!(res.is_err()); + + match res.unwrap_err().kind() { + &ErrorKind::InvalidIssuedAt => (), + _ => assert!(false), + }; + } + + #[test] + fn iat_in_future_but_in_leeway_ok() { + let mut claims = Map::new(); + claims.insert("iat".to_string(), to_value(Utc::now().timestamp() + 50).unwrap()); + let validation = Validation { + leeway: 1000 * 60, + ..Default::default() + }; + let res = validate(&claims, &validation); + assert!(res.is_ok()); + } + + #[test] + fn exp_in_future_ok() { + let mut claims = Map::new(); + claims.insert("exp".to_string(), to_value(Utc::now().timestamp() + 10000).unwrap()); + let res = validate(&claims, &Validation::default()); + assert!(res.is_ok()); + } + + #[test] + fn exp_in_past_fails() { + let mut claims = Map::new(); + claims.insert("exp".to_string(), to_value(Utc::now().timestamp() - 100000).unwrap()); + let res = validate(&claims, &Validation::default()); + assert!(res.is_err()); + + match res.unwrap_err().kind() { + &ErrorKind::ExpiredSignature => (), + _ => assert!(false), + }; + } + + #[test] + fn exp_in_past_but_in_leeway_ok() { + let mut claims = Map::new(); + claims.insert("exp".to_string(), to_value(Utc::now().timestamp() - 500).unwrap()); + let validation = Validation { + leeway: 1000 * 60, + ..Default::default() + }; + let res = validate(&claims, &validation); + assert!(res.is_ok()); + } + + #[test] + fn nbf_in_past_ok() { + let mut claims = Map::new(); + claims.insert("nbf".to_string(), to_value(Utc::now().timestamp() - 10000).unwrap()); + let res = validate(&claims, &Validation::default()); + assert!(res.is_ok()); + } + + #[test] + fn nbf_in_future_fails() { + let mut claims = Map::new(); + claims.insert("nbf".to_string(), to_value(Utc::now().timestamp() + 100000).unwrap()); + let res = validate(&claims, &Validation::default()); + assert!(res.is_err()); + + match res.unwrap_err().kind() { + &ErrorKind::ImmatureSignature => (), + _ => assert!(false), + }; + } + + #[test] + fn nbf_in_future_but_in_leeway_ok() { + let mut claims = Map::new(); + claims.insert("nbf".to_string(), to_value(Utc::now().timestamp() + 500).unwrap()); + let validation = Validation { + leeway: 1000 * 60, + ..Default::default() + }; + let res = validate(&claims, &validation); + assert!(res.is_ok()); + } + + #[test] + fn iss_ok() { + let mut claims = Map::new(); + claims.insert("iss".to_string(), to_value("Keats").unwrap()); + let validation = Validation { + iss: Some("Keats".to_string()), + ..Default::default() + }; + let res = validate(&claims, &validation); + assert!(res.is_ok()); + } + + #[test] + fn iss_not_matching_fails() { + let mut claims = Map::new(); + claims.insert("iss".to_string(), to_value("Hacked").unwrap()); + let validation = Validation { + iss: Some("Keats".to_string()), + ..Default::default() + }; + let res = validate(&claims, &validation); + assert!(res.is_err()); + + match res.unwrap_err().kind() { + &ErrorKind::InvalidIssuer => (), + _ => assert!(false), + }; + } + + #[test] + fn sub_ok() { + let mut claims = Map::new(); + claims.insert("sub".to_string(), to_value("Keats").unwrap()); + let validation = Validation { + sub: Some("Keats".to_string()), + ..Default::default() + }; + let res = validate(&claims, &validation); + assert!(res.is_ok()); + } + + #[test] + fn sub_not_matching_fails() { + let mut claims = Map::new(); + claims.insert("sub".to_string(), to_value("Hacked").unwrap()); + let validation = Validation { + sub: Some("Keats".to_string()), + ..Default::default() + }; + let res = validate(&claims, &validation); + assert!(res.is_err()); + + match res.unwrap_err().kind() { + &ErrorKind::InvalidSubject => (), + _ => assert!(false), + }; + } + + #[test] + fn aud_string_ok() { + let mut claims = Map::new(); + claims.insert("aud".to_string(), to_value("Everyone").unwrap()); + let mut validation = Validation::default(); + validation.set_audience(&"Everyone"); + let res = validate(&claims, &validation); + assert!(res.is_ok()); + } + + #[test] + fn aud_array_of_string_ok() { + let mut claims = Map::new(); + claims.insert("aud".to_string(), to_value(["UserA", "UserB"]).unwrap()); + let mut validation = Validation::default(); + validation.set_audience(&["UserA", "UserB"]); + let res = validate(&claims, &validation); + assert!(res.is_ok()); + } + + #[test] + fn aud_type_mismatch_fails() { + let mut claims = Map::new(); + claims.insert("aud".to_string(), to_value("Everyone").unwrap()); + let mut validation = Validation::default(); + validation.set_audience(&["UserA", "UserB"]); + let res = validate(&claims, &validation); + assert!(res.is_err()); + + match res.unwrap_err().kind() { + &ErrorKind::InvalidAudience => (), + _ => assert!(false), + }; + } + + #[test] + fn aud_correct_type_not_matching_fails() { + let mut claims = Map::new(); + claims.insert("aud".to_string(), to_value("Everyone").unwrap()); + let mut validation = Validation::default(); + validation.set_audience(&"None"); + let res = validate(&claims, &validation); + assert!(res.is_err()); + + match res.unwrap_err().kind() { + &ErrorKind::InvalidAudience => (), + _ => assert!(false), + }; + } +} diff --git a/migrations/2018-01-14-171611_create_tables/down.sql b/migrations/2018-01-14-171611_create_tables/down.sql new file mode 100644 index 00000000..3d258d2f --- /dev/null +++ b/migrations/2018-01-14-171611_create_tables/down.sql @@ -0,0 +1,7 @@ +DROP TABLE users; + +DROP TABLE devices; + +DROP TABLE ciphers; + +DROP TABLE folders; \ No newline at end of file diff --git a/migrations/2018-01-14-171611_create_tables/up.sql b/migrations/2018-01-14-171611_create_tables/up.sql new file mode 100644 index 00000000..6f4d31fa --- /dev/null +++ b/migrations/2018-01-14-171611_create_tables/up.sql @@ -0,0 +1,50 @@ +CREATE TABLE users ( + uuid TEXT NOT NULL PRIMARY KEY, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + email TEXT UNIQUE NOT NULL, + name TEXT NOT NULL, + password_hash BLOB NOT NULL, + salt BLOB NOT NULL, + password_iterations INTEGER NOT NULL, + password_hint TEXT, + key TEXT NOT NULL, + private_key TEXT, + public_key TEXT, + totp_secret TEXT, + totp_recover TEXT, + security_stamp TEXT NOT NULL +); + +CREATE TABLE devices ( + uuid TEXT NOT NULL PRIMARY KEY, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + user_uuid TEXT NOT NULL REFERENCES users (uuid), + name TEXT NOT NULL, + type INTEGER NOT NULL, + push_token TEXT UNIQUE, + refresh_token TEXT UNIQUE NOT NULL +); + +CREATE TABLE ciphers ( + uuid TEXT NOT NULL PRIMARY KEY, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + user_uuid TEXT NOT NULL REFERENCES users (uuid), + folder_uuid TEXT REFERENCES folders (uuid), + organization_uuid TEXT, + type INTEGER NOT NULL, + data TEXT NOT NULL, + favorite BOOLEAN NOT NULL, + attachments BLOB +); + +CREATE TABLE folders ( + uuid TEXT NOT NULL PRIMARY KEY, + created_at DATETIME NOT NULL, + updated_at DATETIME NOT NULL, + user_uuid TEXT NOT NULL REFERENCES users (uuid), + name TEXT NOT NULL +); + \ No newline at end of file diff --git a/src/api/core/accounts.rs b/src/api/core/accounts.rs new file mode 100644 index 00000000..9a0bd47d --- /dev/null +++ b/src/api/core/accounts.rs @@ -0,0 +1,149 @@ +use rocket::Route; +use rocket::response::status::BadRequest; + +use rocket_contrib::{Json, Value}; + +use db::DbConn; +use db::models::*; +use util; + +use auth::Headers; + +use CONFIG; + +#[derive(Deserialize, Debug)] +#[allow(non_snake_case)] +struct RegisterData { + email: String, + key: String, + keys: Option, + masterPasswordHash: String, + masterPasswordHint: Option, + name: Option, +} + +#[derive(Deserialize, Debug)] +#[allow(non_snake_case)] +struct KeysData { + encryptedPrivateKey: String, + publicKey: String, +} + +#[post("/accounts/register", data = "")] +fn register(data: Json, conn: DbConn) -> Result<(), BadRequest> { + if CONFIG.signups_allowed { + err!(format!("Signups not allowed")) + } + println!("DEBUG - {:#?}", data); + + if let Some(_) = User::find_by_mail(&data.email, &conn) { + err!("Email already exists") + } + + let mut user = User::new(data.email.clone(), + data.key.clone(), + data.masterPasswordHash.clone()); + + // Add extra fields if present + if let Some(name) = data.name.clone() { + user.name = name; + } + + if let Some(hint) = data.masterPasswordHint.clone() { + user.password_hint = Some(hint); + } + + if let Some(ref keys) = data.keys { + user.private_key = Some(keys.encryptedPrivateKey.clone()); + user.public_key = Some(keys.publicKey.clone()); + } + + user.save(&conn); + + Ok(()) +} + +#[get("/accounts/profile")] +fn profile(headers: Headers, conn: DbConn) -> Result> { + Ok(Json(headers.user.to_json())) +} + +#[post("/accounts/keys", data = "")] +fn post_keys(data: Json, headers: Headers, conn: DbConn) -> Result> { + let mut user = headers.user; + + user.private_key = Some(data.encryptedPrivateKey.clone()); + user.public_key = Some(data.publicKey.clone()); + + user.save(&conn); + + Ok(Json(user.to_json())) +} + +#[post("/accounts/password", data = "")] +fn post_password(data: Json, headers: Headers, conn: DbConn) -> Result> { + let key = data["key"].as_str().unwrap(); + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + let new_password_hash = data["newMasterPasswordHash"].as_str().unwrap(); + + let mut user = headers.user; + + if !user.check_valid_password(password_hash) { + err!("Invalid password") + } + + user.set_password(new_password_hash); + user.key = key.to_string(); + + user.save(&conn); + + Ok(Json(json!({}))) +} + +#[post("/accounts/security-stamp", data = "")] +fn post_sstamp(data: Json, headers: Headers, conn: DbConn) -> Result> { + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + + let mut user = headers.user; + + if !user.check_valid_password(password_hash) { + err!("Invalid password") + } + + user.reset_security_stamp(); + + Ok(Json(json!({}))) +} + +#[post("/accounts/email-token", data = "")] +fn post_email(data: Json, headers: Headers, conn: DbConn) -> Result> { + println!("{:#?}", data); + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + + let mut user = headers.user; + + if !user.check_valid_password(password_hash) { + err!("Invalid password") + } + + err!("Not implemented") +} + +#[post("/accounts/delete", data = "")] +fn delete_account(data: Json, headers: Headers, conn: DbConn) -> Result> { + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + + let mut user = headers.user; + + if !user.check_valid_password(password_hash) { + err!("Invalid password") + } + + err!("Not implemented") +} + +#[get("/accounts/revision-date")] +fn revision_date(headers: Headers, conn: DbConn) -> Result> { + let revision_date = headers.user.updated_at.timestamp(); + Ok(revision_date.to_string()) +} diff --git a/src/api/core/ciphers.rs b/src/api/core/ciphers.rs new file mode 100644 index 00000000..c5c17052 --- /dev/null +++ b/src/api/core/ciphers.rs @@ -0,0 +1,251 @@ +use std::io::{Cursor, Read}; + +use rocket::{Route, Data}; +use rocket::http::ContentType; +use rocket::response::status::BadRequest; + +use rocket_contrib::{Json, Value}; + +use multipart::server::Multipart; + +use db::DbConn; +use db::models::*; +use util; + +use auth::Headers; + +#[get("/sync")] +fn sync(headers: Headers, conn: DbConn) -> Result> { + let user = headers.user; + + let folders = Folder::find_by_user(&user.uuid, &conn); + let folders_json: Vec = folders.iter().map(|c| c.to_json()).collect(); + + let ciphers = Cipher::find_by_user(&user.uuid, &conn); + let ciphers_json: Vec = ciphers.iter().map(|c| c.to_json()).collect(); + + Ok(Json(json!({ + "Profile": user.to_json(), + "Folders": folders_json, + "Ciphers": ciphers_json, + "Domains": { + "EquivalentDomains": [], + "GlobalEquivalentDomains": [], + "Object": "domains", + }, + "Object": "sync" + }))) +} + + +#[get("/ciphers")] +fn get_ciphers(headers: Headers, conn: DbConn) -> Result> { + let ciphers = Cipher::find_by_user(&headers.user.uuid, &conn); + + let ciphers_json: Vec = ciphers.iter().map(|c| c.to_json()).collect(); + + Ok(Json(json!({ + "Data": ciphers_json, + "Object": "list", + }))) +} + +#[get("/ciphers/")] +fn get_cipher(uuid: String, headers: Headers, conn: DbConn) -> Result> { + let cipher = match Cipher::find_by_uuid(&uuid, &conn) { + Some(cipher) => cipher, + None => err!("Cipher doesn't exist") + }; + + if cipher.user_uuid != headers.user.uuid { + err!("Cipher is now owned by user") + } + + Ok(Json(cipher.to_json())) +} + +#[derive(Deserialize, Debug)] +#[allow(non_snake_case)] +struct CipherData { + #[serde(rename = "type")] + type_: i32, + folderId: Option, + organizationId: Option, + name: Option, + notes: Option, + favorite: Option, + login: Option, + card: Option, + fields: Option>, +} + +#[post("/ciphers", data = "")] +fn post_ciphers(data: Json, headers: Headers, conn: DbConn) -> Result> { + let mut cipher = Cipher::new(headers.user.uuid.clone(), + data.type_, + data.favorite.unwrap_or(false)); + + if let Some(ref folder_id) = data.folderId { + // TODO: Validate folder is owned by user + cipher.folder_uuid = Some(folder_id.clone()); + } + + if let Some(ref org_id) = data.organizationId { + cipher.organization_uuid = Some(org_id.clone()); + } + + cipher.data = match value_from_data(&data) { + Ok(value) => { + use serde_json; + println!("--- {:?}", serde_json::to_string(&value)); + println!("--- {:?}", value.to_string()); + + value.to_string() + } + Err(msg) => err!(msg) + }; + + cipher.save(&conn); + + Ok(Json(cipher.to_json())) +} + +fn value_from_data(data: &CipherData) -> Result { + let mut values = json!({ + "Name": data.name, + "Notes": data.notes + }); + + match data.type_ { + 1 /*Login*/ => { + let login_data = match data.login { + Some(ref login) => login.clone(), + None => return Err("Login data missing") + }; + + if !copy_values(&login_data, &mut values) { + return Err("Login data invalid"); + } + } + 3 /*Card*/ => { + let card_data = match data.card { + Some(ref card) => card.clone(), + None => return Err("Card data missing") + }; + + if !copy_values(&card_data, &mut values) { + return Err("Card data invalid"); + } + } + _ => return Err("Unknown type") + } + + if let Some(ref fields) = data.fields { + values["Fields"] = Value::Array(fields.iter().map(|f| { + use std::collections::BTreeMap; + use serde_json; + + let empty_map: BTreeMap = BTreeMap::new(); + let mut value = serde_json::to_value(empty_map).unwrap(); + + copy_values(&f, &mut value); + + value + }).collect()); + } else { + values["Fields"] = Value::Null; + } + + Ok(values) +} + +fn copy_values(from: &Value, to: &mut Value) -> bool { + let map = match from.as_object() { + Some(map) => map, + None => return false + }; + + for (key, val) in map { + to[util::upcase_first(key)] = val.clone(); + } + + true +} + +#[post("/ciphers/import", data = "")] +fn post_ciphers_import(data: Json, headers: Headers, conn: DbConn) -> Result> { + println!("{:#?}", data); + err!("Not implemented") +} + +#[post("/ciphers//attachment", format = "multipart/form-data", data = "")] +fn post_attachment(uuid: String, data: Data, content_type: &ContentType, headers: Headers, conn: DbConn) -> Result> { + // TODO: Check if cipher exists + + let mut params = content_type.params(); + let boundary_pair = params.next().expect("No boundary provided"); // ("boundary", "----WebKitFormBoundary...") + let boundary = boundary_pair.1; + + use data_encoding::BASE64URL; + use crypto; + use CONFIG; + + // TODO: Maybe use the same format as the official server? + let attachment_id = BASE64URL.encode(&crypto::get_random_64()); + let path = format!("{}/{}/{}", CONFIG.attachments_folder, + headers.user.uuid, attachment_id); + println!("Path {:#?}", path); + + let mut mp = Multipart::with_body(data.open(), boundary); + match mp.save().with_dir(path).into_entries() { + Some(entries) => { + println!("Entries {:#?}", entries); + + let saved_file = &entries.files["data"][0]; // Only one file at a time + let file_name = &saved_file.filename; // This is provided by the client, don't trust it + let file_size = &saved_file.size; + } + None => err!("No data entries") + } + + err!("Not implemented") +} + +#[delete("/ciphers//attachment/")] +fn delete_attachment(uuid: String, attachment_id: String, headers: Headers, conn: DbConn) -> Result> { + if uuid != headers.user.uuid { + err!("Permission denied") + } + + // Delete file + + // Delete entry in cipher + + err!("Not implemented") +} + +#[post("/ciphers/")] +fn post_cipher(uuid: String, headers: Headers, conn: DbConn) -> Result> { + put_cipher(uuid, headers, conn) +} + +#[put("/ciphers/")] +fn put_cipher(uuid: String, headers: Headers, conn: DbConn) -> Result> { err!("Not implemented") } + +#[delete("/ciphers/")] +fn delete_cipher(uuid: String, headers: Headers, conn: DbConn) -> Result> { err!("Not implemented") } + +#[post("/ciphers/delete", data = "")] +fn delete_all(data: Json, headers: Headers, conn: DbConn) -> Result> { + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + + let user = headers.user; + + if !user.check_valid_password(password_hash) { + err!("Invalid password") + } + + // Cipher::delete_from_user(&conn); + + err!("Not implemented") +} diff --git a/src/api/core/folders.rs b/src/api/core/folders.rs new file mode 100644 index 00000000..23054aa8 --- /dev/null +++ b/src/api/core/folders.rs @@ -0,0 +1,102 @@ +use rocket::Route; +use rocket::response::status::BadRequest; + +use rocket_contrib::{Json, Value}; + +use db::DbConn; +use db::models::*; +use util; + +use auth::Headers; + +#[get("/folders")] +fn get_folders(headers: Headers, conn: DbConn) -> Result> { + let folders = Folder::find_by_user(&headers.user.uuid, &conn); + + let folders_json: Vec = folders.iter().map(|c| c.to_json()).collect(); + + Ok(Json(json!({ + "Data": folders_json, + "Object": "list", + }))) +} + +#[get("/folders/")] +fn get_folder(uuid: String, headers: Headers, conn: DbConn) -> Result> { + let mut folder = match Folder::find_by_uuid(&uuid, &conn) { + Some(folder) => folder, + _ => err!("Invalid folder") + }; + + if folder.user_uuid != headers.user.uuid { + err!("Folder belongs to another user") + } + + Ok(Json(folder.to_json())) +} + +#[post("/folders", data = "")] +fn post_folders(data: Json, headers: Headers, conn: DbConn) -> Result> { + let name = &data["name"].as_str(); + + if name.is_none() { + err!("Invalid name") + } + + let folder = Folder::new(headers.user.uuid.clone(), name.unwrap().into()); + + folder.save(&conn); + + Ok(Json(folder.to_json())) +} + +#[post("/folders/", data = "")] +fn post_folder(uuid: String, data: Json, headers: Headers, conn: DbConn) -> Result> { + put_folder(uuid, data, headers, conn) +} + +#[put("/folders/", data = "")] +fn put_folder(uuid: String, data: Json, headers: Headers, conn: DbConn) -> Result> { + let mut folder = match Folder::find_by_uuid(&uuid, &conn) { + Some(folder) => folder, + _ => err!("Invalid folder") + }; + + if folder.user_uuid != headers.user.uuid { + err!("Folder belongs to another user") + } + + let name = &data["name"].as_str(); + + if name.is_none() { + err!("Invalid name") + } + + folder.name = name.unwrap().into(); + + folder.save(&conn); + + Ok(Json(folder.to_json())) +} + +#[post("/folders//delete", data = "")] +fn delete_folder_post(uuid: String, data: Json, headers: Headers, conn: DbConn) -> Result<(), BadRequest> { + // Data contains a json object with the id, but we don't need it + delete_folder(uuid, headers, conn) +} + +#[delete("/folders/")] +fn delete_folder(uuid: String, headers: Headers, conn: DbConn) -> Result<(), BadRequest> { + let folder = match Folder::find_by_uuid(&uuid, &conn) { + Some(folder) => folder, + _ => err!("Invalid folder") + }; + + if folder.user_uuid != headers.user.uuid { + err!("Folder belongs to another user") + } + + folder.delete(&conn); + + Ok(()) +} diff --git a/src/api/core/mod.rs b/src/api/core/mod.rs new file mode 100644 index 00000000..9a09b254 --- /dev/null +++ b/src/api/core/mod.rs @@ -0,0 +1,100 @@ +mod accounts; +mod ciphers; +mod folders; +mod two_factor; + +use self::accounts::*; +use self::ciphers::*; +use self::folders::*; +use self::two_factor::*; + +pub fn routes() -> Vec { + routes![ + register, + profile, + post_keys, + post_password, + post_sstamp, + post_email, + delete_account, + revision_date, + + sync, + + get_ciphers, + get_cipher, + post_ciphers, + post_ciphers_import, + post_attachment, + delete_attachment, + post_cipher, + put_cipher, + delete_cipher, + delete_all, + + get_folders, + get_folder, + post_folders, + post_folder, + put_folder, + delete_folder_post, + delete_folder, + + get_twofactor, + get_recover, + generate_authenticator, + activate_authenticator, + disable_authenticator, + + get_collections, + + clear_device_token, + put_device_token, + + get_eq_domains, + post_eq_domains + ] +} + +/// +/// Move this somewhere else +/// + +use rocket::Route; +use rocket::response::status::BadRequest; + +use rocket_contrib::{Json, Value}; + +use db::DbConn; +use db::models::*; +use util; + +use auth::Headers; + + +// GET /api/collections?writeOnly=false +#[get("/collections")] +fn get_collections() -> Result> { + Ok(Json(json!({ + "Data": [], + "Object": "list" + }))) +} + + +#[put("/devices/identifier//clear-token")] +fn clear_device_token(uuid: String) -> Result> { err!("Not implemented") } + +#[put("/devices/identifier//token")] +fn put_device_token(uuid: String) -> Result> { err!("Not implemented") } + + +#[get("/settings/domains")] +fn get_eq_domains() -> Result> { + err!("Not implemented") +} + +#[post("/settings/domains")] +fn post_eq_domains() -> Result> { + err!("Not implemented") +} diff --git a/src/api/core/two_factor.rs b/src/api/core/two_factor.rs new file mode 100644 index 00000000..14f2ae2a --- /dev/null +++ b/src/api/core/two_factor.rs @@ -0,0 +1,131 @@ +use rocket::Route; +use rocket::response::status::BadRequest; + +use rocket_contrib::{Json, Value}; + +use data_encoding::BASE32; + +use db::DbConn; +use db::models::*; + +use util; +use crypto; + +use auth::Headers; + + +#[get("/two-factor")] +fn get_twofactor(headers: Headers) -> Result> { + let data = if headers.user.totp_secret.is_none() { + Value::Null + } else { + json!([{ + "Enabled": true, + "Type": 0, + "Object": "twoFactorProvider" + }]) + }; + + Ok(Json(json!({ + "Data": data, + "Object": "list" + }))) +} + +#[post("/two-factor/get-recover", data = "")] +fn get_recover(data: Json, headers: Headers) -> Result> { + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + + if !headers.user.check_valid_password(password_hash) { + err!("Invalid password"); + } + + Ok(Json(json!({ + "Code": headers.user.totp_recover, + "Object": "twoFactorRecover" + }))) +} + +#[post("/two-factor/get-authenticator", data = "")] +fn generate_authenticator(data: Json, headers: Headers) -> Result> { + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + + if !headers.user.check_valid_password(password_hash) { + err!("Invalid password"); + } + + let (enabled, key) = match headers.user.totp_secret { + Some(secret) => (true, secret), + _ => (false, BASE32.encode(&crypto::get_random(vec![0u8; 20]))) + }; + + Ok(Json(json!({ + "Enabled": enabled, + "Key": key, + "Object": "twoFactorAuthenticator" + }))) +} + +#[post("/two-factor/authenticator", data = "")] +fn activate_authenticator(data: Json, headers: Headers, conn: DbConn) -> Result> { + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + + if !headers.user.check_valid_password(password_hash) { + err!("Invalid password"); + } + let token = data["token"].as_str(); // 123456 + let key = data["key"].as_str().unwrap(); // YI4SKBIXG32LOA6VFKH2NI25VU3E4QML + + // Validate key as base32 and 20 bytes length + let decoded_key: Vec = match BASE32.decode(key.as_bytes()) { + Ok(decoded) => decoded, + _ => err!("Invalid totp secret") + }; + + if decoded_key.len() != 20 { + err!("Invalid key length") + } + + // Set key in user.totp_secret + let mut user = headers.user; + user.totp_secret = Some(key.to_uppercase()); + + // Validate the token provided with the key + if !user.check_totp_code(util::parse_option_string(token)) { + err!("Invalid totp code") + } + + // Generate totp_recover + let totp_recover = BASE32.encode(&crypto::get_random(vec![0u8; 20])); + user.totp_recover = Some(totp_recover); + + user.save(&conn); + + Ok(Json(json!({ + "Enabled": true, + "Key": key, + "Object": "twoFactorAuthenticator" + }))) +} + +#[post("/two-factor/disable", data = "")] +fn disable_authenticator(data: Json, headers: Headers, conn: DbConn) -> Result> { + let _type = &data["type"]; + let password_hash = data["masterPasswordHash"].as_str().unwrap(); + + if !headers.user.check_valid_password(password_hash) { + err!("Invalid password"); + } + + let mut user = headers.user; + user.totp_secret = None; + user.totp_recover = None; + + user.save(&conn); + + Ok(Json(json!({ + "Enabled": false, + "Type": 0, + "Object": "twoFactorProvider" + }))) +} diff --git a/src/api/icons.rs b/src/api/icons.rs new file mode 100644 index 00000000..cd408512 --- /dev/null +++ b/src/api/icons.rs @@ -0,0 +1,85 @@ +use std::io; +use std::io::prelude::*; +use std::fs::{create_dir_all, File}; +use std::path::Path; + +use rocket::Route; +use rocket::response::Content; +use rocket::http::ContentType; + +use reqwest; + +use CONFIG; + +pub fn routes() -> Vec { + routes![icon] +} + +#[get("//icon.png")] +fn icon(domain: String) -> Content> { + // Validate the domain to avoid directory traversal attacks + if domain.contains("/") || domain.contains("..") { + return Content(ContentType::PNG, get_fallback_icon()); + } + + let url = format!("https://icons.bitwarden.com/{}/icon.png", domain); + + // Get the icon, or fallback in case of error + let icon = match get_icon_cached(&domain, &url) { + Ok(icon) => icon, + Err(e) => return Content(ContentType::PNG, get_fallback_icon()) + }; + + Content(ContentType::PNG, icon) +} + +fn get_icon(url: &str) -> Result, reqwest::Error> { + let mut res = reqwest::get(url)?; + + res = match res.error_for_status() { + Err(e) => return Err(e), + Ok(res) => res + }; + + let mut buffer: Vec = vec![]; + res.copy_to(&mut buffer)?; + + Ok(buffer) +} + +fn get_icon_cached(key: &str, url: &str) -> io::Result> { + create_dir_all(&CONFIG.icon_cache_folder)?; + let path = &format!("{}/{}.png", CONFIG.icon_cache_folder, key); + + /// Try to read the cached icon, and return it if it exists + match File::open(path) { + Ok(mut f) => { + let mut buffer = Vec::new(); + + if f.read_to_end(&mut buffer).is_ok() { + return Ok(buffer); + } + /* If error reading file continue */ + } + Err(_) => { /* Continue */ } + } + + println!("Downloading icon for {}...", key); + let icon = match get_icon(url) { + Ok(icon) => icon, + Err(_) => return Err(io::Error::new(io::ErrorKind::NotFound, "")) + }; + + /// Save the currently downloaded icon + match File::create(path) { + Ok(mut f) => { f.write_all(&icon); } + Err(_) => { /* Continue */ } + }; + + Ok(icon) +} + +fn get_fallback_icon() -> Vec { + let fallback_icon = "https://raw.githubusercontent.com/bitwarden/web/master/src/images/fa-globe.png"; + get_icon_cached("default", fallback_icon).unwrap() +} diff --git a/src/api/identity.rs b/src/api/identity.rs new file mode 100644 index 00000000..ce11f888 --- /dev/null +++ b/src/api/identity.rs @@ -0,0 +1,225 @@ +use std::collections::HashMap; + +use rocket::Route; +use rocket::request::{Form, FormItems, FromForm}; +use rocket::response::status::BadRequest; + +use rocket_contrib::Json; + +use db::DbConn; +use db::models::*; +use util; + +pub fn routes() -> Vec { + routes![ login] +} + +#[post("/connect/token", data = "")] +fn login(connect_data: Form, conn: DbConn) -> Result> { + let data = connect_data.get(); + println!("{:#?}", data); + + let mut device = match data.grant_type { + GrantType::RefreshToken => { + // Extract token + let token = data.get("refresh_token").unwrap(); + + // Get device by refresh token + match Device::find_by_refresh_token(token, &conn) { + Some(device) => device, + None => err!("Invalid refresh token") + } + } + GrantType::Password => { + // Validate scope + let scope = data.get("scope").unwrap(); + if scope != "api offline_access" { + err!("Scope not supported") + } + + // Get the user + let username = data.get("username").unwrap(); + let user = match User::find_by_mail(username, &conn) { + Some(user) => user, + None => err!("Invalid username or password") + }; + + // Check password + let password = data.get("password").unwrap(); + if !user.check_valid_password(password) { + err!("Invalid username or password") + } + + /* + //TODO: When invalid username or password, return this with a 400 BadRequest: + { + "error": "invalid_grant", + "error_description": "invalid_username_or_password", + "ErrorModel": { + "Message": "Username or password is incorrect. Try again.", + "ValidationErrors": null, + "ExceptionMessage": null, + "ExceptionStackTrace": null, + "InnerExceptionMessage": null, + "Object": "error" + } + } + */ + + // Check if totp code is required and the value is correct + let totp_code = util::parse_option_string(data.get("twoFactorToken").map(String::as_ref)); + + if !user.check_totp_code(totp_code) { + // Return error 400 + return err_json!(json!({ + "error" : "invalid_grant", + "error_description" : "Two factor required.", + "TwoFactorProviders" : [ 0 ], + "TwoFactorProviders2" : { "0" : null } + })); + } + + // Let's only use the header and ignore the 'devicetype' parameter + // TODO Get header Device-Type + let device_type_num = 0;// headers.device_type; + + let (device_id, device_name) = match data.get("client_id").unwrap().as_ref() { + "web" => { (format!("web-{}", user.uuid), String::from("web")) } + "browser" | "mobile" => { + ( + data.get("deviceidentifier").unwrap().clone(), + data.get("devicename").unwrap().clone(), + ) + } + _ => err!("Invalid client id") + }; + + // Find device or create new + let device = match Device::find_by_uuid(&device_id, &conn) { + Some(device) => { + // Check if valid device + if device.user_uuid != user.uuid { + device.delete(&conn); + err!("Device is not owned by user") + } + + device + } + None => { + // Create new device + Device::new(device_id, user.uuid, device_name, device_type_num) + } + }; + + + device + } + }; + + let user = User::find_by_uuid(&device.user_uuid, &conn).unwrap(); + let (access_token, expires_in) = device.refresh_tokens(&user); + device.save(&conn); + + // TODO: when to include :privateKey and :TwoFactorToken? + Ok(Json(json!({ + "access_token": access_token, + "expires_in": expires_in, + "token_type": "Bearer", + "refresh_token": device.refresh_token, + "Key": user.key, + "PrivateKey": user.private_key + }))) +} + +#[derive(Debug)] +struct ConnectData { + grant_type: GrantType, + data: HashMap, +} + +impl ConnectData { + fn get(&self, key: &str) -> Option<&String> { + self.data.get(&key.to_lowercase()) + } +} + +#[derive(Debug, Copy, Clone)] +enum GrantType { RefreshToken, Password } + + +const VALUES_REFRESH: [&str; 1] = ["refresh_token"]; + +const VALUES_PASSWORD: [&str; 5] = ["client_id", + "grant_type", "password", "scope", "username"]; + +const VALUES_DEVICE: [&str; 3] = ["deviceidentifier", + "devicename", "devicetype"]; + + +impl<'f> FromForm<'f> for ConnectData { + type Error = String; + + fn from_form(items: &mut FormItems<'f>, strict: bool) -> Result { + let mut data = HashMap::new(); + + // Insert data into map + for (key, value) in items { + let decoded_key: String = match key.url_decode() { + Ok(decoded) => decoded, + Err(e) => return Err(format!("Error decoding key: {}", value)), + }; + + let decoded_value: String = match value.url_decode() { + Ok(decoded) => decoded, + Err(e) => return Err(format!("Error decoding value: {}", value)), + }; + + data.insert(decoded_key.to_lowercase(), decoded_value); + } + + // Validate needed values + let grant_type = + match data.get("grant_type").map(|s| &s[..]) { + Some("refresh_token") => { + // Check if refresh token is proviced + if let Err(msg) = check_values(&data, &VALUES_REFRESH) { + return Err(msg); + } + + GrantType::RefreshToken + } + Some("password") => { + // Check if basic values are provided + if let Err(msg) = check_values(&data, &VALUES_PASSWORD) { + return Err(msg); + } + + // Check that device values are present on device + match data.get("client_id").unwrap().as_ref() { + "browser" | "mobile" => { + if let Err(msg) = check_values(&data, &VALUES_DEVICE) { + return Err(msg); + } + } + _ => {} + } + + GrantType::Password + } + + _ => return Err(format!("Grant type not supported")) + }; + + Ok(ConnectData { grant_type, data }) + } +} + +fn check_values(map: &HashMap, values: &[&str]) -> Result<(), String> { + for value in values { + if !map.contains_key(*value) { + return Err(format!("{} cannot be blank", value)); + } + } + + Ok(()) +} \ No newline at end of file diff --git a/src/api/mod.rs b/src/api/mod.rs new file mode 100644 index 00000000..693d37c1 --- /dev/null +++ b/src/api/mod.rs @@ -0,0 +1,9 @@ +mod core; +mod icons; +mod identity; +mod web; + +pub use self::core::routes as core_routes; +pub use self::icons::routes as icons_routes; +pub use self::identity::routes as identity_routes; +pub use self::web::routes as web_routes; diff --git a/src/api/web.rs b/src/api/web.rs new file mode 100644 index 00000000..b869067a --- /dev/null +++ b/src/api/web.rs @@ -0,0 +1,43 @@ +use std::io; +use std::path::{Path, PathBuf}; + +use rocket::Route; +use rocket::response::NamedFile; +use rocket_contrib::{Json, Value}; + +use auth::Headers; + +use CONFIG; + +pub fn routes() -> Vec { + routes![index, files, attachments, alive] +} + +// TODO: Might want to use in memory cache: https://github.com/hgzimmerman/rocket-file-cache +#[get("/")] +fn index() -> io::Result { + NamedFile::open(Path::new(&CONFIG.web_vault_folder).join("index.html")) +} + +#[get("/")] // Only match this if the other routes don't match +fn files(p: PathBuf) -> io::Result { + NamedFile::open(Path::new(&CONFIG.web_vault_folder).join(p)) +} + +#[get("/attachments//")] +fn attachments(uuid: String, file: PathBuf, headers: Headers) -> io::Result { + if uuid != headers.user.uuid { + return Err(io::Error::new(io::ErrorKind::PermissionDenied, "Permission denied")); + } + + NamedFile::open(Path::new(&CONFIG.attachments_folder).join(file)) +} + + +#[get("/alive")] +fn alive() -> Json { + use util::format_date; + use chrono::{NaiveDateTime, Utc}; + + Json(format_date(&Utc::now().naive_utc())) +} diff --git a/src/auth.rs b/src/auth.rs new file mode 100644 index 00000000..7e780c31 --- /dev/null +++ b/src/auth.rs @@ -0,0 +1,164 @@ +/// +/// JWT Handling +/// + +use util::read_file; +use std::path::Path; +use time::Duration; + +use jwt; +use serde::ser::Serialize; +use serde::de::Deserialize; + +use CONFIG; + +const JWT_ALGORITHM: jwt::Algorithm = jwt::Algorithm::RS256; +pub const JWT_ISSUER: &'static str = "localhost:8000/identity"; + +lazy_static! { + pub static ref DEFAULT_VALIDITY: Duration = Duration::hours(2); + static ref JWT_HEADER: jwt::Header = jwt::Header::new(JWT_ALGORITHM); + + static ref PRIVATE_RSA_KEY: Vec = match read_file(&CONFIG.private_rsa_key) { + Ok(key) => key, + Err(e) => panic!("Error loading private RSA Key from {}\n Error: {}", CONFIG.private_rsa_key, e) + }; + + static ref PUBLIC_RSA_KEY: Vec = match read_file(&CONFIG.public_rsa_key) { + Ok(key) => key, + Err(e) => panic!("Error loading public RSA Key from {}\n Error: {}", CONFIG.public_rsa_key, e) + }; +} + +pub fn encode_jwt(claims: &T) -> String { + match jwt::encode(&JWT_HEADER, claims, &PRIVATE_RSA_KEY) { + Ok(token) => return token, + Err(e) => panic!("Error encoding jwt {}", e) + }; +} + +pub fn decode_jwt(token: &str) -> Result { + let validation = jwt::Validation { + leeway: 30, // 30 seconds + validate_exp: true, + validate_iat: true, + validate_nbf: true, + aud: None, + iss: Some(JWT_ISSUER.into()), + sub: None, + algorithms: vec![JWT_ALGORITHM], + }; + + match jwt::decode(token, &PUBLIC_RSA_KEY, &validation) { + Ok(decoded) => Ok(decoded.claims), + Err(msg) => { + println!("Error validating jwt - {:#?}", msg); + Err(msg.to_string()) + } + } +} + +#[derive(Debug, Serialize, Deserialize)] +pub struct JWTClaims { + // Not before + pub nbf: i64, + // Expiration time + pub exp: i64, + // Issuer + pub iss: String, + // Subject + pub sub: String, + + pub premium: bool, + pub name: String, + pub email: String, + pub email_verified: bool, + + // user security_stamp + pub sstamp: String, + // device uuid + pub device: String, + // [ "api", "offline_access" ] + pub scope: Vec, + // [ "Application" ] + pub amr: Vec, +} + +/// +/// Bearer token authentication +/// + +use rocket::Outcome; +use rocket::http::Status; +use rocket::request::{self, Request, FromRequest}; + +use db::DbConn; +use db::models::{User, Device}; + +pub struct Headers { + pub device_type: i32, + pub device: Device, + pub user: User, +} + +impl<'a, 'r> FromRequest<'a, 'r> for Headers { + type Error = &'static str; + + fn from_request(request: &'a Request<'r>) -> request::Outcome { + let headers = request.headers(); + + /// Get device type + let device_type = match headers.get_one("Device-Type") + .map(|s| s.parse::()) { + Some(Ok(dt)) => dt, + _ => return err_handler!("Device-Type is invalid or missing") + }; + + /// Get access_token + let access_token: &str = match request.headers().get_one("Authorization") { + Some(a) => { + let split: Option<&str> = a.rsplit("Bearer ").next(); + + if split.is_none() { + err_handler!("No access token provided") + } + + split.unwrap() + } + None => err_handler!("No access token provided") + }; + + /// Check JWT token is valid and get device and user from it + let claims: JWTClaims = match decode_jwt(access_token) { + Ok(claims) => claims, + Err(msg) => { + println!("Invalid claim: {}", msg); + err_handler!("Invalid claim") + } + }; + + let device_uuid = claims.device; + let user_uuid = claims.sub; + + let conn = match request.guard::() { + Outcome::Success(conn) => conn, + _ => err_handler!("Error getting DB") + }; + + let device = match Device::find_by_uuid(&device_uuid, &conn) { + Some(device) => device, + None => err_handler!("Invalid device id") + }; + + let user = match User::find_by_uuid(&user_uuid, &conn) { + Some(user) => user, + None => err_handler!("Device has no user associated") + }; + + if user.security_stamp != claims.sstamp { + err_handler!("Invalid security stamp") + } + + Outcome::Success(Headers { device_type, device, user }) + } +} \ No newline at end of file diff --git a/src/bin/proxy.rs b/src/bin/proxy.rs new file mode 100644 index 00000000..1c03fa6b --- /dev/null +++ b/src/bin/proxy.rs @@ -0,0 +1,168 @@ +#![feature(plugin)] + +#![plugin(rocket_codegen)] +extern crate rocket; +extern crate rocket_contrib; +extern crate reqwest; + +use std::io::{self, Cursor}; +use std::str::FromStr; +use std::path::{Path, PathBuf}; + +use rocket::{Request, Response}; +use rocket::config::Config; +use rocket::fairing::{Fairing, Info, Kind}; +use rocket::http; +use rocket::response::NamedFile; + +use reqwest::header::{self, Headers}; + +/** +** These routes are here to avoid showing errors in the console, +** redirect the body data to the fairing and show the web vault. +**/ + +#[get("/")] +fn index() -> io::Result { + NamedFile::open(Path::new("web-vault").join("index.html")) +} + +#[get("/")] // Only match this if the other routes don't match +fn get(p: PathBuf) -> io::Result { + NamedFile::open(Path::new("web-vault").join(p)) +} + +#[delete("/<_p..>")] +fn delete(_p: PathBuf) {} + +#[put("/<_p..>", data = "")] +fn put(_p: PathBuf, d: Vec) -> Vec { d } + +#[post("/<_p..>", data = "")] +fn post(_p: PathBuf, d: Vec) -> Vec { d } + + +fn main() { + let config = Config::development().unwrap(); + + rocket::custom(config, false) + .mount("/", routes![get, put, post, delete, index]) + .attach(ProxyFairing { client: reqwest::Client::new() }) + .launch(); +} + +struct ProxyFairing { + client: reqwest::Client +} + +impl Fairing for ProxyFairing { + fn info(&self) -> Info { + Info { + name: "Proxy Fairing", + kind: Kind::Launch | Kind::Response, + } + } + + fn on_launch(&self, _rocket: &rocket::Rocket) { + println!("Started proxy on locahost:8000"); + } + + fn on_response(&self, req: &Request, res: &mut Response) { + // Prepare the data to make the request + // ------------------------------------- + + let url = { + let url = req.uri().as_str(); + + // Check if we are outside the API paths + if !url.starts_with("/api/") + && !url.starts_with("/identity/") { + return; + } + + // Replace the path with the real server URL + url.replacen("/api/", "https://api.bitwarden.com/", 1) + .replacen("/identity/", "https://identity.bitwarden.com/", 1) + }; + + let host = url.split("/").collect::>()[2]; + let headers = headers_rocket_to_reqwest(req.headers(), host); + let method = reqwest::Method::from_str(req.method().as_str()).unwrap(); + let body = res.body_bytes(); + + println!("\n\nREQ. {} {}", req.method().as_str(), url); + println!("HEADERS. {:#?}", headers); + if let Some(ref body) = body { + let body_string = String::from_utf8_lossy(body); + if !body_string.contains("") { + println!("BODY. {:?}", body_string); + } + } + + + // Execute the request + // ------------------------------------- + let mut client = self.client.request(method, &url); + let request_builder = client.headers(headers); + + if let Some(body_vec) = body { + request_builder.body(body_vec); + } + + let mut server_res = match request_builder.send() { + Ok(response) => response, + Err(e) => { + res.set_status(http::Status::BadRequest); + res.set_sized_body(Cursor::new(e.to_string())); + return; + } + }; + + // Get the response values + // ------------------------------------- + let mut res_body: Vec = vec![]; + server_res.copy_to(&mut res_body).unwrap(); + + let res_status = server_res.status().as_u16(); + let mut res_headers = server_res.headers().clone(); + + // These headers break stuff + res_headers.remove::(); + res_headers.remove::(); + + println!("\n\nRES. {} {}", res_status, url); + // Nothing interesting here + // println!("HEADERS. {:#?}", res_headers); + println!("BODY. {:?}", String::from_utf8_lossy(&res_body)); + + // Prepare the response + // ------------------------------------- + res.set_status(http::Status::from_code(res_status).unwrap_or(http::Status::BadRequest)); + + headers_reqwest_to_rocket(&res_headers, res); + res.set_sized_body(Cursor::new(res_body)); + } +} + +fn headers_rocket_to_reqwest(headers: &http::HeaderMap, host: &str) -> Headers { + let mut new_headers = Headers::new(); + + for header in headers.iter() { + let name = header.name().to_string(); + + let value = if name.to_lowercase() != "host" { + header.value().to_string() + } else { + host.to_string() + }; + + new_headers.set_raw(name, value); + } + new_headers +} + +fn headers_reqwest_to_rocket(headers: &Headers, res: &mut Response) { + for header in headers.iter() { + res.set_raw_header(header.name().to_string(), header.value_string()); + } +} diff --git a/src/crypto.rs b/src/crypto.rs new file mode 100644 index 00000000..645ee903 --- /dev/null +++ b/src/crypto.rs @@ -0,0 +1,36 @@ +/// +/// PBKDF2 derivation +/// + +use ring::{digest, pbkdf2}; + +static DIGEST_ALG: &digest::Algorithm = &digest::SHA256; +const OUTPUT_LEN: usize = digest::SHA256_OUTPUT_LEN; + +pub fn hash_password(secret: &[u8], salt: &[u8], iterations: u32) -> Vec { + let mut out = vec![0u8; OUTPUT_LEN]; // Initialize array with zeros + + pbkdf2::derive(DIGEST_ALG, iterations, salt, secret, &mut out); + + out +} + +pub fn verify_password_hash(secret: &[u8], salt: &[u8], previous: &[u8], iterations: u32) -> bool { + pbkdf2::verify(DIGEST_ALG, iterations, salt, secret, previous).is_ok() +} + +/// +/// Random values +/// + +pub fn get_random_64() -> Vec { + get_random(vec![0u8; 64]) +} + +pub fn get_random(mut array: Vec) -> Vec { + use ring::rand::{SecureRandom, SystemRandom}; + + SystemRandom::new().fill(&mut array); + + array +} diff --git a/src/db/mod.rs b/src/db/mod.rs new file mode 100644 index 00000000..0442cbaf --- /dev/null +++ b/src/db/mod.rs @@ -0,0 +1,60 @@ +use std::ops::Deref; + +use diesel::{Connection as DieselConnection, ConnectionError}; +use diesel::sqlite::SqliteConnection; +use r2d2; +use r2d2_diesel::ConnectionManager; + +use rocket::http::Status; +use rocket::request::{self, FromRequest}; +use rocket::{Outcome, Request, State}; + +use CONFIG; + +/// An alias to the database connection used +type Connection = SqliteConnection; + +/// An alias to the type for a pool of Diesel SQLite connections. +type Pool = r2d2::Pool>; + +/// Connection request guard type: a wrapper around an r2d2 pooled connection. +pub struct DbConn(pub r2d2::PooledConnection>); + +pub mod schema; +pub mod models; + +/// Initializes a database pool. +pub fn init_pool() -> Pool { + let manager = ConnectionManager::new(&*CONFIG.database_url); + + r2d2::Pool::builder() + .build(manager) + .expect("Failed to create pool") +} + +pub fn get_connection() -> Result { + Connection::establish(&CONFIG.database_url) +} + +/// Attempts to retrieve a single connection from the managed database pool. If +/// no pool is currently managed, fails with an `InternalServerError` status. If +/// no connections are available, fails with a `ServiceUnavailable` status. +impl<'a, 'r> FromRequest<'a, 'r> for DbConn { + type Error = (); + + fn from_request(request: &'a Request<'r>) -> request::Outcome { + let pool = request.guard::>()?; + match pool.get() { + Ok(conn) => Outcome::Success(DbConn(conn)), + Err(_) => Outcome::Failure((Status::ServiceUnavailable, ())) + } + } +} + +// For the convenience of using an &DbConn as a &Database. +impl Deref for DbConn { + type Target = Connection; + fn deref(&self) -> &Self::Target { + &self.0 + } +} diff --git a/src/db/models/cipher.rs b/src/db/models/cipher.rs new file mode 100644 index 00000000..a747ec62 --- /dev/null +++ b/src/db/models/cipher.rs @@ -0,0 +1,112 @@ +use chrono::{NaiveDate, NaiveDateTime, Utc}; +use time::Duration; +use serde_json::Value as JsonValue; + +use uuid::Uuid; + +#[derive(Queryable, Insertable, Identifiable)] +#[table_name = "ciphers"] +#[primary_key(uuid)] +pub struct Cipher { + pub uuid: String, + pub created_at: NaiveDateTime, + pub updated_at: NaiveDateTime, + + pub user_uuid: String, + pub folder_uuid: Option, + pub organization_uuid: Option, + + // Login = 1, + // SecureNote = 2, + // Card = 3, + // Identity = 4 + pub type_: i32, + + pub data: String, + pub favorite: bool, + pub attachments: Option>, +} + +/// Local methods +impl Cipher { + pub fn new(user_uuid: String, type_: i32, favorite: bool) -> Cipher { + let now = Utc::now().naive_utc(); + + Cipher { + uuid: Uuid::new_v4().to_string(), + created_at: now, + updated_at: now, + + user_uuid, + folder_uuid: None, + organization_uuid: None, + + type_, + favorite, + + data: String::new(), + attachments: None, + } + } + + pub fn to_json(&self) -> JsonValue { + use serde_json; + use util::format_date; + + let data: JsonValue = serde_json::from_str(&self.data).unwrap(); + + json!({ + "Id": self.uuid, + "Type": self.type_, + "RevisionDate": format_date(&self.updated_at), + "FolderId": self.folder_uuid, + "Favorite": self.favorite, + "OrganizationId": "", + "Attachments": self.attachments, + "OrganizationUseTotp": false, + "Data": data, + "Object": "cipher", + "Edit": true, + }) + } +} + +use diesel; +use diesel::prelude::*; +use db::DbConn; +use db::schema::ciphers; + +/// Database methods +impl Cipher { + pub fn save(&self, conn: &DbConn) -> bool { + // TODO: Update modified date + + match diesel::replace_into(ciphers::table) + .values(self) + .execute(&**conn) { + Ok(1) => true, // One row inserted + _ => false, + } + } + + pub fn delete(self, conn: &DbConn) -> bool { + match diesel::delete(ciphers::table.filter( + ciphers::uuid.eq(self.uuid))) + .execute(&**conn) { + Ok(1) => true, // One row deleted + _ => false, + } + } + + pub fn find_by_uuid(uuid: &str, conn: &DbConn) -> Option { + ciphers::table + .filter(ciphers::uuid.eq(uuid)) + .first::(&**conn).ok() + } + + pub fn find_by_user(user_uuid: &str, conn: &DbConn) -> Vec { + ciphers::table + .filter(ciphers::user_uuid.eq(user_uuid)) + .load::(&**conn).expect("Error loading ciphers") + } +} diff --git a/src/db/models/device.rs b/src/db/models/device.rs new file mode 100644 index 00000000..59d9ca0e --- /dev/null +++ b/src/db/models/device.rs @@ -0,0 +1,117 @@ +use chrono::{NaiveDate, NaiveDateTime, Utc}; +use time::Duration; +use serde_json::Value as JsonValue; + +use uuid::Uuid; + +#[derive(Queryable, Insertable, Identifiable)] +#[table_name = "devices"] +#[primary_key(uuid)] +pub struct Device { + pub uuid: String, + pub created_at: NaiveDateTime, + pub updated_at: NaiveDateTime, + + pub user_uuid: String, + + pub name: String, + /// https://github.com/bitwarden/core/tree/master/src/Core/Enums + pub type_: i32, + pub push_token: Option, + + pub refresh_token: String, +} + +/// Local methods +impl Device { + pub fn new(uuid: String, user_uuid: String, name: String, type_: i32) -> Device { + let now = Utc::now().naive_utc(); + + Device { + uuid, + created_at: now, + updated_at: now, + + user_uuid, + name, + type_, + + push_token: None, + refresh_token: String::new(), + } + } + + pub fn refresh_tokens(&mut self, user: &super::User) -> (String, i64) { + // If there is no refresh token, we create one + if self.refresh_token.is_empty() { + use data_encoding::BASE64URL; + use crypto; + + self.refresh_token = BASE64URL.encode(&crypto::get_random_64()); + } + + // Update the expiration of the device and the last update date + let time_now = Utc::now().naive_utc(); + + self.updated_at = time_now; + + // Create the JWT claims struct, to send to the client + use auth::{encode_jwt, JWTClaims, DEFAULT_VALIDITY, JWT_ISSUER}; + let claims = JWTClaims { + nbf: time_now.timestamp(), + exp: (time_now + *DEFAULT_VALIDITY).timestamp(), + iss: JWT_ISSUER.to_string(), + sub: user.uuid.to_string(), + premium: true, + name: user.name.to_string(), + email: user.email.to_string(), + email_verified: true, + sstamp: user.security_stamp.to_string(), + device: self.uuid.to_string(), + scope: vec!["api".into(), "offline_access".into()], + amr: vec!["Application".into()], + }; + + (encode_jwt(&claims), DEFAULT_VALIDITY.num_seconds()) + } +} + +use diesel; +use diesel::prelude::*; +use db::DbConn; +use db::schema::devices; + +/// Database methods +impl Device { + pub fn save(&self, conn: &DbConn) -> bool { + // TODO: Update modified date + + match diesel::replace_into(devices::table) + .values(self) + .execute(&**conn) { + Ok(1) => true, // One row inserted + _ => false, + } + } + + pub fn delete(self, conn: &DbConn) -> bool { + match diesel::delete(devices::table.filter( + devices::uuid.eq(self.uuid))) + .execute(&**conn) { + Ok(1) => true, // One row deleted + _ => false, + } + } + + pub fn find_by_uuid(uuid: &str, conn: &DbConn) -> Option { + devices::table + .filter(devices::uuid.eq(uuid)) + .first::(&**conn).ok() + } + + pub fn find_by_refresh_token(refresh_token: &str, conn: &DbConn) -> Option { + devices::table + .filter(devices::refresh_token.eq(refresh_token)) + .first::(&**conn).ok() + } +} diff --git a/src/db/models/folder.rs b/src/db/models/folder.rs new file mode 100644 index 00000000..a6dff757 --- /dev/null +++ b/src/db/models/folder.rs @@ -0,0 +1,83 @@ +use chrono::{NaiveDate, NaiveDateTime, Utc}; +use time::Duration; +use serde_json::Value as JsonValue; + +use uuid::Uuid; + +#[derive(Queryable, Insertable, Identifiable)] +#[table_name = "folders"] +#[primary_key(uuid)] +pub struct Folder { + pub uuid: String, + pub created_at: NaiveDateTime, + pub updated_at: NaiveDateTime, + pub user_uuid: String, + pub name: String, +} + +/// Local methods +impl Folder { + pub fn new(user_uuid: String, name: String) -> Folder { + let now = Utc::now().naive_utc(); + + Folder { + uuid: Uuid::new_v4().to_string(), + created_at: now, + updated_at: now, + + user_uuid, + name, + } + } + + pub fn to_json(&self) -> JsonValue { + use util::format_date; + + json!({ + "Id": self.uuid, + "RevisionDate": format_date(&self.updated_at), + "Name": self.name, + "Object": "folder", + }) + } +} + +use diesel; +use diesel::prelude::*; +use db::DbConn; +use db::schema::folders; + +/// Database methods +impl Folder { + pub fn save(&self, conn: &DbConn) -> bool { + // TODO: Update modified date + + match diesel::replace_into(folders::table) + .values(self) + .execute(&**conn) { + Ok(1) => true, // One row inserted + _ => false, + } + } + + pub fn delete(self, conn: &DbConn) -> bool { + match diesel::delete(folders::table.filter( + folders::uuid.eq(self.uuid))) + .execute(&**conn) { + Ok(1) => true, // One row deleted + _ => false, + } + } + + pub fn find_by_uuid(uuid: &str, conn: &DbConn) -> Option { + folders::table + .filter(folders::uuid.eq(uuid)) + .first::(&**conn).ok() + } + + pub fn find_by_user(user_uuid: &str, conn: &DbConn) -> Vec { + folders::table + .filter(folders::user_uuid.eq(user_uuid)) + .load::(&**conn).expect("Error loading folders") + } +} diff --git a/src/db/models/mod.rs b/src/db/models/mod.rs new file mode 100644 index 00000000..77fbcef9 --- /dev/null +++ b/src/db/models/mod.rs @@ -0,0 +1,9 @@ +mod cipher; +mod device; +mod folder; +mod user; + +pub use self::cipher::Cipher; +pub use self::device::Device; +pub use self::folder::Folder; +pub use self::user::User; diff --git a/src/db/models/user.rs b/src/db/models/user.rs new file mode 100644 index 00000000..a75c65c4 --- /dev/null +++ b/src/db/models/user.rs @@ -0,0 +1,159 @@ +use chrono::{NaiveDate, NaiveDateTime, Utc}; +use time::Duration; +use serde_json::Value as JsonValue; + +use uuid::Uuid; + +use CONFIG; + +#[derive(Queryable, Insertable, Identifiable)] +#[table_name = "users"] +#[primary_key(uuid)] +pub struct User { + pub uuid: String, + pub created_at: NaiveDateTime, + pub updated_at: NaiveDateTime, + + pub email: String, + pub name: String, + + pub password_hash: Vec, + pub salt: Vec, + pub password_iterations: i32, + pub password_hint: Option, + + pub key: String, + pub private_key: Option, + pub public_key: Option, + pub totp_secret: Option, + pub totp_recover: Option, + pub security_stamp: String, +} + +/// Local methods +impl User { + pub fn new(mail: String, key: String, password: String) -> User { + let now = Utc::now().naive_utc(); + let email = mail.to_lowercase(); + + use crypto; + + let iterations = CONFIG.password_iterations; + let salt = crypto::get_random_64(); + let password_hash = crypto::hash_password(password.as_bytes(), &salt, iterations as u32); + + User { + uuid: Uuid::new_v4().to_string(), + created_at: now, + updated_at: now, + name: email.clone(), + email, + key, + + password_hash, + salt, + password_iterations: iterations, + + security_stamp: Uuid::new_v4().to_string(), + + password_hint: None, + private_key: None, + public_key: None, + totp_secret: None, + totp_recover: None, + } + } + + pub fn check_valid_password(&self, password: &str) -> bool { + use crypto; + + crypto::verify_password_hash(password.as_bytes(), + &self.salt, + &self.password_hash, + self.password_iterations as u32) + } + + pub fn set_password(&mut self, password: &str) { + use crypto; + self.password_hash = crypto::hash_password(password.as_bytes(), + &self.salt, + self.password_iterations as u32); + self.reset_security_stamp(); + } + + pub fn reset_security_stamp(&mut self) { + self.security_stamp = Uuid::new_v4().to_string(); + } + + pub fn check_totp_code(&self, totp_code: Option) -> bool { + if let Some(ref totp_secret) = self.totp_secret { + if let Some(code) = totp_code { + // Validate totp + use data_encoding::BASE32; + use oath::{totp_raw_now, HashType}; + + let decoded_secret = match BASE32.decode(totp_secret.as_bytes()) { + Ok(s) => s, + Err(e) => return false + }; + + let generated = totp_raw_now(&decoded_secret, 6, 0, 30, &HashType::SHA1); + generated == code + } else { + false + } + } else { + true + } + } + + pub fn to_json(&self) -> JsonValue { + json!({ + "Id": self.uuid, + "Name": self.name, + "Email": self.email, + "EmailVerified": true, + "Premium": true, + "MasterPasswordHint": self.password_hint, + "Culture": "en-US", + "TwoFactorEnabled": self.totp_secret.is_some(), + "Key": self.key, + "PrivateKey": self.private_key, + "SecurityStamp": self.security_stamp, + "Organizations": [], + "Object": "profile" + }) + } +} + +use diesel; +use diesel::prelude::*; +use db::DbConn; +use db::schema::users; + +/// Database methods +impl User { + pub fn save(&self, conn: &DbConn) -> bool { + // TODO: Update modified date + + match diesel::replace_into(users::table) // Insert or update + .values(self) + .execute(&**conn) { + Ok(1) => true, // One row inserted + _ => false, + } + } + + pub fn find_by_mail(mail: &str, conn: &DbConn) -> Option { + let lower_mail = mail.to_lowercase(); + users::table + .filter(users::email.eq(lower_mail)) + .first::(&**conn).ok() + } + + pub fn find_by_uuid(uuid: &str, conn: &DbConn) -> Option { + users::table + .filter(users::uuid.eq(uuid)) + .first::(&**conn).ok() + } +} diff --git a/src/db/schema.rs b/src/db/schema.rs new file mode 100644 index 00000000..82028cd9 --- /dev/null +++ b/src/db/schema.rs @@ -0,0 +1,71 @@ +table! { + ciphers (uuid) { + uuid -> Text, + created_at -> Timestamp, + updated_at -> Timestamp, + user_uuid -> Text, + folder_uuid -> Nullable, + organization_uuid -> Nullable, + #[sql_name = "type"] + type_ -> Integer, + data -> Text, + favorite -> Bool, + attachments -> Nullable, + } +} + +table! { + devices (uuid) { + uuid -> Text, + created_at -> Timestamp, + updated_at -> Timestamp, + user_uuid -> Text, + name -> Text, + #[sql_name = "type"] + type_ -> Integer, + push_token -> Nullable, + refresh_token -> Text, + } +} + +table! { + folders (uuid) { + uuid -> Text, + created_at -> Timestamp, + updated_at -> Timestamp, + user_uuid -> Text, + name -> Text, + } +} + +table! { + users (uuid) { + uuid -> Text, + created_at -> Timestamp, + updated_at -> Timestamp, + email -> Text, + name -> Text, + password_hash -> Binary, + salt -> Binary, + password_iterations -> Integer, + password_hint -> Nullable, + key -> Text, + private_key -> Nullable, + public_key -> Nullable, + totp_secret -> Nullable, + totp_recover -> Nullable, + security_stamp -> Text, + } +} + +joinable!(ciphers -> folders (folder_uuid)); +joinable!(ciphers -> users (user_uuid)); +joinable!(devices -> users (user_uuid)); +joinable!(folders -> users (user_uuid)); + +allow_tables_to_appear_in_same_query!( + ciphers, + devices, + folders, + users, +); diff --git a/src/main.rs b/src/main.rs new file mode 100644 index 00000000..acfafe27 --- /dev/null +++ b/src/main.rs @@ -0,0 +1,151 @@ +#![allow(dead_code, unused_variables, unused, unused_mut)] + +#![feature(plugin, custom_derive)] +#![cfg_attr(test, plugin(stainless))] +#![plugin(rocket_codegen)] +extern crate rocket; +#[macro_use] +extern crate rocket_contrib; +extern crate reqwest; +extern crate multipart; +extern crate serde; +#[macro_use] +extern crate serde_derive; +#[macro_use] +extern crate serde_json; +#[macro_use] +extern crate diesel; +#[macro_use] +extern crate diesel_migrations; +extern crate r2d2_diesel; +extern crate r2d2; +extern crate ring; +extern crate uuid; +extern crate chrono; +extern crate time; +extern crate oath; +extern crate data_encoding; +extern crate jsonwebtoken as jwt; +extern crate dotenv; +#[macro_use] +extern crate lazy_static; + + +use std::{io, env}; + +use rocket::{Data, Request, Rocket}; +use rocket::fairing::{Fairing, Info, Kind}; + +#[macro_use] +mod util; + +#[cfg(test)] +mod tests; + +mod api; +mod db; +mod crypto; +mod auth; + +fn init_rocket() -> Rocket { + rocket::ignite() + .mount("/", api::web_routes()) + .mount("/api", api::core_routes()) + .mount("/identity", api::identity_routes()) + .mount("/icons", api::icons_routes()) + .manage(db::init_pool()) + .attach(DebugFairing) +} + +// Embed the migrations from the migrations folder into the application +// This way, the program automatically migrates the database to the latest version +// https://docs.rs/diesel_migrations/*/diesel_migrations/macro.embed_migrations.html +embed_migrations!(); + +fn main() { + println!("{:#?}", *CONFIG); + + // Make sure the database is up to date (create if it doesn't exist, or run the migrations) + let connection = db::get_connection().expect("Can't conect to DB"); + embedded_migrations::run_with_output(&connection, &mut io::stdout()); + + // Validate location of rsa keys + if !util::file_exists(&CONFIG.private_rsa_key) { + panic!("private_rsa_key doesn't exist"); + } + if !util::file_exists(&CONFIG.public_rsa_key) { + panic!("public_rsa_key doesn't exist"); + } + + init_rocket().launch(); +} + +lazy_static! { + // Load the config from .env or from environment variables + static ref CONFIG: Config = Config::load(); +} + +#[derive(Debug)] +pub struct Config { + database_url: String, + private_rsa_key: String, + public_rsa_key: String, + icon_cache_folder: String, + attachments_folder: String, + web_vault_folder: String, + + signups_allowed: bool, + password_iterations: i32, +} + +impl Config { + fn load() -> Self { + dotenv::dotenv().ok(); + + Config { + database_url: env::var("DATABASE_URL").unwrap_or("data/db.sqlite3".into()), + private_rsa_key: env::var("PRIVATE_RSA_KEY").unwrap_or("data/private_rsa_key.der".into()), + public_rsa_key: env::var("PUBLIC_RSA_KEY").unwrap_or("data/public_rsa_key.der".into()), + icon_cache_folder: env::var("ICON_CACHE_FOLDER").unwrap_or("data/icon_cache".into()), + attachments_folder: env::var("ATTACHMENTS_FOLDER").unwrap_or("data/attachments".into()), + web_vault_folder: env::var("WEB_VAULT_FOLDER").unwrap_or("web-vault/".into()), + + signups_allowed: util::parse_option_string(env::var("SIGNUPS_ALLOWED").ok()).unwrap_or(false), + password_iterations: util::parse_option_string(env::var("PASSWORD_ITERATIONS").ok()).unwrap_or(100_000), + } + } +} + +struct DebugFairing; + +impl Fairing for DebugFairing { + fn info(&self) -> Info { + Info { + name: "Request Debugger", + kind: Kind::Request, + } + } + + fn on_request(&self, req: &mut Request, data: &Data) { + let uri_string = req.uri().to_string(); + + // Ignore web requests + if !uri_string.starts_with("/api") && + !uri_string.starts_with("/identity") { + return; + } + + /* + for header in req.headers().iter() { + println!("DEBUG- {:#?} {:#?}", header.name(), header.value()); + } + */ + + /*let body_data = data.peek(); + + if body_data.len() > 0 { + println!("DEBUG- Body Complete: {}", data.peek_complete()); + println!("DEBUG- {}", String::from_utf8_lossy(body_data)); + }*/ + } +} diff --git a/src/tests.rs b/src/tests.rs new file mode 100644 index 00000000..90a7f841 --- /dev/null +++ b/src/tests.rs @@ -0,0 +1,49 @@ +use super::init_rocket; +use rocket::local::Client; +use rocket::http::Status; + +#[test] +fn hello_world() { + let client = Client::new(init_rocket()).expect("valid rocket instance"); + let mut response = client.get("/alive").dispatch(); + assert_eq!(response.status(), Status::Ok); + // assert_eq!(response.body_string(), Some("Hello, world!".into())); +} + +// TODO: For testing, we can use either a test_transaction, or an in-memory database + +// TODO: test_transaction http://docs.diesel.rs/diesel/connection/trait.Connection.html#method.begin_test_transaction + +// TODO: in-memory database https://github.com/diesel-rs/diesel/issues/419 (basically use ":memory:" as the connection string + +describe! route_tests { + before_each { + let rocket = init_rocket(); + let client = Client::new(rocket).expect("valid rocket instance"); + } + + describe! alive { + before_each { + let mut res = client.get("/alive").dispatch(); + let body_str = res.body().and_then(|b| b.into_string()).unwrap(); + } + + it "responds with status OK 200" { + assert_eq!(res.status(), Status::Ok); + } + + it "responds with current year" { + assert!(body_str.contains("2018")); + } + } + + describe! nested_example { + ignore "this is ignored" { + assert_eq!(1, 2); + } + + failing "this fails" { + assert_eq!(1, 2); + } + } +} diff --git a/src/util.rs b/src/util.rs new file mode 100644 index 00000000..e9f61aca --- /dev/null +++ b/src/util.rs @@ -0,0 +1,84 @@ +/// +/// Macros +/// +#[macro_export] +macro_rules! err { + ($expr:expr) => {{ + err_json!(json!($expr)); + }} +} + +#[macro_export] +macro_rules! err_json { + ($expr:expr) => {{ + println!("ERROR: {}", $expr); + return Err($crate::rocket::response::status::BadRequest(Some($crate::rocket_contrib::Json($expr)))); + }} +} + +#[macro_export] +macro_rules! err_handler { + ($expr:expr) => {{ + println!("ERROR: {}", $expr); + return $crate::rocket::Outcome::Failure(($crate::rocket::http::Status::Unauthorized, $expr)); + }} +} + +/// +/// File handling +/// + +use std::path::Path; +use std::io::Read; +use std::fs::File; + +pub fn file_exists(path: &str) -> bool { + Path::new(path).exists() +} + +pub fn read_file(path: &str) -> Result, String> { + let mut file = File::open(Path::new(path)) + .map_err(|e| format!("Error opening file: {}", e))?; + + let mut contents: Vec = Vec::new(); + + file.read_to_end(&mut contents) + .map_err(|e| format!("Error reading file: {}", e))?; + + Ok(contents) +} + + +/// +/// String util methods +/// + +use std::str::FromStr; + +pub fn upcase_first(s: &str) -> String { + let mut c = s.chars(); + match c.next() { + None => String::new(), + Some(f) => f.to_uppercase().collect::() + c.as_str(), + } +} + +pub fn parse_option_string(string: Option) -> Option where S: Into, T: FromStr { + if let Some(Ok(value)) = string.map(|s| s.into().parse::()) { + Some(value) + } else { + None + } +} + +/// +/// Date util methods +/// + +use chrono::NaiveDateTime; + +const DATETIME_FORMAT: &'static str = "%Y-%m-%dT%H:%M:%S%.6fZ"; + +pub fn format_date(date: &NaiveDateTime) -> String { + date.format(DATETIME_FORMAT).to_string() +} diff --git a/web-vault/LICENSE.txt b/web-vault/LICENSE.txt new file mode 100644 index 00000000..30ace6a8 --- /dev/null +++ b/web-vault/LICENSE.txt @@ -0,0 +1,674 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +state the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + {one line to give the program's name and a brief idea of what it does.} + Copyright (C) {year} {name of author} + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU 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 General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . + +Also add information on how to contact you by electronic and paper mail. + + If the program does terminal interaction, make it output a short +notice like this when it starts in an interactive mode: + + {project} Copyright (C) {year} {fullname} + This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, your program's commands +might be different; for a GUI interface, you would use an "about box". + + You should also get your employer (if you work as a programmer) or school, +if any, to sign a "copyright disclaimer" for the program, if necessary. +For more information on this, and how to apply and follow the GNU GPL, see +. + + The GNU General Public License does not permit incorporating your program +into proprietary programs. If your program is a subroutine library, you +may consider it more useful to permit linking proprietary applications with +the library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. But first, please read +. \ No newline at end of file diff --git a/web-vault/app-id.json b/web-vault/app-id.json new file mode 100644 index 00000000..dd1c4445 --- /dev/null +++ b/web-vault/app-id.json @@ -0,0 +1,15 @@ +{ + "trustedFacets": [ + { + "version": { + "major": 1, + "minor": 0 + }, + "ids": [ + "https://vault.bitwarden.com", + "ios:bundle-id:com.8bit.bitwarden", + "android:apk-key-hash:dUGFzUzf3lmHSLBDBIv+WaFyZMI" + ] + } + ] +} diff --git a/web-vault/app/accounts/views/accountsLogin.html b/web-vault/app/accounts/views/accountsLogin.html new file mode 100644 index 00000000..5775b44a --- /dev/null +++ b/web-vault/app/accounts/views/accountsLogin.html @@ -0,0 +1,7 @@ + \ No newline at end of file diff --git a/web-vault/app/accounts/views/accountsLoginInfo.html b/web-vault/app/accounts/views/accountsLoginInfo.html new file mode 100644 index 00000000..af9d0ec8 --- /dev/null +++ b/web-vault/app/accounts/views/accountsLoginInfo.html @@ -0,0 +1,49 @@ + +
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+ + + +
+
+ + + +
+
+
+
+ +
+
+
+ +
+
+
+ +
\ No newline at end of file diff --git a/web-vault/app/accounts/views/accountsLoginTwoFactor.html b/web-vault/app/accounts/views/accountsLoginTwoFactor.html new file mode 100644 index 00000000..aa5e8db5 --- /dev/null +++ b/web-vault/app/accounts/views/accountsLoginTwoFactor.html @@ -0,0 +1,167 @@ +
+ +
+ +

+ Didn't get the email? + + Send it again + +

+
+
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+ + + +
+
+
+
+ +
+
+
+ +
+
+
+
+ +
+ +
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+

Insert your YubiKey into your computer's USB port, then touch its button.

+

+ +

+
+ + +
+
+
+
+ +
+
+
+ +
+
+
+
+ +
+ +
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+ +
+
+
+
+ +
+
+
+ + Logging in... + +
+
+
+
+ +
+ +
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+

Insert your Security Key into your computer's USB port. If it has a button, touch it.

+

+ +

+
+
+
+ +
+
+
+ + Logging in... + +
+
+
+
+ +
+

+ This account has two-step login enabled, however, none of the configured two-step providers are supported by this + web browser. +

+ Please use a supported web browser (such as Chrome) and/or add additional providers that are better supported + across web browsers (such as an authenticator app). +
+ +
+ diff --git a/web-vault/app/accounts/views/accountsOrganizationAccept.html b/web-vault/app/accounts/views/accountsOrganizationAccept.html new file mode 100644 index 00000000..ae151ddf --- /dev/null +++ b/web-vault/app/accounts/views/accountsOrganizationAccept.html @@ -0,0 +1,32 @@ + diff --git a/web-vault/app/accounts/views/accountsPasswordHint.html b/web-vault/app/accounts/views/accountsPasswordHint.html new file mode 100644 index 00000000..87b9757d --- /dev/null +++ b/web-vault/app/accounts/views/accountsPasswordHint.html @@ -0,0 +1,39 @@ + diff --git a/web-vault/app/accounts/views/accountsRecover.html b/web-vault/app/accounts/views/accountsRecover.html new file mode 100644 index 00000000..861a3766 --- /dev/null +++ b/web-vault/app/accounts/views/accountsRecover.html @@ -0,0 +1,56 @@ + diff --git a/web-vault/app/accounts/views/accountsRecoverDelete.html b/web-vault/app/accounts/views/accountsRecoverDelete.html new file mode 100644 index 00000000..7e3ad4dc --- /dev/null +++ b/web-vault/app/accounts/views/accountsRecoverDelete.html @@ -0,0 +1,39 @@ + diff --git a/web-vault/app/accounts/views/accountsRegister.html b/web-vault/app/accounts/views/accountsRegister.html new file mode 100644 index 00000000..7b3434be --- /dev/null +++ b/web-vault/app/accounts/views/accountsRegister.html @@ -0,0 +1,82 @@ +
+ +
+ +
+
+

Account Created!

+

You may now log in to your new account.

+
+ Ready to log in? +
+
+
+

Create Organization, Step 1

+

Before creating your organization, you first need to create a free personal account.

+
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+ + + +

You'll use your email address to log in.

+
+
+ + + +

What should we call you?

+
+
+ + + +

The master password is the password you use to access your vault.

+
+
+ + + +

+ It is very important that you do not forget your master password. + There is no way to recover the password in the event that you forget it. +

+
+
+ + + +

A master password hint can help you remember your password if you forget it.

+
+
+ +
+ +
+
+
+ By clicking the above "Submit" button, you are agreeing to the + Terms of Service + and the + Privacy Policy. +
+
+
\ No newline at end of file diff --git a/web-vault/app/accounts/views/accountsTwoFactorMethods.html b/web-vault/app/accounts/views/accountsTwoFactorMethods.html new file mode 100644 index 00000000..9808519f --- /dev/null +++ b/web-vault/app/accounts/views/accountsTwoFactorMethods.html @@ -0,0 +1,25 @@ + + + diff --git a/web-vault/app/accounts/views/accountsVerifyEmail.html b/web-vault/app/accounts/views/accountsVerifyEmail.html new file mode 100644 index 00000000..7bd695ea --- /dev/null +++ b/web-vault/app/accounts/views/accountsVerifyEmail.html @@ -0,0 +1,8 @@ + diff --git a/web-vault/app/accounts/views/accountsVerifyRecoverDelete.html b/web-vault/app/accounts/views/accountsVerifyRecoverDelete.html new file mode 100644 index 00000000..a4589b0b --- /dev/null +++ b/web-vault/app/accounts/views/accountsVerifyRecoverDelete.html @@ -0,0 +1,21 @@ + diff --git a/web-vault/app/organization/views/organizationBilling.html b/web-vault/app/organization/views/organizationBilling.html new file mode 100644 index 00000000..e2ba2ecd --- /dev/null +++ b/web-vault/app/organization/views/organizationBilling.html @@ -0,0 +1,230 @@ +
+

+ Billing + manage your billing & licensing +

+
+
+
+

Canceled

+ The subscription to this organization has been canceled. +
+
+

Pending Cancellation

+

+ The subscription to this organization has been marked for cancellation at the end of the + current billing period. +

+ +
+
+
+

Plan

+
+
+
+
+
+
Name
+
{{plan.name || '-'}}
+
Expiration
+
+ Loading... +
+
+ {{expiration | date: 'medium'}} +
+
+ Never expires +
+
+
+
Name
+
{{plan.name || '-'}}
+
Total Seats
+
{{plan.seats || '-'}}
+
+
+
+
+
Status
+
+ {{(subscription && subscription.status) || '-'}} + - marked for cancellation +
+
Next Charge
+
{{nextInvoice ? ((nextInvoice.date | date: 'mediumDate') + ', ' + (nextInvoice.amount | currency:'$')) : '-'}}
+
+
+
+
+
+ Details +
+ Loading... +
+
+ + + + + + + +
+ {{item.name}} {{item.qty > 1 ? '×' + item.qty : ''}} + @ {{item.amount | currency:'$'}} /{{item.interval}} + {{(item.qty * item.amount) | currency:'$'}} /{{item.interval}}
+
+
+
+
+ + +
+
+
+

User Seats

+
+
+
+ Loading... +
+
+ Your plan currently has a total of {{plan.seats}} seats. +
+
+ +
+
+
+

Storage

+
+
+

+ Your plan has a total of {{storage.maxGb}} GB of encrypted file storage. + You are currently using {{storage.currentName}}. +

+
+
+ {{storage.percentage}}% +
+
+
+ +
+
+
+

Payment Method

+
+
+
+ Loading... +
+
+ No payment method on file. +
+
+
+

You must verify your bank account

+

+ We have made two micro-deposits to your bank account (it may take 1-2 business days to show up). + Enter these amounts to verify the bank account. Failure to verify the bank account will result in a + missed payment and your organization being disabled. +

+ +
+ + {{paymentSource.description}} +
+
+ +
+
+
+

Charges

+
+
+
+ Loading... +
+
+ No charges. +
+
+ + + + + + + + + + +
+ + + + + {{charge.date | date: 'mediumDate'}} + + {{charge.paymentSource}} + + {{charge.status}} + + {{charge.amount | currency:'$'}} +
+
+
+ +
+
diff --git a/web-vault/app/organization/views/organizationBillingAdjustSeats.html b/web-vault/app/organization/views/organizationBillingAdjustSeats.html new file mode 100644 index 00000000..e670adac --- /dev/null +++ b/web-vault/app/organization/views/organizationBillingAdjustSeats.html @@ -0,0 +1,46 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationBillingChangePlan.html b/web-vault/app/organization/views/organizationBillingChangePlan.html new file mode 100644 index 00000000..1d96a8c4 --- /dev/null +++ b/web-vault/app/organization/views/organizationBillingChangePlan.html @@ -0,0 +1,14 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationBillingVerifyBank.html b/web-vault/app/organization/views/organizationBillingVerifyBank.html new file mode 100644 index 00000000..e13ab7ad --- /dev/null +++ b/web-vault/app/organization/views/organizationBillingVerifyBank.html @@ -0,0 +1,43 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationCollections.html b/web-vault/app/organization/views/organizationCollections.html new file mode 100644 index 00000000..8c51e43c --- /dev/null +++ b/web-vault/app/organization/views/organizationCollections.html @@ -0,0 +1,70 @@ +
+

+ Collections + control what you share +

+
+
+
+
+   + +
+ +
+
+
+
+ Loading... +
+
+ No collections to list. +
+
+

There are no collections yet for your organization.

+ +
+
+ + + + + + + +
+
+ + +
+
+ + {{collection.name}} + +
+
+
+
+
diff --git a/web-vault/app/organization/views/organizationCollectionsAdd.html b/web-vault/app/organization/views/organizationCollectionsAdd.html new file mode 100644 index 00000000..54a4093b --- /dev/null +++ b/web-vault/app/organization/views/organizationCollectionsAdd.html @@ -0,0 +1,83 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationCollectionsEdit.html b/web-vault/app/organization/views/organizationCollectionsEdit.html new file mode 100644 index 00000000..e56c0375 --- /dev/null +++ b/web-vault/app/organization/views/organizationCollectionsEdit.html @@ -0,0 +1,84 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationCollectionsUsers.html b/web-vault/app/organization/views/organizationCollectionsUsers.html new file mode 100644 index 00000000..48b063aa --- /dev/null +++ b/web-vault/app/organization/views/organizationCollectionsUsers.html @@ -0,0 +1,64 @@ + + + diff --git a/web-vault/app/organization/views/organizationDashboard.html b/web-vault/app/organization/views/organizationDashboard.html new file mode 100644 index 00000000..e500c94d --- /dev/null +++ b/web-vault/app/organization/views/organizationDashboard.html @@ -0,0 +1,34 @@ +
+

+ Dashboard + {{orgProfile.name}} +

+
+
+
+

Organization Disabled

+

This organization is currently disabled. Users will not see your shared logins or collections.

+

Contact us if you would like to reinstate this organization.

+

Update your license to reinstate this organization.

+ + Billing & Licensing + + + Contact Us + +
+
+
+

Let's Get Started!

+
+
+

Dashboard features are coming soon. Get started by inviting users and creating your collections.

+ + Invite Users + + + Manage Collections + +
+
+
diff --git a/web-vault/app/organization/views/organizationDelete.html b/web-vault/app/organization/views/organizationDelete.html new file mode 100644 index 00000000..8183a112 --- /dev/null +++ b/web-vault/app/organization/views/organizationDelete.html @@ -0,0 +1,34 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationEvents.html b/web-vault/app/organization/views/organizationEvents.html new file mode 100644 index 00000000..61edabc2 --- /dev/null +++ b/web-vault/app/organization/views/organizationEvents.html @@ -0,0 +1,67 @@ +
+

+ Events + audit your organization +

+
+
+
+
+   + +
+ +
+
+
+
+ Loading... +
+
+

There are no events to list.

+
+
+ + + + + + + + + + + + + + + + + +
TimestampAppUserEvent
+ {{event.date | date:'medium'}} + + + + {{event.userName}} + +
+
+
+
+ +
+
diff --git a/web-vault/app/organization/views/organizationGroups.html b/web-vault/app/organization/views/organizationGroups.html new file mode 100644 index 00000000..30faab32 --- /dev/null +++ b/web-vault/app/organization/views/organizationGroups.html @@ -0,0 +1,70 @@ +
+

+ Groups + organize your users +

+
+
+
+
+   + +
+ +
+
+
+
+ Loading... +
+
+ No groups to list. +
+
+

There are no groups yet for your organization.

+ +
+
+ + + + + + + +
+
+ + +
+
+ + {{group.name}} + +
+
+
+
+
diff --git a/web-vault/app/organization/views/organizationGroupsAdd.html b/web-vault/app/organization/views/organizationGroupsAdd.html new file mode 100644 index 00000000..58fe9ce3 --- /dev/null +++ b/web-vault/app/organization/views/organizationGroupsAdd.html @@ -0,0 +1,95 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationGroupsEdit.html b/web-vault/app/organization/views/organizationGroupsEdit.html new file mode 100644 index 00000000..58f6520e --- /dev/null +++ b/web-vault/app/organization/views/organizationGroupsEdit.html @@ -0,0 +1,95 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationGroupsUsers.html b/web-vault/app/organization/views/organizationGroupsUsers.html new file mode 100644 index 00000000..e5a97500 --- /dev/null +++ b/web-vault/app/organization/views/organizationGroupsUsers.html @@ -0,0 +1,55 @@ + + + diff --git a/web-vault/app/organization/views/organizationPeople.html b/web-vault/app/organization/views/organizationPeople.html new file mode 100644 index 00000000..89e30c39 --- /dev/null +++ b/web-vault/app/organization/views/organizationPeople.html @@ -0,0 +1,96 @@ +
+

+ People + users for your organization +

+
+
+
+
+   + +
+ +
+
+
+
+ Loading... +
+
+ + + + + + + + + + +
+ + + + + {{user.email}} + +
{{user.name}}
+
+ {{user.type | enumName: 'OrgUserType'}} + + + {{user.status | enumName: 'OrgUserStatus'}} + +
+
+
+
+
diff --git a/web-vault/app/organization/views/organizationPeopleEdit.html b/web-vault/app/organization/views/organizationPeopleEdit.html new file mode 100644 index 00000000..a8c0c3fd --- /dev/null +++ b/web-vault/app/organization/views/organizationPeopleEdit.html @@ -0,0 +1,101 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationPeopleEvents.html b/web-vault/app/organization/views/organizationPeopleEvents.html new file mode 100644 index 00000000..5ec1912c --- /dev/null +++ b/web-vault/app/organization/views/organizationPeopleEvents.html @@ -0,0 +1,56 @@ + + + diff --git a/web-vault/app/organization/views/organizationPeopleGroups.html b/web-vault/app/organization/views/organizationPeopleGroups.html new file mode 100644 index 00000000..c2c44234 --- /dev/null +++ b/web-vault/app/organization/views/organizationPeopleGroups.html @@ -0,0 +1,55 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationPeopleInvite.html b/web-vault/app/organization/views/organizationPeopleInvite.html new file mode 100644 index 00000000..fa0d128e --- /dev/null +++ b/web-vault/app/organization/views/organizationPeopleInvite.html @@ -0,0 +1,110 @@ + +
+ + +
diff --git a/web-vault/app/organization/views/organizationSettings.html b/web-vault/app/organization/views/organizationSettings.html new file mode 100644 index 00000000..45d66ef2 --- /dev/null +++ b/web-vault/app/organization/views/organizationSettings.html @@ -0,0 +1,94 @@ +
+

+ Settings + manage your organization +

+
+
+
+
+

General

+
+
+
+
+
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ Tax Information +
{{model.businessAddress1}}
+
{{model.businessAddress2}}
+
{{model.businessAddress3}}
+
{{model.businessCountry}}
+
{{model.businessTaxNumber}}
+

+ Please contact support + to provide (or update) tax information for your invoices. +

+
+
+
+ +
+
+
+ +
+
+
+
+

Import/Export

+
+
+

+ Quickly import logins, collections, and other data. You can also export all of your organization's + vault data in .csv format. +

+
+ +
+
+
+

Danger Zone

+
+
+ Careful, these actions are not reversible! +
+ +
+
diff --git a/web-vault/app/organization/views/organizationVault.html b/web-vault/app/organization/views/organizationVault.html new file mode 100644 index 00000000..1bc60be4 --- /dev/null +++ b/web-vault/app/organization/views/organizationVault.html @@ -0,0 +1,95 @@ +
+

+ Org Vault + + , + + +

+
+
+

Loading...

+
+
+

+ + {{collection.name}} + +

+
+ +
+
+
+
No items in this collection.
+
No unassigned items.
+
+ + + + + + + + +
+ + + + + + {{cipher.name}} + +
{{cipher.subTitle}}
+
+
+
+
+
diff --git a/web-vault/app/organization/views/organizationVaultCipherCollections.html b/web-vault/app/organization/views/organizationVaultCipherCollections.html new file mode 100644 index 00000000..b251cbb4 --- /dev/null +++ b/web-vault/app/organization/views/organizationVaultCipherCollections.html @@ -0,0 +1,52 @@ + +
+ + +
\ No newline at end of file diff --git a/web-vault/app/organization/views/organizationVaultCipherEvents.html b/web-vault/app/organization/views/organizationVaultCipherEvents.html new file mode 100644 index 00000000..7c86b330 --- /dev/null +++ b/web-vault/app/organization/views/organizationVaultCipherEvents.html @@ -0,0 +1,60 @@ + + + diff --git a/web-vault/app/reports/views/reportsBreach.html b/web-vault/app/reports/views/reportsBreach.html new file mode 100644 index 00000000..785c5922 --- /dev/null +++ b/web-vault/app/reports/views/reportsBreach.html @@ -0,0 +1,74 @@ +
+

+ Data Breach Report + have you been pwned? +

+
+
+
+

Loading...

+
+
+

An error occurred trying to load the report. Try again...

+
+
+

Oh No, Data Breaches Found!

+

+ Your email ({{email}}) was found in {{breachAccounts.length}} + different data + + online. +

+

+ A "breach" is an incident where a site's data has been illegally accessed by hackers and then released publicly. + Review the types of data that were compromised (email addresses, passwords, credit cards etc.) and take appropriate + action, such as changing passwords. +

+ Check another email +
+
+

Good News, Nothing Found!

+

Your email ({{email}}) was not found in any known data breaches.

+ Check another email +
+
+
+

{{breach.title}}

+
+
+
+
+ {{breach.id}} logo +
+
+
+
+

+
Compromised Data
+
    +
  • {{class}}
  • +
+
+
+
+
+
{{breach.domain}}
+
Users
+
{{breach.count | number: 0}}
+
Occurred
+
{{breach.date | date: format: mediumDate}}
+
Reported
+
{{breach.reportedDate | date: format: mediumDate}}
+
Updated
+
{{breach.modifiedDate | date: format: mediumDate}}
+
+
+
+
+
+
+
+ This data is brought to you as a service from + Have I been pwned?. + Please check out their wonderful services and subscribe to receive notifications about future data breaches. +
diff --git a/web-vault/app/settings/views/settings.html b/web-vault/app/settings/views/settings.html new file mode 100644 index 00000000..ccef1545 --- /dev/null +++ b/web-vault/app/settings/views/settings.html @@ -0,0 +1,164 @@ +
+

+ Settings + manage your account +

+
+
+
+
+

General

+
+
+
+
+
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+ + +
+
+ + +
+
+ + +
+
+
+ +
+
+
+ +
+
+
+
+

Master Password

+
+
+
+
+
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+ + +
+
+
+
+ +
+
+
+
+

Web Vault Options

+
+
+
+
+ +

Website Icons provide a recognizable image next to each login item in your vault.

+
+
+ +
+
+
+
+

Organizations

+
+
+ No organizations yet for your account. +
+ + +
+
+
+

Danger Zone

+
+
+ Careful, these actions are not reversible! +
+ +
+
\ No newline at end of file diff --git a/web-vault/app/settings/views/settingsAddEditEquivalentDomain.html b/web-vault/app/settings/views/settingsAddEditEquivalentDomain.html new file mode 100644 index 00000000..a5524ec0 --- /dev/null +++ b/web-vault/app/settings/views/settingsAddEditEquivalentDomain.html @@ -0,0 +1,35 @@ + +
+ + +
\ No newline at end of file diff --git a/web-vault/app/settings/views/settingsBilling.html b/web-vault/app/settings/views/settingsBilling.html new file mode 100644 index 00000000..e6cf7b7d --- /dev/null +++ b/web-vault/app/settings/views/settingsBilling.html @@ -0,0 +1,178 @@ +
+

Billing manage your membership

+
+
+
+

Canceled

+ The premium membership subscription has been canceled. +
+
+

Pending Cancellation

+

+ The premium membership has been marked for cancellation at the end of the + current billing period. +

+ +
+
+
+

Premium Membership

+
+
+
+
Expiration
+
+ Loading... +
+
+ {{expiration | date: 'medium'}} +
+
+ Never expires +
+
+
+
+
+
Status
+
+ {{(subscription && subscription.status) || '-'}} + - marked for cancellation +
+
Next Charge
+
{{nextInvoice ? ((nextInvoice.date | date: 'mediumDate') + ', ' + (nextInvoice.amount | currency:'$')) : '-'}}
+
+
+
+ Details +
+ Loading... +
+
+ + + + + + + +
+ {{item.name}} {{item.qty > 1 ? '×' + item.qty : ''}} + @ {{item.amount | currency:'$'}} + {{(item.qty * item.amount) | currency:'$'}} /{{item.interval}}
+
+
+
+
+ + +
+
+
+

Storage

+
+
+

+ Your membership has a total of {{storage.maxGb}} GB of encrypted file storage. + You are currently using {{storage.currentName}}. +

+
+
+ {{storage.percentage}}% +
+
+
+ +
+
+
+

Payment Method

+
+
+
+ Loading... +
+
+ No payment method on file. +
+
+ + {{paymentSource.description}} +
+
+ +
+
+
+

Charges

+
+
+
+ Loading... +
+
+ No charges. +
+
+ + + + + + + + + +
+ {{charge.date | date: 'mediumDate'}} + + {{charge.paymentSource}} + + {{charge.status}} + + {{charge.amount | currency:'$'}} +
+
+
+ +
+
diff --git a/web-vault/app/settings/views/settingsBillingAdjustStorage.html b/web-vault/app/settings/views/settingsBillingAdjustStorage.html new file mode 100644 index 00000000..c8b65c0d --- /dev/null +++ b/web-vault/app/settings/views/settingsBillingAdjustStorage.html @@ -0,0 +1,46 @@ + +
+ + +
diff --git a/web-vault/app/settings/views/settingsBillingChangePayment.html b/web-vault/app/settings/views/settingsBillingChangePayment.html new file mode 100644 index 00000000..e0216ef2 --- /dev/null +++ b/web-vault/app/settings/views/settingsBillingChangePayment.html @@ -0,0 +1,433 @@ + +
+ + +
diff --git a/web-vault/app/settings/views/settingsBillingUpdateLicense.html b/web-vault/app/settings/views/settingsBillingUpdateLicense.html new file mode 100644 index 00000000..f1f4c283 --- /dev/null +++ b/web-vault/app/settings/views/settingsBillingUpdateLicense.html @@ -0,0 +1,30 @@ + +
+ + +
diff --git a/web-vault/app/settings/views/settingsChangeEmail.html b/web-vault/app/settings/views/settingsChangeEmail.html new file mode 100644 index 00000000..b0fc6738 --- /dev/null +++ b/web-vault/app/settings/views/settingsChangeEmail.html @@ -0,0 +1,58 @@ + +
+ + +
+
+ + +
diff --git a/web-vault/app/settings/views/settingsChangePassword.html b/web-vault/app/settings/views/settingsChangePassword.html new file mode 100644 index 00000000..659c3c16 --- /dev/null +++ b/web-vault/app/settings/views/settingsChangePassword.html @@ -0,0 +1,43 @@ + +
+ + +
diff --git a/web-vault/app/settings/views/settingsCreateOrganization.html b/web-vault/app/settings/views/settingsCreateOrganization.html new file mode 100644 index 00000000..95dde043 --- /dev/null +++ b/web-vault/app/settings/views/settingsCreateOrganization.html @@ -0,0 +1,697 @@ +
+

Create Organization

+
+
+

+ Organizations allow you to share parts of your vault with others as well as manage related users + for a specific entity (such as a family, small team, or large company). +

+
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+
+
+

License

+
+
+

To create an on-premise hosted organization you need to upload a valid license file.

+
+ + +

+ Your license file will be named something like bitwarden_organization_license.json +

+
+
+ +
+
+
+
+
+

General Information

+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ +
+
+
+
+ + +
+
+
+
+
+
+
+

Choose Your Plan

+
+
+
+ +
+
+ +
+
+ +
+
+ +
+
+ +
+
+
+

Additional Users (Seats)

+
+
+

+ Your plan comes with {{plans[model.plan].baseSeats}} users (seats). You can add additional users + + (up to {{plans[model.plan].maxAdditionalSeats}} more) + + for {{plans[model.plan].seatPrice | currency:'$'}} per user /month. +

+
+
+
+ + +
+
+
+
+
+
+
+

Users (Seats)

+
+
+

+ How many user seats do you need? + You can also add additional seats later if needed. +

+
+
+
+ + +
+
+
+
+
+
+
+

Additional Storage

+
+
+
+

+ Your plan comes with 1 GB of encrypted file storage. You can add additional + storage for {{storageGb.price | currency:"$":2}} per GB /month. +

+
+
+ + +
+
+
+
+
+
+
+

Billing Summary

+
+
+
+ +
+
+ +
+
+ +
+
+
+

Payment Information

+
+
+ + +
+
+
+

You must verify your bank account

+

+ Payment with a bank account is only available to customers in the United States. + You will be required to verify your bank account. We will make two micro-deposits within the next + 1-2 business days. Enter these amounts in the organization's billing area to verify the bank account. + Failure to verify the bank account will result in a missed payment and your organization being + disabled. +

+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+ +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
diff --git a/web-vault/app/settings/views/settingsDelete.html b/web-vault/app/settings/views/settingsDelete.html new file mode 100644 index 00000000..8950a58b --- /dev/null +++ b/web-vault/app/settings/views/settingsDelete.html @@ -0,0 +1,30 @@ + +
+ + +
diff --git a/web-vault/app/settings/views/settingsDomains.html b/web-vault/app/settings/views/settingsDomains.html new file mode 100644 index 00000000..368127b4 --- /dev/null +++ b/web-vault/app/settings/views/settingsDomains.html @@ -0,0 +1,117 @@ +
+

Domain Rules

+
+
+

+ If you have the same login across multiple different website domains, you can mark the website as "equivalent". + "Global" domains are ones already created for you by bitwarden. +

+
+
+
+

Custom

+
+ +
+
+
+
+ + + + + + + + + + + + +
+
+ + +
+
{{customDomain}}
No domains to list.
+
+
+ +
+
+ +
+
+
+

Global

+
+
+
+ + + + + + + + + + + + +
+
+ + +
+
{{::globalDomain.domains}}
No domains to list.
+
+
+ +
+
+
+ diff --git a/web-vault/app/settings/views/settingsPremium.html b/web-vault/app/settings/views/settingsPremium.html new file mode 100644 index 00000000..bffab9b6 --- /dev/null +++ b/web-vault/app/settings/views/settingsPremium.html @@ -0,0 +1,487 @@ +
+

Premiumget started today!

+
+
+
+
+

Errors have occurred

+
    +
  • {{e}}
  • +
+
+
+
+
+
+

Sign up for a premium membership and get:

+
    +
  • + + 1 GB of encrypted file storage. +
  • +
  • + + Additional two-step login options such as YubiKey, FIDO U2F, and Duo. +
  • +
  • + + TOTP verification code (2FA) generator for logins in your vault. +
  • +
  • + + Priority customer support. +
  • +
  • + + All future premium features. More coming soon! +
  • +
+
+
+ all for just
+ {{premiumPrice | currency:"$":0}} /year +
+
+
+ +
+
+
+
+

License

+
+
+

To upgrade your account to a premium membership you need to upload a valid license file.

+
+ + +

+ Your license file will be named something like bitwarden_premium_license.json +

+
+
+ +
+
+
+
+
+

Addons

+
+
+
+ +

+ Your plan comes with 1 GB of encrypted file storage. You can add additional + storage for {{storageGbPrice | currency:"$":0}} per GB /year. +

+
+
+ +
+
+
+
+
+
+
+

Billing Summary

+
+
+ Premium membership: + {{premiumPrice | currency:"$"}}
+ Additional storage: + {{model.additionalStorageGb || 0}} GB × {{storageGbPrice | currency:"$"}} = + {{(model.additionalStorageGb || 0) * storageGbPrice | currency:"$"}} +
+ +
+
+
+

Payment Information

+
+
+ + +
+
+
+
+
+
+
+
+ + +
+
+
+ +
    +
  • +
  • +
  • +
  • +
  • +
  • +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+
+ + +
+
+
+
+ + +
+
+
+
+
+ +
+
+
+
diff --git a/web-vault/app/settings/views/settingsPurge.html b/web-vault/app/settings/views/settingsPurge.html new file mode 100644 index 00000000..e2e1165d --- /dev/null +++ b/web-vault/app/settings/views/settingsPurge.html @@ -0,0 +1,33 @@ + +
+ + +
diff --git a/web-vault/app/settings/views/settingsSessions.html b/web-vault/app/settings/views/settingsSessions.html new file mode 100644 index 00000000..b512a1ea --- /dev/null +++ b/web-vault/app/settings/views/settingsSessions.html @@ -0,0 +1,37 @@ + +
+ + +
diff --git a/web-vault/app/settings/views/settingsTwoStep.html b/web-vault/app/settings/views/settingsTwoStep.html new file mode 100644 index 00000000..6cc87e28 --- /dev/null +++ b/web-vault/app/settings/views/settingsTwoStep.html @@ -0,0 +1,52 @@ +
+

Two-step Login secure your account

+
+
+
+
+

Recovery Code

+
+
+ The recovery code allows you to access your account in the event that you can no longer use your normal + two-step login provider (ex. you lose your device). bitwarden support will not be able to assist you if you lose + access to your account. We recommend you write down or print the recovery code and keep it in a safe place. +
+ +
+
+
+

Providers

+
+
+
+ + + + + + + + +
+ + {{::provider.name}} + + + + {{::provider.name}} + PREMIUM + +
{{::provider.description}}
+
+ + {{provider.enabled ? 'Enabled' : 'Disabled'}} + +
+
+
+
+
diff --git a/web-vault/app/settings/views/settingsTwoStepAuthenticator.html b/web-vault/app/settings/views/settingsTwoStepAuthenticator.html new file mode 100644 index 00000000..a4740b87 --- /dev/null +++ b/web-vault/app/settings/views/settingsTwoStepAuthenticator.html @@ -0,0 +1,116 @@ + +
+ + +
+
+ + +
diff --git a/web-vault/app/settings/views/settingsTwoStepDuo.html b/web-vault/app/settings/views/settingsTwoStepDuo.html new file mode 100644 index 00000000..271c8a02 --- /dev/null +++ b/web-vault/app/settings/views/settingsTwoStepDuo.html @@ -0,0 +1,76 @@ + +
+ + +
+
+ + +
diff --git a/web-vault/app/settings/views/settingsTwoStepEmail.html b/web-vault/app/settings/views/settingsTwoStepEmail.html new file mode 100644 index 00000000..b9467520 --- /dev/null +++ b/web-vault/app/settings/views/settingsTwoStepEmail.html @@ -0,0 +1,77 @@ + +
+ + +
+
+ + +
diff --git a/web-vault/app/settings/views/settingsTwoStepRecover.html b/web-vault/app/settings/views/settingsTwoStepRecover.html new file mode 100644 index 00000000..5725f336 --- /dev/null +++ b/web-vault/app/settings/views/settingsTwoStepRecover.html @@ -0,0 +1,48 @@ + +
+ + +
+
+ + +
diff --git a/web-vault/app/settings/views/settingsTwoStepU2f.html b/web-vault/app/settings/views/settingsTwoStepU2f.html new file mode 100644 index 00000000..3a302eee --- /dev/null +++ b/web-vault/app/settings/views/settingsTwoStepU2f.html @@ -0,0 +1,93 @@ + +
+ + +
+
+ + +
diff --git a/web-vault/app/settings/views/settingsTwoStepYubi.html b/web-vault/app/settings/views/settingsTwoStepYubi.html new file mode 100644 index 00000000..3b2afd31 --- /dev/null +++ b/web-vault/app/settings/views/settingsTwoStepYubi.html @@ -0,0 +1,127 @@ + +
+ + +
+
+ + +
diff --git a/web-vault/app/settings/views/settingsUpdateKey.html b/web-vault/app/settings/views/settingsUpdateKey.html new file mode 100644 index 00000000..694da2e4 --- /dev/null +++ b/web-vault/app/settings/views/settingsUpdateKey.html @@ -0,0 +1,47 @@ + +
+ + +
diff --git a/web-vault/app/tools/views/tools.html b/web-vault/app/tools/views/tools.html new file mode 100644 index 00000000..80f99e5a --- /dev/null +++ b/web-vault/app/tools/views/tools.html @@ -0,0 +1,32 @@ +
+

+ Tools + helpful utilities +

+
+
+
+
+

Import/Export

+
+
+

+ Quickly import your logins and other data from a previous export or from another + password management application. +

+

You can also export all of your vault data in .csv format.

+
+ +
+
+
+

Password Generator

+
+
+ Password generator is currently available in all other client applications. Coming soon to the web vault! +
+
+
diff --git a/web-vault/app/tools/views/toolsExport.html b/web-vault/app/tools/views/toolsExport.html new file mode 100644 index 00000000..85540c4d --- /dev/null +++ b/web-vault/app/tools/views/toolsExport.html @@ -0,0 +1,33 @@ + +
+ + +
+ diff --git a/web-vault/app/tools/views/toolsImport.html b/web-vault/app/tools/views/toolsImport.html new file mode 100644 index 00000000..25b091a7 --- /dev/null +++ b/web-vault/app/tools/views/toolsImport.html @@ -0,0 +1,48 @@ + +
+ + +
+ diff --git a/web-vault/app/vault/views/vault.html b/web-vault/app/vault/views/vault.html new file mode 100644 index 00000000..4e4f2f3a --- /dev/null +++ b/web-vault/app/vault/views/vault.html @@ -0,0 +1,364 @@ +
+ +

+ My Vault + + , + , & + + +

+
+
+
+

Loading...

+
+
+
+

+ + Favorites + +

+
+
+ + +
+ +
+
+
+
+

No favorite items.

+ +
+
+ + + + + + + + + +
+ + + + + + + + {{cipher.name}} + +
+ {{cipher.subTitle}} +
+
+
+
+
+
+

+ + + {{grouping.name}} + +

+ +
+
+
+
+

No items in this folder.

+ +
+
+

No items in this collection.

+
+
+
+ + + + + + + + + +
+ + + + + + + + {{cipher.name}} + + + +
+ {{cipher.subTitle}} +
+
+
+
+
+ diff --git a/web-vault/app/vault/views/vaultAddCipher.html b/web-vault/app/vault/views/vaultAddCipher.html new file mode 100644 index 00000000..35ccd96b --- /dev/null +++ b/web-vault/app/vault/views/vaultAddCipher.html @@ -0,0 +1,584 @@ + +
+ + +
diff --git a/web-vault/app/vault/views/vaultAddFolder.html b/web-vault/app/vault/views/vaultAddFolder.html new file mode 100644 index 00000000..9ea35f42 --- /dev/null +++ b/web-vault/app/vault/views/vaultAddFolder.html @@ -0,0 +1,24 @@ + +
+ + +
\ No newline at end of file diff --git a/web-vault/app/vault/views/vaultAttachments.html b/web-vault/app/vault/views/vaultAttachments.html new file mode 100644 index 00000000..e05648eb --- /dev/null +++ b/web-vault/app/vault/views/vaultAttachments.html @@ -0,0 +1,75 @@ + +
+ + +
diff --git a/web-vault/app/vault/views/vaultCipherCollections.html b/web-vault/app/vault/views/vaultCipherCollections.html new file mode 100644 index 00000000..2f82c597 --- /dev/null +++ b/web-vault/app/vault/views/vaultCipherCollections.html @@ -0,0 +1,55 @@ + +
+ + +
\ No newline at end of file diff --git a/web-vault/app/vault/views/vaultEditCipher.html b/web-vault/app/vault/views/vaultEditCipher.html new file mode 100644 index 00000000..971e1b32 --- /dev/null +++ b/web-vault/app/vault/views/vaultEditCipher.html @@ -0,0 +1,585 @@ + +
+ + +
diff --git a/web-vault/app/vault/views/vaultEditFolder.html b/web-vault/app/vault/views/vaultEditFolder.html new file mode 100644 index 00000000..064745c3 --- /dev/null +++ b/web-vault/app/vault/views/vaultEditFolder.html @@ -0,0 +1,24 @@ + +
+ + +
\ No newline at end of file diff --git a/web-vault/app/vault/views/vaultMoveCiphers.html b/web-vault/app/vault/views/vaultMoveCiphers.html new file mode 100644 index 00000000..89bd3a96 --- /dev/null +++ b/web-vault/app/vault/views/vaultMoveCiphers.html @@ -0,0 +1,34 @@ + +
+ + +
diff --git a/web-vault/app/vault/views/vaultShareCipher.html b/web-vault/app/vault/views/vaultShareCipher.html new file mode 100644 index 00000000..ae80cbb0 --- /dev/null +++ b/web-vault/app/vault/views/vaultShareCipher.html @@ -0,0 +1,75 @@ + +
+ + +
diff --git a/web-vault/app/views/apps.html b/web-vault/app/views/apps.html new file mode 100644 index 00000000..7c207680 --- /dev/null +++ b/web-vault/app/views/apps.html @@ -0,0 +1,135 @@ +
+

+ Apps + for all of your devices +

+
+
+
+
+

Desktop/Browser

+
+ +
+
+
+

Mobile

+
+
+
+
+ +
+ +
+
+
+ +
diff --git a/web-vault/app/views/backendLayout.html b/web-vault/app/views/backendLayout.html new file mode 100644 index 00000000..cd076260 --- /dev/null +++ b/web-vault/app/views/backendLayout.html @@ -0,0 +1,10 @@ +
+
+ +
+ + Copyright © , 8bit Solutions LLC +
+
diff --git a/web-vault/app/views/frontendLayout.html b/web-vault/app/views/frontendLayout.html new file mode 100644 index 00000000..47e1b0a2 --- /dev/null +++ b/web-vault/app/views/frontendLayout.html @@ -0,0 +1,2 @@ +
+
\ No newline at end of file diff --git a/web-vault/app/views/organizationLayout.html b/web-vault/app/views/organizationLayout.html new file mode 100644 index 00000000..e4dfef9b --- /dev/null +++ b/web-vault/app/views/organizationLayout.html @@ -0,0 +1,118 @@ +
+ + +
+ + + +
+
diff --git a/web-vault/app/views/paidOrgRequired.html b/web-vault/app/views/paidOrgRequired.html new file mode 100644 index 00000000..53ddbee3 --- /dev/null +++ b/web-vault/app/views/paidOrgRequired.html @@ -0,0 +1,13 @@ + + + \ No newline at end of file diff --git a/web-vault/app/views/premiumRequired.html b/web-vault/app/views/premiumRequired.html new file mode 100644 index 00000000..1222c372 --- /dev/null +++ b/web-vault/app/views/premiumRequired.html @@ -0,0 +1,36 @@ + + + \ No newline at end of file diff --git a/web-vault/app/views/userLayout.html b/web-vault/app/views/userLayout.html new file mode 100644 index 00000000..c1b1f6fb --- /dev/null +++ b/web-vault/app/views/userLayout.html @@ -0,0 +1,168 @@ +
+ + +
+ + + +
+
+

Update Your Browser

+ You are using an unsupported web browser. The web vault may not function properly. + Update your browser now. +
+
+

Update Your Encryption Key

+ You are currently using an outdated encryption scheme. + Learn more and update now. +
+
+

Verify Your Email

+
+ Verify your account's email address to unlock access to all features. + Send verification email now. + +
+
+ Check your email inbox for a verification link. + Send verification email again. + +
+
+
+
diff --git a/web-vault/css/vault.min.css b/web-vault/css/vault.min.css new file mode 100644 index 00000000..194d0768 --- /dev/null +++ b/web-vault/css/vault.min.css @@ -0,0 +1 @@ +@charset "UTF-8";@import url(https://fonts.googleapis.com/css?family=Open+Sans:300,400,600,700,300italic,400italic,600italic);.wrapper,body{overflow-x:hidden}.btn.uppercase,.description-block>.description-text,.info-box-text,.nav-stacked>li.header{text-transform:uppercase}.box-body:after,.box-comments .box-comment:after,.box-footer:after,.box-header:after,.chat .item:after,.chat .item>.attachment:after,.control-sidebar-menu>li>a:after,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after,.navbar-nav>.user-menu>.dropdown-menu>.user-body:after,.timeline>li:after,.user-block:after,.user-panel:after,.wrapper:after{clear:both}.toast-title{font-weight:700}.toast-message{word-wrap:break-word}.toast-message a,.toast-message label{color:#FFF}.toast-message a:hover{color:#CCC;text-decoration:none}.toast-close-button{position:relative;right:-.3em;top:-.3em;float:right;font-size:20px;font-weight:700;color:#FFF;-webkit-text-shadow:0 1px 0 #fff;text-shadow:0 1px 0 #fff;opacity:.8}.toast-top-center,.toast-top-full-width{top:0;right:0;width:100%}.toast-close-button:focus,.toast-close-button:hover{color:#111;text-decoration:none;cursor:pointer;opacity:.4}button.toast-close-button{padding:0;cursor:pointer;background:0 0;border:0;-webkit-appearance:none}.toast-bottom-center{bottom:0;right:0;width:100%}.toast-bottom-full-width{bottom:0;right:0;width:100%}.toast-top-left{top:12px;left:12px}.toast-top-right{top:12px;right:12px}.toast-bottom-right{right:12px;bottom:12px}.toast-bottom-left{bottom:12px;left:12px}#toast-container{z-index:999999}#toast-container *{-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#toast-container .toast{position:relative;overflow:hidden;margin:0 0 6px;padding:15px 15px 15px 50px;width:300px;-moz-border-radius:3px;-webkit-border-radius:3px 3px 3px 3px;background-position:15px center;background-repeat:no-repeat;color:#FFF;opacity:.8}.ng-anchor,progress-bar{position:absolute}.wrapper,body{overflow-y:auto}#toast-container .toast:hover{-moz-box-shadow:0 0 12px #111;-webkit-box-shadow:0 0 12px #111;box-shadow:0 0 12px #111;opacity:1;cursor:pointer}#toast-container.toast-bottom-center .toast,#toast-container.toast-top-center .toast{width:300px;margin-left:auto;margin-right:auto}#toast-container.toast-bottom-full-width .toast,#toast-container.toast-top-full-width .toast{width:96%;margin-left:auto;margin-right:auto}.toast{background-color:#030303}.toast-success{background-color:#00a65a}.toast-error{background-color:#dd4b39}.toast-info{background-color:#0073b7}.toast-warning{background-color:#FF851B}progress-bar{left:0;bottom:0;height:4px;background-color:#111;opacity:.4}.layout-boxed body,.layout-boxed html,.wrapper,body,html{height:100%}div[toast]{opacity:1!important}div[toast].ng-enter{opacity:0!important;transition:opacity .3s linear}div[toast].ng-enter.ng-enter-active{opacity:1!important}div[toast].ng-leave{opacity:1;transition:opacity .3s linear}div[toast].ng-leave.ng-leave-active{opacity:0!important}@media all and (max-width:240px){#toast-container .toast.div{padding:8px 8px 8px 50px;width:11em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:241px) and (max-width:480px){#toast-container .toast.div{padding:8px 8px 8px 50px;width:18em}#toast-container .toast-close-button{right:-.2em;top:-.2em}}@media all and (min-width:481px) and (max-width:768px){#toast-container .toast.div{padding:15px 15px 15px 50px;width:25em}}.ng-cloak,.ng-hide:not(.ng-hide-animate),.x-ng-cloak,[data-ng-cloak],[ng-cloak],[ng\:cloak],[x-ng-cloak]{display:none!important}ng\:form{display:block}.ng-animate-shim{visibility:hidden}body{font-weight:400}.wrapper{position:relative}.wrapper:after,.wrapper:before{content:" ";display:table}.layout-boxed .wrapper{max-width:1250px;margin:0 auto;min-height:100%;box-shadow:0 0 8px rgba(0,0,0,.5);position:relative}.layout-boxed{background:url(../images/boxed-bg.png) fixed}.content-wrapper,.main-footer,.right-side{-webkit-transition:-webkit-transform .3s ease-in-out,margin .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,margin .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,margin .3s ease-in-out;transition:transform .3s ease-in-out,margin .3s ease-in-out;margin-left:230px;z-index:820}.layout-top-nav .content-wrapper,.layout-top-nav .main-footer,.layout-top-nav .right-side{margin-left:0}@media (min-width:768px){.sidebar-collapse .content-wrapper,.sidebar-collapse .main-footer,.sidebar-collapse .right-side{margin-left:0}}.content-wrapper,.right-side{min-height:100%;background-color:#ecf0f5;z-index:800}.main-footer{background:#fff;padding:15px;color:#444;border-top:1px solid #d2d6de}.fixed .left-side,.fixed .main-header,.fixed .main-sidebar{position:fixed}.fixed .main-header{top:0;right:0;left:0}.fixed .content-wrapper,.fixed .right-side{padding-top:50px}@media (max-width:767px){.content-wrapper,.main-footer,.right-side{margin-left:0}.sidebar-open .content-wrapper,.sidebar-open .main-footer,.sidebar-open .right-side{-webkit-transform:translate(230px,0);-ms-transform:translate(230px,0);-o-transform:translate(230px,0);transform:translate(230px,0)}.fixed .content-wrapper,.fixed .right-side{padding-top:100px}}.fixed.layout-boxed .wrapper{max-width:100%}body.hold-transition .content-wrapper,body.hold-transition .left-side,body.hold-transition .main-footer,body.hold-transition .main-header .logo,body.hold-transition .main-header .navbar,body.hold-transition .main-sidebar,body.hold-transition .right-side{-webkit-transition:none;-o-transition:none;transition:none}.content{min-height:250px;padding:15px;margin-right:auto;margin-left:auto}a{color:#3c8dbc}a:active,a:focus,a:hover{outline:0;text-decoration:none;color:#72afd2}.page-header{margin:10px 0 20px;font-size:22px}.page-header>small{color:#666;display:block;margin-top:5px}.main-header{position:relative;max-height:100px;z-index:1030}.main-header .navbar{margin-bottom:0;margin-left:230px;border:none;min-height:50px;border-radius:0}.layout-top-nav .main-header .navbar{margin-left:0}.main-header #navbar-search-input.form-control{background:rgba(255,255,255,.2);border-color:transparent}.main-header #navbar-search-input.form-control:active,.main-header #navbar-search-input.form-control:focus{border-color:rgba(0,0,0,.1);background:rgba(255,255,255,.9)}.main-header #navbar-search-input.form-control::-moz-placeholder{color:#ccc;opacity:1}.main-header #navbar-search-input.form-control:-ms-input-placeholder{color:#ccc}.main-header #navbar-search-input.form-control::-webkit-input-placeholder{color:#ccc}.main-header .navbar-custom-menu,.main-header .navbar-right{float:right}@media (max-width:991px){.main-header .navbar-custom-menu a,.main-header .navbar-right a{color:inherit;background:0 0}}@media (max-width:767px){.main-header .navbar-right{float:none}.navbar-collapse .main-header .navbar-right{margin:7.5px -15px}.main-header .navbar-right>li{color:inherit;border:0}}.main-header .navbar-brand,.main-header .sidebar-toggle:hover{color:#fff}.main-header .sidebar-toggle{float:left;background-color:transparent;background-image:none;padding:15px;font-family:fontAwesome}.main-header .sidebar-toggle:before{content:"\f0c9"}.main-header .sidebar-toggle:active,.main-header .sidebar-toggle:focus{background:0 0}.main-header .sidebar-toggle .icon-bar{display:none}.main-header .navbar .nav>li.user>a>.fa,.main-header .navbar .nav>li.user>a>.glyphicon,.main-header .navbar .nav>li.user>a>.ion{margin-right:5px}.main-header .navbar .nav>li>a>.label{position:absolute;top:9px;right:7px;text-align:center;font-size:9px;padding:2px 3px;line-height:.9}.main-header .logo{display:block;float:left;height:50px;font-size:20px;line-height:50px;text-align:center;width:230px;padding:0 15px;font-weight:300;overflow:hidden}.main-header .logo .logo-lg{display:block}.main-header .logo .logo-mini{display:none}.content-header{position:relative;padding:15px 15px 0}.content-header>h1{margin:0;font-size:24px}.content-header>h1>small{font-size:15px;display:inline-block;padding-left:4px;font-weight:300}.content-header>.breadcrumb{float:right;background:0 0;margin-top:0;margin-bottom:0;font-size:12px;padding:7px 5px;position:absolute;top:15px;right:10px;border-radius:2px}.content-header>.breadcrumb>li>a{color:#444;text-decoration:none;display:inline-block}.content-header>.breadcrumb>li>a>.fa,.content-header>.breadcrumb>li>a>.glyphicon,.content-header>.breadcrumb>li>a>.ion{margin-right:5px}.content-header>.breadcrumb>li+li:before{content:'>\00a0'}@media (max-width:991px){.content-header>.breadcrumb{position:relative;margin-top:5px;top:0;right:0;float:none;background:#d2d6de;padding-left:10px}.content-header>.breadcrumb li:before{color:#97a0b3}.navbar-custom-menu .navbar-nav>li{float:left}.navbar-custom-menu .navbar-nav{margin:0;float:left}.navbar-custom-menu .navbar-nav>li>a{padding-top:15px;padding-bottom:15px;line-height:20px}}.navbar-toggle{color:#fff;border:0;margin:0;padding:15px}@media (max-width:767px){.main-header{position:relative}.main-header .logo,.main-header .navbar{width:100%;float:none}.main-header .navbar{margin:0}.main-header .navbar-custom-menu{float:right}}@media (max-width:991px){.navbar-collapse.pull-left{float:none!important}.navbar-collapse.pull-left+.navbar-custom-menu{display:block;position:absolute;top:0;right:40px}}.left-side,.main-sidebar{position:absolute;top:0;left:0;padding-top:50px;min-height:100%;width:230px;z-index:810;-webkit-transition:-webkit-transform .3s ease-in-out,width .3s ease-in-out;-moz-transition:-moz-transform .3s ease-in-out,width .3s ease-in-out;-o-transition:-o-transform .3s ease-in-out,width .3s ease-in-out;transition:transform .3s ease-in-out,width .3s ease-in-out}@media (max-width:767px){.left-side,.main-sidebar{padding-top:100px;-webkit-transform:translate(-230px,0);-ms-transform:translate(-230px,0);-o-transform:translate(-230px,0);transform:translate(-230px,0)}}@media (min-width:768px){.sidebar-collapse .left-side,.sidebar-collapse .main-sidebar{-webkit-transform:translate(-230px,0);-ms-transform:translate(-230px,0);-o-transform:translate(-230px,0);transform:translate(-230px,0)}}@media (max-width:767px){.sidebar-open .left-side,.sidebar-open .main-sidebar{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0)}}.sidebar{padding-bottom:10px}.sidebar-form input:focus{border-color:transparent}.user-panel{position:relative;width:100%;padding:10px;overflow:hidden}.user-panel:after,.user-panel:before{content:" ";display:table}.user-panel>.image>img{width:100%;max-width:45px;height:auto}.user-panel>.info{padding:5px 5px 5px 15px;line-height:1;position:absolute;left:55px}.user-panel>.info>p{font-weight:600;margin-bottom:9px}.user-panel>.info>a{text-decoration:none;padding-right:5px;margin-top:3px;font-size:11px}.user-panel>.info>a>.fa,.user-panel>.info>a>.glyphicon,.user-panel>.info>a>.ion{margin-right:3px}.sidebar-menu{list-style:none;margin:0;padding:0}.sidebar-menu>li{position:relative;margin:0;padding:0}.sidebar-menu>li>a{padding:12px 5px 12px 15px;display:block}.sidebar-menu>li>a>.fa,.sidebar-menu>li>a>.glyphicon,.sidebar-menu>li>a>.ion{width:20px}.sidebar-menu>li .badge,.sidebar-menu>li .label{margin-right:5px}.sidebar-menu>li .badge{margin-top:3px}.sidebar-menu li.header{padding:10px 25px 10px 15px;font-size:12px}.sidebar-menu li>a>.fa-angle-left,.sidebar-menu li>a>.pull-right-container>.fa-angle-left{width:auto;height:auto;padding:0;margin-right:10px}.sidebar-menu li>a>.fa-angle-left{position:absolute;top:50%;right:10px;margin-top:-8px}.sidebar-menu li.active>a>.fa-angle-left,.sidebar-menu li.active>a>.pull-right-container>.fa-angle-left{-webkit-transform:rotate(-90deg);-ms-transform:rotate(-90deg);-o-transform:rotate(-90deg);transform:rotate(-90deg)}.sidebar-menu li.active>.treeview-menu{display:block}.sidebar-menu .treeview-menu{display:none;list-style:none;padding:0 0 0 5px;margin:0}.sidebar-menu .treeview-menu .treeview-menu{padding-left:20px}.sidebar-menu .treeview-menu>li{margin:0}.sidebar-menu .treeview-menu>li>a{padding:5px 5px 5px 15px;display:block;font-size:14px}.sidebar-menu .treeview-menu>li>a>.fa,.sidebar-menu .treeview-menu>li>a>.glyphicon,.sidebar-menu .treeview-menu>li>a>.ion{width:20px}.sidebar-menu .treeview-menu>li>a>.fa-angle-down,.sidebar-menu .treeview-menu>li>a>.fa-angle-left,.sidebar-menu .treeview-menu>li>a>.pull-right-container>.fa-angle-down,.sidebar-menu .treeview-menu>li>a>.pull-right-container>.fa-angle-left{width:auto}@media (min-width:768px){.sidebar-mini.sidebar-collapse .content-wrapper,.sidebar-mini.sidebar-collapse .main-footer,.sidebar-mini.sidebar-collapse .right-side{margin-left:50px!important;z-index:840}.sidebar-mini.sidebar-collapse .main-sidebar{-webkit-transform:translate(0,0);-ms-transform:translate(0,0);-o-transform:translate(0,0);transform:translate(0,0);width:50px!important;z-index:850}.sidebar-mini.sidebar-collapse .sidebar-menu>li{position:relative}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a{margin-right:0}.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{border-top-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:not(.treeview)>a>span{border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{padding-top:5px;padding-bottom:5px;border-bottom-right-radius:4px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span:not(.pull-right){display:block!important;position:absolute;width:180px;left:50px}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>span{top:0;margin-left:-3px;padding:12px 5px 12px 20px;background-color:inherit}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container{position:relative!important;float:right;width:auto!important;left:180px!important;top:-22px!important;z-index:900}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>a>.pull-right-container>.label:not(:first-of-type){display:none}.sidebar-mini.sidebar-collapse .sidebar-menu>li:hover>.treeview-menu{top:44px;margin-left:0}.sidebar-mini.sidebar-collapse .main-sidebar .user-panel>.info,.sidebar-mini.sidebar-collapse .sidebar-form,.sidebar-mini.sidebar-collapse .sidebar-menu li.header,.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>.pull-right,.sidebar-mini.sidebar-collapse .sidebar-menu>li>a>span{display:none!important;-webkit-transform:translateZ(0)}.sidebar-mini.sidebar-collapse .main-header .logo{width:50px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-mini{display:block;margin-left:-15px;margin-right:-15px;font-size:18px}.sidebar-mini.sidebar-collapse .main-header .logo>.logo-lg{display:none}.sidebar-mini.sidebar-collapse .main-header .navbar{margin-left:50px}.control-sidebar-open .content-wrapper,.control-sidebar-open .main-footer,.control-sidebar-open .right-side{margin-right:230px}}.main-sidebar .user-panel,.sidebar-menu,.sidebar-menu>li.header{white-space:nowrap;overflow:hidden}.sidebar-menu:hover{overflow:visible}.sidebar-form,.sidebar-menu>li.header{overflow:hidden;text-overflow:clip}.sidebar-menu li>a{position:relative}.sidebar-menu li>a>.pull-right-container{position:absolute;right:10px;top:50%;margin-top:-7px}.control-sidebar-bg{z-index:1000;bottom:0}.control-sidebar,.control-sidebar-bg{top:0;right:-230px;width:230px;-webkit-transition:right .3s ease-in-out;-o-transition:right .3s ease-in-out;transition:right .3s ease-in-out}.control-sidebar{padding-top:50px;z-index:1010}@media (max-width:768px){.control-sidebar{padding-top:100px}.nav-tabs.control-sidebar-tabs{display:table}.nav-tabs.control-sidebar-tabs>li{display:table-cell}}.control-sidebar>.tab-content{padding:10px 15px}.control-sidebar-open .control-sidebar,.control-sidebar-open .control-sidebar-bg,.control-sidebar.control-sidebar-open,.control-sidebar.control-sidebar-open+.control-sidebar-bg{right:0}.nav-tabs.control-sidebar-tabs>li:first-of-type>a,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:focus,.nav-tabs.control-sidebar-tabs>li:first-of-type>a:hover{border-left-width:0}.nav-tabs.control-sidebar-tabs>li>a{border-radius:0}.nav-tabs.control-sidebar-tabs>li>a,.nav-tabs.control-sidebar-tabs>li>a:hover{border-top:none;border-right:none;border-left:1px solid transparent;border-bottom:1px solid transparent}.nav-tabs.control-sidebar-tabs>li>a .icon{font-size:16px}.nav-tabs.control-sidebar-tabs>li.active>a,.nav-tabs.control-sidebar-tabs>li.active>a:active,.nav-tabs.control-sidebar-tabs>li.active>a:focus,.nav-tabs.control-sidebar-tabs>li.active>a:hover{border-top:none;border-right:none;border-bottom:none}.control-sidebar-heading{font-weight:400;font-size:16px;margin-bottom:10px}.control-sidebar-subheading{display:block;font-weight:400;font-size:14px}.control-sidebar-menu{list-style:none;padding:0;margin:0 -15px}.control-sidebar-menu>li>a{display:block;padding:10px 15px}.control-sidebar-menu>li>a:after,.control-sidebar-menu>li>a:before{content:" ";display:table}.control-sidebar-menu>li>a>.control-sidebar-subheading{margin-top:0}.control-sidebar-menu .menu-icon{float:left;width:35px;height:35px;border-radius:50%;text-align:center;line-height:35px}.control-sidebar-menu .menu-info{margin-left:45px;margin-top:3px}.control-sidebar-menu .menu-info>.control-sidebar-subheading,.control-sidebar-menu .progress{margin:0}.control-sidebar-menu .menu-info>p{margin:0;font-size:11px}.control-sidebar-dark{color:#b8c7ce}.control-sidebar-dark,.control-sidebar-dark+.control-sidebar-bg{background:#222d32}.control-sidebar-dark .nav-tabs.control-sidebar-tabs{border-bottom:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a{background:#181f23;color:#b8c7ce}.control-sidebar-dark .control-sidebar-heading,.control-sidebar-dark .control-sidebar-subheading,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{color:#fff}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#141a1d;border-bottom-color:#141a1d}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li>a:hover{background:#1c2529}.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-dark .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#222d32;color:#fff}.control-sidebar-dark .control-sidebar-menu>li>a:hover{background:#1e282c}.control-sidebar-dark .control-sidebar-menu>li>a .menu-info>p{color:#b8c7ce}.control-sidebar-light{color:#5e5e5e}.control-sidebar-light,.control-sidebar-light+.control-sidebar-bg{background:#f9fafc;border-left:1px solid #d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs{border-bottom:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a{background:#e8ecf4;color:#444}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{border-left-color:#d2d6de;border-bottom-color:#d2d6de}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li>a:hover{background:#eff1f7}.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:active,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:focus,.control-sidebar-light .nav-tabs.control-sidebar-tabs>li.active>a:hover{background:#f9fafc;color:#111}.control-sidebar-light .control-sidebar-heading,.control-sidebar-light .control-sidebar-subheading{color:#111}.control-sidebar-light .control-sidebar-menu{margin-left:-14px}.control-sidebar-light .control-sidebar-menu>li>a:hover{background:#f4f4f5}.control-sidebar-light .control-sidebar-menu>li>a .menu-info>p{color:#5e5e5e}.dropdown-menu{box-shadow:none}.dropdown-menu>li>a>.fa,.dropdown-menu>li>a>.glyphicon,.dropdown-menu>li>a>.ion{margin-right:10px}.dropdown-menu>li>a:hover{background-color:#e1e3e9;color:#333}.dropdown-menu>.divider{background-color:#eee}.navbar-nav>.messages-menu>.dropdown-menu,.navbar-nav>.notifications-menu>.dropdown-menu,.navbar-nav>.tasks-menu>.dropdown-menu{width:280px;padding:0;margin:0;top:100%}.navbar-nav>.messages-menu>.dropdown-menu>li,.navbar-nav>.notifications-menu>.dropdown-menu>li,.navbar-nav>.tasks-menu>.dropdown-menu>li{position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li.header,.navbar-nav>.notifications-menu>.dropdown-menu>li.header,.navbar-nav>.tasks-menu>.dropdown-menu>li.header{background-color:#fff;padding:7px 10px;border-bottom:1px solid #f4f4f4;color:#444;font-size:14px;border-radius:4px 4px 0 0}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{font-size:12px;background-color:#fff;padding:7px 10px;border-bottom:1px solid #eee;color:#444!important;text-align:center;border-radius:0 0 4px 4px}@media (max-width:991px){.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a{background:#fff!important;color:#444!important}}.navbar-nav>.messages-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li.footer>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li.footer>a:hover{text-decoration:none;font-weight:400}.navbar-nav>.messages-menu>.dropdown-menu>li .menu,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu{max-height:200px;margin:0;padding:0;list-style:none;overflow-x:hidden}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{display:block;white-space:nowrap;border-bottom:1px solid #f4f4f4}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a:hover,.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a:hover{background:#f4f4f4;text-decoration:none}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a{color:#444;overflow:hidden;text-overflow:ellipsis;padding:10px}.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.fa,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.glyphicon,.navbar-nav>.notifications-menu>.dropdown-menu>li .menu>li>a>.ion{width:20px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a{margin:0;padding:10px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>div>img{margin:auto 10px auto auto;width:40px;height:40px}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4{padding:0;margin:0 0 0 45px;color:#444;font-size:15px;position:relative}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>h4>small{color:#999;font-size:10px;position:absolute;top:0;right:0}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a>p{margin:0 0 0 45px;font-size:12px;color:#888}.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:after,.navbar-nav>.messages-menu>.dropdown-menu>li .menu>li>a:before{content:" ";display:table}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a{padding:10px}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>h3{font-size:14px;padding:0;margin:0 0 10px;color:#666}.navbar-nav>.tasks-menu>.dropdown-menu>li .menu>li>a>.progress{padding:0;margin:0}.navbar-nav>.user-menu>.dropdown-menu{border-top-right-radius:0;border-top-left-radius:0;padding:1px 0 0;border-top-width:0;width:280px}.navbar-nav>.user-menu>.dropdown-menu,.navbar-nav>.user-menu>.dropdown-menu>.user-body{border-bottom-right-radius:4px;border-bottom-left-radius:4px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header{height:175px;padding:10px;text-align:center}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>img{z-index:5;height:90px;width:90px;border:3px solid transparent;border-color:rgba(255,255,255,.2)}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p{z-index:5;color:#fff;color:rgba(255,255,255,.8);font-size:17px;margin-top:10px}.navbar-nav>.user-menu>.dropdown-menu>li.user-header>p>small{display:block;font-size:12px}.navbar-nav>.user-menu>.dropdown-menu>.user-body:after,.navbar-nav>.user-menu>.dropdown-menu>.user-body:before,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after,.navbar-nav>.user-menu>.dropdown-menu>.user-footer:before{display:table;content:" "}.navbar-nav>.user-menu>.dropdown-menu>.user-body{padding:15px;border-bottom:1px solid #f4f4f4;border-top:1px solid #ddd}.navbar-nav>.user-menu>.dropdown-menu>.user-body a{color:#444!important}@media (max-width:991px){.navbar-nav>.user-menu>.dropdown-menu>.user-body a{background:#fff!important;color:#444!important}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default:hover{background-color:#f9f9f9}}.navbar-nav>.user-menu>.dropdown-menu>.user-footer{background-color:#f9f9f9;padding:10px}.navbar-nav>.user-menu>.dropdown-menu>.user-footer:after{clear:both}.navbar-nav>.user-menu>.dropdown-menu>.user-footer .btn-default{color:#666}.navbar-nav>.user-menu .user-image{float:left;width:25px;height:25px;border-radius:50%;margin-right:10px;margin-top:-2px}@media (max-width:767px){.navbar-nav>.user-menu .user-image{float:none;margin-right:0;margin-top:-8px;line-height:10px}}.open:not(.dropup)>.animated-dropdown-menu{backface-visibility:visible!important;-webkit-animation:flipInX .7s both;-o-animation:flipInX .7s both;animation:flipInX .7s both}@keyframes flipInX{0%{transform:perspective(400px) rotate3d(1,0,0,90deg);transition-timing-function:ease-in;opacity:0}40%{transform:perspective(400px) rotate3d(1,0,0,-20deg);transition-timing-function:ease-in}60%{transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{transform:perspective(400px)}}@-webkit-keyframes flipInX{0%{-webkit-transform:perspective(400px) rotate3d(1,0,0,90deg);-webkit-transition-timing-function:ease-in;opacity:0}40%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-20deg);-webkit-transition-timing-function:ease-in}60%{-webkit-transform:perspective(400px) rotate3d(1,0,0,10deg);opacity:1}80%{-webkit-transform:perspective(400px) rotate3d(1,0,0,-5deg)}100%{-webkit-transform:perspective(400px)}}.navbar-custom-menu>.navbar-nav>li{position:relative}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:0;left:auto}@media (max-width:991px){.navbar-custom-menu>.navbar-nav{float:right}.navbar-custom-menu>.navbar-nav>li{position:static}.navbar-custom-menu>.navbar-nav>li>.dropdown-menu{position:absolute;right:5%;left:auto;border:1px solid #ddd;background:#fff}}.progress-striped .progress-bar-green,.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary,.progress-striped .progress-bar-success{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.form-control{box-shadow:none;border-color:#d2d6de}.form-control:focus{border-color:#3c8dbc;box-shadow:none}.form-control:-ms-input-placeholder,.form-control::-moz-placeholder,.form-control::-webkit-input-placeholder{color:#bbb;opacity:1}.form-group.has-success .help-block,.form-group.has-success label{color:#00a65a}.form-control:not(select){-webkit-appearance:none;-moz-appearance:none;appearance:none}.form-group.has-success .form-control,.form-group.has-success .input-group-addon{border-color:#00a65a;box-shadow:none}.form-group.has-warning .help-block,.form-group.has-warning label{color:#bf7e16}.form-group.has-warning .form-control,.form-group.has-warning .input-group-addon{border-color:#bf7e16;box-shadow:none}.form-group.has-error .help-block,.form-group.has-error label{color:#dd4b39}.form-group.has-error .form-control,.form-group.has-error .input-group-addon{border-color:#dd4b39;box-shadow:none}.input-group .input-group-addon{border-radius:0;border-color:#d2d6de;background-color:#fff}.btn-group-vertical .btn.btn-flat:first-of-type,.btn-group-vertical .btn.btn-flat:last-of-type{border-radius:0}.progress,.progress .progress-bar,.progress-sm,.progress-sm .progress-bar,.progress-xs,.progress-xs .progress-bar,.progress-xxs,.progress-xxs .progress-bar,.progress.sm,.progress.sm .progress-bar,.progress.xs,.progress.xs .progress-bar,.progress.xxs,.progress.xxs .progress-bar,.progress>.progress-bar,.progress>.progress-bar .progress-bar{border-radius:1px}.icheck>label{padding-left:0}.form-control-feedback.fa{line-height:34px}.form-group-lg .form-control+.form-control-feedback.fa,.input-group-lg+.form-control-feedback.fa,.input-lg+.form-control-feedback.fa{line-height:46px}.form-group-sm .form-control+.form-control-feedback.fa,.input-group-sm+.form-control-feedback.fa,.input-sm+.form-control-feedback.fa{line-height:30px}.progress,.progress>.progress-bar{-webkit-box-shadow:none;box-shadow:none}.box,.small-box{box-shadow:0 1px 1px rgba(0,0,0,.1)}.progress-sm,.progress.sm{height:10px}.progress-xs,.progress.xs{height:7px}.progress-xxs,.progress.xxs{height:3px}.progress.vertical{position:relative;width:30px;height:200px;display:inline-block;margin-right:10px}.progress.vertical>.progress-bar{width:100%;position:absolute;bottom:0}.progress.vertical.progress-sm,.progress.vertical.sm{width:20px}.progress.vertical.progress-xs,.progress.vertical.xs{width:10px}.progress.vertical.progress-xxs,.progress.vertical.xxs{width:3px}.progress-group .progress-text{font-weight:600}.progress-group .progress-number{float:right}.table tr>td .progress{margin:0}.progress-bar-light-blue,.progress-bar-primary{background-color:#3c8dbc}.progress-striped .progress-bar-light-blue,.progress-striped .progress-bar-primary{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-green,.progress-bar-success{background-color:#00a65a}.progress-striped .progress-bar-green,.progress-striped .progress-bar-success{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info,.progress-striped .progress-bar-warning,.progress-striped .progress-bar-yellow{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-aqua,.progress-bar-info{background-color:#00c0ef}.progress-striped .progress-bar-aqua,.progress-striped .progress-bar-info{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-warning,.progress-bar-yellow{background-color:#bf7e16}.progress-striped .progress-bar-warning,.progress-striped .progress-bar-yellow{background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.progress-bar-danger,.progress-bar-red{background-color:#dd4b39}.progress-striped .progress-bar-danger,.progress-striped .progress-bar-red{background-image:-webkit-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:-o-linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent);background-image:linear-gradient(45deg,rgba(255,255,255,.15) 25%,transparent 25%,transparent 50%,rgba(255,255,255,.15) 50%,rgba(255,255,255,.15) 75%,transparent 75%,transparent)}.small-box{border-radius:2px;position:relative;display:block;margin-bottom:20px}.small-box>.inner{padding:10px}.small-box>.small-box-footer{position:relative;text-align:center;padding:3px 0;color:#fff;color:rgba(255,255,255,.8);display:block;z-index:10;background:rgba(0,0,0,.1);text-decoration:none}.small-box>.small-box-footer:hover{color:#fff;background:rgba(0,0,0,.15)}.small-box h3{font-size:38px;font-weight:700;margin:0 0 10px;white-space:nowrap;padding:0}.small-box p{font-size:15px}.small-box p>small{display:block;color:#f9f9f9;font-size:13px;margin-top:5px}.small-box h3,.small-box p{z-index:5}.small-box .icon{-webkit-transition:all .3s linear;-o-transition:all .3s linear;transition:all .3s linear;position:absolute;top:-10px;right:10px;z-index:0;font-size:90px;color:rgba(0,0,0,.15)}.small-box:hover{text-decoration:none;color:#f9f9f9}.small-box:hover .icon{font-size:95px}@media (max-width:767px){.small-box{text-align:center}.small-box .icon{display:none}.small-box p{font-size:12px}}.box{position:relative;border-radius:3px;background:#fff;border-top:3px solid #d2d6de;margin-bottom:20px;width:100%}.box.box-primary{border-top-color:#3c8dbc}.box.box-info{border-top-color:#00c0ef}.box.box-danger{border-top-color:#dd4b39}.box.box-warning{border-top-color:#bf7e16}.box.box-success{border-top-color:#00a65a}.box.box-default{border-top-color:#d2d6de}.box.collapsed-box .box-body,.box.collapsed-box .box-footer{display:none}.box .nav-stacked>li{border-bottom:1px solid #f4f4f4;margin:0}.box .nav-stacked>li:last-of-type{border-bottom:none}.box.height-control .box-body{max-height:300px;overflow:auto}.box .border-right{border-right:1px solid #f4f4f4}.box .border-left{border-left:1px solid #f4f4f4}.box.box-solid{border-top:0}.box.box-solid>.box-header .btn.btn-default{background:0 0}.box.box-solid>.box-header .btn:hover,.box.box-solid>.box-header a:hover{background:rgba(0,0,0,.1)}.box.box-solid.box-default{border:1px solid #d2d6de}.box.box-solid.box-default>.box-header{color:#444;background:#d2d6de}.box.box-solid.box-default>.box-header .btn,.box.box-solid.box-default>.box-header a{color:#444}.box.box-solid.box-primary{border:1px solid #3c8dbc}.box.box-solid.box-primary>.box-header{color:#fff;background:#3c8dbc}.box.box-solid.box-primary>.box-header .btn,.box.box-solid.box-primary>.box-header a{color:#fff}.box.box-solid.box-info{border:1px solid #00c0ef}.box.box-solid.box-info>.box-header{color:#fff;background:#00c0ef}.box.box-solid.box-info>.box-header .btn,.box.box-solid.box-info>.box-header a{color:#fff}.box.box-solid.box-danger{border:1px solid #dd4b39}.box.box-solid.box-danger>.box-header{color:#fff;background:#dd4b39}.box.box-solid.box-danger>.box-header .btn,.box.box-solid.box-danger>.box-header a{color:#fff}.box.box-solid.box-warning{border:1px solid #bf7e16}.box.box-solid.box-warning>.box-header{color:#fff;background:#bf7e16}.box.box-solid.box-warning>.box-header .btn,.box.box-solid.box-warning>.box-header a{color:#fff}.box.box-solid.box-success{border:1px solid #00a65a}.box.box-solid.box-success>.box-header{color:#fff;background:#00a65a}.box.box-solid.box-success>.box-header .btn,.box.box-solid.box-success>.box-header a{color:#fff}.box.box-solid>.box-header>.box-tools .btn{border:0;box-shadow:none}.box.box-solid[class*=bg]>.box-header{color:#fff}.box .box-group>.box{margin-bottom:5px}.box .knob-label{text-align:center;color:#333;font-weight:100;font-size:12px;margin-bottom:.3em}.box>.loading-img,.box>.overlay,.overlay-wrapper>.loading-img,.overlay-wrapper>.overlay{position:absolute;top:0;left:0;width:100%;height:100%}.box .overlay,.overlay-wrapper .overlay{z-index:50;background:rgba(255,255,255,.7);border-radius:3px}.box .overlay>.fa,.overlay-wrapper .overlay>.fa{position:absolute;top:50%;left:50%;margin-left:-15px;margin-top:-15px;color:#000;font-size:30px}.box .overlay.dark,.overlay-wrapper .overlay.dark{background:rgba(0,0,0,.5)}.box-body:after,.box-body:before,.box-footer:after,.box-footer:before,.box-header:after,.box-header:before{content:" ";display:table}.box-header{color:#444;display:block;padding:10px;position:relative}.box-header.with-border{border-bottom:1px solid #f4f4f4}.collapsed-box .box-header.with-border{border-bottom:none}.box-header .box-title,.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{display:inline-block;font-size:18px;margin:0;line-height:1}.box-header>.fa,.box-header>.glyphicon,.box-header>.ion{margin-right:5px}.box-header>.box-tools{position:absolute;right:10px;top:5px}.box-header>.box-tools [data-toggle=tooltip],.timeline{position:relative}.box-header>.box-tools.pull-right .dropdown-menu{right:0;left:auto}.box-header>.box-tools .dropdown-menu>li>a{color:#444!important}.btn-box-tool{padding:5px;font-size:12px;background:0 0;color:#97a0b3}.btn-box-tool:hover,.open .btn-box-tool{color:#606c84}.btn-box-tool.btn:active{box-shadow:none}.box-body{padding:10px;border-radius:0 0 3px 3px}.no-header .box-body{border-top-right-radius:3px;border-top-left-radius:3px}.box-body>.table{margin-bottom:0}.box-body .fc{margin-top:5px}.box-body .full-width-chart{margin:-19px}.box-body.no-padding .full-width-chart{margin:-9px}.box-body .box-pane{border-radius:0 0 0 3px}.box-body .box-pane-right{border-radius:0 0 3px}.box-footer{border-top:1px solid #f4f4f4;padding:10px;background-color:#fff;border-radius:0 0 3px 3px}@media (max-width:991px){.chart-legend>li{float:left;margin-right:10px}}.box-comments{background:#f7f7f7}.box-comments .box-comment{padding:8px 0;border-bottom:1px solid #eee}.box-comments .box-comment:after,.box-comments .box-comment:before{content:" ";display:table}.box-comments .box-comment:last-of-type{border-bottom:0}.box-comments .box-comment:first-of-type{padding-top:0}.box-comments .box-comment img{float:left}.box-comments .comment-text{margin-left:40px;color:#555}.box-comments .username{color:#444;display:block;font-weight:600}.box-comments .text-muted{font-weight:400;font-size:12px}.todo-list{margin:0;padding:0;list-style:none;overflow:auto}.todo-list>li{border-radius:2px;padding:10px;background:#f4f4f4;margin-bottom:2px;border-left:2px solid #e6e7e8;color:#444}.todo-list>li:last-of-type{margin-bottom:0}.todo-list>li>input[type=checkbox]{margin:0 10px 0 5px}.todo-list>li .text{display:inline-block;margin-left:5px;font-weight:600}.todo-list>li .label{margin-left:10px;font-size:9px}.todo-list>li .tools{display:none;float:right;color:#dd4b39}.todo-list .handle,.todo-list>li:hover .tools{display:inline-block}.todo-list>li .tools>.fa,.todo-list>li .tools>.glyphicon,.todo-list>li .tools>.ion{margin-right:5px;cursor:pointer}.todo-list>li.done{color:#999}.todo-list>li.done .text{text-decoration:line-through;font-weight:500}.todo-list>li.done .label{background:#d2d6de!important}.todo-list .danger{border-left-color:#dd4b39}.todo-list .warning{border-left-color:#bf7e16}.todo-list .info{border-left-color:#00c0ef}.todo-list .success{border-left-color:#00a65a}.todo-list .primary{border-left-color:#3c8dbc}.todo-list .handle{cursor:move;margin:0 5px}.chat{padding:5px 20px 5px 10px}.chat .item{margin-bottom:10px}.chat .item:after,.chat .item:before{content:" ";display:table}.chat .item>img{width:40px;height:40px;border:2px solid transparent;border-radius:50%}.chat .item>.online{border:2px solid #00a65a}.chat .item>.offline{border:2px solid #dd4b39}.chat .item>.message{margin-left:55px;margin-top:-40px}.chat .item>.message>.name{display:block;font-weight:600}.chat .item>.attachment{border-radius:3px;background:#f4f4f4;margin-left:65px;margin-right:15px;padding:10px}.chat .item>.attachment>h4{margin:0 0 5px;font-weight:600;font-size:14px}.chat .item>.attachment>.filename,.chat .item>.attachment>p{font-weight:600;font-size:13px;font-style:italic;margin:0}.chat .item>.attachment:after,.chat .item>.attachment:before{content:" ";display:table}.box-input{max-width:200px}.modal .panel-body{color:#444}.info-box{display:block;min-height:90px;background:#fff;width:100%;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:2px;margin-bottom:15px}.info-box small{font-size:14px}.info-box .progress{background:rgba(0,0,0,.2);margin:5px -10px;height:2px}.info-box .progress,.info-box .progress .progress-bar{border-radius:0}.info-box .progress .progress-bar{background:#fff}.info-box-icon{display:block;float:left;height:90px;width:90px;text-align:center;font-size:45px;line-height:90px;background:rgba(0,0,0,.2);border-radius:2px 0 0 2px}.info-box-icon>img{max-width:100%}.info-box-content{padding:5px 10px;margin-left:90px}.info-box-number{display:block;font-weight:700;font-size:18px}.info-box-text,.progress-description{display:block;font-size:14px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.info-box-more{display:block}.progress-description{margin:0}.timeline{margin:0 0 30px;padding:0;list-style:none}.timeline:before{content:'';position:absolute;top:0;bottom:0;width:4px;background:#ddd;left:31px;margin:0;border-radius:2px}.timeline>li{position:relative;margin-right:10px;margin-bottom:15px}.timeline>li:after,.timeline>li:before{content:" ";display:table}.timeline>li>.timeline-item{-webkit-box-shadow:0 1px 1px rgba(0,0,0,.1);box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px;margin-top:0;background:#fff;color:#444;margin-left:60px;margin-right:15px;padding:0;position:relative}.timeline>li>.timeline-item>.time{color:#999;float:right;padding:10px;font-size:12px}.timeline>li>.timeline-item>.timeline-header{margin:0;color:#555;border-bottom:1px solid #f4f4f4;padding:10px;font-size:16px;line-height:1.1}.timeline>li>.timeline-item>.timeline-header>a{font-weight:600}.timeline>li>.timeline-item>.timeline-body,.timeline>li>.timeline-item>.timeline-footer{padding:10px}.timeline>li>.fa,.timeline>li>.glyphicon,.timeline>li>.ion{width:30px;height:30px;font-size:15px;line-height:30px;position:absolute;color:#666;background:#d2d6de;border-radius:50%;text-align:center;left:18px;top:0}.timeline>.time-label>span{font-weight:600;padding:5px;display:inline-block;background-color:#fff;border-radius:4px}.timeline-inverse>li>.timeline-item{background:#f0f0f0;border:1px solid #ddd;-webkit-box-shadow:none;box-shadow:none}.btn,.btn-app{border-radius:3px}.timeline-inverse>li>.timeline-item>.timeline-header{border-bottom-color:#ddd}.btn{-webkit-box-shadow:none;box-shadow:none;border:1px solid transparent}.btn.btn-flat{border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;border-width:1px}.btn:active{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn:focus{outline:0}.btn.btn-file{position:relative;overflow:hidden}.btn.btn-file>input[type=file]{position:absolute;top:0;right:0;min-width:100%;min-height:100%;font-size:100px;text-align:right;opacity:0;filter:alpha(opacity=0);outline:0;background:#fff;cursor:inherit;display:block}.btn-app,table.text-center,table.text-center td,table.text-center th{text-align:center}.btn-default{background-color:#f4f4f4;color:#444;border-color:#ddd}.btn-default.hover,.btn-default:active,.btn-default:hover{background-color:#e7e7e7}.btn-primary,.skin-blue .main-header .navbar{background-color:#3c8dbc}.btn-primary{border-color:#367fa9}.btn-primary.hover,.btn-primary:active,.btn-primary:hover{background-color:#367fa9}.btn-success{background-color:#00a65a;border-color:#008d4c}.btn-success.hover,.btn-success:active,.btn-success:hover{background-color:#008d4c}.btn-info{background-color:#00c0ef;border-color:#00acd6}.btn-info.hover,.btn-info:active,.btn-info:hover{background-color:#00acd6}.btn-danger{background-color:#dd4b39;border-color:#d73925}.btn-danger.hover,.btn-danger:active,.btn-danger:hover{background-color:#d73925}.btn-warning{background-color:#bf7e16;border-color:#a86f13}.btn-warning.hover,.btn-warning:active,.btn-warning:hover{background-color:#a86f13}.btn-outline{border:1px solid #fff;background:0 0;color:#fff}.btn-outline:active,.btn-outline:focus,.btn-outline:hover{color:rgba(255,255,255,.7);border-color:rgba(255,255,255,.7)}.btn-link{-webkit-box-shadow:none;box-shadow:none}.btn[class*=bg-]:hover{-webkit-box-shadow:inset 0 0 100px rgba(0,0,0,.2);box-shadow:inset 0 0 100px rgba(0,0,0,.2)}.btn-app{position:relative;padding:15px 5px;margin:0 0 10px 10px;min-width:80px;height:60px;color:#666;border:1px solid #ddd;background-color:#f4f4f4;font-size:12px}.alert,.callout{border-radius:3px}.btn-app>.fa,.btn-app>.glyphicon,.btn-app>.ion{font-size:20px;display:block}.btn-app:hover{background:#f4f4f4;color:#444;border-color:#aaa}.btn-app:active,.btn-app:focus{-webkit-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);-moz-box-shadow:inset 0 3px 5px rgba(0,0,0,.125);box-shadow:inset 0 3px 5px rgba(0,0,0,.125)}.btn-app>.badge{position:absolute;top:-3px;right:-10px;font-size:10px;font-weight:400}.alert h4,.callout h4,.nav-pills>li.active>a{font-weight:600}.callout{margin:0 0 20px;padding:15px 30px 15px 15px;border-left:5px solid #eee}.callout a{color:#fff;text-decoration:underline}.callout a:hover{color:#eee}.callout h4{margin-top:0}.callout p:last-child{margin-bottom:0}.callout .highlight,.callout code{background-color:#fff}.callout.callout-danger{border-color:#c23321}.callout.callout-warning{border-color:#916011}.callout.callout-info{border-color:#0097bc}.callout.callout-success{border-color:#00733e}.alert .icon{margin-right:10px}.alert .close{color:#000;opacity:.2;filter:alpha(opacity=20)}.alert .close:hover{opacity:.5;filter:alpha(opacity=50)}.alert a{color:#fff;text-decoration:underline}.callout a.btn,.skin-blue .sidebar a:hover,.skin-blue-light .sidebar a:hover{text-decoration:none}.alert-success{border-color:#008d4c}.alert-danger,.alert-error{border-color:#d73925}.alert-warning{border-color:#a86f13}.alert-info{border-color:#00acd6}.nav>li>a:active,.nav>li>a:focus,.nav>li>a:hover{color:#444;background:#f7f7f7}.nav-pills>li>a{border-radius:0;border-top:3px solid transparent;color:#444}.nav-pills>li>a>.fa,.nav-pills>li>a>.glyphicon,.nav-pills>li>a>.ion{margin-right:5px}.nav-pills>li.active>a,.nav-pills>li.active>a:focus,.nav-pills>li.active>a:hover{border-top-color:#3c8dbc}.nav-stacked>li>a{border-radius:0;border-top:0;border-left:3px solid transparent;color:#444}.nav-stacked>li.active>a,.nav-stacked>li.active>a:hover{background:0 0;color:#444;border-top:0;border-left-color:#3c8dbc}.nav-stacked>li.header{border-bottom:1px solid #ddd;color:#777;margin-bottom:10px;padding:5px 10px}.nav-tabs-custom{margin-bottom:20px;background:#fff;box-shadow:0 1px 1px rgba(0,0,0,.1);border-radius:3px}.nav-tabs-custom>.nav-tabs{margin:0;border-bottom-color:#f4f4f4;border-top-right-radius:3px;border-top-left-radius:3px}.nav-tabs-custom>.nav-tabs>li{border-top:3px solid transparent;margin-bottom:-2px;margin-right:5px}.nav-tabs-custom>.nav-tabs>li>a{color:#444;border-radius:0}.nav-tabs-custom>.nav-tabs>li>a.text-muted,.nav-tabs-custom>.nav-tabs>li>a:hover{color:#999}.nav-tabs-custom>.nav-tabs>li>a,.nav-tabs-custom>.nav-tabs>li>a:hover{background:0 0;margin:0}.nav-tabs-custom>.nav-tabs>li:not(.active)>a:active,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:focus,.nav-tabs-custom>.nav-tabs>li:not(.active)>a:hover{border-color:transparent}.nav-tabs-custom>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom>.nav-tabs>li.active:hover>a,.nav-tabs-custom>.nav-tabs>li.active>a{background-color:#fff;color:#444}.nav-tabs-custom>.nav-tabs>li.active>a{border-top-color:transparent;border-left-color:#f4f4f4;border-right-color:#f4f4f4}.nav-tabs-custom>.nav-tabs>li:first-of-type{margin-left:0}.nav-tabs-custom>.nav-tabs>li:first-of-type.active>a{border-left-color:transparent}.nav-tabs-custom>.nav-tabs.pull-right{float:none!important}.nav-tabs-custom>.nav-tabs.pull-right>li{float:right}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type{margin-right:0}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type>a{border-left-width:1px}.nav-tabs-custom>.nav-tabs.pull-right>li:first-of-type.active>a{border-left-color:#f4f4f4;border-right-color:transparent}.nav-tabs-custom>.nav-tabs>li.header{line-height:35px;padding:0 10px;font-size:20px;color:#444}.nav-tabs-custom>.nav-tabs>li.header>.fa,.nav-tabs-custom>.nav-tabs>li.header>.glyphicon,.nav-tabs-custom>.nav-tabs>li.header>.ion{margin-right:5px}.nav-tabs-custom>.tab-content{background:#fff;padding:10px;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.nav-tabs-custom .dropdown.open>a:active,.nav-tabs-custom .dropdown.open>a:focus{background:0 0;color:#999}.nav-tabs-custom.tab-primary>.nav-tabs>li.active{border-top-color:#3c8dbc}.nav-tabs-custom.tab-info>.nav-tabs>li.active{border-top-color:#00c0ef}.nav-tabs-custom.tab-danger>.nav-tabs>li.active{border-top-color:#dd4b39}.nav-tabs-custom.tab-warning>.nav-tabs>li.active{border-top-color:#bf7e16}.nav-tabs-custom.tab-success>.nav-tabs>li.active{border-top-color:#00a65a}.nav-tabs-custom.tab-default>.nav-tabs>li.active{border-top-color:#d2d6de}.pagination>li>a{background:#fafafa;color:#666}.pagination.pagination-flat>li>a{border-radius:0!important}.table>tbody>tr>td,.table>tbody>tr>th,.table>tfoot>tr>td,.table>tfoot>tr>th,.table>thead>tr>td,.table>thead>tr>th{border-top:1px solid #f4f4f4}.table>thead>tr>th{border-bottom:2px solid #f4f4f4}.table tr td .progress{margin-top:5px}.table-bordered,.table-bordered>tbody>tr>td,.table-bordered>tbody>tr>th,.table-bordered>tfoot>tr>td,.table-bordered>tfoot>tr>th,.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border:1px solid #f4f4f4}.table-bordered>thead>tr>td,.table-bordered>thead>tr>th{border-bottom-width:2px}.table.no-border,.table.no-border td,.table.no-border th{border:0}.table.align th{text-align:left}.table.align td{text-align:right}.label-default{background-color:#d2d6de;color:#444}.modal{background:rgba(0,0,0,.3)}.modal-content{border-radius:0;-webkit-box-shadow:0 2px 3px rgba(0,0,0,.125);box-shadow:0 2px 3px rgba(0,0,0,.125);border:0}@media (min-width:768px){.modal-content{-webkit-box-shadow:0 2px 3px rgba(0,0,0,.125);box-shadow:0 2px 3px rgba(0,0,0,.125)}}.modal-header{border-bottom-color:#f4f4f4}.modal-footer{border-top-color:#f4f4f4}.modal-primary .modal-footer,.modal-primary .modal-header{border-color:#307095}.modal-warning .modal-footer,.modal-warning .modal-header{border-color:#916011}.modal-info .modal-footer,.modal-info .modal-header{border-color:#0097bc}.modal-success .modal-footer,.modal-success .modal-header{border-color:#00733e}.modal-danger .modal-footer,.modal-danger .modal-header{border-color:#c23321}.login-logo,.register-logo{font-size:35px;text-align:center;font-weight:300}.login-logo a,.register-logo a{color:#444}.login-page,.register-page{background:#d2d6de}@media (max-width:768px){.login-box,.register-box{width:90%;margin-top:20px}}.login-box-body,.register-box-body{background:#fff;padding:20px;border-top:0;color:#666}.login-box-body .form-control-feedback,.register-box-body .form-control-feedback{color:#777}.login-box-msg,.register-box-msg{margin:0;text-align:center;padding:0 20px 20px}.social-auth-links{margin:10px 0}.error-page{width:600px;margin:20px auto 0}.error-page>.headline{float:left;font-size:100px;font-weight:300}.error-page>.error-content{margin-left:190px;display:block}.error-page>.error-content>h3{font-weight:300;font-size:25px}@media (max-width:991px){.error-page{width:100%}.error-page>.headline{float:none;text-align:center}.error-page>.error-content{margin-left:0}.error-page>.error-content>h3{text-align:center}}.pad{padding:10px}.margin{margin:10px}.margin-bottom{margin-bottom:20px}.margin-bottom-none{margin-bottom:0}.margin-r-5{margin-right:5px}.inline{display:inline}.description-block{display:block;margin:10px 0;text-align:center}.description-block.margin-bottom{margin-bottom:25px}.description-block>.description-header{margin:0;padding:0;font-weight:600;font-size:16px}.list-header,.text-bold,.text-bold.table td,.text-bold.table th{font-weight:700}#toast-container .toast.toast-danger,#toast-container .toast.toast-error,#toast-container .toast.toast-info,#toast-container .toast.toast-success,#toast-container .toast.toast-warning,.alert-danger,.alert-error,.alert-info,.alert-success,.alert-warning,.bg-aqua,.bg-aqua-active,.bg-black,.bg-black-active,.bg-blue,.bg-blue-active,.bg-fuchsia,.bg-fuchsia-active,.bg-green,.bg-green-active,.bg-light-blue,.bg-light-blue-active,.bg-lime,.bg-lime-active,.bg-maroon,.bg-maroon-active,.bg-navy,.bg-navy-active,.bg-olive,.bg-olive-active,.bg-orange,.bg-orange-active,.bg-purple,.bg-purple-active,.bg-red,.bg-red-active,.bg-teal,.bg-teal-active,.bg-yellow,.bg-yellow-active,.callout.callout-danger,.callout.callout-info,.callout.callout-success,.callout.callout-warning,.label-danger,.label-info,.label-primary,.label-success,.label-warning,.modal-danger .modal-body,.modal-danger .modal-footer,.modal-danger .modal-header,.modal-info .modal-body,.modal-info .modal-footer,.modal-info .modal-header,.modal-primary .modal-body,.modal-primary .modal-footer,.modal-primary .modal-header,.modal-success .modal-body,.modal-success .modal-footer,.modal-success .modal-header,.modal-warning .modal-body,.modal-warning .modal-footer,.modal-warning .modal-header{color:#fff!important}.bg-gray{color:#000;background-color:#d2d6de!important}.bg-gray-light,.box .callout.callout-default,.login-box-body .callout.callout-default,.modal .callout.callout-default,.register-box-body .callout.callout-default{background-color:#f7f7f7}.bg-black{background-color:#111!important}#toast-container .toast.toast-danger,#toast-container .toast.toast-error,.alert-danger,.alert-error,.bg-red,.callout.callout-danger,.label-danger,.modal-danger .modal-body{background-color:#dd4b39!important}#toast-container .toast.toast-warning,.alert-warning,.bg-yellow,.callout.callout-warning,.label-warning,.modal-warning .modal-body{background-color:#bf7e16!important}#toast-container .toast.toast-info,.alert-info,.bg-aqua,.callout.callout-info,.label-info,.modal-info .modal-body{background-color:#00c0ef!important}.bg-blue{background-color:#0073b7!important}.bg-light-blue,.label-primary,.modal-primary .modal-body{background-color:#3c8dbc!important}#toast-container .toast.toast-success,.alert-success,.bg-green,.callout.callout-success,.label-success,.modal-success .modal-body{background-color:#00a65a!important}.bg-navy{background-color:#001F3F!important}.bg-teal{background-color:#39CCCC!important}.bg-olive{background-color:#3D9970!important}.bg-lime{background-color:#01FF70!important}.bg-orange{background-color:#FF851B!important}.bg-fuchsia{background-color:#F012BE!important}.bg-purple{background-color:#605ca8!important}.bg-maroon{background-color:#D81B60!important}.bg-gray-active{color:#000;background-color:#b5bbc8!important}.bg-black-active{background-color:#000!important}.bg-red-active,.modal-danger .modal-footer,.modal-danger .modal-header{background-color:#d33724!important}.bg-yellow-active,.modal-warning .modal-footer,.modal-warning .modal-header{background-color:#a46c13!important}.bg-aqua-active,.modal-info .modal-footer,.modal-info .modal-header{background-color:#00a7d0!important}.bg-blue-active{background-color:#005384!important}.bg-light-blue-active,.modal-primary .modal-footer,.modal-primary .modal-header{background-color:#357ca5!important}.bg-green-active,.modal-success .modal-footer,.modal-success .modal-header{background-color:#008d4c!important}.bg-navy-active{background-color:#001a35!important}.bg-teal-active{background-color:#30bbbb!important}.bg-olive-active{background-color:#368763!important}.bg-lime-active{background-color:#00e765!important}.bg-orange-active{background-color:#ff7701!important}.bg-fuchsia-active{background-color:#db0ead!important}.bg-purple-active{background-color:#555299!important}.bg-maroon-active{background-color:#ca195a!important}[class^=bg-].disabled{opacity:.65;filter:alpha(opacity=65)}.text-red{color:#dd4b39!important}.text-yellow{color:#bf7e16!important}.text-aqua{color:#00c0ef!important}.text-blue{color:#0073b7!important}.text-black{color:#111!important}.text-light-blue{color:#3c8dbc!important}.text-green{color:#00a65a!important}.text-gray{color:#d2d6de!important}.text-navy{color:#001F3F!important}.text-teal{color:#39CCCC!important}.text-olive{color:#3D9970!important}.text-lime{color:#01FF70!important}.text-orange{color:#FF851B!important}.text-fuchsia{color:#F012BE!important}.text-purple{color:#605ca8!important}.text-maroon{color:#D81B60!important}.link-muted{color:#7a869d}.link-muted:focus,.link-muted:hover{color:#606c84}.link-black{color:#666}.link-black:focus,.link-black:hover{color:#999}.hide{display:none!important}.no-border{border:0!important}.no-padding{padding:0!important}.no-margin{margin:0!important}.no-shadow{box-shadow:none!important}.chart-legend,.list-unstyled{list-style:none;margin:0;padding:0}.list-group-unbordered>.list-group-item{border-left:0;border-right:0;border-radius:0;padding-left:0;padding-right:0}.flat{border-radius:0!important}.text-sm{font-size:12px}.jqstooltip{padding:5px!important;width:auto!important;height:auto!important}.bg-teal-gradient{background:#39CCCC!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#39CCCC),color-stop(1,#7adddd))!important;background:-ms-linear-gradient(bottom,#39CCCC,#7adddd)!important;background:-moz-linear-gradient(center bottom,#39CCCC 0,#7adddd 100%)!important;background:-o-linear-gradient(#7adddd,#39CCCC)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#7adddd', endColorstr='#39CCCC', GradientType=0)!important;color:#fff}.bg-light-blue-gradient{background:#3c8dbc!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#3c8dbc),color-stop(1,#67a8ce))!important;background:-ms-linear-gradient(bottom,#3c8dbc,#67a8ce)!important;background:-moz-linear-gradient(center bottom,#3c8dbc 0,#67a8ce 100%)!important;background:-o-linear-gradient(#67a8ce,#3c8dbc)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#67a8ce', endColorstr='#3c8dbc', GradientType=0)!important;color:#fff}.bg-blue-gradient{background:#0073b7!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#0073b7),color-stop(1,#0089db))!important;background:-ms-linear-gradient(bottom,#0073b7,#0089db)!important;background:-moz-linear-gradient(center bottom,#0073b7 0,#0089db 100%)!important;background:-o-linear-gradient(#0089db,#0073b7)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#0089db', endColorstr='#0073b7', GradientType=0)!important;color:#fff}.bg-aqua-gradient{background:#00c0ef!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00c0ef),color-stop(1,#14d1ff))!important;background:-ms-linear-gradient(bottom,#00c0ef,#14d1ff)!important;background:-moz-linear-gradient(center bottom,#00c0ef 0,#14d1ff 100%)!important;background:-o-linear-gradient(#14d1ff,#00c0ef)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#14d1ff', endColorstr='#00c0ef', GradientType=0)!important;color:#fff}.bg-yellow-gradient{background:#bf7e16!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#bf7e16),color-stop(1,#e9a73e))!important;background:-ms-linear-gradient(bottom,#bf7e16,#e9a73e)!important;background:-moz-linear-gradient(center bottom,#bf7e16 0,#e9a73e 100%)!important;background:-o-linear-gradient(#e9a73e,#bf7e16)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e9a73e', endColorstr='#bf7e16', GradientType=0)!important;color:#fff}.bg-purple-gradient{background:#605ca8!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#605ca8),color-stop(1,#9491c4))!important;background:-ms-linear-gradient(bottom,#605ca8,#9491c4)!important;background:-moz-linear-gradient(center bottom,#605ca8 0,#9491c4 100%)!important;background:-o-linear-gradient(#9491c4,#605ca8)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#9491c4', endColorstr='#605ca8', GradientType=0)!important;color:#fff}.bg-green-gradient{background:#00a65a!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#00a65a),color-stop(1,#00ca6d))!important;background:-ms-linear-gradient(bottom,#00a65a,#00ca6d)!important;background:-moz-linear-gradient(center bottom,#00a65a 0,#00ca6d 100%)!important;background:-o-linear-gradient(#00ca6d,#00a65a)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#00ca6d', endColorstr='#00a65a', GradientType=0)!important;color:#fff}.bg-red-gradient{background:#dd4b39!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#dd4b39),color-stop(1,#e47365))!important;background:-ms-linear-gradient(bottom,#dd4b39,#e47365)!important;background:-moz-linear-gradient(center bottom,#dd4b39 0,#e47365 100%)!important;background:-o-linear-gradient(#e47365,#dd4b39)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e47365', endColorstr='#dd4b39', GradientType=0)!important;color:#fff}.bg-black-gradient{background:#111!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#111),color-stop(1,#2b2b2b))!important;background:-ms-linear-gradient(bottom,#111,#2b2b2b)!important;background:-moz-linear-gradient(center bottom,#111 0,#2b2b2b 100%)!important;background:-o-linear-gradient(#2b2b2b,#111)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#2b2b2b', endColorstr='#111', GradientType=0)!important;color:#fff}.bg-maroon-gradient{background:#D81B60!important;background:-webkit-gradient(linear,left bottom,left top,color-stop(0,#D81B60),color-stop(1,#e73f7c))!important;background:-ms-linear-gradient(bottom,#D81B60,#e73f7c)!important;background:-moz-linear-gradient(center bottom,#D81B60 0,#e73f7c 100%)!important;background:-o-linear-gradient(#e73f7c,#D81B60)!important;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#e73f7c', endColorstr='#D81B60', GradientType=0)!important;color:#fff}.description-block .description-icon{font-size:16px}.no-pad-top{padding-top:0}.position-static{position:static!important}.list-header{font-size:15px;padding:10px 4px;color:#666}.list-seperator{height:1px;background:#f4f4f4;margin:15px 0 9px}.list-link>a{padding:4px;color:#777}.list-link>a:hover{color:#222}.font-light{font-weight:300}.skin-blue-light .sidebar-menu>li.active>a,.skin-blue-light .treeview-menu>li.active>a,.user-block .username{font-weight:600}.user-block:after,.user-block:before{content:" ";display:table}.user-block img{width:40px;height:40px;float:left}.user-block .comment,.user-block .description,.user-block .username{display:block;margin-left:50px}.img-sm+.img-push,.user-block.user-block-sm .comment,.user-block.user-block-sm .description,.user-block.user-block-sm .username{margin-left:40px}.user-block .username{font-size:16px}.user-block .description{color:#999;font-size:13px}.box-tools .btn-box-tool,.user-block.user-block-sm .username{font-size:14px}.box-comments .box-comment img,.img-lg,.img-md,.img-sm,.user-block.user-block-sm img{float:left}.box-comments .box-comment img,.img-sm,.user-block.user-block-sm img{width:30px!important;height:30px!important}.img-md{width:60px;height:60px}.img-md+.img-push{margin-left:70px}.attachment-block .attachment-pushed,.img-lg+.img-push{margin-left:110px}.img-lg{width:100px;height:100px}.img-bordered{border:3px solid #d2d6de;padding:3px}.img-bordered-sm{border:2px solid #d2d6de;padding:2px}.attachment-block{border:1px solid #f4f4f4;padding:5px;margin-bottom:10px;background:#f7f7f7}.attachment-block .attachment-img{max-width:100px;max-height:100px;height:auto;float:left}.attachment-block .attachment-heading{margin:0}.attachment-block .attachment-text{color:#555}.connectedSortable{min-height:100px}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sort-highlight{background:#f4f4f4;border:1px dashed #ddd;margin-bottom:10px}.full-opacity-hover{opacity:.65;filter:alpha(opacity=65)}.full-opacity-hover:hover{opacity:1;filter:alpha(opacity=100)}.chart{position:relative;overflow:hidden;width:100%}.chart canvas,.chart svg{width:100%!important}@media print{.content-header,.left-side,.main-header,.main-sidebar,.no-print{display:none!important}.content-wrapper,.main-footer,.right-side{margin-left:0!important;min-height:0!important;-webkit-transform:translate(0,0)!important;-ms-transform:translate(0,0)!important;-o-transform:translate(0,0)!important;transform:translate(0,0)!important}.fixed .content-wrapper,.fixed .right-side{padding-top:0!important}.invoice{width:100%;border:0;margin:0;padding:0}.invoice-col{float:left;width:33.3333333%}.table-responsive{overflow:auto}.table-responsive>.table tr td,.table-responsive>.table tr th{white-space:normal!important}}.skin-blue .main-header .navbar .nav>li>a{color:#fff}.skin-blue .main-header .navbar .nav .open>a,.skin-blue .main-header .navbar .nav .open>a:focus,.skin-blue .main-header .navbar .nav .open>a:hover,.skin-blue .main-header .navbar .nav>.active>a,.skin-blue .main-header .navbar .nav>li>a:active,.skin-blue .main-header .navbar .nav>li>a:focus,.skin-blue .main-header .navbar .nav>li>a:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-blue .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,.1);background-color:#367fa9}.skin-blue .main-header .navbar .sidebar-toggle,.skin-blue .user-panel>.info,.skin-blue .user-panel>.info>a{color:#fff}@media (max-width:767px){.skin-blue .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,.1)}.skin-blue .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}.skin-blue .main-header .logo:hover{background-color:#357ca5}.skin-blue .main-header li.user-header{background-color:#3c8dbc}.skin-blue .content-header{background:0 0}.skin-blue .left-side,.skin-blue .main-sidebar,.skin-blue .wrapper{background-color:#222d32}.skin-blue .sidebar-menu>li.header{color:#4b646f;background:#1a2226}.skin-blue .sidebar-menu>li>a{border-left:3px solid transparent}.skin-blue .sidebar-menu>li.active>a,.skin-blue .sidebar-menu>li:hover>a{color:#fff;background:#1e282c;border-left-color:#3c8dbc}.skin-blue .sidebar-menu>li>.treeview-menu{margin:0 1px;background:#2c3b41}.skin-blue .sidebar a{color:#b8c7ce}.skin-blue .treeview-menu>li>a{color:#8aa4af}.skin-blue .treeview-menu>li.active>a,.skin-blue .treeview-menu>li>a:hover{color:#fff}.skin-blue .sidebar-form{border-radius:3px;border:1px solid #374850;margin:10px}.skin-blue .sidebar-form .btn,.skin-blue .sidebar-form input[type=text]{box-shadow:none;background-color:#374850;border:1px solid transparent;height:35px}.skin-blue .sidebar-form input[type=text]{color:#666;border-radius:2px 0 0 2px}.skin-blue .sidebar-form input[type=text]:focus,.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue .sidebar-form .btn{color:#999;border-radius:0 2px 2px 0}.skin-blue-light .main-header .navbar{background-color:#3c8dbc}.skin-blue-light .main-header .navbar .nav>li>a{color:#fff}.skin-blue-light .main-header .navbar .nav .open>a,.skin-blue-light .main-header .navbar .nav .open>a:focus,.skin-blue-light .main-header .navbar .nav .open>a:hover,.skin-blue-light .main-header .navbar .nav>.active>a,.skin-blue-light .main-header .navbar .nav>li>a:active,.skin-blue-light .main-header .navbar .nav>li>a:focus,.skin-blue-light .main-header .navbar .nav>li>a:hover{background:rgba(0,0,0,.1);color:#f6f6f6}.skin-blue-light .main-header .navbar .sidebar-toggle:hover{color:#f6f6f6;background:rgba(0,0,0,.1);background-color:#367fa9}.skin-blue-light .main-header .navbar .sidebar-toggle{color:#fff}@media (max-width:767px){.skin-blue-light .main-header .navbar .dropdown-menu li.divider{background-color:rgba(255,255,255,.1)}.skin-blue-light .main-header .navbar .dropdown-menu li a{color:#fff}.skin-blue-light .main-header .navbar .dropdown-menu li a:hover{background:#367fa9}}.skin-blue-light .main-header .logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue-light .main-header .logo:hover{background-color:#3b8ab8}.skin-blue-light .main-header li.user-header{background-color:#3c8dbc}.skin-blue-light .content-header{background:0 0}.skin-blue-light .left-side,.skin-blue-light .main-sidebar,.skin-blue-light .wrapper{background-color:#f9fafc}.skin-blue-light .content-wrapper,.skin-blue-light .main-footer{border-left:1px solid #d2d6de}.skin-blue-light .user-panel>.info,.skin-blue-light .user-panel>.info>a{color:#444}.skin-blue-light .sidebar-menu>li{-webkit-transition:border-left-color .3s ease;-o-transition:border-left-color .3s ease;transition:border-left-color .3s ease}.skin-blue-light .sidebar-menu>li.header{color:#848484;background:#f9fafc}.skin-blue-light .sidebar-menu>li>a{border-left:3px solid transparent;font-weight:600}.skin-blue-light .sidebar-menu>li.active>a,.skin-blue-light .sidebar-menu>li:hover>a{color:#000;background:#f4f4f5}.skin-blue-light .sidebar-menu>li.active{border-left-color:#3c8dbc}.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#f4f4f5}.skin-blue-light .sidebar a{color:#444}.skin-blue-light .treeview-menu>li>a{color:#777}.skin-blue-light .treeview-menu>li.active>a,.skin-blue-light .treeview-menu>li>a:hover{color:#000}.skin-blue-light .sidebar-form{border-radius:3px;border:1px solid #d2d6de;margin:10px}.skin-blue-light .sidebar-form .btn,.skin-blue-light .sidebar-form input[type=text]{box-shadow:none;background-color:#fff;border:1px solid transparent;height:35px}.skin-blue-light .sidebar-form input[type=text]{color:#666;border-radius:2px 0 0 2px}.skin-blue-light .sidebar-form input[type=text]:focus,.skin-blue-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{background-color:#fff;color:#666}.skin-blue-light .sidebar-form input[type=text]:focus+.input-group-btn .btn{border-left-color:#fff}.skin-blue-light .sidebar-form .btn{color:#999;border-radius:0 2px 2px 0}@media (min-width:768px){.skin-blue-light.sidebar-mini.sidebar-collapse .sidebar-menu>li>.treeview-menu{border-left:1px solid #d2d6de}}.skin-blue-light .main-footer{border-top-color:#d2d6de}.skin-blue.layout-top-nav .main-header>.logo{background-color:#3c8dbc;color:#fff;border-bottom:0 solid transparent}.skin-blue.layout-top-nav .main-header>.logo:hover{background-color:#3b8ab8}body{background-color:#555;background-image:url(../images/boxed-bg.png)}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){body{background-image:url(../images/boxed-bg-2x.png);background-size:auto auto}}.h1,.h2,.h3,.h4,.h5,.h6,.main-header .logo,body,h1,h2,h3,h4,h5,h6{font-family:'Open Sans','Helvetica Neue',Helvetica,Arial,sans-serif}body.skin-blue-light .main-header .logo{background-color:#367fa9;color:#fff;border-bottom:0 solid transparent}body.skin-blue-light .main-header .logo:hover{background-color:#357ca5}body.skin-blue-light .sidebar-menu>li>a{font-weight:400}body.skin-blue-light .sidebar-menu>li.active>a,body.skin-blue-light .sidebar-menu>li:hover>a{border-left-color:#3c8dbc;font-weight:400}body.skin-blue-light .sidebar-menu>li.header{background:#ececed}body.skin-blue-light .sidebar-menu>li>.treeview-menu{background:#fff}body.skin-blue .sidebar{color:#bbb}body.skin-blue .content-wrapper,body.skin-blue .main-footer{border-left:1px solid #222d32}body.skin-blue .sidebar-menu>li.header{color:#8aa4af}.login-box,.register-box{width:400px;margin:4% auto}@media screen and (max-width:767px){.login-box,.register-box{width:calc(100% - 20px);margin:20px auto}}.login-box .login-box-msg,.login-box .register-box-msg,.register-box .login-box-msg,.register-box .register-box-msg{padding:0 0 20px}.login-box .checkbox,.register-box .checkbox{margin:0}.login-logo,.register-logo{margin-bottom:20px}.box-body>.table-responsive>.table,.sidebar-form .form-group{margin-bottom:0}@media screen and (max-width:767px){.box-body>.table-responsive{border:none;margin-bottom:0}}.sidebar-menu li.header{padding-right:15px}.sidebar-menu li a{padding-left:12px}.sidebar-form .form-group .form-control-feedback,.sidebar-form .form-group input[type=text]{color:#999}.dropdown-menu>li>a,.sidebar a.btn{color:#333}.sidebar .subsection{padding:10px;text-align:center}.sidebar .subsection ul{text-align:left}.sidebar-collapse .sidebar .list-inline li{padding-right:0}.sidebar-collapse .hidden-collapsed{display:none}.control-sidebar{min-height:calc(100% - 51px);position:absolute}@media (max-width:768px){.control-sidebar{padding-top:50px}}@media (max-width:767px){.control-sidebar{padding-top:100px}}.control-sidebar-heading{padding:0;margin:10px 0}.login-box ul,.register-box ul,form div.validation-errors ul{margin-bottom:0;padding-left:20px}.control-sidebar-menu li a{padding-top:5px;padding-bottom:5px;white-space:nowrap}.control-sidebar-menu li.active a{background-color:#337ab7}.control-sidebar-section{max-height:350px;overflow-y:auto;padding-right:15px;margin-right:-15px}@media (min-width:768px){.control-sidebar-open .main-footer{margin-right:0}.modal-dialog{width:750px}.modal-sm{width:300px}}.control-sidebar-show{display:none!important}.using-control-sidebar .control-sidebar-show{display:block!important}.using-control-sidebar .control-sidebar-hidden{display:none!important}.control-sidebar-bg{min-height:100%;position:absolute}.content-wrapper,.control-sidebar,.main-footer,.main-header .logo,.main-header .navbar,.main-sidebar{-webkit-transition:initial;-o-transition:initial;transition:initial}.main-footer{height:51px}form div.validation-errors ul li{margin-left:0}.login-page,.register-page{background-color:#555;background-repeat:repeat;background-attachment:fixed;background-image:url(../images/boxed-bg.png)}@media only screen and (-webkit-min-device-pixel-ratio:2),only screen and (min--moz-device-pixel-ratio:2),only screen and (-o-min-device-pixel-ratio:2/1),only screen and (min-device-pixel-ratio:2),only screen and (min-resolution:192dpi),only screen and (min-resolution:2dppx){.login-page,.register-page{background-image:url(../images/boxed-bg-2x.png);background-size:auto auto}}#toast-container .toast.toast-danger,#toast-container .toast.toast-error,#toast-container .toast.toast-info,#toast-container .toast.toast-success,#toast-container .toast.toast-warning{background-image:none!important}.login-box-body,.register-box-body{-moz-box-shadow:0 0 8px rgba(0,0,0,.5);-webkit-box-shadow:0 0 8px rgba(0,0,0,.5);box-shadow:0 0 8px rgba(0,0,0,.5)}.login-box .checkbox,.register-box .checkbox{margin-top:0}.password-options{float:right}.password-options i{margin:0 5px;cursor:pointer}@media screen and (min-width:768px){.settings-photo{text-align:center}.settings-photo img{margin:0 auto}}.box-body p:last-child,.box>.list-group,.radio.radio-block:last-child{margin-bottom:0}.btn-table{padding:1px 5px;line-height:1}.box-tools .btn-group.open .dropdown-toggle{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}form .btn .loading-icon{margin-right:8px}.dropdown-menu{border-color:#ddd}.dropdown-menu>li>a>.fa{margin-right:0;margin-left:-5px}.btn-link:active{-webkit-box-shadow:none;box-shadow:none}@media (max-width:991px){.content-header .btn-group{display:none}}.form-control{border-radius:0!important}.has-feedback.form-group-sm input{padding-right:37.5px}.has-feedback.has-feedback-left input{padding-left:42.5px;padding-right:0}.has-feedback.has-feedback-left.form-group-sm input{padding-left:37.5px;padding-right:0}.has-feedback.has-feedback-left .form-control-feedback{right:initial;left:0}.radio.radio-block:first-child{margin-top:0}.radio.radio-block:last-child label{border-bottom:0}.radio.radio-block label{display:block;border-bottom:1px solid #f4f4f4;border-radius:3px;padding:10px 10px 10px 30px;font-weight:700}.radio.radio-block label input[type=radio]{margin-left:-20px}.radio.radio-block label>span{display:block;color:#777;font-size:90%;font-weight:400}.radio.radio-block label>span.bottom-line{font-size:100%;color:#333;margin-top:5px}.radio-boxed{border:1px solid #ddd;border-radius:3px;padding:10px 10px 10px 30px}@media (min-width:480px){.radio-boxed{padding:10px 20px 10px 30px}.radio-boxed+.radio-lg{margin-left:20px}.radio-lg{font-size:18px}}.modal-footer{text-align:left}@media (min-width:992px){.modal-lg{width:970px}}.table-selectable td:not(.actions){cursor:pointer}.table-selectable td:not(.actions) span{cursor:text}.table-vmiddle td{vertical-align:middle!important}.box-header.with-border+.box-body .table>tbody>tr:first-child>td{border-top:0}.table td.action-select{text-align:center;width:30px;max-width:30px}.table td.vault-icon{text-align:center;width:41px;max-width:41px;color:#777}.table td.vault-icon img{max-width:24px;max-height:24px;border-radius:3px}@media (max-width:991px){.table td.action-select,.table td.vault-icon{display:none}}.callout.callout-default{background-color:#fff;border-color:#3c3c3c}.callout.callout-default a{color:#3c8dbc}.callout.callout-default a:active,.callout.callout-default a:focus,.callout.callout-default a:hover{color:#72afd2}.box .callout.callout-default .btn-default:not(:hover),.login-box-body .callout.callout-default .btn-default:not(:hover),.modal .callout.callout-default .btn-default:not(:hover),.register-box-body .callout.callout-default .btn-default:not(:hover){background-color:#fff}.callout a.btn.btn-default{color:#333}.alert-notification{border-radius:0;border-left:none;border-right:none;margin-bottom:0;cursor:pointer}.box>.list-group .list-group-item{border-width:1px 0;border-radius:0;border-color:#f4f4f4}.box>.list-group:last-child .list-group-item:last-child{border-bottom:0;border-bottom-right-radius:3px;border-bottom-left-radius:3px}.box-header+.list-group .list-group-item:first-child,.list-group+.box-footer{border-top-width:0}.box-header .box-filters{position:absolute;left:10px;top:5px}.box-header .box-filters input{display:inline}.cc,.tooltip-wrapper{display:inline-block}.box-apps{font-size:20px}.box-apps ul.fa-ul li{margin-bottom:10px}.box-apps a .fa{color:#2c3b41}.box-breach img{max-height:200px;margin-bottom:20px;margin-left:auto;margin-right:auto}@media (min-width:768px){.box-breach img{margin-top:10px}}#toast-container{position:absolute}#toast-container.toast-top-right{top:65px;right:15px}#toast-container .toast{border-radius:0;-moz-box-shadow:0 0 8px rgba(0,0,0,.5);-webkit-box-shadow:0 0 8px rgba(0,0,0,.5);box-shadow:0 0 8px rgba(0,0,0,.5)}@media (max-width:767px){#toast-container.toast-top-right{top:initial;bottom:0;right:0;width:100%}#toast-container .toast{width:100%}}#toast-container .toast.toast-danger:before,#toast-container .toast.toast-error:before{content:"\f0e7"}#toast-container .toast.toast-warning:before{content:"\f071"}#toast-container .toast.toast-info:before{content:"\f005"}#toast-container .toast.toast-success:before{content:"\f00C"}#toast-container .toast:before{position:absolute;font-family:FontAwesome;font-size:24px;line-height:24px;float:left;color:#fff;padding-right:.5em;margin:auto .5em auto -1.5em}.monospaced,.totp .totp-code{font-family:Menlo,Monaco,Consolas,"Courier New",monospace}h1,h2,h3,h4,h5,h6{margin-top:0}.strike{text-decoration:line-through;color:#777}.cc{background:url(../images/cards.png) no-repeat;overflow:hidden;text-indent:-9999px;text-align:left;width:73px;height:44px}.cc.amex{background-position:0 0}.cc.diners{background-position:-73px 0}.cc.discover{background-position:0 -44px}.cc.jcb{background-position:-73px -44px}.cc.maestro,.cc.mastercard{background-position:0 -88px}.cc.visa{background-position:-73px -88px}#duoFrameWrapper{margin:0 -36px 10px;background:url(../images/loading.svg) no-repeat}@media (min-width:360px){#duoFrameWrapper{margin:0 -10px 10px}}@media (min-width:768px){#duoFrameWrapper{margin:0 0 10px}}#duoFrameWrapper iframe{width:100%;min-width:304px;max-width:620px;height:500px;border:none}.braintree-placeholder,.braintree-sheet__header{display:none}.braintree-sheet__content--button{text-align:left;padding:0;min-height:0}.braintree-sheet__container{margin-bottom:0}.braintree-sheet{border:none}.clickable{cursor:pointer}.label-full{font-size:85%;font-weight:400}.totp-col{margin:-10px 0 10px}@media (min-width:992px){.totp-col{padding-top:26px;margin:0}}.totp-col img{margin-right:10px}.totp .totp-code{font-size:1.2em}.totp .totp-countdown{margin-right:11px;display:inline-block;vertical-align:-50%;user-select:none}.totp .totp-countdown .totp-sec{font-size:.85em;position:absolute;line-height:32px;width:32px;text-align:center}.totp .totp-countdown svg{width:32px;height:32px;transform:rotate(-90deg)}.totp .totp-countdown .totp-circle{stroke:#337ab7;fill:none}.totp .totp-countdown .totp-circle.inner{stroke-width:3;stroke-dasharray:78.6;stroke-dashoffset:0}.totp .totp-countdown .totp-circle.outer{stroke-width:2;stroke-dasharray:88;stroke-dashoffset:0}.totp.low .totp-code,.totp.low .totp-sec{color:#dd4b39}.totp.low .totp-circle{stroke:#dd4b39}.password-meter .progress{margin-bottom:10px}@media (min-width:768px){.password-meter .progress{margin-bottom:0}}textarea#notes{height:100px}textarea.big-textarea{height:200px!important} \ No newline at end of file diff --git a/web-vault/duo-connector.html b/web-vault/duo-connector.html new file mode 100644 index 00000000..ea6fc082 --- /dev/null +++ b/web-vault/duo-connector.html @@ -0,0 +1,31 @@ + + + + + + Duo Two-step Login + + + + + + + diff --git a/web-vault/favicon.ico b/web-vault/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..d71b82addf2339d14d0d7b6dcf307f5053524e94 GIT binary patch literal 18686 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

@1b!Id0GMw{r(gw)+8+lbOopSLNS+ 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 z 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

rl5%ZX>1f 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 literal 0 HcmV?d00001 diff --git a/web-vault/images/cards.png b/web-vault/images/cards.png new file mode 100644 index 0000000000000000000000000000000000000000..8cf6738760389ed95f122b8ed203197dbb4e34dc GIT binary patch literal 17093 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 A*8l(j literal 0 HcmV?d00001 diff --git a/web-vault/images/fa-globe.png b/web-vault/images/fa-globe.png new file mode 100644 index 0000000000000000000000000000000000000000..7ba709fd1ae2a7f467f948e9c3a9d69c2da3afef GIT binary patch literal 344 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 XkTx-NdNoYBrUNEd%nXovZgKwtkt({i literal 0 HcmV?d00001 diff --git a/web-vault/images/icons/android-chrome-512x512.png b/web-vault/images/icons/android-chrome-512x512.png new file mode 100644 index 0000000000000000000000000000000000000000..0ec07e5bb22c841cc75b1933cb4fbfde47f36d16 GIT binary patch literal 10947 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 WYgP)pF8FWQhbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMF*(%MvSa`N0T4+izzUE7vH`oUJqN1+sfCHb z4FKT{7oR}2App#P;e)bb9~*002ovPDHLkV1gx4tx5m@ literal 0 HcmV?d00001 diff --git a/web-vault/images/icons/favicon-32x32.png b/web-vault/images/icons/favicon-32x32.png new file mode 100644 index 0000000000000000000000000000000000000000..ea0254cc2b06c89006014edc8e8d03b117ab2716 GIT binary patch literal 636 zcmV-?0)zdDP)pF8FWQhbW?9;ba!ELWdLwtX>N2bZe?^J zG%heMF*(%MvSa`N0r^QpK~z{r?UzeS0$~(}{YkdWj5ckGid;rW{eoK6u69O*7qELo zMZ0X#qM(b0X_Re*C^Rs#Ttp?Km1UNhr|*p4&^YsrqmfE52VT6)d(QhXGvXYbPzJ}Y z-e~izHCa6zd4+0-&R)YT8e1r%ecx=fy0g-TstL15CLeBac=a_67eq2KTW7SnT}(qw ze2u-01ZF`s1raU{Xty-eU$)o&iZMadMN?mjC`J&NOjEkm_8-| z>Y96{t))u|VDadRIsl?%7R!TD1eiRC(Du^B0_a^1Kqi}`4gjY&BJ&7R1ZZ`7;UV>N z6DgGxz(oE9Z=c@iQGk0g180dnVkrWk2G@g-`x0G9Mu`E;D}karAA1K}!J?T`l>|Ud z>|H=91OdRZ6M{F>eWD zvAin6$MWATCM}MA7~MLDk)&Rf<`mu%hd5Bfe(M(Z(7kyIFIZK76G{5*d&NI#JoaK4P)QxGyH&|!4&rr7>Rt(aZY|E^+ zjMk|GF4r-yYhr~y_nl#p*;X@3PHvtwN3{(T*UJV7W~kOj)x(UP-Axt;fgUR9U#uM^ zzwKSnPi(TxZ0lQG!%VLB%zyVN?j@~nkC4{gi+UnI;`9<46Pv!7q_^aC&2H}O{@F0W z+1vlU5SxmbD(YEyUXLfzm_;+mCB-0c8W^jqUMex=%^JV}94WzJ*wx&pI>a^O##vk4}8UGM)8nT1(@% z737!kH3s`TgRPg?*f6p3WqkQ&N^{tUkpTj&cVP`j-eB+T8>h9b)+zEH1E7ttwzL8G zj-FLGC#33`-GnEudWqShSN4yXH?pMD=#Z8J9o!X}*7Oq&JC{Tx$8T?D2-;OFt2C1q z4+$&D3z$~^$#dazH#0Ug^AU-?%_{^ErWQtmi^3uTM-)*Pm9zoi@R+HgfoK}iZbR#*$++sVqHdg%xK#o*PAc{v$H*Ttg8+#jA0xr&hVdd)t?%4@zWZudo9fw=IeU!w}VvHmSpi2qHq7q2{;1y@tI1Qve zhfZkW^Q-%E4w-DFE9nA~v?i98Bm|0SL6BK2^N_1rB$RjgAu+4TdkQn@&?hwZc{mn# z=AD2{)WdRG8Te*%Z94+=iVNQu`Iu*2uZ&EtO3&#loG`yEqF?W0lqCfkkpI_OzLyd* zlKE*OCh7Fr(MP|PEDigPuP0a5TeyWd3SjeT5)5fd~{3t438`HXO?j2wex#!H$T|0jxmNq3E5ZTKkI9UO=4gsZYj>FDXiiA!>Z*nr zaz_b`HFe7jdxg}|=Q=)~xoU9R8O^90#D1@$Uw_lP{LdfszaY`0`+{frq78LAeJQ+a zMTC(f!ov;WsSSgB@)B@G4Wg+EQB#FLY}Kx6t7&MfYbvW<(N7sxVeR%v?g2c=%g5hS4iWaiQ_klB0tNt~xx~$5LJ#fFpYOHm>o+A^ z1N;gimtZ2|3gTvIr})L?45P2Md+;mN*vj>N8^d<=cYr$t`=U)=-?{`)&YVDO-n^Fa PV@6XWOGETc*FXLZofu1O literal 0 HcmV?d00001 diff --git a/web-vault/images/icons/safari-pinned-tab.svg b/web-vault/images/icons/safari-pinned-tab.svg new file mode 100644 index 00000000..ba3e45fa --- /dev/null +++ b/web-vault/images/icons/safari-pinned-tab.svg @@ -0,0 +1,26 @@ + + + + +Created by potrace 1.11, written by Peter Selinger 2001-2013 + + + + + + diff --git a/web-vault/images/loading.svg b/web-vault/images/loading.svg new file mode 100644 index 00000000..fef4866b --- /dev/null +++ b/web-vault/images/loading.svg @@ -0,0 +1,6 @@ + + + Loading... + + diff --git a/web-vault/images/totp-countdown.png b/web-vault/images/totp-countdown.png new file mode 100644 index 0000000000000000000000000000000000000000..87b9fe14abf11729213bb0fca8b4cb2922285cfd GIT binary patch literal 1636 zcmV-q2AlbbP)-YF& zD-nsThLVZs&Sq?HYmEf9Xj^fG1OTXwTlG@IhR0xFBfSwMaRVEHE0+jKt$A1Zx6Qyv zu0{5?6FWj|J+_*Ng-c(~M(1JNiU~~qx76Ntz?j8Y*tQQa)P{x)z>wWbzTS*YM$-fa z;C)t`k|^YU-3lDKV3sJ~Tc8Lw5cQdz^+{upRGK$EAg2!=`QI@F0|TEf3=+lx{6L#xm?7u? zncX!}vDDAIP77>0BKQql#Y%q=W4zwqf=XT6_Gl;dMYguRnvMT6`#dRV^fk;PL@aDWhJFtZ}c+U z9rkL9(vXTpQZCN{$)L#J^94GMv2dZ$6eWWtS2h)*fYhX94ZI;tUiS<&v-T&DC`nFZkfqMPAC{n`e};DP05 zH!Hy|)N<*h)-#w_p5P?v4q}A^jp+Tn*iep3m6oYE zvpdT^r426%G9Mfe2o;RV#1{brMC_eR|B@1_A@!_sJ^2~eG~*&MkrZc_3a3%INJAly zONx;-3vNE5IyLTdnifPV_$AfIYx1nVa!xr$Acf*JQbxw8;$i@?!}Bp*Jw2;P?{eD) zOA=8kS$hA$-*`?ez@KrcusTF4TzvC5#Wj@@OVqMll)x88n5hZ_MwN_gEXzlE0=_W9 zEJU;n)&YQFv0x^V+>##P#a|UZCNzsHAtqUO{YO7T1!1JF2D8T>N8a5Jg)0&c`2>W@ zfmzsqFh^96lyOj8G~DzNtFS0xid6pmgW{1ESV@UBaaHDWk_eafOQ$;WgIfQI8xL_C1wch- zq=7z-8&k($Z7}$($$SCQLvtr*ZPL4#g$l?&~NJw(K#Y!k|xd$)P%^X8CXVD$dl*iPmoC8vEAu{FiKbupqL;@5h(fr67rl$gCBq%%pH}VX^v@w|2DxMW$h=z5 z{~mk}u~0||_t6lt{ekyKLk2m%o_DT{$NND_Ult@ROAp_lL&4r|Cjd`)HN?~m#qPu7 z6JWTw)>+{jd|J13NLV?mUfzN((?38J1=LqTK3_T{JY$+#zpW4MAD%j0%8BG!BoYQ= iqUg^9W-P=06JP+8RD5&OBTXCt00005;$MGqMilVXzilQ@sAP6|)xP0Rd=&&eH za7N}+a7Ld?6a@r*%u`vy4q-`10wf^|NvD^3=XbkrbGuUAU<>LW*7x17wp+LAp5NKe z?bb}wq+hpR&gS@)1i!4!h;?)6(xr{AL84qP7d36#ls0YJMD5$Rr^LiWDlRUjKp;S^ zTD2ml(@7N-6_k>alE%kf`Fej%)6VmHy*a$keD z@d~_y`%-;cM`wI(u@V$Y7{ReUb<(2Ksy1Fc$WeWKN{G9I9T+Sm} zM#f=B%bcxx^XBU)IdQ$-p+k|Dm_TNA4f%KNBE4HT(s<5f=sb2Zk<%bYvu33C%;onq zG@_yAcE<-uv<-w(0h0UBF>VfGFh($;ui|TMaS>oi;^A110q}5+jr(I)%+Ka?zhyq3 z?^E9U)c4_7c^93w%EcHAGJl;BIDGhuhWyoc1&WIL296wUZPt6lZE`S=Xd$J6b5o3; zO~r@L_ifpF1rvRemXcEGXx(ayvv=Ndy?wj4c>?9)xt~HpP8S>y1;l3VzL`0D5)-(e zN_;CJ!Ts3#{r)gG*y9=>w`5>$=SObme*a-mUf_Pq0gUy%vW1?D{*mBbU3d6*?Ht*V z|M`O~5j{RF+(aRP*&C|P*OV0zwf{( z*ELr>X(i%SfY}Sbxv-5qM3;GLU3bm!3A^lF|>E`yJqC% zl7~odJptHUS^_WP$J^MP<&YJsye{bQH@yMYTi@WWJ{q)mM zC->>oXBE4nLo9YAs@H>SD&ejDq%Dxm+E2ZPaSj|fKzsM@-M}jBnzXdEO11x^6DFio zj~@5$h7Ui!L`zNiSz-y3U3EuRv+~r%uU+rFsP|gaLyaQj%ye_BfZ`mMRr0 z_XCXGyLXGeEUEwEnB@i@)9(nmo`2O7SJeOgotxM_{aFJ%^F$pP=X5SfUAAP9-n!LJ z6ERQ-6ZXjB17!K~E>D` z3!ovm#CXk{Hx~e*pV}9F_V3>>z>rP>8iO&H$C!a}{?zsSnKe_U&k_?pQ-)jJ5Tph~ za6$x6%g|%0F!Oj7xvsi=ed_#|E;apr4~6FA$Zj4VAgflbA{o^2gmalt8~E5QiOK3h zM9=^TfIw=$T8dO9qgmLwk0NQ;DEPS*7~F-^_078VVdZ zD1yldDPs*lIn33WO^B+h1n~oXFCyQ(7s;6TFj46dq9l7z5QK7^l2rHCmmW(PGx`>j zY2=ClNK6S?xpE~YYp`T|#r=9m>nrWW=FOXh@doki0yaB0HdcNL(gJm8gt%5sm8cuQ z$*ed|xBvSS(k)B_f^)D&E><@QWA73BXwh__w2VB<{!Sd#lmAc=g&hNAAD{^q&LgvT z9#M5o@Om0E>{nlta{^1svGVAW!q00-iS;S-UhK;T{yY8LuJOeoA>-VSCma!&mKx`niKJ~UI0;I%3QAK3rQZHs zE+=`{t{ckInjUxRggu*7jy0~17L9{rVZ;H5Dj6!VRKZjvXjz>Z9bo`FAI;v)7fn z;AL@NfWkJT5h&*~C^aEa2KFc4tjEZhJSAvLRGQ&Cd9J>V|GADvja(U*%HoOkx2C#P z!oc7H5b6D>(jogmm2os3H7hHx126=TR&UIj=dw#as#|$8RvQgoO1$rG7}Aq-VbxQ0 z*BGi>@VB6g%P~~Av4p~iSKl{*>Ry>2`4WKg`m5yr{f$AJf^UznRa$P?x5)=-8o%cUT+O9neTu4JOGx+bkO?Y5rVHVAB!jo$ew+&$;w zC=IS`P&FWmHCU5_S00eA?E0kc9gp{BFT%=B-6`riN3Fr6@I0(2_%dV=yYQ&Lq za^7ZTC3#l7M-IdtjVBo-T(GJrK&hGbxQG`M$Bd2uC5o+Iz`g_yG^W;4vF-5 zWICjQs6{rJOf;=J~CNC;`PWGQ)X!d12{LQ|hX% zh!(?Gy)XH0FbmQwLTV9&rKL6s_{dUP1}6uG3?lElZF79Oc|o8FkId`BrH-Rpf2e@m7M`1%}ojGTMq0yX%2a znk3>r482MmJP$W?{C#1<`R~4yd~+VR0c9o|`UNM`T3>Bo!@NCmDGwNmrSl}{urUe2 zT-li{;j#o&K{}vnupj})>Y@Z$zp$(FS<@UihE3VHaU=EW)vJ*d*h#|aF7c6hFG#E& zFv-7XZ{#E|>@G5_CcHRl6Y<@0F5q@{J^~|dCGfp5{fQtbq1fugthvYjg@w2UUf_<#v! z@VW1tE@U=o60CJFuwhVU%nkwt$>R5U*M22Hw9N?P+q!fkKnH825M!Q%dmO7LxRV>-waCSMxTNCA81r$F^nm&D2IDTm45Gbj6%E_U?B?Cmw zB=|wB!glOz3labq9ECCf;N-}9|6O4%u zk%n{!xF2(2Q2e(sD6`q7czw3ZL4#oMy?TzmCru!;L%Xo;VJ;-c>NSmuS0+m(OKVx& zfUvsx(ryiu1PO$|qBrRVTg$FEMp+iXS(ApbGQrUnTL2K%T~?h8IYw4_g-|PyhPu}m zM^3hF8%ld?34?M$Bq%IR#@LCZA#ReOz`Y+ioP5tcMFcemz+gKd1<2~+9ESe|CQ>h8LY7$5Cu+=)%`PA~)u*_DR@H?%Inatx%H7_!EaAaq7!qUqK1z?iJWk&mNuZIkhcCCGR8j` z2?_%cVB6#U=W^i|n}Y_5greE6FZmyND0uyj5kZj9pXaEd=D&EUeQ6ivgn|7&j2n<0 zJ9bo-mzU>Txl$z-xF0LtWon~Q(I-SefP%gl^lvP?!0B6FG<9N&3PiLE^(J1Cd?9e3#fmf^Z$HNS41t#w~Y<^aC5`=FADH*pv}nx^#I`K8+&o zP%Hxg;nK!Zb=U^2{hE3g9*mxKKs>|*M18|``K6Ir6efJlo<`0?e`&|>{ld0ExN87`gQ8!1^szke^eLxRB^~2cnZOI z;Q}dR-||P+ux2R$~t}g+924XJk#?y4Wr> z_O6~Tx7)0%Ya4B{@Vt;ZufBIYrM~_OgEHjg^L6!&AApC1NPYWG(mBvX!VoG=5M5Pa z=m#etT8S8v&(9@{zViw4H2BR155)o`ri9F&KR>LNnDG5twrmNRH{>$_0LB*Fd+gXT z0gB{!ER;iO7nxWPQaT3KBq2b7WXW^%Ljn`yN|103HUxWQ3=mYR4hFyD+CN`$RdUs+ z`~IN;+-SdOLVv8gMag*1R zKEMRg5ooGvO#Y?>_hi6{Dx?I1&tK(n@5lLU-TmKn3l`p{g}{skidgstNo7aGlr5 z)$t%4YydnpcwtaY=mYzrF1Cg%jDCObiQ&kT9BzdSk0ef#h?OiSt|*3S_fu~p{D`nBXj=JfJIhYnrGT>G`U zw9~GP=bLu#Kf!G^KRAK zwLM@)`TgQq-30NqK=Ry~Q^R1GW@L*u4zXM90YWloma$LZ$J z=v7c)o8Sy6zsyyC7Pp?;)htE(WKt4tv3jhZ(`9|qA0Hm-%!^q6a7_$4W_2 z0cH^9@iSNQyAG(=Rd-o52EoxHdu!6<2Zy*W8~mL})hTDPgd0mzLcn<0uuoyH=SnuV8`br?(H6BqO-TaU<-cSiQB_~O74Wk+Fj!dm zR%5qzE22V)JytL3dTGMlcm6Kn-n%Ag%`!`b3iJ8SED*^2a^&v5_L{|s@kgEkLm&D9!?bydOVO?b+i6y;ZCCe4DpS@vd7x++Tb+UBoL0_I_yH8}9%kA#;$N zLe9LNAGwAMdQR`u@smJhC7ID`Cuai?yG*ML=9t?(til!~B_+MVdVCn)8_w!wAOn+S zHO|sSwq}n*>Zbw@154aewo$7%?x{hXB1^&1n8WH&M3h(IzPsJ~-M8L6&e`wcXBs~H z;%;9-!L@;svRsj^6@ROti*-|E^So$c@wO>`#^z|#xvh7yEbazRG{_U_Z06vW;0& zlWEp_v@j?#W=Tq{(Na=N92rf%HFCRuYUJgvCe3kFMBW~c_?6U|`o9zH*Z<4d`+orj0H(S9$r$}E^8f$<07*qoM6N<$f%tn11b)cMr&h>9Z! zqKKearD~K`BZ~9TI#Wu;p;hXDB*uIFf9`+q5R%;C+O!F7NG5NB{Cmb2|{b3iEUsr5Tm;$;&uhR z2fc2G2CIo6P80k_e=OA>3pwGwef0zL1Gpuq6#TzyWbho?>mx__+N( z+VEYxp&$@NXd@pcF;v_=8 zKa-nV#d;|v2BXw_XnM&1;JHhkxLJD0E8oirdtT$Ver>VbGhr|y_yTy;`LDdA+J&=s z)R^%g=_&Xde5~*lcEq@08M`?OZ^$!fCyhf^k-pw^Hd{Ir~yZyf3{RxgoK#*hd+?FBUvs44}p_L$Da;4jAH6=O+nm{UqwO>AjDnK6?Ue_p+&`vL5c;ymrC<9f6;HrR?aO zMs~hKO||F>#(_~T^=|;3mASpu{c{zhHpA;rie3_h^p*#B=Snpil-CuO&bl;J@1DIE ZU;w~$Kr3%nZA{9eD&~M4k~60^uPE33>OsyQ=p4Zg(gBsP2Rja>hA(^-`Vc zTUEEd*YEdz_qLRm*9TFpkowGUFQRV4UwN~bWY{b++FS}$P5bsY(yEb(k9tPsBJ73yzO zx8pn3RFZ)#-Kd+X&}?@2@0bAZgu9{k&V%H2#|k;>V~qHt6%zBAj)4FqzmM+aB}IE- zXt)YvO*M?CPgMs?hRzQbm;OnN2`gkJ^+ovq)+xYX07^lBxaPkg6eD@uf5DAnl_xx< z!)s)5+I;jd9BWs4g2g4X$z%R#a5&PY(D^mjH(w2kqI7gsRm3@o9w2I|Vd!3Yi>VzU4D zrm1SLKATw~zoaRYc1H&G~j2kx| zLx&DUT3Q+zl7T!#6=TkyKacVQ2e9|^&#;e<{OoV*G2VcR+lHj$nQ49D4|cwcfk30# z8NiC)UV_J`K$dTgS~Qax^0j){cKi{}c?(1+i^eWZQ}IBb96Zn~6UBBbvdJ*hNExgE zSwtsE7>tGfsP_0U<;ZEc$a@S?a*^CFcz!q&mi?dIYwU_iwYRrp+}N>LvSbM+O}dLh zpR7C1;c%dL@7}om_S^9fix%PjY4>9PfrGHwz8z6xPZ-e0g2zZ9@I_gtQ9@n4534p` zhRaK!eltTDd5ZD$NfB~{Ws;?-;i$2ybP!$|kl%e)NQxmsm_Q`d^mM4%xh7+(i=9p< z=FXjqRjb~E-QIoj)!f{IZ?4pdFm@xtIfo|2qmUl zVP1?f+JXvNsCzklG0q~|ek9cU1H!9xAHkuJye+B37!M{+oQTz{*T7=2T-W?hoH&My z7catWHves~E-7TiEHGA%DoBz6&lH4mI6q1G_3BIbu=bizhC<5VaINaxDo9@#^uo9n z>PCGkt_meAS@LE|WdzA$80Z-%7*8T?)281LrS@O9BClUgJ;~^_7=n{-G$7w%5`QnR zxq=mEFR|Np9sN>bs-~|H2IyI{W?}sJ@w%6tJ9iH6y|)TSj~+!+QyzlN(9_B2K^vDs=G$t zYe`Ez#_0F*5a;&?RW7L@JtIr^f+I&yz#q^;3`a|tYb-|5KQ=QZL?ql~Wj~*ICdFhM zg}pvjq*)C_V-?gj`O)rH1jCY&38))#4A9GP2xh_O<>jG&|3YMDW{UH5b+x#3=@Q!7 z+5`cyTCLr77A}3Px>$#ql!M$t`A09pk4N)T8)<_-h)?R9Nm+r!$!l>Q;v+>oIi)W~ z4si$}4OVwUsjMK23WOxffJ5#!^Lq^#`Nl}d#LYD_=TLG4QE3ewL!c*$rlg4f*ja}o zRqdiG8{HH&lzrb;?7)vE=Tq|Mz@U69W%#l%ikhoFd_~uV@(eYpY?A4Oy?_-_R8)jH zbLI#RwCd6;TFWfQ)n_lt8F7qJ>N9BZru9dszm4FftoEk2J&QSGyIn z_`W`$PlVmqUw;EHyzo5I(=&9h+V63qP7LguG|v!XbEkYCgQAe5Wh%eu`gXf{*^aEqIc~aafad zlE(PvC&t6VT(|B6Or1Kl+xWsE?b&Ca!|2gt@YrK>1bK<2?TH3hXtfBOsP%YJfVMoAU8V2$hDWqfYR zw&zXB$K%vpq==vr`vM&17)QAC=SU$@N`|pgVikJz>ebh!jOaFM)F@Gzh}7ux^uZq) ztUn%BjG765heaGQxNgS+r?4K~DL$ek!-1t`MR;{cp$OHfVv8}FIn-SBqT*~j+yN5? z6_p@8%??$pm}#Pj#&Pp%eFLsus6`}P3T941Day0KY?6>_(T)Yn7Qc9QAz8ATFxE~= zxJqDNP9cu(Ii@rn`8np8l1Y4GD8-d}=Ffi`GiE%Jq!iSS_3Qr=m6eqOTjtH1Co0wP zZQ8VHcBv2%_O&#B?B;kLe9PP_SjoYq)bvVq*B46)W)e+rOh1N$&t>yTyR5 z%SNEMpN+0nlPZM4`q>8xP(Vs?x?}55>=EmCUB%BfT)^c9uMl)WFAJ7EIT(*j=&fJ3 zl43!emjo6pSfKlCPGINGeGI#I?-th2^mogaEu^6Jq9_{Qo_lT~Hg4P~DiKC0)FiQB)*=`y z`jN%=r4ST|!wn8RA8e}?_+pC^Jb&gjkInlU1fJ;9Ua7OXFnaVT-DkJ8wPMGP9mKZM zW6pE9+P-}o8XFsRubV#o!4To?f>2%~18ojhg4t7k{k5Y^T*9!bz~MOP?NxUR%YsM%Q=C@d`0eRgf_ z6_J}nSEM7#Wb9#ztJiouQ(u1|kec2THvI0JdOS*V{53JJ3}RQ~G9B18awuFhx6G*e zRXHgyG5AQK(!PeC^ALU*V?*L(LU~Fu+N>c0kdi*j5?gUJVeQFEA8xlNrIo9y`t9G3 zguc115%*G(SV=iaWKk+w8T(q=v4O@USe}#wLvHe-8=Be!!Vuy^r>J)s^4hnm|k?u(Onx$+_^Tpp3J zH;{*|B@dc?yo$1RCCLI68K%~QA&YUpp*0}zBbr49>F<0BWn}}>u={8;8JZzMA%pX6 zk!?)6pw8?3T<)l@u0}~oNy502l2Q_Sx(H8lly$OaFtF=g!;M!xnfBV_u!rxU(Su*B zzJ$IO6E1rL;jpX;>*uok%5#^o=29Jc)Aziz+wKd9c^XpIyL!+=Ohy@1m)&S=3qX!y zO#BWO@{m~*dyDc&G~hEc<4W<^TQi8UXep9INmOqS9xT@#Q(9Vzkt0V5i;r$DmlJo~ zaYs^x?Ao<6T&mYMhCNMfSbwDv`n+@W|3Q(>GuHTgUOL*aaN&=2=gXz}ty{N-cFkxyd$CA(za4Q4 z#%4I+iNhdC)Ky6_a#WbwHt6~cn!JmaGsbr@5c5fiqAanOln zPYuSsqjPcmoKu9j?-x5TVR$Bdek}#<4ObdS$cGLc6502R88Z^b@%E&TKVFX&EB*;J zH8p~fz542_m@;LG?tM3G*hosL3*k$^uZtmt7Bl)=ySI@ejcnv61M~4gZ39{;q$T1= z4|_-?(cAQ=di?$5e2gp0fYYPIWb$4T{9PlmaL;X_#W4<3T*u;E#6;a6y;!AndWaSV zX9HQ~&wsw0GWNTXm6f=_cHe#XiR_z0Ra%-uc$HqOs;a`Te)V3`O&SqnY9nvt9VcG$ zAQ_=`cJ>T8{5{vMh_H9;T4ctRN#5Jy4@FZ1v(PFWpqN0Mr&~piR5nX1_%F0fv46b=S|NM_dZjx*aKankb z&WW=q+J6+o%1>bU!4oJgKaM}QImMV0PB+Tv?}2-d;-}}n3Dxp=jfBISE++kjnYu2( zg{fy^ml0Q&6JB!oOgo-__l!_VdYVyqfS&Tw?FLdt5Kpf>jctE!g4Jda=MCY`3NpyC zwQ)}7KK=Al%$_|VF>R}9zM>Cxxo2?DdD#2zZK$BWxRg5B|D6CQl? z1UBrd6IEcY7(48t&c#L!VLQKU#v@Bl;`jTnQ4Yg9$a!r<6$@!x{cWVY#uv~M_GdAb z{rvOK2_Jrdci#D#ps&fvjfP{#j^V`@U%>R~KNMS=xaO7co;t-=Sqg0hiWmq3pC`-` zec?@Yd@h)DeKT@W7JG&zk4Iw+sidA4ohb2w|Ki23h>1mKvCLj-YinbyClrQMEcoRa z!HP63Hut#H;M1*9@ur3|m)uymsuHDzc9izFV^E$|u$P)TFV0b~`o<&5`Mq<@_+)QA z4xDNgH8EB;AKk>x*vm}D#Mk6Ga-zsfvhTnDzStaIR#ql*5`Mqt<|dpxc~Wd&;`Nc% z)>d&1Z(&MM2LEiJ|3GNOxTKV26iw`06bgx=?^;ZBNt`R+*Sg~mys`T@E976PPmB#0 zvY2FiNr5NIag}>y(o)z%Du}Y`c_Rx;FC=N&V zp9D*9eV09i?ecLN^Di{|N8d%EX&P`dez?WT@Qs}a@3aRYH(d*RN3x<=*t@mPoT4MW zp#M}=>nM$I*ppkDU_M+9>+WrSwNL)b!IGhC_~#B%)UR;)mgA_uM4eZ9cs0kEe9`o; zqX}R&gnmtS!#$kIjDrB4=(G^9A$H+TlM=-uh1bRrRzRdA5+y>qsp==C1PMEK1_u?t kqvqtEWnky}*#8MI0FGYM++~UPqyPW_07*qoM6N<$f;)3USpWb4 literal 0 HcmV?d00001 diff --git a/web-vault/images/two-factor/gmail.png b/web-vault/images/two-factor/gmail.png new file mode 100644 index 0000000000000000000000000000000000000000..b47a12b1db848510625fa6944a059cede37fd05c GIT binary patch literal 2675 zcmV-(3XJuMP)xm(D$N7_HE z)k!oC`0CUdLz=2h>oZlF(bRFQ(Nt{}W1}-#1z8Ye+4t^!^!v`TWP$aypyudh?>+bI zx!>=6zwh^b_pIc!T5)^W;5kxK@_b~ZryE}wt(!~cKuXVm?)Bhn(_|S^d;-)9=i%G- zo=LrVJr|H#jHUx3dCDWJhJrxK=;($E)z zfoFn&4c1y(;NP|dfzM6?$%%l$KsM=}1L$ygJ~t9tTgcMR#se&7=y4jnwL73(xkTRi z1?1dZ=x+B@rcykVGiQiOo1wNf0jbF$Q}sxD370IT%91~*LD52h}=ArT1K z8$g@G4Yx^>jEFNqk2gT?@IW%h0SV?FVCdXL{WcT)NA^LzS`W+OB`^#d2HoT7^?;Zg zd0H}?5&U}{e1F&q)$4$in$mlIVvfvaIXt-I^`prsBaJ#_G0Fp#naT03wf5P;om z6n$)|F}&)0X|h@2VmWJb!kiEXjVTn_cpST43Bpse5#}%IVgAWNqF*w}v^NGGNh0pl zYhS`w{VtSimqS!y(;`9eI8BA*^1E>NJtVs!Q(Vz}%1|;Gj zPtaWmSSHwmN$`Do1nxJNLOp*zw1Tqy=pe|GlG%d5{*OW)zIm1Av~}uf53rODbj^t7 zlmYl3NSlaGh91u9_GG;iOe*zyCQm_gaT&A#2bDJp)u_v6gWB2v_ix@p;E%N-fE-T` za|FpMNXoq%*TK7UGc;Kdo{ko8a)%Rv#B|u_y$VOccOeIZkfMZTFM{jzPo@de65`Q3 z@&zpAmoO2DGHaUQ~m{63RL6Z--LfnR9XmgoGd}mAK5fAXG_dx&bLA`K!4i z$Egb7^ujq}H116+hMtxN`TXbiPdm{%c}|%mFC*RpIX@qFDi@-C)b}BExI+)PU(Wf@ z8F=1U0_C5lX@z@Gjmiv(@s zN{&uwWHKb3xZg_dy!)dW@D0jG`q2Y05iK;%J9>9sN=c!dIrh?s<_HQ3rOaS2a4qLm;3zDD zb3ze$!6ZODvUWUdKp0FKaa6l|7e0y;dszj1Cr=>lWF2I)3@xrl5@o890Z+ zQhp+tVUI;kaO7ddoP_qWQg}y<5Go~6o_L&8`$*ZW%QNZeXl-qUj~>$g!wK*W%tz*t zk6?D*g_daTLA6k+ty7{CNmG(~gW!1`PI!k7hvVf^C^SDSq#i@H@W{f?lN*TF493jw z2c$~g=f8o5`6P?q90|GI6+P!L^`t1dffj=kT*t&>w9Q`xH6=xOBIaWGaR!IMWMpJe z3=^GLT`2q8OUhuMR4kN6@H$G)>Gn{k3rc(nS}UsHoHA7?p`<8%s&XE?P>KZ8!Y@2j z1b;3L448yw{o&?%8h{rD;nbLkohra9~x$~PPnEtHA9 zdHKkyI}B66BlZFUS$S}jlp{D~hycy;qXW+#NH;JC^erENJw;BgaxDKWQLgFh-KsEb>e^W+YLudZCiSwg2qrFtIRj86J3Y8yIqbOwt7= zD~l3)9K9o{;yRh~h&hh8nSxJzOUc+@6Gg^MyTc)Xa1zy@(w>;ypOa~1w2dm-p+koX zHDk{_t@col95`?QwI6&S&PR5A3%hph!oGd`aQyi3uKBNByN31a*TZVHiZN@~u0=M<_;Pv~)xUc6DvqBxfyO&`kjp!d^Z?HAg9i`B*|TTGHG|;B z-{F>%lOqIR#flYzay=Uxdg|0EG&MEh0=+r%b+}!>ejOJtUhI2}IGs*m5PRjo!GnTU z+*dqfhM>p0n>Jzfnl-q5`Esu^V-59}mX-<-44OZ+D1pyjVq=#rTPA>pfv`8-RNmLs z)rm270vava`JG-eFgBdt*VAplHMbc^9xN(AFJ)7Nb zM^^TL*i|c+9$d9(5f&_5D6U739xZ~J^TX`fvqc{R2pi25V-F1jt}+@ z-{%%yM++(g`GyETw%ZyLk~<#aPt>RI-Sq**V_>KUuX1h`;V&Xv4kp zy-lS*DVlmwmNd=vplmJTf~aFnOzhUzm!xT-5}s*hqBl*gubH0~R`CYgWJOW8OJ2YD zts(sGfX-Dn7>ptw_`$la_iF{fb22SC_dL$rI@`tv*{kvIBfbEJ+;wg>%4Th&z=beXp?+&%+ch$_OUYRy@J hVD-1`&3pbYzyR!zuc4=^m-hew002ovPDHLkV1g0L0@VNj literal 0 HcmV?d00001 diff --git a/web-vault/images/two-factor/u2fkey.jpg b/web-vault/images/two-factor/u2fkey.jpg new file mode 100644 index 0000000000000000000000000000000000000000..8013df0e5697a13b81b9cc85973659467d9a22fe GIT binary patch literal 178171 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Ï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 literal 0 HcmV?d00001 diff --git a/web-vault/images/two-factor/yubico.png b/web-vault/images/two-factor/yubico.png new file mode 100644 index 0000000000000000000000000000000000000000..21aac2da678c81608308569464b7589a0b4f4122 GIT binary patch literal 1624 zcmV-e2B-OnP)PbXFRCwC# zT6t_#We|V+TG~Qw3l;@};z7JBA|`4~BT~hRCaJK-fx8Y zX((hAVTR&uf;_k||^Y;e7Ezym&L=1;?6G374Ys zNrZzh3Gbsax{Xkb!^a3a2~Qbu{0hPtu@8Sf1K}mhD_w*UgqsMJgkexf6VCjGv91&a zf-m0jM?!6qXB|Vhh;R;JG@%ImKL|e%J|wJ6a$c6jC4^~&GMs^B)lO(8tRgIftpBAL zmAw`8S+BgM8wc8EJm^)zRf@+CUI8oEDh{8hjE;pMCA~$Ms(9lF>+p9WVFM~88G05F z9wLl%2x1Xomg1dAXjHt92^9`O-b=WhFeJe8x51bx6>pGGAV4|sv&3C|}{2GgB{I~0%i{X5|KOalq8Lm@*_ z2t^}QS?)mzD^pO0hi5F1<+qPeQDfYEt--qhjhdt-jrN2omGfZjsZtrjl%~fJB4x-uneYIiN*GB(K4ohCT7nvSNO9z?y2IkU=OO z^fX|#V@mL~;<2}%CKb|byx16M&I(rzCY0c7 zMuOIKIVy?q2QZnZI}6*N@k*~3Ziwj{d&EVb?fnbnTPQThrZ$Px^!qHMk7rKg{Pwu%vblVKwlMx>d|b< za`_NMgBJ;(qPrgjkE|3E2ANmy5?;e}HRQ4cVXYiJjCKYdwQR{vQqH*)QWKEOmy5%C zs+rnfDs)(!o-fTwV{Z5g?WL~kM7O<1h%xgO{>Lb``W_i4{_e?j#& zhJv0kmkR34U&2czBc4aCGLpZqUUX1Mp>9GrXf_gbp5hfaMkG8Q`Xans&D8Y0R{lP W*j(Y>7RR#y0000Jf#Sm^;P2_h2g>_n~1$n1P(4G6*UblI|nBhH;<^8xP+vXwDM~eRW)@D zO(SCyQ=pl-g@dEhTW1$nkncOc_x_N8z{rnL(J`N5p{Z%<8JSt1vth+0rDf$6l~vVE z%`L5M?H!$6L&GDZW8)K(Q;SQ>E30c?*Ee<%d;32Q4u2jUBY*wAy1u!+yMOo(7YYFF zf5Cb_{x4wv4_qYAxKPp2(a^E}!-azC|J=|>&@o;JVUj8tVA*+-u?UA_lfOzSY8=F2 z6*0V|u=iQOrDPM`Wk>!8?SCTse+Mk${};0V1ML6e+5q6Ap*;UQG!lRU;PEbMCCG85 z6jSk~f^>NkK$7OR3jHFn2t4WXFk9y5$C zRrg_!fkwBX%>%Nj!dOZ`+{P5rk3~hpTJCdb(0U}vGSEOifsHNV<7)7Yj4t*;YXgU! zupv4{8GF9SC@}SFq~Q!1?;AsBSW4j=9x4nSEfo%RI`ZyghGmc14SpF)Lo3>B56Nm~ z7+#8b2aKDR*B9DMG1qHZlwW>>4Lyw^7b68>g2f=u+Mjqo=r16^2h-ajIP|xx$hd3Z z7`Oh}iw?LK^cR7u5dDB~Yk=)2QDpI1f&Su>c;1q%=ADUHTgBowHu8!# zmn4Nt3avNLDdX6xkU4(s;5ICjAH;~irqC>AI6q0}eqVFS6jMOvejNvaej!x6u*u_@ z3Y446tx;JD%-`VNS@p=N8V{gN9yn+*UelPgSJEwy)FU6^Dk~*#837oLiW)@$wCKxp ztfLQ_kES+3v@{J(2e3UcP40;rEoRVM=BUk|?2STsBjD6OKudj2h<}j{dp+WZIvw~# z=JUrmE6#XXCdx)nmL9ushS7IR&8E&`uh;L2;2X!GRI40Rnvb3ANvmz|^yql1&pl`R zR_?z45ml)f7frSd8|P#Oj@fYiEeKXA0SUBSP8i90TP=M&k`q&Nmu`Tyw7hLZE`vG= zd4>NVSl>i_n99<=qd?FU32(7MBXi%ZioH4;wx}?)BB-=n1kN5LR zpZu~pD*WCB_|BENtwS`*0l6ubH;niO@nyIaY)0O(qe@`WLm9Jzz}4o<>o4)tV~P*J zV%L0%1ZvVq=&`$~B#9zVYg5tI=*p?qWrbPV>jdV{$tA0OiI-~${4h356@zo|!ELLS z(dRpsGHcD9H#oTt<%GP&qW6?Be5Kpt>s?fz_|K^zep2O->f^;dy<~Occ*YRk115st z*FB4k)Q#u{E5JCMG zE;zXfy;Q&rR_2)OF9E7rHVrwi!mZjul>eyg`)E0?N^@JCWlAzz0id1j zMzRq*De}EyS z>RJ+3jTe#t+z01@5BLcyT^c^s!cv$Wuqbn%lA4?hCOkC+zuqvFyvm|l9i1U2zQ+Lohy<@OsxUn6SZ|Mx|qb%~&(T!ee2DkSu<+#%Q1T{z%U( zZjYn$XKN>M@MM9vDFTTea37Af*k?CdP&`&F_5~tI53}V@FwpVAKg6t4tFvgN`}|~* z6Wf&S>M%fWJRzr|hH=(%h{w!PSNi6c%&IOwZPiv18Y?uPD|`|&!+!EekHq&#AC&!8 zj7LrWx&ka@^|twiHd7AgHhlay%JSP{%^wvGHh4u5BdZ4)ti;%Ev_D>8WE;Of=+Y5j zQDluY|7F(B=5O&ni{i@t;0zs^c&$9bgm>X?|3}+EM0Hql^!*3C9&T^=F-dde{&>WA z`(j^|C*kJgTjo@DM>Klqm5Wlxwpv{52#-+fGAGw*vqF;)#>M14kHG^_U z)EbkR6-d-s8YrK4c^l{8)tysN7l>I@kK>>Rvu_;1X4Q6b9Z#k?mOc#`)bVI}6>h_UFY63FLl8AIeRK#?Ob|yuJ9tF0W@x+xIFEwp{ zbWxuv0X6d z!!rVgifBfsED%|8$@1DUQ*6sWfc&Cj%`))t!&&$x*Z@hMnbyq8By$pEUy-wY(Zf3+vO%AQ%ouy2a9#FT&^VMk}!RaY162zO!SbyT38AsKPLn z>vvTjWHwLwL!Gx^sAc0pQc3`mr{#&GRjGB|_XIYpDW_A!&1i(sL!ZV^5NqINK1{sM zE`f~we$`3*&EplJF!-k+zRM*fQH2eQXdZVSd3)ODcScixTEr_H|3k$)h~v8aU1w?U z-rN;atbwd1tb>Kab6`a}yU7?MaLPiaWdMWd}?$Sj3qZ2grimW+k_ z6^F#LUvLDD6(RXwOpr$2t%-d=5(YKBwoC-)v|gT#jF9#hi1k+7iK{yC5eNjPeXUnl z^L{WXuS0;t={;M7;BPMdPe-f4MeH2{KZ9<{?tr^L-39FlBP-$UPYnEZZP~P89lR#k zQVPLiB~PZo({`8U!2~>7&Z{l(^R6m6Mausy{67LT; zvH=%AzIOMcI-}x$Azx=%4EclwIo$4Y5M%e{sGzF4AEgIe1}+y5TDEGY9Hy++y%Of# zJrAuehE~0ifhK=FY;{#3maO6Rz^Ur2;Qo{uU%JN=QvEk?`7*Coi*UVWVI#)Z5bs4d zx^cS?BCbs&8~Q^RY-Sme^J!pIzp;(vS|J0pKZPoYXD;fx_KMf+*H?v@UKcuh;#_=O zzp@7EW6M@oWyi(jLeii`bq`Y>*VP2s!pfbsDhSa4FrTeAdV^ZSQ1x~kU@{l=9Y?T7 z&!2H(oq2BN1=CdD;H7`qX%BCO3cirQWe0zvj=$mX_wCH_wAisl^R1J;0*_wMSx<3C~Xl*O_#)Q|VC=`2FqNMkPp|wt0n>+t(u%?U+|W zL!>ER_}%RaQ_fl->xep!(t|1Zt1x56twh{EfODOQ88AqNL_Lr&WA};g4yV@T{6G?a zA@L*bVFpK=oCRb;uPzBS$VS?jz$tC9`HXBz^J0{D#)F0>uL)pv^;zb;RU3b2g ziQC_(C&&Ze_9sG6D+p;Cj5FLsI7W4l2T~Gs74GeJyV^g}zZnqvnA8!IpL@BRC9M5ysy-?MkVh z(L`im6P<`%no5!WuIA$w{tvo>T!j|S(=y63^4}YqcK6Jc@Q=a3oxjezvz5ph@_fy9 zt9S72Bw~mufi4v=o<81(_eViuL9DOBq})dwMx#Bx!#8wkmpDI!dtPeBY704nC-WusV*%&oKg3rWapz-@rT`* zdt^%rPG|C54$4(hnO+clF95vB@Hvn!h7t>GuU!5EL|yy?>@xZJg?zrM-#*!6_y<@I zodcEPzv<3zT~U>vG(%MJTR(d!RV^Rf!)c>hgR=~hn@{;^N_WuO>88`aTHPi*QkxemrGe>{S?MqB?hT z|0vvuUs4Yd`=Pv=OUNx*ey)3HiBv;~-NwF~tfPFznxgK;Slp+IREwx+=?aQ_WAICl z;pFF<64&r=v#$1-y)IQ5rM<=G8XaScoQ2f#EBO!evi|;s-)be;lOq!YX|F1u_~4lZ zJq%cZBS`<@mTn-6d=Rk|T*eax#500Z0N4S3-ZM>Wl0z?&(-jxx@(MI5jq9kApUW4T z(ZMC(dGh<6P*7Bv7$G;DPhdq7+yiwZPKm%&v56BLy@n|c@ zQCoWoK;1tKegKu1e|s4Ia`^?i$Qsv_t>Enis8R>riPr&@rNB2yJ8pXORtxe zMe%+J9gPNQKtDTFoGx*jriW4n7a)k%p})TSTD(ktkJ-U*xg+21ieG;dgDa9^`>rd< zL@UmvTvbiQ$u0uB^b+Z;?cM5d5NZz&Wz5p+OqF8gnetMinA39u$^y4+sh-dWYuMU1 z-q|_rXQ0&ummoZ`t&XUKRb;i}E9jxWK?`2a{n4YUO-sJvLVIHLVejj-YRG70O(Q$3ee~@;{8Vz|H<@i*HjvbkIq?fAY1{u%yZTp&75&NoBLu1GwUsj>NJ*4Vnv`$H8 zeDPk)m?!STHOKU&Sy|^>^329rl2=X`iIEzwjRiAg9mIa0=Y%Tb!%kb|-VID=4m_+% zcstGVcsHIhzUUEBzWJo5tINYg068m4QBQMaypD6KRjJ&#_gF`NvnEuvu2J%h=8Zj4 zXl@aj&^kvZ%_Dg0E8liWG%A^GiWh?=>j=A^W_Zi{$z)+9CFR5x#YLX8BT|1sz&*5qvVe7Apfe#zFf+Pcc7uj_eMVfLryG87hJD$e(4qw23_)b*JXTtr3wepc{%P6 zv;YHLYSHhjxm+j%h%ya15D%6O7egF|GIVCS1p;Svav~@I^(3ljV}mq0PL`YGfw zj-Gg1vMs)uHOQX9WBS-bhlIZ!8)`X`#FG`I1CLK{VqY?cfjJI`#g|eoUVgw`)TJ;f zjZG4hfHeQA8B%EA8#4i~yhlsxs=xbw6V!ak-zcQ`sZs{_uT0N;T^)Y`N#)*RzrqKP zxlhi6?=iQ(>Hdk(r=U*?)Xb1nni}nDJ^=c=UDoK3eoOP&qX?9twjaavw$a-8{%J@D z`s+}>yw_4^xoEid>!8`1VGtZ)ZA}(G`oaHm9Kappw#hALPOQiKMp$;gD0NYN8aD8U%^9| zC++1gTJ0av?xYywoGGh5VE@so(xw z5Ml^SrIFir@dd2WG^IJWYPH21HPov#L#S7e?c&mbm(1~zCpNZ7)?Jkt=-K|e z1c#1sblj_>1ZS&u%x0LLDi}vn-lYH=@_V=SHu}6&!%hZ8(#_i@!0)ZS!!JbtD_OnW zX+dI(9-w|r#7jaccupu=FlCl@fB;|eG|C}bYk;52rdfe<^jOt~$ksi=Q9i?9IdNt6 zSQXZ=QfJ8=vN3igkPBV<@(*uui=6LC=BZAWz=69=ZWiF}gdn_W@ZmOH7z!&%ON7yS;%z$Jh2C2#$z;!`M>Ip`mNQcRE- z0#e549gdm0WN4fm?+wwpRK7`xz8rR{)Mn|RMi)A<1we3@KRehB;^`r=;?8A-ybswD z=xUs-b+O^4@nr-?^3r8oGfb_4jQyUqn`|lSbgZ(pYnc7w{{U~{8~*^);v4T9ePnp1 z^f3D#FJlsFd-NR0=e6M-s4u~bW#-1$vY-|xojg-l-)Hs889JBO{I2ItIiDP_&F&MHHuxdG|hSl-vX}Dm+gX z&fqXoLf*6YDC2bwpa*j4kJ|O&;Wu@=Vjku+n$q8xJ~GPQaaKVve;Kl7pr%D&QKaqK zGR>5IiwpQ#!##-EZzV4hI+w}F-IyEaw5>FVXPeE`f_3`6=1#&S|JUlb$3h=*=wXf8 zdOgV5iRU=^WH0r8Ln>eC?0yfAj@fbP6h?sp@`dHr4r@{=_R&|9QNEb>qPkqPsUc< z;dZYbQ~t5SEK(6c9&lFI>Q3t`#y42y;QZy#7wcbZ+>=B7Bn-Z#mvFniU&`3l^)@M6 zK08yjQL+)K4|YtH8)T=s5gP_6kPBW*;aak#rY*UM#W%i8977IkoQL35-aX8Y>M}rX z>qRW@2Jv4+OeskJ+9bk*^p7Uu4qd+fKJp0k-Mv^}ICM%g?h44MQaQ4kBa;f|`lkQU zUuwn(@onZbivM;(Pcc$VcT*4P2`#u4pTl>5H1xJrf&}eiCKVUoiyK5UjSO>i^SWa$ z&ZwG@G4>eV_<@48D*kIEs^B2)#o-C@dL2=YaaRk6FUP2BOWy(V_`UlJppB2Voi+}p3?U~( zJ6VGPJ<9$R*QY9c^ARXap?$rJEfby}e*EvVzx+l^PP z%;fe}FRbF+Ii#1%KdT4}ydEm@Hl;Qe;36?KFfOMEH5fHa*S8Qkpvd!)UM-zA79eA3 zPAL}hP_r0WeqnB0!{sEWR3CjHJ<*fI(z)-J#Dz>6W>B#D@+pEw&KQ_{m$a*Lko#q! zA~&+@8eSo=J0TVx;+c!IN`uNA0du7bSV1<7sq4^55<@u^J1f^H>c`e=#_ru|t;hR@ zh!Ag^kh)-nkBu)cf^E(bimFF!>TEdiP?JLJodiQCsCyD=Fwb* zSszVD0M*iBPv0cbX34iT|G*OgW-`>k{Odfz?5=BUhLg22?4=|gc^N8Gzr#7!^+!w- zw>5=t^{j~2vDXpZL^whbUk;nr@*Z_Nw{2nT^r?5c62nid9SavGDYFC5s|L$|bNWG> zaNKEkaERBExg&mBYQ|--V-}*7Ppqbn!!cEy8EvDgMy3Rdg8gmiKft5-T}3%$Q!5%A zl%5tCnGBw%hy3qt%0#;eOAJ`v1COx=3lcYMlUgb@w*+B|7-qi+ z{0-qV=hME^bunHmZb4j#JcDtTiK6sW0-=%E+53Tz6Sg zZCKLzE9!QH0ceq4R%@tk86Ku%wfIC286MT9L8NYTJaJ3Hn}d}vd6n+;ya^iHqp3X5 zI%qhNmCS$09ocy3Z#ENKSUI{kPw1w>cETeyG>39Jc5+`*|K4(LblF8iw+=JedsE)x;qkJMPY8X*O@Wu_ zvc$=s8AquX0*zfq=@)CbJth*X~s5-zK%S*`-)zeqC>q*!N0>RINYn07PJq=WFwSqYVv~Ys!xGM~J?@Pvf9c;#&D@_h9NfH1=WTO3;FPyj>;-(`;Yyl4y4b&-#mqm(UUb zip?w&-t>j>pQQZJz0Te#M+^Bl&*JrQPfyx0s8E;?aG*jTBTy!vy3hcs&+V;_8LkEO zBDc@`$RSmBRrWlGo@pqI+coTS*(g^9iuP+rX%#L~n-%7mAi6Zagw(cE%%(Xg_BN6@ zGUz~jhBo0=@%#pEIj#hdi9)q!GI-LFtFJoDFfk=+_}H{I?1m|DTM`PnRn;}yohV*U*R5400DZG?G&Q~?mtp{y3wOq;`IdYywtP7!1D=(CA*22! z5W3R14BI-h_tpoCm*~gmch=c&1b)_)omT#`>)!Nxv8|+CV-K|&6sVn4E7!fY=+S&2q?`lFEWH;_Ks zGVKE@&ISVqy6$iRD5J`QXRh&q;gaUs)#ezHCtFdUr=J6jA_zjSCGLPuJda&^4pZ>x_Fl5n zlo?ri)6k4+%j26WZ+D(ay7(Wupi8ms>_gGjy`w4DmO>-q$AffQcPSk-dTw7G^5ZwC zS@Da8NOiO_DaTPx%m_@$QuGc&p1kcef{7RNB??JDVsR{{YS9 zAHG#yf97w|5pXpX)BmKWc??A}W8_(yEh*Q-6lPGbbDf51?&~6xxuYWX|E39^_NauwT}^9ERRxY~R{KOF zej8k7mK#J4v$;=6P|Vr*aj*CUiNFbTDYz>C*7sF>_qX8zPh-RqyR+7V(c5^(ZV5ZAz*k%ceFVS4#s14rL+%=?%JO@P4frpV*nZKBytzZ;My06%l7 zt1BgPjRFLG1sZcu~CT5O$dr?s;9O#BbN`pC!r4Am4i3Kjax^+J)|I z1HxwS9FSx!Q@b<_5n#}@l<9`-^=2JH?S*=7jV^313t4vXi8Swf_^G*g;!H!v^2q~6bC`P)|xw@(d z5%8*V-<7hGW54BIFNUJil*70RfwUhi9E>K)^K<9XonZ;%6x=lBB%?yaFDpNrL{pHE zhgGp0R8QrBm6o7&e8KZB+1Y#nGY0w3-n*76yP{!V>C*Cr?vq@N!11P3eWnYRtf|vz zzYT9*iSew(`DW#)z0HOnq8qQq?Vw4Z&Ud51yR+8OtNli57Q;8|=9xo&0^0)SDCWMK zIm-gsc75x~WRIVQ;S{smU-x8z#oxdBAv&l3D!?g5xxSvn*9V-PC5nvNZ&^}sLeJr~ z-ub+!H`6qTrmw5FQvTXZn&E33tpe_C`5CIO2ak+D*ZInu`4Bi;TkJFPIxW^rQ>tmM z3csky?H%njTFfR`_;?m-+E!oZ|F%iMy+My+iN>l42S(fQ5 zOhk977sKsZ{5>B5K0vV&YXfLTyMm!SR_LO1Oj!MH!%BHj-pk}-RVgmHzcuHcICtH; z$j~f`v#22*dMMG9uWj51!akmjJLos&yrEf4DX}ZykY2*Z_|S|lH*?0h=osslHvaj* zI#=DAineinH|hLF1)XN7S3T2i%&0pR;(Z*&L7q<%hdiYDH}@4wcNlmvet88EKpGd< zOx52iE*_8ZB= zI;3%9hA;V`)j1wN;M1n_rK-}C#FJQ7Rn?mplX?X&IRDN@6kvlDh+1RXdZV=h9Ne&2 z0c#N)7=lNWuOlV`b8tI_0a z%{U!qXu^;MQfQKv-tSz=(faL~`xtLMaH_4nS><0vEb9A+3?5nNAB!k)AV&Mj`(9lN zj!b{Y`^M4}KYxf$`yey)B)1f-<&xN3t*OSN^Ue@X3)52dT^a6>8FyG~5hPY-)8=@A z!=T0wtEmIM=h#*m5K!|?gY63V#mTSVWJjwr+=wos>T>2RUcOgT94tY zC{`=N5xOe>+a!4Zvp+BR5W$q>@9&g4gA1=hbR683)QgZEUQ1nA{TdmRBmBJUcq{++ zGO;6Tl3K$=VDAmG&1>NLd4LYj88cf_mm^+cf#Mm|=o`xx_ zND-U3veumEn)qwtY0qTx6p7NzxJ^=mN*CT16)(LMU_Kdj+S+{P4Gmcaurx$^l{B{6 znb#k@1|9BgJ{f%vG<{^`WjtS#tHF7_Dl7^9L;oy1JZpXPdFKWB9*|~KHw=(^jiEzr zPKVixQz==XT#!RN(kAwU!?Jzn<_TdB5WmEsNx1WHtxXP6E0bebQ9-e7^UO=87}uF1 zqmFKgy6QJ8{#L7_EA@+z+9TF6P#TG*YG4JHq2!T`Aqu|Od+Z3N>D|lppzQR9zi57p*7qRT8WqLW& zRXa6m?1-jUS<);A+?^YpvD|$s^Q>{Xb*IA*Xe9fkE{6?Y5DY75NsL0qXeA0t@%w#R z#&Ngqb9+cKu#JTYs4}3cesXe!tO{6nwL0@X`sgiG{47(IiCv z1H=f`Xo?y9>0iz5S)2Uc)P7b~8f@I!HvgzB`(B<|pTv5W@1adj=htfH znXLfTk_>aJy46ENT-PVd9dqdyBa`af9A&*%^I!?OI+BbcFhEKGBK~cf{8iW@$`bgi_@sDRZJL>c(=oza(%8^ia z7#DQY=Y1Njh1-_oMORx>Eu(Tx5Rnr1X zVxtL+(=fkBH~B4-nzB?ixq&J>Ji2zz)W|sS@}rbgCb% zF2&xnAv4~ct?QZ|_|f7qWL2K`m4Kkwq%;4tVp5}88&D;6C6I=7Bsxxlh^A>qJIt<#Lh4qss$MlYJEbQrk*JCA{J^?djI<5Aivncj^mpPhJ%;a`a!0DnhYBI4)p^}nlHg)NY5Z-oL z9fPZkK1$LQOhr0J9aHQjGQ6wwpZ7Ixdlu5tpqf+jBOB`fsJyY-dTsb?u+U&u6VkQYI_h}bj zpQDHiat(vj_Z_dnDN_8vxz8L{oHAl-c8%yfIbrMph6FgTK?nO9XCd|GLx;wk4s)KT z(nzc8{|G3M;w;fO#p>)j$%Z%Dt8tyiYDciP3u)$W8WjZe4|0ltAQ}YSo==>DvL~i# z(2*v2-WzT8XD{_AvPD&N4DIaWDr|T%X4+1X7EW69C}}^r<%ikw8n5fC-yJGM(Xa5l zVj`0Q=NO8N8vGIM{skTR1BAfXWF$2GNxmA_IN%Bxz9d@gm9#7K49Iswdi~)#yb7wB z)|VY+CbIDSc3{1%o$h9S{s6VI4vo{-vFgA6s_8&-8z!WVdF6F9 zAK18WVt9Y*1QI-D))T6N)0eO6vhTq(uf|d`W(^U*lxZQhhm|@BV2+-5YpgCJ#}DMd z39STDVB|;b{sT~3nOO}7ID1`gsSakOG$>I#DEwgx{oZI(RuL8K??b8dX=ge22_W^< zdavT?bu){b8w6CY0OQvt(KV@8Fh@oZyj{|R34HMog8fKUDEXt+;aP{s-!O*ZkPEBF zya@lPR5ft8-TxfrIQ#=_ZW`QqdV_c8C^a8qV%8)0;(acIsuZUBjbwQdy}V-^3~lh@ zZIzIUt@`~;k%EB-CeTHRwehV}X@6Z3M=Oru+B^5R>BRCa!)p&l%}*4|K1pY*>0W_G zC<8~D6{3JkFGxjX%89{Y$|m`acjRh#67@mey!VV+njRKZQP3mT0EQu`n;tEc#>pC~ znP|MT6n>EAp(cv*QYMC+yb|s6!!Mqp22f1l0{#dK>@n)u(aVlPUn-C>_jYyWpA6NJ z#<>7xn3J8~t5sdY*Nz+rJFemMci%7dwC+j@x6DD5RnlF_68I_BqPb2uO4l!8-c_^( zQ*#4zgm=%0?O};3x!fCJcpv{LdV(n}J)xIj`Ef&rS-dL?~tu3z+U0R>O!U!hN zkb$V7R9ubKA#}K>W+Bc_jJy_RWLOY1~H zmVDU$noJd>#%Lwy_Lh(Q9{~LWS8Y%F?33j(%zNOwxiEWTTZ&5enFc%Oq%ILsO#f?B z{}D!!CeS{)Lyblj%Ss%13^Nak zCu)iAmf|p&(e9Q6J~%3DP_BybLRih1@gH-{o)p*c>hFRO&cmw?aEPbr(t<7xobMa( z>4BAkWXv$F>BA>!@nio~4&d@16LY(5LS3xDJyBbzkoF0~<6DlS&Oo3m#uo`BU$Qy_ zkrc%`&6p*1hbCP%@O}6k8o;ks?$v<24=)^YOS$ugX}0p)CTgG;mv^T@%E3l`vZ4aN zFO}(Aaamxs?biz|w99%+K20xqyg+|{#KxyV=Nx&>X<6;3 z{sBT!Bm*D(Z!G>cK5AUjSw`asF#b`>2+N-}W%oWg4H-YNWvj7^X>~KV%KRik?@%R{ zUgG!8vI#>dkGfaFU&(LGOk{&QmDm!6zWA`_Z_FOgKsKDZp;Ev#rG9+gw zDc1d3j`YSjiiuPyw*>B`_KK)1bR=|Ep_MaQ!9@p?vl%8M7oaaTmOC>kw;_AY_)Tpo zZB32%ViFko_a9&<-#u86=dhysF$rvy&pqHTyJU<4^`cgo?Vgi0So;U4)5NNikkh!( zvvMv2a4`_+1$w*rJsuU_JQ@FBOkM95aoBQ}n#P3=P-rV6G|F%fn`>^btYHLPzT8zUbCZ5l%^^`%BQ2nM$tcpvj7^n)@5S!qA>AC;Gu6w(%SKgK|G9Ad#E8->frA@dH)`?TAae+Se|;Z8t!_4Lm!V~^Xw0=$IkYU8G#=D;&UUK2+T zke?J>`*$4f05q^oJ_8k&{;u%#z`jxXvI|HNa-vAei^{#f>`*2MLfwlIU5ZrUa3$P} z65#Hvct?(lc!vqo;g&TdQv?()`jyD)3rUd|Ud^CG30^XE*uw%CuilBG!CsNVRAixc zg_s$L&njB0umOE^{8lo7&sDUKfNsZ zRUb?Nh!8qgaqjRH`N>2cy5jF2zu*$6X;Fkl_O0#aAD~YS?YG$e_KUk%gdkbt)53}e zo2kNaiF<6)ttxMJR2VMNl*kk;(7_WevGYN{_>+(4dr3*Rvq|~%OTdOEGO_s6KfwE) z1{x_uegQXtP#8?DuTY`zni9_kghPx+^3*iRzq{Xyk;u-l@`vyot7Ao`z6K zw!h%bC(_WljhJy;YBPxRlx@R0w#q?SsMO2haiwpu%=mxuS9T{ee2i0-_F#W%o^WRN z&e&yLYma~e$;TE6=>`LfFEPHT#H!r#tdIY}>}X6&=hD>w{zO>5oa#rKIlfYW^$+0W z8T}7{(K6xQLPTUKw?R~3(5=KjQg>|i`yN=Q;!duP%2IerZeMD=AyrR@AV_RxEb**7 zx~0N%X`4ZhMe+RB|2dJq@)+Cnl_I;cb2%8nqm?S~zFRKy-ZaKLS`Nr`O_#(V5$E?fD3XT}y5hoA`@#@?_Nsh)Bb)oIv@Y=X6=V<(sSK< z^NsUek@wC8#bD!nH1yph6u}Z|PW-?$kF=eS%$IMyUwOtGc)6VuRQxE~t)c`M`#Zwj z5`5u7V*dM-&iU`Pt#V|Yg6o8jNd)x3)*DGzJWbklH5QU!`pZY8B_fD+DPnV~^))j? zHKwojAMQa(^hBX!f)M+!zrm>UqKHdW zM?>=vq%V?-E7VO_%ZSd^1s>PAcgR-Of@C&aFNn&`W_vTs&Hc!cl1O-biT4b8Y&yJao%liXY$w4^|5Fk9JHR_QW3)~2a z$*1uy=sepJpWPBaYkT;6)ktcJ5GgTpoSo&96Pw9B((nkL5zoa!BO|oM2#t&=S#g5b zH5Y~`FdPoGii4sml4ix&jHy_ArL!uWEaBmd>8q0D zWu2w7E-2+N*Si@Ba*T;wW4F#Kvo}lXg)08KyuUebzAu*BCc%219B}X{FUS&K%9c?- zIMV)=wi^wu`C}hCCt)M?>26vnq25nM9o_#ukMPp#&KGGb>15;HOJ&XmHXORc<7eR*TTa;Co%f7c5&vzp|kG^HMw6Z#rxqN~gM%7KFO?K_`G^E|dMl-w=v ze$%I|iP;Y$_MHa08Xf-uK;m;h!LutM^}3$n!~%=qeCwG`)~~mDR8}o(?me3tA8X{?7bM4a*JP1Nt33__2M5C=25gp4jpSo#``&D`w3vxGyXEKQpf!pGoZlXHlIGE0 z4qXT6Bk%qJu8+@?YQF!Zjp}{M^W)FhCuD;naB!tNn4{5suuouxgluS%Kcz0Ns(hYv zYO_)UNBP+`TeIWa3h4biWvb5+7%xIMoBbkFT%fg_=RRJ}@#7BJv2oI^&VOZA8_K&` zBV6_&WMeRGI5WEC)+~R;KS00Fndbx$F*YASPk;RrLl~0JW|+-MJ#qM~c-CyJt@<+b zVwB4%elRdrTo~hkSwqTE@S2mZ7s51{3^oc^9+k=CCUt+Dx(7L4D07!-pPuwEA+{Lh9j;k!R-Ph4x^ zabmBHeysm2=v9^f{hyf*PS_ zt=fBpm{qih+M80NsMwqEjV)r9+M}f!F>0@xC00>tQ#$_X|95gul6&vTbI#5Atmk>& zuh0E3pz~k8|BVUTZ%Edma<1+{0AFXmuxU8GQI53sa+k31MuUFn4r2Q}75J@FH(hiM zsiHjF8x(l4ao)f)`_ig<-{4Pn7=OJu1E~fo8B9*C2)0^X|D^lOqFzzoC&v-Lb`Sawf=@tcM~y=ivpH2nho#ZJ$W)MD_H0W+n;IBo5E z_N{~WsITAu*#9M}Knk=u;SI!=Or{RYx*OY7jz@2MTCn`O2oAE3fh7c{bM*pUPp=Wz zxC^`A^(|kcLz4p8rgSjDo-QOdR_sL&ewQmH1FGe%JwNb)Cz4-G*+#$b?R98k4wCGtn;wN!K7eqhRuCy(User{&t=I7jfENWTHp({;VyHL zy~Ywt9RqF)vQ=HCF$gkIz|>4}s&ycdXVz*n>w(FSJ}i-3$EcnNx21(#eK`9K{x&5=rh^JA*Id%^+}v%V#_$tM55xM5sGQ7$rW( zZ~63%S42#7xkw+o96Y@dqhh@ruxD)k-T&N9%OLjE?4{%Y<&?EPYvs=)8%-IF3s>B9Tr_uPb*R<#!7U9hjB8(h;E3oJajm%M7OMDs)^ct6O*MAPqPMqc_ZMXs=DGSqVIypsvmPm}VfmJ{EF~YR=HP z)p{x7DY(raHRd-Bs8e_kAWm){3anbS~U4@SyYqroB+iUn1?!z$b^Kga9$@8Jc0#L}UvubOqei zaM)h`zM?9cZk4i;;Tyh7(wy8Y5?+06HPGXWTdiO>i6r8lEs_WXX+7oN@S#$+Zew{3 zitZ1&L?1$mr+RSC`X%O1RY(`prisx}$Y+e{X4b3Hjpx=+2`@5#hOu0UG!=jTGv$zB%?hY;LP$b(f&L# zLzBtAs9*4EI#Qg4_aNO+6`-V>*mzOYo0_`HcO{6YIy@VR%fNmKFCF^w)Azyj{OSku zM>H?}j(!Xj(QAa4FITS!r#>3};+63JKU_})*j2J;EZ6N`(LRT?NVp+*lAxf_ntucg zj{a&n@q>FYIFG6LSG^K@5CAjde{Mr=Em2!1dh?ek|Hg6<(lImu?*HIYv>5dGYP>?r z3zFc}Fi>m&KS;*ShHHdH0?!&urOYg~;tAV1dO5DaXcyAeJo!^2mgf#S2Wm-^g>+c~ zyDB&$sa=FTcYZlmmULdxl&H6YcRLf(aXke*-t!iRe-z>?Hhf=NJK!zP!MK}o7t{;H zZ0wqpjLTw-{c+NdB{f)tWY=bbHyzAZi{_$rnA7JfbmOGPBup_sRLP1rdbGu1VKc%% z+4)efIh-?TNavDh&he#=swH_TXH>afC6$Gz2DB4rkc0JDUZOwE=ya1td=|GvA%_#E z?B)aq(w7|427#&LI1x}st*XlSLkSfJ*SB=Nke=hk0+f{MuPS0KMP_}*G+c(8&d?}f z<=9?`XgjiZ(^!YU3erm?NC~XuGbD!;a#BmmOyBDFQK457mf1hhYmd@*8QekCFi979 zYKV96We@Um?R5<@Fcz9=TXK&hqKcmGo9OwL^_aBJ5RH!_T9|CahQvu5SPa9mNGX~Q z1H8+k!Q4Nr$0A-ptI`%uULBa+$W-Qw&L?&Yz93J`y#MDvhQCC{VS_O@@5|aua7O75 z_%Z~n?mBT+`%>XQn4XIU=r%RdlsjNHIj+VpVy+~((?cG8Sih2}91L2v=Kc5Erqsi~ zL=P%_EXyuR11IWU1#0D8*?bzR(c~?-&_>KTdjAUX-!%+zu_+A;@f;{a$b9&j+KunN|kYdy`nyGA8ny$*ppBH{e8>) zFA?>z)vCRrj!3uxUClS@T)&o?M*`aF_mkMik9&OQ|M1SV2s{d(Cb&6uA$1)~*KnT+ z@XHxB*na+F&^*6b>57uG;vZ;cRz*iO!iN2h?}B2HshcTV_QgQb_b{Q+K*r$b!_)cy zp`Y&eVm_zaU|?mi`AJRT+j81x3UPgzjPw_sf1nR8oW)b~^65X2w4e(DL#mlF;CDcL z@1AM`h$x?$aKn8&D)UC4+r9D86!zgF;UM{RC#2%Gg<`cgA~7CBQm0*m%+fe8f_>|- zEw_=$HA?PcjPU%pIlfsELE8b~5SJ6LB_MWrF-s(=+n@KM`r?~K zFy7l6!CaD(`jpCmS;|}1~BkCpST5#Rjx zF)!-*QMWiiWp}eD)?%zRJ;lBye3a%NQND7z=-_fT-ctu{G8%q!$9pXlU35ELc+p*T zzAAVfcRcAGh?QeV3AbSrPP(KU2YabIMsTjwPkup=FF@g2OE3T zTr!{ur~OUg3tErb3kFaX1uJf+cZQljKFx-NbP!eny#!)q1b$dAUEh5SYrFnt`|Bsm z@E*r{k_`LlH+PbKJNnsVK}cNj!mQoZ8^2Q@+uxUO=tmQj_Vc>t-XGD!+CrCTetrEN z8gIon%Q||q5}p$BE7=d3)3Q^J_#`RL8@I^_%UvA27yapZ$H>7GVE@i)V?cU!@%a6# zhNHDF%R^PWjBL$mhrtZa1L5%%Aula_yF3^=y!1J)B~Ptrs1$GJ<@|z}6eLS2&Z)t1 zFY8vg8V$fwpT8@zRjm?@vbUw)O!-_}%%WpNJj6Yn-Q&69Z`-t4Co)CAM^I;tigO<2 zPr!l}t&Mg$N9F3XTGEF2OT`#yMP8#KzD7bMbVe?xn0Yx@+F&`;tZ4_~l8cPz`$?U2 ztLj&&hW!bxtWB7Or$!a_<{wz^Kf~!}zv!v9 z9Wj=OMYlXy2(NizRdhJX9;o z(rS71)Hi>dCMBCD=a+xo6W)}WxwgR?Q|74ndt`xCGR=luw=5{5!El==aJ1-$7I=PU za&ix)olW%Jyzd2#-wA*Hx2H|58HWmG45!nFA3{&jZ!m*vsk*z0%6NUrr4^YwrNd!2 zJjYe;)u2Z^ue=1-6z1uV4ObSvR}kf0G~GP!+;?lDG^*37-WA{P3|rC{rx#wCxt@Mq zJ5=bI$}^#;8n#~3=mXy&`ZbA40O}s;3#Pe$Y*``MQSWrER8L*^ znT$1^me#AIJNK-+C(&7$Mo-ZSzb*qDls&4CLNKWEro0Yps8V)$uvmH77sTMY%KP6T zfFe$J^<&1Vx=LmujyP zcmi#rry0UhC2w74GD~X6X{NG)G_ffxdxvGeo)G$lp}ATGX)D3;L#S{C3w_Zx;K6EL zd4D5Tsv~#GGh~qaTyp5-*lI{nNz3qDQg5lGQZ?j>V1w*|k;PzNHTXe~Zbsqx#%lik z!R3GhBgyqn<{#!$YU~@bkV^feYcs~M&q|#)Q@BSwly%V4cS#)TVuxtK)hM>tsH~|q zPS5I6)uhxN1GjfW#n0X@Gttpk2o|I|LCM-TnOslbO{KBDT(exwyAMXqT8?A6JrCm| zMSsS4m0au^tfcG|h1NHD4vu?*SoI~wADt0W46bJS5v-(H|P;3Pj`)szo1EJVjojhc}B-}{xkC;BBc#Rv~(^-%xjo%+Hyl zk-&FJ;dWr18Jd%?t%mJv-(`+-XXpFyyRb~Gen|=b4d%d4BpqX24ro~vfRY(HL)G6= z*`;&kMb<`dGZ*8HU&fidnT{AUf-l-ZP^Fay5W0n`0E%LVM75P_==9Km&GGI6js-4y zzko;d`5tSjUjmv(H{XAH*Up^dHmbCl_vjM1WHN>uPLWg+Xl#HzHtpYIF4RMDAA?~{ODjwhXIAvk>l@2rYr9)4+77)b zR6pzuL|8DzR|q?9jTBSoRzY;YwW-hE>mtoi!;*@{{lH}Mj}+sYhxBzJ4-qf<{fftY zE7k-z)97eJ-~acDYew&$Cl|Z3_zz2TYrJWjs~Cgc9U2CB8JJPX_UGQ}cKD+$m#ELa zcL(`;+6ansp_a!fW4~Vqkw)Trydxxz?scj+U#yM5jf~~2H#BcTpd0t^nWcSfb<;C< zED}q)p}Pg05$BDW>Up>>IAHK(J+6*3XIe4metbT$qSNAgtt-D{XsPS>0KtvYjt2L} z_bGeQ8G>|4vb<9UrJW%>)gP!MB;Ax5&)&GSwLgJWEx$gY4K++7^eaMXo!B&Oi{3LATP9)@6=61nVc$DzZc+DrZ`NX)I#q>Xti-}=i~!w zBq`L}d33}5Ikm9Hvb%lU+2Rg$xM8q7=oWtx;%&weg;c7w4k||DJfa7)HGC8bWfZcP z!)gnVYmZ8b*ra&;{9&ebcTw(omdv~Cb}yzZkDDNqGe|78rMW7aBCfQ2b5L`+KXm24pW}T$!WH{NyDsxb;RXI6Ym>7_{y6KFSm=QL>g}v!Nn9< zFQ54pPVj7V9z)du6{nQ!zlGXiO@|VN7v&bDNr-yqjX1%@%&}3n+pIyS(VF4k=wqTK zkdf^XA1bJq45f6}9moFopg^Q9MLWiQ~qc$ zs^c|AadY0O%7#fB>(|!0r6b)h2M@%uOXe6ZTviz@RoEjRg|Jwyn=O`@e;?koGa-G_ z$S!RW(iVg4oI??V9J=bf|#+-4ctDo_&0sIsM5^&9Bc;DeLgG*fgFXI zC!)hF&FEhLm~pW9uOaS=N9+~#cz)voe`2Dp3qQ4iU5rZ5p2U@9nEU$sA_1`dQontT zdFcY38+Vw;dcD?2ruE$Fo!t}5Vw}Q+Go%guIdE&!7Y9zkhc@@{SHK~FdF_hN^-hubzKbly#R43&T z6NXMn3@jedZDKePik7^t!+sd&9(w2yVNcO$6izCA>GQ6fHez1=^VSFn)LKfUQu zCSU=TElVhHN6%Y!MGKad6e%3bLx@~XJZXjIpA;M8U)Tp{nS?981MM4LD zR<>Od-0zaoQv1wFCdC3jgHeRudRkw-H_n@G#U|6GgYVq9_t{qWTCD9+f-+e**{{i+ zbCz9e%?7#>lF{37W|cu-1W-(y{SZ1Id87^9`}x3Y+E2jgDy#2 zwL$h6-9PQ|{tz3aF`E`xU!yj^Hv5zw*iYXbUsWFsdYstO>!3;JHeexO+;RFkt=VV= z#xvYQx_>Wh%ejc%iN+4yF2rK zGP7;ltj84Wo&_a}HsC$SvGiq}v{1tf0oP~hD0+(bN=Gg!^}nS35htuMO1E~OXaw6} z13S;leKmL=q-eTnpC63rGGFy%{x@9b2O&1_C3^x-;mHfl$4DuK!~ z24ZU=Qrp2ksw75@>V`TA@?M}R2rCluLAP0vFK%v(1$a}+_MtQdh7vJ)+nZq~-dmz~ zBA1b5=zAARdqlk{bV?Y&fo$oz<78nP#rKW5R0ZJB{x|sh#=`zmdzi(LaHcI|`;My<4pr;?_Q}^j79@ZjAmg zm&Y%M$MK6;A9dYHQPi>mW1BA!hpkmA$xZvt zGn+2nz2Ke2M$hJ^g^%;J+FWV*+qr?{IvYo|KShs1ElX`($xpPaAFQVrb&YyMCchxV z3e^_hp;*xdps$oH3%K=VZr1w#5}w1e%1r0h^iR0rL&bUn`qCcFLkKNei-T-$;+-UkI+^`;=1_JxuaC4R+BmDxLm$c3WziI- z*!h>FM_rr8=n=WF%+NwOyr-{ruVzn}Kl|?J53ZTn=v`m~1bRt#k?voTHW4qQx8<~^ z#pTT(pnayfYU;xn=jUpMoaPa7l%IW>U?@%D+8jlcGWEVdliV(%OerU1K*AVrnm)Ar z<;KEpC2lnav41Ek_f4mEzd%wI2drH-0HkoA^v7VI+J7OiMLpe3W5M`FFA)_o#|{_L zY9__&lM&zsfkS8n%Cda@`Y%MqggtFWfm2Kxr}F#k{y_wa7g*S_-RM?|D*kPQNFz#E z=7C>+aHFxjMayU_y>9vOMpd=G0f76FJQQ3bj&DK9M@=i$z=j7r1tt942xC2hxz}{G z(9wbU_9ifjmgX*g6iJCTn6r^62pu$j-#%ge1G7f;W8%94JRwrQY9f&|E{N!d8Dr0K z1cdgNp)J0FO7B<0d;QMqU9f+s;$gAqHsg0uC`xPedJ${g5v8CWiXsa&>%g+zW^!Sd!xuhDk*n%|8t%3hvziziD|jymFr5)bgS6yO ztAwj8@6<`q!HtP4^J<0eb_~$U(o8wf5#D`}LAP(m;dDbgdUuY{LU^R5K;oOw4z3W4 zdEC&hF-BIJ@1(4SjU}Gu4DySi7onPdh9+0qT~1#R#rYYUYO!M>&ZkDpI-?4Rk4|#m z-TDm0HH2FYsW6{hQdRXuEc^##M>YQvNv26*?Wug`icw7R)Q(axhf`xkTmQkD1Mb5z zh$t+$>vP;@zqGY8l^ca3QA-{3Vq|8h^ z)63R!NNWkoWcg}yLM^ARZdw*wBAwEdsT0l`=UEbyM*-ix56WT+>s0(ra3gk0yNb^& zr5UHZwOBGMU8`aETs7dJ^*h!iQbJ0WU4`c9#izL4$wmIw_UW z*}Qf<>TGAVqiE?ARxazKkQ%$Y({0`_oDDY*XRaFC!wYZUuFPGA++ z0@PfHLkPeS%reJnoaO847jJI@jff*Vw)IU;DL?cM%2DzrObWjcT+=V)S>ZA4VGaQ! z8tECcf2<_TX6SB#pZ5%|Hq}(E(HAjxCXCEcqx3e7o7}b2$3)U1A-~x#*TR`F#e}dQ z*uA*Gs|42;)bQQHca|ySLHs^J#JK3@IHSSuj&Om6Oi4a|av3sb1h z>a6vXQ$1R{=!#>~!e+z0RNLk~^6e}mWTkt9{jkZNBjiKFXSDXQPF44YYwOy%^Du@> z8MEVejvu~8PollD@=p8ey@oCt%35gUzgo6AXRFHY+v*q5rgbsM4%N*halVL15?UE> z>u=zD^D_eU)gQUv5m};o2-mO;2Ql~<+0zmnMEDSLzIHtYBFXwol&-t}^h+N)$qAXX zUHCekQ0dc2Tv8%H!``4?AMHSn$eG=FWHP07j`YeZ((!F=NhhaS*;vS~s=iqkLpZ#i z&$ylYtU#NfkykX2-qr4%RLuK7nJ)9*-GrPsd=LR;&o{or@2gO3@ECZ;?07ll(uI z332M{tpzV}(-Uwxt8@I@A0qLJmLhBZ11_Xtj@|^6u1jQRtN!`|*T51L_LRW;6C9=j zT*z{eDv0>h(IRZbvSLpd+JbPx9?Wlk=$oN|h{}|!3oEcIKQ`x9>d`QDY}A?NYOkJF z?}lFLCd~Z5yIcl_2iIcO_^axhU@<;cL4kIL;A&QQE_FY3^NkhJk2qgMBkG1hB9a=KRrC|R zc}k!gKU4CHid&;W%j@hl&D6n$puKLhST=?kc61dGsnBOl z&LbSXz9`l*6)HYfd3_6^Mtq3@6q?Yq9|nRk!=7F16hFfKBi}v#gSSim1G*A zq(aA9CmvmQA;NaGF}XUMiSZEkVy6~lz<7qmPr3|KhS!M=OrWXDz+*cbzGA$fCphNqVKl5jTNNd<<af2+jCZ{o zyhpv8^x4+X+7-?z`-k89l65Hzs?H`ok^f)nEEJC_L&B40-hj*3I04SoBo5PW{R~Zz zVx)vfNlk4w={FZiuFnzp*(~~)(0WKxd~Rn){#UO z1NBp}Kj#GyO%%APY!|ih6(;JdfiP@^Qy%EpO5!M_U32>oI!a$X)GTrXQv4iMM(CJF zY-EzDYVT^SS{dmBL<^l)l>Y*~kvTmuTuN~x*X|Kc=T}7&j|$mNM*@0P^3W`Rb-j0x zi8v3mFtgq}igH~?b_!5`j1d^+)@#bl;0qejYl;+3;G_W2LykZaqa+M;ZeJ=)MwJ0n zF1i*#!1w1Fd9(u{*8w-R3BoPbwqpXPB%O`Pf;TE4r=|qmJB5@ArN-C_KZLPhpQ8rX{|Bb1rlo+f@9%^-$JG=VW&sb3o<2tpiIFaOE z`*UrGP(po_!(&E0??`77puAkx1tryQPe^ZhC;q6O#(lz6z$zUjTYr6m zliNW457`50;>?}BgZ|;e;4Y=|W4o2DTuQ#T4Fo99ilfr!zEs9fe$SrH>0e!r!%qsbonf|B3&w8RDS+xG&Ku2YDRR= z#I%IEWRVn>A)$ohUbW`xcF6jutSFI?y%2O%5rh>^2{mJgmeRFE)tY3=Po3L%E04nTW37v@}zfjR<2u1M|3 zFjWuo(F8?)H%*h!ZaxxD;3zF5m!-Bf`=YJ|ILGqZPQ~(06JMc4dAAG6$>QYDLK_HO z=)Ow4S>$$>m|GyeN(I#CioRRPOOg^-l;Wm4aW`+fkP^UBMiE5>Cj{Mz>Xg+mZYW`u=^GMpa-jb(dSMaG#-DQhu>( zt;XX$T5Aw8VPiX8=w)jHw3;Br}VP6_asGSotj-1=nW;OCd*5OARcEnhAxYqYbvyxXynV*1M(i+O8T? zKdj@VTOssca-u#Nk;8Y@blKBsIQ~mnmJmXg(<1*DEc&{e`V=k0!W<2QYws-m>vof6 zNC+g9A|1Q6vat5=LVaIEWDpyYBE7ARTMkgX)xsJ81ZYp(l{gSzSfks*S5>U8g3s(RXv%NO zqce;yUqU*H2|GyXs}cAe69mch#|aW*P0*5?+B5^rOiTqe;cH~1SuZ}59W5$B#18pU zCj>;3k4n&>Q^*yb%bTRksu9T&ng#*Z3*qq~`0vidzWZB=Z77w?9%-I=2ccE)ZLtq}Ij>T6m)Q2=qpR zFlg3RB`zcx|RT!P@>2lx*hIB9RLqW@G`{o?{xdO{22&g@Jsd*8b8!GGoaY93pC}*C*MOPLzO%8xBEXi|PUX~(8bD70F&kKB35n#ba*Wr%Zu=*?$*ymM+yr81sKhp8x8Z0>D i{djfi(~{ad@6SwZYgas + + + + + + + + + bitwarden Web Vault + + + + + + + + + + + + +

+ + + + + + + + + diff --git a/web-vault/js/app.min.js b/web-vault/js/app.min.js new file mode 100644 index 00000000..6765f193 --- /dev/null +++ b/web-vault/js/app.min.js @@ -0,0 +1 @@ +angular.module("bit",["ui.router","ngMessages","angular-jwt","ui.bootstrap.showErrors","toastr","angulartics","angular-promise-polyfill","bit.directives","bit.filters","bit.services","bit.global","bit.accounts","bit.vault","bit.settings","bit.tools","bit.organization","bit.reports"]),angular.module("bit").constant("appSettings",{apiUri:"/api",identityUri:"/identity",iconsUri:"https://icons.bitwarden.com",stripeKey:"pk_live_bpN0P37nMxrMQkcaHXtAybJk",braintreeKey:"production_qfbsv8kc_njj2zjtyngtjmbjd",selfHosted:!1,version:"1.22.0",environment:"Production"}),angular.module("bit.accounts",["ui.bootstrap","ngCookies"]),angular.module("bit.directives",[]),angular.module("bit.filters",[]),angular.module("bit.global",[]),angular.module("bit.organization",["ui.bootstrap"]),angular.module("bit.reports",["toastr","ngSanitize"]),angular.module("bit.services",["ngResource","ngStorage","angular-jwt"]),angular.module("bit.settings",["ui.bootstrap","toastr"]),angular.module("bit.tools",["ui.bootstrap","toastr"]),angular.module("bit.vault",["ui.bootstrap","ngclipboard"]),angular.module("bit").factory("apiInterceptor",["$injector","$q","toastr","appSettings","utilsService",function(e,t,n,o,r){return{request:function(e){return e.url.indexOf(o.apiUri+"/")>-1&&(e.headers["Device-Type"]=r.getDeviceType()),e},response:function(o){return 401!==o.status&&403!==o.status||(e.get("authService").logOut(),e.get("$state").go("frontend.login.info").then(function(){n.warning("Your login session has expired.","Logged out")})),o||t.when(o)},responseError:function(o){return 401!==o.status&&403!==o.status||(e.get("authService").logOut(),e.get("$state").go("frontend.login.info").then(function(){n.warning("Your login session has expired.","Logged out")})),t.reject(o)}}}]),angular.module("bit").config(["$stateProvider","$urlRouterProvider","$httpProvider","jwtInterceptorProvider","jwtOptionsProvider","$uibTooltipProvider","toastrConfig","$locationProvider","$qProvider","appSettings",function(e,t,n,o,r,a,i,s,l,c){var u;angular.extend(c,window.bitwardenAppSettings),l.errorOnUnhandledRejections(!1),s.hashPrefix(""),o.tokenGetter=["options","tokenService","authService",function(e,t,n){if(-1!==e.url.indexOf(c.apiUri+"/")){if(u)return u;var o=t.getToken();if(o){if(!t.tokenNeedsRefresh(o))return o;var r=n.refreshAccessToken();if(r)return u=r.then(function(e){return u=null,e||o})}}}],angular.extend(i,{closeButton:!0,progressBar:!0,showMethod:"slideDown",target:".toast-target"}),a.options({popupDelay:600,appendToBody:!0}),(-1!==navigator.userAgent.indexOf("MSIE")||navigator.appVersion.indexOf("Trident/")>0)&&(n.defaults.headers.get||(n.defaults.headers.get={}),n.defaults.headers.get["Cache-Control"]="no-cache",n.defaults.headers.get.Pragma="no-cache"),n.interceptors.push("apiInterceptor"),n.interceptors.push("jwtInterceptor"),t.otherwise("/"),e.state("backend",{templateUrl:"app/views/backendLayout.html",abstract:!0,data:{authorize:!0}}).state("backend.user",{templateUrl:"app/views/userLayout.html",abstract:!0}).state("backend.user.vault",{url:"^/vault",templateUrl:"app/vault/views/vault.html",controller:"vaultController",data:{pageTitle:"My Vault",controlSidebar:!0},params:{refreshFromServer:!1}}).state("backend.user.settings",{url:"^/settings",templateUrl:"app/settings/views/settings.html",controller:"settingsController",data:{pageTitle:"Settings"}}).state("backend.user.settingsDomains",{url:"^/settings/domains",templateUrl:"app/settings/views/settingsDomains.html",controller:"settingsDomainsController",data:{pageTitle:"Domain Settings"}}).state("backend.user.settingsTwoStep",{url:"^/settings/two-step",templateUrl:"app/settings/views/settingsTwoStep.html",controller:"settingsTwoStepController",data:{pageTitle:"Two-step Login"}}).state("backend.user.settingsCreateOrg",{url:"^/settings/create-organization",templateUrl:"app/settings/views/settingsCreateOrganization.html",controller:"settingsCreateOrganizationController",data:{pageTitle:"Create Organization"}}).state("backend.user.settingsBilling",{url:"^/settings/billing",templateUrl:"app/settings/views/settingsBilling.html",controller:"settingsBillingController",data:{pageTitle:"Billing"}}).state("backend.user.settingsPremium",{url:"^/settings/premium",templateUrl:"app/settings/views/settingsPremium.html",controller:"settingsPremiumController",data:{pageTitle:"Go Premium"}}).state("backend.user.tools",{url:"^/tools",templateUrl:"app/tools/views/tools.html",controller:"toolsController",data:{pageTitle:"Tools"}}).state("backend.user.reportsBreach",{url:"^/reports/breach",templateUrl:"app/reports/views/reportsBreach.html",controller:"reportsBreachController",data:{pageTitle:"Data Breach Report"}}).state("backend.user.apps",{url:"^/apps",templateUrl:"app/views/apps.html",controller:"appsController",data:{pageTitle:"Get the Apps"}}).state("backend.org",{templateUrl:"app/views/organizationLayout.html",abstract:!0}).state("backend.org.dashboard",{url:"^/organization/:orgId",templateUrl:"app/organization/views/organizationDashboard.html",controller:"organizationDashboardController",data:{pageTitle:"Organization Dashboard"}}).state("backend.org.people",{url:"/organization/:orgId/people?viewEvents&search",templateUrl:"app/organization/views/organizationPeople.html",controller:"organizationPeopleController",data:{pageTitle:"Organization People"}}).state("backend.org.collections",{url:"/organization/:orgId/collections?search",templateUrl:"app/organization/views/organizationCollections.html",controller:"organizationCollectionsController",data:{pageTitle:"Organization Collections"}}).state("backend.org.settings",{url:"/organization/:orgId/settings",templateUrl:"app/organization/views/organizationSettings.html",controller:"organizationSettingsController",data:{pageTitle:"Organization Settings"}}).state("backend.org.billing",{url:"/organization/:orgId/billing",templateUrl:"app/organization/views/organizationBilling.html",controller:"organizationBillingController",data:{pageTitle:"Organization Billing"}}).state("backend.org.vault",{url:"/organization/:orgId/vault?viewEvents&search",templateUrl:"app/organization/views/organizationVault.html",controller:"organizationVaultController",data:{pageTitle:"Organization Vault"}}).state("backend.org.groups",{url:"/organization/:orgId/groups?search",templateUrl:"app/organization/views/organizationGroups.html",controller:"organizationGroupsController",data:{pageTitle:"Organization Groups"}}).state("backend.org.events",{url:"/organization/:orgId/events",templateUrl:"app/organization/views/organizationEvents.html",controller:"organizationEventsController",data:{pageTitle:"Organization Events"}}).state("frontend",{templateUrl:"app/views/frontendLayout.html",abstract:!0,data:{authorize:!1}}).state("frontend.login",{templateUrl:"app/accounts/views/accountsLogin.html",controller:"accountsLoginController",params:{returnState:null,email:null,premium:null,org:null},data:{bodyClass:"login-page"}}).state("frontend.login.info",{url:"^/?org&premium&email",templateUrl:"app/accounts/views/accountsLoginInfo.html",data:{pageTitle:"Log In"}}).state("frontend.login.twoFactor",{url:"^/two-step?org&premium&email",templateUrl:"app/accounts/views/accountsLoginTwoFactor.html",data:{pageTitle:"Log In (Two-step)"}}).state("frontend.logout",{url:"^/logout",controller:"accountsLogoutController",data:{authorize:!0}}).state("frontend.passwordHint",{url:"^/password-hint",templateUrl:"app/accounts/views/accountsPasswordHint.html",controller:"accountsPasswordHintController",data:{pageTitle:"Master Password Hint",bodyClass:"login-page"}}).state("frontend.recover",{url:"^/recover",templateUrl:"app/accounts/views/accountsRecover.html",controller:"accountsRecoverController",data:{pageTitle:"Recover Account",bodyClass:"login-page"}}).state("frontend.recover-delete",{url:"^/recover-delete",templateUrl:"app/accounts/views/accountsRecoverDelete.html",controller:"accountsRecoverDeleteController",data:{pageTitle:"Delete Account",bodyClass:"login-page"}}).state("frontend.verify-recover-delete",{url:"^/verify-recover-delete?userId&token&email",templateUrl:"app/accounts/views/accountsVerifyRecoverDelete.html",controller:"accountsVerifyRecoverDeleteController",data:{pageTitle:"Confirm Delete Account",bodyClass:"login-page"}}).state("frontend.register",{url:"^/register?org&premium",templateUrl:"app/accounts/views/accountsRegister.html",controller:"accountsRegisterController",params:{returnState:null,email:null,org:null,premium:null},data:{pageTitle:"Register",bodyClass:"register-page"}}).state("frontend.organizationAccept",{url:"^/accept-organization?organizationId&organizationUserId&token&email&organizationName",templateUrl:"app/accounts/views/accountsOrganizationAccept.html",controller:"accountsOrganizationAcceptController",data:{pageTitle:"Accept Organization Invite",bodyClass:"login-page",skipAuthorize:!0}}).state("frontend.verifyEmail",{url:"^/verify-email?userId&token",templateUrl:"app/accounts/views/accountsVerifyEmail.html",controller:"accountsVerifyEmailController",data:{pageTitle:"Verifying Email",bodyClass:"login-page",skipAuthorize:!0}})}]).run(["$rootScope","authService","$state",function(e,t,n){e.$on("$stateChangeSuccess",function(){$("html, body").animate({scrollTop:0},200)}),e.$on("$stateChangeStart",function(o,r,a){if(!r.data||!r.data.authorize){if(r.data&&r.data.skipAuthorize)return;if(!t.isAuthenticated())return;return o.preventDefault(),void n.go("backend.user.vault")}if(!t.isAuthenticated())return o.preventDefault(),t.logOut(),void n.go("frontend.login.info");r.name.indexOf("backend.org.")>-1&&a.orgId&&(e.vaultCiphers=e.vaultGroupings=null,t.getUserProfile().then(function(e){var t=e.organizations;t&&a.orgId in t&&2===t[a.orgId].status&&2!==t[a.orgId].type||(o.preventDefault(),n.go("backend.user.vault"))}))})}]),angular.module("bit").constant("constants",{rememberedEmailCookieName:"bit.rememberedEmail",encType:{AesCbc256_B64:0,AesCbc128_HmacSha256_B64:1,AesCbc256_HmacSha256_B64:2,Rsa2048_OaepSha256_B64:3,Rsa2048_OaepSha1_B64:4,Rsa2048_OaepSha256_HmacSha256_B64:5,Rsa2048_OaepSha1_HmacSha256_B64:6},orgUserType:{owner:0,admin:1,user:2},orgUserStatus:{invited:0,accepted:1,confirmed:2},twoFactorProvider:{u2f:4,yubikey:3,duo:2,authenticator:0,email:1,remember:5},cipherType:{login:1,secureNote:2,card:3,identity:4},fieldType:{text:0,hidden:1,boolean:2},deviceType:{android:0,ios:1,chromeExt:2,firefoxExt:3,operaExt:4,edgeExt:5,windowsDesktop:6,macOsDesktop:7,linuxDesktop:8,chrome:9,firefox:10,opera:11,edge:12,ie:13,unknown:14,uwp:16,safari:17,vivaldi:18,vivaldiExt:19},eventType:{User_LoggedIn:1e3,User_ChangedPassword:1001,User_Enabled2fa:1002,User_Disabled2fa:1003,User_Recovered2fa:1004,User_FailedLogIn:1005,User_FailedLogIn2fa:1006,Cipher_Created:1100,Cipher_Updated:1101,Cipher_Deleted:1102,Cipher_AttachmentCreated:1103,Cipher_AttachmentDeleted:1104,Cipher_Shared:1105,Cipher_UpdatedCollections:1106,Collection_Created:1300,Collection_Updated:1301,Collection_Deleted:1302,Group_Created:1400,Group_Updated:1401,Group_Deleted:1402,OrganizationUser_Invited:1500,OrganizationUser_Confirmed:1501,OrganizationUser_Updated:1502,OrganizationUser_Removed:1503,OrganizationUser_UpdatedGroups:1504,Organization_Updated:1600},twoFactorProviderInfo:[{type:0,name:"Authenticator App",description:"Use an authenticator app (such as Authy or Google Authenticator) to generate time-based verification codes.",enabled:!1,active:!0,free:!0,image:"authapp.png",displayOrder:0,priority:1,requiresUsb:!1},{type:3,name:"YubiKey OTP Security Key",description:"Use a YubiKey to access your account. Works with YubiKey 4, 4 Nano, 4C, and NEO devices.",enabled:!1,active:!0,image:"yubico.png",displayOrder:1,priority:3,requiresUsb:!0},{type:2,name:"Duo",description:"Verify with Duo Security using the Duo Mobile app, SMS, phone call, or U2F security key.",enabled:!1,active:!0,image:"duo.png",displayOrder:2,priority:2,requiresUsb:!1},{type:4,name:"FIDO U2F Security Key",description:"Use any FIDO U2F enabled security key to access your account.",enabled:!1,active:!0,image:"fido.png",displayOrder:3,priority:4,requiresUsb:!0},{type:1,name:"Email",description:"Verification codes will be emailed to you.",enabled:!1,active:!0,free:!0,image:"gmail.png",displayOrder:4,priority:0,requiresUsb:!1}],plans:{free:{basePrice:0,noAdditionalSeats:!0,noPayment:!0,upgradeSortOrder:-1},families:{basePrice:1,annualBasePrice:12,baseSeats:5,noAdditionalSeats:!0,annualPlanType:"familiesAnnually",upgradeSortOrder:1},teams:{basePrice:5,annualBasePrice:60,monthlyBasePrice:8,baseSeats:5,seatPrice:2,annualSeatPrice:24,monthlySeatPrice:2.5,monthPlanType:"teamsMonthly",annualPlanType:"teamsAnnually",upgradeSortOrder:2},enterprise:{seatPrice:3,annualSeatPrice:36,monthlySeatPrice:4,monthPlanType:"enterpriseMonthly",annualPlanType:"enterpriseAnnually",upgradeSortOrder:3}},storageGb:{price:.33,monthlyPrice:.5,yearlyPrice:4},premium:{price:10,yearlyPrice:10}}),angular.module("bit.accounts").controller("accountsLoginController",["$scope","$rootScope","$cookies","apiService","cryptoService","authService","$state","constants","$analytics","$uibModal","$timeout","$window","$filter","toastr",function(e,t,n,o,r,a,i,s,l,c,u,d,p,m){e.state=i,e.twoFactorProviderConstants=s.twoFactorProvider,e.rememberTwoFactor={checked:!1};var g=!0;e.returnState=i.params.returnState,e.stateEmail=i.params.email,!e.returnState&&i.params.org?e.returnState={name:"backend.user.settingsCreateOrg",params:{plan:i.params.org}}:!e.returnState&&i.params.premium&&(e.returnState={name:"backend.user.settingsPremium"}),!(i.current.name.indexOf("twoFactor")>-1)||e.twoFactorProviders&&e.twoFactorProviders.length||i.go("frontend.login.info",{returnState:e.returnState});var f,h,v=n.get(s.rememberedEmailCookieName);function y(){e.returnState?i.go(e.returnState.name,e.returnState.params):i.go("backend.user.vault")}function b(){var t;if(g=!0,e.twoFactorProvider===s.twoFactorProvider.duo)t=e.twoFactorProviders[s.twoFactorProvider.duo],d.Duo.init({host:t.Host,sig_request:t.Signature,submit_callback:function(t){var n=$(t).find('input[name="sig_response"]').val();e.twoFactor(n)}});else if(e.twoFactorProvider===s.twoFactorProvider.u2f){g=!1,t=e.twoFactorProviders[s.twoFactorProvider.u2f],function t(n){if(g)return;if(n.length<1||e.twoFactorProvider!==s.twoFactorProvider.u2f)return;console.log("listening for u2f key...");d.u2f.sign(n[0].appId,n[0].challenge,[{version:n[0].version,keyHandle:n[0].keyHandle}],function(o){if(e.twoFactorProvider===s.twoFactorProvider.u2f)return o.errorCode?(console.log(o.errorCode),void u(function(){t(n)},5===o.errorCode?0:1e3)):void e.twoFactor(JSON.stringify(o))},10)}(JSON.parse(t.Challenges))}else e.twoFactorProvider===s.twoFactorProvider.email&&(t=e.twoFactorProviders[s.twoFactorProvider.email],e.twoFactorEmail=t.Email,Object.keys(e.twoFactorProviders).length>1&&e.sendEmail(!1))}v||e.stateEmail?(e.model={email:e.stateEmail||v,rememberEmail:null!==v},u(function(){$("#masterPassword").focus()})):u(function(){$("#email").focus()}),e.twoFactorProviders=null,e.twoFactorProvider=null,e.login=function(t){e.loginPromise=a.logIn(t.email,t.masterPassword).then(function(o){if(t.rememberEmail){var r=new Date;r.setFullYear(r.getFullYear()+10),n.put(s.rememberedEmailCookieName,t.email,{expires:r})}else n.remove(s.rememberedEmailCookieName);o&&Object.keys(o).length>0?(f=t.email,h=t.masterPassword,e.twoFactorProviders=function(e){if(t=!1,n=navigator.userAgent||navigator.vendor||window.opera,(/(android|bb\d+|meego).+mobile|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series(4|6)0|symbian|treo|up\.(browser|link)|vodafone|wap|windows ce|xda|xiino/i.test(n)||/1207|6310|6590|3gso|4thp|50[1-6]i|770s|802s|a wa|abac|ac(er|oo|s\-)|ai(ko|rn)|al(av|ca|co)|amoi|an(ex|ny|yw)|aptu|ar(ch|go)|as(te|us)|attw|au(di|\-m|r |s )|avan|be(ck|ll|nq)|bi(lb|rd)|bl(ac|az)|br(e|v)w|bumb|bw\-(n|u)|c55\/|capi|ccwa|cdm\-|cell|chtm|cldc|cmd\-|co(mp|nd)|craw|da(it|ll|ng)|dbte|dc\-s|devi|dica|dmob|do(c|p)o|ds(12|\-d)|el(49|ai)|em(l2|ul)|er(ic|k0)|esl8|ez([4-7]0|os|wa|ze)|fetc|fly(\-|_)|g1 u|g560|gene|gf\-5|g\-mo|go(\.w|od)|gr(ad|un)|haie|hcit|hd\-(m|p|t)|hei\-|hi(pt|ta)|hp( i|ip)|hs\-c|ht(c(\-| |_|a|g|p|s|t)|tp)|hu(aw|tc)|i\-(20|go|ma)|i230|iac( |\-|\/)|ibro|idea|ig01|ikom|im1k|inno|ipaq|iris|ja(t|v)a|jbro|jemu|jigs|kddi|keji|kgt( |\/)|klon|kpt |kwc\-|kyo(c|k)|le(no|xi)|lg( g|\/(k|l|u)|50|54|\-[a-w])|libw|lynx|m1\-w|m3ga|m50\/|ma(te|ui|xo)|mc(01|21|ca)|m\-cr|me(rc|ri)|mi(o8|oa|ts)|mmef|mo(01|02|bi|de|do|t(\-| |o|v)|zz)|mt(50|p1|v )|mwbp|mywa|n10[0-2]|n20[2-3]|n30(0|2)|n50(0|2|5)|n7(0(0|1)|10)|ne((c|m)\-|on|tf|wf|wg|wt)|nok(6|i)|nzph|o2im|op(ti|wv)|oran|owg1|p800|pan(a|d|t)|pdxg|pg(13|\-([1-8]|c))|phil|pire|pl(ay|uc)|pn\-2|po(ck|rt|se)|prox|psio|pt\-g|qa\-a|qc(07|12|21|32|60|\-[2-7]|i\-)|qtek|r380|r600|raks|rim9|ro(ve|zo)|s55\/|sa(ge|ma|mm|ms|ny|va)|sc(01|h\-|oo|p\-)|sdk\/|se(c(\-|0|1)|47|mc|nd|ri)|sgh\-|shar|sie(\-|m)|sk\-0|sl(45|id)|sm(al|ar|b3|it|t5)|so(ft|ny)|sp(01|h\-|v\-|v )|sy(01|mb)|t2(18|50)|t6(00|10|18)|ta(gt|lk)|tcl\-|tdg\-|tel(i|m)|tim\-|t\-mo|to(pl|sh)|ts(70|m\-|m3|m5)|tx\-9|up(\.b|g1|si)|utst|v400|v750|veri|vi(rg|te)|vk(40|5[0-3]|\-v)|vm40|voda|vulc|vx(52|53|60|61|70|80|81|83|85|98)|w3c(\-| )|webc|whit|wi(g |nc|nw)|wmlb|wonu|x700|yas\-|your|zeto|zte\-/i.test(n.substr(0,4)))&&(t=!0),!t&&!navigator.userAgent.match(/iPad/i))return e;var t,n;for(var o=Object.keys(e),r=0;ro){if(a[0].type===s.twoFactorProvider.u2f&&!u2f.isSupported)continue;n=a[0].type,o=a[0].priority}}if(null===n)return null;return parseInt(n)}(e.twoFactorProviders),l.eventTrack("Logged In To Two-step"),i.go("frontend.login.twoFactor",{returnState:e.returnState}).then(function(){u(function(){$("#code").focus(),b()})})):(l.eventTrack("Logged In"),y()),t.masterPassword=""})},e.twoFactor=function(t){e.twoFactorProvider!==s.twoFactorProvider.email&&e.twoFactorProvider!==s.twoFactorProvider.authenticator||(t=t.replace(" ","")),e.twoFactorPromise=a.logIn(f,h,t,e.twoFactorProvider,e.rememberTwoFactor.checked||!1),e.twoFactorPromise.then(function(){l.eventTrack("Logged In From Two-step"),y()},function(){e.twoFactorProvider===s.twoFactorProvider.u2f&&b()})},e.anotherMethod=function(){c.open({animation:!0,templateUrl:"app/accounts/views/accountsTwoFactorMethods.html",controller:"accountsTwoFactorMethodsController",resolve:{providers:function(){return e.twoFactorProviders}}}).result.then(function(t){e.twoFactorProvider=t,u(function(){$("#code").focus(),b()})})},e.sendEmail=function(t){if(e.twoFactorProvider===s.twoFactorProvider.email)return r.makeKeyAndHash(f,h).then(function(e){return o.twoFactor.sendEmailLogin({email:f,masterPasswordHash:e.hash}).$promise}).then(function(){t&&m.success("Verification email sent to "+e.twoFactorEmail+".")},function(){m.error("Could not send verification email.")})},e.$on("$destroy",function(){g=!0})}]),angular.module("bit.accounts").controller("accountsLogoutController",["$scope","authService","$state","$analytics",function(e,t,n,o){t.logOut(),o.eventTrack("Logged Out"),n.go("frontend.login.info")}]),angular.module("bit.accounts").controller("accountsOrganizationAcceptController",["$scope","$state","apiService","authService","toastr","$analytics",function(e,t,n,o,r,a){e.state={name:t.current.name,params:t.params},t.params.organizationId&&t.params.organizationUserId&&t.params.token&&t.params.email&&t.params.organizationName?e.$on("$viewContentLoaded",function(){o.isAuthenticated()?(e.accepting=!0,n.organizationUsers.accept({orgId:t.params.organizationId,id:t.params.organizationUserId},{token:t.params.token},function(){a.eventTrack("Accepted Invitation"),t.go("backend.user.vault",null,{location:"replace"}).then(function(){r.success("You can access this organization once an administrator confirms your membership. We'll send an email when that happens.","Invite Accepted",{timeOut:1e4})})},function(){a.eventTrack("Failed To Accept Invitation"),t.go("backend.user.vault",null,{location:"replace"}).then(function(){r.error("Unable to accept invitation.","Error")})})):e.loading=!1}):t.go("frontend.login.info").then(function(){r.error("Invalid parameters.")})}]),angular.module("bit.accounts").controller("accountsPasswordHintController",["$scope","$rootScope","apiService","$analytics",function(e,t,n,o){e.success=!1,e.submit=function(t){e.submitPromise=n.accounts.postPasswordHint({email:t.email},function(){o.eventTrack("Requested Password Hint"),e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRecoverController",["$scope","apiService","cryptoService","$analytics",function(e,t,n,o){e.success=!1,e.submit=function(r){var a=r.email.toLowerCase();e.submitPromise=n.makeKeyAndHash(r.email,r.masterPassword).then(function(e){return t.twoFactor.recover({email:a,masterPasswordHash:e.hash,recoveryCode:r.code.replace(/\s/g,"").toLowerCase()}).$promise}).then(function(){o.eventTrack("Recovered 2FA"),e.success=!0})}}]),angular.module("bit.accounts").controller("accountsRecoverDeleteController",["$scope","$rootScope","apiService","$analytics",function(e,t,n,o){e.success=!1,e.submit=function(t){e.submitPromise=n.accounts.postDeleteRecover({email:t.email},function(){o.eventTrack("Started Delete Recovery"),e.success=!0}).$promise}}]),angular.module("bit.accounts").controller("accountsRegisterController",["$scope","$location","apiService","cryptoService","validationService","$analytics","$state","$timeout",function(e,t,n,o,r,a,i,s){var l=t.search(),c=i.params;e.createOrg=c.org,!c.returnState&&c.org?e.returnState={name:"backend.user.settingsCreateOrg",params:{plan:i.params.org}}:!c.returnState&&c.premium?e.returnState={name:"backend.user.settingsPremium",params:{plan:i.params.org}}:e.returnState=c.returnState,e.success=!1,e.model={email:l.email?l.email:c.email},e.readOnlyEmail=null!==c.email,s(function(){e.model.email?$("#name").focus():$("#email").focus()}),e.registerPromise=null,e.register=function(t){var i=!1;if(e.model.masterPassword.length<8&&(r.addError(t,"MasterPassword","Master password must be at least 8 characters long.",!0),i=!0),e.model.masterPassword!==e.model.confirmMasterPassword&&(r.addError(t,"ConfirmMasterPassword","Master password confirmation does not match.",!0),i=!0),!i){var s,l,c=e.model.email.toLowerCase();e.registerPromise=o.makeKeyAndHash(c,e.model.masterPassword).then(function(e){return s=e,l=o.makeEncKey(e.key),o.makeKeyPair(l.encKey)}).then(function(t){var o={name:e.model.name,email:c,masterPasswordHash:s.hash,masterPasswordHint:e.model.masterPasswordHint,key:l.encKeyEnc,keys:{publicKey:t.publicKey,encryptedPrivateKey:t.privateKeyEnc}};return n.accounts.register(o).$promise},function(e){return r.addError(t,null,"Problem generating keys.",!0),!1}).then(function(t){!1!==t&&(e.success=!0,a.eventTrack("Registered"))})}}}]),angular.module("bit.accounts").controller("accountsTwoFactorMethodsController",["$scope","$uibModalInstance","$analytics","providers","constants",function(e,t,n,o,r){function a(t){for(var n=0;n1&&(n=function(e,t){var n=e.split(" ");if(n&&n.length>1){for(var o="",r=0;r').attr({y:"50%",x:"50%",dy:"0.35em","pointer-events":"auto",fill:i,"font-family":s}).text(a).css({"font-weight":l,"font-size":c+"px"})),g=o.bgColor?o.bgColor:function(e){var t=0,n=0;for(n=0;n>8*n&255).toString(16)).substr(-2);return o}(r),f=(u=o.width,d=o.height,p=g,angular.element("").attr({xmlns:"http://www.w3.org/2000/svg","pointer-events":"none",width:u,height:d}).css({"background-color":p,width:u+"px",height:d+"px"}));f.append(m);var h=angular.element("

'+new Date+"

"),t.print(),t.close()}},e.close=function(){n.close()}}]),angular.module("bit.settings").controller("settingsTwoStepU2fController",["$scope","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics","constants","$timeout","$window",function(e,t,n,o,r,a,i,s,l,c){var u;i.eventTrack("settingsTwoStepU2fController",{category:"Modal"});var d=!1;e.deviceResponse=null,e.deviceListening=!1,e.deviceError=!1,l(function(){$("#masterPassword").focus()}),e.auth=function(n){e.authPromise=o.hashPassword(n.masterPassword).then(function(e){return u=e,t.twoFactor.getU2f({},{masterPasswordHash:u}).$promise}).then(function(t){return e.enabled=t.Enabled,e.challenge=t.Challenge,e.authed=!0,e.readDevice()})},e.readDevice=function(){d||e.enabled||(console.log("listening for key..."),e.deviceResponse=null,e.deviceError=!1,e.deviceListening=!0,c.u2f.register(e.challenge.AppId,[{version:e.challenge.Version,challenge:e.challenge.Challenge}],[],function(t){if(e.deviceListening=!1,5!==t.errorCode)return t.errorCode?(l(function(){e.deviceError=!0}),void console.log("error: "+t.errorCode)):void l(function(){e.deviceResponse=JSON.stringify(t)});e.readDevice()},10))},e.submit=function(){e.enabled?function(){if(!confirm("Are you sure you want to disable the U2F provider?"))return;e.submitPromise=t.twoFactor.disable({},{masterPasswordHash:u,type:s.twoFactorProvider.u2f},function(t){i.eventTrack("Disabled Two-step U2F"),a.success("U2F has been disabled."),e.enabled=t.Enabled,e.close()}).$promise}():e.submitPromise=t.twoFactor.putU2f({},{deviceResponse:e.deviceResponse,masterPasswordHash:u},function(t){i.eventTrack("Enabled Two-step U2F"),e.enabled=t.Enabled,e.challenge=null,e.deviceResponse=null,e.deviceError=!1}).$promise},e.close=function(){d=!0,n.close(e.enabled)},e.$on("modal.closing",function(t,n,o){d||(t.preventDefault(),e.close())})}]),angular.module("bit.settings").controller("settingsTwoStepYubiController",["$scope","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics","constants","$timeout",function(e,t,n,o,r,a,i,s,l){i.eventTrack("settingsTwoStepYubiController",{category:"Modal"});var c;function u(t){e.enabled=t.Enabled,e.updateModel={key1:{key:t.Key1,existingKey:d(t.Key1,"*",44)},key2:{key:t.Key2,existingKey:d(t.Key2,"*",44)},key3:{key:t.Key3,existingKey:d(t.Key3,"*",44)},nfc:!0===t.Nfc||!t.Enabled}}function d(e,t,n){if(!e||!t||e.length>=n)return e;for(var o=(n-e.length)/t.length,r=0;r=t?e:new Array(t-e.length+1).join(n)+e}i.eventTrack("toolsExportController",{category:"Modal"}),e.export=function(n){e.startedExport=!0;var c=[],u=[],d=t.folders.list({},function(e){u=o.decryptFolders(e.Data)}).$promise,p=t.ciphers.list({},function(e){c=o.decryptCiphers(e.Data)}).$promise;r.all([d,p]).then(function(){if(!c.length)return a.error("Nothing to export.","Error!"),void e.close();for(var t={},n=0;n "Export".')},{id:"lastpass",name:"LastPass (csv)",featured:!0,sort:2,instructions:c.trustAsHtml('See detailed instructions on our help site at https://help.bitwarden.com/article/import-from-lastpass/')},{id:"chromecsv",name:"Chrome (csv)",featured:!0,sort:3,instructions:c.trustAsHtml('See detailed instructions on our help site at https://help.bitwarden.com/article/import-from-chrome/')},{id:"firefoxpasswordexportercsvxml",name:"Firefox Password Exporter (xml)",featured:!0,sort:4,instructions:c.trustAsHtml('Use the Password Exporter addon for FireFox to export your passwords to a XML file. After installing the addon, type about:addons in your FireFox navigation bar. Locate the Password Exporter addon and click the "Options" button. In the dialog that pops up, click the "Export Passwords" button to save the XML file.')},{id:"keepass2xml",name:"KeePass 2 (xml)",featured:!0,sort:5,instructions:c.trustAsHtml('Using the KeePass 2 desktop application, navigate to "File" > "Export" and select the KeePass XML (2.x) option.')},{id:"keepassxcsv",name:"KeePassX (csv)",instructions:c.trustAsHtml('Using the KeePassX desktop application, navigate to "Database" > "Export to CSV file" and save the CSV file.')},{id:"dashlanecsv",name:"Dashlane (csv)",featured:!0,sort:7,instructions:c.trustAsHtml('Using the Dashlane desktop application, navigate to "File" > "Export" > "Unsecured archive (readable) in CSV format" and save the CSV file.')},{id:"1password1pif",name:"1Password (1pif)",featured:!0,sort:6,instructions:c.trustAsHtml('See detailed instructions on our help site at https://help.bitwarden.com/article/import-from-1password/')},{id:"1password6wincsv",name:"1Password 6 Windows (csv)",instructions:c.trustAsHtml('See detailed instructions on our help site at https://help.bitwarden.com/article/import-from-1password/')},{id:"roboformhtml",name:"RoboForm (html)",instructions:c.trustAsHtml('Using the RoboForm Editor desktop application, navigate to "RoboForm" (top left) > "Print List" > "Logins". When the following print dialog pops up click on the "Save" button and save the HTML file.')},{id:"keepercsv",name:"Keeper (csv)",instructions:c.trustAsHtml('Log into the Keeper web vault (keepersecurity.com/vault). Navigate to "Backup" (top right) and find the "Export to Text File" option. Click "Export Now" to save the TXT/CSV file.')},{id:"enpasscsv",name:"Enpass (csv)",instructions:c.trustAsHtml('Using the Enpass desktop application, navigate to "File" > "Export" > "As CSV". Select "Yes" to the warning alert and save the CSV file. Note that the importer only fully supports files exported while Enpass is set to the English language, so adjust your settings accordingly.')},{id:"safeincloudxml",name:"SafeInCloud (xml)",instructions:c.trustAsHtml('Using the SaveInCloud desktop application, navigate to "File" > "Export" > "As XML" and save the XML file.')},{id:"pwsafexml",name:"Password Safe (xml)",instructions:c.trustAsHtml('Using the Password Safe desktop application, navigate to "File" > "Export To" > "XML format..." and save the XML file.')},{id:"stickypasswordxml",name:"Sticky Password (xml)",instructions:c.trustAsHtml('Using the Sticky Password desktop application, navigate to "Menu" (top right) > "Export" > "Export all". Select the unencrypted format XML option and then the "Save to file" button. Save the XML file.')},{id:"msecurecsv",name:"mSecure (csv)",instructions:c.trustAsHtml('Using the mSecure desktop application, navigate to "File" > "Export" > "CSV File..." and save the CSV file.')},{id:"truekeycsv",name:"True Key (csv)",instructions:c.trustAsHtml('Using the True Key desktop application, click the gear icon (top right) and then navigate to "App Settings". Click the "Export" button, enter your password and save the CSV file.')},{id:"passwordbossjson",name:"Password Boss (json)",instructions:c.trustAsHtml('Using the Password Boss desktop application, navigate to "File" > "Export data" > "Password Boss JSON - not encrypted" and save the JSON file.')},{id:"zohovaultcsv",name:"Zoho Vault (csv)",instructions:c.trustAsHtml('Log into the Zoho web vault (vault.zoho.com). Navigate to "Tools" > "Export Secrets". Select "All Secrets" and click the "Zoho Vault Format CSV" button. Highlight and copy the data from the textarea. Open a text editor like Notepad and paste the data. Save the data from the text editor as zoho_export.csv.')},{id:"splashidcsv",name:"SplashID (csv)",instructions:c.trustAsHtml('Using the SplashID Safe desktop application, click on the SplashID blue lock logo in the top right corner. Navigate to "Export" > "Export as CSV" and save the CSV file.')},{id:"passworddragonxml",name:"Password Dragon (xml)",instructions:c.trustAsHtml('Using the Password Dragon desktop application, navigate to "File" > "Export" > "To XML". In the dialog that pops up select "All Rows" and check all fields. Click the "Export" button and save the XML file.')},{id:"padlockcsv",name:"Padlock (csv)",instructions:c.trustAsHtml('Using the Padlock desktop application, click the hamburger icon in the top left corner and navigate to "Settings". Click the "Export Data" option. Ensure that the "CSV" option is selected from the dropdown. Highlight and copy the data from the textarea. Open a text editor like Notepad and paste the data. Save the data from the text editor as padlock_export.csv.')},{id:"clipperzhtml",name:"Clipperz (html)",instructions:c.trustAsHtml('Log into the Clipperz web application (clipperz.is/app). Click the hamburger menu icon in the top right to expand the navigation bar. Navigate to "Data" > "Export". Click the "download HTML+JSON" button to save the HTML file.')},{id:"avirajson",name:"Avira (json)",instructions:c.trustAsHtml('Using the Avira browser extension, click your username in the top right corner and navigate to "Settings". Locate the "Export Data" section and click "Export". In the dialog that pops up, click the "Export Password Manager Data" button to save the TXT/JSON file.')},{id:"saferpasscsv",name:"SaferPass (csv)",instructions:c.trustAsHtml('Using the SaferPass browser extension, click the hamburger icon in the top left corner and navigate to "Settings". Click the "Export accounts" button to save the CSV file.')},{id:"upmcsv",name:"Universal Password Manager (csv)",instructions:c.trustAsHtml('Using the Universal Password Manager desktop application, navigate to "Database" > "Export" and save the CSV file.')},{id:"ascendocsv",name:"Ascendo DataVault (csv)",instructions:c.trustAsHtml('Using the Ascendo DataVault desktop application, navigate to "Tools" > "Export". In the dialog that pops up, select the "All Items (DVX, CSV)" option. Click the "Ok" button to save the CSV file.')},{id:"meldiumcsv",name:"Meldium (csv)",instructions:c.trustAsHtml('Using the Meldium web vault, navigate to "Settings". Locate the "Export data" function and click "Show me my data" to save the CSV file.')},{id:"passkeepcsv",name:"PassKeep (csv)",instructions:c.trustAsHtml('Using the PassKeep mobile app, navigate to "Backup/Restore". Locate the "CSV Backup/Restore" section and click "Backup to CSV" to save the CSV file.')},{id:"operacsv",name:"Opera (csv)",instructions:c.trustAsHtml('The process for importing from Opera is exactly the same as importing from Google Chrome. See detailed instructions on our help site at https://help.bitwarden.com/article/import-from-chrome/')},{id:"vivaldicsv",name:"Vivaldi (csv)",instructions:c.trustAsHtml('The process for importing from Vivaldi is exactly the same as importing from Google Chrome. See detailed instructions on our help site at https://help.bitwarden.com/article/import-from-chrome/')},{id:"gnomejson",name:"GNOME Passwords and Keys/Seahorse (json)",instructions:c.trustAsHtml('Make sure you have python-keyring and python-gnomekeyring installed. Save the GNOME Keyring Import/Export python script by Luke Plant to your desktop as pw_helper.py. Open terminal and run chmod +rx Desktop/pw_helper.py and then python Desktop/pw_helper.py export Desktop/my_passwords.json. Then upload the resulting my_passwords.json file here to bitwarden.')}],e.setSource=function(){for(var t=0;t-1&&e.cipher.fields.splice(n,1)},e.toggleFavorite=function(){e.cipher.favorite=!e.cipher.favorite},e.clipboardSuccess=function(e){e.clearSelection(),g(e)},e.clipboardError=function(e,t){t&&g(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.folderSort=function(e){return e.id?e.name.toLowerCase():"î º"},e.close=function(){n.dismiss("close")},e.showUpgrade=function(){d.open({animation:!0,templateUrl:"app/views/premiumRequired.html",controller:"premiumRequiredController"})}}]),angular.module("bit.vault").controller("vaultAddFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","$analytics",function(e,t,n,o,r,a){a.eventTrack("vaultAddFolderController",{category:"Modal"}),e.savePromise=null,e.save=function(o){var i=r.encryptFolder(o);e.savePromise=t.folders.post(i,function(e){a.eventTrack("Created Folder");var t=r.decryptFolder(e);n.close(t)}).$promise},e.close=function(){n.dismiss("close")}}]),angular.module("bit.vault").controller("vaultAttachmentsController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","cipherId","$analytics","validationService","toastr","$timeout","authService","$uibModal",function(e,t,n,o,r,a,i,s,l,c,u,d){i.eventTrack("vaultAttachmentsController",{category:"Modal"}),e.cipher={},e.readOnly=!0,e.loading=!0,e.isPremium=!0,e.canUseAttachments=!0;var p=!1;function m(){return e.cipher.organizationId?o.getOrgKey(e.cipher.organizationId):null}u.getUserProfile().then(function(n){return e.isPremium=n.premium,t.ciphers.get({id:a}).$promise}).then(function(t){e.cipher=r.decryptCipher(t),e.readOnly=!e.cipher.edit,e.canUseAttachments=e.isPremium||e.cipher.organizationId,e.loading=!1},function(){e.loading=!1}),e.save=function(n){var o=document.getElementById("file"),c=o.files;c&&c.length?e.savePromise=r.encryptAttachmentFile(m(),c[0]).then(function(e){var n=new FormData,o=new Blob([e.data],{type:"application/octet-stream"});return n.append("data",o,e.fileName),t.ciphers.postAttachment({id:a},n).$promise}).then(function(t){i.eventTrack("Added Attachment"),e.cipher=r.decryptCipher(t),o.type="",o.type="file",o.value=""},function(e){var t=s.parseErrors(e);l.error(t.length?t[0]:"An error occurred.")}):s.addError(n,"file","Select a file.",!0)},e.download=function(t){if(t.loading=!0,!e.canUseAttachments)return t.loading=!1,void alert("Premium membership is required to use this feature.");r.downloadAndDecryptAttachment(m(),t,!0).then(function(e){c(function(){t.loading=!1})},function(){c(function(){t.loading=!1})})},e.remove=function(n){confirm("Are you sure you want to delete this attachment ("+n.fileName+")?")&&(n.loading=!0,t.ciphers.delAttachment({id:a,attachmentId:n.id}).$promise.then(function(){n.loading=!1,i.eventTrack("Deleted Attachment");var t=e.cipher.attachments.indexOf(n);t>-1&&e.cipher.attachments.splice(t,1)},function(){l.error("Cannot delete attachment."),n.loading=!1}))},e.close=function(){n.dismiss("cancel")},e.$on("modal.closing",function(t,o,r){p||(t.preventDefault(),p=!0,n.close(!!e.cipher.attachments&&e.cipher.attachments.length>0))}),e.showUpgrade=function(){d.open({animation:!0,templateUrl:"app/views/premiumRequired.html",controller:"premiumRequiredController"})}}]),angular.module("bit.vault").controller("vaultCipherCollectionsController",["$scope","apiService","$uibModalInstance","cipherService","cipherId","$analytics",function(e,t,n,o,r,a){a.eventTrack("vaultCipherCollectionsController",{category:"Modal"}),e.cipher={},e.readOnly=!1,e.loadingCipher=!0,e.loadingCollections=!0,e.selectedCollections={},e.collections=[];var i=null;n.opened.then(function(){t.ciphers.getDetails({id:r}).$promise.then(function(t){if(e.loadingCipher=!1,e.readOnly=!t.Edit,t.Edit&&t.OrganizationId){1===t.Type&&(e.cipher=o.decryptCipherPreview(t));var n={};if(t.CollectionIds)for(var r=0;r-1&&(t.sort=n)})}),d.vaultCiphers=e.ciphers=o("orderBy")(t,["sort","name","subTitle"]);var n=function(e,t){var n=[],o=0,r=e.length;for(;o0){e.ciphers=n[0];var r=200;angular.forEach(n,function(t,n){n>0&&u(function(){Array.prototype.push.apply(e.ciphers,t)},r+=200)})}}function y(){d.vaultCiphers=e.ciphers=o("orderBy")(d.vaultCiphers,["name","subTitle"])}function b(e){return e.id?e.name.toLowerCase():"î º"}function w(e,t,n){return n.indexOf(e)===t}function C(){return $('input[name="cipherSelection"]:checked').map(function(){return $(this).val()}).get().filter(w)}function S(e){$('input[name="cipherSelection"]').prop("checked",e)}function k(t){var n=d.vaultCiphers.indexOf(t);n>-1&&d.vaultCiphers.splice(n,1),(n=e.ciphers.indexOf(t))>-1&&e.ciphers.splice(n,1)}e.loading=!0,e.ciphers=[],e.folderCount=0,e.collectionCount=0,e.firstCollectionId=null,e.constants=g,e.favoriteCollapsed=c.collapsedFolders&&"favorite"in c.collapsedFolders,e.groupingIdFilter=void 0,e.typeFilter=void 0,p.params.refreshFromServer&&(d.vaultGroupings=d.vaultCiphers=null),e.$on("$viewContentLoaded",function(){if($("#search").focus(),d.vaultGroupings&&d.vaultCiphers)return e.loading=!1,h(d.vaultGroupings),void v(d.vaultCiphers);var t,o,r,a,i;t=[{id:null,name:"No Folder",folder:!0}],o=n.collections.listMe({writeOnly:!1},function(e){for(var n=0;n-1&&(d.vaultCiphers[o]=t.data),y()}else"partialEdit"===t.action?(n.folderId=t.data.folderId,n.favorite=t.data.favorite):"delete"===t.action&&k(n)})},e.$on("vaultAddCipher",function(t,n){e.addCipher()}),e.addCipher=function(e,n){t.open({animation:!0,templateUrl:"app/vault/views/vaultAddCipher.html",controller:"vaultAddCipherController",resolve:{selectedFolder:function(){return e&&e.folder?e:null},checkedFavorite:function(){return n}}}).result.then(function(e){d.vaultCiphers.push(e),y()})},e.deleteCipher=function(e){confirm("Are you sure you want to delete this item ("+e.name+")?")&&n.ciphers.del({id:e.id},function(){m.eventTrack("Deleted Item"),k(e)})},e.attachments=function(e){a.getUserProfile().then(function(t){return{isPremium:t.premium,orgUseStorage:e.organizationId&&!!t.organizations[e.organizationId].maxStorageGb}}).then(function(n){if(!e.hasAttachments){if(e.organizationId&&!n.orgUseStorage)return void t.open({animation:!0,templateUrl:"app/views/paidOrgRequired.html",controller:"paidOrgRequiredController",resolve:{orgId:function(){return e.organizationId}}});if(!e.organizationId&&!n.isPremium)return void t.open({animation:!0,templateUrl:"app/views/premiumRequired.html",controller:"premiumRequiredController"})}e.organizationId||r.getEncKey()?t.open({animation:!0,templateUrl:"app/vault/views/vaultAttachments.html",controller:"vaultAttachmentsController",resolve:{cipherId:function(){return e.id}}}).result.then(function(t){e.hasAttachments=t}):i.error("You cannot use this feature until you update your encryption key.","Feature Unavailable")})},e.editFolder=function(e){t.open({animation:!0,templateUrl:"app/vault/views/vaultEditFolder.html",controller:"vaultEditFolderController",size:"sm",resolve:{folderId:function(){return e.id}}}).result.then(function(t){e.name=t.name})},e.$on("vaultAddFolder",function(t,n){e.addFolder()}),e.addFolder=function(){t.open({animation:!0,templateUrl:"app/vault/views/vaultAddFolder.html",controller:"vaultAddFolderController",size:"sm"}).result.then(function(e){e.folder=!0,d.vaultGroupings.push(e),h(d.vaultGroupings)})},e.deleteFolder=function(t){confirm("Are you sure you want to delete this folder ("+t.name+")?")&&n.folders.del({id:t.id},function(){m.eventTrack("Deleted Folder");var n=d.vaultGroupings.indexOf(t);n>-1&&(d.vaultGroupings.splice(n,1),e.folderCount--)})},e.canDeleteFolder=function(e){if(!e||!e.id||!d.vaultCiphers)return!1;var t=o("filter")(d.vaultCiphers,{folderId:e.id});return t&&0===t.length},e.share=function(e){t.open({animation:!0,templateUrl:"app/vault/views/vaultShareCipher.html",controller:"vaultShareCipherController",resolve:{cipherId:function(){return e.id}}}).result.then(function(t){e.organizationId=t})},e.editCollections=function(e){t.open({animation:!0,templateUrl:"app/vault/views/vaultCipherCollections.html",controller:"vaultCipherCollectionsController",resolve:{cipherId:function(){return e.id}}}).result.then(function(t){t.collectionIds&&!t.collectionIds.length?k(e):t.collectionIds&&(e.collectionIds=t.collectionIds)})},e.filterGrouping=function(t){e.groupingIdFilter=t.id,$.AdminLTE&&$.AdminLTE.layout&&u(function(){$.AdminLTE.layout.fix()},0)},e.filterType=function(t){e.typeFilter=t,$.AdminLTE&&$.AdminLTE.layout&&u(function(){$.AdminLTE.layout.fix()},0)},e.clearFilters=function(){e.groupingIdFilter=void 0,e.typeFilter=void 0,$.AdminLTE&&$.AdminLTE.layout&&u(function(){$.AdminLTE.layout.fix()},0)},e.groupingFilter=function(t){return void 0===e.groupingIdFilter||t.id===e.groupingIdFilter},e.cipherFilter=function(t){return function(n){var o=null===t;return!o&&t.folder&&n.folderId===t.id?o=!0:!o&&t.collection&&n.collectionIds.indexOf(t.id)>-1&&(o=!0),o&&(void 0===e.typeFilter||n.type===e.typeFilter)}},e.unselectAll=function(){S(!1)},e.selectFolder=function(e,t){$(t.currentTarget).closest(".box").find('input[name="cipherSelection"]').prop("checked",!0)},e.select=function(e){var t=$(e.currentTarget).closest("tr").find('input[name="cipherSelection"]');t.prop("checked",!t.prop("checked"))},e.bulkMove=function(){var e=C();0!==e.length?t.open({animation:!0,templateUrl:"app/vault/views/vaultMoveCiphers.html",controller:"vaultMoveCiphersController",size:"sm",resolve:{ids:function(){return e}}}).result.then(function(t){for(var n=0;n-1&&e.cipher.fields.splice(n,1)},e.toggleFavorite=function(){e.cipher.favorite=!e.cipher.favorite},e.clipboardSuccess=function(e){e.clearSelection(),m(e)},e.clipboardError=function(e,t){t&&m(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.folderSort=function(e){return e.id?e.name.toLowerCase():"î º"},e.delete=function(){confirm("Are you sure you want to delete this item ("+e.cipher.name+")?")&&t.ciphers.del({id:e.cipher.id},function(){s.eventTrack("Deleted Cipher From Edit"),n.close({action:"delete",data:e.cipher.id})})},e.close=function(){n.dismiss("cancel")},e.showUpgrade=function(){u.open({animation:!0,templateUrl:"app/views/premiumRequired.html",controller:"premiumRequiredController"})}}]),angular.module("bit.vault").controller("vaultEditFolderController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","folderId","$analytics",function(e,t,n,o,r,a,i){i.eventTrack("vaultEditFolderController",{category:"Modal"}),e.folder={},t.folders.get({id:a},function(t){e.folder=r.decryptFolder(t)}),e.savePromise=null,e.save=function(o){var s=r.encryptFolder(o);e.savePromise=t.folders.put({id:a},s,function(e){i.eventTrack("Edited Folder");var t=r.decryptFolder(e);n.close(t)}).$promise},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultMoveCiphersController",["$scope","apiService","$uibModalInstance","ids","$analytics","$rootScope","$filter",function(e,t,n,o,r,a,i){r.eventTrack("vaultMoveCiphersController",{category:"Modal"}),e.folders=i("filter")(a.vaultGroupings,{folder:!0}),e.count=o.length,e.save=function(){e.savePromise=t.ciphers.moveMany({ids:o,folderId:e.folderId},function(){r.eventTrack("Bulk Moved Ciphers"),n.close(e.folderId||null)}).$promise},e.folderSort=function(e){return e.id?e.name.toLowerCase():"!"},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.vault").controller("vaultShareCipherController",["$scope","apiService","$uibModalInstance","authService","cipherService","cipherId","$analytics","$state","cryptoService","$q","toastr",function(e,t,n,o,r,a,i,s,l,c,u){i.eventTrack("vaultShareCipherController",{category:"Modal"}),e.model={},e.cipher={},e.collections=[],e.selectedCollections={},e.organizations=[];var d={};e.loadingCollections=!0,e.loading=!0,e.readOnly=!1,t.ciphers.get({id:a}).$promise.then(function(t){return e.readOnly=!t.Edit,t.Edit&&(e.cipher=r.decryptCipher(t)),t.Edit}).then(function(t){if(e.loading=!1,t)return o.getUserProfile()}).then(function(n){if(n&&n.organizations){var o=[],a=!1;for(var i in n.organizations)n.organizations.hasOwnProperty(i)&&n.organizations[i].enabled&&(o.push({id:n.organizations[i].id,name:n.organizations[i].name}),d[n.organizations[i].id]=0,a||(a=!0,e.model.organizationId=n.organizations[i].id));e.organizations=o,t.collections.listMe({writeOnly:!0},function(t){for(var n=[],o=0;o-1},o.getChromeRuntimePort_=function(e){var t=chrome.runtime.connect(o.EXTENSION_ID,{includeTlsChannelId:!0});setTimeout(function(){e(new o.WrappedChromeRuntimePort_(t))},0)},o.getAuthenticatorPort_=function(e){setTimeout(function(){e(new o.WrappedAuthenticatorPort_)},0)},o.getIosPort_=function(e){setTimeout(function(){e(new o.WrappedIosPort_)},0)},o.WrappedChromeRuntimePort_=function(e){this.port_=e},o.formatSignRequest_=function(e,t,r,a,s){if(void 0===n||n<1.1){for(var i=[],p=0;p>3)),u,m,v);if(s&&"generateKey"===e&&"RSASSA-PKCS1-v1_5"===u.name&&(!u.modulusLength||u.modulusLength>=2048))return(o=d(o)).name="RSAES-PKCS1-v1_5",delete o.hash,r.generateKey(o,!0,["encrypt","decrypt"]).then(function(e){return Promise.all([r.exportKey("jwk",e.publicKey),r.exportKey("jwk",e.privateKey)])}).then(function(e){return e[0].alg=e[1].alg=y(u),e[0].key_ops=v.filter(E),e[1].key_ops=v.filter(A),Promise.all([r.importKey("jwk",e[0],u,!0,e[0].key_ops),r.importKey("jwk",e[1],u,m,e[1].key_ops)])}).then(function(e){return{publicKey:e[0],privateKey:e[1]}});if((s||a&&"SHA-1"===(u.hash||{}).name)&&"importKey"===e&&"jwk"===o&&"HMAC"===u.name&&"oct"===i.kty)return r.importKey("raw",f(l(i.k)),p,b[3],b[4]);if(s&&"importKey"===e&&("spki"===o||"pkcs8"===o))return r.importKey("jwk",function(e){var t=_(e),r=!1;t.length>2&&(r=!0,t.shift());var n={ext:!0};switch(t[0][0]){case"1.2.840.113549.1.1.1":var o=["n","e","d","p","q","dp","dq","qi"],a=_(t[1]);r&&a.shift();for(var s=0;s2&&(n=!0,a.unshift(new Uint8Array([0]))),r[0][0]="1.2.840.113549.1.1.1",t=a;break;default:throw new TypeError("Unsupported key type")}return r.push(new Uint8Array(m(t)).buffer),n?r.unshift(new Uint8Array([0])):r[1]={tag:3,value:r[1]},new Uint8Array(m(r)).buffer}(h(e))})),p}}),["encrypt","decrypt","sign","verify"].forEach(function(e){var t=r[e];r[e]=function(n,o,s,i){if(a&&(!s.byteLength||i&&!i.byteLength))throw new Error("Empy input is not allowed");var p,u=[].slice.call(arguments),c=d(n);if(a&&"decrypt"===e&&"AES-GCM"===c.name){var l=n.tagLength>>3;u[2]=(s.buffer||s).slice(0,s.byteLength-l),n.tag=(s.buffer||s).slice(s.byteLength-l)}u[1]=o._key;try{p=t.apply(r,u)}catch(e){return Promise.reject(e)}return a&&(p=new Promise(function(t,r){p.onabort=p.onerror=function(e){r(e)},p.oncomplete=function(r){r=r.target.result;if("encrypt"===e&&r instanceof AesGcmEncryptResult){var n=r.ciphertext,o=r.tag;(r=new Uint8Array(n.byteLength+o.byteLength)).set(new Uint8Array(n),0),r.set(new Uint8Array(o),n.byteLength),r=r.buffer}t(r)}})),p}}),a){var u=r.digest;r.digest=function(e,t){if(!t.byteLength)throw new Error("Empy input is not allowed");var n;try{n=u.call(r,e,t)}catch(e){return Promise.reject(e)}return n=new Promise(function(e,t){n.onabort=n.onerror=function(e){t(e)},n.oncomplete=function(t){e(t.target.result)}})},e.crypto=Object.create(t,{getRandomValues:{value:function(e){return t.getRandomValues(e)}},subtle:{value:r}}),e.CryptoKey=S}s&&(t.subtle=r,e.Crypto=n,e.SubtleCrypto=o,e.CryptoKey=S)}}}function c(e){return btoa(e).replace(/\=+$/,"").replace(/\+/g,"-").replace(/\//g,"_")}function l(e){return e=(e+="===").slice(0,-e.length%4),atob(e.replace(/-/g,"+").replace(/_/g,"/"))}function f(e){for(var t=new Uint8Array(e.length),r=0;re.length)throw new RangeError("Malformed DER");var r,n=e[t.pos++],o=e[t.pos++];if(o>=128){if(o&=127,t.end-t.pos=128){var i=n;n=4;for(t.splice(o,0,i>>24&255,i>>16&255,i>>8&255,255&i);n>1&&!(i>>24);)i<<=8,n--;n<4&&t.splice(o,4-n),n|=128}return t.splice(o-2,2,r,n),t}function S(e,t,r,n){Object.defineProperties(this,{_key:{value:e},type:{value:e.type,enumerable:!0},extractable:{value:void 0===r?e.extractable:r,enumerable:!0},algorithm:{value:void 0===t?e.algorithm:t,enumerable:!0},usages:{value:void 0===n?e.usages:n,enumerable:!0}})}function E(e){return"verify"===e||"encrypt"===e||"wrapKey"===e}function A(e){return"sign"===e||"decrypt"===e||"unwrapKey"===e}}("undefined"==typeof window?"undefined"==typeof self?this:self:window); \ No newline at end of file diff --git a/web-vault/js/duo-connector.js b/web-vault/js/duo-connector.js new file mode 100644 index 00000000..8cebaf9a --- /dev/null +++ b/web-vault/js/duo-connector.js @@ -0,0 +1,40 @@ +!(function () { + var frameElement = document.createElement('iframe'); + frameElement.setAttribute('id', 'duo_iframe'); + setFrameHeight(); + document.body.appendChild(frameElement); + + var hostParam = getQsParam('host'); + var requestParam = getQsParam('request'); + Duo.init({ + host: hostParam, + sig_request: requestParam, + submit_callback: function (form) { + invokeCSCode(form.elements.sig_response.value); + } + }); + + window.onresize = setFrameHeight; + function setFrameHeight() { + frameElement.style.height = window.innerHeight + 'px'; + } +})(); + +function getQsParam(name) { + var url = window.location.href; + name = name.replace(/[\[\]]/g, '\\$&'); + var regex = new RegExp('[?&]' + name + '(=([^&#]*)|&|#|$)'), + results = regex.exec(url); + if (!results) return null; + if (!results[2]) return ''; + return decodeURIComponent(results[2].replace(/\+/g, ' ')); +} + +function invokeCSCode(data) { + try { + invokeCSharpAction(data); + } + catch (err) { + + } +} diff --git a/web-vault/js/duo.js b/web-vault/js/duo.js new file mode 100644 index 00000000..bb0f58a7 --- /dev/null +++ b/web-vault/js/duo.js @@ -0,0 +1,430 @@ +/** + * Duo Web SDK v2 + * Copyright 2017, Duo Security + */ + +(function (root, factory) { + /*eslint-disable */ + if (typeof define === 'function' && define.amd) { + // AMD. Register as an anonymous module. + define([], factory); + /*eslint-enable */ + } else if (typeof module === 'object' && module.exports) { + // Node. Does not work with strict CommonJS, but + // only CommonJS-like environments that support module.exports, + // like Node. + module.exports = factory(); + } else { + // Browser globals (root is window) + var Duo = factory(); + // If the Javascript was loaded via a script tag, attempt to autoload + // the frame. + Duo._onReady(Duo.init); + + // Attach Duo to the `window` object + root.Duo = Duo; + } +}(this, function() { + var DUO_MESSAGE_FORMAT = /^(?:AUTH|ENROLL)+\|[A-Za-z0-9\+\/=]+\|[A-Za-z0-9\+\/=]+$/; + var DUO_ERROR_FORMAT = /^ERR\|[\w\s\.\(\)]+$/; + var DUO_OPEN_WINDOW_FORMAT = /^DUO_OPEN_WINDOW\|/; + var VALID_OPEN_WINDOW_DOMAINS = [ + 'duo.com', + 'duosecurity.com', + 'duomobile.s3-us-west-1.amazonaws.com' + ]; + + var iframeId = 'duo_iframe', + postAction = '', + postArgument = 'sig_response', + host, + sigRequest, + duoSig, + appSig, + iframe, + submitCallback; + + function throwError(message, url) { + throw new Error( + 'Duo Web SDK error: ' + message + + (url ? ('\n' + 'See ' + url + ' for more information') : '') + ); + } + + function hyphenize(str) { + return str.replace(/([a-z])([A-Z])/, '$1-$2').toLowerCase(); + } + + // cross-browser data attributes + function getDataAttribute(element, name) { + if ('dataset' in element) { + return element.dataset[name]; + } else { + return element.getAttribute('data-' + hyphenize(name)); + } + } + + // cross-browser event binding/unbinding + function on(context, event, fallbackEvent, callback) { + if ('addEventListener' in window) { + context.addEventListener(event, callback, false); + } else { + context.attachEvent(fallbackEvent, callback); + } + } + + function off(context, event, fallbackEvent, callback) { + if ('removeEventListener' in window) { + context.removeEventListener(event, callback, false); + } else { + context.detachEvent(fallbackEvent, callback); + } + } + + function onReady(callback) { + on(document, 'DOMContentLoaded', 'onreadystatechange', callback); + } + + function offReady(callback) { + off(document, 'DOMContentLoaded', 'onreadystatechange', callback); + } + + function onMessage(callback) { + on(window, 'message', 'onmessage', callback); + } + + function offMessage(callback) { + off(window, 'message', 'onmessage', callback); + } + + /** + * Parse the sig_request parameter, throwing errors if the token contains + * a server error or if the token is invalid. + * + * @param {String} sig Request token + */ + function parseSigRequest(sig) { + if (!sig) { + // nothing to do + return; + } + + // see if the token contains an error, throwing it if it does + if (sig.indexOf('ERR|') === 0) { + throwError(sig.split('|')[1]); + } + + // validate the token + if (sig.indexOf(':') === -1 || sig.split(':').length !== 2) { + throwError( + 'Duo was given a bad token. This might indicate a configuration ' + + 'problem with one of Duo\'s client libraries.', + 'https://www.duosecurity.com/docs/duoweb#first-steps' + ); + } + + var sigParts = sig.split(':'); + + // hang on to the token, and the parsed duo and app sigs + sigRequest = sig; + duoSig = sigParts[0]; + appSig = sigParts[1]; + + return { + sigRequest: sig, + duoSig: sigParts[0], + appSig: sigParts[1] + }; + } + + /** + * This function is set up to run when the DOM is ready, if the iframe was + * not available during `init`. + */ + function onDOMReady() { + iframe = document.getElementById(iframeId); + + if (!iframe) { + throw new Error( + 'This page does not contain an iframe for Duo to use.' + + 'Add an element like ' + + 'to this page. ' + + 'See https://www.duosecurity.com/docs/duoweb#3.-show-the-iframe ' + + 'for more information.' + ); + } + + // we've got an iframe, away we go! + ready(); + + // always clean up after yourself + offReady(onDOMReady); + } + + /** + * Validate that a MessageEvent came from the Duo service, and that it + * is a properly formatted payload. + * + * The Google Chrome sign-in page injects some JS into pages that also + * make use of postMessage, so we need to do additional validation above + * and beyond the origin. + * + * @param {MessageEvent} event Message received via postMessage + */ + function isDuoMessage(event) { + return Boolean( + event.origin === ('https://' + host) && + typeof event.data === 'string' && + ( + event.data.match(DUO_MESSAGE_FORMAT) || + event.data.match(DUO_ERROR_FORMAT) || + event.data.match(DUO_OPEN_WINDOW_FORMAT) + ) + ); + } + + /** + * Validate the request token and prepare for the iframe to become ready. + * + * All options below can be passed into an options hash to `Duo.init`, or + * specified on the iframe using `data-` attributes. + * + * Options specified using the options hash will take precedence over + * `data-` attributes. + * + * Example using options hash: + * ```javascript + * Duo.init({ + * iframe: "some_other_id", + * host: "api-main.duo.test", + * sig_request: "...", + * post_action: "/auth", + * post_argument: "resp" + * }); + * ``` + * + * Example using `data-` attributes: + * ``` + * + * ``` + * + * @param {Object} options + * @param {String} options.iframe The iframe, or id of an iframe to set up + * @param {String} options.host Hostname + * @param {String} options.sig_request Request token + * @param {String} [options.post_action=''] URL to POST back to after successful auth + * @param {String} [options.post_argument='sig_response'] Parameter name to use for response token + * @param {Function} [options.submit_callback] If provided, duo will not submit the form instead execute + * the callback function with reference to the "duo_form" form object + * submit_callback can be used to prevent the webpage from reloading. + */ + function init(options) { + if (options) { + if (options.host) { + host = options.host; + } + + if (options.sig_request) { + parseSigRequest(options.sig_request); + } + + if (options.post_action) { + postAction = options.post_action; + } + + if (options.post_argument) { + postArgument = options.post_argument; + } + + if (options.iframe) { + if (options.iframe.tagName) { + iframe = options.iframe; + } else if (typeof options.iframe === 'string') { + iframeId = options.iframe; + } + } + + if (typeof options.submit_callback === 'function') { + submitCallback = options.submit_callback; + } + } + + // if we were given an iframe, no need to wait for the rest of the DOM + if (false && iframe) { + ready(); + } else { + // try to find the iframe in the DOM + iframe = document.getElementById(iframeId); + + // iframe is in the DOM, away we go! + if (iframe) { + ready(); + } else { + // wait until the DOM is ready, then try again + onReady(onDOMReady); + } + } + + // always clean up after yourself! + offReady(init); + } + + /** + * This function is called when a message was received from another domain + * using the `postMessage` API. Check that the event came from the Duo + * service domain, and that the message is a properly formatted payload, + * then perform the post back to the primary service. + * + * @param event Event object (contains origin and data) + */ + function onReceivedMessage(event) { + if (isDuoMessage(event)) { + if (event.data.match(DUO_OPEN_WINDOW_FORMAT)) { + var url = event.data.substring("DUO_OPEN_WINDOW|".length); + if (isValidUrlToOpen(url)) { + // Open the URL that comes after the DUO_WINDOW_OPEN token. + window.open(url, "_self"); + } + } + else { + // the event came from duo, do the post back + doPostBack(event.data); + + // always clean up after yourself! + offMessage(onReceivedMessage); + } + } + } + + /** + * Validate that this passed in URL is one that we will actually allow to + * be opened. + * @param url String URL that the message poster wants to open + * @returns {boolean} true if we allow this url to be opened in the window + */ + function isValidUrlToOpen(url) { + if (!url) { + return false; + } + + var parser = document.createElement('a'); + parser.href = url; + + if (parser.protocol === "duotrustedendpoints:") { + return true; + } else if (parser.protocol !== "https:") { + return false; + } + + for (var i = 0; i < VALID_OPEN_WINDOW_DOMAINS.length; i++) { + if (parser.hostname.endsWith("." + VALID_OPEN_WINDOW_DOMAINS[i]) || + parser.hostname === VALID_OPEN_WINDOW_DOMAINS[i]) { + return true; + } + } + return false; + } + + /** + * Point the iframe at Duo, then wait for it to postMessage back to us. + */ + function ready() { + if (!host) { + host = getDataAttribute(iframe, 'host'); + + if (!host) { + throwError( + 'No API hostname is given for Duo to use. Be sure to pass ' + + 'a `host` parameter to Duo.init, or through the `data-host` ' + + 'attribute on the iframe element.', + 'https://www.duosecurity.com/docs/duoweb#3.-show-the-iframe' + ); + } + } + + if (!duoSig || !appSig) { + parseSigRequest(getDataAttribute(iframe, 'sigRequest')); + + if (!duoSig || !appSig) { + throwError( + 'No valid signed request is given. Be sure to give the ' + + '`sig_request` parameter to Duo.init, or use the ' + + '`data-sig-request` attribute on the iframe element.', + 'https://www.duosecurity.com/docs/duoweb#3.-show-the-iframe' + ); + } + } + + // if postAction/Argument are defaults, see if they are specified + // as data attributes on the iframe + if (postAction === '') { + postAction = getDataAttribute(iframe, 'postAction') || postAction; + } + + if (postArgument === 'sig_response') { + postArgument = getDataAttribute(iframe, 'postArgument') || postArgument; + } + + // point the iframe at Duo + iframe.src = [ + 'https://', host, '/frame/web/v1/auth?tx=', duoSig, + '&parent=', encodeURIComponent(document.location.href), + '&v=2.6' + ].join(''); + + // listen for the 'message' event + onMessage(onReceivedMessage); + } + + /** + * We received a postMessage from Duo. POST back to the primary service + * with the response token, and any additional user-supplied parameters + * given in form#duo_form. + */ + function doPostBack(response) { + // create a hidden input to contain the response token + var input = document.createElement('input'); + input.type = 'hidden'; + input.name = postArgument; + input.value = response + ':' + appSig; + + // user may supply their own form with additional inputs + var form = document.getElementById('duo_form'); + + // if the form doesn't exist, create one + if (!form) { + form = document.createElement('form'); + + // insert the new form after the iframe + iframe.parentElement.insertBefore(form, iframe.nextSibling); + } + + // make sure we are actually posting to the right place + form.method = 'POST'; + form.action = postAction; + + // add the response token input to the form + form.appendChild(input); + + // away we go! + if (typeof submitCallback === "function") { + submitCallback.call(null, form); + } else { + form.submit(); + } + } + + return { + init: init, + _onReady: onReady, + _parseSigRequest: parseSigRequest, + _isDuoMessage: isDuoMessage, + _doPostBack: doPostBack + }; +})); diff --git a/web-vault/js/fallback-scripts.min.js b/web-vault/js/fallback-scripts.min.js new file mode 100644 index 00000000..09fa53f3 --- /dev/null +++ b/web-vault/js/fallback-scripts.min.js @@ -0,0 +1 @@ +function loadScriptIfMissing(i,n){i||document.write(' + +
").append(f).html(),v="data:image/svg+xml;base64,"+window.btoa(unescape(encodeURIComponent(h))),y=angular.element("").attr({src:v,title:e.data});"true"===o.round&&y.css("border-radius","50%"),"true"===o.border&&y.css("border",o.borderStyle),o.class&&y.addClass(o.class),"true"===o.dynamic?(t.empty(),t.append(y)):t.replaceWith(y)}"true"===o.dynamic?e.$watch("data",function(){r()}):r()}}}),angular.module("bit.directives").directive("masterPassword",["cryptoService","authService",function(e,t){return{require:"ngModel",restrict:"A",link:function(n,o,r,a){t.getUserProfile().then(function(t){a.$parsers.unshift(function(n){if(n)return e.makeKey(n,t.email).then(function(t){var o=t.keyB64===e.getKey().keyB64;return a.$setValidity("masterPassword",o),o?n:void 0})}),a.$formatters.unshift(function(n){if(n)return e.makeKey(n,t.email).then(function(t){var o=t.keyB64===e.getKey().keyB64;return a.$setValidity("masterPassword",o),n})})})}}}]),angular.module("bit.directives").directive("pageTitle",["$rootScope","$timeout","appSettings",function(e,t,n){return{link:function(n,o){e.$on("$stateChangeStart",function(e,n,r,a,i){var s="bitwarden Web Vault";n.data&&n.data.pageTitle&&(s=n.data.pageTitle+" - "+s),t(function(){o.text(s)})})}}}]),angular.module("bit.directives").directive("passwordMeter",function(){return{template:'
{{value}}%
',restrict:"A",scope:{password:"=passwordMeter",username:"=passwordMeterUsername",outerClass:"@?"},link:function(e){var t=function(e){e.value=function(e,t){if(!t||t===e)return 0;var n=t.length;return e&&""!==e&&(-1!==e.indexOf(t)&&(n-=15),-1!==t.indexOf(e)&&(n-=e.length)),t.length>0&&t.length<=4?n+=t.length:t.length>=5&&t.length<=7?n+=6:t.length>=8&&t.length<=15?n+=12:t.length>=16&&(n+=18),t.match(/[a-z]/)&&(n+=1),t.match(/[A-Z]/)&&(n+=5),t.match(/\d/)&&(n+=5),t.match(/.*\d.*\d.*\d/)&&(n+=5),t.match(/[!,@,#,$,%,^,&,*,?,_,~]/)&&(n+=5),t.match(/.*[!,@,#,$,%,^,&,*,?,_,~].*[!,@,#,$,%,^,&,*,?,_,~]/)&&(n+=5),t.match(/(?=.*[a-z])(?=.*[A-Z])/)&&(n+=2),t.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])/)&&(n+=2),t.match(/(?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[!,@,#,$,%,^,&,*,?,_,~])/)&&(n+=2),n=Math.round(2*n),Math.max(0,Math.min(100,n))}(e.username,e.password),e.valueClass=function(e){switch(Math.round(e/33)){case 0:case 1:return"danger";case 2:return"warning";case 3:return"success"}}(e.value)};e.$watch("password",function(){t(e)}),e.$watch("username",function(){t(e)})}}}),angular.module("bit.directives").directive("passwordViewer",function(){return{restrict:"A",link:function(e,t,n){var o=n.passwordViewer;o&&(t.onclick=function(e){},t.on("click",function(e){var n=$(o);n&&"password"===n.attr("type")?(t.removeClass("fa-eye").addClass("fa-eye-slash"),n.attr("type","text")):n&&"text"===n.attr("type")&&(t.removeClass("fa-eye-slash").addClass("fa-eye"),n.attr("type","password"))}))}}}),angular.module("bit.directives").directive("stopClick",function(){return function(e,t,n){$(t).click(function(e){e.preventDefault()})}}),angular.module("bit.directives").directive("stopProp",function(){return function(e,t,n){$(t).click(function(e){e.stopPropagation()})}}),angular.module("bit.directives").directive("totp",["$timeout","$q",function(e,t){return{template:'
',restrict:"A",scope:{key:"=totp"},link:function(n){var o=null,r=new function(){var e="ABCDEFGHIJKLMNOPQRSTUVWXYZ234567",n=function(e,t,n){return t+1>=e.length&&(e=Array(t+1-e.length).join(n)+e),e},o=function(e){return parseInt(e,16)},r=function(e){for(var t=new Uint8Array(e.length/2),n=0;n>>4).toString(16)),n.push((15&t[o]).toString(16));return n.join("")}(e)}).catch(function(e){return null})};this.getCode=function(e){var s,l=Math.round((new Date).getTime()/1e3),c=n(((s=Math.floor(l/30))<15.5?"0":"")+Math.round(s).toString(16),16,"0"),u=r(c),d=a(e);return d.length&&u.length?i(d,u).then(function(e){if(!e)return null;var t=o(e.substring(e.length-1)),n=(o(e.substr(2*t,8))&o("7fffffff"))+"";return n=n.substr(n.length-6,6)}):t(function(e,t){e(null)})}},a=function(t){r.getCode(t.key).then(function(n){e(function(){n?(t.codeFormatted=n.substring(0,3)+" "+n.substring(3),t.code=n):(t.code=null,o&&clearInterval(o))})})},i=function(t){e(function(){var e=Math.round((new Date).getTime()/1e3)%30,n=30-e;t.sec=n,t.dash=(2.62*e).toFixed(2),t.low=n<=7,0===e&&a(t)})};n.$watch("key",function(){if(!n.key)return n.code=null,void(o&&clearInterval(o));a(n),i(n),o&&clearInterval(o),o=setInterval(function(){i(n)},1e3)}),n.$on("$destroy",function(){o&&clearInterval(o)}),n.clipboardError=function(e){alert("Your web browser does not support easy clipboard copying.")}}}}]),angular.module("bit.filters").filter("enumLabelClass",function(){return function(e,t){if("number"!=typeof e)return e.toString();var n;switch(t){case"OrgUserStatus":switch(e){case 0:n="label-default";break;case 1:n="label-warning";break;case 2:default:n="label-success"}break;default:n="label-default"}return n}}),angular.module("bit.filters").filter("enumName",function(){return function(e,t){if("number"!=typeof e)return e.toString();var n;switch(t){case"OrgUserStatus":switch(e){case 0:n="Invited";break;case 1:n="Accepted";break;case 2:default:n="Confirmed"}break;case"OrgUserType":switch(e){case 0:n="Owner";break;case 1:n="Admin";break;case 2:default:n="User"}break;default:n=e.toString()}return n}}),angular.module("bit.global").controller("appsController",["$scope","$state",function(e,t){}]),angular.module("bit.global").controller("mainController",["$scope","$state","authService","appSettings","toastr","$window","$document","cryptoService","$uibModal","apiService",function(e,t,n,o,r,a,i,s,l,c){var u,d,p,m=this;m.skinClass=o.selfHosted?"skin-blue-light":"skin-blue",m.bodyClass="",m.usingControlSidebar=m.openControlSidebar=!1,m.searchVaultText=null,m.version=o.version,m.outdatedBrowser=-1!==a.navigator.userAgent.indexOf("MSIE")||-1!==a.navigator.userAgent.indexOf("SamsungBrowser"),e.currentYear=(new Date).getFullYear(),e.$on("$viewContentLoaded",function(){n.getUserProfile().then(function(e){m.userProfile=e}),$.AdminLTE&&($.AdminLTE.layout&&($.AdminLTE.layout.fix(),$.AdminLTE.layout.fixSidebar()),$.AdminLTE.pushMenu&&$.AdminLTE.pushMenu.expandOnHover(),i.off("click",".sidebar li a"))}),e.$on("$stateChangeSuccess",function(e,t,n,o,r){m.usingEncKey=!!s.getEncKey(),m.searchVaultText=null,t.data.bodyClass?m.bodyClass=t.data.bodyClass:(m.bodyClass="",m.usingControlSidebar=!!t.data.controlSidebar,m.openControlSidebar=m.usingControlSidebar&&i.width()>768)}),e.$on("setSearchVaultText",function(e,t){m.searchVaultText=t}),e.addCipher=function(){e.$broadcast("vaultAddCipher")},e.addFolder=function(){e.$broadcast("vaultAddFolder")},e.addOrganizationCipher=function(){e.$broadcast("organizationVaultAddCipher")},e.addOrganizationCollection=function(){e.$broadcast("organizationCollectionsAdd")},e.inviteOrganizationUser=function(){e.$broadcast("organizationPeopleInvite")},e.addOrganizationGroup=function(){e.$broadcast("organizationGroupsAdd")},e.updateKey=function(){l.open({animation:!0,templateUrl:"app/settings/views/settingsUpdateKey.html",controller:"settingsUpdateKeyController"})},e.verifyEmail=function(){e.sendingVerify||(e.sendingVerify=!0,c.accounts.verifyEmail({},null).$promise.then(function(){r.success("Verification email sent."),e.sendingVerify=!1,e.verifyEmailSent=!0}).catch(function(){r.success("Verification email failed."),e.sendingVerify=!1}))},e.updateBrowser=function(){a.open("https://browser-update.org/update.html","_blank")};var g={scrollbarWidth:function(){if(!u){var e=$("body");e.addClass("bit-position-body-scrollbar-measure"),u=a.innerWidth-e[0].clientWidth,u=isFinite(u)?u:0,e.removeClass("bit-position-body-scrollbar-measure")}return u},scrollbarInfo:function(){return{width:g.scrollbarWidth(),visible:i.height()>$(a).height()}}};$(window).on("show.bs.dropdown",function(e){var t=p=$(e.target),n=t.data("appendTo");if(!n)return!0;d=t.find(".dropdown-menu"),$(n).append(d.detach());var o=t.offset(),r={display:"block",top:o.top+t.outerHeight()-("body"!==n?$(window).scrollTop():0)};if(d.hasClass("dropdown-menu-right")){var i=g.scrollbarInfo(),s=0;i.visible&&i.width&&(s=i.width),r.right=a.innerWidth-s-(o.left+t.prop("offsetWidth"))+"px",r.left="auto"}else r.left=o.left+"px",r.right="auto";d.css(r)}),$(window).on("hide.bs.dropdown",function(e){if(!d)return!0;$(e.target).append(d.detach()),d.hide(),d=null,p=null}),e.$on("removeAppendedDropdownMenu",function(e,t){if(!d&&!p)return!0;p.append(d.detach()),d.hide(),d=null,p=null})}]),angular.module("bit.global").controller("paidOrgRequiredController",["$scope","$state","$uibModalInstance","$analytics","$uibModalStack","orgId","constants","authService",function(e,t,n,o,r,a,i,s){o.eventTrack("paidOrgRequiredController",{category:"Modal"}),s.getUserProfile().then(function(t){e.admin=t.organizations[a].type!==i.orgUserType.user}),e.go=function(){e.admin&&(o.eventTrack("Get Paid Org"),t.go("backend.org.billing",{orgId:a}).then(function(){r.dismissAll()}))},e.close=function(){n.dismiss("close")}}]),angular.module("bit.global").controller("premiumRequiredController",["$scope","$state","$uibModalInstance","$analytics","$uibModalStack",function(e,t,n,o,r){o.eventTrack("premiumRequiredController",{category:"Modal"}),e.go=function(){o.eventTrack("Get Premium"),t.go("backend.user.settingsPremium").then(function(){r.dismissAll()})},e.close=function(){n.dismiss("close")}}]),angular.module("bit.global").controller("sideNavController",["$scope","$state","authService","toastr","$analytics","constants","appSettings",function(e,t,n,o,r,a,i){e.$state=t,e.params=t.params,e.orgs=[],e.name="",i.selfHosted?(e.orgIconBgColor="#ffffff",e.orgIconBorder="3px solid #a0a0a0",e.orgIconTextColor="#333333"):(e.orgIconBgColor="#2c3b41",e.orgIconBorder="3px solid #1a2226",e.orgIconTextColor="#ffffff"),n.getUserProfile().then(function(n){if(e.name=n.extended&&n.extended.name?n.extended.name:n.email,n.organizations)if(t.includes("backend.org")&&t.params.orgId in n.organizations)e.orgProfile=n.organizations[t.params.orgId];else{var o=[];for(var r in n.organizations)n.organizations.hasOwnProperty(r)&&(n.organizations[r].enabled||n.organizations[r].type<2)&&o.push(n.organizations[r]);e.orgs=o}}),e.viewOrganization=function(e){e.type!==a.orgUserType.user?(r.eventTrack("View Organization From Side Nav"),t.go("backend.org.dashboard",{orgId:e.id})):o.error("You cannot manage this organization.")},e.searchVault=function(){t.go("backend.user.vault")},e.searchOrganizationVault=function(){t.go("backend.org.vault",{orgId:t.params.orgId})},e.isOrgOwner=function(e){return e&&e.type===a.orgUserType.owner}}]),angular.module("bit.global").controller("topNavController",["$scope",function(e){e.toggleControlSidebar=function(){var e=$("body");e.hasClass("control-sidebar-open")?e.removeClass("control-sidebar-open"):e.addClass("control-sidebar-open")}}]),angular.module("bit.organization").controller("organizationBillingAdjustSeatsController",["$scope","$state","$uibModalInstance","apiService","$analytics","toastr","add",function(e,t,n,o,r,a,i){r.eventTrack("organizationBillingAdjustSeatsController",{category:"Modal"}),e.add=i,e.seatAdjustment=0,e.submit=function(){var s={seatAdjustment:e.seatAdjustment};i||(s.seatAdjustment*=-1),e.submitPromise=o.organizations.putSeat({id:t.params.orgId},s).$promise.then(function(t){i?(r.eventTrack("Added Seats"),a.success("You have added "+e.seatAdjustment+" seats.")):(r.eventTrack("Removed Seats"),a.success("You have removed "+e.seatAdjustment+" seats.")),n.close()})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationBillingAdjustStorageController",["$scope","$state","$uibModalInstance","apiService","$analytics","toastr","add",function(e,t,n,o,r,a,i){r.eventTrack("organizationBillingAdjustStorageController",{category:"Modal"}),e.add=i,e.storageAdjustment=0,e.submit=function(){var s={storageGbAdjustment:e.storageAdjustment};i||(s.storageGbAdjustment*=-1),e.submitPromise=o.organizations.putStorage({id:t.params.orgId},s).$promise.then(function(t){i?(r.eventTrack("Added Organization Storage"),a.success("You have added "+e.storageAdjustment+" GB.")):(r.eventTrack("Removed Organization Storage"),a.success("You have removed "+e.storageAdjustment+" GB.")),n.close()})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationBillingChangePaymentController",["$scope","$state","$uibModalInstance","apiService","$analytics","toastr","existingPaymentMethod",function(e,t,n,o,r,a,i){r.eventTrack("organizationBillingChangePaymentController",{category:"Modal"}),e.existingPaymentMethod=i,e.paymentMethod="card",e.showPaymentOptions=!0,e.hidePaypal=!0,e.card={},e.bank={},e.changePaymentMethod=function(t){e.paymentMethod=t},e.submit=function(){var s=null;if("card"===e.paymentMethod)s=stripe.card.createToken(e.card);else{if("bank"!==e.paymentMethod)return;e.bank.currency="USD",e.bank.country="US",s=stripe.bankAccount.createToken(e.bank)}e.submitPromise=s.then(function(e){var n={paymentToken:e.id};return o.organizations.putPayment({id:t.params.orgId},n).$promise},function(e){throw e.message}).then(function(t){e.card=null,i?(r.eventTrack("Changed Organization Payment Method"),a.success("You have changed your payment method.")):(r.eventTrack("Added Organization Payment Method"),a.success("You have added a payment method.")),n.close()})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationBillingChangePlanController",["$scope","$state","apiService","$uibModalInstance","toastr","$analytics",function(e,t,n,o,r,a){a.eventTrack("organizationBillingChangePlanController",{category:"Modal"}),e.submit=function(){},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationBillingController",["$scope","apiService","$state","$uibModal","toastr","$analytics","appSettings","tokenService","$window",function(e,t,n,o,r,a,i,s,l){e.selfHosted=i.selfHosted,e.charges=[],e.paymentSource=null,e.plan=null,e.subscription=null,e.loading=!0;function c(){t.organizations.getBilling({id:n.params.orgId},function(t){e.loading=!1,e.noSubscription=0===t.PlanType,e.canAdjustSeats=t.PlanType>1;var n=0;if(e.expiration=t.Expiration,t.License,e.plan={name:t.Plan,type:t.PlanType,seats:t.Seats},e.storage=null,e&&t.MaxStorageGb&&(e.storage={currentGb:t.StorageGb||0,maxGb:t.MaxStorageGb,currentName:t.StorageName||"0 GB"},e.storage.percentage=+(e.storage.currentGb/e.storage.maxGb*100).toFixed(2)),e.subscription=null,t.Subscription&&(e.subscription={trialEndDate:t.Subscription.TrialEndDate,cancelledDate:t.Subscription.CancelledDate,status:t.Subscription.Status,cancelled:t.Subscription.Cancelled,markedForCancel:!t.Subscription.Cancelled&&t.Subscription.CancelAtEndDate}),e.nextInvoice=null,t.UpcomingInvoice&&(e.nextInvoice={date:t.UpcomingInvoice.Date,amount:t.UpcomingInvoice.Amount}),t.Subscription&&t.Subscription.Items)for(e.subscription.items=[],n=0;n=s},e.submit=function(i){var s=r.encryptCollection(i,t.params.orgId);if(e.useGroups)for(var l in s.groups=[],e.selectedGroups)if(e.selectedGroups.hasOwnProperty(l))for(var c=0;c0&&(n[0].name=t.name)})},e.users=function(e){o.open({animation:!0,templateUrl:"app/organization/views/organizationCollectionsUsers.html",controller:"organizationCollectionsUsersController",size:"lg",resolve:{collection:function(){return e}}}).result.then(function(){})},e.groups=function(e){o.open({animation:!0,templateUrl:"app/organization/views/organizationCollectionsGroups.html",controller:"organizationCollectionsGroupsController",resolve:{collection:function(){return e}}}).result.then(function(){})},e.delete=function(o){confirm("Are you sure you want to delete this collection ("+o.name+")?")&&n.collections.del({orgId:t.params.orgId,id:o.id},function(){var t=e.collections.indexOf(o);t>-1&&e.collections.splice(t,1),s.eventTrack("Deleted Collection"),i.success(o.name+" has been deleted.","Collection Deleted")},function(){i.error(o.name+" was not able to be deleted.","Error")})}}]),angular.module("bit.organization").controller("organizationCollectionsEditController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics","id","authService",function(e,t,n,o,r,a,i,s){a.eventTrack("organizationCollectionsEditController",{category:"Modal"});var l=0;e.collection={},e.groups=[],e.selectedGroups={},e.loading=!0,e.useGroups=!1,n.opened.then(function(){return o.collections.getDetails({orgId:t.params.orgId,id:i}).$promise}).then(function(t){e.collection=r.decryptCollection(t);var n={};if(t.Groups)for(var o=0;o=l},e.submit=function(s){var l=r.encryptCollection(s,t.params.orgId);if(e.useGroups)for(var c in l.groups=[],e.selectedGroups)if(e.selectedGroups.hasOwnProperty(c))for(var u=0;u-1&&e.users.splice(t,1)},function(){s.error("Unable to remove user.","Error")})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationDashboardController",["$scope","authService","$state","appSettings",function(e,t,n,o){e.selfHosted=o.selfHosted,e.$on("$viewContentLoaded",function(){t.getUserProfile().then(function(t){t.organizations&&(e.orgProfile=t.organizations[n.params.orgId])})}),e.goBilling=function(){n.go("backend.org.billing",{orgId:n.params.orgId})}}]),angular.module("bit.organization").controller("organizationDeleteController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics",function(e,t,n,o,r,a,i,s){s.eventTrack("organizationDeleteController",{category:"Modal"}),e.submit=function(){e.submitPromise=r.hashPassword(e.masterPassword).then(function(e){return n.organizations.del({id:t.params.orgId},{masterPasswordHash:e}).$promise}).then(function(){return o.dismiss("cancel"),a.removeProfileOrganization(t.params.orgId),s.eventTrack("Deleted Organization"),t.go("backend.user.vault")}).then(function(){i.success("This organization and all associated data has been deleted.","Organization Deleted")})},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationEventsController",["$scope","$state","apiService","$uibModal","$filter","toastr","$analytics","constants","eventService","$compile","$sce",function(e,t,n,o,r,a,i,s,l,c,u){e.events=[],e.orgUsers=[],e.loading=!0,e.continuationToken=null;var d=l.getDefaultDateFilters();e.filterStart=d.start,e.filterEnd=d.end,e.$on("$viewContentLoaded",function(){n.organizationUsers.list({orgId:t.params.orgId}).$promise.then(function(t){var n=[];for(p=0;p"+r.message+"")(e);n.push({message:u.trustAsHtml(a[0].outerHTML),appIcon:r.appIcon,appName:r.appName,userId:o,userName:o&&m[o]||"-",date:t.Data[p].Date,ip:t.Data[p].IpAddress})}e.events&&e.events.length>0?e.events=e.events.concat(n):e.events=n,e.loading=!1});alert(r.error)}}]),angular.module("bit.organization").controller("organizationGroupsAddController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics",function(e,t,n,o,r,a){a.eventTrack("organizationGroupsAddController",{category:"Modal"}),e.collections=[],e.selectedCollections={},e.loading=!0,n.opened.then(function(){return o.collections.listOrganization({orgId:t.params.orgId}).$promise}).then(function(n){e.collections=r.decryptCollections(n.Data,t.params.orgId,!0),e.loading=!1}),e.toggleCollectionSelectionAll=function(t){var n={};if(t.target.checked)for(var o=0;o0&&(n[0].name=t.name)})},e.users=function(e){o.open({animation:!0,templateUrl:"app/organization/views/organizationGroupsUsers.html",controller:"organizationGroupsUsersController",size:"lg",resolve:{group:function(){return e}}}).result.then(function(){})},e.delete=function(o){confirm("Are you sure you want to delete this group ("+o.name+")?")&&n.groups.del({orgId:t.params.orgId,id:o.id},function(){var t=e.groups.indexOf(o);t>-1&&e.groups.splice(t,1),i.eventTrack("Deleted Group"),a.success(o.name+" has been deleted.","Group Deleted")},function(){a.error(o.name+" was not able to be deleted.","Error")})}}]),angular.module("bit.organization").controller("organizationGroupsEditController",["$scope","$state","$uibModalInstance","apiService","cipherService","$analytics","id",function(e,t,n,o,r,a,i){a.eventTrack("organizationGroupsEditController",{category:"Modal"}),e.collections=[],e.selectedCollections={},e.loading=!0,n.opened.then(function(){return o.groups.getDetails({orgId:t.params.orgId,id:i}).$promise}).then(function(n){e.group={id:i,name:n.Name,externalId:n.ExternalId,accessAll:n.AccessAll};var r={};if(n.Collections)for(var a=0;a-1&&e.users.splice(t,1)},function(){i.error("Unable to remove user.","Error")})},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationPeopleController",["$scope","$state","$uibModal","cryptoService","apiService","authService","toastr","$analytics","$filter","$uibModalStack",function(e,t,n,o,r,a,i,s,l,c){function u(){r.organizationUsers.list({orgId:t.params.orgId},function(n){for(var o=[],r=0;r-1&&e.users.splice(t,1)},function(){i.error("Unable to remove user.","Error")})},e.confirm=function(e){r.users.getPublicKey({id:e.userId},function(n){var a=o.getOrgKey(t.params.orgId);if(a){var l=o.rsaEncrypt(a.key,n.PublicKey);r.organizationUsers.confirm({orgId:t.params.orgId,id:e.id},{key:l},function(){e.status=2,s.eventTrack("Confirmed User"),i.success(e.email+" has been confirmed.","User Confirmed")},function(){i.error("Unable to confirm user.","Error")})}else i.error("Unable to confirm user.","Error")},function(){i.error("Unable to confirm user.","Error")})},e.$on("organizationPeopleInvite",function(t,n){e.invite()}),e.invite=function(){n.open({animation:!0,templateUrl:"app/organization/views/organizationPeopleInvite.html",controller:"organizationPeopleInviteController"}).result.then(function(){u()})},e.edit=function(e){n.open({animation:!0,templateUrl:"app/organization/views/organizationPeopleEdit.html",controller:"organizationPeopleEditController",resolve:{orgUser:function(){return e}}}).result.then(function(){u()})},e.groups=function(e){n.open({animation:!0,templateUrl:"app/organization/views/organizationPeopleGroups.html",controller:"organizationPeopleGroupsController",resolve:{orgUser:function(){return e}}}).result.then(function(){})},e.events=function(e){n.open({animation:!0,templateUrl:"app/organization/views/organizationPeopleEvents.html",controller:"organizationPeopleEventsController",resolve:{orgUser:function(){return e},orgId:function(){return t.params.orgId}}})}}]),angular.module("bit.organization").controller("organizationPeopleEditController",["$scope","$state","$uibModalInstance","apiService","cipherService","orgUser","$analytics",function(e,t,n,o,r,a,i){i.eventTrack("organizationPeopleEditController",{category:"Modal"}),e.loading=!0,e.collections=[],e.selectedCollections={},n.opened.then(function(){o.collections.listOrganization({orgId:t.params.orgId},function(n){e.collections=r.decryptCollections(n.Data,t.params.orgId,!0),e.loading=!1}),o.organizationUsers.get({orgId:t.params.orgId,id:a.id},function(t){var n={};if(t&&t.Collections)for(var o=0;o"+r.message+"")(e);n.push({message:l.trustAsHtml(i[0].outerHTML),appIcon:r.appIcon,appName:r.appName,date:t.Data[o].Date,ip:t.Data[o].IpAddress})}e.events&&e.events.length>0?e.events=e.events.concat(n):e.events=n,e.loading=!1});alert(r.error)}e.filterStart=c.start,e.filterEnd=c.end,n.opened.then(function(){u(!0)}),e.refresh=function(){u(!0)},e.next=function(){u(!1)},e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationPeopleGroupsController",["$scope","$state","$uibModalInstance","apiService","orgUser","$analytics",function(e,t,n,o,r,a){a.eventTrack("organizationPeopleGroupsController",{category:"Modal"}),e.loading=!0,e.groups=[],e.selectedGroups={},e.orgUser=r,n.opened.then(function(){return o.groups.listOrganization({orgId:t.params.orgId}).$promise}).then(function(n){for(var a=[],i=0;i=t?e:new Array(t-e.length+1).join(n)+e}i.eventTrack("organizationSettingsExportController",{category:"Modal"}),e.export=function(n){e.startedExport=!0;var u=[],d=[],p=t.collections.listOrganization({orgId:s.params.orgId},function(e){d=o.decryptCollections(e.Data,s.params.orgId,!0)}).$promise,m=t.ciphers.listOrganizationDetails({organizationId:s.params.orgId},function(e){u=o.decryptCiphers(e.Data)}).$promise;r.all([p,m]).then(function(){if(!u.length)return a.error("Nothing to export.","Error!"),void e.close();for(var t={},n=0;n "Tools" > "Export".')},{id:"lastpass",name:"LastPass (csv)",featured:!0,sort:2,instructions:l.trustAsHtml('See detailed instructions on our help site at https://help.bitwarden.com/article/import-from-lastpass/')}],e.setSource=function(){for(var t=0;t-1&&e.cipher.fields.splice(n,1)},e.clipboardSuccess=function(e){e.clearSelection(),d(e)},e.clipboardError=function(e,t){t&&d(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.close=function(){n.dismiss("close")},e.showUpgrade=function(){c.open({animation:!0,templateUrl:"app/views/paidOrgRequired.html",controller:"paidOrgRequiredController",resolve:{orgId:function(){return l}}})}}]),angular.module("bit.organization").controller("organizationVaultAttachmentsController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","cipherId","$analytics","validationService","toastr","$timeout",function(e,t,n,o,r,a,i,s,l,c){i.eventTrack("organizationVaultAttachmentsController",{category:"Modal"}),e.cipher={},e.loading=!0,e.isPremium=!0,e.canUseAttachments=!0;var u=!1;t.ciphers.getAdmin({id:a},function(t){e.cipher=r.decryptCipher(t),e.loading=!1},function(){e.loading=!1}),e.save=function(c){var d=document.getElementById("file").files;if(d&&d.length){var p=o.getOrgKey(e.cipher.organizationId);e.savePromise=r.encryptAttachmentFile(p,d[0]).then(function(e){var n=new FormData,o=new Blob([e.data],{type:"application/octet-stream"});return n.append("data",o,e.fileName),t.ciphers.postAttachment({id:a},n).$promise}).then(function(e){i.eventTrack("Added Attachment"),l.success("The attachment has been added."),u=!0,n.close(!0)},function(e){var t=s.parseErrors(e);l.error(t.length?t[0]:"An error occurred.")})}else s.addError(c,"file","Select a file.",!0)},e.download=function(t){t.loading=!0;var n=o.getOrgKey(e.cipher.organizationId);r.downloadAndDecryptAttachment(n,t,!0).then(function(e){c(function(){t.loading=!1})},function(){c(function(){t.loading=!1})})},e.remove=function(n){confirm("Are you sure you want to delete this attachment ("+n.fileName+")?")&&(n.loading=!0,t.ciphers.delAttachment({id:a,attachmentId:n.id}).$promise.then(function(){n.loading=!1,i.eventTrack("Deleted Organization Attachment");var t=e.cipher.attachments.indexOf(n);t>-1&&e.cipher.attachments.splice(t,1)},function(){l.error("Cannot delete attachment."),n.loading=!1}))},e.close=function(){n.dismiss("cancel")},e.$on("modal.closing",function(t,o,r){u||(t.preventDefault(),u=!0,n.close(!!e.cipher.attachments&&e.cipher.attachments.length>0))})}]),angular.module("bit.organization").controller("organizationVaultCipherCollectionsController",["$scope","apiService","$uibModalInstance","cipherService","cipher","$analytics","collections",function(e,t,n,o,r,a,i){a.eventTrack("organizationVaultCipherCollectionsController",{category:"Modal"}),e.cipher={},e.collections=[],e.selectedCollections={},n.opened.then(function(){for(var t=[],n=0;n0?e.events=e.events.concat(n):e.events=n,e.loading=!1});alert(r.error)}e.close=function(){n.dismiss("cancel")}}]),angular.module("bit.organization").controller("organizationVaultController",["$scope","apiService","cipherService","$analytics","$q","$state","$localStorage","$uibModal","$filter","authService","$uibModalStack",function(e,t,n,o,r,a,i,s,l,c,u){e.ciphers=[],e.collections=[],e.loading=!0,e.useEvents=!1,e.$on("$viewContentLoaded",function(){c.getUserProfile().then(function(t){if(t.organizations){var n=t.organizations[a.params.orgId];e.useEvents=!!n.useEvents}});var o=t.collections.listOrganization({orgId:a.params.orgId},function(t){for(var o=([{id:null,name:"Unassigned",collapsed:i.collapsedOrgCollections&&"unassigned"in i.collapsedOrgCollections}]),r=0;r-1:null===e.id}},e.collectionSort=function(e){return e.id?e.name.toLowerCase():"î º"},e.collapseExpand=function(e){i.collapsedOrgCollections||(i.collapsedOrgCollections={});var t=e.id||"unassigned";t in i.collapsedOrgCollections?delete i.collapsedOrgCollections[t]:i.collapsedOrgCollections[t]=!0},e.editCipher=function(t){s.open({animation:!0,templateUrl:"app/vault/views/vaultEditCipher.html",controller:"organizationVaultEditCipherController",resolve:{cipherId:function(){return t.id},orgId:function(){return a.params.orgId}}}).result.then(function(n){var o;"edit"===n.action?(o=e.ciphers.indexOf(t))>-1&&(n.data.collectionIds=e.ciphers[o].collectionIds,e.ciphers[o]=n.data):"delete"===n.action&&(o=e.ciphers.indexOf(t))>-1&&e.ciphers.splice(o,1)})},e.$on("organizationVaultAddCipher",function(t,n){e.addCipher()}),e.addCipher=function(){s.open({animation:!0,templateUrl:"app/vault/views/vaultAddCipher.html",controller:"organizationVaultAddCipherController",resolve:{orgId:function(){return a.params.orgId}}}).result.then(function(t){e.ciphers.push(t)})},e.editCollections=function(t){s.open({animation:!0,templateUrl:"app/organization/views/organizationVaultCipherCollections.html",controller:"organizationVaultCipherCollectionsController",resolve:{cipher:function(){return t},collections:function(){return e.collections}}}).result.then(function(e){e.collectionIds&&(t.collectionIds=e.collectionIds)})},e.viewEvents=function(e){s.open({animation:!0,templateUrl:"app/organization/views/organizationVaultCipherEvents.html",controller:"organizationVaultCipherEventsController",resolve:{cipher:function(){return e}}})},e.attachments=function(e){c.getUserProfile().then(function(t){return!!t.organizations[e.organizationId].maxStorageGb}).then(function(t){t?s.open({animation:!0,templateUrl:"app/vault/views/vaultAttachments.html",controller:"organizationVaultAttachmentsController",resolve:{cipherId:function(){return e.id}}}).result.then(function(t){e.hasAttachments=t}):s.open({animation:!0,templateUrl:"app/views/paidOrgRequired.html",controller:"paidOrgRequiredController",resolve:{orgId:function(){return e.organizationId}}})})},e.removeCipher=function(e,n){if(confirm("Are you sure you want to remove this item ("+e.name+") from the collection ("+n.name+") ?")){for(var r={collectionIds:[]},a=0;a-1&&e.ciphers.splice(t,1)})}}]),angular.module("bit.organization").controller("organizationVaultEditCipherController",["$scope","apiService","$uibModalInstance","cryptoService","cipherService","passwordService","cipherId","$analytics","orgId","$uibModal","constants",function(e,t,n,o,r,a,i,s,l,c,u){function d(e){var t=$(e.trigger).parent().prev();"text"===t.attr("type")&&t.select()}s.eventTrack("organizationVaultEditCipherController",{category:"Modal"}),e.cipher={},e.hideFolders=e.hideFavorite=e.fromOrg=!0,e.constants=u,t.ciphers.getAdmin({id:i},function(t){e.cipher=r.decryptCipher(t),e.useTotp=e.cipher.organizationUseTotp}),e.save=function(o){var a=r.encryptCipher(o,e.cipher.type);e.savePromise=t.ciphers.putAdmin({id:i},a,function(e){s.eventTrack("Edited Organization Cipher");var t=r.decryptCipherPreview(e);n.close({action:"edit",data:t})}).$promise},e.generatePassword=function(){e.cipher.login.password&&!confirm("Are you sure you want to overwrite the current password?")||(s.eventTrack("Generated Password From Edit"),e.cipher.login.password=a.generatePassword({length:14,special:!0}))},e.addField=function(){e.cipher.login.fields||(e.cipher.login.fields=[]),e.cipher.fields.push({type:u.fieldType.text.toString(),name:null,value:null})},e.removeField=function(t){var n=e.cipher.fields.indexOf(t);n>-1&&e.cipher.fields.splice(n,1)},e.clipboardSuccess=function(e){e.clearSelection(),d(e)},e.clipboardError=function(e,t){t&&d(e),alert("Your web browser does not support easy clipboard copying. Copy it manually instead.")},e.delete=function(){confirm("Are you sure you want to delete this item ("+e.cipher.name+")?")&&t.ciphers.delAdmin({id:e.cipher.id},function(){s.eventTrack("Deleted Organization Cipher From Edit"),n.close({action:"delete",data:e.cipher.id})})},e.close=function(){n.dismiss("cancel")},e.showUpgrade=function(){c.open({animation:!0,templateUrl:"app/views/paidOrgRequired.html",controller:"paidOrgRequiredController",resolve:{orgId:function(){return l}}})}}]),angular.module("bit.tools").controller("reportsBreachController",["$scope","apiService","toastr","authService",function(e,t,n,o){e.loading=!0,e.error=!1,e.breachAccounts=[],e.email=null,e.$on("$viewContentLoaded",function(){o.getUserProfile().then(function(n){return e.email=n.email,t.hibp.get({email:e.email}).$promise}).then(function(t){for(var n=[],o=0;o0,meta:{},icon:null},i=t.Data;if(i){switch(o.name=s.decryptProperty(i.Name,n,!1,!0),o.type){case r.cipherType.login:o.subTitle=s.decryptProperty(i.Username,n,!0,!0),o.meta.password=s.decryptProperty(i.Password,n,!0,!0),o.meta.uri=s.decryptProperty(i.Uri,n,!0,!0),function(e,t,n){if(!s.disableWebsiteIcons&&t){var o=t,r=!1;if(0===o.indexOf("androidapp://")?e.icon="fa-android":0===o.indexOf("iosapp://")?e.icon="fa-apple":-1===o.indexOf("://")&&o.indexOf(".")>-1?(o="http://"+o,r=!0):r=0===o.indexOf("http")&&o.indexOf(".")>-1,n&&r)try{var i=new URL(o);e.meta.image=a.iconsUri+"/"+i.hostname+"/icon.png"}catch(e){}}e.icon||(e.icon="fa-globe")}(o,o.meta.uri,!0);break;case r.cipherType.secureNote:o.subTitle=null,o.icon="fa-sticky-note-o";break;case r.cipherType.card:o.subTitle="",o.meta.number=s.decryptProperty(i.Number,n,!0,!0);var l=s.decryptProperty(i.Brand,n,!0,!0);l&&(o.subTitle=l),o.meta.number&&o.meta.number.length>=4&&(""!==o.subTitle&&(o.subTitle+=", "),o.subTitle+="*"+o.meta.number.substr(o.meta.number.length-4)),o.icon="fa-credit-card";break;case r.cipherType.identity:var c=s.decryptProperty(i.FirstName,n,!0,!0),u=s.decryptProperty(i.LastName,n,!0,!0);o.subTitle="",c&&(o.subTitle=c),u&&(""!==o.subTitle&&(o.subTitle+=" "),o.subTitle+=u),o.icon="fa-id-card-o"}""===o.subTitle&&(o.subTitle=null)}return o},s.decryptAttachment=function(t,n){if(!n)throw"encryptedAttachment is undefined or null";return{id:n.Id,url:n.Url,fileName:e.decrypt(n.FileName,t),size:n.SizeName}},s.downloadAndDecryptAttachment=function(t,r,a){var i=n.defer(),s=new XMLHttpRequest;return s.open("GET",r.url,!0),s.responseType="arraybuffer",s.onload=function(n){s.response?e.decryptFromBytes(s.response,t).then(function(e){if(a){var t=new Blob([e]);if(o.navigator.msSaveOrOpenBlob)o.navigator.msSaveBlob(t,r.fileName);else{var n=o.document.createElement("a");n.href=o.URL.createObjectURL(t),n.download=r.fileName,o.document.body.appendChild(n),n.click(),o.document.body.removeChild(n)}}i.resolve(new Uint8Array(e))}):i.reject("No response")},s.send(null),i.promise},s.decryptFields=function(e,t){var n=[];if(t)for(var o=0;o104857600)){var a=new FileReader;return a.readAsArrayBuffer(o),a.onload=function(n){e.encryptToBytes(n.target.result,t).then(function(n){r.resolve({fileName:e.encrypt(o.name,t),data:new Uint8Array(n),size:o.size})})},a.onerror=function(e){r.reject("Error reading file.")},r.promise}r.reject("Maximum file size is 100 MB.")},s.encryptFields=function(e,t){if(!e||!e.length)return null;for(var n=[],o=0;o2)if(!h(forge.util.decode64(a[2]),g(l+c,n.macKey,!1)))return console.error("MAC failed."),null;var d=forge.util.createBuffer(c),p=forge.cipher.createDecipher("AES-CBC",n.encKey);return p.start({iv:l}),p.update(d),p.finish(),"utf8"===(o=o||"utf8")?p.output.toString("utf8"):p.output.getBytes()}catch(e){throw console.error("Caught unhandled error in decrypt: "+e),e}},u.decryptFromBytes=function(e,n){try{if(!e)throw"no encBuf.";var o=new Uint8Array(e),r=o[0],a=null,i=null,s=null;switch(r){case t.encType.AesCbc128_HmacSha256_B64:case t.encType.AesCbc256_HmacSha256_B64:if(o.length<=49)return console.error("Enc type ("+r+") not valid."),null;i=w(o,1,17),s=w(o,17,49),a=w(o,49);break;case t.encType.AesCbc256_B64:if(o.length<=17)return console.error("Enc type ("+r+") not valid."),null;i=w(o,1,17),a=w(o,17);break;default:return console.error("Enc type ("+r+") not supported."),null}return function(e,t,n,o,r){if(!(r=r||u.getEncKey()||u.getKey()))throw"Encryption key unavailable.";if(r.macKey&&!o)throw"macBuf required for this type of key.";if(e!==r.encType)throw"encType unavailable.";var a=r.getBuffers(),i=null;return p.importKey("raw",a.encKey,{name:"AES-CBC"},!1,["decrypt"]).then(function(e){if(i=e,!r.macKey||!o)return null;var s=new Uint8Array(n.byteLength+t.byteLength);return s.set(new Uint8Array(n),0),s.set(new Uint8Array(t),n.byteLength),f(s.buffer,a.macKey)}).then(function(e){return null===e?null:(t=o,n=e,i=new Uint8Array(32),d.getRandomValues(i),window.crypto.subtle.importKey("raw",i.buffer,{name:"HMAC",hash:{name:"SHA-256"}},!1,["sign"]).then(function(e){return a=e,window.crypto.subtle.sign({name:"HMAC",hash:{name:"SHA-256"}},a,t)}).then(function(e){return r=e,window.crypto.subtle.sign({name:"HMAC",hash:{name:"SHA-256"}},a,n)}).then(function(e){if(r.byteLength!==e.byteLength)return!1;for(var t=new Uint8Array(r),n=new Uint8Array(e),o=0;o1&&!h(forge.util.decode64(a[1]),g(l,o.macKey,!1)))return console.error("MAC failed."),null;if(r===t.encType.Rsa2048_OaepSha256_B64||r===t.encType.Rsa2048_OaepSha256_HmacSha256_B64)s=forge.md.sha256.create();else{if(r!==t.encType.Rsa2048_OaepSha1_B64&&r!==t.encType.Rsa2048_OaepSha1_HmacSha256_B64)throw"encType unavailable.";s=forge.md.sha1.create()}return n.decrypt(l,"RSA-OAEP",{md:s})},v.prototype.getBuffers=function(){if(this.keyBuf)return this.keyBuf;var e=function(e){for(var t=o.atob(e),n=new Uint8Array(t.length),r=0;r"+t+"":""+t+""}function r(e){var t=e.GroupId.substring(0,8);return'"+t+""}function a(e){var t=e.CollectionId.substring(0,8);return'"+t+""}function i(e){var t=e.OrganizationUserId.substring(0,8);return'"+t+""}return n.getDefaultDateFilters=function(){var e=new Date,t=new Date(e.getFullYear(),e.getMonth(),e.getDate(),23,59);return e.setDate(e.getDate()-30),{start:new Date(e.getFullYear(),e.getMonth(),e.getDate(),0,0),end:t}},n.formatDateFilters=function(e,n){var o={start:null,end:null,error:null};try{var r="yyyy-MM-ddTHH:mm";o.start=t("date")(e,r+"Z","UTC"),o.end=t("date")(n,r+":59.999Z","UTC")}catch(e){}return(!o.start||!o.end||o.endg+2&&(f.value=m[a].substr(g+2)),p.fields.push(f)}}}var h=t.type?t.type.toLowerCase():null;switch(h){case"login":case null:case void 0:p.type=e.cipherType.login;var v=t.login_totp||t.totp,y=t.login_uri||t.uri,b=t.login_username||t.username,w=t.login_password||t.password;p.login={totp:v&&""!==v?v:null,uri:y&&""!==y?s(y):null,username:b&&""!==b?b:null,password:w&&""!==w?w:null};break;case"note":p.type=e.cipherType.secureNote,p.secureNote={type:0}}if(o.push(p),d&&n.push({name:t.folder}),u){var C={key:c,value:l};r.push(C)}}),Y(n,o,r)}});break;case"lastpass":d(p,m,g,!1);break;case"safeincloudxml":!function(t,n,o){var r=[],a=[],i=[],l=[],c=0,d=0;u(t,function(t){var u=$(t).find("database");if(u.length){var p=u.find("> label");if(p.length)for(c=0;c card");if(g.length)for(c=0;c field");for(d=0;d200?h.notes+=C+": "+b+"\n":(h.fields||(h.fields=[]),h.fields.push({name:C,value:b,type:e.fieldType.text})))}}var S=f.find("> notes");for(d=0;d label_id")).length){var k=$(p[0]).text(),T=l[k];null!==k&&""!==k&&null!==T&&i.push({key:a.length-1,value:T})}}}n(r,a,i)}else o()},o)}(p,m,g);break;case"keepass2xml":!function(t,n,o){var r=[],a=[],s=[];u(t,function(t){var l=$(t).find("Root");if(l.length){var c=l.find("> Group");c.length&&(!function t(n,o,l){var c=r.length;var u=l;o||(""!==u&&(u+=" > "),u+=n.find("> Name").text(),r.push({name:u}));var d=n.find("> Entry");if(d.length)for(var p=0;p String"),v=0;v Key").text(),w=y.find("> Value").text();if(""!==w)switch(b){case"URL":f.login.uri=i(w);break;case"UserName":f.login.username=w;break;case"Password":f.login.password=w;break;case"Title":f.name=w;break;case"Notes":f.notes=null===f.notes?w+"\n":f.notes+w+"\n";break;default:w.length>200||w.indexOf("\n")>-1?(f.notes||(f.notes=""),f.notes+=b+": "+w+"\n"):(f.fields||(f.fields=[]),f.fields.push({name:b,value:w,type:e.fieldType.text}))}}null===f.name&&(f.name="--"),a.push(f),o||s.push({key:g,value:c})}var C=n.find("> Group");if(C.length)for(var S=0;S "):null,l=n.length,c=o.length,u=null!==s,d=u,p=0;if(u)for(p=0;p-1||l.length>200?(null===n.notes?n.notes="":n.notes+="\n",n.notes+=c+": "+l.split("\\r\\n").join("\n").split("\\n").join("\n")):(n.fields||(n.fields=[]),n.fields.push({name:c,value:l,type:e.fieldType.text}))}}}}c(t,function(t){var o=t.split(/(?:\r\n|\r|\n)/);for(s=0;s=6){var i=n.length,l=o.length,c=t[0]&&""!==t[0],u=c,d=0;if(c)for(d=0;d6)for(d=6;d200?(p.notes||(p.notes=""),p.notes+=t[d]+": "+t[d+1]+"\n"):(p.fields||(p.fields=[]),p.fields.push({name:t[d],value:t[d+1],type:e.fieldType.text}));if(o.push(p),u&&n.push({name:t[0]}),c){var m={key:l,value:i};r.push(m)}}}),D(n,o,r)}});break;case"passworddragonxml":!function(t,n,o){var r=[],a=[],i=[],l=0;u(t,function(t){var c=$(t).find("PasswordManager");if(c.length){var u=c.find("> record");if(u.length)for(var d=0;d Account-Name"),g=m.length?$(m):null,f=p.find("> User-Id"),h=f.length?$(f):null,v=p.find("> Password"),y=v.length?$(v):null,b=p.find("> URL"),w=b.length?$(b):null,C=p.find("> Notes"),S=C.length?$(C):null,k=p.find("> Category"),T=k.length?$(k):null,P=T?T.text():null,I=r.length,E=a.length,z=P&&""!==P&&"Unfiled"!==P,O=z;if(z)for(l=0;l Attribute-"+l,l<10&&(U+=", ");var x=p.find(U);if(x.length)for(l=0;l200?(A.notes||(A.notes=""),A.notes+=F+": "+M+"\n"):(A.fields||(A.fields=[]),A.fields.push({name:F,value:M,type:e.fieldType.text})))}if(a.push(A),O&&r.push({name:P}),z){var G={key:E,value:I};i.push(G)}}n(r,a,i)}else o()},o)}(p,m,g);break;case"enpasscsv":A=p,U=m,Papa.parse(A,{encoding:"UTF-8",complete:function(t){l(t);for(var n=[],o=0;o2&&r.length%2==0)for(var c=0;c200?(i.notes||(i.notes=""),i.notes+=d+": "+u+"\n"):(i.fields||(i.fields=[]),i.fields.push({name:d,value:u,type:e.fieldType.text})):i.login.totp=u:i.login.password=u:i.login.username=u:i.login.uri=s(u)}}n.push(i)}}U([],n,[])}});break;case"pwsafexml":!function(t,n,o){var r=[],a=[],i=[],l=0;u(t,function(t){var c=$(t).find("passwordsafe");if(c.length){var u=c.attr("delimiter"),d=c.find("> entry");if(d.length)for(var p=0;p title"),f=g.length?$(g):null,h=m.find("> username"),v=h.length?$(h):null,y=m.find("> email"),b=y.length?$(y):null,w=b?b.text():null,C=m.find("> password"),S=C.length?$(C):null,k=m.find("> url"),T=k.length?$(k):null,P=m.find("> notes"),I=P.length?$(P):null,E=I?I.text().split(u).join("\n"):null,z=m.find("> group"),O=z.length?$(z):null,A=O?O.text().split(".").join(" > "):null,U=r.length,x=a.length,D=A&&""!==A,F=D;if(D)for(l=0;l Groups > Group[ID="'+t+'"]');if(o.length){n&&""!==n&&(n=" > "+n),n=o.attr("Name")+n;var r=o.attr("ParentID");return c(e,r,n)}return n}u(t,function(t){var u=$(t).find("root > Database");if(u.length){var d=u.find("> Logins > Login");if(d.length)for(var p=0;p Accounts > Account > LoginLinks > Login[SourceLoginID="'+h+'"]');if(S.length){var k=S.parent().parent();k.length&&(v=k.attr("Name"),y=k.attr("Link"),w=k.attr("ParentID"),(b=k.attr("Comments"))&&(b=b.split("/n").join("\n")))}}w&&""!==w&&(C=c(u,w,""));var T=r.length,P=a.length,I=C&&""!==C,E=I;if(I)for(l=0;l=3){var i=n.length,l=o.length,c=t[0]&&""!==t[0]&&"Unassigned"!==t[0],u=c,d=0;if(c)for(d=0;d3)for(var m=3;m200?(o.notes||(o.notes=""),o.notes+=r+": "+t[r]+"\n"):(o.fields||(o.fields=[]),o.fields.push({name:r,value:t[r],type:e.fieldType.text})));T.push(o)}),S(k,T,[])}});break;case"clipperzhtml":!function(t,r,i){var l=[],u=[];c(t,function(t){var i=$(t).find("textarea"),c=i&&i.length?i.val():null,d=c?JSON.parse(c):null;if(d&&d.length)for(var p=0;p200?(g.notes||(g.notes=""),g.notes+=h.label+": "+h.value+"\n"):(g.fields||(g.fields=[]),g.fields.push({name:h.label,value:h.value,type:e.fieldType.text}))}}""===g.notes&&(g.notes=null),u.push(g)}r(l,u,[])},i)}(p,m,g);break;case"avirajson":!function(t,n,o){var r=[],a=[],s=0;c(t,function(t){var o=JSON.parse(t);if(o&&o.accounts)for(s=0;s").join("")).find("table.nobr");if(s.length)for(var c=0;c200?(p.notes||(p.notes=""),p.notes+=h+": "+v+"\n"):(p.fields||(p.fields=[]),p.fields.push({name:h,value:v,type:e.fieldType.text}))}p.notes&&""!==p.notes||(p.notes=null),p.name&&""!==p.name||(p.name="--"),u.push(p)}r(l,u,[])},s)}(p,m,g);break;case"saferpasscsv":!function(t,n,o){var r=[],a=[];Papa.parse(t,{header:!0,encoding:"UTF-8",complete:function(t){l(t),angular.forEach(t.data,function(t,n){var o,r;a.push({type:e.cipherType.login,favorite:!1,notes:t.notes&&""!==t.notes?t.notes:null,name:t.url&&""!==t.url?(o=t.url,r=document.createElement("a"),r.href=o,r.hostname.startsWith("www.")?r.hostname.replace("www.",""):r.hostname):"--",login:{uri:t.url&&""!==t.url?s(t.url):null,username:t.username&&""!==t.username?t.username:null,password:t.password&&""!==t.password?t.password:null}})}),n(r,a,[])}})}(p,m);break;case"ascendocsv":b=p,w=m,Papa.parse(b,{encoding:"UTF-8",complete:function(t){l(t);for(var s=[],c=0;c2&&u.length%2==0)for(var m=0;m200?(p.notes||(p.notes=""),p.notes+=f+": "+g+"\n"):(p.fields||(p.fields=[]),p.fields.push({name:f,value:g,type:e.fieldType.text})))}s.push(p)}}w([],s,[])}});break;case"passwordbossjson":!function(t,n,o){var r=[],a=[],s=0;c(t,function(t){var o=JSON.parse(t);if(o&&o.length)for(s=0;s200?(c.notes||(c.notes=""),c.notes+=u+": "+d+"\n"):(c.fields||(c.fields=[]),c.fields.push({name:u,value:d,type:e.fieldType.text}))}""===c.notes&&(c.notes=null),a.push(c)}}n(r,a,[])},o)}(p,m,g);break;case"zohovaultcsv":!function(t,n,o){function r(t,n){if(t&&""!==t)for(var o=t.split(/(?:\r\n|\r|\n)/),r=0;ri?a.substring(i+1):null;if(s&&""!==s&&l&&""!==l&&"SecretType"!==s){var c=s.toLowerCase();"user name"===c?n.login.username=l:"password"===c?n.login.password=l:l.length>200?(n.notes||(n.notes=""),n.notes+=s+": "+l+"\n"):(n.fields||(n.fields=[]),n.fields.push({name:s,value:l,type:e.fieldType.text}))}}}}Papa.parse(t,{header:!0,encoding:"UTF-8",complete:function(t){l(t);var o=[],a=[],s=[];angular.forEach(t.data,function(t,n){var l=t.ChamberName,c=o.length,u=a.length,d=l&&""!==l,p=d,m=0;if(d)for(m=0;m2&&a(2,c,b),b.name&&"--"!==b.name&&"Web Logins"!==p&&"Servers"!==p&&"Email Accounts"!==p&&(b.name=p+": "+b.name),""===b.notes&&(b.notes=null),o.push(b),h&&n.push({name:u}),f){var w={key:g,value:m};r.push(w)}}y(n,o,r)}});break;case"meldiumcsv":f=p,h=m,Papa.parse(f,{header:!0,encoding:"UTF-8",complete:function(t){l(t);for(var n=[],o=0;o30&&(m.name=m.name.substring(0,30)),p.attributes)p.attributes.hasOwnProperty(g)&&"username_value"!==g&&"xdg:schema"!==g&&(""!==m.notes&&(m.notes+="\n"),m.notes+=g+": "+p.attributes[g]);""===m.notes&&(m.notes=null),a.push(m),s.push({key:u,value:c})}}n(r,a,s)},o)}(p,m,g);break;default:g()}else g()},t.importOrg=function(t,n,o,r){var a,i;if(n)switch(t){case"bitwardencsv":a=n,i=o,Papa.parse(a,{header:!0,encoding:"UTF-8",complete:function(t){l(t);var n,o=[],r=[],a=[];angular.forEach(t.data,function(t,i){var l=r.length;if(t.collections&&""!==t.collections){var c=t.collections.split(",");for(n=0;nf+2&&(h.value=g[n].substr(f+2)),m.fields.push(h)}}}var v=t.type?t.type.toLowerCase():null;switch(v){case"login":case null:case void 0:m.type=e.cipherType.login;var y=t.login_totp||t.totp,b=t.login_uri||t.uri,w=t.login_username||t.username,C=t.login_password||t.password;m.login={totp:y&&""!==y?y:null,uri:b&&""!==b?s(b):null,username:w&&""!==w?w:null,password:C&&""!==C?C:null};break;case"note":m.type=e.cipherType.secureNote,m.secureNote={type:0}}r.push(m)}),i(o,r,a)}});break;case"lastpass":d(n,o,r,!0);break;default:r()}else r()};var n=["password","pass word","passphrase","pass phrase","pass","code","code word","codeword","secret","secret word","personpwd","key","keyword","key word","keyphrase","key phrase","form_pw","wppassword","pin","pwd","pw","pword","passwd","p","serial","serial#","license key","reg #","passwort"],o=["user","name","user name","username","login name","email","e-mail","id","userid","user id","login","form_loginname","wpname","mail","loginid","login id","log","personlogin","first name","last name","card#","account #","member","member #","nom","benutzername"],r=["url","hyper link","hyperlink","link","host","hostname","host name","server","address","hyper ref","href","web","website","web site","site","web-site","uri","ort","adresse"];function a(e,t){if(!e||""===e)return!1;e=e.trim().toLowerCase();for(var n=0;n=0&&(e="http://"+e),s(e)}function s(e){return e.length>1e3?e.substring(0,1e3):e}function l(e){if(e.errors&&e.errors.length)for(var t=0;t-1||!a[1]||""===a[1]||("Notes"===a[0]?o.notes?o.notes+="\n"+a[1]:o.notes=a[1]:t.hasOwnProperty(a[0])?o.dataObj[t[a[0]]]=a[1]:(o.notes?o.notes+="\n":o.notes="",o.notes+=a[0]+": "+a[1]))}return o}function c(e){var t={cardholderName:e.ccname&&""!==e.ccname?e.ccname:null,number:e.ccnum&&""!==e.ccnum?e.ccnum:null,brand:e.ccnum&&""!==e.ccnum?function(e){if(!e)return null;var t=new RegExp("^4");return null!=e.match(t)?"Visa":/^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$/.test(e)?"Mastercard":(t=new RegExp("^3[47]"),null!=e.match(t)?"Amex":(t=new RegExp("^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)"),null!=e.match(t)?"Discover":(t=new RegExp("^36"),null!=e.match(t)?"Diners Club":(t=new RegExp("^30[0-5]"),null!=e.match(t)?"Diners Club":(t=new RegExp("^35(2[89]|[3-8][0-9])"),null!=e.match(t)?"JCB":(t=new RegExp("^(4026|417500|4508|4844|491(3|7))"),null!=e.match(t)?"Visa":null))))))}(e.ccnum):null,code:e.cccsc&&""!==e.cccsc?e.cccsc:null};if(e.ccexp&&""!==e.ccexp&&e.ccexp.indexOf("-")>-1){var n=e.ccexp.split("-");n.length>1&&(t.expYear=n[0],t.expMonth=n[1],2===t.expMonth.length&&"0"===t.expMonth[0]&&(t.expMonth=t.expMonth[1]))}return t}function u(t){var o=[],a=[],l=[],u=0;angular.forEach(t,function(t,n){var d,p=o.length,m=a.length,g=t.grouping&&""!==t.grouping&&"(none)"!==t.grouping,f=g;if(g)for(u=0;u1&&"NoteType"===y[0]&&("Credit Card"===y[1]||"Address"===y[1])){var b=null;"Credit Card"===y[1]?(b=i(h,{Number:"number","Name on Card":"cardholderName","Security Code":"code"},[]),d.type=e.cipherType.card,d.card=b.dataObj):"Address"===y[1]&&(b=i(h,{Title:"title","First Name":"firstName","Last Name":"lastName","Middle Name":"middleName",Company:"company","Address 1":"address1","Address 2":"address2","Address 3":"address3","City / Town":"city",State:"state","Zip / Postal Code":"postalCode",Country:"country","Email Address":"email",Username:"username"},[]),d.type=e.cipherType.identity,d.identity=b.dataObj),v=!0,d.notes=b.notes}}v||(d.secureNote={type:0},d.notes=t.extra&&""!==t.extra?t.extra:null)}else if(d.type===e.cipherType.card)d.card=c(t),d.notes=t.notes&&""!==t.notes?t.notes:null;else if(d.type===e.cipherType.identity&&(d.identity={title:t.title&&""!==t.title?t.title:null,firstName:t.firstname&&""!==t.firstname?t.firstname:null,middleName:t.middlename&&""!==t.middlename?t.middlename:null,lastName:t.lastname&&""!==t.lastname?t.lastname:null,username:t.username&&""!==t.username?t.username:null,company:t.company&&""!==t.company?t.company:null,ssn:t.ssn&&""!==t.ssn?t.ssn:null,address1:t.address1&&""!==t.address1?t.address1:null,address2:t.address2&&""!==t.address2?t.address2:null,address3:t.address3&&""!==t.address3?t.address3:null,city:t.city&&""!==t.city?t.city:null,state:t.state&&""!==t.state?t.state:null,postalCode:t.zip&&""!==t.zip?t.zip:null,country:t.country&&""!==t.country?t.country:null,email:t.email&&""!==t.email?t.email:null,phone:t.phone&&""!==t.phone?t.phone:null},d.notes=t.notes&&""!==t.notes?t.notes:null,d.identity.title&&(d.identity.title=d.identity.title.charAt(0).toUpperCase()+d.identity.title.slice(1)),t.ccnum&&""!==t.ccnum)){var w=JSON.parse(JSON.stringify(d));w.identity=null,w.type=e.cipherType.card,w.card=c(t),a.push(w)}if(a.push(d),f&&o.push({name:t.grouping}),g){var C={key:m,value:p};l.push(C)}}),n(o,a,l)}}return t}]),angular.module("bit.services").factory("passwordService",function(){var e={};function t(e,n){var o=0,r=n-e,a=Math.ceil(Math.log2(r));if(a>53)throw new Exception("We cannot generate numbers larger than 53 bits.");var i=Math.ceil(a/8),s=Math.pow(2,a)-1,l=new Uint8Array(i);window.crypto.getRandomValues(l);for(var c=8*(i-1),u=0;u=r?t(e,n):e+o}return e.generatePassword=function(e){var n=angular.extend({},{length:10,ambiguous:!1,number:!0,minNumber:1,uppercase:!0,minUppercase:1,lowercase:!0,minLowercase:1,special:!1,minSpecial:1},e);n.uppercase&&n.minUppercase<0&&(n.minUppercase=1),n.lowercase&&n.minLowercase<0&&(n.minLowercase=1),n.number&&n.minNumber<0&&(n.minNumber=1),n.special&&n.minSpecial<0&&(n.minSpecial=1),(!n.length||n.length<1)&&(n.length=10);var o=n.minUppercase+n.minLowercase+n.minNumber+n.minSpecial;n.length0)for(var a=0;a0)for(var i=0;i0)for(var s=0;s0)for(var l=0;l=0?e.deviceType.vivaldi:window.chrome&&window.chrome.webstore?e.deviceType.chrome:"undefined"!=typeof InstallTrigger?e.deviceType.firefox:window.opr&&opr.addons||window.opera||navigator.userAgent.indexOf(" OPR/")>=0?e.deviceType.firefox:/constructor/i.test(window.HTMLElement)||"[object SafariRemoteNotification]"===(!window.safari||"undefined"!=typeof safari&&safari.pushNotification).toString()?e.deviceType.opera:document.documentMode?e.deviceType.ie:window.StyleMedia?e.deviceType.edge:e.deviceType.unknown)},n}]),angular.module("bit.services").factory("validationService",function(){var e={addErrors:function(t,n){var o=n.data,r="An unexpected error has occurred.";if(t.$errors=[],o&&angular.isObject(o))if(o&&o.ErrorModel&&(o=o.ErrorModel),o.ValidationErrors){for(var a in o.ValidationErrors)if(o.ValidationErrors.hasOwnProperty(a))for(var i=0;i-1&&e.model.organizations.splice(n,1),r.success("You have left the organization."),c()})},function(e){r.error("Unable to leave this organization."),c()})},e.sessions=function(){n.open({animation:!0,templateUrl:"app/settings/views/settingsSessions.html",controller:"settingsSessionsController"})},e.delete=function(){n.open({animation:!0,templateUrl:"app/settings/views/settingsDelete.html",controller:"settingsDeleteController"})},e.purge=function(){n.open({animation:!0,templateUrl:"app/settings/views/settingsPurge.html",controller:"settingsPurgeController"})}}]),angular.module("bit.settings").controller("settingsCreateOrganizationController",["$scope","$state","apiService","cryptoService","toastr","$analytics","authService","constants","appSettings","validationService",function(e,t,n,o,r,a,i,s,l,c){e.plans=s.plans,e.storageGb=s.storageGb,e.paymentMethod="card",e.selfHosted=l.selfHosted,e.model={plan:"free",additionalSeats:0,interval:"year",ownedBusiness:!1,additionalStorageGb:null},e.totalPrice=function(){return"month"===e.model.interval?(e.model.additionalSeats||0)*(e.plans[e.model.plan].monthlySeatPrice||0)+(e.model.additionalStorageGb||0)*e.storageGb.monthlyPrice+(e.plans[e.model.plan].monthlyBasePrice||0):(e.model.additionalSeats||0)*(e.plans[e.model.plan].annualSeatPrice||0)+(e.model.additionalStorageGb||0)*e.storageGb.yearlyPrice+(e.plans[e.model.plan].annualBasePrice||0)},e.changePaymentMethod=function(t){e.paymentMethod=t},e.changedPlan=function(){e.plans[e.model.plan].hasOwnProperty("monthPlanType")&&(e.model.interval="year"),e.plans[e.model.plan].noAdditionalSeats?e.model.additionalSeats=0:e.model.additionalSeats||e.plans[e.model.plan].baseSeats||e.plans[e.model.plan].noAdditionalSeats||(e.model.additionalSeats=1)},e.changedBusiness=function(){e.model.ownedBusiness&&(e.model.plan="teams")},e.submit=function(s,l){var u=o.makeShareKey(),d=o.encrypt("Default Collection",u.key);if(e.selfHosted){var p=document.getElementById("file").files;if(!p||!p.length)return void c.addError(l,"file","Select a license file.",!0);var m=new FormData;m.append("license",p[0]),m.append("key",u.ct),m.append("collectionName",d),e.submitPromise=n.organizations.postLicense(m).$promise.then(h)}else if("free"===s.plan){var g={name:s.name,planType:s.plan,key:u.ct,billingEmail:s.billingEmail,collectionName:d};e.submitPromise=n.organizations.post(g).$promise.then(h)}else{var f=null;if("card"===e.paymentMethod)f=stripe.card.createToken(s.card);else{if("bank"!==e.paymentMethod)return;s.bank.currency="USD",s.bank.country="US",f=stripe.bankAccount.createToken(s.bank)}e.submitPromise=f.then(function(t){var o={name:s.name,planType:"month"===s.interval?e.plans[s.plan].monthPlanType:e.plans[s.plan].annualPlanType,key:u.ct,paymentToken:t.id,additionalSeats:s.additionalSeats,additionalStorageGb:s.additionalStorageGb,billingEmail:s.billingEmail,businessName:s.ownedBusiness?s.businessName:null,country:"card"===e.paymentMethod?s.card.address_country:null,collectionName:d};return n.organizations.post(o).$promise},function(e){throw e.message}).then(h)}function h(e){a.eventTrack("Created Organization"),i.addProfileOrganizationOwner(e,u.ct),i.refreshAccessToken().then(function(){v(e.Id)},function(){v(e.Id)})}function v(e){t.go("backend.org.dashboard",{orgId:e}).then(function(){r.success("Your new organization is ready to go!","Organization Created")})}}}]),angular.module("bit.settings").controller("settingsDeleteController",["$scope","$state","apiService","$uibModalInstance","cryptoService","authService","toastr","$analytics","tokenService",function(e,t,n,o,r,a,i,s,l){s.eventTrack("settingsDeleteController",{category:"Modal"}),e.submit=function(c){var u;e.submitPromise=a.getUserProfile().then(function(e){return u=e,r.hashPassword(c.masterPassword)}).then(function(e){return n.accounts.postDelete({masterPasswordHash:e}).$promise}).then(function(){return o.dismiss("cancel"),a.logOut(),l.clearTwoFactorToken(u.email),s.eventTrack("Deleted Account"),t.go("frontend.login.info")}).then(function(){i.success("Your account has been closed and all associated data has been deleted.","Account Deleted")})},e.close=function(){o.dismiss("cancel")}}]),angular.module("bit.settings").controller("settingsDomainsController",["$scope","$state","apiService","toastr","$analytics","$uibModal",function(e,t,n,o,r,a){e.globalEquivalentDomains=[],e.equivalentDomains=[],n.settings.getDomains({},function(t){var n;if(t.EquivalentDomains)for(n=0;n

bitwarden two-step login recovery code:

'+e.code+'