public async Task SyncHardwareVaults(string vaultId) { try { var vault = await _hardwareVaultService.GetVaultByIdAsync(vaultId); if (vault.Status != VaultStatus.Active || vault.NeedSync || vault.EmployeeId == null) { return; } var employee = await _employeeService.GetEmployeeByIdAsync(vault.EmployeeId); var employeeVaults = employee.HardwareVaults.Where(x => x.Id != vaultId && x.IsOnline && x.Timestamp != vault.Timestamp && x.Status == VaultStatus.Active && !x.NeedSync).ToList(); foreach (var employeeVault in employeeVaults) { var currentVaultSync = vault.Timestamp < employeeVault.Timestamp ? true : false; var firstWorkstationId = GetDeviceRemoteConnections(vault.Id).GetFirstOrDefaultWorkstation(); var secondWorkstationId = GetDeviceRemoteConnections(employeeVault.Id).GetFirstOrDefaultWorkstation(); if (firstWorkstationId == null || secondWorkstationId == null) { return; } var firstRemoteDeviceTask = ConnectDevice(vault.Id, firstWorkstationId).TimeoutAfter(30_000); var secondRemoteDeviceTask = ConnectDevice(employeeVault.Id, secondWorkstationId).TimeoutAfter(30_000); await Task.WhenAll(firstRemoteDeviceTask, secondRemoteDeviceTask); if (firstRemoteDeviceTask.Result == null || secondRemoteDeviceTask.Result == null) { return; } var firstVaultKey = ConvertUtils.HexStringToBytes(_dataProtectionService.Decrypt(vault.MasterPassword)); await firstRemoteDeviceTask.Result.CheckPassphrase(firstVaultKey); var secondVaultKey = ConvertUtils.HexStringToBytes(_dataProtectionService.Decrypt(employeeVault.MasterPassword)); await secondRemoteDeviceTask.Result.CheckPassphrase(secondVaultKey); IRemoteAppConnection appConnection; string lockedVaultStorage; if (currentVaultSync) { appConnection = RemoteWorkstationConnectionsService.FindWorkstationConnection(firstWorkstationId); if (appConnection == null) { return; } lockedVaultStorage = vault.Id; } else { appConnection = RemoteWorkstationConnectionsService.FindWorkstationConnection(secondWorkstationId); if (appConnection == null) { return; } lockedVaultStorage = employeeVault.Id; } await appConnection.LockHwVaultStorage(lockedVaultStorage); try { await new DeviceStorageReplicator(firstRemoteDeviceTask.Result, secondRemoteDeviceTask.Result, null).Start(); } finally { await appConnection.LiftHwVaultStorageLock(lockedVaultStorage); } if (vault.Timestamp > employeeVault.Timestamp) { await _hardwareVaultService.UpdateTimestampAsync(employeeVault, vault.Timestamp); } else { await _hardwareVaultService.UpdateTimestampAsync(vault, employeeVault.Timestamp); } } } catch (Exception ex) { _logger.LogError($"Sync Hardware Vaults - {ex.Message}"); } }