Пример #1
0
        public async Task ShutdownRemoteDeviceAsync(HideezErrorCode code)
        {
            try
            {
                if (_remoteDevice != null)
                {
                    CancelRemoteDeviceCreation();
                    CancelDeviceAuthorization();

                    var tempRemoteDevice = _remoteDevice;
                    _remoteDevice   = null;
                    PasswordManager = null;

                    if (tempRemoteDevice != null)
                    {
                        tempRemoteDevice.ButtonPressed   -= RemoteDevice_ButtonPressed;
                        tempRemoteDevice.StorageModified -= RemoteDevice_StorageModified;
                        tempRemoteDevice.PropertyChanged -= RemoteDevice_PropertyChanged;
                        await tempRemoteDevice.Shutdown(code);

                        await _metaMessenger.PublishOnServer(new RemoveDeviceMessage(tempRemoteDevice.Id));

                        await tempRemoteDevice.DeleteContext();

                        tempRemoteDevice.Dispose();
                    }
                    try
                    {
                        await _remoteDeviceMessenger.DisconnectFromServer();
                    }
                    catch (InvalidOperationException)
                    {
                        // IMetaPubSub may throw InvalidOperationException if we try to disconnect without first connecting
                    }
                }
            }
            catch (Exception ex)
            {
                _log.WriteLine(ex);
            }

            IsCreatingRemoteDevice    = false;
            IsAuthorizingRemoteDevice = false;
            IsLoadingStorage          = false;
            IsStorageLoaded           = false;

            NotifyPropertyChanged(nameof(IsAuthorized));
        }
Пример #2
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;
            }
        }
Пример #3
0
 public static string GetErrorAsString(HideezErrorCode hideezErrorCode, CultureInfo culture = null)
 {
     return(ErrorCode.ResourceManager.GetString(hideezErrorCode.ToString(), culture ?? ErrorCode.Culture));
 }