Exemple #1
0
 public async Task <int> GetWorkstationsOnlineCountAsync()
 {
     return(await Task.FromResult(RemoteWorkstationConnectionsService.WorkstationsOnlineCount()));
 }
        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}");
            }
        }