mirror of
https://github.com/bitwarden/mobile
synced 2025-12-15 15:53:44 +00:00
[PM-3362] Fix auth request approval (#2675)
* [PM-3362] Fix auth request approval * [PM-3362] Add new exception type
This commit is contained in:
12
src/Core/Exceptions/UserAndMasterKeyNullException.cs
Normal file
12
src/Core/Exceptions/UserAndMasterKeyNullException.cs
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
using System;
|
||||||
|
namespace Bit.Core.Exceptions
|
||||||
|
{
|
||||||
|
public class UserAndMasterKeysNullException : Exception
|
||||||
|
{
|
||||||
|
public UserAndMasterKeysNullException()
|
||||||
|
: base("UserKey and MasterKey are null.")
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
@@ -8,7 +8,7 @@ namespace Bit.Core.Models.Request
|
|||||||
bool requestApproved)
|
bool requestApproved)
|
||||||
{
|
{
|
||||||
Key = key ?? throw new ArgumentNullException(nameof(key));
|
Key = key ?? throw new ArgumentNullException(nameof(key));
|
||||||
MasterPasswordHash = masterPasswordHash ?? throw new ArgumentNullException(nameof(masterPasswordHash));
|
MasterPasswordHash = masterPasswordHash;
|
||||||
DeviceIdentifier = deviceIdentifier ?? throw new ArgumentNullException(nameof(deviceIdentifier));
|
DeviceIdentifier = deviceIdentifier ?? throw new ArgumentNullException(nameof(deviceIdentifier));
|
||||||
RequestApproved = requestApproved;
|
RequestApproved = requestApproved;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -214,7 +214,9 @@ namespace Bit.Core.Services
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
var userKey = await _cryptoService.DecryptUserKeyWithMasterKeyAsync(new MasterKey(decryptedKey));
|
var masterKey = new MasterKey(decryptedKey);
|
||||||
|
var userKey = await _cryptoService.DecryptUserKeyWithMasterKeyAsync(masterKey);
|
||||||
|
await _cryptoService.SetMasterKeyAsync(masterKey);
|
||||||
await _cryptoService.SetUserKeyAsync(userKey);
|
await _cryptoService.SetUserKeyAsync(userKey);
|
||||||
}
|
}
|
||||||
await _deviceTrustCryptoService.TrustDeviceIfNeededAsync();
|
await _deviceTrustCryptoService.TrustDeviceIfNeededAsync();
|
||||||
@@ -632,13 +634,29 @@ namespace Bit.Core.Services
|
|||||||
{
|
{
|
||||||
var publicKey = CoreHelpers.Base64UrlDecode(pubKey);
|
var publicKey = CoreHelpers.Base64UrlDecode(pubKey);
|
||||||
var masterKey = await _cryptoService.GetMasterKeyAsync();
|
var masterKey = await _cryptoService.GetMasterKeyAsync();
|
||||||
var encryptedKey = await _cryptoService.RsaEncryptAsync(masterKey.EncKey, publicKey);
|
byte[] keyToEncrypt = null;
|
||||||
var keyHash = await _stateService.GetKeyHashAsync();
|
|
||||||
EncString encryptedMasterPassword = null;
|
EncString encryptedMasterPassword = null;
|
||||||
if (!string.IsNullOrEmpty(keyHash))
|
|
||||||
|
if (masterKey == null)
|
||||||
{
|
{
|
||||||
encryptedMasterPassword = await _cryptoService.RsaEncryptAsync(Encoding.UTF8.GetBytes(keyHash), publicKey);
|
var userKey = await _cryptoService.GetUserKeyAsync();
|
||||||
|
if (userKey == null)
|
||||||
|
{
|
||||||
|
throw new UserAndMasterKeysNullException();
|
||||||
|
}
|
||||||
|
keyToEncrypt = userKey.Key;
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
keyToEncrypt = masterKey.Key;
|
||||||
|
var keyHash = await _stateService.GetKeyHashAsync();
|
||||||
|
if (!string.IsNullOrEmpty(keyHash))
|
||||||
|
{
|
||||||
|
encryptedMasterPassword = await _cryptoService.RsaEncryptAsync(Encoding.UTF8.GetBytes(keyHash), publicKey);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var encryptedKey = await _cryptoService.RsaEncryptAsync(keyToEncrypt, publicKey);
|
||||||
var deviceId = await _appIdService.GetAppIdAsync();
|
var deviceId = await _appIdService.GetAppIdAsync();
|
||||||
var response = await _apiService.PutAuthRequestAsync(id, encryptedKey.EncryptedString, encryptedMasterPassword?.EncryptedString, deviceId, requestApproved);
|
var response = await _apiService.PutAuthRequestAsync(id, encryptedKey.EncryptedString, encryptedMasterPassword?.EncryptedString, deviceId, requestApproved);
|
||||||
return await PopulateFingerprintPhraseAsync(response, await _stateService.GetEmailAsync());
|
return await PopulateFingerprintPhraseAsync(response, await _stateService.GetEmailAsync());
|
||||||
|
|||||||
@@ -120,8 +120,14 @@ namespace Bit.Core.Services
|
|||||||
var masterKey = await _stateService.GetMasterKeyAsync(userId);
|
var masterKey = await _stateService.GetMasterKeyAsync(userId);
|
||||||
if (masterKey == null)
|
if (masterKey == null)
|
||||||
{
|
{
|
||||||
|
var masterKeyDecrypted = await _stateService.GetKeyDecryptedAsync(userId);
|
||||||
|
if (masterKeyDecrypted == null)
|
||||||
|
{
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
// Migration support
|
// Migration support
|
||||||
masterKey = new MasterKey((await _stateService.GetKeyDecryptedAsync(userId)).Key);
|
masterKey = new MasterKey(masterKeyDecrypted.Key);
|
||||||
if (masterKey != null)
|
if (masterKey != null)
|
||||||
{
|
{
|
||||||
await SetMasterKeyAsync(masterKey, userId);
|
await SetMasterKeyAsync(masterKey, userId);
|
||||||
|
|||||||
Reference in New Issue
Block a user