Merge pull request #157 from stefan0xC/update-to-v2024.3.x

update web-vault to v2024.3.0 (new vertical layout)
This commit is contained in:
Mathijs van Veluw 2024-03-25 23:38:30 +01:00 committed by GitHub
commit ac7f24e355
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 1478 additions and 3 deletions

View file

@ -26,8 +26,8 @@ USER node
# Can be a tag, release, but prefer a commit hash because it's not changeable
# https://github.com/bitwarden/clients/commit/${VAULT_VERSION}
#
# Using https://github.com/bitwarden/clients/releases/tag/web-v2024.1.2
ARG VAULT_VERSION=a1a5c4b3d3c5787e9517ac30b9b6f344f18fe5e6
# Using https://github.com/bitwarden/clients/releases/tag/web-v2024.3.0
ARG VAULT_VERSION=dbf0f1e328e73bbdea9f120c020770c9e117ad6d
WORKDIR /vault
RUN git -c init.defaultBranch=main init && \

720
patches/v2024.2.4.patch Normal file
View file

@ -0,0 +1,720 @@
diff --git a/apps/web/src/app/admin-console/organizations/create/organization-information.component.html b/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
index 6029cfd833..04324b7d19 100644
--- a/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
+++ b/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
@@ -12,7 +12,7 @@
<input bitInput type="text" formControlName="name" />
</bit-form-field>
<bit-form-field class="tw-w-1/2">
- <bit-label>{{ "billingEmail" | i18n }}</bit-label>
+ <bit-label>{{ "email" | i18n }}</bit-label>
<input bitInput type="email" formControlName="billingEmail" />
</bit-form-field>
<bit-form-field class="tw-w-1/2" *ngIf="isProvider">
diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
index 7e50a09087..27ea8f09c9 100644
--- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
+++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
@@ -105,6 +105,7 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy {
}
canShowBillingTab(organization: Organization): boolean {
+ return false; // disable billing tab in Vaultwarden
return canAccessBillingTab(organization);
}
diff --git a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
index 7abee6b0d0..2e3b789b23 100644
--- a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
+++ b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
@@ -68,13 +68,6 @@ const routes: Routes = [
(m) => m.OrganizationReportingModule,
),
},
- {
- path: "billing",
- loadChildren: () =>
- import("../../billing/organizations/organization-billing.module").then(
- (m) => m.OrganizationBillingModule,
- ),
- },
],
},
];
diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.html b/apps/web/src/app/admin-console/organizations/settings/account.component.html
index 7035b976ca..44b24584ae 100644
--- a/apps/web/src/app/admin-console/organizations/settings/account.component.html
+++ b/apps/web/src/app/admin-console/organizations/settings/account.component.html
@@ -17,7 +17,7 @@
<input bitInput id="orgName" type="text" formControlName="orgName" />
</bit-form-field>
<bit-form-field>
- <bit-label>{{ "billingEmail" | i18n }}</bit-label>
+ <bit-label>{{ "email" | i18n }}</bit-label>
<input bitInput id="billingEmail" formControlName="billingEmail" type="email" />
</bit-form-field>
<bit-form-field>
diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.ts b/apps/web/src/app/admin-console/organizations/settings/account.component.ts
index 8527aa1b17..971d78d8d5 100644
--- a/apps/web/src/app/admin-console/organizations/settings/account.component.ts
+++ b/apps/web/src/app/admin-console/organizations/settings/account.component.ts
@@ -99,7 +99,7 @@ export class AccountComponent {
) {}
async ngOnInit() {
- this.selfHosted = this.platformUtilsService.isSelfHost();
+ this.selfHosted = false; // set to false so we can rename organizations
this.route.params
.pipe(
@@ -204,6 +204,7 @@ export class AccountComponent {
}
submitCollectionManagement = async () => {
+ return; // flexible collections are not supported by Vaultwarden
// Early exit if self-hosted
if (this.selfHosted) {
return;
diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts
index f9479a92ce..9a6c489c38 100644
--- a/apps/web/src/app/app.component.ts
+++ b/apps/web/src/app/app.component.ts
@@ -205,6 +205,10 @@ export class AppComponent implements OnDestroy, OnInit {
break;
}
case "showToast":
+ if (typeof message.text === "string" && typeof crypto.subtle === "undefined") {
+ message.title = "This browser requires HTTPS to use the web vault";
+ message.text = "Check the Vaultwarden wiki for details on how to enable it";
+ }
this.showToast(message);
break;
case "convertAccountToKeyConnector":
diff --git a/apps/web/src/app/auth/emergency-access/accept/accept-emergency.component.html b/apps/web/src/app/auth/emergency-access/accept/accept-emergency.component.html
index 4690a4e63a..9d297671d2 100644
--- a/apps/web/src/app/auth/emergency-access/accept/accept-emergency.component.html
+++ b/apps/web/src/app/auth/emergency-access/accept/accept-emergency.component.html
@@ -1,6 +1,6 @@
<div class="mt-5 d-flex justify-content-center" *ngIf="loading">
<div>
- <img class="mb-4 logo logo-themed" alt="Bitwarden" />
+ <img class="mb-4 logo logo-themed" alt="Vaultwarden" />
<p class="text-center">
<i
class="bwi bwi-spinner bwi-spin bwi-2x text-muted"
diff --git a/apps/web/src/app/auth/login/login.component.html b/apps/web/src/app/auth/login/login.component.html
index 5c68058a3c..d0bac687b0 100644
--- a/apps/web/src/app/auth/login/login.component.html
+++ b/apps/web/src/app/auth/login/login.component.html
@@ -9,7 +9,7 @@
class="tw-mx-auto tw-mt-5 tw-flex tw-max-w-lg tw-flex-col tw-items-center tw-justify-center tw-p-8"
>
<div>
- <img class="logo logo-themed" alt="Bitwarden" />
+ <img class="logo logo-themed" alt="Vaultwarden" />
<p class="tw-mx-4 tw-mb-4 tw-mt-3 tw-text-center tw-text-xl">
{{ "loginOrCreateNewAccount" | i18n }}
</p>
@@ -51,7 +51,7 @@
</button>
</div>
- <div class="tw-mb-3 tw-flex tw-flex-col tw-items-center tw-justify-center">
+ <div class="tw-mb-3 tw-flex tw-flex-col tw-items-center tw-justify-center vw-hide">
<p class="tw-mb-3">{{ "or" | i18n }}</p>
<a
diff --git a/apps/web/src/app/auth/settings/change-password.component.html b/apps/web/src/app/auth/settings/change-password.component.html
index 7c3c22b3d7..9a6900104d 100644
--- a/apps/web/src/app/auth/settings/change-password.component.html
+++ b/apps/web/src/app/auth/settings/change-password.component.html
@@ -125,5 +125,3 @@
{{ "changeMasterPassword" | i18n }}
</button>
</form>
-
-<app-webauthn-login-settings></app-webauthn-login-settings>
diff --git a/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts b/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts
index 849e003440..de32156aad 100644
--- a/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts
+++ b/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts
@@ -109,11 +109,11 @@ export class TwoFactorAuthenticatorComponent
new window.QRious({
element: document.getElementById("qr"),
value:
- "otpauth://totp/Bitwarden:" +
+ "otpauth://totp/Vaultwarden:" +
Utils.encodeRFC3986URIComponent(email) +
"?secret=" +
encodeURIComponent(this.key) +
- "&issuer=Bitwarden",
+ "&issuer=Vaultwarden",
size: 160,
});
}, 100);
diff --git a/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts b/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
index 78872aa6a9..eed953b91a 100644
--- a/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
@@ -44,7 +44,7 @@ export class OrgBillingHistoryViewComponent implements OnInit, OnDestroy {
return;
}
this.loading = true;
- this.billing = await this.organizationApiService.getBilling(this.organizationId);
+ this.billing = null;
this.loading = false;
}
}
diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.html b/apps/web/src/app/billing/organizations/organization-plans.component.html
index a77d42a359..7de4e33fe2 100644
--- a/apps/web/src/app/billing/organizations/organization-plans.component.html
+++ b/apps/web/src/app/billing/organizations/organization-plans.component.html
@@ -6,7 +6,7 @@
></i>
<span class="sr-only">{{ "loading" | i18n }}</span>
</ng-container>
-<ng-container *ngIf="createOrganization && selfHosted">
+<ng-container *ngIf="createOrganization && false">
<p>{{ "uploadLicenseFileOrg" | i18n }}</p>
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="form-group">
@@ -28,7 +28,7 @@
(ngSubmit)="submit()"
[appApiAction]="formPromise"
ngNativeValidate
- *ngIf="!loading && !selfHosted && this.passwordManagerPlans && this.secretsManagerPlans"
+ *ngIf="!loading"
class="tw-pt-6"
>
<app-org-info
diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.ts b/apps/web/src/app/billing/organizations/organization-plans.component.ts
index 44d78ecce2..4fe484cfbe 100644
--- a/apps/web/src/app/billing/organizations/organization-plans.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-plans.component.ts
@@ -151,10 +151,11 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
async ngOnInit() {
if (this.organizationId) {
this.organization = this.organizationService.get(this.organizationId);
- this.billing = await this.organizationApiService.getBilling(this.organizationId);
- this.sub = await this.organizationApiService.getSubscription(this.organizationId);
+ this.billing = null; // no billing in Vaultwarden
+ this.sub = null; // no subscriptions in Vaultwarden;
}
+ /* no need to ask /api/plans because Vaultwarden only supports the free plan
if (!this.selfHosted) {
const plans = await this.apiService.getPlans();
this.passwordManagerPlans = plans.data.filter((plan) => !!plan.PasswordManager);
@@ -186,6 +187,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.plan = providerDefaultPlan.type;
this.product = providerDefaultPlan.product;
}
+ end of asking /api/plans in Vaultwarden */
if (!this.createOrganization) {
this.upgradeFlowPrefillForm();
@@ -257,6 +259,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
get selectableProducts() {
+ return null; // there are no products to select in Vaultwarden
if (this.acceptingSponsorship) {
const familyPlan = this.passwordManagerPlans.find(
(plan) => plan.type === PlanType.FamiliesAnnually,
@@ -287,6 +290,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
get selectablePlans() {
+ return null; // no plans to select in Vaultwarden
const selectedProductType = this.formGroup.controls.product.value;
const result =
this.passwordManagerPlans?.filter(
@@ -427,10 +431,12 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
get planOffersSecretsManager() {
+ return false; // no support for secrets manager in Vaultwarden
return this.selectedSecretsManagerPlan != null;
}
changedProduct() {
+ return; // no choice of products in Vaultwarden
const selectedPlan = this.selectablePlans[0];
this.setPlanType(selectedPlan.type);
@@ -543,7 +549,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
const orgKeys = await this.cryptoService.makeKeyPair(orgKey[1]);
if (this.selfHosted) {
- orgId = await this.createSelfHosted(key, collectionCt, orgKeys);
+ orgId = await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);
} else {
orgId = await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);
}
@@ -643,7 +649,9 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
request.name = this.formGroup.controls.name.value;
request.billingEmail = this.formGroup.controls.billingEmail.value;
request.keys = new OrganizationKeysRequest(orgKeys[0], orgKeys[1].encryptedString);
+ request.planType = PlanType.Free; // always select the free plan in Vaultwarden
+ /* there is no plan to select in Vaultwarden
if (this.selectedPlan.type === PlanType.Free) {
request.planType = PlanType.Free;
} else {
@@ -673,6 +681,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
// Secrets Manager
this.buildSecretsManagerRequest(request);
+ end plan selection and no support for secret manager in Vaultwarden */
if (this.hasProvider) {
const providerRequest = new ProviderOrganizationCreateRequest(
@@ -754,6 +763,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
private upgradeFlowPrefillForm() {
+ return; // Vaultwarden only supports free plan
if (this.acceptingSponsorship) {
this.formGroup.controls.product.setValue(ProductType.Families);
this.changedProduct();
diff --git a/apps/web/src/app/core/init.service.ts b/apps/web/src/app/core/init.service.ts
index 899a168479..5bb71b05f6 100644
--- a/apps/web/src/app/core/init.service.ts
+++ b/apps/web/src/app/core/init.service.ts
@@ -7,10 +7,7 @@ import { NotificationsService as NotificationsServiceAbstraction } from "@bitwar
import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/auth/abstractions/two-factor.service";
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto.service";
import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service";
-import {
- EnvironmentService as EnvironmentServiceAbstraction,
- Urls,
-} from "@bitwarden/common/platform/abstractions/environment.service";
+import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/common/platform/abstractions/environment.service";
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service";
import { StateService as StateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
import { ConfigService } from "@bitwarden/common/platform/services/config/config.service";
@@ -38,11 +35,23 @@ export class InitService {
) {}
init() {
+ function getBaseUrl() {
+ // If the base URL is `https://vaultwarden.example.com/base/path/`,
+ // `window.location.href` should have one of the following forms:
+ //
+ // - `https://vaultwarden.example.com/base/path/`
+ // - `https://vaultwarden.example.com/base/path/#/some/route[?queryParam=...]`
+ //
+ // We want to get to just `https://vaultwarden.example.com/base/path`.
+ let baseUrl = window.location.href;
+ baseUrl = baseUrl.replace(/#.*/, ""); // Strip off `#` and everything after.
+ baseUrl = baseUrl.replace(/\/+$/, ""); // Trim any trailing `/` chars.
+ return baseUrl;
+ }
return async () => {
await this.stateService.init();
- const urls = process.env.URLS as Urls;
- urls.base ??= this.win.location.origin;
+ const urls = { base: getBaseUrl() };
await this.environmentService.setUrls(urls);
// Workaround to ignore stateService.activeAccount until process.env.URLS are set
// TODO: Remove this when implementing ticket PM-2637
diff --git a/apps/web/src/app/core/router.service.ts b/apps/web/src/app/core/router.service.ts
index 5a0d903ba7..d6fedadd38 100644
--- a/apps/web/src/app/core/router.service.ts
+++ b/apps/web/src/app/core/router.service.ts
@@ -26,7 +26,7 @@ export class RouterService {
.subscribe((event: NavigationEnd) => {
this.currentUrl = event.url;
- let title = i18nService.t("bitWebVault");
+ let title = "Vaultwarden Web";
if (this.currentUrl.includes("/sm/")) {
title = i18nService.t("bitSecretsManager");
diff --git a/apps/web/src/app/core/web-platform-utils.service.ts b/apps/web/src/app/core/web-platform-utils.service.ts
index 02c7c29e34..9fd100024a 100644
--- a/apps/web/src/app/core/web-platform-utils.service.ts
+++ b/apps/web/src/app/core/web-platform-utils.service.ts
@@ -133,14 +133,17 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
}
isDev(): boolean {
+ return false; // treat Vaultwarden as production ready
return process.env.NODE_ENV === "development";
}
isSelfHost(): boolean {
+ return true; // treat Vaultwarden as self hosted
return WebPlatformUtilsService.isSelfHost();
}
static isSelfHost(): boolean {
+ return true; // treat Vaultwarden as self hosted
return process.env.ENV.toString() === "selfhosted";
}
diff --git a/apps/web/src/app/layouts/frontend-layout.component.html b/apps/web/src/app/layouts/frontend-layout.component.html
index 72f0f1f1da..cea0867131 100644
--- a/apps/web/src/app/layouts/frontend-layout.component.html
+++ b/apps/web/src/app/layouts/frontend-layout.component.html
@@ -1,6 +1,11 @@
<router-outlet></router-outlet>
<div class="container my-5 text-muted text-center">
- <environment-selector></environment-selector>
- &copy; {{ year }} Bitwarden Inc. <br />
+ Vaultwarden Web<br />
{{ "versionNumber" | i18n: version }}
+ <br /><br />
+ <div class="small">
+ A modified version of the Bitwarden&reg; Web Vault for Vaultwarden (an unofficial rewrite of the
+ Bitwarden&reg; server).<br />
+ Vaultwarden is not associated with the Bitwarden&reg; project nor Bitwarden Inc.
+ </div>
</div>
diff --git a/apps/web/src/app/layouts/header/web-header.component.html b/apps/web/src/app/layouts/header/web-header.component.html
index 514e5deebd..20165e5061 100644
--- a/apps/web/src/app/layouts/header/web-header.component.html
+++ b/apps/web/src/app/layouts/header/web-header.component.html
@@ -76,7 +76,12 @@
<i class="bwi bwi-fw bwi-user" aria-hidden="true"></i>
{{ "accountSettings" | i18n }}
</a>
- <a bitMenuItem href="https://bitwarden.com/help/" target="_blank" rel="noreferrer">
+ <a
+ bitMenuItem
+ href="https://github.com/dani-garcia/vaultwarden"
+ target="_blank"
+ rel="noreferrer"
+ >
<i class="bwi bwi-fw bwi-question-circle" aria-hidden="true"></i>
{{ "getHelp" | i18n }}
</a>
diff --git a/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html b/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
index 9068f9c071..e051dccc85 100644
--- a/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
+++ b/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
@@ -29,7 +29,7 @@
<!-- Other options -->
<section
- *ngIf="products.other.length > 0"
+ *ngIf="false"
class="tw-mt-4 tw-flex tw-w-full tw-flex-col tw-gap-2 tw-border-0 tw-border-t tw-border-solid tw-border-t-text-muted tw-p-2 tw-pb-0"
>
<span class="tw-mb-1 tw-text-xs tw-text-muted">{{ "moreFromBitwarden" | i18n }}</span>
diff --git a/apps/web/src/app/layouts/user-layout.component.html b/apps/web/src/app/layouts/user-layout.component.html
index 3593390113..ac78bcb651 100644
--- a/apps/web/src/app/layouts/user-layout.component.html
+++ b/apps/web/src/app/layouts/user-layout.component.html
@@ -33,9 +33,5 @@
></bit-nav-item>
</bit-nav-group>
</nav>
- <app-payment-method-banners
- *ngIf="false"
- class="-tw-m-6 tw-flex tw-flex-col tw-pb-6"
- ></app-payment-method-banners>
<router-outlet></router-outlet>
</bit-layout>
diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts
index e5c2f353c0..845d8b86ab 100644
--- a/apps/web/src/app/oss-routing.module.ts
+++ b/apps/web/src/app/oss-routing.module.ts
@@ -222,13 +222,6 @@ const routes: Routes = [
component: DomainRulesComponent,
data: { titleId: "domainRules" },
},
- {
- path: "subscription",
- loadChildren: () =>
- import("./billing/individual/individual-billing.module").then(
- (m) => m.IndividualBillingModule,
- ),
- },
{
path: "emergency-access",
children: [
diff --git a/apps/web/src/app/settings/settings.component.ts b/apps/web/src/app/settings/settings.component.ts
index c2fd1c77fa..9e116d7f2c 100644
--- a/apps/web/src/app/settings/settings.component.ts
+++ b/apps/web/src/app/settings/settings.component.ts
@@ -53,14 +53,7 @@ export class SettingsComponent implements OnInit, OnDestroy {
}
async load() {
- this.premium = await this.stateService.getHasPremiumPersonally();
- this.hasFamilySponsorshipAvailable = await this.organizationService.canManageSponsorships();
- const hasPremiumFromOrg = await this.stateService.getHasPremiumFromOrganization();
- let billing = null;
- if (!this.selfHosted) {
- billing = await this.apiService.getUserBillingHistory();
- }
- this.hideSubscription =
- !this.premium && hasPremiumFromOrg && (this.selfHosted || billing?.hasNoHistory);
+ this.hasFamilySponsorshipAvailable = false; // disable family Sponsorships in Vaultwarden
+ this.hideSubscription = true; // always hide subscriptions in Vaultwarden
}
}
diff --git a/apps/web/src/app/shared/loose-components.module.ts b/apps/web/src/app/shared/loose-components.module.ts
index 770a862eab..863efc8769 100644
--- a/apps/web/src/app/shared/loose-components.module.ts
+++ b/apps/web/src/app/shared/loose-components.module.ts
@@ -59,7 +59,6 @@ import { UpdateTempPasswordComponent } from "../auth/update-temp-password.compon
import { VerifyEmailTokenComponent } from "../auth/verify-email-token.component";
import { VerifyRecoverDeleteComponent } from "../auth/verify-recover-delete.component";
import { DynamicAvatarComponent } from "../components/dynamic-avatar.component";
-import { PaymentMethodBannersComponent } from "../components/payment-method-banners/payment-method-banners.component";
import { SelectableAvatarComponent } from "../components/selectable-avatar.component";
import { FrontendLayoutComponent } from "../layouts/frontend-layout.component";
import { HeaderModule } from "../layouts/header/header.module";
@@ -106,7 +105,6 @@ import { SharedModule } from "./shared.module";
PipesModule,
PasswordCalloutComponent,
DangerZoneComponent,
- PaymentMethodBannersComponent,
LayoutComponent,
NavigationModule,
HeaderModule,
diff --git a/apps/web/src/app/tools/send/access.component.html b/apps/web/src/app/tools/send/access.component.html
index 6fef7d361d..1deb1164ff 100644
--- a/apps/web/src/app/tools/send/access.component.html
+++ b/apps/web/src/app/tools/send/access.component.html
@@ -2,7 +2,7 @@
<div
class="tw-mx-auto tw-mt-5 tw-flex tw-max-w-xl tw-flex-col tw-items-center tw-justify-center tw-p-8"
>
- <img class="logo logo-themed" alt="Bitwarden" />
+ <img class="logo logo-themed" alt="Vaultwarden" />
<div class="tw-mt-5 tw-w-full">
<h2 bitTypography="h2" class="tw-mb-4 tw-text-center">View Send</h2>
</div>
@@ -66,19 +66,6 @@
<div class="tw-mt-5 tw-w-10/12 tw-text-center tw-text-muted">
<p bitTypography="body2" class="tw-mb-0">
{{ "sendAccessTaglineProductDesc" | i18n }}
- {{ "sendAccessTaglineLearnMore" | i18n }}
- <a
- bitLink
- href="https://www.bitwarden.com/products/send?source=web-vault"
- target="_blank"
- rel="noreferrer"
- >Bitwarden Send</a
- >
- {{ "sendAccessTaglineOr" | i18n }}
- <a bitLink routerLink="/register" target="_blank" rel="noreferrer">{{
- "sendAccessTaglineSignUp" | i18n
- }}</a>
- {{ "sendAccessTaglineTryToday" | i18n }}
</p>
</div>
</div>
diff --git a/apps/web/src/index.html b/apps/web/src/index.html
index c3a2c03ed9..1a326771a6 100644
--- a/apps/web/src/index.html
+++ b/apps/web/src/index.html
@@ -5,7 +5,7 @@
<meta name="viewport" content="width=1010" />
<meta name="theme-color" content="#175DDC" />
- <title page-title>Bitwarden Web Vault</title>
+ <title page-title>Vaultwarden Web</title>
<link rel="apple-touch-icon" sizes="180x180" href="images/icons/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="images/icons/favicon-32x32.png" />
@@ -17,7 +17,7 @@
<app-root>
<div class="mt-5 d-flex justify-content-center">
<div>
- <img class="mb-4 logo logo-themed" alt="Bitwarden" />
+ <img class="mb-4 logo logo-themed" alt="Vaultwarden" />
<p class="text-center">
<i
class="bwi bwi-spinner bwi-spin bwi-2x text-muted"
diff --git a/apps/web/src/manifest.json b/apps/web/src/manifest.json
index 92a1204c60..d9ff4771a3 100644
--- a/apps/web/src/manifest.json
+++ b/apps/web/src/manifest.json
@@ -1,5 +1,5 @@
{
- "name": "Bitwarden Vault",
+ "name": "Vaultwarden Web",
"icons": [
{
"src": "images/icons/android-chrome-192x192.png",
@@ -12,6 +12,6 @@
"type": "image/png"
}
],
- "theme_color": "#175DDC",
- "background_color": "#175DDC"
+ "theme_color": "#FFFFFF",
+ "background_color": "#FFFFFF"
}
diff --git a/apps/web/src/scss/styles.scss b/apps/web/src/scss/styles.scss
index 98b3512ba5..8691768352 100644
--- a/apps/web/src/scss/styles.scss
+++ b/apps/web/src/scss/styles.scss
@@ -56,3 +56,80 @@
@import "./tables";
@import "./toasts";
@import "./vault-filters";
+
+/**** START Vaultwarden CHANGES ****/
+/* This combines all selectors extending it into one */
+%vw-hide {
+ display: none !important;
+}
+
+/* This allows searching for the combined style in the browsers dev-tools (look into the head tag) */
+.vw-hide,
+head {
+ @extend %vw-hide;
+}
+
+/* Hide the Subscription Page tab */
+bit-nav-item[route="settings/subscription"] {
+ @extend %vw-hide;
+}
+
+/* Hide any link pointing to Free Bitwarden Families */
+a[href$="/settings/sponsored-families"] {
+ @extend %vw-hide;
+}
+
+/* Hide the `Enterprise Single Sign-On` button on the login page */
+a[routerlink="/sso"] {
+ @extend %vw-hide;
+}
+
+/* Hide Two-Factor menu in Organization settings */
+bit-nav-item[route="settings/two-factor"],
+a[href$="/settings/two-factor"] {
+ @extend %vw-hide;
+}
+
+/* Hide Business Owned checkbox */
+app-org-info > form:nth-child(1) > div:nth-child(3) {
+ @extend %vw-hide;
+}
+
+/* Hide the `This account is owned by a business` checkbox and label */
+#ownedBusiness,
+label[for^="ownedBusiness"] {
+ @extend %vw-hide;
+}
+
+/* Hide the radio button and label for the `Custom` org user type */
+#userTypeCustom,
+label[for^="userTypeCustom"] {
+ @extend %vw-hide;
+}
+
+/* Hide Business Name */
+app-org-account form div bit-form-field.tw-block:nth-child(3) {
+ @extend %vw-hide;
+}
+
+/* Hide organization plans */
+app-organization-plans > form > h2.mt-5 {
+ @extend %vw-hide;
+}
+
+/* Hide Device Verification form at the Two Step Login screen */
+app-security > app-two-factor-setup > form {
+ @extend %vw-hide;
+}
+
+/* Replace the Bitwarden Shield at the top left with a Vaultwarden icon */
+.bwi-shield:before {
+ content: "" !important;
+ width: 32px !important;
+ height: 40px !important;
+ display: block !important;
+ background-image: url(../images/icon-white.png) !important;
+ background-repeat: no-repeat;
+ background-position-y: bottom;
+}
+/**** END Vaultwarden CHANGES ****/
diff --git a/apps/web/src/scss/variables.scss b/apps/web/src/scss/variables.scss
index 9d3d8d6ad4..5bc773c0d8 100644
--- a/apps/web/src/scss/variables.scss
+++ b/apps/web/src/scss/variables.scss
@@ -3,7 +3,7 @@ $dark-icon-themes: "theme_dark";
$primary: #175ddc;
$primary-accent: #1252a3;
$secondary: #ced4da;
-$secondary-alt: #1a3b66;
+$secondary-alt: #212529;
$success: #017e45;
$info: #555555;
$warning: #8b6609;
diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js
index 6ac384cb82..0492e09476 100644
--- a/apps/web/webpack.config.js
+++ b/apps/web/webpack.config.js
@@ -141,8 +141,6 @@ const plugins = [
{ from: "./src/favicon.ico" },
{ from: "./src/browserconfig.xml" },
{ from: "./src/app-id.json" },
- { from: "./src/404.html" },
- { from: "./src/404", to: "404" },
{ from: "./src/images", to: "images" },
{ from: "./src/locales", to: "locales" },
{ from: "../../node_modules/qrious/dist/qrious.min.js", to: "scripts" },
diff --git a/libs/angular/src/auth/components/register.component.ts b/libs/angular/src/auth/components/register.component.ts
index 3cffebe71b..c1229b5c2c 100644
--- a/libs/angular/src/auth/components/register.component.ts
+++ b/libs/angular/src/auth/components/register.component.ts
@@ -106,6 +106,14 @@ export class RegisterComponent extends CaptchaProtectedComponent implements OnIn
}
async submit(showToast = true) {
+ if (typeof crypto.subtle === "undefined") {
+ this.platformUtilsService.showToast(
+ "error",
+ "This browser requires HTTPS to use the web vault",
+ "Check the Vaultwarden wiki for details on how to enable it",
+ );
+ return;
+ }
let email = this.formGroup.value.email;
email = email.trim().toLowerCase();
let name = this.formGroup.value.name;
diff --git a/libs/angular/src/auth/components/two-factor-options.component.ts b/libs/angular/src/auth/components/two-factor-options.component.ts
index 4293eb9966..7a8e861e8d 100644
--- a/libs/angular/src/auth/components/two-factor-options.component.ts
+++ b/libs/angular/src/auth/components/two-factor-options.component.ts
@@ -30,7 +30,9 @@ export class TwoFactorOptionsComponent implements OnInit {
}
recover() {
- this.platformUtilsService.launchUri("https://vault.bitwarden.com/#/recover-2fa");
+ this.platformUtilsService.launchUri(
+ "https://bitwarden.com/help/two-step-recovery-code/#use-your-recovery-code",
+ );
this.onRecoverSelected.emit();
}
}
diff --git a/libs/components/src/tw-theme.css b/libs/components/src/tw-theme.css
index 75a8fa6380..733dbe9413 100644
--- a/libs/components/src/tw-theme.css
+++ b/libs/components/src/tw-theme.css
@@ -6,12 +6,12 @@
--color-background: 255 255 255;
--color-background-alt: 251 251 251;
--color-background-alt2: 23 92 219;
- --color-background-alt3: 18 82 163;
- --color-background-alt4: 13 60 119;
+ --color-background-alt3: 33 37 41; /* bg of menu panel */
+ --color-background-alt4: 16 18 21; /* bg of active menu item */
- --color-primary-300: 103 149 232;
- --color-primary-500: 23 93 220;
- --color-primary-700: 18 82 163;
+ --color-primary-300: 108 117 125; /* hover of menu items */
+ --color-primary-500: 18 82 163; /* color of links and buttons */
+ --color-primary-700: 13 60 119; /* hover of links and buttons */
--color-secondary-100: 240 240 240;
--color-secondary-300: 206 212 220;

719
patches/v2024.3.0.patch Normal file
View file

@ -0,0 +1,719 @@
diff --git a/apps/web/src/app/admin-console/organizations/create/organization-information.component.html b/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
index 6029cfd833..04324b7d19 100644
--- a/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
+++ b/apps/web/src/app/admin-console/organizations/create/organization-information.component.html
@@ -12,7 +12,7 @@
<input bitInput type="text" formControlName="name" />
</bit-form-field>
<bit-form-field class="tw-w-1/2">
- <bit-label>{{ "billingEmail" | i18n }}</bit-label>
+ <bit-label>{{ "email" | i18n }}</bit-label>
<input bitInput type="email" formControlName="billingEmail" />
</bit-form-field>
<bit-form-field class="tw-w-1/2" *ngIf="isProvider">
diff --git a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
index 90010160aa..4d0a2717af 100644
--- a/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
+++ b/apps/web/src/app/admin-console/organizations/layouts/organization-layout.component.ts
@@ -113,6 +113,7 @@ export class OrganizationLayoutComponent implements OnInit, OnDestroy {
}
canShowBillingTab(organization: Organization): boolean {
+ return false; // disable billing tab in Vaultwarden
return canAccessBillingTab(organization);
}
diff --git a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
index 7abee6b0d0..2e3b789b23 100644
--- a/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
+++ b/apps/web/src/app/admin-console/organizations/organization-routing.module.ts
@@ -68,13 +68,6 @@ const routes: Routes = [
(m) => m.OrganizationReportingModule,
),
},
- {
- path: "billing",
- loadChildren: () =>
- import("../../billing/organizations/organization-billing.module").then(
- (m) => m.OrganizationBillingModule,
- ),
- },
],
},
];
diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.html b/apps/web/src/app/admin-console/organizations/settings/account.component.html
index 7035b976ca..44b24584ae 100644
--- a/apps/web/src/app/admin-console/organizations/settings/account.component.html
+++ b/apps/web/src/app/admin-console/organizations/settings/account.component.html
@@ -17,7 +17,7 @@
<input bitInput id="orgName" type="text" formControlName="orgName" />
</bit-form-field>
<bit-form-field>
- <bit-label>{{ "billingEmail" | i18n }}</bit-label>
+ <bit-label>{{ "email" | i18n }}</bit-label>
<input bitInput id="billingEmail" formControlName="billingEmail" type="email" />
</bit-form-field>
<bit-form-field>
diff --git a/apps/web/src/app/admin-console/organizations/settings/account.component.ts b/apps/web/src/app/admin-console/organizations/settings/account.component.ts
index 8527aa1b17..971d78d8d5 100644
--- a/apps/web/src/app/admin-console/organizations/settings/account.component.ts
+++ b/apps/web/src/app/admin-console/organizations/settings/account.component.ts
@@ -99,7 +99,7 @@ export class AccountComponent {
) {}
async ngOnInit() {
- this.selfHosted = this.platformUtilsService.isSelfHost();
+ this.selfHosted = false; // set to false so we can rename organizations
this.route.params
.pipe(
@@ -204,6 +204,7 @@ export class AccountComponent {
}
submitCollectionManagement = async () => {
+ return; // flexible collections are not supported by Vaultwarden
// Early exit if self-hosted
if (this.selfHosted) {
return;
diff --git a/apps/web/src/app/app.component.ts b/apps/web/src/app/app.component.ts
index 73721de789..1b1726ff1f 100644
--- a/apps/web/src/app/app.component.ts
+++ b/apps/web/src/app/app.component.ts
@@ -213,6 +213,10 @@ export class AppComponent implements OnDestroy, OnInit {
break;
}
case "showToast":
+ if (typeof message.text === "string" && typeof crypto.subtle === "undefined") {
+ message.title = "This browser requires HTTPS to use the web vault";
+ message.text = "Check the Vaultwarden wiki for details on how to enable it";
+ }
this.showToast(message);
break;
case "convertAccountToKeyConnector":
diff --git a/apps/web/src/app/auth/emergency-access/accept/accept-emergency.component.html b/apps/web/src/app/auth/emergency-access/accept/accept-emergency.component.html
index 4690a4e63a..9d297671d2 100644
--- a/apps/web/src/app/auth/emergency-access/accept/accept-emergency.component.html
+++ b/apps/web/src/app/auth/emergency-access/accept/accept-emergency.component.html
@@ -1,6 +1,6 @@
<div class="mt-5 d-flex justify-content-center" *ngIf="loading">
<div>
- <img class="mb-4 logo logo-themed" alt="Bitwarden" />
+ <img class="mb-4 logo logo-themed" alt="Vaultwarden" />
<p class="text-center">
<i
class="bwi bwi-spinner bwi-spin bwi-2x text-muted"
diff --git a/apps/web/src/app/auth/login/login.component.html b/apps/web/src/app/auth/login/login.component.html
index 5c68058a3c..d0bac687b0 100644
--- a/apps/web/src/app/auth/login/login.component.html
+++ b/apps/web/src/app/auth/login/login.component.html
@@ -9,7 +9,7 @@
class="tw-mx-auto tw-mt-5 tw-flex tw-max-w-lg tw-flex-col tw-items-center tw-justify-center tw-p-8"
>
<div>
- <img class="logo logo-themed" alt="Bitwarden" />
+ <img class="logo logo-themed" alt="Vaultwarden" />
<p class="tw-mx-4 tw-mb-4 tw-mt-3 tw-text-center tw-text-xl">
{{ "loginOrCreateNewAccount" | i18n }}
</p>
@@ -51,7 +51,7 @@
</button>
</div>
- <div class="tw-mb-3 tw-flex tw-flex-col tw-items-center tw-justify-center">
+ <div class="tw-mb-3 tw-flex tw-flex-col tw-items-center tw-justify-center vw-hide">
<p class="tw-mb-3">{{ "or" | i18n }}</p>
<a
diff --git a/apps/web/src/app/auth/settings/change-password.component.html b/apps/web/src/app/auth/settings/change-password.component.html
index 7c3c22b3d7..9a6900104d 100644
--- a/apps/web/src/app/auth/settings/change-password.component.html
+++ b/apps/web/src/app/auth/settings/change-password.component.html
@@ -125,5 +125,3 @@
{{ "changeMasterPassword" | i18n }}
</button>
</form>
-
-<app-webauthn-login-settings></app-webauthn-login-settings>
diff --git a/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts b/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts
index 849e003440..de32156aad 100644
--- a/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts
+++ b/apps/web/src/app/auth/settings/two-factor-authenticator.component.ts
@@ -109,11 +109,11 @@ export class TwoFactorAuthenticatorComponent
new window.QRious({
element: document.getElementById("qr"),
value:
- "otpauth://totp/Bitwarden:" +
+ "otpauth://totp/Vaultwarden:" +
Utils.encodeRFC3986URIComponent(email) +
"?secret=" +
encodeURIComponent(this.key) +
- "&issuer=Bitwarden",
+ "&issuer=Vaultwarden",
size: 160,
});
}, 100);
diff --git a/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts b/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
index 78872aa6a9..eed953b91a 100644
--- a/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-billing-history-view.component.ts
@@ -44,7 +44,7 @@ export class OrgBillingHistoryViewComponent implements OnInit, OnDestroy {
return;
}
this.loading = true;
- this.billing = await this.organizationApiService.getBilling(this.organizationId);
+ this.billing = null;
this.loading = false;
}
}
diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.html b/apps/web/src/app/billing/organizations/organization-plans.component.html
index a77d42a359..7de4e33fe2 100644
--- a/apps/web/src/app/billing/organizations/organization-plans.component.html
+++ b/apps/web/src/app/billing/organizations/organization-plans.component.html
@@ -6,7 +6,7 @@
></i>
<span class="sr-only">{{ "loading" | i18n }}</span>
</ng-container>
-<ng-container *ngIf="createOrganization && selfHosted">
+<ng-container *ngIf="createOrganization && false">
<p>{{ "uploadLicenseFileOrg" | i18n }}</p>
<form #form (ngSubmit)="submit()" [appApiAction]="formPromise" ngNativeValidate>
<div class="form-group">
@@ -28,7 +28,7 @@
(ngSubmit)="submit()"
[appApiAction]="formPromise"
ngNativeValidate
- *ngIf="!loading && !selfHosted && this.passwordManagerPlans && this.secretsManagerPlans"
+ *ngIf="!loading"
class="tw-pt-6"
>
<app-org-info
diff --git a/apps/web/src/app/billing/organizations/organization-plans.component.ts b/apps/web/src/app/billing/organizations/organization-plans.component.ts
index b7070be1cf..cab9dd603f 100644
--- a/apps/web/src/app/billing/organizations/organization-plans.component.ts
+++ b/apps/web/src/app/billing/organizations/organization-plans.component.ts
@@ -151,10 +151,11 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
async ngOnInit() {
if (this.organizationId) {
this.organization = this.organizationService.get(this.organizationId);
- this.billing = await this.organizationApiService.getBilling(this.organizationId);
- this.sub = await this.organizationApiService.getSubscription(this.organizationId);
+ this.billing = null; // no billing in Vaultwarden
+ this.sub = null; // no subscriptions in Vaultwarden;
}
+ /* no need to ask /api/plans because Vaultwarden only supports the free plan
if (!this.selfHosted) {
const plans = await this.apiService.getPlans();
this.passwordManagerPlans = plans.data.filter((plan) => !!plan.PasswordManager);
@@ -186,6 +187,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
this.plan = providerDefaultPlan.type;
this.product = providerDefaultPlan.product;
}
+ end of asking /api/plans in Vaultwarden */
if (!this.createOrganization) {
this.upgradeFlowPrefillForm();
@@ -257,6 +259,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
get selectableProducts() {
+ return null; // there are no products to select in Vaultwarden
if (this.acceptingSponsorship) {
const familyPlan = this.passwordManagerPlans.find(
(plan) => plan.type === PlanType.FamiliesAnnually,
@@ -287,6 +290,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
get selectablePlans() {
+ return null; // no plans to select in Vaultwarden
const selectedProductType = this.formGroup.controls.product.value;
const result =
this.passwordManagerPlans?.filter(
@@ -427,10 +431,12 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
get planOffersSecretsManager() {
+ return false; // no support for secrets manager in Vaultwarden
return this.selectedSecretsManagerPlan != null;
}
changedProduct() {
+ return; // no choice of products in Vaultwarden
const selectedPlan = this.selectablePlans[0];
this.setPlanType(selectedPlan.type);
@@ -543,7 +549,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
const orgKeys = await this.cryptoService.makeKeyPair(orgKey[1]);
if (this.selfHosted) {
- orgId = await this.createSelfHosted(key, collectionCt, orgKeys);
+ orgId = await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);
} else {
orgId = await this.createCloudHosted(key, collectionCt, orgKeys, orgKey[1]);
}
@@ -644,7 +650,9 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
request.billingEmail = this.formGroup.controls.billingEmail.value;
request.initiationPath = "New organization creation in-product";
request.keys = new OrganizationKeysRequest(orgKeys[0], orgKeys[1].encryptedString);
+ request.planType = PlanType.Free; // always select the free plan in Vaultwarden
+ /* there is no plan to select in Vaultwarden
if (this.selectedPlan.type === PlanType.Free) {
request.planType = PlanType.Free;
} else {
@@ -674,6 +682,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
// Secrets Manager
this.buildSecretsManagerRequest(request);
+ end plan selection and no support for secret manager in Vaultwarden */
if (this.hasProvider) {
const providerRequest = new ProviderOrganizationCreateRequest(
@@ -755,6 +764,7 @@ export class OrganizationPlansComponent implements OnInit, OnDestroy {
}
private upgradeFlowPrefillForm() {
+ return; // Vaultwarden only supports free plan
if (this.acceptingSponsorship) {
this.formGroup.controls.product.setValue(ProductType.Families);
this.changedProduct();
diff --git a/apps/web/src/app/core/init.service.ts b/apps/web/src/app/core/init.service.ts
index 2a47971147..b245534220 100644
--- a/apps/web/src/app/core/init.service.ts
+++ b/apps/web/src/app/core/init.service.ts
@@ -7,10 +7,7 @@ import { NotificationsService as NotificationsServiceAbstraction } from "@bitwar
import { TwoFactorService as TwoFactorServiceAbstraction } from "@bitwarden/common/auth/abstractions/two-factor.service";
import { CryptoService as CryptoServiceAbstraction } from "@bitwarden/common/platform/abstractions/crypto.service";
import { EncryptService } from "@bitwarden/common/platform/abstractions/encrypt.service";
-import {
- EnvironmentService as EnvironmentServiceAbstraction,
- Urls,
-} from "@bitwarden/common/platform/abstractions/environment.service";
+import { EnvironmentService as EnvironmentServiceAbstraction } from "@bitwarden/common/platform/abstractions/environment.service";
import { I18nService as I18nServiceAbstraction } from "@bitwarden/common/platform/abstractions/i18n.service";
import { StateService as StateServiceAbstraction } from "@bitwarden/common/platform/abstractions/state.service";
import { ConfigService } from "@bitwarden/common/platform/services/config/config.service";
@@ -36,11 +33,23 @@ export class InitService {
) {}
init() {
+ function getBaseUrl() {
+ // If the base URL is `https://vaultwarden.example.com/base/path/`,
+ // `window.location.href` should have one of the following forms:
+ //
+ // - `https://vaultwarden.example.com/base/path/`
+ // - `https://vaultwarden.example.com/base/path/#/some/route[?queryParam=...]`
+ //
+ // We want to get to just `https://vaultwarden.example.com/base/path`.
+ let baseUrl = window.location.href;
+ baseUrl = baseUrl.replace(/#.*/, ""); // Strip off `#` and everything after.
+ baseUrl = baseUrl.replace(/\/+$/, ""); // Trim any trailing `/` chars.
+ return baseUrl;
+ }
return async () => {
await this.stateService.init();
- const urls = process.env.URLS as Urls;
- urls.base ??= this.win.location.origin;
+ const urls = { base: getBaseUrl() };
await this.environmentService.setUrls(urls);
// Workaround to ignore stateService.activeAccount until process.env.URLS are set
// TODO: Remove this when implementing ticket PM-2637
diff --git a/apps/web/src/app/core/router.service.ts b/apps/web/src/app/core/router.service.ts
index 5a0d903ba7..d6fedadd38 100644
--- a/apps/web/src/app/core/router.service.ts
+++ b/apps/web/src/app/core/router.service.ts
@@ -26,7 +26,7 @@ export class RouterService {
.subscribe((event: NavigationEnd) => {
this.currentUrl = event.url;
- let title = i18nService.t("bitWebVault");
+ let title = "Vaultwarden Web";
if (this.currentUrl.includes("/sm/")) {
title = i18nService.t("bitSecretsManager");
diff --git a/apps/web/src/app/core/web-platform-utils.service.ts b/apps/web/src/app/core/web-platform-utils.service.ts
index 02c7c29e34..9fd100024a 100644
--- a/apps/web/src/app/core/web-platform-utils.service.ts
+++ b/apps/web/src/app/core/web-platform-utils.service.ts
@@ -133,14 +133,17 @@ export class WebPlatformUtilsService implements PlatformUtilsService {
}
isDev(): boolean {
+ return false; // treat Vaultwarden as production ready
return process.env.NODE_ENV === "development";
}
isSelfHost(): boolean {
+ return true; // treat Vaultwarden as self hosted
return WebPlatformUtilsService.isSelfHost();
}
static isSelfHost(): boolean {
+ return true; // treat Vaultwarden as self hosted
return process.env.ENV.toString() === "selfhosted";
}
diff --git a/apps/web/src/app/layouts/frontend-layout.component.html b/apps/web/src/app/layouts/frontend-layout.component.html
index 72f0f1f1da..cea0867131 100644
--- a/apps/web/src/app/layouts/frontend-layout.component.html
+++ b/apps/web/src/app/layouts/frontend-layout.component.html
@@ -1,6 +1,11 @@
<router-outlet></router-outlet>
<div class="container my-5 text-muted text-center">
- <environment-selector></environment-selector>
- &copy; {{ year }} Bitwarden Inc. <br />
+ Vaultwarden Web<br />
{{ "versionNumber" | i18n: version }}
+ <br /><br />
+ <div class="small">
+ A modified version of the Bitwarden&reg; Web Vault for Vaultwarden (an unofficial rewrite of the
+ Bitwarden&reg; server).<br />
+ Vaultwarden is not associated with the Bitwarden&reg; project nor Bitwarden Inc.
+ </div>
</div>
diff --git a/apps/web/src/app/layouts/header/web-header.component.html b/apps/web/src/app/layouts/header/web-header.component.html
index 514e5deebd..20165e5061 100644
--- a/apps/web/src/app/layouts/header/web-header.component.html
+++ b/apps/web/src/app/layouts/header/web-header.component.html
@@ -76,7 +76,12 @@
<i class="bwi bwi-fw bwi-user" aria-hidden="true"></i>
{{ "accountSettings" | i18n }}
</a>
- <a bitMenuItem href="https://bitwarden.com/help/" target="_blank" rel="noreferrer">
+ <a
+ bitMenuItem
+ href="https://github.com/dani-garcia/vaultwarden"
+ target="_blank"
+ rel="noreferrer"
+ >
<i class="bwi bwi-fw bwi-question-circle" aria-hidden="true"></i>
{{ "getHelp" | i18n }}
</a>
diff --git a/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html b/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
index 9068f9c071..e051dccc85 100644
--- a/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
+++ b/apps/web/src/app/layouts/product-switcher/product-switcher-content.component.html
@@ -29,7 +29,7 @@
<!-- Other options -->
<section
- *ngIf="products.other.length > 0"
+ *ngIf="false"
class="tw-mt-4 tw-flex tw-w-full tw-flex-col tw-gap-2 tw-border-0 tw-border-t tw-border-solid tw-border-t-text-muted tw-p-2 tw-pb-0"
>
<span class="tw-mb-1 tw-text-xs tw-text-muted">{{ "moreFromBitwarden" | i18n }}</span>
diff --git a/apps/web/src/app/layouts/user-layout.component.html b/apps/web/src/app/layouts/user-layout.component.html
index 397e95d485..ac78bcb651 100644
--- a/apps/web/src/app/layouts/user-layout.component.html
+++ b/apps/web/src/app/layouts/user-layout.component.html
@@ -33,8 +33,5 @@
></bit-nav-item>
</bit-nav-group>
</nav>
- <app-payment-method-warnings
- *ngIf="showPaymentMethodWarningBanners$ | async"
- ></app-payment-method-warnings>
<router-outlet></router-outlet>
</bit-layout>
diff --git a/apps/web/src/app/oss-routing.module.ts b/apps/web/src/app/oss-routing.module.ts
index e5c2f353c0..845d8b86ab 100644
--- a/apps/web/src/app/oss-routing.module.ts
+++ b/apps/web/src/app/oss-routing.module.ts
@@ -222,13 +222,6 @@ const routes: Routes = [
component: DomainRulesComponent,
data: { titleId: "domainRules" },
},
- {
- path: "subscription",
- loadChildren: () =>
- import("./billing/individual/individual-billing.module").then(
- (m) => m.IndividualBillingModule,
- ),
- },
{
path: "emergency-access",
children: [
diff --git a/apps/web/src/app/settings/settings.component.ts b/apps/web/src/app/settings/settings.component.ts
index c2fd1c77fa..9e116d7f2c 100644
--- a/apps/web/src/app/settings/settings.component.ts
+++ b/apps/web/src/app/settings/settings.component.ts
@@ -53,14 +53,7 @@ export class SettingsComponent implements OnInit, OnDestroy {
}
async load() {
- this.premium = await this.stateService.getHasPremiumPersonally();
- this.hasFamilySponsorshipAvailable = await this.organizationService.canManageSponsorships();
- const hasPremiumFromOrg = await this.stateService.getHasPremiumFromOrganization();
- let billing = null;
- if (!this.selfHosted) {
- billing = await this.apiService.getUserBillingHistory();
- }
- this.hideSubscription =
- !this.premium && hasPremiumFromOrg && (this.selfHosted || billing?.hasNoHistory);
+ this.hasFamilySponsorshipAvailable = false; // disable family Sponsorships in Vaultwarden
+ this.hideSubscription = true; // always hide subscriptions in Vaultwarden
}
}
diff --git a/apps/web/src/app/shared/loose-components.module.ts b/apps/web/src/app/shared/loose-components.module.ts
index 586f207962..863efc8769 100644
--- a/apps/web/src/app/shared/loose-components.module.ts
+++ b/apps/web/src/app/shared/loose-components.module.ts
@@ -58,7 +58,6 @@ import { UpdatePasswordComponent } from "../auth/update-password.component";
import { UpdateTempPasswordComponent } from "../auth/update-temp-password.component";
import { VerifyEmailTokenComponent } from "../auth/verify-email-token.component";
import { VerifyRecoverDeleteComponent } from "../auth/verify-recover-delete.component";
-import { PaymentMethodWarningsModule } from "../billing/shared";
import { DynamicAvatarComponent } from "../components/dynamic-avatar.component";
import { SelectableAvatarComponent } from "../components/selectable-avatar.component";
import { FrontendLayoutComponent } from "../layouts/frontend-layout.component";
@@ -111,7 +110,6 @@ import { SharedModule } from "./shared.module";
HeaderModule,
OrganizationLayoutComponent,
UserLayoutComponent,
- PaymentMethodWarningsModule,
],
declarations: [
AcceptFamilySponsorshipComponent,
diff --git a/apps/web/src/app/tools/send/access.component.html b/apps/web/src/app/tools/send/access.component.html
index 6fef7d361d..1deb1164ff 100644
--- a/apps/web/src/app/tools/send/access.component.html
+++ b/apps/web/src/app/tools/send/access.component.html
@@ -2,7 +2,7 @@
<div
class="tw-mx-auto tw-mt-5 tw-flex tw-max-w-xl tw-flex-col tw-items-center tw-justify-center tw-p-8"
>
- <img class="logo logo-themed" alt="Bitwarden" />
+ <img class="logo logo-themed" alt="Vaultwarden" />
<div class="tw-mt-5 tw-w-full">
<h2 bitTypography="h2" class="tw-mb-4 tw-text-center">View Send</h2>
</div>
@@ -66,19 +66,6 @@
<div class="tw-mt-5 tw-w-10/12 tw-text-center tw-text-muted">
<p bitTypography="body2" class="tw-mb-0">
{{ "sendAccessTaglineProductDesc" | i18n }}
- {{ "sendAccessTaglineLearnMore" | i18n }}
- <a
- bitLink
- href="https://www.bitwarden.com/products/send?source=web-vault"
- target="_blank"
- rel="noreferrer"
- >Bitwarden Send</a
- >
- {{ "sendAccessTaglineOr" | i18n }}
- <a bitLink routerLink="/register" target="_blank" rel="noreferrer">{{
- "sendAccessTaglineSignUp" | i18n
- }}</a>
- {{ "sendAccessTaglineTryToday" | i18n }}
</p>
</div>
</div>
diff --git a/apps/web/src/index.html b/apps/web/src/index.html
index c3a2c03ed9..1a326771a6 100644
--- a/apps/web/src/index.html
+++ b/apps/web/src/index.html
@@ -5,7 +5,7 @@
<meta name="viewport" content="width=1010" />
<meta name="theme-color" content="#175DDC" />
- <title page-title>Bitwarden Web Vault</title>
+ <title page-title>Vaultwarden Web</title>
<link rel="apple-touch-icon" sizes="180x180" href="images/icons/apple-touch-icon.png" />
<link rel="icon" type="image/png" sizes="32x32" href="images/icons/favicon-32x32.png" />
@@ -17,7 +17,7 @@
<app-root>
<div class="mt-5 d-flex justify-content-center">
<div>
- <img class="mb-4 logo logo-themed" alt="Bitwarden" />
+ <img class="mb-4 logo logo-themed" alt="Vaultwarden" />
<p class="text-center">
<i
class="bwi bwi-spinner bwi-spin bwi-2x text-muted"
diff --git a/apps/web/src/manifest.json b/apps/web/src/manifest.json
index 92a1204c60..d9ff4771a3 100644
--- a/apps/web/src/manifest.json
+++ b/apps/web/src/manifest.json
@@ -1,5 +1,5 @@
{
- "name": "Bitwarden Vault",
+ "name": "Vaultwarden Web",
"icons": [
{
"src": "images/icons/android-chrome-192x192.png",
@@ -12,6 +12,6 @@
"type": "image/png"
}
],
- "theme_color": "#175DDC",
- "background_color": "#175DDC"
+ "theme_color": "#FFFFFF",
+ "background_color": "#FFFFFF"
}
diff --git a/apps/web/src/scss/styles.scss b/apps/web/src/scss/styles.scss
index 98b3512ba5..8691768352 100644
--- a/apps/web/src/scss/styles.scss
+++ b/apps/web/src/scss/styles.scss
@@ -56,3 +56,80 @@
@import "./tables";
@import "./toasts";
@import "./vault-filters";
+
+/**** START Vaultwarden CHANGES ****/
+/* This combines all selectors extending it into one */
+%vw-hide {
+ display: none !important;
+}
+
+/* This allows searching for the combined style in the browsers dev-tools (look into the head tag) */
+.vw-hide,
+head {
+ @extend %vw-hide;
+}
+
+/* Hide the Subscription Page tab */
+bit-nav-item[route="settings/subscription"] {
+ @extend %vw-hide;
+}
+
+/* Hide any link pointing to Free Bitwarden Families */
+a[href$="/settings/sponsored-families"] {
+ @extend %vw-hide;
+}
+
+/* Hide the `Enterprise Single Sign-On` button on the login page */
+a[routerlink="/sso"] {
+ @extend %vw-hide;
+}
+
+/* Hide Two-Factor menu in Organization settings */
+bit-nav-item[route="settings/two-factor"],
+a[href$="/settings/two-factor"] {
+ @extend %vw-hide;
+}
+
+/* Hide Business Owned checkbox */
+app-org-info > form:nth-child(1) > div:nth-child(3) {
+ @extend %vw-hide;
+}
+
+/* Hide the `This account is owned by a business` checkbox and label */
+#ownedBusiness,
+label[for^="ownedBusiness"] {
+ @extend %vw-hide;
+}
+
+/* Hide the radio button and label for the `Custom` org user type */
+#userTypeCustom,
+label[for^="userTypeCustom"] {
+ @extend %vw-hide;
+}
+
+/* Hide Business Name */
+app-org-account form div bit-form-field.tw-block:nth-child(3) {
+ @extend %vw-hide;
+}
+
+/* Hide organization plans */
+app-organization-plans > form > h2.mt-5 {
+ @extend %vw-hide;
+}
+
+/* Hide Device Verification form at the Two Step Login screen */
+app-security > app-two-factor-setup > form {
+ @extend %vw-hide;
+}
+
+/* Replace the Bitwarden Shield at the top left with a Vaultwarden icon */
+.bwi-shield:before {
+ content: "" !important;
+ width: 32px !important;
+ height: 40px !important;
+ display: block !important;
+ background-image: url(../images/icon-white.png) !important;
+ background-repeat: no-repeat;
+ background-position-y: bottom;
+}
+/**** END Vaultwarden CHANGES ****/
diff --git a/apps/web/src/scss/variables.scss b/apps/web/src/scss/variables.scss
index 9d3d8d6ad4..5bc773c0d8 100644
--- a/apps/web/src/scss/variables.scss
+++ b/apps/web/src/scss/variables.scss
@@ -3,7 +3,7 @@ $dark-icon-themes: "theme_dark";
$primary: #175ddc;
$primary-accent: #1252a3;
$secondary: #ced4da;
-$secondary-alt: #1a3b66;
+$secondary-alt: #212529;
$success: #017e45;
$info: #555555;
$warning: #8b6609;
diff --git a/apps/web/webpack.config.js b/apps/web/webpack.config.js
index 6ac384cb82..0492e09476 100644
--- a/apps/web/webpack.config.js
+++ b/apps/web/webpack.config.js
@@ -141,8 +141,6 @@ const plugins = [
{ from: "./src/favicon.ico" },
{ from: "./src/browserconfig.xml" },
{ from: "./src/app-id.json" },
- { from: "./src/404.html" },
- { from: "./src/404", to: "404" },
{ from: "./src/images", to: "images" },
{ from: "./src/locales", to: "locales" },
{ from: "../../node_modules/qrious/dist/qrious.min.js", to: "scripts" },
diff --git a/libs/angular/src/auth/components/register.component.ts b/libs/angular/src/auth/components/register.component.ts
index 3cffebe71b..c1229b5c2c 100644
--- a/libs/angular/src/auth/components/register.component.ts
+++ b/libs/angular/src/auth/components/register.component.ts
@@ -106,6 +106,14 @@ export class RegisterComponent extends CaptchaProtectedComponent implements OnIn
}
async submit(showToast = true) {
+ if (typeof crypto.subtle === "undefined") {
+ this.platformUtilsService.showToast(
+ "error",
+ "This browser requires HTTPS to use the web vault",
+ "Check the Vaultwarden wiki for details on how to enable it",
+ );
+ return;
+ }
let email = this.formGroup.value.email;
email = email.trim().toLowerCase();
let name = this.formGroup.value.name;
diff --git a/libs/angular/src/auth/components/two-factor-options.component.ts b/libs/angular/src/auth/components/two-factor-options.component.ts
index 4293eb9966..7a8e861e8d 100644
--- a/libs/angular/src/auth/components/two-factor-options.component.ts
+++ b/libs/angular/src/auth/components/two-factor-options.component.ts
@@ -30,7 +30,9 @@ export class TwoFactorOptionsComponent implements OnInit {
}
recover() {
- this.platformUtilsService.launchUri("https://vault.bitwarden.com/#/recover-2fa");
+ this.platformUtilsService.launchUri(
+ "https://bitwarden.com/help/two-step-recovery-code/#use-your-recovery-code",
+ );
this.onRecoverSelected.emit();
}
}
diff --git a/libs/components/src/tw-theme.css b/libs/components/src/tw-theme.css
index 75a8fa6380..733dbe9413 100644
--- a/libs/components/src/tw-theme.css
+++ b/libs/components/src/tw-theme.css
@@ -6,12 +6,12 @@
--color-background: 255 255 255;
--color-background-alt: 251 251 251;
--color-background-alt2: 23 92 219;
- --color-background-alt3: 18 82 163;
- --color-background-alt4: 13 60 119;
+ --color-background-alt3: 33 37 41; /* bg of menu panel */
+ --color-background-alt4: 16 18 21; /* bg of active menu item */
- --color-primary-300: 103 149 232;
- --color-primary-500: 23 93 220;
- --color-primary-700: 18 82 163;
+ --color-primary-300: 108 117 125; /* hover of menu items */
+ --color-primary-500: 18 82 163; /* color of links and buttons */
+ --color-primary-700: 13 60 119; /* hover of links and buttons */
--color-secondary-100: 240 240 240;
--color-secondary-300: 206 212 220;

View file

@ -0,0 +1,7 @@
<svg version="1.1" viewBox="0 0 800 200" xmlns="http://www.w3.org/2000/svg">
<path class="tw-fill-text-alt2" d="m457.16 129.39-11.407-36.49q-1.0783-3.3482-4.0292-15.209h-.454q-2.27 9.9313-3.9725 15.322l-11.747 36.377h-10.896l-16.968-62.197h9.8744q6.0158 23.438 9.137 35.696 3.178 12.258 3.632 16.514h.454q.62424-3.2347 1.9863-8.342 1.4188-5.1642 2.4402-8.1717l11.407-35.696h10.215l11.123 35.696q3.178 9.7611 4.313 16.401h.454q.227-2.043 1.1918-6.2993 1.0215-4.2562 11.861-45.797h9.7611l-17.195 62.197zm77.858 0-1.8727-8.8528h-.454q-4.6535 5.8455-9.3072 7.9451-4.5968 2.043-11.52 2.043-9.2503 0-14.528-4.767-5.221-4.767-5.221-13.563 0-18.841 30.134-19.749l10.555-.3405v-3.859q0-7.3209-3.178-10.783-3.1212-3.5185-10.045-3.5185-7.7748 0-17.592 4.767l-2.8943-7.207q4.5968-2.497 10.045-3.9158 5.5048-1.4187 11.009-1.4187 11.123 0 16.457 4.9373 5.3912 4.9373 5.3912 15.833v42.449zm-21.281-6.6399q8.7964 0 13.79-4.8238 5.0508-4.8238 5.0508-13.506v-5.6183l-9.4205.39725q-11.237.39725-16.231 3.5185-4.9372 3.0645-4.9372 9.5908 0 5.1075 3.0645 7.7748 3.1212 2.6672 8.6825 2.6672zm76.045-56.693q4.1428 0 7.4343.68101l-1.3053 8.7395q-3.859-.85122-6.8101-.85122-7.5476 0-12.939 6.1291-5.3345 6.1291-5.3345 15.266v33.369h-9.4205v-62.197h7.7748l1.0783 11.52h.454q3.4617-6.0721 8.3425-9.3636 4.8805-3.2915 10.726-3.2915zm59.077 54.991h-.51081q-6.526 9.4775-19.522 9.4775-12.201 0-19.011-8.342-6.7532-8.342-6.7532-23.721t6.8102-23.892q6.8101-8.5122 18.954-8.5122 12.655 0 19.408 9.1933h.73779l-.39725-4.4832-.22704-4.3697v-25.311h9.4205v88.301h-7.6615zm-18.841 1.589q9.6478 0 13.96-5.221 4.3697-5.2777 4.3697-16.968v-1.9863q0-13.223-4.4264-18.841-4.3698-5.675-14.017-5.675-8.2856 0-12.712 6.4696-4.3698 6.4127-4.3698 18.16 0 11.918 4.3698 17.99 4.3697 6.0721 12.825 6.0721zm74 7.8881q-13.79 0-21.792-8.3989-7.9451-8.3989-7.9451-23.324 0-15.039 7.3773-23.892 7.4343-8.8528 19.919-8.8528 11.69 0 18.501 7.7179 6.8101 7.6615 6.8101 20.26v5.9588h-42.846q.28376 10.953 5.5048 16.628 5.2777 5.675 14.812 5.675 10.045 0 19.863-4.1995v8.3989q-4.994 2.1565-9.4775 3.0645-4.4265.96478-10.726.96478zm-2.5537-56.58q-7.4912 0-11.975 4.8805-4.4265 4.8805-5.221 13.506h32.518q0-8.9097-3.9725-13.62-3.9725-4.767-11.35-4.767zm84.047 55.445v-40.236q0-7.6045-3.4617-11.35-3.4618-3.7455-10.839-3.7455-9.7611 0-14.301 5.2777t-4.54 17.422v32.631h-9.4205v-62.197h7.6615l1.5322 8.5122h.45403q2.8942-4.5968 8.1153-7.0937 5.221-2.5537 11.634-2.5537 11.237 0 16.912 5.448 5.675 5.3912 5.675 17.309v40.576z"/>
<path class="tw-fill-text-alt2" d="m213.24 129.39-3.3482-8.6261h-.454q-4.3697 5.5048-9.023 7.6615-4.5968 2.0998-12.031 2.0998-9.137 0-14.415-5.221-5.221-5.221-5.221-14.869 0-10.102 7.0368-14.869 7.0937-4.8238 21.338-5.3345l11.009-.3405v-2.7808q0-9.6478-9.8744-9.6478-7.6045 0-17.876 4.5968l-5.7318-11.69q10.953-5.7318 24.289-5.7318 12.769 0 19.579 5.5615 6.8102 5.5615 6.8102 16.912v42.279zm-5.1075-29.397-6.6962.227q-7.5476.227-11.237 2.724-3.6888 2.497-3.6888 7.6045 0 7.321 8.3989 7.321 6.0158 0 9.5908-3.4617 3.632-3.4617 3.632-9.1933zm79.962 29.397-2.3268-8.1153h-.908q-2.7808 4.4265-7.8881 6.8665-5.1075 2.3835-11.634 2.3835-11.18 0-16.855-5.9588-5.675-6.0158-5.675-17.252v-41.371h17.309v37.058q0 6.8665 2.4402 10.328 2.4402 3.405 7.7748 3.405 7.264 0 10.499-4.8238 3.2348-4.8805 3.2348-16.117v-29.85h17.309v63.447zm48.748 0h-17.309v-88.301h17.309zm44.889-12.655q4.54 0 10.896-1.9863v12.882q-6.4696 2.8943-15.89 2.8943-10.385 0-15.152-5.221-4.7103-5.2777-4.7103-15.776v-30.588h-8.2856v-7.321l9.5338-5.7885 4.994-13.393h11.066v13.506h17.763v12.996h-17.763v30.588q0 3.6887 2.043 5.448 2.0998 1.7592 5.5047 1.7592z"/>
<path class="tw-fill-text-alt2" d="m51.982 33.947-15.322.002 41.131 115.17h14.518l41.131-115.17h-15.162l-25.971 73.872c-1.7205 4.7315-3.1706 9.1927-4.3535 13.387-1.1829 4.086-2.1516 8.0119-2.9043 11.775-.75272-3.7636-1.7195-7.7417-2.9023-11.936-1.1829-4.1938-2.635-8.7098-4.3555-13.549l-25.809-73.552z"/>
<path class="tw-fill-text-alt2" d="m84.264 5.0749a2.3288 2.3288 0 00-1.2122.99654l-4.145 6.9077c-.72599.06029-1.4502.12529-2.1701.20657l-5.406-5.9599a2.3288 2.3288 0 00-3.9203.77975l-2.7161 7.5796c-.7008.20184-1.4008.40458-2.0929.62653l-6.4616-4.7875a2.3288 2.3288 0 00-3.691 1.53l-1.1884 7.9871c-.63834.33084-1.2749.66363-1.9023 1.0124l-7.297-3.4482a2.3288 2.3288 0 00-3.3222 2.2201l.39272 8.0937c-.55229.44111-1.0997.8874-1.639 1.3438l-7.8588-1.9647a2.3288 2.3288 0 00-2.825 2.825l1.9647 7.8588c-.45646.53923-.90273 1.0867-1.3439 1.639l-8.0937-.39271a2.3288 2.3288 0 00-2.2201 3.3222l3.4482 7.297c-.3488.62737-.68158 1.2639-1.0124 1.9023l-7.9871 1.1884a2.3288 2.3288 0 00-1.53 3.6911l4.7875 6.4616c-.22196.69217-.4247 1.3921-.62653 2.093l-7.5796 2.7161a2.3288 2.3288 0 00-.77976 3.9203l5.9599 5.4061c-.08128.71995-.14628 1.4442-.20657 2.1701l-6.9077 4.1451a2.3288 2.3288 0 000 3.9952l6.9077 4.1439c.06028.72636.12524 1.451.20657 2.1713l-5.9599 5.4061a2.3288 2.3288 0 00.77976 3.9192l7.5796 2.7161c.20188.70099.4045 1.4017.62653 2.0941l-4.7875 6.4605a2.3288 2.3288 0 001.53 3.6922l7.9871 1.1884c.33079.63822.6637 1.275 1.0124 1.9023l-3.4482 7.297a2.3288 2.3288 0 002.2201 3.3222l8.0937-.39272c.44117.55235.88734 1.0997 1.3439 1.639l-1.9647 7.8588a2.3288 2.3288 0 002.825 2.825l7.8588-1.9647c.53923.45647 1.0867.90273 1.639 1.3438l-.39272 8.0926a2.3288 2.3288 0 003.3222 2.2201l7.297-3.447c.62736.34881 1.2639.68158 1.9023 1.0124l1.1884 7.987a2.3288 2.3288 0 003.691 1.5289l6.4616-4.7864c.69217.22197 1.3921.4247 2.0929.62654l2.7161 7.5796a2.3288 2.3288 0 003.9203.7786l5.4049-5.9588c.72031.0813 1.4449.14624 2.1713.20656l4.145 6.9077a2.3288 2.3288 0 003.9952 0l4.1439-6.9077c.72674-.0603 1.4517-.12518 2.1724-.20656l5.4049 5.9588a2.3288 2.3288 0 003.9192-.7786l2.7161-7.5796c.70103-.20189 1.4017-.4045 2.0941-.62654l6.4605 4.7864a2.3288 2.3288 0 003.6922-1.5289l1.1884-7.987c.63823-.33079 1.275-.6637 1.9023-1.0124l7.297 3.447a2.3288 2.3288 0 003.3222-2.2201l-.39271-8.0926c.55234-.44117 1.0997-.88734 1.639-1.3438l7.8588 1.9647a2.3288 2.3288 0 002.825-2.825l-1.9647-7.8588c.4565-.53928.90269-1.0866 1.3438-1.639l8.0926.39272a2.3288 2.3288 0 002.2201-3.3222l-3.447-7.297c.34872-.62723.68163-1.264 1.0124-1.9023l7.987-1.1884a2.3288 2.3288 0 001.5289-3.6922l-4.7863-6.4605c.22202-.69235.42462-1.3931.62652-2.0941l7.5796-2.7161a2.3288 2.3288 0 00.77862-3.9192l-5.9588-5.4049c.0814-.72069.14623-1.4457.20658-2.1724l6.9077-4.1439a2.3288 2.3288 0 000-3.9952l-6.9077-4.1451c-.0603-.72635-.12524-1.451-.20658-2.1713l5.9588-5.4049a2.3288 2.3288 0 00-.77862-3.9203l-7.5796-2.7161c-.20184-.70082-.40457-1.4008-.62652-2.093l4.7863-6.4616a2.3288 2.3288 0 00-1.5289-3.6911l-7.987-1.1884c-.33084-.63836-.66362-1.2749-1.0124-1.9023l3.447-7.297a2.3288 2.3288 0 00-2.2201-3.3222l-8.0926.39271c-.44112-.55229-.8874-1.0997-1.3438-1.639l1.9647-7.8588a2.3288 2.3288 0 00-2.825-2.825l-7.8588 1.9647c-.53927-.4565-1.0866-.9027-1.639-1.3438l.39271-8.0937a2.3288 2.3288 0 00-3.3222-2.2201l-7.297 3.4482c-.62726-.34873-1.264-.68165-1.9023-1.0124l-1.1884-7.9871a2.3288 2.3288 0 00-3.6922-1.53l-6.4605 4.7875c-.69236-.22201-1.3931-.42463-2.0941-.62653l-2.7161-7.5796a2.3288 2.3288 0 00-3.9192-.77975l-5.406 5.9599c-.72032-.08133-1.4449-.14626-2.1713-.20657l-4.1439-6.9077a2.3288 2.3288 0 00-2.783-.99654zm.78543 14.613a4.657 4.657 0 014.6569 4.6569 4.657 4.657 0 01-4.6569 4.6569 4.657 4.657 0 01-4.6569-4.6569 4.657 4.657 0 014.6569-4.6569zm-10.998 8.0064 7.7056 7.7056a4.6575 4.6575 0 006.5853 0l7.7056-7.7056c17.959 3.3214 33.023 14.65 41.468 30.141l-4.943 9.6998a4.6575 4.6575 0 002.0351 6.263l9.7123 4.9486c.32157 2.5182.49487 5.0839.49487 7.692 0 15.934-6.1974 30.369-16.306 41.066l-10.796-1.7093a4.6575 4.6575 0 00-5.3277 3.8704l-1.7116 10.804c-7.7603 3.6739-16.443 5.734-25.624 5.734-9.1812 0-17.864-2.0608-25.625-5.7352l-1.7116-10.803a4.6575 4.6575 0 00-5.3277-3.8715l-10.795 1.7105c-10.108-10.697-16.306-25.132-16.306-41.066 0-2.608.1733-5.1738.49487-7.692l9.7111-4.9486a4.6575 4.6575 0 002.0351-6.263l-4.9418-9.6986c8.4449-15.492 23.508-26.821 41.468-30.142zm-47.923 34.902a4.657 4.657 0 011.3064.22587 4.657 4.657 0 012.9896 5.868 4.657 4.657 0 01-5.868 2.9907 4.657 4.657 0 01-2.9907-5.8691 4.657 4.657 0 014.5627-3.2155zm117.84 0a4.657 4.657 0 014.5616 3.2155 4.657 4.657 0 01-2.9896 5.8691 4.657 4.657 0 01-5.868-2.9907 4.657 4.657 0 012.9896-5.868 4.657 4.657 0 011.3064-.22587zm-95.153 69.428a4.657 4.657 0 012.4709.88189 4.657 4.657 0 011.0306 6.5047 4.657 4.657 0 01-6.5047 1.0306 4.657 4.657 0 01-1.0306-6.5047 4.657 4.657 0 014.0338-1.9125zm72.463 0a4.657 4.657 0 014.0338 1.9125 4.657 4.657 0 01-1.0306 6.5047 4.657 4.657 0 01-6.5047-1.0306 4.657 4.657 0 011.0306-6.5047 4.657 4.657 0 012.4709-.88189z"/>
<path class="tw-fill-text-alt2" d="m406.1 185.44-4.8026-12.342h-15.803l-4.7468 12.342h-5.0817l15.58-40.04h4.5232l15.524 40.04zm-10.778-28.871q-.16753-.44674-.55844-1.6194-.3909-1.1727-.7818-2.4012-.33505-1.2844-.55843-1.9545-.39091 1.7312-.89345 3.4064-.50261 1.6194-.83768 2.5687l-4.5233 12.062h12.62zm31.384 29.429q-5.5844 0-8.9346-3.8532-3.3506-3.9091-3.3506-11.615t3.3506-11.615q3.4064-3.9649 8.9905-3.9649 3.4623 0 5.6402 1.2844 2.2338 1.2844 3.6298 3.1271h.33506q-.0559-.72595-.22337-2.122-.11169-1.4518-.11169-2.2895v-11.951h4.9142v42.441h-3.9649l-.72593-4.0207h-.22339q-1.3403 1.8987-3.574 3.2389-2.2338 1.3402-5.7519 1.3402zm.7818-4.0765q4.7468 0 6.6452-2.5687 1.9545-2.6246 1.9545-7.8738v-.89347q0-5.5844-1.8428-8.544-1.8428-3.0155-6.8127-3.0155-3.9649 0-5.975 3.1831-1.9545 3.1272-1.9545 8.4322 0 5.3609 1.9545 8.3206 2.0103 2.9597 6.0309 2.9597zm55.788-26.972q5.0817 0 7.5946 2.6246 2.5129 2.5687 2.5129 8.3764v19.489h-4.8584v-19.266q0-7.092-6.0867-7.092-4.3558 0-6.2542 2.5129-1.8428 2.5129-1.8428 7.3154v16.529h-4.8584v-19.266q0-7.092-6.1426-7.092-4.5232 0-6.2542 2.7922-1.7312 2.7922-1.7312 8.0414v15.524h-4.9142v-29.933h3.9649l.72595 4.0766h.27922q1.3961-2.3454 3.7416-3.4623 2.4012-1.1727 5.0817-1.1727 7.0362 0 9.1582 5.0258h.27921q1.5078-2.5687 4.0766-3.7974 2.6246-1.2286 5.5284-1.2286zm21.891-10.666q1.1169 0 1.9545.78178.89355.72598.89355 2.3454 0 1.5636-.89355 2.3454-.83765.78179-1.9545.78179-1.2286 0-2.0662-.78179-.83766-.7818-.83766-2.3454 0-1.6194.83766-2.3454.83763-.78178 2.0662-.78178zm2.4012 11.225v29.933h-4.9141v-29.933zm23.901-.55843q5.3609 0 8.0972 2.6246 2.7363 2.5687 2.7363 8.3765v19.489h-4.8584v-19.154q0-7.2037-6.701-7.2037-4.97 0-6.8686 2.7922-1.8987 2.7922-1.8987 8.0414v15.524h-4.9142v-29.933h3.9649l.72596 4.0766h.27921q1.4519-2.3454 4.0207-3.4623 2.5687-1.1727 5.4167-1.1727zm52.381-5.5285q-6.4218 0-10.108 4.3-3.6857 4.3-3.6857 11.783 0 7.4271 3.4064 11.783 3.4623 4.3 10.331 4.3 2.6246 0 4.97-.44675 2.3454-.44675 4.5792-1.1169v4.3558q-2.2337.83766-4.635 1.2286-2.3454.3909-5.6402.3909-6.0867 0-10.163-2.5129-4.0768-2.5129-6.1426-7.1479-2.0103-4.635-2.0103-10.889 0-6.0309 2.1778-10.61 2.2337-4.6351 6.5335-7.2037 4.3-2.6246 10.443-2.6246 6.3101 0 11.001 2.3454l-2.0103 4.2441q-1.8428-.83766-4.1325-1.5078-2.2337-.67011-4.9141-.67011zm43.558 20.997q0 7.4271-3.7974 11.503-3.7416 4.0765-10.163 4.0765-3.9649 0-7.092-1.787-3.0713-1.8428-4.8584-5.3051-1.787-3.5181-1.787-8.4881 0-7.4271 3.7416-11.448 3.7416-4.0207 10.163-4.0207 4.0765 0 7.1479 1.8428 3.1271 1.787 4.8584 5.2492 1.787 3.4064 1.787 8.3764zm-22.617 0q0 5.3051 2.0662 8.4322 2.122 3.0714 6.701 3.0714 4.5233 0 6.6452-3.0714 2.122-3.1271 2.122-8.4322t-2.122-8.3206q-2.122-3.0155-6.701-3.0155-4.5792 0-6.6452 3.0155-2.0662 3.0155-2.0662 8.3206zm44.786-15.468q5.361 0 8.0973 2.6246 2.7363 2.5687 2.7363 8.3765v19.489h-4.8584v-19.154q0-7.2037-6.701-7.2037-4.97 0-6.8685 2.7922-1.8987 2.7922-1.8987 8.0414v15.524h-4.9142v-29.933h3.9649l.72597 4.0765h.2792q1.4519-2.3454 4.0207-3.4623 2.5687-1.1727 5.4168-1.1727zm39.593 22.225q0 4.3558-3.2389 6.5894-3.2389 2.2338-8.7119 2.2338-3.1271 0-5.4168-.5026-2.2338-.50258-3.9649-1.396v-4.4675q1.787.89346 4.3 1.6753 2.5687.72594 5.1934.72594 3.7416 0 5.4168-1.1727 1.6752-1.2286 1.6752-3.2389 0-1.1169-.61424-2.0103-.61426-.89347-2.2337-1.787-1.5636-.89346-4.5233-2.0103-2.9039-1.1169-4.97-2.2337-2.0662-1.1169-3.1831-2.6805-1.1169-1.5636-1.1169-4.0208 0-3.7974 3.0714-5.8635 3.1272-2.0662 8.153-2.0662 2.7363 0 5.0818.55842 2.4012.50259 4.4675 1.4519l-1.6752 3.9091q-1.8987-.78179-3.9649-1.3403-2.0662-.55842-4.2441-.55842-3.0155 0-4.6351 1.0052-1.5636.94937-1.5636 2.6246 0 1.2286.72596 2.122.72595.83764 2.4012 1.6753 1.7311.78179 4.5792 1.8987 2.848 1.061 4.8584 2.1779 2.0104 1.1169 3.0713 2.7363 1.0611 1.5636 1.0611 3.9649zm33.283-6.7569q0 7.4271-3.7974 11.503-3.7416 4.0766-10.163 4.0766-3.9649 0-7.092-1.787-3.0714-1.8428-4.8583-5.3051-1.787-3.5181-1.787-8.4881 0-7.4271 3.7416-11.448 3.7416-4.0207 10.163-4.0207 4.0766 0 7.1479 1.8428 3.1271 1.787 4.8584 5.2492 1.787 3.4064 1.787 8.3764zm-22.617 0q0 5.3051 2.0662 8.4322 2.122 3.0714 6.701 3.0714 4.5233 0 6.6452-3.0714 2.122-3.1271 2.122-8.4322 0-5.3051-2.122-8.3206-2.122-3.0155-6.701-3.0155t-6.6452 3.0155q-2.0662 3.0155-2.0662 8.3206zm35.293 15.022h-4.9142v-42.441h4.9142zm21.053-30.491q3.8532 0 6.5894 1.6753 2.7922 1.6754 4.2441 4.7468 1.5078 3.0155 1.5078 7.092v2.9597h-20.494q.11169 5.0818 2.5687 7.7621 2.5129 2.6246 6.9803 2.6246 2.848 0 5.0259-.50258 2.2337-.55844 4.5792-1.5636v4.3q-2.2895 1.0052-4.5233 1.4519-2.2337.5026-5.3051.5026-4.2441 0-7.5388-1.7312-3.2389-1.7312-5.0817-5.1376-1.787-3.4623-1.787-8.4322 0-4.9142 1.6194-8.4322 1.6754-3.5181 4.635-5.4168 3.0155-1.8986 6.9803-1.8986zm-.0559 4.0207q-3.5181 0-5.5844 2.2895-2.0103 2.2337-2.4012 6.2543h15.245q-.0559-3.7974-1.787-6.1426-1.7311-2.4012-5.4726-2.4012z" stroke-width=".93783"/>
</svg>

After

Width:  |  Height:  |  Size: 13 KiB

File diff suppressed because one or more lines are too long

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -1,6 +1,18 @@
#!/usr/bin/env bash
set -o pipefail -o errexit
function replace_embedded_svg_icon() {
if [ ! -f $1 ]; then echo "$1 does not exist"; exit -1; fi
if [ ! -f $2 ]; then echo "$2 does not exist"; exit -1; fi
echo "'$1' -> '$2'"
first='`$'
last='^`'
sed -i "/$first/,/$last/{ /$first/{p; r $1
}; /$last/p; d }" $2
}
# If a patch was not provided, try to choose one
if [[ -z ${PATCH_NAME} ]]; then
# If a patch with the same name as the ref exists, use it
@ -29,6 +41,14 @@ fi
echo "Patching images"
cp -vfR ../resources/src/* ./apps/web/src/
echo "Patching logos"
replace_embedded_svg_icon \
../resources/vaultwarden-admin-console-logo.svg \
./apps/web/src/app/admin-console/icons/admin-console-logo.ts
replace_embedded_svg_icon \
../resources/vaultwarden-password-manager-logo.svg \
./apps/web/src/app/layouts/password-manager-logo.ts
echo "Using patch: ${PATCH_NAME}"
git apply "../patches/${PATCH_NAME}" --reject

View file

@ -23,7 +23,7 @@ fi
PATCH_FILENAME="${VAULT_VERSION}.patch"
if [ "$(git status --porcelain | wc -l)" -ge 1 ]; then
git --no-pager diff --no-color --minimal -- . \
git --no-pager diff --no-color --minimal --abbrev=10 -- . \
':!package-lock.json' \
':!apps/web/src/favicon.ico' \
':!apps/web/src/images/logo-dark@2x.png' \
@ -36,6 +36,8 @@ if [ "$(git status --porcelain | wc -l)" -ge 1 ]; then
':!apps/web/src/images/icons/favicon-32x32.png' \
':!apps/web/src/images/icons/mstile-150x150.png' \
':!apps/web/src/images/icons/safari-pinned-tab.svg' \
':!apps/web/src/app/admin-console/icons/admin-console-logo.ts' \
':!apps/web/src/app/layouts/password-manager-logo.ts' \
> "../patches/${PATCH_FILENAME}"
echo "Patch has been created here: patches/${PATCH_FILENAME}"
else