Skip to content

Commit 7aff65e

Browse files
committed
Add error logs for all unknown errors
1 parent 4fec19f commit 7aff65e

File tree

4 files changed

+64
-16
lines changed

4 files changed

+64
-16
lines changed

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/ConnectViewModel.kt

+15-9
Original file line numberDiff line numberDiff line change
@@ -123,15 +123,19 @@ class ConnectViewModel(
123123
}
124124

125125
fun onDisconnectClick() {
126-
viewModelScope.launch { connectionProxy.disconnect().onLeft {
127-
_uiSideEffect.send(UiSideEffect.ConnectError.Generic)
128-
} }
126+
viewModelScope.launch {
127+
connectionProxy.disconnect().onLeft {
128+
_uiSideEffect.send(UiSideEffect.ConnectError.Generic)
129+
}
130+
}
129131
}
130132

131133
fun onReconnectClick() {
132-
viewModelScope.launch { connectionProxy.reconnect().onLeft {
133-
_uiSideEffect.send(UiSideEffect.ConnectError.Generic)
134-
} }
134+
viewModelScope.launch {
135+
connectionProxy.reconnect().onLeft {
136+
_uiSideEffect.send(UiSideEffect.ConnectError.Generic)
137+
}
138+
}
135139
}
136140

137141
fun onConnectClick() {
@@ -160,9 +164,11 @@ class ConnectViewModel(
160164
}
161165

162166
fun onCancelClick() {
163-
viewModelScope.launch { connectionProxy.disconnect().onLeft {
164-
_uiSideEffect.send(UiSideEffect.ConnectError.Generic)
165-
} }
167+
viewModelScope.launch {
168+
connectionProxy.disconnect().onLeft {
169+
_uiSideEffect.send(UiSideEffect.ConnectError.Generic)
170+
}
171+
}
166172
}
167173

168174
fun onManageAccountClick() {

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/OutOfTimeViewModel.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,9 @@ class OutOfTimeViewModel(
7272
}
7373

7474
fun onDisconnectClick() {
75-
viewModelScope.launch { connectionProxy.disconnect().onLeft {
76-
_uiSideEffect.send(UiSideEffect.GenericError)
77-
} }
75+
viewModelScope.launch {
76+
connectionProxy.disconnect().onLeft { _uiSideEffect.send(UiSideEffect.GenericError) }
77+
}
7878
}
7979

8080
private fun verifyPurchases() {

android/app/src/main/kotlin/net/mullvad/mullvadvpn/viewmodel/WelcomeViewModel.kt

+3-3
Original file line numberDiff line numberDiff line change
@@ -78,9 +78,9 @@ class WelcomeViewModel(
7878
}
7979

8080
fun onDisconnectClick() {
81-
viewModelScope.launch { connectionProxy.disconnect().onLeft {
82-
_uiSideEffect.send(UiSideEffect.GenericError)
83-
} }
81+
viewModelScope.launch {
82+
connectionProxy.disconnect().onLeft { _uiSideEffect.send(UiSideEffect.GenericError) }
83+
}
8484
}
8585

8686
private fun verifyPurchases() {

android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt

+43-1
Original file line numberDiff line numberDiff line change
@@ -78,8 +78,8 @@ import net.mullvad.mullvadvpn.lib.model.GetDeviceListError
7878
import net.mullvad.mullvadvpn.lib.model.GetDeviceStateError
7979
import net.mullvad.mullvadvpn.lib.model.GetVersionInfoError
8080
import net.mullvad.mullvadvpn.lib.model.LoginAccountError
81-
import net.mullvad.mullvadvpn.lib.model.NameAlreadyExists
8281
import net.mullvad.mullvadvpn.lib.model.LogoutAccountError
82+
import net.mullvad.mullvadvpn.lib.model.NameAlreadyExists
8383
import net.mullvad.mullvadvpn.lib.model.NewAccessMethodSetting
8484
import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings
8585
import net.mullvad.mullvadvpn.lib.model.Ownership as ModelOwnership
@@ -246,16 +246,19 @@ class ManagementService(
246246
suspend fun getDevice(): Either<GetDeviceStateError, ModelDeviceState> =
247247
Either.catch { grpc.getDevice(Empty.getDefaultInstance()) }
248248
.map { it.toDomain() }
249+
.onLeft { Logger.e("Get device error", it) }
249250
.mapLeft { GetDeviceStateError.Unknown(it) }
250251

251252
suspend fun updateDevice(): Either<DeviceUpdateError, Unit> =
252253
Either.catch { grpc.updateDevice(Empty.getDefaultInstance()) }
253254
.mapEmpty()
255+
.onLeft { Logger.e("Update device error", it) }
254256
.mapLeft { DeviceUpdateError(it) }
255257

256258
suspend fun getDeviceList(token: AccountNumber): Either<GetDeviceListError, List<Device>> =
257259
Either.catch { grpc.listDevices(StringValue.of(token.value)) }
258260
.map { it.devicesList.map(ManagementInterface.Device::toDomain) }
261+
.onLeft { Logger.e("Get device list error", it) }
259262
.mapLeft { GetDeviceListError.Unknown(it) }
260263

261264
suspend fun removeDevice(
@@ -271,18 +274,22 @@ class ManagementService(
271274
)
272275
}
273276
.mapEmpty()
277+
.onLeft { Logger.e("Remove device error", it) }
274278
.mapLeft { DeleteDeviceError.Unknown(it) }
275279

276280
suspend fun connect(): Either<ConnectError, Boolean> =
277281
Either.catch { grpc.connectTunnel(Empty.getDefaultInstance()).value }
282+
.onLeft { Logger.e("Connect error", it) }
278283
.mapLeft(ConnectError::Unknown)
279284

280285
suspend fun disconnect(): Either<ConnectError, Boolean> =
281286
Either.catch { grpc.disconnectTunnel(Empty.getDefaultInstance()).value }
287+
.onLeft { Logger.e("Disconnect error", it) }
282288
.mapLeft(ConnectError::Unknown)
283289

284290
suspend fun reconnect(): Either<ConnectError, Boolean> =
285291
Either.catch { grpc.reconnectTunnel(Empty.getDefaultInstance()).value }
292+
.onLeft { Logger.e("Reconnect error", it) }
286293
.mapLeft(ConnectError::Unknown)
287294

288295
private suspend fun getTunnelState(): ModelTunnelState =
@@ -301,13 +308,15 @@ class ManagementService(
301308
// will get 404 until the api have been published, thus we need to ignore error downstream.
302309
private suspend fun getVersionInfo(): Either<GetVersionInfoError, ModelAppVersionInfo> =
303310
Either.catch { grpc.getVersionInfo(Empty.getDefaultInstance()).toDomain() }
311+
.onLeft { Logger.e("Get version info error", it) }
304312
.mapLeft { GetVersionInfoError.Unknown(it) }
305313

306314
private suspend fun getCurrentApiAccessMethod(): ApiAccessMethodSetting =
307315
grpc.getCurrentApiAccessMethod(Empty.getDefaultInstance()).toDomain()
308316

309317
suspend fun logoutAccount(): Either<LogoutAccountError, Unit> =
310318
Either.catch { grpc.logoutAccount(Empty.getDefaultInstance()) }
319+
.onLeft { Logger.e("Logout account error", it) }
311320
.mapLeft(LogoutAccountError::Unknown)
312321
.mapEmpty()
313322

@@ -326,6 +335,7 @@ class ManagementService(
326335

327336
suspend fun clearAccountHistory(): Either<ClearAccountHistoryError, Unit> =
328337
Either.catch { grpc.clearAccountHistory(Empty.getDefaultInstance()) }
338+
.onLeft { Logger.e("Clear account history error", it) }
329339
.mapLeft(ClearAccountHistoryError::Unknown)
330340
.mapEmpty()
331341

@@ -338,6 +348,7 @@ class ManagementService(
338348
null
339349
}
340350
}
351+
.onLeft { Logger.e("Get account history error", it) }
341352
.mapLeft(GetAccountHistoryError::Unknown)
342353

343354
private suspend fun getInitialServiceState() {
@@ -357,17 +368,20 @@ class ManagementService(
357368
accountNumber: AccountNumber
358369
): Either<GetAccountDataError, AccountData> =
359370
Either.catch { grpc.getAccountData(StringValue.of(accountNumber.value)).toDomain() }
371+
.onLeft { Logger.e("Get account data error", it) }
360372
.mapLeft(GetAccountDataError::Unknown)
361373

362374
suspend fun createAccount(): Either<CreateAccountError, AccountNumber> =
363375
Either.catch {
364376
val accountNumberStringValue = grpc.createNewAccount(Empty.getDefaultInstance())
365377
AccountNumber(accountNumberStringValue.value)
366378
}
379+
.onLeft { Logger.e("Create account error", it) }
367380
.mapLeft(CreateAccountError::Unknown)
368381

369382
suspend fun setDnsOptions(dnsOptions: ModelDnsOptions): Either<SetDnsOptionsError, Unit> =
370383
Either.catch { grpc.setDnsOptions(dnsOptions.fromDomain()) }
384+
.onLeft { Logger.e("Set dns options error", it) }
371385
.mapLeft(SetDnsOptionsError::Unknown)
372386
.mapEmpty()
373387

@@ -377,6 +391,7 @@ class ManagementService(
377391
val updated = DnsOptions.state.set(currentDnsOptions, dnsState)
378392
grpc.setDnsOptions(updated.fromDomain())
379393
}
394+
.onLeft { Logger.e("Set dns state error", it) }
380395
.mapLeft(SetDnsOptionsError::Unknown)
381396
.mapEmpty()
382397

@@ -390,6 +405,7 @@ class ManagementService(
390405

391406
grpc.setDnsOptions(updatedDnsOptions.fromDomain())
392407
}
408+
.onLeft { Logger.e("Set custom dns error", it) }
393409
.mapLeft(SetDnsOptionsError::Unknown)
394410
.mapEmpty()
395411

@@ -401,6 +417,7 @@ class ManagementService(
401417
grpc.setDnsOptions(updatedDnsOptions.fromDomain())
402418
updatedDnsOptions.customOptions.addresses.lastIndex
403419
}
420+
.onLeft { Logger.e("Add custom dns error", it) }
404421
.mapLeft(SetDnsOptionsError::Unknown)
405422

406423
suspend fun deleteCustomDns(index: Int): Either<SetDnsOptionsError, Unit> =
@@ -414,23 +431,27 @@ class ManagementService(
414431
}
415432
grpc.setDnsOptions(updatedDnsOptions.fromDomain())
416433
}
434+
.onLeft { Logger.e("Delete custom dns error", it) }
417435
.mapLeft(SetDnsOptionsError::Unknown)
418436
.mapEmpty()
419437

420438
suspend fun setWireguardMtu(value: Int): Either<SetWireguardMtuError, Unit> =
421439
Either.catch { grpc.setWireguardMtu(UInt32Value.of(value)) }
440+
.onLeft { Logger.e("Set wireguard mtu error", it) }
422441
.mapLeft(SetWireguardMtuError::Unknown)
423442
.mapEmpty()
424443

425444
suspend fun resetWireguardMtu(): Either<SetWireguardMtuError, Unit> =
426445
Either.catch { grpc.setWireguardMtu(UInt32Value.newBuilder().clearValue().build()) }
446+
.onLeft { Logger.e("Reset wireguard mtu error", it) }
427447
.mapLeft(SetWireguardMtuError::Unknown)
428448
.mapEmpty()
429449

430450
suspend fun setWireguardQuantumResistant(
431451
value: ModelQuantumResistantState
432452
): Either<SetWireguardQuantumResistantError, Unit> =
433453
Either.catch { grpc.setQuantumResistantTunnel(value.toDomain()) }
454+
.onLeft { Logger.e("Set wireguard quantum resistant error", it) }
434455
.mapLeft(SetWireguardQuantumResistantError::Unknown)
435456
.mapEmpty()
436457

@@ -446,6 +467,7 @@ class ManagementService(
446467
}
447468
grpc.setObfuscationSettings(updatedObfuscationSettings.fromDomain())
448469
}
470+
.onLeft { Logger.e("Set obfuscation error", it) }
449471
.mapLeft(SetObfuscationOptionsError::Unknown)
450472
.mapEmpty()
451473

@@ -459,16 +481,19 @@ class ManagementService(
459481
}
460482
grpc.setObfuscationSettings(updatedSettings.fromDomain())
461483
}
484+
.onLeft { Logger.e("Set obfuscation port error", it) }
462485
.mapLeft(SetObfuscationOptionsError::Unknown)
463486
.mapEmpty()
464487

465488
suspend fun setAutoConnect(isEnabled: Boolean): Either<SetAutoConnectError, Unit> =
466489
Either.catch { grpc.setAutoConnect(BoolValue.of(isEnabled)) }
490+
.onLeft { Logger.e("Set auto connect error", it) }
467491
.mapLeft(SetAutoConnectError::Unknown)
468492
.mapEmpty()
469493

470494
suspend fun setAllowLan(allow: Boolean): Either<SetAllowLanError, Unit> =
471495
Either.catch { grpc.setAllowLan(BoolValue.of(allow)) }
496+
.onLeft { Logger.e("Set allow lan error", it) }
472497
.mapLeft(SetAllowLanError::Unknown)
473498
.mapEmpty()
474499

@@ -482,6 +507,7 @@ class ManagementService(
482507
)
483508
grpc.setRelaySettings(updatedRelaySettings.fromDomain())
484509
}
510+
.onLeft { Logger.e("Set relay location error", it) }
485511
.mapLeft(SetRelayLocationError::Unknown)
486512
.mapEmpty()
487513

@@ -509,11 +535,13 @@ class ManagementService(
509535

510536
suspend fun deleteCustomList(id: CustomListId): Either<DeleteCustomListError, Unit> =
511537
Either.catch { grpc.deleteCustomList(StringValue.of(id.value)) }
538+
.onLeft { Logger.e("Delete custom list error", it) }
512539
.mapLeft(::UnknownCustomListError)
513540
.mapEmpty()
514541

515542
suspend fun clearAllRelayOverrides(): Either<ClearAllOverridesError, Unit> =
516543
Either.catch { grpc.clearAllRelayOverrides(Empty.getDefaultInstance()) }
544+
.onLeft { Logger.e("Clear all relay overrides error", it) }
517545
.mapLeft(ClearAllOverridesError::Unknown)
518546
.mapEmpty()
519547

@@ -537,6 +565,7 @@ class ManagementService(
537565
RelaySettings.relayConstraints.wireguardConstraints.set(relaySettings, value)
538566
grpc.setRelaySettings(updated.fromDomain())
539567
}
568+
.onLeft { Logger.e("Set wireguard constraints error", it) }
540569
.mapLeft(SetWireguardConstraintsError::Unknown)
541570
.mapEmpty()
542571

@@ -555,6 +584,7 @@ class ManagementService(
555584
}
556585
grpc.setRelaySettings(updated.fromDomain())
557586
}
587+
.onLeft { Logger.e("Set ownership and providers error", it) }
558588
.mapLeft(SetWireguardConstraintsError::Unknown)
559589
.mapEmpty()
560590

@@ -566,6 +596,7 @@ class ManagementService(
566596
val updated = RelaySettings.relayConstraints.ownership.set(relaySettings, ownership)
567597
grpc.setRelaySettings(updated.fromDomain())
568598
}
599+
.onLeft { Logger.e("Set ownership error", it) }
569600
.mapLeft(SetWireguardConstraintsError::Unknown)
570601
.mapEmpty()
571602

@@ -578,6 +609,7 @@ class ManagementService(
578609
RelaySettings.relayConstraints.providers.set(relaySettings, providersConstraint)
579610
grpc.setRelaySettings(updated.fromDomain())
580611
}
612+
.onLeft { Logger.e("Set providers error", it) }
581613
.mapLeft(SetWireguardConstraintsError::Unknown)
582614
.mapEmpty()
583615

@@ -596,59 +628,69 @@ class ManagementService(
596628

597629
suspend fun initializePlayPurchase(): Either<PlayPurchaseInitError, PlayPurchasePaymentToken> =
598630
Either.catch { grpc.initPlayPurchase(Empty.getDefaultInstance()).toDomain() }
631+
.onLeft { Logger.e("Initialize play purchase error", it) }
599632
.mapLeft { PlayPurchaseInitError.OtherError }
600633

601634
suspend fun verifyPlayPurchase(purchase: PlayPurchase): Either<PlayPurchaseVerifyError, Unit> =
602635
Either.catch { grpc.verifyPlayPurchase(purchase.fromDomain()) }
636+
.onLeft { Logger.e("Verify play purchase error", it) }
603637
.mapLeft { PlayPurchaseVerifyError.OtherError }
604638
.mapEmpty()
605639

606640
suspend fun addSplitTunnelingApp(app: AppId): Either<AddSplitTunnelingAppError, Unit> =
607641
Either.catch { grpc.addSplitTunnelApp(StringValue.of(app.value)) }
642+
.onLeft { Logger.e("Add split tunneling app error", it) }
608643
.mapLeft(AddSplitTunnelingAppError::Unknown)
609644
.mapEmpty()
610645

611646
suspend fun removeSplitTunnelingApp(app: AppId): Either<RemoveSplitTunnelingAppError, Unit> =
612647
Either.catch { grpc.removeSplitTunnelApp(StringValue.of(app.value)) }
648+
.onLeft { Logger.e("Remove split tunneling app error", it) }
613649
.mapLeft(RemoveSplitTunnelingAppError::Unknown)
614650
.mapEmpty()
615651

616652
suspend fun setSplitTunnelingState(
617653
enabled: Boolean
618654
): Either<RemoveSplitTunnelingAppError, Unit> =
619655
Either.catch { grpc.setSplitTunnelState(BoolValue.of(enabled)) }
656+
.onLeft { Logger.e("Set split tunneling state error", it) }
620657
.mapLeft(RemoveSplitTunnelingAppError::Unknown)
621658
.mapEmpty()
622659

623660
suspend fun getWebsiteAuthToken(): Either<Throwable, WebsiteAuthToken> =
624661
Either.catch { grpc.getWwwAuthToken(Empty.getDefaultInstance()) }
662+
.onLeft { Logger.e("Get website auth token error", it) }
625663
.map { WebsiteAuthToken.fromString(it.value) }
626664

627665
suspend fun addApiAccessMethod(
628666
newAccessMethodSetting: NewAccessMethodSetting
629667
): Either<AddApiAccessMethodError, ApiAccessMethodId> =
630668
Either.catch { grpc.addApiAccessMethod(newAccessMethodSetting.fromDomain()) }
669+
.onLeft { Logger.e("Add api access method error", it) }
631670
.mapLeft(AddApiAccessMethodError::Unknown)
632671
.map { ApiAccessMethodId.fromString(it.value) }
633672

634673
suspend fun removeApiAccessMethod(
635674
apiAccessMethodId: ApiAccessMethodId
636675
): Either<RemoveApiAccessMethodError, Unit> =
637676
Either.catch { grpc.removeApiAccessMethod(apiAccessMethodId.fromDomain()) }
677+
.onLeft { Logger.e("Remove api access method error", it) }
638678
.mapLeft(RemoveApiAccessMethodError::Unknown)
639679
.mapEmpty()
640680

641681
suspend fun setApiAccessMethod(
642682
apiAccessMethodId: ApiAccessMethodId
643683
): Either<SetApiAccessMethodError, Unit> =
644684
Either.catch { grpc.setApiAccessMethod(apiAccessMethodId.fromDomain()) }
685+
.onLeft { Logger.e("Set api access method error", it) }
645686
.mapLeft(SetApiAccessMethodError::Unknown)
646687
.mapEmpty()
647688

648689
suspend fun updateApiAccessMethod(
649690
apiAccessMethodSetting: ApiAccessMethodSetting
650691
): Either<UpdateApiAccessMethodError, Unit> =
651692
Either.catch { grpc.updateApiAccessMethod(apiAccessMethodSetting.fromDomain()) }
693+
.onLeft { Logger.e("Update api access method error", it) }
652694
.mapLeft(::UnknownApiAccessMethodError)
653695
.mapEmpty()
654696

0 commit comments

Comments
 (0)