From 34ea10475d316ccb2ca4cd2cac67b61c4cdfb62a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Garc=C3=ADa?= Date: Tue, 27 Apr 2021 23:18:32 +0200 Subject: [PATCH 1/2] Project renaming --- .env.template | 10 +- .github/ISSUE_TEMPLATE/bug_report.md | 14 +-- .github/ISSUE_TEMPLATE/config.yml | 4 +- .github/workflows/build.yml | 8 +- Cargo.lock | 102 +++++++++--------- Cargo.toml | 4 +- README.md | 29 +++-- docker/Dockerfile.buildx | 2 +- docker/Dockerfile.j2 | 24 ++--- docker/amd64/Dockerfile | 18 ++-- docker/amd64/Dockerfile.alpine | 18 ++-- docker/arm64/Dockerfile | 18 ++-- docker/armv6/Dockerfile | 18 ++-- docker/armv7/Dockerfile | 18 ++-- docker/armv7/Dockerfile.alpine | 18 ++-- docker/start.sh | 10 +- hooks/README.md | 2 +- hooks/build | 2 +- hooks/push | 2 +- src/api/admin.rs | 6 +- src/api/core/accounts.rs | 2 +- src/api/core/ciphers.rs | 2 +- src/api/core/two_factor/duo.rs | 2 +- src/config.rs | 8 +- src/db/models/cipher.rs | 2 +- src/main.rs | 16 +-- src/static/templates/admin/base.hbs | 4 +- src/static/templates/admin/diagnostics.hbs | 8 +- src/static/templates/admin/settings.hbs | 4 +- src/static/templates/email/change_email.hbs | 2 +- .../templates/email/change_email.html.hbs | 4 +- src/static/templates/email/delete_account.hbs | 2 +- .../templates/email/delete_account.html.hbs | 4 +- .../templates/email/invite_accepted.hbs | 4 +- .../templates/email/invite_accepted.html.hbs | 6 +- .../templates/email/invite_confirmed.hbs | 2 +- .../templates/email/invite_confirmed.html.hbs | 4 +- .../templates/email/new_device_logged_in.hbs | 2 +- .../email/new_device_logged_in.html.hbs | 4 +- src/static/templates/email/pw_hint_none.hbs | 2 +- .../templates/email/pw_hint_none.html.hbs | 4 +- src/static/templates/email/pw_hint_some.hbs | 2 +- .../templates/email/pw_hint_some.html.hbs | 4 +- .../templates/email/send_org_invite.hbs | 2 +- .../templates/email/send_org_invite.html.hbs | 4 +- src/static/templates/email/smtp_test.hbs | 4 +- src/static/templates/email/smtp_test.html.hbs | 6 +- .../templates/email/twofactor_email.hbs | 2 +- .../templates/email/twofactor_email.html.hbs | 4 +- src/static/templates/email/verify_email.hbs | 2 +- .../templates/email/verify_email.html.hbs | 4 +- src/static/templates/email/welcome.hbs | 2 +- src/static/templates/email/welcome.html.hbs | 4 +- .../templates/email/welcome_must_verify.hbs | 2 +- .../email/welcome_must_verify.html.hbs | 4 +- src/util.rs | 2 +- 56 files changed, 231 insertions(+), 232 deletions(-) diff --git a/.env.template b/.env.template index e4d0b1e1..3af3a049 100644 --- a/.env.template +++ b/.env.template @@ -1,4 +1,4 @@ -## Bitwarden_RS Configuration File +## Vaultwarden Configuration File ## Uncomment any of the following lines to change the defaults ## ## Be aware that most of these settings will be overridden if they were changed @@ -99,7 +99,7 @@ ## Enable WAL for the DB ## Set to false to avoid enabling WAL during startup. ## Note that if the DB already has WAL enabled, you will also need to disable WAL in the DB, -## this setting only prevents bitwarden_rs from automatically enabling it on start. +## this setting only prevents vaultwarden from automatically enabling it on start. ## Please read project wiki page about this setting first before changing the value as it can ## cause performance degradation or might render the service unable to start. # ENABLE_DB_WAL=true @@ -187,7 +187,7 @@ ## Invitations org admins to invite users, even when signups are disabled # INVITATIONS_ALLOWED=true ## Name shown in the invitation emails that don't come from a specific organization -# INVITATION_ORG_NAME=Bitwarden_RS +# INVITATION_ORG_NAME=Vaultwarden ## Per-organization attachment limit (KB) ## Limit in kilobytes for an organization attachments, once the limit is exceeded it won't be possible to upload more @@ -259,8 +259,8 @@ ## To make sure the email links are pointing to the correct host, set the DOMAIN variable. ## Note: if SMTP_USERNAME is specified, SMTP_PASSWORD is mandatory # SMTP_HOST=smtp.domain.tld -# SMTP_FROM=bitwarden-rs@domain.tld -# SMTP_FROM_NAME=Bitwarden_RS +# SMTP_FROM=vaultwarden@domain.tld +# SMTP_FROM_NAME=Vaultwarden # SMTP_PORT=587 # Ports 587 (submission) and 25 (smtp) are standard without encryption and with encryption via STARTTLS (Explicit TLS). Port 465 is outdated and used with Implicit TLS. # SMTP_SSL=true # (Explicit) - This variable by default configures Explicit STARTTLS, it will upgrade an insecure connection to a secure one. Unless SMTP_EXPLICIT_TLS is set to true. Either port 587 or 25 are default. # SMTP_EXPLICIT_TLS=true # (Implicit) - N.B. This variable configures Implicit TLS. It's currently mislabelled (see bug #851) - SMTP_SSL Needs to be set to true for this option to work. Usually port 465 is used here. diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md index 8c79cf2d..128c5f58 100644 --- a/.github/ISSUE_TEMPLATE/bug_report.md +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -1,6 +1,6 @@ --- name: Bug report -about: Use this ONLY for bugs in bitwarden_rs itself. Use the Discourse forum (link below) to request features or get help with usage/configuration. If in doubt, use the forum. +about: Use this ONLY for bugs in vaultwarden itself. Use the Discourse forum (link below) to request features or get help with usage/configuration. If in doubt, use the forum. title: '' labels: '' assignees: '' @@ -8,11 +8,11 @@ assignees: '' --- @@ -37,9 +37,9 @@ such as passwords, IP addresses, and DNS names as appropriate. --> - + -* bitwarden_rs version: +* vaultwarden version: * Install method: @@ -54,7 +54,7 @@ such as passwords, IP addresses, and DNS names as appropriate. ### Steps to reproduce +and how did you start vaultwarden? --> ### Expected behaviour diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 072be117..7ecd420d 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -3,6 +3,6 @@ contact_links: - name: Discourse forum for bitwarden_rs url: https://bitwardenrs.discourse.group/ about: Use this forum to request features or get help with usage/configuration. - - name: GitHub Discussions for bitwarden_rs - url: https://github.com/dani-garcia/bitwarden_rs/discussions + - name: GitHub Discussions for vaultwarden + url: https://github.com/dani-garcia/vaultwarden/discussions about: An alternative to the Discourse forum, if this is easier for you. diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 9b476d3e..bcb16381 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -133,8 +133,8 @@ jobs: - name: Upload artifact uses: actions/upload-artifact@v2 with: - name: bitwarden_rs-${{ matrix.target-triple }}${{ matrix.ext }} - path: target/${{ matrix.target-triple }}/release/bitwarden_rs${{ matrix.ext }} + name: vaultwarden-${{ matrix.target-triple }}${{ matrix.ext }} + path: target/${{ matrix.target-triple }}/release/vaultwarden${{ matrix.ext }} # End Upload artifact to Github Actions @@ -145,7 +145,7 @@ jobs: # uses: Shopify/upload-to-release@1 # if: startsWith(github.ref, 'refs/tags/') # with: - # name: bitwarden_rs-${{ matrix.target-triple }}${{ matrix.ext }} - # path: target/${{ matrix.target-triple }}/release/bitwarden_rs${{ matrix.ext }} + # name: vaultwarden-${{ matrix.target-triple }}${{ matrix.ext }} + # path: target/${{ matrix.target-triple }}/release/vaultwarden${{ matrix.ext }} # repo-token: ${{ secrets.GITHUB_TOKEN }} # End Upload to github actions release diff --git a/Cargo.lock b/Cargo.lock index 972ae95d..1b89140a 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -144,57 +144,6 @@ dependencies = [ "wyz", ] -[[package]] -name = "bitwarden_rs" -version = "1.0.0" -dependencies = [ - "backtrace", - "chashmap", - "chrono", - "chrono-tz", - "data-encoding", - "data-url", - "diesel", - "diesel_migrations", - "dotenv", - "fern", - "handlebars", - "html5ever", - "idna 0.2.2", - "job_scheduler", - "jsonwebtoken", - "lettre", - "libsqlite3-sys", - "log 0.4.14", - "markup5ever_rcdom", - "multipart", - "newline-converter", - "num-derive", - "num-traits", - "oath", - "once_cell", - "openssl", - "parity-ws", - "paste", - "percent-encoding 2.1.0", - "pico-args", - "rand 0.8.3", - "regex", - "reqwest", - "ring", - "rmpv", - "rocket", - "rocket_contrib", - "serde", - "serde_json", - "syslog", - "time 0.2.26", - "tracing", - "u2f", - "uuid", - "yubico", -] - [[package]] name = "block-buffer" version = "0.7.3" @@ -3114,6 +3063,57 @@ dependencies = [ "getrandom 0.2.2", ] +[[package]] +name = "vaultwarden" +version = "1.0.0" +dependencies = [ + "backtrace", + "chashmap", + "chrono", + "chrono-tz", + "data-encoding", + "data-url", + "diesel", + "diesel_migrations", + "dotenv", + "fern", + "handlebars", + "html5ever", + "idna 0.2.2", + "job_scheduler", + "jsonwebtoken", + "lettre", + "libsqlite3-sys", + "log 0.4.14", + "markup5ever_rcdom", + "multipart", + "newline-converter", + "num-derive", + "num-traits", + "oath", + "once_cell", + "openssl", + "parity-ws", + "paste", + "percent-encoding 2.1.0", + "pico-args", + "rand 0.8.3", + "regex", + "reqwest", + "ring", + "rmpv", + "rocket", + "rocket_contrib", + "serde", + "serde_json", + "syslog", + "time 0.2.26", + "tracing", + "u2f", + "uuid", + "yubico", +] + [[package]] name = "vcpkg" version = "0.2.11" diff --git a/Cargo.toml b/Cargo.toml index ee96b082..67dea2fa 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,10 +1,10 @@ [package] -name = "bitwarden_rs" +name = "vaultwarden" version = "1.0.0" authors = ["Daniel GarcĂ­a "] edition = "2018" -repository = "https://github.com/dani-garcia/bitwarden_rs" +repository = "https://github.com/dani-garcia/vaultwarden" readme = "README.md" license = "GPL-3.0-only" publish = false diff --git a/README.md b/README.md index 6b80b3b9..a6003b44 100644 --- a/README.md +++ b/README.md @@ -1,15 +1,14 @@ -### This is a Bitwarden server API implementation written in Rust compatible with [upstream Bitwarden clients](https://bitwarden.com/#download)*, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal. +### Alternative implementation of the Bitwarden server API written in Rust and compatible with [upstream Bitwarden clients](https://bitwarden.com/#download)*, perfect for self-hosted deployment where running the official resource-heavy service might not be ideal. --- -[![Travis Build Status](https://travis-ci.org/dani-garcia/bitwarden_rs.svg?branch=master)](https://travis-ci.org/dani-garcia/bitwarden_rs) -[![Docker Pulls](https://img.shields.io/docker/pulls/bitwardenrs/server.svg)](https://hub.docker.com/r/bitwardenrs/server) -[![Dependency Status](https://deps.rs/repo/github/dani-garcia/bitwarden_rs/status.svg)](https://deps.rs/repo/github/dani-garcia/bitwarden_rs) -[![GitHub Release](https://img.shields.io/github/release/dani-garcia/bitwarden_rs.svg)](https://github.com/dani-garcia/bitwarden_rs/releases/latest) -[![GPL-3.0 Licensed](https://img.shields.io/github/license/dani-garcia/bitwarden_rs.svg)](https://github.com/dani-garcia/bitwarden_rs/blob/master/LICENSE.txt) -[![Matrix Chat](https://img.shields.io/matrix/bitwarden_rs:matrix.org.svg?logo=matrix)](https://matrix.to/#/#bitwarden_rs:matrix.org) +[![Docker Pulls](https://img.shields.io/docker/pulls/bitwardenrs/server.svg)](https://hub.docker.com/r/vaultwarden/server) +[![Dependency Status](https://deps.rs/repo/github/dani-garcia/vaultwarden/status.svg)](https://deps.rs/repo/github/dani-garcia/vaultwarden) +[![GitHub Release](https://img.shields.io/github/release/dani-garcia/vaultwarden.svg)](https://github.com/dani-garcia/vaultwarden/releases/latest) +[![GPL-3.0 Licensed](https://img.shields.io/github/license/dani-garcia/vaultwarden.svg)](https://github.com/dani-garcia/vaultwarden/blob/master/LICENSE.txt) +[![Matrix Chat](https://img.shields.io/matrix/vaultwarden:matrix.org.svg?logo=matrix)](https://matrix.to/#/#vaultwarden:matrix.org) -Image is based on [Rust implementation of Bitwarden API](https://github.com/dani-garcia/bitwarden_rs). +Image is based on [Rust implementation of Bitwarden API](https://github.com/dani-garcia/vaultwarden). **This project is not associated with the [Bitwarden](https://bitwarden.com/) project nor 8bit Solutions LLC.** @@ -33,26 +32,26 @@ Basically full implementation of Bitwarden API is provided including: Pull the docker image and mount a volume from the host for persistent storage: ```sh -docker pull bitwardenrs/server:latest -docker run -d --name bitwarden -v /bw-data/:/data/ -p 80:80 bitwardenrs/server:latest +docker pull vaultwarden/server:latest +docker run -d --name vaultwarden -v /vw-data/:/data/ -p 80:80 vaultwarden/server:latest ``` This will preserve any persistent data under /bw-data/, you can adapt the path to whatever suits you. **IMPORTANT**: Some web browsers, like Chrome, disallow the use of Web Crypto APIs in insecure contexts. In this case, you might get an error like `Cannot read property 'importKey'`. To solve this problem, you need to access the web vault from HTTPS. -This can be configured in [bitwarden_rs directly](https://github.com/dani-garcia/bitwarden_rs/wiki/Enabling-HTTPS) or using a third-party reverse proxy ([some examples](https://github.com/dani-garcia/bitwarden_rs/wiki/Proxy-examples)). +This can be configured in [vaultwarden directly](https://github.com/dani-garcia/vaultwarden/wiki/Enabling-HTTPS) or using a third-party reverse proxy ([some examples](https://github.com/dani-garcia/vaultwarden/wiki/Proxy-examples)). If you have an available domain name, you can get HTTPS certificates with [Let's Encrypt](https://letsencrypt.org/), or you can generate self-signed certificates with utilities like [mkcert](https://github.com/FiloSottile/mkcert). Some proxies automatically do this step, like Caddy (see examples linked above). ## Usage -See the [bitwarden_rs wiki](https://github.com/dani-garcia/bitwarden_rs/wiki) for more information on how to configure and run the bitwarden_rs server. +See the [vaultwarden wiki](https://github.com/dani-garcia/vaultwarden/wiki) for more information on how to configure and run the vaultwarden server. ## Get in touch -To ask a question, offer suggestions or new features or to get help configuring or installing the software, please [use the forum](https://bitwardenrs.discourse.group/). +To ask a question, offer suggestions or new features or to get help configuring or installing the software, please [use the forum](https://vaultwarden.discourse.group/). -If you spot any bugs or crashes with bitwarden_rs itself, please [create an issue](https://github.com/dani-garcia/bitwarden_rs/issues/). Make sure there aren't any similar issues open, though! +If you spot any bugs or crashes with vaultwarden itself, please [create an issue](https://github.com/dani-garcia/vaultwarden/issues/). Make sure there aren't any similar issues open, though! -If you prefer to chat, we're usually hanging around at [#bitwarden_rs:matrix.org](https://matrix.to/#/#bitwarden_rs:matrix.org) room on Matrix. Feel free to join us! +If you prefer to chat, we're usually hanging around at [#vaultwarden:matrix.org](https://matrix.to/#/#vaultwarden:matrix.org) room on Matrix. Feel free to join us! ### Sponsors Thanks for your contribution to the project! diff --git a/docker/Dockerfile.buildx b/docker/Dockerfile.buildx index 9faf3968..ed0d23b3 100644 --- a/docker/Dockerfile.buildx +++ b/docker/Dockerfile.buildx @@ -1,7 +1,7 @@ # The cross-built images have the build arch (`amd64`) embedded in the image # manifest, rather than the target arch. For example: # -# $ docker inspect bitwardenrs/server:latest-armv7 | jq -r '.[]|.Architecture' +# $ docker inspect vaultwarden/server:latest-armv7 | jq -r '.[]|.Architecture' # amd64 # # Recent versions of Docker have started printing a warning when the image's diff --git a/docker/Dockerfile.j2 b/docker/Dockerfile.j2 index 6f778d9e..94f910b0 100644 --- a/docker/Dockerfile.j2 +++ b/docker/Dockerfile.j2 @@ -44,26 +44,26 @@ # https://docs.docker.com/develop/develop-images/multistage-build/ # https://whitfin.io/speeding-up-rust-docker-builds/ ####################### VAULT BUILD IMAGE ####################### -{% set vault_version = "2.19.0b" %} -{% set vault_image_digest = "sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e" %} +{% set vault_version = "2.19.0d" %} +{% set vault_image_digest = "sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233" %} # The web-vault digest specifies a particular web-vault build on Docker Hub. # Using the digest instead of the tag name provides better security, # as the digest of an image is immutable, whereas a tag name can later # be changed to point to a malicious image. # # To verify the current digest for a given tag name: -# - From https://hub.docker.com/r/bitwardenrs/web-vault/tags, +# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, # click the tag name to view the digest of the image it currently points to. # - From the command line: -# $ docker pull bitwardenrs/web-vault:v{{ vault_version }} -# $ docker image inspect --format "{{ '{{' }}.RepoDigests}}" bitwardenrs/web-vault:v{{ vault_version }} -# [bitwardenrs/web-vault@{{ vault_image_digest }}] +# $ docker pull vaultwarden/web-vault:v{{ vault_version }} +# $ docker image inspect --format "{{ '{{' }}.RepoDigests}}" vaultwarden/web-vault:v{{ vault_version }} +# [vaultwarden/web-vault@{{ vault_image_digest }}] # # - Conversely, to get the tag name from the digest: -# $ docker image inspect --format "{{ '{{' }}.RepoTags}}" bitwardenrs/web-vault@{{ vault_image_digest }} -# [bitwardenrs/web-vault:v{{ vault_version }}] +# $ docker image inspect --format "{{ '{{' }}.RepoTags}}" vaultwarden/web-vault@{{ vault_image_digest }} +# [vaultwarden/web-vault:v{{ vault_version }}] # -FROM bitwardenrs/web-vault@{{ vault_image_digest }} as vault +FROM vaultwarden/web-vault@{{ vault_image_digest }} as vault ########################## BUILD IMAGE ########################## FROM {{ build_stage_base_image }} as build @@ -189,7 +189,7 @@ RUN touch src/main.rs RUN cargo build --features ${DB} --release{{ package_arch_target_param }} {% if "alpine" in target_file %} {% if "armv7" in target_file %} -RUN musl-strip target/{{ package_arch_target }}/release/bitwarden_rs +RUN musl-strip target/{{ package_arch_target }}/release/vaultwarden {% endif %} {% endif %} @@ -250,9 +250,9 @@ WORKDIR / COPY Rocket.toml . COPY --from=vault /web-vault ./web-vault {% if package_arch_target is defined %} -COPY --from=build /app/target/{{ package_arch_target }}/release/bitwarden_rs . +COPY --from=build /app/target/{{ package_arch_target }}/release/vaultwarden . {% else %} -COPY --from=build /app/target/release/bitwarden_rs . +COPY --from=build /app/target/release/vaultwarden . {% endif %} COPY docker/healthcheck.sh /healthcheck.sh diff --git a/docker/amd64/Dockerfile b/docker/amd64/Dockerfile index e0f6c70b..8152461f 100644 --- a/docker/amd64/Dockerfile +++ b/docker/amd64/Dockerfile @@ -11,21 +11,21 @@ # be changed to point to a malicious image. # # To verify the current digest for a given tag name: -# - From https://hub.docker.com/r/bitwardenrs/web-vault/tags, +# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, # click the tag name to view the digest of the image it currently points to. # - From the command line: -# $ docker pull bitwardenrs/web-vault:v2.19.0b -# $ docker image inspect --format "{{.RepoDigests}}" bitwardenrs/web-vault:v2.19.0b -# [bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e] +# $ docker pull vaultwarden/web-vault:v2.19.0d +# $ docker image inspect --format "{{.RepoDigests}}" vaultwarden/web-vault:v2.19.0d +# [vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233] # # - Conversely, to get the tag name from the digest: -# $ docker image inspect --format "{{.RepoTags}}" bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e -# [bitwardenrs/web-vault:v2.19.0b] +# $ docker image inspect --format "{{.RepoTags}}" vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 +# [vaultwarden/web-vault:v2.19.0d] # -FROM bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e as vault +FROM vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 as vault ########################## BUILD IMAGE ########################## -FROM rust:1.50 as build +FROM rust:1.51 as build # Debian-based builds support multidb ARG DB=sqlite,mysql,postgresql @@ -100,7 +100,7 @@ EXPOSE 3012 WORKDIR / COPY Rocket.toml . COPY --from=vault /web-vault ./web-vault -COPY --from=build /app/target/release/bitwarden_rs . +COPY --from=build /app/target/release/vaultwarden . COPY docker/healthcheck.sh /healthcheck.sh COPY docker/start.sh /start.sh diff --git a/docker/amd64/Dockerfile.alpine b/docker/amd64/Dockerfile.alpine index 71b3130f..d5462bfe 100644 --- a/docker/amd64/Dockerfile.alpine +++ b/docker/amd64/Dockerfile.alpine @@ -11,21 +11,21 @@ # be changed to point to a malicious image. # # To verify the current digest for a given tag name: -# - From https://hub.docker.com/r/bitwardenrs/web-vault/tags, +# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, # click the tag name to view the digest of the image it currently points to. # - From the command line: -# $ docker pull bitwardenrs/web-vault:v2.19.0b -# $ docker image inspect --format "{{.RepoDigests}}" bitwardenrs/web-vault:v2.19.0b -# [bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e] +# $ docker pull vaultwarden/web-vault:v2.19.0d +# $ docker image inspect --format "{{.RepoDigests}}" vaultwarden/web-vault:v2.19.0d +# [vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233] # # - Conversely, to get the tag name from the digest: -# $ docker image inspect --format "{{.RepoTags}}" bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e -# [bitwardenrs/web-vault:v2.19.0b] +# $ docker image inspect --format "{{.RepoTags}}" vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 +# [vaultwarden/web-vault:v2.19.0d] # -FROM bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e as vault +FROM vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 as vault ########################## BUILD IMAGE ########################## -FROM clux/muslrust:nightly-2021-02-22 as build +FROM clux/muslrust:nightly-2021-04-14 as build # Alpine-based AMD64 (musl) does not support mysql/mariadb during compile time. ARG DB=sqlite,postgresql @@ -95,7 +95,7 @@ EXPOSE 3012 WORKDIR / COPY Rocket.toml . COPY --from=vault /web-vault ./web-vault -COPY --from=build /app/target/x86_64-unknown-linux-musl/release/bitwarden_rs . +COPY --from=build /app/target/x86_64-unknown-linux-musl/release/vaultwarden . COPY docker/healthcheck.sh /healthcheck.sh COPY docker/start.sh /start.sh diff --git a/docker/arm64/Dockerfile b/docker/arm64/Dockerfile index 937d192f..3669c4fb 100644 --- a/docker/arm64/Dockerfile +++ b/docker/arm64/Dockerfile @@ -11,21 +11,21 @@ # be changed to point to a malicious image. # # To verify the current digest for a given tag name: -# - From https://hub.docker.com/r/bitwardenrs/web-vault/tags, +# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, # click the tag name to view the digest of the image it currently points to. # - From the command line: -# $ docker pull bitwardenrs/web-vault:v2.19.0b -# $ docker image inspect --format "{{.RepoDigests}}" bitwardenrs/web-vault:v2.19.0b -# [bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e] +# $ docker pull vaultwarden/web-vault:v2.19.0d +# $ docker image inspect --format "{{.RepoDigests}}" vaultwarden/web-vault:v2.19.0d +# [vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233] # # - Conversely, to get the tag name from the digest: -# $ docker image inspect --format "{{.RepoTags}}" bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e -# [bitwardenrs/web-vault:v2.19.0b] +# $ docker image inspect --format "{{.RepoTags}}" vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 +# [vaultwarden/web-vault:v2.19.0d] # -FROM bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e as vault +FROM vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 as vault ########################## BUILD IMAGE ########################## -FROM rust:1.50 as build +FROM rust:1.51 as build # Debian-based builds support multidb ARG DB=sqlite,mysql,postgresql @@ -146,7 +146,7 @@ EXPOSE 3012 WORKDIR / COPY Rocket.toml . COPY --from=vault /web-vault ./web-vault -COPY --from=build /app/target/aarch64-unknown-linux-gnu/release/bitwarden_rs . +COPY --from=build /app/target/aarch64-unknown-linux-gnu/release/vaultwarden . COPY docker/healthcheck.sh /healthcheck.sh COPY docker/start.sh /start.sh diff --git a/docker/armv6/Dockerfile b/docker/armv6/Dockerfile index 2423ee16..5cfcacf5 100644 --- a/docker/armv6/Dockerfile +++ b/docker/armv6/Dockerfile @@ -11,21 +11,21 @@ # be changed to point to a malicious image. # # To verify the current digest for a given tag name: -# - From https://hub.docker.com/r/bitwardenrs/web-vault/tags, +# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, # click the tag name to view the digest of the image it currently points to. # - From the command line: -# $ docker pull bitwardenrs/web-vault:v2.19.0b -# $ docker image inspect --format "{{.RepoDigests}}" bitwardenrs/web-vault:v2.19.0b -# [bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e] +# $ docker pull vaultwarden/web-vault:v2.19.0d +# $ docker image inspect --format "{{.RepoDigests}}" vaultwarden/web-vault:v2.19.0d +# [vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233] # # - Conversely, to get the tag name from the digest: -# $ docker image inspect --format "{{.RepoTags}}" bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e -# [bitwardenrs/web-vault:v2.19.0b] +# $ docker image inspect --format "{{.RepoTags}}" vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 +# [vaultwarden/web-vault:v2.19.0d] # -FROM bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e as vault +FROM vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 as vault ########################## BUILD IMAGE ########################## -FROM rust:1.50 as build +FROM rust:1.51 as build # Debian-based builds support multidb ARG DB=sqlite,mysql,postgresql @@ -146,7 +146,7 @@ EXPOSE 3012 WORKDIR / COPY Rocket.toml . COPY --from=vault /web-vault ./web-vault -COPY --from=build /app/target/arm-unknown-linux-gnueabi/release/bitwarden_rs . +COPY --from=build /app/target/arm-unknown-linux-gnueabi/release/vaultwarden . COPY docker/healthcheck.sh /healthcheck.sh COPY docker/start.sh /start.sh diff --git a/docker/armv7/Dockerfile b/docker/armv7/Dockerfile index 4f612f72..09c1cf43 100644 --- a/docker/armv7/Dockerfile +++ b/docker/armv7/Dockerfile @@ -11,21 +11,21 @@ # be changed to point to a malicious image. # # To verify the current digest for a given tag name: -# - From https://hub.docker.com/r/bitwardenrs/web-vault/tags, +# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, # click the tag name to view the digest of the image it currently points to. # - From the command line: -# $ docker pull bitwardenrs/web-vault:v2.19.0b -# $ docker image inspect --format "{{.RepoDigests}}" bitwardenrs/web-vault:v2.19.0b -# [bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e] +# $ docker pull vaultwarden/web-vault:v2.19.0d +# $ docker image inspect --format "{{.RepoDigests}}" vaultwarden/web-vault:v2.19.0d +# [vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233] # # - Conversely, to get the tag name from the digest: -# $ docker image inspect --format "{{.RepoTags}}" bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e -# [bitwardenrs/web-vault:v2.19.0b] +# $ docker image inspect --format "{{.RepoTags}}" vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 +# [vaultwarden/web-vault:v2.19.0d] # -FROM bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e as vault +FROM vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 as vault ########################## BUILD IMAGE ########################## -FROM rust:1.50 as build +FROM rust:1.51 as build # Debian-based builds support multidb ARG DB=sqlite,mysql,postgresql @@ -146,7 +146,7 @@ EXPOSE 3012 WORKDIR / COPY Rocket.toml . COPY --from=vault /web-vault ./web-vault -COPY --from=build /app/target/armv7-unknown-linux-gnueabihf/release/bitwarden_rs . +COPY --from=build /app/target/armv7-unknown-linux-gnueabihf/release/vaultwarden . COPY docker/healthcheck.sh /healthcheck.sh COPY docker/start.sh /start.sh diff --git a/docker/armv7/Dockerfile.alpine b/docker/armv7/Dockerfile.alpine index 430e043e..f9e6cc4d 100644 --- a/docker/armv7/Dockerfile.alpine +++ b/docker/armv7/Dockerfile.alpine @@ -11,18 +11,18 @@ # be changed to point to a malicious image. # # To verify the current digest for a given tag name: -# - From https://hub.docker.com/r/bitwardenrs/web-vault/tags, +# - From https://hub.docker.com/r/vaultwarden/web-vault/tags, # click the tag name to view the digest of the image it currently points to. # - From the command line: -# $ docker pull bitwardenrs/web-vault:v2.19.0b -# $ docker image inspect --format "{{.RepoDigests}}" bitwardenrs/web-vault:v2.19.0b -# [bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e] +# $ docker pull vaultwarden/web-vault:v2.19.0d +# $ docker image inspect --format "{{.RepoDigests}}" vaultwarden/web-vault:v2.19.0d +# [vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233] # # - Conversely, to get the tag name from the digest: -# $ docker image inspect --format "{{.RepoTags}}" bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e -# [bitwardenrs/web-vault:v2.19.0b] +# $ docker image inspect --format "{{.RepoTags}}" vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 +# [vaultwarden/web-vault:v2.19.0d] # -FROM bitwardenrs/web-vault@sha256:27631b913f5858895a3e109c5e701341b9d01e69818f5283e72a49fa545eb40e as vault +FROM vaultwarden/web-vault@sha256:a7bd6bc4db33bd45f723c4b1ac90918b7f80204560683cfc8efd9efd03a9b233 as vault ########################## BUILD IMAGE ########################## FROM messense/rust-musl-cross:armv7-musleabihf as build @@ -67,7 +67,7 @@ RUN touch src/main.rs # Builds again, this time it'll just be # your actual source files being built RUN cargo build --features ${DB} --release --target=armv7-unknown-linux-musleabihf -RUN musl-strip target/armv7-unknown-linux-musleabihf/release/bitwarden_rs +RUN musl-strip target/armv7-unknown-linux-musleabihf/release/vaultwarden ######################## RUNTIME IMAGE ######################## # Create a new stage with a minimal image @@ -101,7 +101,7 @@ EXPOSE 3012 WORKDIR / COPY Rocket.toml . COPY --from=vault /web-vault ./web-vault -COPY --from=build /app/target/armv7-unknown-linux-musleabihf/release/bitwarden_rs . +COPY --from=build /app/target/armv7-unknown-linux-musleabihf/release/vaultwarden . COPY docker/healthcheck.sh /healthcheck.sh COPY docker/start.sh /start.sh diff --git a/docker/start.sh b/docker/start.sh index 39f591c2..993ddbd9 100755 --- a/docker/start.sh +++ b/docker/start.sh @@ -1,15 +1,15 @@ #!/bin/sh -if [ -r /etc/bitwarden_rs.sh ]; then - . /etc/bitwarden_rs.sh +if [ -r /etc/vaultwarden.sh ]; then + . /etc/vaultwarden.sh fi -if [ -d /etc/bitwarden_rs.d ]; then - for f in /etc/bitwarden_rs.d/*.sh; do +if [ -d /etc/vaultwarden.d ]; then + for f in /etc/vaultwarden.d/*.sh; do if [ -r $f ]; then . $f fi done fi -exec /bitwarden_rs "${@}" +exec /vaultwarden "${@}" diff --git a/hooks/README.md b/hooks/README.md index 0ad0383f..d198452e 100644 --- a/hooks/README.md +++ b/hooks/README.md @@ -10,7 +10,7 @@ Docker Hub hooks provide these predefined [environment variables](https://docs.d * `DOCKER_TAG`: the Docker repository tag being built. * `IMAGE_NAME`: the name and tag of the Docker repository being built. (This variable is a combination of `DOCKER_REPO:DOCKER_TAG`.) -The current multi-arch image build relies on the original bitwarden_rs Dockerfiles, which use cross-compilation for architectures other than `amd64`, and don't yet support all arch/distro combinations. However, cross-compilation is much faster than QEMU-based builds (e.g., using `docker buildx`). This situation may need to be revisited at some point. +The current multi-arch image build relies on the original vaultwarden Dockerfiles, which use cross-compilation for architectures other than `amd64`, and don't yet support all arch/distro combinations. However, cross-compilation is much faster than QEMU-based builds (e.g., using `docker buildx`). This situation may need to be revisited at some point. ## References diff --git a/hooks/build b/hooks/build index eeead8b4..f18c58bf 100755 --- a/hooks/build +++ b/hooks/build @@ -22,7 +22,7 @@ fi LABELS=( # https://github.com/opencontainers/image-spec/blob/master/annotations.md org.opencontainers.image.created="$(date --utc --iso-8601=seconds)" - org.opencontainers.image.documentation="https://github.com/dani-garcia/bitwarden_rs/wiki" + org.opencontainers.image.documentation="https://github.com/dani-garcia/vaultwarden/wiki" org.opencontainers.image.licenses="GPL-3.0-only" org.opencontainers.image.revision="${SOURCE_COMMIT}" org.opencontainers.image.source="${SOURCE_REPOSITORY_URL}" diff --git a/hooks/push b/hooks/push index 7b32da2e..f50e48b9 100755 --- a/hooks/push +++ b/hooks/push @@ -103,7 +103,7 @@ docker buildx build \ # (https://github.com/moby/moby/issues/41017). # # Note that we use `arm32v6` instead of `armv6` to be consistent with the -# existing bitwarden_rs tags, which adhere to the naming conventions of the +# existing vaultwarden tags, which adhere to the naming conventions of the # Docker per-architecture repos (e.g., https://hub.docker.com/u/arm32v6). # Unfortunately, these per-arch repo names aren't always consistent with the # corresponding platform (OS/arch/variant) IDs, particularly in the case of diff --git a/src/api/admin.rs b/src/api/admin.rs index 6b8ae6ee..63950379 100644 --- a/src/api/admin.rs +++ b/src/api/admin.rs @@ -476,7 +476,7 @@ fn get_github_api(url: &str) -> Result { fn has_http_access() -> bool { let http_access = get_reqwest_client(); - match http_access.head("https://github.com/dani-garcia/bitwarden_rs").timeout(Duration::from_secs(10)).send() { + match http_access.head("https://github.com/dani-garcia/vaultwarden").timeout(Duration::from_secs(10)).send() { Ok(r) => r.status().is_success(), _ => false, } @@ -518,12 +518,12 @@ fn diagnostics(_token: AdminToken, ip_header: IpHeader, conn: DbConn) -> ApiResu // TODO: Maybe we need to cache this using a LazyStatic or something. Github only allows 60 requests per hour, and we use 3 here already. let (latest_release, latest_commit, latest_web_build) = if has_http_access { ( - match get_github_api::("https://api.github.com/repos/dani-garcia/bitwarden_rs/releases/latest") + match get_github_api::("https://api.github.com/repos/dani-garcia/vaultwarden/releases/latest") { Ok(r) => r.tag_name, _ => "-".to_string(), }, - match get_github_api::("https://api.github.com/repos/dani-garcia/bitwarden_rs/commits/master") { + match get_github_api::("https://api.github.com/repos/dani-garcia/vaultwarden/commits/master") { Ok(mut c) => { c.sha.truncate(8); c.sha diff --git a/src/api/core/accounts.rs b/src/api/core/accounts.rs index c9390cf7..3888075b 100644 --- a/src/api/core/accounts.rs +++ b/src/api/core/accounts.rs @@ -95,7 +95,7 @@ fn register(data: JsonUpcase, conn: DbConn) -> EmptyResult { } None => { // Order is important here; the invitation check must come first - // because the bitwarden_rs admin can invite anyone, regardless + // because the vaultwarden admin can invite anyone, regardless // of other signup restrictions. if Invitation::take(&data.Email, &conn) || CONFIG.is_signup_allowed(&data.Email) { User::new(data.Email.clone()) diff --git a/src/api/core/ciphers.rs b/src/api/core/ciphers.rs index fa9fd6ed..0f655f76 100644 --- a/src/api/core/ciphers.rs +++ b/src/api/core/ciphers.rs @@ -25,7 +25,7 @@ pub fn routes() -> Vec { // whether the user is an owner/admin of the relevant org, and if so, // allows the operation unconditionally. // - // bitwarden_rs factors in the org owner/admin status as part of + // vaultwarden factors in the org owner/admin status as part of // determining the write accessibility of a cipher, so most // admin/non-admin implementations can be shared. routes![ diff --git a/src/api/core/two_factor/duo.rs b/src/api/core/two_factor/duo.rs index 20d03a7c..5ca87085 100644 --- a/src/api/core/two_factor/duo.rs +++ b/src/api/core/two_factor/duo.rs @@ -207,7 +207,7 @@ fn duo_api_request(method: &str, path: &str, params: &str, data: &DuoData) -> Em client .request(m, &url) .basic_auth(username, Some(password)) - .header(header::USER_AGENT, "bitwarden_rs:Duo/1.0 (Rust)") + .header(header::USER_AGENT, "vaultwarden:Duo/1.0 (Rust)") .header(header::DATE, date) .send()? .error_for_status()?; diff --git a/src/config.rs b/src/config.rs index fa6ac87e..fa7db32c 100644 --- a/src/config.rs +++ b/src/config.rs @@ -359,7 +359,7 @@ make_config! { /// $ICON_CACHE_FOLDER, but it won't produce any external network request. Needs to set $ICON_CACHE_TTL to 0, /// otherwise it will delete them and they won't be downloaded again. disable_icon_download: bool, true, def, false; - /// Allow new signups |> Controls whether new users can register. Users can be invited by the bitwarden_rs admin even if this is disabled + /// Allow new signups |> Controls whether new users can register. Users can be invited by the vaultwarden admin even if this is disabled signups_allowed: bool, true, def, true; /// Require email verification on signups. This will prevent logins from succeeding until the address has been verified signups_verify: bool, true, def, false; @@ -385,7 +385,7 @@ make_config! { admin_token: Pass, true, option; /// Invitation organization name |> Name shown in the invitation emails that don't come from a specific organization - invitation_org_name: String, true, def, "Bitwarden_RS".to_string(); + invitation_org_name: String, true, def, "Vaultwarden".to_string(); }, /// Advanced settings @@ -434,7 +434,7 @@ make_config! { /// Log level log_level: String, false, def, "Info".to_string(); - /// Enable DB WAL |> Turning this off might lead to worse performance, but might help if using bitwarden_rs on some exotic filesystems, + /// Enable DB WAL |> Turning this off might lead to worse performance, but might help if using vaultwarden on some exotic filesystems, /// that do not support WAL. Please make sure you read project wiki on the topic before changing this setting. enable_db_wal: bool, false, def, true; @@ -489,7 +489,7 @@ make_config! { /// From Address smtp_from: String, true, def, String::new(); /// From Name - smtp_from_name: String, true, def, "Bitwarden_RS".to_string(); + smtp_from_name: String, true, def, "Vaultwarden".to_string(); /// Username smtp_username: String, true, option; /// Password diff --git a/src/db/models/cipher.rs b/src/db/models/cipher.rs index 99a5122d..09247c44 100644 --- a/src/db/models/cipher.rs +++ b/src/db/models/cipher.rs @@ -125,7 +125,7 @@ impl Cipher { // There are three types of cipher response models in upstream // Bitwarden: "cipherMini", "cipher", and "cipherDetails" (in order - // of increasing level of detail). bitwarden_rs currently only + // of increasing level of detail). vaultwarden currently only // supports the "cipherDetails" type, though it seems like the // Bitwarden clients will ignore extra fields. // diff --git a/src/main.rs b/src/main.rs index d35cdfbf..cfd945ad 100644 --- a/src/main.rs +++ b/src/main.rs @@ -64,10 +64,10 @@ fn main() { } const HELP: &str = "\ - A Bitwarden API server written in Rust + Alternative implementation of the Bitwarden server API written in Rust USAGE: - bitwarden_rs + vaultwarden FLAGS: -h, --help Prints help information @@ -79,18 +79,18 @@ fn parse_args() { let mut pargs = pico_args::Arguments::from_env(); if pargs.contains(["-h", "--help"]) { - println!("bitwarden_rs {}", option_env!("BWRS_VERSION").unwrap_or(NO_VERSION)); + println!("vaultwarden {}", option_env!("BWRS_VERSION").unwrap_or(NO_VERSION)); print!("{}", HELP); exit(0); } else if pargs.contains(["-v", "--version"]) { - println!("bitwarden_rs {}", option_env!("BWRS_VERSION").unwrap_or(NO_VERSION)); + println!("vaultwarden {}", option_env!("BWRS_VERSION").unwrap_or(NO_VERSION)); exit(0); } } fn launch_info() { println!("/--------------------------------------------------------------------\\"); - println!("| Starting Bitwarden_RS |"); + println!("| Starting Vaultwarden |"); if let Some(version) = option_env!("BWRS_VERSION") { println!("|{:^68}|", format!("Version {}", version)); @@ -102,7 +102,7 @@ fn launch_info() { println!("| Send usage/configuration questions or feature requests to: |"); println!("| https://bitwardenrs.discourse.group/ |"); println!("| Report suspected bugs/issues in the software itself at: |"); - println!("| https://github.com/dani-garcia/bitwarden_rs/issues/new |"); + println!("| https://github.com/dani-garcia/vaultwarden/issues/new |"); println!("\\--------------------------------------------------------------------/\n"); } @@ -207,7 +207,7 @@ fn chain_syslog(logger: fern::Dispatch) -> fern::Dispatch { let syslog_fmt = syslog::Formatter3164 { facility: syslog::Facility::LOG_USER, hostname: None, - process: "bitwarden_rs".into(), + process: "vaultwarden".into(), pid: 0, }; @@ -304,7 +304,7 @@ fn check_web_vault() { "Web vault is not found at '{}'. To install it, please follow the steps in: ", CONFIG.web_vault_folder() ); - error!("https://github.com/dani-garcia/bitwarden_rs/wiki/Building-binary#install-the-web-vault"); + error!("https://github.com/dani-garcia/vaultwarden/wiki/Building-binary#install-the-web-vault"); error!("You can also set the environment variable 'WEB_VAULT_ENABLED=false' to disable it"); exit(1); } diff --git a/src/static/templates/admin/base.hbs b/src/static/templates/admin/base.hbs index e4f1ec85..e476309d 100644 --- a/src/static/templates/admin/base.hbs +++ b/src/static/templates/admin/base.hbs @@ -5,7 +5,7 @@ - Bitwarden_rs Admin Panel + Vaultwarden Admin Panel