1
0
mirror of https://github.com/bitwarden/mobile synced 2025-12-05 23:53:33 +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_conclusion: success
branch: ${{ steps.branch.outputs.branch-name }}
skip_unpack: true
- name: Dry Run - Download all artifacts
if: ${{ inputs.release_type == 'Dry Run' }}
@@ -81,15 +80,9 @@ jobs:
workflow: build.yml
workflow_conclusion: success
branch: main
skip_unpack: true
- name: Unzip release assets
run: |
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: Prep Bitwarden iOS release asset
run: zip -r Bitwarden\ iOS.zip Bitwarden\ iOS
- name: Create release
if: ${{ inputs.release_type != 'Dry Run' }}

View File

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

View File

@@ -25,6 +25,7 @@ namespace Bit.App.Pages
private bool _rememberEmail;
private string _email;
private string _selectedEnvironmentName;
private bool _displayEuEnvironment;
public HomeViewModel()
{
@@ -115,6 +116,7 @@ namespace Bit.App.Pages
{
Email = await _stateService.GetRememberedEmailAsync();
RememberEmail = !string.IsNullOrEmpty(Email);
_displayEuEnvironment = await _configService.GetFeatureFlagBoolAsync(Constants.DisplayEuEnvironmentFlag, forceRefresh: true);
}
public async Task ContinueToLoginStepAsync()
@@ -156,7 +158,11 @@ namespace Bit.App.Pages
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 () =>
{
var result = await _deviceActionService.Value.DisplayActionSheetAsync(AppResources.LoggingInOn, AppResources.Cancel, null, options);

View File

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

View File

@@ -961,7 +961,7 @@ A leitura será efetuada automaticamente.</value>
<value>Ambiente personalizado</value>
</data>
<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 name="EnvironmentSaved" xml:space="preserve">
<value>Os URLs de ambiente foram guardados.</value>

View File

@@ -571,28 +571,39 @@ namespace Bit.Core.Services
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>();
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)
{
attachmentTasks.Add(ShareAttachmentWithServerAsync(attachment, cipher.Id, organizationId));
attachmentTasks.Add(ShareAttachmentWithServerAsync(attachment, cipherView.Id, organizationId));
}
}
}
await Task.WhenAll(attachmentTasks);
cipher.OrganizationId = organizationId;
cipher.CollectionIds = collectionIds;
var encCipher = await EncryptAsync(cipher);
var request = new CipherShareRequest(encCipher);
var response = await _apiService.PutShareCipherAsync(cipher.Id, request);
var userId = await _stateService.GetActiveUserIdAsync();
var data = new CipherData(response, userId, collectionIds);
await UpsertAsync(data);
cipherView.OrganizationId = organizationId;
cipherView.CollectionIds = collectionIds;
await UpdateAndUpsertAsync(cipherView, cipher => _apiService.PutShareCipherAsync(cipherView.Id, new CipherShareRequest(cipher)), collectionIds);
async Task UpdateAndUpsertAsync(CipherView cipherView, Func<Cipher,Task<CipherResponse>> callPutCipherApi, HashSet<string> collectionIds = null)
{
var cipher = await EncryptAsync(cipherView);
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)