Compare commits
7 Commits
fefd5e0bff
...
54eb7cd355
Author | SHA1 | Date |
---|---|---|
1fexd | 54eb7cd355 | |
github-actions[bot] | e16074a73e | |
Vince Grassia | a333e72448 | |
Bitwarden DevOps | ffb7b3b8ac | |
1fexd | 4549dd5e12 | |
1fexd | c50347f0f6 | |
1fexd | ab24cbdd41 |
|
@ -65,7 +65,6 @@ jobs:
|
|||
description: 'Deployment ${{ steps.version.outputs.version }} from branch ${{ steps.branch.outputs.branch-name }}'
|
||||
task: release
|
||||
|
||||
|
||||
- name: Download all artifacts
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
uses: dawidd6/action-download-artifact@09f2f74827fd3a8607589e5ad7f9398816f540fe # v3.1.4
|
||||
|
@ -152,9 +151,7 @@ jobs:
|
|||
node-version: '16.x'
|
||||
|
||||
- name: Set up F-Droid server
|
||||
run: |
|
||||
sudo apt-get -qq update
|
||||
sudo apt-get -qqy install --no-install-recommends fdroidserver wget
|
||||
run: pip install git+https://gitlab.com/fdroid/fdroidserver.git
|
||||
|
||||
- name: Set up Git credentials
|
||||
env:
|
||||
|
@ -167,9 +164,10 @@ jobs:
|
|||
|
||||
- name: Print environment
|
||||
run: |
|
||||
node --version
|
||||
npm --version
|
||||
git --version
|
||||
echo "Node Version: $(node --version)"
|
||||
echo "NPM Version: $(npm --version)"
|
||||
echo "Git Version: $(git --version)"
|
||||
echo "F-Droid Server Version: $(fdroid --version)"
|
||||
echo "GitHub ref: $GITHUB_REF"
|
||||
echo "GitHub event: $GITHUB_EVENT"
|
||||
|
||||
|
@ -194,27 +192,30 @@ jobs:
|
|||
env:
|
||||
FDROID_STORE_KEYSTORE_PASSWORD: ${{ secrets.FDROID_STORE_KEYSTORE_PASSWORD }}
|
||||
run: |
|
||||
cd $GITHUB_WORKSPACE
|
||||
# Create required directories.
|
||||
mkdir dist
|
||||
cp CNAME ./dist
|
||||
cd store
|
||||
chmod 600 fdroid/config.py fdroid/keystore.jks
|
||||
mkdir -p temp/fdroid
|
||||
mkdir -p store/temp/fdroid
|
||||
mkdir -p store/fdroid/repo
|
||||
|
||||
# Configure F-Droid server.
|
||||
cp CNAME dist/
|
||||
chmod 600 store/fdroid/config.yml store/fdroid/keystore.jks
|
||||
TEMP_DIR="$GITHUB_WORKSPACE/store/temp/fdroid"
|
||||
cd fdroid
|
||||
echo "keypass=\"$FDROID_STORE_KEYSTORE_PASSWORD\"" >>config.py
|
||||
echo "keystorepass=\"$FDROID_STORE_KEYSTORE_PASSWORD\"" >>config.py
|
||||
echo "local_copy_dir=\"$TEMP_DIR\"" >>config.py
|
||||
mkdir -p repo
|
||||
mv $GITHUB_WORKSPACE/com.x8bit.bitwarden-fdroid.apk ./repo/
|
||||
echo "keypass: $FDROID_STORE_KEYSTORE_PASSWORD" >> store/fdroid/config.yml
|
||||
echo "keystorepass: $FDROID_STORE_KEYSTORE_PASSWORD" >> store/fdroid/config.yml
|
||||
echo "local_copy_dir: $TEMP_DIR" >> store/fdroid/config.yml
|
||||
mv $GITHUB_WORKSPACE/com.x8bit.bitwarden-fdroid.apk store/fdroid/repo/
|
||||
|
||||
# Run update and deploy.
|
||||
cd store/fdroid
|
||||
fdroid update
|
||||
fdroid server update
|
||||
cd ..
|
||||
rm -rf temp/fdroid/archive
|
||||
mv -v temp/fdroid ../dist
|
||||
cd fdroid
|
||||
cp index.html btn.png qr.png ../../dist/fdroid
|
||||
cd $GITHUB_WORKSPACE
|
||||
fdroid deploy
|
||||
cd ../..
|
||||
|
||||
# Move files for distribution.
|
||||
rm -rf store/temp/fdroid/archive
|
||||
mv -v store/temp/fdroid dist
|
||||
cp store/fdroid/index.html store/fdroid/btn.png store/fdroid/qr.png dist/fdroid
|
||||
|
||||
- name: Deploy to gh-pages
|
||||
if: ${{ inputs.release_type != 'Dry Run' }}
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2024.5.1" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
||||
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:versionCode="1" android:versionName="2024.5.2" android:installLocation="internalOnly" package="com.x8bit.bitwarden">
|
||||
<uses-sdk android:minSdkVersion="21" android:targetSdkVersion="34" />
|
||||
<uses-permission android:name="android.permission.INTERNET" />
|
||||
<uses-permission android:name="android.permission.NFC" />
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2024.5.1</string>
|
||||
<string>2024.5.2</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CFBundleIconName</key>
|
||||
|
|
|
@ -22,13 +22,16 @@
|
|||
</PropertyGroup>
|
||||
<ItemGroup>
|
||||
<EmbeddedResource Include="Resources\eff_long_word_list.txt" />
|
||||
<EmbeddedResource Include="Resources\public_suffix_list.dat" />
|
||||
<MauiAsset Include="Resources\Raw\public_suffix_list.dat">
|
||||
<CopyToOutputDirectory>Always</CopyToOutputDirectory>
|
||||
</MauiAsset>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<PackageReference Include="Camera.MAUI" Version="1.4.4" />
|
||||
<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
|
||||
<PackageReference Include="Microsoft.Maui.Controls.Compatibility" Version="$(MauiVersion)" />
|
||||
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="7.0.0" />
|
||||
<PackageReference Include="Nager.PublicSuffix" Version="3.2.0" />
|
||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||
<PackageReference Include="MessagePack" Version="2.5.124" />
|
||||
<PackageReference Include="CsvHelper" Version="30.0.1" />
|
||||
|
|
|
@ -31,6 +31,11 @@ namespace Bit.App.Pages
|
|||
{
|
||||
get
|
||||
{
|
||||
if (!_websiteIconsEnabled)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
if (_iconImageSource == string.Empty) // default value since icon source can return null
|
||||
{
|
||||
_iconImageSource = IconImageHelper.GetIconImage(Cipher);
|
||||
|
|
|
@ -502,7 +502,7 @@
|
|||
<value>Pro spuštění rozšíření klepněte na ikonu Bitwardenu v menu.</value>
|
||||
</data>
|
||||
<data name="ExtensionTurnOn" xml:space="preserve">
|
||||
<value>Pro zapnutí Bitwardenu v prohlížeči Safari a dalších aplikacích klepněte na ikonu "Další“ v dolní části menu.</value>
|
||||
<value>Pro zapnutí Bitwardenu v prohlížeči Safari a dalších aplikacích klepněte na ikonu "Další" v dolní části menu.</value>
|
||||
</data>
|
||||
<data name="Favorite" xml:space="preserve">
|
||||
<value>Oblíbené</value>
|
||||
|
|
|
@ -3001,6 +3001,6 @@ Möchtest du zu diesem Konto wechseln?</value>
|
|||
<value>Der Passkey-Vorgang ist fehlgeschlagen, da die App nicht in den Asset-Links gefunden wurde</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseAppCouldNotBeVerified" xml:space="preserve">
|
||||
<value>Der Passwort-Vorgang ist fehlgeschlagen, da die App nicht verifiziert werden konnte</value>
|
||||
<value>Der Passkey-Vorgang ist fehlgeschlagen, da die App nicht verifiziert werden konnte</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
|
@ -422,7 +422,7 @@
|
|||
<value>Servicio de autocompletado</value>
|
||||
</data>
|
||||
<data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve">
|
||||
<value>Set Bitwarden as your passkey provider in device settings.</value>
|
||||
<value>Establece Bitwarden como tu proveedor de claves de acceso en los ajustes del dispositivo.</value>
|
||||
</data>
|
||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||
<value>Evitar caracteres ambiguos</value>
|
||||
|
@ -1195,7 +1195,7 @@ El escaneo se realizará automáticamente.</value>
|
|||
<value>Windows Hello</value>
|
||||
</data>
|
||||
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
|
||||
<value>We were unable to automatically open the Android credential provider settings menu for you. You can navigate to the credential provider settings menu manually from Android Settings > System > Passwords & accounts > Passwords, passkeys and data services.</value>
|
||||
<value>No hemos podido abrir automáticamente el menú de ajustes del proveedor de credenciales de Android. Puedes navegar al menú de ajustes del proveedor de credenciales de Android manualmente desde Ajustes > Sistema > Contraseñas y cuentas > Contraseñas, claves de acceso y servicios de datos.</value>
|
||||
</data>
|
||||
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
|
||||
<value>No hemos podido abrir automáticamente las opciones de autorellenado de Android. Puedes ir al menú de opciones de autorellenado manualmente desde Ajustes de Android > Sistema > Idiomas y entradas > Avanzado > Servicio autocompletar.</value>
|
||||
|
@ -1822,7 +1822,7 @@ El escaneo se realizará automáticamente.</value>
|
|||
<value>Bitwarden necesita atención - Activar "Sobrescribir" en "Servicios de Auto-llenado" desde la configuración de Bitwarden</value>
|
||||
</data>
|
||||
<data name="PasskeyManagement" xml:space="preserve">
|
||||
<value>Passkey management</value>
|
||||
<value>Gestión de claves de acceso</value>
|
||||
</data>
|
||||
<data name="AutofillServices" xml:space="preserve">
|
||||
<value>Servicios de Autollenado</value>
|
||||
|
@ -2810,7 +2810,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||
<value>{0} horas</value>
|
||||
</data>
|
||||
<data name="PasskeyManagementExplanationLong" xml:space="preserve">
|
||||
<value>Use Bitwarden to save new passkeys and log in with passkeys stored in your vault.</value>
|
||||
<value>Usa Bitwarden para guardar nuevas claves de acceso e iniciar sesión con las claves de acceso almacenadas en tu caja fuerte.</value>
|
||||
</data>
|
||||
<data name="AutofillServicesExplanationLong" xml:space="preserve">
|
||||
<value>El Framework de Autofill de Android se utiliza para ayudar a rellenar información de inicio de sesión en otras aplicaciones en tu dispositivo.</value>
|
||||
|
@ -2841,7 +2841,7 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||
<value>¿Continuar a la App Store?</value>
|
||||
</data>
|
||||
<data name="ContinueToDeviceSettings" xml:space="preserve">
|
||||
<value>Continue to device Settings?</value>
|
||||
<value>¿Continuar a los ajustes del dispositivo?</value>
|
||||
</data>
|
||||
<data name="TwoStepLoginDescriptionLong" xml:space="preserve">
|
||||
<value>Haz tu cuenta más segura al configurar el inicio de sesión en dos pasos en la aplicación web de Bitwarden.</value>
|
||||
|
@ -2894,25 +2894,25 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||
<value>Configura una opción de desbloqueo para cambiar tu acción de tiempo de espera de tu caja fuerte.</value>
|
||||
</data>
|
||||
<data name="ChooseALoginToSaveThisPasskeyTo" xml:space="preserve">
|
||||
<value>Choose a login to save this passkey to</value>
|
||||
<value>Escoge un inicio de sesión para guardar esta clave de acceso</value>
|
||||
</data>
|
||||
<data name="SavePasskeyAsNewLogin" xml:space="preserve">
|
||||
<value>Save passkey as new login</value>
|
||||
<value>Guardar clave de acceso como un nuevo inicio de sesión</value>
|
||||
</data>
|
||||
<data name="SavePasskey" xml:space="preserve">
|
||||
<value>Save passkey</value>
|
||||
<value>Guardar clave de acceso</value>
|
||||
</data>
|
||||
<data name="PasskeysForX" xml:space="preserve">
|
||||
<value>Passkeys for {0}</value>
|
||||
<value>Claves de acceso para {0}</value>
|
||||
</data>
|
||||
<data name="PasswordsForX" xml:space="preserve">
|
||||
<value>Passwords for {0}</value>
|
||||
<value>Contraseñas para {0}</value>
|
||||
</data>
|
||||
<data name="OverwritePasskey" xml:space="preserve">
|
||||
<value>Overwrite passkey?</value>
|
||||
<value>¿Sobreescribir clave de acceso?</value>
|
||||
</data>
|
||||
<data name="ThisItemAlreadyContainsAPasskeyAreYouSureYouWantToOverwriteTheCurrentPasskey" xml:space="preserve">
|
||||
<value>This item already contains a passkey. Are you sure you want to overwrite the current passkey?</value>
|
||||
<value>Este elemento ya contiene una clave de acceso. ¿Estás seguro de que quieres sobreescribir la clave de acceso actual?</value>
|
||||
</data>
|
||||
<data name="DuoTwoStepLoginIsRequiredForYourAccount" xml:space="preserve">
|
||||
<value>Se requiere el inicio de sesión en dos pasos Duo para su cuenta. </value>
|
||||
|
@ -2924,86 +2924,86 @@ seleccione Agregar TOTP para almacenar la clave de forma segura</value>
|
|||
<value>Iniciar Duo</value>
|
||||
</data>
|
||||
<data name="VerificationRequiredByX" xml:space="preserve">
|
||||
<value>Verification required by {0}</value>
|
||||
<value>Verificación requerida por {0}</value>
|
||||
</data>
|
||||
<data name="VerificationRequiredForThisActionSetUpAnUnlockMethodInBitwardenToContinue" xml:space="preserve">
|
||||
<value>Verification required for this action. Set up an unlock method in Bitwarden to continue.</value>
|
||||
<value>Verificación requerida para esta acción. Establece un método de desbloqueo en Bitwarden para continuar.</value>
|
||||
</data>
|
||||
<data name="ErrorCreatingPasskey" xml:space="preserve">
|
||||
<value>Error creating passkey</value>
|
||||
<value>Error creando clave de acceso</value>
|
||||
</data>
|
||||
<data name="ErrorReadingPasskey" xml:space="preserve">
|
||||
<value>Error reading passkey</value>
|
||||
<value>Error leyendo clave de acceso</value>
|
||||
</data>
|
||||
<data name="ThereWasAProblemCreatingAPasskeyForXTryAgainLater" xml:space="preserve">
|
||||
<value>There was a problem creating a passkey for {0}. Try again later.</value>
|
||||
<value>Hubo un problema creando la clave de acceso para {0}. Inténtalo de nuevo más tarde.</value>
|
||||
<comment>The parameter is the RpId</comment>
|
||||
</data>
|
||||
<data name="ThereWasAProblemReadingAPasskeyForXTryAgainLater" xml:space="preserve">
|
||||
<value>There was a problem reading your passkey for {0}. Try again later.</value>
|
||||
<value>Hubo un problema leyendo la clave de acceso para {0}. Inténtalo de nuevo más tarde.</value>
|
||||
<comment>The parameter is the RpId</comment>
|
||||
</data>
|
||||
<data name="VerifyingIdentityEllipsis" xml:space="preserve">
|
||||
<value>Verifying identity...</value>
|
||||
<value>Verificando identidad...</value>
|
||||
</data>
|
||||
<data name="Passwords" xml:space="preserve">
|
||||
<value>Passwords</value>
|
||||
<value>Contraseñas</value>
|
||||
</data>
|
||||
<data name="UnknownAccount" xml:space="preserve">
|
||||
<value>Unknown account</value>
|
||||
<value>Cuenta desconocida</value>
|
||||
</data>
|
||||
<data name="SetUpAutofill" xml:space="preserve">
|
||||
<value>Set up auto-fill</value>
|
||||
<value>Establecer autocompletar</value>
|
||||
</data>
|
||||
<data name="GetInstantAccessToYourPasswordsAndPasskeys" xml:space="preserve">
|
||||
<value>Get instant access to your passwords and passkeys!</value>
|
||||
<value>¡Consigue acceso instantáneo a tus contraseñas y claves de acceso!</value>
|
||||
</data>
|
||||
<data name="SetUpAutoFillDescriptionLong" xml:space="preserve">
|
||||
<value>To set up password auto-fill and passkey management, set Bitwarden as your preferred provider in the iOS Settings.</value>
|
||||
<value>Para configurar el autocompletado y la administración de claves de acceso, establezca Bitwarden como su proveedor preferido en los ajustes de iOS.</value>
|
||||
</data>
|
||||
<data name="FirstDotGoToYourDeviceSettingsPasswordsPasswordOptions" xml:space="preserve">
|
||||
<value>1. Go to your device's Settings > Passwords > Password Options</value>
|
||||
<value>1. Ve a los Ajustes de tu dispositivo > Contraseñas > Opciones de Contraseña</value>
|
||||
</data>
|
||||
<data name="SecondDotTurnOnAutoFill" xml:space="preserve">
|
||||
<value>2. Turn on AutoFill</value>
|
||||
<value>2. Habilita el autocompletado</value>
|
||||
</data>
|
||||
<data name="ThirdDotSelectBitwardenToUseForPasswordsAndPasskeys" xml:space="preserve">
|
||||
<value>3. Select "Bitwarden" to use for passwords and passkeys</value>
|
||||
<value>3. Selecciona "Bitwarden" para usar contraseñas y claves de acceso</value>
|
||||
</data>
|
||||
<data name="YourPasskeyWillBeSavedToYourBitwardenVault" xml:space="preserve">
|
||||
<value>Your passkey will be saved to your Bitwarden vault</value>
|
||||
<value>Tu clave de acceso se guardará en tu caja fuerte de Bitwarden</value>
|
||||
</data>
|
||||
<data name="YourPasskeyWillBeSavedToYourBitwardenVaultForX" xml:space="preserve">
|
||||
<value>Your passkey will be saved to your Bitwarden vault for {0}</value>
|
||||
<value>Tu clave de acceso se guardará en tu caja fuerte de Bitwarden para {0}</value>
|
||||
</data>
|
||||
<data name="OrganizationUnassignedItemsMessageUSEUDescriptionLong" xml:space="preserve">
|
||||
<value>Unassigned organization items are no longer visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
|
||||
<value>Los elementos de organización sin asignar ya no están visibles en la vista Todas las cajas fuertes y solo se puede acceder a ellos a través de la consola de administrador. Asigne estos elementos a una colección desde la Consola de Administrador para hacerlos visibles.</value>
|
||||
</data>
|
||||
<data name="OrganizationUnassignedItemsMessageSelfHost041624DescriptionLong" xml:space="preserve">
|
||||
<value>On May 16, 2024, unassigned organization items will no longer be visible in the All Vaults view and only accessible via the Admin Console. Assign these items to a collection from the Admin Console to make them visible.</value>
|
||||
<value>El 16 de mayo de 2024, los elementos de organización no asignados ya no serán visibles en la vista Todas las cajas fuertes y solo serán accesibles a través de la Consola de Administrador. Asigna estos objetos a una colección desde la Consola de Administrador para hacerlos visibles.</value>
|
||||
</data>
|
||||
<data name="RemindMeLater" xml:space="preserve">
|
||||
<value>Remind me later</value>
|
||||
<value>Recuérdamelo más tarde</value>
|
||||
</data>
|
||||
<data name="Notice" xml:space="preserve">
|
||||
<value>Notice</value>
|
||||
<value>Aviso</value>
|
||||
</data>
|
||||
<data name="PasskeysNotSupportedForThisApp" xml:space="preserve">
|
||||
<value>Passkeys not supported for this app</value>
|
||||
<value>Claves de acceso no soportadas para esta aplicación</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseBrowserIsNotPrivileged" xml:space="preserve">
|
||||
<value>Passkey operation failed because browser is not privileged</value>
|
||||
<value>Falló la operación de la clave de acceso porque el navegador no tiene privilegios</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseBrowserSignatureDoesNotMatch" xml:space="preserve">
|
||||
<value>Passkey operation failed because browser signature does not match</value>
|
||||
<value>Falló la operación de la clave de acceso porque la firma del navegador no coincide</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseOfMissingAssetLinks" xml:space="preserve">
|
||||
<value>Passkey operation failed because of missing asset links</value>
|
||||
<value>Falló la operación de la clave de acceso porque faltan enlaces de recursos</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseAppNotFoundInAssetLinks" xml:space="preserve">
|
||||
<value>Passkey operation failed because app not found in asset links</value>
|
||||
<value>Falló la operación de la clave de acceso porque la aplicación no encontró los enlaces de recursos</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseAppCouldNotBeVerified" xml:space="preserve">
|
||||
<value>Passkey operation failed because app could not be verified</value>
|
||||
<value>Falló la operación de la clave de acceso porque la aplicación no pudo ser verificada</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
|
@ -2397,7 +2397,7 @@ turvallisesti valitsemalla "Lisää TOTP"</value>
|
|||
<value>Catch-all-sähköposti</value>
|
||||
</data>
|
||||
<data name="ForwardedEmailAlias" xml:space="preserve">
|
||||
<value>Sähköpostialias välitykseen</value>
|
||||
<value>Sähköpostialias ohjaukseen</value>
|
||||
</data>
|
||||
<data name="RandomWord" xml:space="preserve">
|
||||
<value>Satunnainen sana</value>
|
||||
|
@ -2991,7 +2991,7 @@ Haluatko vaihtaa tähän tiliin?</value>
|
|||
<value>Suojausavaimia ei tueta tässä sovelluksessa</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseBrowserIsNotPrivileged" xml:space="preserve">
|
||||
<value>Suojausavaintoiminto epäonnistui, koska selainta ei ole korotettu</value>
|
||||
<value>Suojausavaintoiminto epäonnistui, koska selainta ei ole hyväksytty</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseBrowserSignatureDoesNotMatch" xml:space="preserve">
|
||||
<value>Suojausavaintoiminto epäonnistui, koska selaimen allekirjoitus ei täsmää</value>
|
||||
|
@ -3003,6 +3003,6 @@ Haluatko vaihtaa tähän tiliin?</value>
|
|||
<value>Suojausavaintoiminto epäonnistui, koska sovellusta ei löytynyt asset-liitoksista</value>
|
||||
</data>
|
||||
<data name="PasskeyOperationFailedBecauseAppCouldNotBeVerified" xml:space="preserve">
|
||||
<value>Suojausavaintoiminto epäonnistui, koska sovellusta ei voitu vahvistaa</value>
|
||||
<value>Suojausavaintoiminto epäonnistui, koska sovellusta ei voitu varmentaa</value>
|
||||
</data>
|
||||
</root>
|
||||
|
|
|
@ -1195,7 +1195,7 @@ A leitura será feita automaticamente.</value>
|
|||
<value>Windows Hello</value>
|
||||
</data>
|
||||
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
|
||||
<value>We were unable to automatically open the Android credential provider settings menu for you. You can navigate to the credential provider settings menu manually from Android Settings > System > Passwords & accounts > Passwords, passkeys and data services.</value>
|
||||
<value>Não foi possível abrir automaticamente o menu de configurações do provedor de credenciais do Android para você. Você pode navegar para o menu de configurações do provedor de credenciais manualmente a partir de Configurações do Android > Sistema > Senhas e Contas > Senhas chaves e serviços de dados.</value>
|
||||
</data>
|
||||
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
|
||||
<value>Não foi possível abrir automaticamente o menu de configurações de autopreenchimento do Android para você. Você pode navegar para o menu de configurações de autopreenchimento manualmente a partir de Configurações do Android > Sistema > Idiomas e Entrada > Avançado > Serviço de autopreenchimento.</value>
|
||||
|
|
|
@ -422,7 +422,7 @@
|
|||
<value>Hjälpmedelsservice för automatisk ifyllnad</value>
|
||||
</data>
|
||||
<data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve">
|
||||
<value>Set Bitwarden as your passkey provider in device settings.</value>
|
||||
<value>Ange Bitwarden som din lösenordsleverantör i enhetsinställningarna.</value>
|
||||
</data>
|
||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||
<value>Undvik tvetydiga tecken</value>
|
||||
|
@ -1196,7 +1196,7 @@ Skanningen sker automatiskt.</value>
|
|||
<value>Windows Hello</value>
|
||||
</data>
|
||||
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
|
||||
<value>We were unable to automatically open the Android credential provider settings menu for you. You can navigate to the credential provider settings menu manually from Android Settings > System > Passwords & accounts > Passwords, passkeys and data services.</value>
|
||||
<value>Det gick inte att automatiskt öppna menyn för Android-autentiseringsleverantörsinställningar för dig. Du kan navigera till menyn autentiseringsleverantörsinställningar manuellt från Android Inställningar > System > Lösenord och konton > Lösenord, Nyckelord och datatjänster.</value>
|
||||
</data>
|
||||
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
|
||||
<value>Det gick inte att automatiskt öppna inställningsmenyn för Android automatisk ifyllnad. Du kan navigera till menyn manuellt från Android inställningar > System > Språk och inmatning > Avancerat > Tjänsten autofyll.</value>
|
||||
|
@ -1824,7 +1824,7 @@ Skanningen sker automatiskt.</value>
|
|||
<value>Bitwarden behöver din uppmärksamhet - Aktivera "Överlappning" under "Tjänster för automatisk ifyllnad" i Bitwardens inställningar</value>
|
||||
</data>
|
||||
<data name="PasskeyManagement" xml:space="preserve">
|
||||
<value>Passkey management</value>
|
||||
<value>Passkey hantering</value>
|
||||
</data>
|
||||
<data name="AutofillServices" xml:space="preserve">
|
||||
<value>Tjänster för automatisk ifyllnad</value>
|
||||
|
|
|
@ -422,7 +422,7 @@
|
|||
<value>自动填充服务</value>
|
||||
</data>
|
||||
<data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve">
|
||||
<value>在设备设置中将 Bitwarden 设置为您的通行密钥提供程序。</value>
|
||||
<value>在设备的设置中将 Bitwarden 设置为您的通行密钥提供程序。</value>
|
||||
</data>
|
||||
<data name="AvoidAmbiguousCharacters" xml:space="preserve">
|
||||
<value>避免易混淆的字符</value>
|
||||
|
@ -1195,7 +1195,7 @@
|
|||
<value>Windows Hello</value>
|
||||
</data>
|
||||
<data name="BitwardenCredentialProviderGoToSettings" xml:space="preserve">
|
||||
<value>我们无法为您自动打开 Android 凭据提供者设置菜单。您可以通过“Android 设置 > 系统 > 密码和账户 > 密码、通行密钥和数据服务”手动定位到凭据提供者设置菜单。</value>
|
||||
<value>我们无法为您自动打开 Android 凭据提供程序设置菜单。您可以通过 Android 设置 > 系统 > 密码和账户 > 密码、通行密钥和数据服务手动定位到凭据提供程序设置菜单。</value>
|
||||
</data>
|
||||
<data name="BitwardenAutofillGoToSettings" xml:space="preserve">
|
||||
<value>我们无法为您自动打开 Android 自动填充设置菜单。您可以通过 Android 设置 > 系统 > 语言和输入 > 高级 > 自动填充服务,来手动导航到自动填充设置。</value>
|
||||
|
@ -2938,7 +2938,7 @@
|
|||
<comment>The parameter is the RpId</comment>
|
||||
</data>
|
||||
<data name="ThereWasAProblemReadingAPasskeyForXTryAgainLater" xml:space="preserve">
|
||||
<value>读取 {0} 的通行密钥时。请稍后再试。</value>
|
||||
<value>读取 {0} 的通行密钥时出错。请稍后再试。</value>
|
||||
<comment>The parameter is the RpId</comment>
|
||||
</data>
|
||||
<data name="VerifyingIdentityEllipsis" xml:space="preserve">
|
||||
|
|
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
|
@ -6,6 +6,7 @@ using System.Text.RegularExpressions;
|
|||
using System.Web;
|
||||
using Bit.Core.Models.Domain;
|
||||
using Bit.Core.Services;
|
||||
using Nager.PublicSuffix;
|
||||
using Newtonsoft.Json;
|
||||
using Color = Microsoft.Maui.Graphics.Color;
|
||||
|
||||
|
@ -19,6 +20,7 @@ namespace Bit.Core.Utilities
|
|||
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\." +
|
||||
"(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$";
|
||||
|
||||
// TODO: What's the point of this regex? Why not use the public suffix list data?
|
||||
public static readonly string TldEndingRegex =
|
||||
".*\\.(com|net|org|edu|uk|gov|ca|de|jp|fr|au|ru|ch|io|es|us|co|xyz|info|ly|mil)$";
|
||||
|
||||
|
@ -41,7 +43,7 @@ namespace Bit.Core.Utilities
|
|||
/// <summary>
|
||||
/// Returns the host (and not port) of the given uri.
|
||||
/// Does not support plain hostnames without a protocol.
|
||||
///
|
||||
///
|
||||
/// Input => Output examples:
|
||||
/// <para>https://bitwarden.com => bitwarden.com</para>
|
||||
/// <para>https://login.bitwarden.com:1337 => login.bitwarden.com</para>
|
||||
|
@ -53,14 +55,15 @@ namespace Bit.Core.Utilities
|
|||
/// </summary>
|
||||
public static string GetHostname(string uriString)
|
||||
{
|
||||
// TODO: The summary above seems to be wrong, this method does (and always has) support(ed) "plain hostnames without a protocol"
|
||||
var uri = GetUri(uriString);
|
||||
return string.IsNullOrEmpty(uri?.Host) ? null : uri.Host;
|
||||
return uri?.Host;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Returns the host and port of the given uri.
|
||||
/// Does not support plain hostnames without
|
||||
///
|
||||
/// Does not support plain hostnames without
|
||||
///
|
||||
/// Input => Output examples:
|
||||
/// <para>https://bitwarden.com => bitwarden.com</para>
|
||||
/// <para>https://login.bitwarden.com:1337 => login.bitwarden.com:1337</para>
|
||||
|
@ -89,8 +92,8 @@ namespace Bit.Core.Utilities
|
|||
|
||||
/// <summary>
|
||||
/// Returns the second and top level domain of the given uri.
|
||||
/// Does not support plain hostnames without
|
||||
///
|
||||
/// Does not support plain hostnames without
|
||||
///
|
||||
/// Input => Output examples:
|
||||
/// <para>https://bitwarden.com => bitwarden.com</para>
|
||||
/// <para>https://login.bitwarden.com:1337 => bitwarden.com</para>
|
||||
|
@ -104,44 +107,42 @@ namespace Bit.Core.Utilities
|
|||
{
|
||||
var uri = GetUri(uriString);
|
||||
if (uri == null)
|
||||
{
|
||||
return null;
|
||||
}
|
||||
|
||||
// TODO: What's the point of checking for "localhost" here? GetUri("localhost") always returns null
|
||||
// TODO: Also, neither "localhost" nor any IPv4 (IPv6 addresses are never matched here), are "domain" (as in, domains with a name and tld)
|
||||
if (uri.Host == "localhost" || Regex.IsMatch(uri.Host, IpRegex))
|
||||
{
|
||||
return uri.Host;
|
||||
}
|
||||
try
|
||||
{
|
||||
if (DomainName.TryParseBaseDomain(uri.Host, out var baseDomain))
|
||||
{
|
||||
return baseDomain ?? uri.Host;
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
return null;
|
||||
|
||||
// TODO: Resolving on every invocation is probably not a good idea
|
||||
var domainParser = ServiceContainer.Resolve<IDomainParser>();
|
||||
var domainInfo = domainParser.Parse(uri.Host);
|
||||
if (domainInfo == null)
|
||||
//TODO: Doing this results in non-domains being returned (like for example a Tor or I2P link) - return null instead
|
||||
return uri.Host;
|
||||
|
||||
return domainInfo.RegistrableDomain;
|
||||
}
|
||||
|
||||
public static Uri GetUri(string uriString)
|
||||
{
|
||||
if (string.IsNullOrWhiteSpace(uriString))
|
||||
{
|
||||
return null;
|
||||
}
|
||||
var hasHttpProtocol = uriString.StartsWith("http://") || uriString.StartsWith("https://");
|
||||
if (!hasHttpProtocol && !uriString.Contains("://") && uriString.Contains("."))
|
||||
{
|
||||
if (Uri.TryCreate("http://" + uriString, UriKind.Absolute, out var uri))
|
||||
{
|
||||
return uri;
|
||||
}
|
||||
}
|
||||
if (Uri.TryCreate(uriString, UriKind.Absolute, out var uri2))
|
||||
{
|
||||
return uri2;
|
||||
}
|
||||
return null;
|
||||
|
||||
// TODO: Checking for a dot here (as before) means localhost (or any IPv6) is not recognised as a
|
||||
// valid uri (but 127.0.0.1 is), even though all of them are perfectly valid
|
||||
if (!IsHttpUrl(uriString) && uriString.Contains('.'))
|
||||
uriString = $"http://{uriString}";
|
||||
|
||||
return Uri.TryCreate(uriString, UriKind.Absolute, out var uri) ? uri : null;
|
||||
}
|
||||
|
||||
private static bool IsHttpUrl(string url)
|
||||
{
|
||||
if (url.Length > 6 && url[..7].Equals(Uri.UriSchemeHttp, StringComparison.InvariantCultureIgnoreCase))
|
||||
return true;
|
||||
|
||||
return url.Length > 7 && url[..8].Equals("https://", StringComparison.InvariantCultureIgnoreCase);
|
||||
}
|
||||
|
||||
public static void NestedTraverse<T>(List<TreeNode<T>> nodeTree, int partIndex, string[] parts,
|
||||
|
|
|
@ -6,6 +6,7 @@ using Bit.Core.Models.View;
|
|||
using Bit.Core.Utilities;
|
||||
using Microsoft.Maui.Controls;
|
||||
using Microsoft.Maui;
|
||||
using Nager.PublicSuffix;
|
||||
|
||||
namespace Bit.App.Utilities
|
||||
{
|
||||
|
@ -42,33 +43,42 @@ namespace Bit.App.Utilities
|
|||
{
|
||||
foreach (var uri in cipher.Login.Uris.Where(u => u.Uri != null))
|
||||
{
|
||||
var hostnameUri = uri.Uri;
|
||||
var isWebsite = false;
|
||||
if (!hostnameUri.Contains("."))
|
||||
var domain = GetValidDomainOrNull(uri.Uri);
|
||||
if (domain != null)
|
||||
{
|
||||
continue;
|
||||
}
|
||||
if (!hostnameUri.Contains("://"))
|
||||
{
|
||||
hostnameUri = string.Concat("http://", hostnameUri);
|
||||
}
|
||||
isWebsite = hostnameUri.StartsWith("http");
|
||||
|
||||
if (isWebsite)
|
||||
{
|
||||
image = GetIconUrl(hostnameUri);
|
||||
image = GetIconUrl(domain);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return image;
|
||||
}
|
||||
|
||||
private static string GetIconUrl(string hostnameUri)
|
||||
// TODO: Assumes that only valid domains (not IP addresses) have a favicon.
|
||||
// This might be shortsighted in the event that
|
||||
// a) a webservice is hosted on an IP
|
||||
// b) the icon server is user-supplied and has access to intranet services etc.
|
||||
private static string GetValidDomainOrNull(string uriString)
|
||||
{
|
||||
IEnvironmentService _environmentService = ServiceContainer.Resolve<IEnvironmentService>("environmentService");
|
||||
var domainParser = ServiceContainer.Resolve<IDomainParser>();
|
||||
var uri = CoreHelpers.GetUri(uriString);
|
||||
if (uri == null)
|
||||
return null;
|
||||
|
||||
if (uri.Host.EndsWith(".onion") || uri.Host.EndsWith(".i2p"))
|
||||
return null;
|
||||
|
||||
var domainInfo = domainParser.Parse(uri.Host);
|
||||
return domainInfo?.RegistrableDomain;
|
||||
}
|
||||
|
||||
// TODO: Getting the service and re-formatting the icon API string doesn't have to be done for every single requested domain, right?
|
||||
private static string GetIconUrl(string domain)
|
||||
{
|
||||
IEnvironmentService _environmentService =
|
||||
ServiceContainer.Resolve<IEnvironmentService>("environmentService");
|
||||
|
||||
var hostname = CoreHelpers.GetHostname(hostnameUri);
|
||||
var iconsUrl = _environmentService.IconsUrl;
|
||||
if (string.IsNullOrWhiteSpace(iconsUrl))
|
||||
{
|
||||
|
@ -81,7 +91,8 @@ namespace Bit.App.Utilities
|
|||
iconsUrl = "https://icons.bitwarden.net";
|
||||
}
|
||||
}
|
||||
return string.Format("{0}/{1}/icon.png", iconsUrl, hostname);
|
||||
|
||||
return string.Format("{0}/{1}/icon.png", iconsUrl, domain);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -0,0 +1,36 @@
|
|||
using Nager.PublicSuffix.Extensions;
|
||||
using Nager.PublicSuffix.Models;
|
||||
using Nager.PublicSuffix.RuleParsers;
|
||||
using Nager.PublicSuffix.RuleProviders;
|
||||
|
||||
namespace Bit.Core.Utilities;
|
||||
|
||||
public class MauiAssetRuleProvider : BaseRuleProvider
|
||||
{
|
||||
private readonly string _fileName;
|
||||
|
||||
public MauiAssetRuleProvider(string fileName = "public_suffix_list.dat") => _fileName = fileName;
|
||||
|
||||
public override async Task<bool> BuildAsync(bool ignoreCache = false, CancellationToken cancellationToken = default)
|
||||
{
|
||||
var rules = new TldRuleParser().ParseRules(await LoadFromMauiAssetAsync().ConfigureAwait(false)).ToArray();
|
||||
new DomainDataStructure("*", new TldRule("*")).AddRules(rules);
|
||||
CreateDomainDataStructure(rules);
|
||||
return true;
|
||||
}
|
||||
|
||||
private async Task<string> LoadFromMauiAssetAsync()
|
||||
{
|
||||
try
|
||||
{
|
||||
await using var stream = await FileSystem.OpenAppPackageFileAsync(_fileName);
|
||||
using var reader = new StreamReader(stream);
|
||||
|
||||
return await reader.ReadToEndAsync().ConfigureAwait(false);
|
||||
}
|
||||
catch
|
||||
{
|
||||
return null;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -3,6 +3,7 @@ using System.Globalization;
|
|||
using System.Text;
|
||||
using Bit.Core.Abstractions;
|
||||
using Bit.Core.Services;
|
||||
using Nager.PublicSuffix;
|
||||
|
||||
namespace Bit.Core.Utilities
|
||||
{
|
||||
|
@ -11,7 +12,7 @@ namespace Bit.Core.Utilities
|
|||
public static ConcurrentDictionary<string, object> RegisteredServices { get; set; } = new ConcurrentDictionary<string, object>();
|
||||
public static bool Inited { get; set; }
|
||||
|
||||
public static void Init(string customUserAgent = null, string clearCipherCacheKey = null,
|
||||
public static async Task Init(string customUserAgent = null, string clearCipherCacheKey = null,
|
||||
string[] allClearCipherCacheKeys = null)
|
||||
{
|
||||
if (Inited)
|
||||
|
@ -119,6 +120,11 @@ namespace Bit.Core.Utilities
|
|||
#if ANDROID
|
||||
Register<IAssetLinksService>(new AssetLinksService(apiService));
|
||||
#endif
|
||||
|
||||
var ruleProvider = new MauiAssetRuleProvider();
|
||||
await ruleProvider.BuildAsync();
|
||||
|
||||
Register<IDomainParser>("domainParser", new DomainParser(ruleProvider));
|
||||
}
|
||||
|
||||
public static void Register<T>(string serviceName, T obj)
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden.autofill</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2024.5.1</string>
|
||||
<string>2024.5.2</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>CFBundleLocalizations</key>
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
<key>CFBundleIdentifier</key>
|
||||
<string>com.8bit.bitwarden.find-login-action-extension</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2024.5.1</string>
|
||||
<string>2024.5.2</string>
|
||||
<key>CFBundleLocalizations</key>
|
||||
<array>
|
||||
<string>en</string>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
<key>CFBundlePackageType</key>
|
||||
<string>XPC!</string>
|
||||
<key>CFBundleShortVersionString</key>
|
||||
<string>2024.5.1</string>
|
||||
<string>2024.5.2</string>
|
||||
<key>CFBundleVersion</key>
|
||||
<string>1</string>
|
||||
<key>MinimumOSVersion</key>
|
||||
|
|
|
@ -1,20 +0,0 @@
|
|||
#!/usr/bin/env python3
|
||||
|
||||
repo_url = "https://mobileapp.bitwarden.com/fdroid/repo"
|
||||
repo_name = "Bitwarden F-Droid Repo"
|
||||
repo_icon = "fdroid-icon.png"
|
||||
repo_description = """
|
||||
F-Droid repo for Bitwarden.
|
||||
"""
|
||||
|
||||
archive_older = 2
|
||||
archive_url = "https://does.not.exist"
|
||||
archive_name = "Bitwarden Archive Repo"
|
||||
archive_icon = "fdroid-icon.png"
|
||||
archive_description = """
|
||||
F-Droid archive repo for Bitwarden.
|
||||
"""
|
||||
|
||||
repo_keyalias = "bitwarden-Virtual-Machine"
|
||||
keystore = "keystore.jks"
|
||||
keydname = "CN=bitwarden-Virtual-Machine, OU=F-Droid"
|
|
@ -0,0 +1,18 @@
|
|||
---
|
||||
|
||||
repo_url: https://mobileapp.bitwarden.com/fdroid/repo
|
||||
repo_name: Bitwarden F-Droid Repo
|
||||
repo_icon: fdroid-icon.png
|
||||
repo_description: >-
|
||||
F-Droid repo for Bitwarden.
|
||||
|
||||
archive_older: 2
|
||||
archive_url: https://does.not.exist/archive
|
||||
archive_name: Bitwarden Archive Repo
|
||||
archive_icon: fdroid-icon.png
|
||||
archive_description: >-
|
||||
F-Droid archive repo for Bitwarden.
|
||||
|
||||
repo_keyalias: bitwarden-Virtual-Machine
|
||||
keystore: keystore.jks
|
||||
keydname: CN=bitwarden-Virtual-Machine, OU=F-Droid
|
Loading…
Reference in New Issue