1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-22 19:23:58 +00:00

Compare commits

..

10 Commits

Author SHA1 Message Date
Carlos Gonçalves
485aca083b Merge branch 'main' into vault/pm-2572 2024-06-11 14:11:28 +01:00
github-actions[bot]
2b78859d06 Autosync Crowdin Translations (#3283)
Co-authored-by: bitwarden-devops-bot <106330231+bitwarden-devops-bot@users.noreply.github.com>
2024-06-07 06:12:26 +00:00
Carlos Gonçalves
290266c262 PM-2572 Fix pr comment 2024-05-29 13:27:59 +01:00
Carlos Gonçalves
c40eb9d3db PM-2572 Fix pr comments 2024-05-28 21:31:28 +01:00
Carlos Gonçalves
df9fcd1aca Merge branch 'main' into vault/pm-2572 2024-05-28 18:35:02 +01:00
Carlos Gonçalves
890eff79a2 PM-2572 Fix pr comments 2024-05-28 18:34:41 +01:00
Carlos Gonçalves
265c95b494 PM-2572 Code refactor 2024-05-28 10:59:40 +01:00
Carlos Gonçalves
25e394eb5e Minor change 2024-05-13 18:12:41 +01:00
Carlos Gonçalves
354aec09d9 Minor refactor 2024-05-13 18:03:43 +01:00
Carlos Gonçalves
4332e7a498 PM-2572 Added cipherKey to Attachment and logic to use it 2024-05-13 16:59:39 +01:00
6 changed files with 35 additions and 24 deletions

View File

@@ -72,7 +72,6 @@ jobs:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success
branch: ${{ steps.branch.outputs.branch-name }} branch: ${{ steps.branch.outputs.branch-name }}
skip_unpack: true
- name: Dry Run - Download all artifacts - name: Dry Run - Download all artifacts
if: ${{ inputs.release_type == 'Dry Run' }} if: ${{ inputs.release_type == 'Dry Run' }}
@@ -81,15 +80,9 @@ jobs:
workflow: build.yml workflow: build.yml
workflow_conclusion: success workflow_conclusion: success
branch: main branch: main
skip_unpack: true
- name: Unzip release assets - name: Prep Bitwarden iOS release asset
run: | run: zip -r Bitwarden\ iOS.zip Bitwarden\ iOS
unzip bw-android-apk-sha256.txt.zip -d bw-android-apk-sha256.txt
unzip bw-fdroid-apk-sha256.txt.zip -d bw-fdroid-apk-sha256.txt
unzip com.x8bit.bitwarden-fdroid.apk.zip -d com.x8bit.bitwarden-fdroid.apk
unzip com.x8bit.bitwarden.aab.zip -d com.x8bit.bitwarden.aab
unzip com.x8bit.bitwarden.apk.zip -d com.x8bit.bitwarden.apk
- name: Create release - name: Create release
if: ${{ inputs.release_type != 'Dry Run' }} if: ${{ inputs.release_type != 'Dry Run' }}

View File

@@ -45,6 +45,7 @@ namespace Bit.Core
public const string PasswordlessLoginRequestKey = "passwordlessLoginRequest"; public const string PasswordlessLoginRequestKey = "passwordlessLoginRequest";
public const string PreLoginEmailKey = "preLoginEmailKey"; public const string PreLoginEmailKey = "preLoginEmailKey";
public const string ConfigsKey = "configsKey"; public const string ConfigsKey = "configsKey";
public const string DisplayEuEnvironmentFlag = "display-eu-environment";
public const string UnassignedItemsBannerFlag = "unassigned-items-banner"; public const string UnassignedItemsBannerFlag = "unassigned-items-banner";
public const string RegionEnvironment = "regionEnvironment"; public const string RegionEnvironment = "regionEnvironment";
public const string DuoCallback = "bitwarden://duo-callback"; public const string DuoCallback = "bitwarden://duo-callback";

View File

@@ -25,6 +25,7 @@ namespace Bit.App.Pages
private bool _rememberEmail; private bool _rememberEmail;
private string _email; private string _email;
private string _selectedEnvironmentName; private string _selectedEnvironmentName;
private bool _displayEuEnvironment;
public HomeViewModel() public HomeViewModel()
{ {
@@ -115,6 +116,7 @@ namespace Bit.App.Pages
{ {
Email = await _stateService.GetRememberedEmailAsync(); Email = await _stateService.GetRememberedEmailAsync();
RememberEmail = !string.IsNullOrEmpty(Email); RememberEmail = !string.IsNullOrEmpty(Email);
_displayEuEnvironment = await _configService.GetFeatureFlagBoolAsync(Constants.DisplayEuEnvironmentFlag, forceRefresh: true);
} }
public async Task ContinueToLoginStepAsync() public async Task ContinueToLoginStepAsync()
@@ -156,7 +158,11 @@ namespace Bit.App.Pages
public async Task ShowEnvironmentPickerAsync() public async Task ShowEnvironmentPickerAsync()
{ {
var options = new string[] { BwRegion.US.Domain(), BwRegion.EU.Domain(), AppResources.SelfHosted }; _displayEuEnvironment = await _configService.GetFeatureFlagBoolAsync(Constants.DisplayEuEnvironmentFlag);
var options = _displayEuEnvironment
? new string[] { BwRegion.US.Domain(), BwRegion.EU.Domain(), AppResources.SelfHosted }
: new string[] { BwRegion.US.Domain(), AppResources.SelfHosted };
await MainThread.InvokeOnMainThreadAsync(async () => await MainThread.InvokeOnMainThreadAsync(async () =>
{ {
var result = await _deviceActionService.Value.DisplayActionSheetAsync(AppResources.LoggingInOn, AppResources.Cancel, null, options); var result = await _deviceActionService.Value.DisplayActionSheetAsync(AppResources.LoggingInOn, AppResources.Cancel, null, options);

View File

@@ -422,7 +422,7 @@
<value>خدمة التعبئة التلقائية</value> <value>خدمة التعبئة التلقائية</value>
</data> </data>
<data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve"> <data name="SetBitwardenAsPasskeyManagerDescription" xml:space="preserve">
<value>Set Bitwarden as your passkey provider in device settings.</value> <value>تعيين Bitwarden كموفر مفتاح المرور الخاص بك في إعدادات الجهاز.</value>
</data> </data>
<data name="AvoidAmbiguousCharacters" xml:space="preserve"> <data name="AvoidAmbiguousCharacters" xml:space="preserve">
<value>تجنب الأحرف الغامضة</value> <value>تجنب الأحرف الغامضة</value>

View File

@@ -961,7 +961,7 @@ A leitura será efetuada automaticamente.</value>
<value>Ambiente personalizado</value> <value>Ambiente personalizado</value>
</data> </data>
<data name="CustomEnvironmentFooter" xml:space="preserve"> <data name="CustomEnvironmentFooter" xml:space="preserve">
<value>Para utilizadores avançados. Pode especificar o URL de base de cada serviço independentemente.</value> <value>Para utilizadores avançados. Pode especificar o URL de base de cada serviço de forma independente.</value>
</data> </data>
<data name="EnvironmentSaved" xml:space="preserve"> <data name="EnvironmentSaved" xml:space="preserve">
<value>Os URLs de ambiente foram guardados.</value> <value>Os URLs de ambiente foram guardados.</value>

View File

@@ -571,28 +571,39 @@ namespace Bit.Core.Services
await UpsertAsync(data); await UpsertAsync(data);
} }
public async Task ShareWithServerAsync(CipherView cipher, string organizationId, HashSet<string> collectionIds) public async Task ShareWithServerAsync(CipherView cipherView, string organizationId, HashSet<string> collectionIds)
{ {
var attachmentTasks = new List<Task>(); var attachmentTasks = new List<Task>();
if (cipher.Attachments != null) Cipher cipher = null;
//If the cipher doesn't have a key, we update it
if(cipherView.Key == null && await ShouldUseCipherKeyEncryptionAsync())
{ {
foreach (var attachment in cipher.Attachments) await UpdateAndUpsertAsync(cipherView, cipher => _apiService.PutCipherAsync(cipherView.Id, new CipherRequest(cipher)));
cipher = await GetAsync(cipherView.Id);
cipherView = await cipher.DecryptAsync();
}
if (cipherView.Attachments != null)
{
foreach (var attachment in cipherView.Attachments)
{ {
if (attachment.Key == null) if (attachment.Key == null)
{ {
attachmentTasks.Add(ShareAttachmentWithServerAsync(attachment, cipher.Id, organizationId)); attachmentTasks.Add(ShareAttachmentWithServerAsync(attachment, cipherView.Id, organizationId));
} }
} }
} }
await Task.WhenAll(attachmentTasks); await Task.WhenAll(attachmentTasks);
cipher.OrganizationId = organizationId; cipherView.OrganizationId = organizationId;
cipher.CollectionIds = collectionIds; cipherView.CollectionIds = collectionIds;
var encCipher = await EncryptAsync(cipher); await UpdateAndUpsertAsync(cipherView, cipher => _apiService.PutShareCipherAsync(cipherView.Id, new CipherShareRequest(cipher)), collectionIds);
var request = new CipherShareRequest(encCipher);
var response = await _apiService.PutShareCipherAsync(cipher.Id, request); async Task UpdateAndUpsertAsync(CipherView cipherView, Func<Cipher,Task<CipherResponse>> callPutCipherApi, HashSet<string> collectionIds = null)
var userId = await _stateService.GetActiveUserIdAsync(); {
var data = new CipherData(response, userId, collectionIds); var cipher = await EncryptAsync(cipherView);
await UpsertAsync(data); var response = await callPutCipherApi(cipher);
var data = new CipherData(response, await _stateService.GetActiveUserIdAsync(), collectionIds);
await UpsertAsync(data);
}
} }
public async Task<Cipher> SaveAttachmentRawWithServerAsync(Cipher cipher, CipherView cipherView, string filename, byte[] data) public async Task<Cipher> SaveAttachmentRawWithServerAsync(Cipher cipher, CipherView cipherView, string filename, byte[] data)