From ba1af08051aa74cdd75a425218200befc20b424b Mon Sep 17 00:00:00 2001 From: Leendert de Borst <6917405+lanedirt@users.noreply.github.com> Date: Sun, 21 Jun 2026 13:45:24 +0200 Subject: [PATCH] Update aliasvault.net to aliasvault.com in all apps as default URL (#2199) --- .env.example | 2 +- .github/ISSUE_TEMPLATE/config.yml | 2 +- .github/workflows/release.yml | 18 +++++----- ARCHITECTURE.md | 4 +-- CONTRIBUTING.md | 4 +-- README.md | 10 +++--- .../src/entrypoints/background.ts | 11 ++++++ .../popup/pages/auth/AuthSettings.tsx | 4 +-- .../entrypoints/popup/utils/ApiUrlUtility.ts | 2 +- .../0.29.7-LegacyApiUrlMigration.ts | 34 +++++++++++++++++++ .../browser-extension/src/migrations/index.ts | 14 ++++++++ apps/browser-extension/src/utils/AppInfo.ts | 4 +-- .../EncryptionUtility.crypto.test.ts | 3 +- .../aliasvault/app/webapi/WebApiService.kt | 2 +- .../app/(tabs)/settings/android-autofill.tsx | 2 +- apps/mobile-app/app/_layout.tsx | 4 ++- apps/mobile-app/app/login-settings.tsx | 2 +- apps/mobile-app/app/login.tsx | 2 +- apps/mobile-app/i18n/locales/en.json | 1 - .../AliasVaultUITests/AliasVaultUITests.swift | 2 +- .../Services/WebApiService.swift | 2 +- .../0.29.7-LegacyApiUrlMigration.ts | 28 +++++++++++++++ apps/mobile-app/migrations/index.ts | 14 ++++++++ apps/mobile-app/utils/ApiUrlUtility.ts | 2 +- apps/mobile-app/utils/AppInfo.ts | 4 +-- apps/server/AliasVault.Admin/Dockerfile | 2 +- apps/server/AliasVault.Api/Dockerfile | 2 +- apps/server/AliasVault.Client/Dockerfile | 2 +- .../Main/Pages/Settings/General.razor | 2 +- .../server/Databases/AliasServerDb/Dockerfile | 2 +- apps/server/Dockerfile | 2 +- .../AliasVault.SmtpService/Dockerfile | 2 +- .../Services/AliasVault.TaskRunner/Dockerfile | 2 +- .../TestData/TestImportBitwarden.csv | 2 +- .../Tests/Client/Shard3/ImportTests.cs | 4 +-- .../TestData/Exports/bitwarden.csv | 2 +- .../Utilities/ImportExportTests.cs | 4 +-- dockerfiles/all-in-one/Dockerfile | 2 +- docs/docs/contributing/ui-translations.md | 2 +- 39 files changed, 156 insertions(+), 53 deletions(-) create mode 100644 apps/browser-extension/src/migrations/0.29.7-LegacyApiUrlMigration.ts create mode 100644 apps/browser-extension/src/migrations/index.ts create mode 100644 apps/mobile-app/migrations/0.29.7-LegacyApiUrlMigration.ts create mode 100644 apps/mobile-app/migrations/index.ts diff --git a/.env.example b/.env.example index ee53e2914..5046594a1 100644 --- a/.env.example +++ b/.env.example @@ -35,7 +35,7 @@ FORCE_HTTPS_REDIRECT=true # In order to use AliasVault's private email domains feature, you need to configure # your DNS. Please refer to the full documentation for more instructions on DNS: -# https://docs.aliasvault.net/installation/install.html#3-email-server-setup +# https://docs.aliasvault.com/installation/script/#3-email-server-setup # # Set the private email domains below that the server should accept incoming mail for (comma separated values). # Example: PRIVATE_EMAIL_DOMAINS=example.com,example2.org diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 30b3a52ff..bc8c5f48f 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -4,5 +4,5 @@ contact_links: url: https://discord.gg/DsaXMTEtpF about: Ask questions and discuss ideas with the community on Discord - name: 📖 Documentation - url: https://docs.aliasvault.net + url: https://docs.aliasvault.com about: Check out the official (self-host) documentation \ No newline at end of file diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 6613ba063..3a5805028 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -375,31 +375,31 @@ jobs: - image: client dockerfile: apps/server/AliasVault.Client/Dockerfile title: AliasVault Client - description: Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) + description: Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com) - image: postgres dockerfile: apps/server/Databases/AliasServerDb/Dockerfile title: AliasVault PostgreSQL - description: PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) + description: PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com) - image: api dockerfile: apps/server/AliasVault.Api/Dockerfile title: AliasVault API - description: REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) + description: REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com) - image: admin dockerfile: apps/server/AliasVault.Admin/Dockerfile title: AliasVault Admin - description: Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) + description: Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com) - image: reverse-proxy dockerfile: apps/server/Dockerfile title: AliasVault Reverse Proxy - description: Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) + description: Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com) - image: smtp dockerfile: apps/server/Services/AliasVault.SmtpService/Dockerfile title: AliasVault SMTP Service - description: SMTP service for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) + description: SMTP service for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com) - image: task-runner dockerfile: apps/server/Services/AliasVault.TaskRunner/Dockerfile title: AliasVault TaskRunner - description: Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net) + description: Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com) - image: installcli dockerfile: apps/server/Utilities/AliasVault.InstallCli/Dockerfile title: AliasVault Install CLI @@ -499,9 +499,9 @@ jobs: type=raw,value={{branch}}-{{sha}},enable=${{ needs.detect-version.outputs.version == '' }} labels: | org.opencontainers.image.title=AliasVault All-in-One - org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.net). + org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.com). annotations: | - org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.net). + org.opencontainers.image.description=Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.com). - name: Build and push all-in-one image uses: docker/build-push-action@v7 diff --git a/ARCHITECTURE.md b/ARCHITECTURE.md index 9cede33eb..7e35acaec 100644 --- a/ARCHITECTURE.md +++ b/ARCHITECTURE.md @@ -27,7 +27,7 @@ The following encryption algorithms and standards are used by AliasVault: Below is a detailed explanation of each encryption algorithm and standard. -For more information about how these algorithms are specifically used in AliasVault, see the [Architecture Documentation](https://docs.aliasvault.net/architecture) section on the documentation site. +For more information about how these algorithms are specifically used in AliasVault, see the [Architecture Documentation](https://docs.aliasvault.com/architecture) section on the documentation site. ### Argon2id To derive a key from the master password, AliasVault uses the Argon2id key derivation function. Argon2id is a memory-hard @@ -164,4 +164,4 @@ The mobile login system combines RSA-2048 asymmetric encryption with AES-256-GCM - **MITM Protection**: Only the client with the RSA private key can decrypt the response - **Limited Attack Surface**: Short timeout window minimizes QR code interception risks -More information about the mobile login flow can be found in the [Architecture Documentation](https://docs.aliasvault.net/architecture/#6-login-with-mobile). +More information about the mobile login flow can be found in the [Architecture Documentation](https://docs.aliasvault.com/architecture/#6-login-with-mobile). diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 75efccfd0..cc17a7a51 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -44,7 +44,7 @@ In AliasVault, when creating a new credential AliasVault automatically generates - Create a list of common last names (surnames) - Optionally: Decade-specific names for more authentic generations -Read the specific instructions on how to contribute here: [Identity Generator Translations](https://docs.aliasvault.net/contributing/identity-generator.html). +Read the specific instructions on how to contribute here: [Identity Generator Translations](https://docs.aliasvault.com/contributing/identity-generator.html). ## 3. Contributing to the Documentation @@ -77,7 +77,7 @@ That said, we genuinely appreciate your ideas and proposals for UI/UX improvemen ### 4.2 Set up your local development environment You can find instructions on how to get your local development environment setup for the different parts of the AliasVault codebase here: -https://docs.aliasvault.net/misc/dev/ +https://docs.aliasvault.com/misc/dev/ > Tip: if the URL above is not available, the raw doc pages can also be found in the `docs` folder in this repository. diff --git a/README.md b/README.md index a8c0fda48..3a139db3c 100644 --- a/README.md +++ b/README.md @@ -8,7 +8,7 @@ AliasVault is a privacy-first password and email alias manager. Create unique id [Discord](https://discord.gg/DsaXMTEtpF) [](https://opencollective.com/aliasvault) -Try the cloud version 🔥 | Website | Documentation | Self-host instructions +Try the cloud version 🔥 | Website | Documentation | Self-host instructions **⭐ Star us on GitHub, it motivates us a lot!** @@ -49,10 +49,10 @@ Built on 15 years of experience, AliasVault is independent, open-source, self-ho ## Cloud-hosted -Use the official cloud version of AliasVault at [app.aliasvault.net](https://app.aliasvault.net). This fully supported platform is always up to date with our latest release. +Use the official cloud version of AliasVault at [app.aliasvault.com](https://app.aliasvault.com). This fully supported platform is always up to date with our latest release. AliasVault is available on: -- [Web (universal)](https://app.aliasvault.net) +- [Web (universal)](https://app.aliasvault.com) - [Chrome](https://chromewebstore.google.com/detail/aliasvault/bmoggiinmnodjphdjnmpcnlleamkfedj) - [Firefox](https://addons.mozilla.org/en-US/firefox/addon/aliasvault/) - [Edge](https://microsoftedge.microsoft.com/addons/detail/aliasvault/kabaanafahnjkfkplbnllebdmppdemfo) @@ -65,7 +65,7 @@ AliasVault is available on: Get it on F-Droid

-[Screenshot of AliasVault](https://app.aliasvault.net) +[Screenshot of AliasVault](https://app.aliasvault.com) ## Self-hosting > [!NOTE] @@ -96,7 +96,7 @@ For more information about the installation process, manual setup instructions a - [Documentation website (docs.aliasvault.com) 📚](https://docs.aliasvault.com) ## Security Architecture -AliasVault Security Architecture Diagram +AliasVault Security Architecture Diagram AliasVault takes security seriously and implements various measures to protect your data: diff --git a/apps/browser-extension/src/entrypoints/background.ts b/apps/browser-extension/src/entrypoints/background.ts index 488cd9836..a74aeaa1e 100644 --- a/apps/browser-extension/src/entrypoints/background.ts +++ b/apps/browser-extension/src/entrypoints/background.ts @@ -17,6 +17,8 @@ import type { MatchingPasskeysResponse, WebAuthnAssertionResponse, WebAuthnPubli import { isRpIdAllowedForHost, validateWebAuthnRequest } from '@/utils/passkey/WebAuthnRequestValidation'; import type { WebAuthnBridgeRequest } from '@/utils/passkey/WebAuthnRequestValidation'; +import { runStartupMigrations } from '@/migrations'; + import { defineBackground, browser } from '#imports'; type WebAuthnMessageSender = { @@ -329,6 +331,15 @@ export default defineBackground({ * already synchronous and complete before this runs. */ (async () : Promise => { + try { + /* + * Run one-time startup migrations. + */ + await runStartupMigrations(); + } catch (error) { + console.error('Error running startup migrations:', error); + } + try { const isContextMenuEnabled = await LocalPreferencesService.getGlobalContextMenuEnabled(); if (isContextMenuEnabled) { diff --git a/apps/browser-extension/src/entrypoints/popup/pages/auth/AuthSettings.tsx b/apps/browser-extension/src/entrypoints/popup/pages/auth/AuthSettings.tsx index 2518a2bfa..f85abfc6c 100644 --- a/apps/browser-extension/src/entrypoints/popup/pages/auth/AuthSettings.tsx +++ b/apps/browser-extension/src/entrypoints/popup/pages/auth/AuthSettings.tsx @@ -16,7 +16,7 @@ type ApiOption = { }; const DEFAULT_OPTIONS: ApiOption[] = [ - { label: 'Aliasvault.net', value: AppInfo.DEFAULT_API_URL }, + { label: 'AliasVault.com', value: AppInfo.DEFAULT_API_URL }, { label: 'Self-hosted', value: 'custom' } ]; @@ -165,7 +165,7 @@ const AuthSettings: React.FC = () => { } catch (error: unknown) { if (error instanceof Yup.ValidationError) { setErrors(prev => ({ ...prev, apiUrl: error.message })); - // On error we revert back to the aliasvault.net official hosted instance. + // On error we revert back to the aliasvault.com official hosted instance. await storage.setItem('local:apiUrl', AppInfo.DEFAULT_API_URL); await storage.setItem('local:clientUrl', AppInfo.DEFAULT_CLIENT_URL); pendingApiUrlRef.current = null; diff --git a/apps/browser-extension/src/entrypoints/popup/utils/ApiUrlUtility.ts b/apps/browser-extension/src/entrypoints/popup/utils/ApiUrlUtility.ts index 80894b3ab..126852f38 100644 --- a/apps/browser-extension/src/entrypoints/popup/utils/ApiUrlUtility.ts +++ b/apps/browser-extension/src/entrypoints/popup/utils/ApiUrlUtility.ts @@ -34,7 +34,7 @@ export const useApiUrl = (): { */ const getDisplayUrl = (): string => { const cleanUrl = apiUrl.replace('https://', '').replace('http://', '').replace(':443', '').replace('/api', ''); - return cleanUrl === 'app.aliasvault.net' ? 'aliasvault.net' : cleanUrl; + return cleanUrl === 'app.aliasvault.com' ? 'aliasvault.com' : cleanUrl; }; return { diff --git a/apps/browser-extension/src/migrations/0.29.7-LegacyApiUrlMigration.ts b/apps/browser-extension/src/migrations/0.29.7-LegacyApiUrlMigration.ts new file mode 100644 index 000000000..14fccd054 --- /dev/null +++ b/apps/browser-extension/src/migrations/0.29.7-LegacyApiUrlMigration.ts @@ -0,0 +1,34 @@ +import { AppInfo } from '@/utils/AppInfo'; + +import { storage } from '#imports'; + +/** + * Legacy official hosted URLs from before the aliasvault.net -> aliasvault.com domain move. + * Existing installs may still have these persisted from when they were the defaults. + */ +const LEGACY_API_URL = 'https://app.aliasvault.net/api'; +const LEGACY_CLIENT_URL = 'https://app.aliasvault.net'; + +/** + * One-time, idempotent migration that rewrites a persisted legacy aliasvault.net official URL to + * the current aliasvault.com default. Only the exact old official defaults are migrated; custom + * self-hosted URLs are left untouched. Safe to run on every startup (no-op once migrated or when + * the official instance is used, which is stored as an empty string). + * + * Added in the 0.29.7 release. Can be removed once installs from before 0.29.7 are no longer in use. + */ +export async function migrateLegacyApiUrl(): Promise { + try { + const apiUrl = await storage.getItem('local:apiUrl') as string | null; + if (apiUrl === LEGACY_API_URL) { + await storage.setItem('local:apiUrl', AppInfo.DEFAULT_API_URL); + } + + const clientUrl = await storage.getItem('local:clientUrl') as string | null; + if (clientUrl === LEGACY_CLIENT_URL) { + await storage.setItem('local:clientUrl', AppInfo.DEFAULT_CLIENT_URL); + } + } catch (error) { + console.error('Failed to migrate legacy API URL:', error); + } +} diff --git a/apps/browser-extension/src/migrations/index.ts b/apps/browser-extension/src/migrations/index.ts new file mode 100644 index 000000000..c70cf7444 --- /dev/null +++ b/apps/browser-extension/src/migrations/index.ts @@ -0,0 +1,14 @@ +import { migrateLegacyApiUrl } from '@/migrations/0.29.7-LegacyApiUrlMigration'; + +/** + * Generic entry point for one-time startup migrations. Called once during background startup; + * add any future migration as another awaited call below. Each migration must be idempotent and + * swallow its own errors so a single failure cannot block startup. + * + * Keeping every migration behind this single function means callers never touch app internals, + * and retiring a migration later is just deleting its file and removing its line here. + */ +export async function runStartupMigrations(): Promise { + // 0.29.7: Migrate legacy aliasvault.net URLs to aliasvault.com defaults. + await migrateLegacyApiUrl(); +} diff --git a/apps/browser-extension/src/utils/AppInfo.ts b/apps/browser-extension/src/utils/AppInfo.ts index 41922cff3..d090059ff 100644 --- a/apps/browser-extension/src/utils/AppInfo.ts +++ b/apps/browser-extension/src/utils/AppInfo.ts @@ -52,12 +52,12 @@ export class AppInfo { /** * The default AliasVault client URL. */ - public static readonly DEFAULT_CLIENT_URL = 'https://app.aliasvault.net'; + public static readonly DEFAULT_CLIENT_URL = 'https://app.aliasvault.com'; /** * The default AliasVault web API URL. */ - public static readonly DEFAULT_API_URL = 'https://app.aliasvault.net/api'; + public static readonly DEFAULT_API_URL = 'https://app.aliasvault.com/api'; /** * Prevent instantiation of this utility class diff --git a/apps/browser-extension/src/utils/__tests__/EncryptionUtility.crypto.test.ts b/apps/browser-extension/src/utils/__tests__/EncryptionUtility.crypto.test.ts index 9ae486918..a3f608839 100644 --- a/apps/browser-extension/src/utils/__tests__/EncryptionUtility.crypto.test.ts +++ b/apps/browser-extension/src/utils/__tests__/EncryptionUtility.crypto.test.ts @@ -47,6 +47,7 @@ async function createEmail( return { messageHtml: '', messagePlain: '', + messageSource: '', id: 1, subject: '', fromDisplay: '', @@ -78,7 +79,7 @@ async function encryptAttachmentBytes(plaintext: Uint8Array, rawSymmetricKey: st ['encrypt'] ); const iv = crypto.getRandomValues(new Uint8Array(12)); - const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, plaintext); + const ciphertext = await crypto.subtle.encrypt({ name: 'AES-GCM', iv }, key, new Uint8Array(plaintext)); const encryptedBytes = new Uint8Array(iv.length + ciphertext.byteLength); encryptedBytes.set(iv, 0); encryptedBytes.set(new Uint8Array(ciphertext), iv.length); diff --git a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/webapi/WebApiService.kt b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/webapi/WebApiService.kt index c836a565f..38ae5a6d2 100644 --- a/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/webapi/WebApiService.kt +++ b/apps/mobile-app/android/app/src/main/java/net/aliasvault/app/webapi/WebApiService.kt @@ -37,7 +37,7 @@ class WebApiService(private val context: Context) { private const val REFRESH_TOKEN_KEY = "refreshToken" private const val APP_INSTANCE_ID_KEY = "appInstanceId" private const val CUSTOM_PROXY_HEADERS_KEY = "customProxyHeaders" - private const val DEFAULT_API_URL = "https://app.aliasvault.net/api" + private const val DEFAULT_API_URL = "https://app.aliasvault.com/api" private const val SHARED_PREFS_NAME = "aliasvault" } diff --git a/apps/mobile-app/app/(tabs)/settings/android-autofill.tsx b/apps/mobile-app/app/(tabs)/settings/android-autofill.tsx index adaf5faf9..88481bc13 100644 --- a/apps/mobile-app/app/(tabs)/settings/android-autofill.tsx +++ b/apps/mobile-app/app/(tabs)/settings/android-autofill.tsx @@ -68,7 +68,7 @@ export default function AndroidAutofillScreen() : React.ReactNode { * Handle opening the documentation link. */ const handleOpenDocs = () : void => { - Linking.openURL('https://docs.aliasvault.net/mobile-apps/android/autofill.html'); + Linking.openURL('https://docs.aliasvault.com/installation/mobile-apps/android/autofill/'); }; /** diff --git a/apps/mobile-app/app/_layout.tsx b/apps/mobile-app/app/_layout.tsx index fde011902..3c28ae7ad 100644 --- a/apps/mobile-app/app/_layout.tsx +++ b/apps/mobile-app/app/_layout.tsx @@ -22,6 +22,7 @@ import { DialogProvider } from '@/context/DialogContext'; import { NavigationProvider, useNavigation } from '@/context/NavigationContext'; import { WebApiProvider } from '@/context/WebApiContext'; import { initI18n } from '@/i18n'; +import { runStartupMigrations } from '@/migrations'; SplashScreen.preventAutoHideAsync(); @@ -52,11 +53,12 @@ function RootLayoutNav() : React.ReactNode { /** * Initialize i18n and inspect the cold-start deep link in parallel. + * One-time startup migrations run here too. * If a deep link is detected, set the return URL so after succesful * initialization, the app will navigate to the deep link target. */ (async (): Promise => { - const [, initialUrl] = await Promise.all([initI18n(), Linking.getInitialURL()]); + const [, initialUrl] = await Promise.all([initI18n(), Linking.getInitialURL(), runStartupMigrations()]); const resolved = await resolveDeepLink(initialUrl); if (resolved) { diff --git a/apps/mobile-app/app/login-settings.tsx b/apps/mobile-app/app/login-settings.tsx index f4f1092e1..40a449130 100644 --- a/apps/mobile-app/app/login-settings.tsx +++ b/apps/mobile-app/app/login-settings.tsx @@ -49,7 +49,7 @@ export default function SettingsScreen() : React.ReactNode { const [isLoading, setIsLoading] = useState(true); const DEFAULT_OPTIONS: ApiOption[] = useMemo(() => [ - { label: t('app.loginSettings.aliasvaultNet'), value: AppInfo.DEFAULT_API_URL }, + { label: 'AliasVault.com', value: AppInfo.DEFAULT_API_URL }, { label: t('app.loginSettings.selfHosted'), value: 'custom' }, ], [t]); diff --git a/apps/mobile-app/app/login.tsx b/apps/mobile-app/app/login.tsx index 2ee01ac8c..9e19e8043 100644 --- a/apps/mobile-app/app/login.tsx +++ b/apps/mobile-app/app/login.tsx @@ -814,7 +814,7 @@ export default function LoginScreen() : React.ReactNode { {t('auth.noAccountYet')} diff --git a/apps/mobile-app/i18n/locales/en.json b/apps/mobile-app/i18n/locales/en.json index 7eb81d32f..8d5249daf 100644 --- a/apps/mobile-app/i18n/locales/en.json +++ b/apps/mobile-app/i18n/locales/en.json @@ -655,7 +655,6 @@ }, "loginSettings": { "title": "API Connection", - "aliasvaultNet": "Aliasvault.net", "selfHosted": "Self-hosted", "customApiUrl": "Custom API URL", "customApiUrlPlaceholder": "https://my-aliasvault-instance.com/api", diff --git a/apps/mobile-app/ios/AliasVaultUITests/AliasVaultUITests.swift b/apps/mobile-app/ios/AliasVaultUITests/AliasVaultUITests.swift index 68022c7bb..225012bdd 100644 --- a/apps/mobile-app/ios/AliasVaultUITests/AliasVaultUITests.swift +++ b/apps/mobile-app/ios/AliasVaultUITests/AliasVaultUITests.swift @@ -861,7 +861,7 @@ final class AliasVaultUITests: XCTestCase { @MainActor private func performLogin(with testUser: TestUser) { // Check if API URL is already configured to localhost by looking at the displayed URL - // The login screen shows the URL via server-url-link, containing text like "localhost:5100" or "aliasvault.net" + // The login screen shows the URL via server-url-link, containing text like "localhost:5100" or "aliasvault.com" let serverUrlLink = app.findElement(testID: "server-url-link") var needsApiConfig = true diff --git a/apps/mobile-app/ios/VaultStoreKit/Services/WebApiService.swift b/apps/mobile-app/ios/VaultStoreKit/Services/WebApiService.swift index a7b7d4030..356c4d393 100644 --- a/apps/mobile-app/ios/VaultStoreKit/Services/WebApiService.swift +++ b/apps/mobile-app/ios/VaultStoreKit/Services/WebApiService.swift @@ -15,7 +15,7 @@ public class WebApiService { private let customProxyHeadersKey = "customProxyHeaders" // Default API URL - private let defaultApiUrl = "https://app.aliasvault.net/api" + private let defaultApiUrl = "https://app.aliasvault.com/api" /// Shared UserDefaults for communication between main app and extension private let userDefaults = UserDefaults(suiteName: VaultConstants.userDefaultsSuite)! diff --git a/apps/mobile-app/migrations/0.29.7-LegacyApiUrlMigration.ts b/apps/mobile-app/migrations/0.29.7-LegacyApiUrlMigration.ts new file mode 100644 index 000000000..d628169df --- /dev/null +++ b/apps/mobile-app/migrations/0.29.7-LegacyApiUrlMigration.ts @@ -0,0 +1,28 @@ +import { AppInfo } from '@/utils/AppInfo'; + +import NativeVaultManager from '@/specs/NativeVaultManager'; + +/** + * Legacy official hosted API URL from before the aliasvault.net -> aliasvault.com domain move. + * Existing installs that were set up while this was the default still have it persisted natively. + */ +const LEGACY_API_URL = 'https://app.aliasvault.net/api'; + +/** + * One-time, idempotent migration that rewrites a persisted legacy aliasvault.net official API URL + * to the current aliasvault.com default. Only the exact old official default is migrated; custom + * self-hosted URLs are left untouched. Safe to run on every cold start (no-op once migrated or when + * no URL is stored). + * + * Added in the 0.29.7 release. Can be removed once installs from before 0.29.7 are no longer in use. + */ +export async function migrateLegacyApiUrl(): Promise { + try { + const apiUrl = await NativeVaultManager.getApiUrl(); + if (apiUrl === LEGACY_API_URL) { + await NativeVaultManager.setApiUrl(AppInfo.DEFAULT_API_URL); + } + } catch (error) { + console.warn('Failed to migrate legacy API URL:', error); + } +} diff --git a/apps/mobile-app/migrations/index.ts b/apps/mobile-app/migrations/index.ts new file mode 100644 index 000000000..375b4e06f --- /dev/null +++ b/apps/mobile-app/migrations/index.ts @@ -0,0 +1,14 @@ +import { migrateLegacyApiUrl } from '@/migrations/0.29.7-LegacyApiUrlMigration'; + +/** + * Generic entry point for one-time startup migrations. Called once during cold-start boot; + * add any future migration as another awaited call below. Each migration must be idempotent and + * swallow its own errors so a single failure cannot block startup. + * + * Keeping every migration behind this single function means callers never touch app internals, + * and retiring a migration later is just deleting its file and removing its line here. + */ +export async function runStartupMigrations(): Promise { + // 0.29.7: Migrate legacy aliasvault.net URLs to aliasvault.com defaults. + await migrateLegacyApiUrl(); +} diff --git a/apps/mobile-app/utils/ApiUrlUtility.ts b/apps/mobile-app/utils/ApiUrlUtility.ts index b783c4e39..f316e6a4c 100644 --- a/apps/mobile-app/utils/ApiUrlUtility.ts +++ b/apps/mobile-app/utils/ApiUrlUtility.ts @@ -37,7 +37,7 @@ export const useApiUrl = (): { */ const getDisplayUrl = (): string => { const cleanUrl = apiUrl.replace('https://', '').replace('http://', '').replace(':443', '').replace('/api', ''); - return cleanUrl === 'app.aliasvault.net' ? 'aliasvault.net' : cleanUrl; + return cleanUrl === 'app.aliasvault.com' ? 'aliasvault.com' : cleanUrl; }; return { diff --git a/apps/mobile-app/utils/AppInfo.ts b/apps/mobile-app/utils/AppInfo.ts index daaa4aee7..43aceff48 100644 --- a/apps/mobile-app/utils/AppInfo.ts +++ b/apps/mobile-app/utils/AppInfo.ts @@ -39,12 +39,12 @@ export class AppInfo { /** * The default AliasVault client URL. */ - public static readonly DEFAULT_CLIENT_URL = 'https://app.aliasvault.net'; + public static readonly DEFAULT_CLIENT_URL = 'https://app.aliasvault.com'; /** * The default AliasVault web API URL. */ - public static readonly DEFAULT_API_URL = 'https://app.aliasvault.net/api'; + public static readonly DEFAULT_API_URL = 'https://app.aliasvault.com/api'; /** * Prevent instantiation of this utility class diff --git a/apps/server/AliasVault.Admin/Dockerfile b/apps/server/AliasVault.Admin/Dockerfile index e38a5ecb0..f4c231bed 100644 --- a/apps/server/AliasVault.Admin/Dockerfile +++ b/apps/server/AliasVault.Admin/Dockerfile @@ -25,7 +25,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" LABEL org.opencontainers.image.vendor="AliasVault" LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.title="AliasVault Admin" -LABEL org.opencontainers.image.description="Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)" +LABEL org.opencontainers.image.description="Admin portal for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)" # Install Kerberos libraries to prevent .NET 10 GSSAPI warnings RUN apk add --no-cache krb5-libs diff --git a/apps/server/AliasVault.Api/Dockerfile b/apps/server/AliasVault.Api/Dockerfile index 90755a285..407a53da5 100644 --- a/apps/server/AliasVault.Api/Dockerfile +++ b/apps/server/AliasVault.Api/Dockerfile @@ -22,7 +22,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" LABEL org.opencontainers.image.vendor="AliasVault" LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.title="AliasVault API" -LABEL org.opencontainers.image.description="REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)" +LABEL org.opencontainers.image.description="REST API backend for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)" # Install Kerberos libraries to prevent .NET 10 GSSAPI warnings RUN apk add --no-cache krb5-libs diff --git a/apps/server/AliasVault.Client/Dockerfile b/apps/server/AliasVault.Client/Dockerfile index b6dec15c2..4b34675ee 100644 --- a/apps/server/AliasVault.Client/Dockerfile +++ b/apps/server/AliasVault.Client/Dockerfile @@ -100,7 +100,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" LABEL org.opencontainers.image.vendor="AliasVault" LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.title="AliasVault Client" -LABEL org.opencontainers.image.description="Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)" +LABEL org.opencontainers.image.description="Blazor WebAssembly client UI for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)" WORKDIR /usr/share/nginx/html COPY --from=publish /app/publish/wwwroot . diff --git a/apps/server/AliasVault.Client/Main/Pages/Settings/General.razor b/apps/server/AliasVault.Client/Main/Pages/Settings/General.razor index 897bed872..571775777 100644 --- a/apps/server/AliasVault.Client/Main/Pages/Settings/General.razor +++ b/apps/server/AliasVault.Client/Main/Pages/Settings/General.razor @@ -59,7 +59,7 @@ - @Localizer["DefaultEmailDomainDescription"] @Localizer["DefaultEmailDomainDescriptionNote"] @Localizer["DefaultEmailDomainLearnMore"]. + @Localizer["DefaultEmailDomainDescription"] @Localizer["DefaultEmailDomainDescriptionNote"] @Localizer["DefaultEmailDomainLearnMore"]. diff --git a/apps/server/Databases/AliasServerDb/Dockerfile b/apps/server/Databases/AliasServerDb/Dockerfile index bdf247914..7b695550b 100644 --- a/apps/server/Databases/AliasServerDb/Dockerfile +++ b/apps/server/Databases/AliasServerDb/Dockerfile @@ -5,7 +5,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" LABEL org.opencontainers.image.vendor="AliasVault" LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.title="AliasVault PostgreSQL" -LABEL org.opencontainers.image.description="PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)" +LABEL org.opencontainers.image.description="PostgreSQL database for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)" # Install pigz for parallel compression during database exports RUN apk add --no-cache pigz diff --git a/apps/server/Dockerfile b/apps/server/Dockerfile index 877572723..742a53a83 100644 --- a/apps/server/Dockerfile +++ b/apps/server/Dockerfile @@ -5,7 +5,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" LABEL org.opencontainers.image.vendor="AliasVault" LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.title="AliasVault Reverse Proxy" -LABEL org.opencontainers.image.description="Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)" +LABEL org.opencontainers.image.description="Nginx reverse proxy for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)" # Install OpenSSL and inotify-tools for certificate watching RUN apk add --no-cache openssl inotify-tools diff --git a/apps/server/Services/AliasVault.SmtpService/Dockerfile b/apps/server/Services/AliasVault.SmtpService/Dockerfile index f5a10acb5..7da8378f2 100644 --- a/apps/server/Services/AliasVault.SmtpService/Dockerfile +++ b/apps/server/Services/AliasVault.SmtpService/Dockerfile @@ -23,7 +23,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" LABEL org.opencontainers.image.vendor="AliasVault" LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.title="AliasVault SMTP Service" -LABEL org.opencontainers.image.description="SMTP service for email alias functionality in AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)" +LABEL org.opencontainers.image.description="SMTP service for email alias functionality in AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)" # Install Kerberos libraries to prevent .NET 10 GSSAPI warnings RUN apk add --no-cache krb5-libs diff --git a/apps/server/Services/AliasVault.TaskRunner/Dockerfile b/apps/server/Services/AliasVault.TaskRunner/Dockerfile index 6a3a2e9e0..9f9359e91 100644 --- a/apps/server/Services/AliasVault.TaskRunner/Dockerfile +++ b/apps/server/Services/AliasVault.TaskRunner/Dockerfile @@ -21,7 +21,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" LABEL org.opencontainers.image.vendor="AliasVault" LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.title="AliasVault TaskRunner" -LABEL org.opencontainers.image.description="Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.net)" +LABEL org.opencontainers.image.description="Background task runner for AliasVault. Part of multi-container setup and can be deployed via install.sh (see docs.aliasvault.com)" # Install Kerberos libraries to prevent .NET 10 GSSAPI warnings RUN apk add --no-cache krb5-libs diff --git a/apps/server/Tests/AliasVault.E2ETests/TestData/TestImportBitwarden.csv b/apps/server/Tests/AliasVault.E2ETests/TestData/TestImportBitwarden.csv index ae8a22598..7d3636684 100644 --- a/apps/server/Tests/AliasVault.E2ETests/TestData/TestImportBitwarden.csv +++ b/apps/server/Tests/AliasVault.E2ETests/TestData/TestImportBitwarden.csv @@ -3,6 +3,6 @@ Business,,login,Item for business folder,,,0,,crisply,4CSp43uhSZri8A, ,,login,Test,,,0,,,, ,,login,Test,,,0,,test2,asdasd, Business,,login,TutaNota,,,0,,avtest2@tutamail.com,blabla,otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30 -Business,,login,Aliasvault.net,,,0,https://www.aliasvault.com,root,toor, +Business,,login,Aliasvault.com,,,0,https://www.aliasvault.com,root,toor, Work/Projects,,login,WorkItem,,,0,https://work.example.com,workuser,workpass, Work/Projects/Active,,login,ActiveItem,,,0,https://active.example.com,activeuser,activepass, diff --git a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard3/ImportTests.cs b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard3/ImportTests.cs index 854aeab9e..025910425 100644 --- a/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard3/ImportTests.cs +++ b/apps/server/Tests/AliasVault.E2ETests/Tests/Client/Shard3/ImportTests.cs @@ -65,7 +65,7 @@ public class ImportTests : ClientPlaywrightTest { Assert.That(pageContent, Does.Contain("Test"), "Test item not imported at root level"); Assert.That(pageContent, Does.Not.Contain("TutaNota"), "TutaNota should be in Business folder, not at root"); - Assert.That(pageContent, Does.Not.Contain("Aliasvault.net"), "Aliasvault.net should be in Business folder, not at root"); + Assert.That(pageContent, Does.Not.Contain("Aliasvault.com"), "Aliasvault.com should be in Business folder, not at root"); }); // Verify the Business folder was created. @@ -84,7 +84,7 @@ public class ImportTests : ClientPlaywrightTest { Assert.That(folderPageContent, Does.Contain("Item for business folder"), "Item for business folder not imported"); Assert.That(folderPageContent, Does.Contain("TutaNota"), "TutaNota item not imported in Business folder"); - Assert.That(folderPageContent, Does.Contain("Aliasvault.net"), "Aliasvault.net item not imported in Business folder"); + Assert.That(folderPageContent, Does.Contain("Aliasvault.com"), "Aliasvault.com item not imported in Business folder"); }); // Navigate back to root and test hierarchical folders. diff --git a/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv b/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv index a4767f2a0..516d81254 100644 --- a/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv +++ b/apps/server/Tests/AliasVault.UnitTests/TestData/Exports/bitwarden.csv @@ -3,7 +3,7 @@ Business,,login,Item for business folder,,,0,,crisply,4CSp43uhSZri8A, ,,login,Test,,,0,,,, ,,login,Test,,,0,,test2,asdasd, Business,,login,TutaNota,,,0,,avtest2@tutamail.com,blabla,otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30 -Business,,login,Aliasvault.net,,,0,https://www.aliasvault.com,root,toor, +Business,,login,Aliasvault.com,,,0,https://www.aliasvault.com,root,toor, Business,,login,TutaNota3,,,0,"https://www.aliasvault.com,https://app.aliasvault.com,https://downloads.aliasvault.com",avtest3@tutamail.com,blabla,otpauth://totp/Test%20name%3Atest%40test.org?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&issuer=Alias%20Vault Business,,login,TutaNota4,,,0,,avtest4@tutamail.com,blabla,otpauth://totp/my.email@gmail.com?secret=TEST!INVALID&issuer=Alias%20Vault&algorithm=SHA1&digits=6&period=30 Business,,login,TutaNota5,,,0,,avtest5@tutamail.com,blabla,incorrectstring diff --git a/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs b/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs index 624ab2dbf..6412a583e 100644 --- a/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs +++ b/apps/server/Tests/AliasVault.UnitTests/Utilities/ImportExportTests.cs @@ -218,10 +218,10 @@ public class ImportExportTests Assert.That(tutaNotaCredential.TwoFactorSecret, Is.EqualTo("otpauth://totp/Strongbox?secret=PLW4SB3PQ7MKVXY2MXF4NEXS6Y&algorithm=SHA1&digits=6&period=30")); }); - var aliasVaultCredential = importedCredentials.First(c => c.ServiceName == "Aliasvault.net"); + var aliasVaultCredential = importedCredentials.First(c => c.ServiceName == "Aliasvault.com"); Assert.Multiple(() => { - Assert.That(aliasVaultCredential.ServiceName, Is.EqualTo("Aliasvault.net")); + Assert.That(aliasVaultCredential.ServiceName, Is.EqualTo("Aliasvault.com")); Assert.That(aliasVaultCredential.ServiceUrls?.FirstOrDefault(), Is.EqualTo("https://www.aliasvault.com")); Assert.That(aliasVaultCredential.Username, Is.EqualTo("root")); Assert.That(aliasVaultCredential.Password, Is.EqualTo("toor")); diff --git a/dockerfiles/all-in-one/Dockerfile b/dockerfiles/all-in-one/Dockerfile index ee350ce4b..89473d416 100644 --- a/dockerfiles/all-in-one/Dockerfile +++ b/dockerfiles/all-in-one/Dockerfile @@ -126,7 +126,7 @@ LABEL org.opencontainers.image.source="https://github.com/aliasvault/aliasvault" LABEL org.opencontainers.image.vendor="AliasVault" LABEL org.opencontainers.image.licenses="AGPL-3.0" LABEL org.opencontainers.image.title="AliasVault All-in-One" -LABEL org.opencontainers.image.description="Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.net)." +LABEL org.opencontainers.image.description="Self-contained AliasVault server including web app, with all services bundled using s6-overlay. Single container solution for easy deployment (see docs.aliasvault.com)." # Copy s6-overlay from downloader stage COPY --from=s6-downloader /*.tar.xz /tmp/ diff --git a/docs/docs/contributing/ui-translations.md b/docs/docs/contributing/ui-translations.md index 59b7712d9..308659c46 100644 --- a/docs/docs/contributing/ui-translations.md +++ b/docs/docs/contributing/ui-translations.md @@ -59,7 +59,7 @@ Other contributors may review and approve your translations. This helps ensure q ## What Gets Translated? The Crowdin project covers translations for all client apps in one place: -- Web app (https://app.aliasvault.net) +- Web app (https://app.aliasvault.com) - Browser extension - Mobile App (iOS and Android)