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)); }
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; } }
public static string GetErrorAsString(HideezErrorCode hideezErrorCode, CultureInfo culture = null) { return(ErrorCode.ResourceManager.GetString(hideezErrorCode.ToString(), culture ?? ErrorCode.Culture)); }