Exemple #1
0
        async Task CreateRemoteDeviceAsync(CancellationToken cancellationToken)
        {
            if (_remoteDevice != null || IsCreatingRemoteDevice)
            {
                return;
            }

            HideezErrorCode initErrorCode = HideezErrorCode.Ok;

            try
            {
                _log.WriteLine($"({SerialNo}) Establishing remote vault connection");

                if (cancellationToken.IsCancellationRequested)
                {
                    initErrorCode = HideezErrorCode.RemoteDeviceCreationCancelled;
                    return;
                }

                _log.WriteLine("Checking for available channels");
                var channelsReply = await _metaMessenger.ProcessOnServer <GetAvailableChannelsMessageReply>(new GetAvailableChannelsMessage(SerialNo));

                var channels = channelsReply.FreeChannels;
                if (channels.Length == 0)
                {
                    throw new Exception(string.Format(TranslationSource.Instance["Vault.Error.NoAvailableChannels"], SerialNo)); // Todo: separate exception type
                }
                var channelNo = channels.FirstOrDefault();
                _log.WriteLine($"{channels.Length} channels available");

                if (cancellationToken.IsCancellationRequested)
                {
                    initErrorCode = HideezErrorCode.RemoteDeviceCreationCancelled;
                    return;
                }

                ShowInfo(string.Format(TranslationSource.Instance["Vault.Notification.PreparingForAuth"], SerialNo), Mac);
                IsCreatingRemoteDevice = true;
                _remoteDevice          = await _remoteDeviceFactory.CreateRemoteDeviceAsync(SerialNo, channelNo, _remoteDeviceMessenger);

                _remoteDevice.PropertyChanged += RemoteDevice_PropertyChanged;

                if (cancellationToken.IsCancellationRequested)
                {
                    initErrorCode = HideezErrorCode.RemoteDeviceCreationCancelled;
                    return;
                }

                await _remoteDevice.VerifyAndInitialize(cancellationToken);

                if (cancellationToken.IsCancellationRequested)
                {
                    initErrorCode = HideezErrorCode.RemoteDeviceCreationCancelled;
                    return;
                }

                if (!_remoteDevice.IsAuthorized)
                {
                    ShowInfo(string.Empty, Mac);
                }

                if (_remoteDevice.SerialNo != SerialNo)
                {
                    throw new Exception(TranslationSource.Instance["Vault.Error.InvalidRemoteSerialNo"]);
                }

                _log.WriteLine($"({SerialNo}) Creating password manager");
                PasswordManager = new DevicePasswordManager(_remoteDevice, null);
                _remoteDevice.StorageModified += RemoteDevice_StorageModified;
                _remoteDevice.ButtonPressed   += RemoteDevice_ButtonPressed;

                _log.WriteLine($"({SerialNo}) Remote vault connection established");
            }
            catch (HideezException ex)
            {
                _log.WriteLine(ex);
                if (ex.ErrorCode != HideezErrorCode.ChannelInitializationFailed)
                {
                    ShowError(ex.Message, Mac);
                }
                initErrorCode = ex.ErrorCode;
            }
            catch (Exception ex)
            {
                _log.WriteLine(ex);
                ShowError(ex.Message, Mac);
                initErrorCode = HideezErrorCode.UnknownError;
            }
            finally
            {
                await _metaMessenger.Publish(new HidePinUiMessage());

                if (initErrorCode != HideezErrorCode.Ok)
                {
                    await ShutdownRemoteDeviceAsync(initErrorCode);
                }

                IsCreatingRemoteDevice = false;
            }
        }