diff options
| author | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-09-17 15:34:41 +0200 |
|---|---|---|
| committer | Jonatan Rhodin <jonatan.rhodin@mullvad.net> | 2024-09-17 15:34:41 +0200 |
| commit | 95cd7d3e57fe08a93068c34d069d259c9d58dddd (patch) | |
| tree | e1a608d11a51fa2246002695b5ecaed9c71f1da5 /android/lib/daemon-grpc/src | |
| parent | 196061b0c06c031d3e19b4bfa13268010e8a4e2c (diff) | |
| download | mullvadvpn-95cd7d3e57fe08a93068c34d069d259c9d58dddd.tar.xz mullvadvpn-95cd7d3e57fe08a93068c34d069d259c9d58dddd.zip | |
Implement wireguard over shadowsocks
Diffstat (limited to 'android/lib/daemon-grpc/src')
3 files changed, 60 insertions, 25 deletions
diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt index f444edce39..514d4f83aa 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt @@ -81,6 +81,7 @@ import net.mullvad.mullvadvpn.lib.model.LoginAccountError import net.mullvad.mullvadvpn.lib.model.LogoutAccountError import net.mullvad.mullvadvpn.lib.model.NameAlreadyExists import net.mullvad.mullvadvpn.lib.model.NewAccessMethodSetting +import net.mullvad.mullvadvpn.lib.model.ObfuscationMode import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings import net.mullvad.mullvadvpn.lib.model.Ownership as ModelOwnership import net.mullvad.mullvadvpn.lib.model.PlayPurchase @@ -100,7 +101,6 @@ import net.mullvad.mullvadvpn.lib.model.RelayList import net.mullvad.mullvadvpn.lib.model.RelaySettings import net.mullvad.mullvadvpn.lib.model.RemoveApiAccessMethodError import net.mullvad.mullvadvpn.lib.model.RemoveSplitTunnelingAppError -import net.mullvad.mullvadvpn.lib.model.SelectedObfuscation import net.mullvad.mullvadvpn.lib.model.SetAllowLanError import net.mullvad.mullvadvpn.lib.model.SetApiAccessMethodError import net.mullvad.mullvadvpn.lib.model.SetAutoConnectError @@ -129,7 +129,8 @@ import net.mullvad.mullvadvpn.lib.model.location import net.mullvad.mullvadvpn.lib.model.ownership import net.mullvad.mullvadvpn.lib.model.providers import net.mullvad.mullvadvpn.lib.model.relayConstraints -import net.mullvad.mullvadvpn.lib.model.selectedObfuscation +import net.mullvad.mullvadvpn.lib.model.selectedObfuscationMode +import net.mullvad.mullvadvpn.lib.model.shadowsocks import net.mullvad.mullvadvpn.lib.model.state import net.mullvad.mullvadvpn.lib.model.udp2tcp import net.mullvad.mullvadvpn.lib.model.wireguardConstraints @@ -460,12 +461,10 @@ class ManagementService( .mapLeft(SetWireguardQuantumResistantError::Unknown) .mapEmpty() - suspend fun setObfuscation( - value: SelectedObfuscation - ): Either<SetObfuscationOptionsError, Unit> = + suspend fun setObfuscation(value: ObfuscationMode): Either<SetObfuscationOptionsError, Unit> = Either.catch { val updatedObfuscationSettings = - ObfuscationSettings.selectedObfuscation.modify( + ObfuscationSettings.selectedObfuscationMode.modify( getSettings().obfuscationSettings ) { value @@ -476,7 +475,7 @@ class ManagementService( .mapLeft(SetObfuscationOptionsError::Unknown) .mapEmpty() - suspend fun setObfuscationPort( + suspend fun setUdp2TcpObfuscationPort( portConstraint: Constraint<Port> ): Either<SetObfuscationOptionsError, Unit> = Either.catch { @@ -490,6 +489,19 @@ class ManagementService( .mapLeft(SetObfuscationOptionsError::Unknown) .mapEmpty() + suspend fun setShadowsocksObfuscationPort( + portConstraint: Constraint<Port> + ): Either<SetObfuscationOptionsError, Unit> = + Either.catch { + val updatedSettings = + ObfuscationSettings.shadowsocks.modify(getSettings().obfuscationSettings) { + it.copy(port = portConstraint) + } + grpc.setObfuscationSettings(updatedSettings.fromDomain()) + } + .mapLeft(SetObfuscationOptionsError::Unknown) + .mapEmpty() + suspend fun setAutoConnect(isEnabled: Boolean): Either<SetAutoConnectError, Unit> = Either.catch { grpc.setAutoConnect(BoolValue.of(isEnabled)) } .onLeft { Logger.e("Set auto connect error") } diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt index 874783910a..84a826f104 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt @@ -13,6 +13,7 @@ import net.mullvad.mullvadvpn.lib.model.DnsOptions import net.mullvad.mullvadvpn.lib.model.DnsState import net.mullvad.mullvadvpn.lib.model.GeoLocationId import net.mullvad.mullvadvpn.lib.model.NewAccessMethodSetting +import net.mullvad.mullvadvpn.lib.model.ObfuscationMode import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings import net.mullvad.mullvadvpn.lib.model.Ownership import net.mullvad.mullvadvpn.lib.model.PlayPurchase @@ -21,7 +22,7 @@ import net.mullvad.mullvadvpn.lib.model.Port import net.mullvad.mullvadvpn.lib.model.Providers import net.mullvad.mullvadvpn.lib.model.RelayItemId import net.mullvad.mullvadvpn.lib.model.RelaySettings -import net.mullvad.mullvadvpn.lib.model.SelectedObfuscation +import net.mullvad.mullvadvpn.lib.model.ShadowsocksSettings import net.mullvad.mullvadvpn.lib.model.SocksAuth import net.mullvad.mullvadvpn.lib.model.TransportProtocol import net.mullvad.mullvadvpn.lib.model.Udp2TcpObfuscationSettings @@ -78,18 +79,20 @@ internal fun DefaultDnsOptions.fromDomain(): ManagementInterface.DefaultDnsOptio internal fun ObfuscationSettings.fromDomain(): ManagementInterface.ObfuscationSettings = ManagementInterface.ObfuscationSettings.newBuilder() - .setSelectedObfuscation(selectedObfuscation.fromDomain()) + .setSelectedObfuscation(selectedObfuscationMode.fromDomain()) .setUdp2Tcp(udp2tcp.fromDomain()) - .setShadowsocks(ManagementInterface.ShadowsocksSettings.newBuilder()) + .setShadowsocks(shadowsocks.fromDomain()) .build() -internal fun SelectedObfuscation.fromDomain(): +internal fun ObfuscationMode.fromDomain(): ManagementInterface.ObfuscationSettings.SelectedObfuscation = when (this) { - SelectedObfuscation.Udp2Tcp -> + ObfuscationMode.Udp2Tcp -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.UDP2TCP - SelectedObfuscation.Auto -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.AUTO - SelectedObfuscation.Off -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.OFF + ObfuscationMode.Shadowsocks -> + ManagementInterface.ObfuscationSettings.SelectedObfuscation.SHADOWSOCKS + ObfuscationMode.Auto -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.AUTO + ObfuscationMode.Off -> ManagementInterface.ObfuscationSettings.SelectedObfuscation.OFF } internal fun Udp2TcpObfuscationSettings.fromDomain(): @@ -236,3 +239,11 @@ internal fun ApiAccessMethodSetting.fromDomain(): ManagementInterface.AccessMeth .setEnabled(enabled) .setAccessMethod(apiAccessMethod.fromDomain()) .build() + +internal fun ShadowsocksSettings.fromDomain(): ManagementInterface.ShadowsocksSettings = + when (val port = port) { + is Constraint.Any -> + ManagementInterface.ShadowsocksSettings.newBuilder().clearPort().build() + is Constraint.Only -> + ManagementInterface.ShadowsocksSettings.newBuilder().setPort(port.value.value).build() + } diff --git a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt index a1020b71d0..a171cff46b 100644 --- a/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt +++ b/android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt @@ -39,6 +39,7 @@ import net.mullvad.mullvadvpn.lib.model.GeoIpLocation import net.mullvad.mullvadvpn.lib.model.GeoLocationId import net.mullvad.mullvadvpn.lib.model.Mtu import net.mullvad.mullvadvpn.lib.model.ObfuscationEndpoint +import net.mullvad.mullvadvpn.lib.model.ObfuscationMode import net.mullvad.mullvadvpn.lib.model.ObfuscationSettings import net.mullvad.mullvadvpn.lib.model.ObfuscationType import net.mullvad.mullvadvpn.lib.model.Ownership @@ -57,8 +58,8 @@ import net.mullvad.mullvadvpn.lib.model.RelayItemId import net.mullvad.mullvadvpn.lib.model.RelayList import net.mullvad.mullvadvpn.lib.model.RelayOverride import net.mullvad.mullvadvpn.lib.model.RelaySettings -import net.mullvad.mullvadvpn.lib.model.SelectedObfuscation import net.mullvad.mullvadvpn.lib.model.Settings +import net.mullvad.mullvadvpn.lib.model.ShadowsocksSettings import net.mullvad.mullvadvpn.lib.model.SocksAuth import net.mullvad.mullvadvpn.lib.model.SplitTunnelSettings import net.mullvad.mullvadvpn.lib.model.TransportProtocol @@ -172,10 +173,10 @@ internal fun ManagementInterface.ObfuscationEndpoint.toDomain(): ObfuscationEndp internal fun ManagementInterface.ObfuscationEndpoint.ObfuscationType.toDomain(): ObfuscationType = when (this) { ManagementInterface.ObfuscationEndpoint.ObfuscationType.UDP2TCP -> ObfuscationType.Udp2Tcp + ManagementInterface.ObfuscationEndpoint.ObfuscationType.SHADOWSOCKS -> + ObfuscationType.Shadowsocks ManagementInterface.ObfuscationEndpoint.ObfuscationType.UNRECOGNIZED -> throw IllegalArgumentException("Unrecognized obfuscation type") - ManagementInterface.ObfuscationEndpoint.ObfuscationType.SHADOWSOCKS -> - throw IllegalArgumentException("Shadowsocks is unsupported") } internal fun ManagementInterface.TransportProtocol.toDomain(): TransportProtocol = @@ -334,19 +335,20 @@ internal fun ManagementInterface.Ownership.toDomain(): Constraint<Ownership> = internal fun ManagementInterface.ObfuscationSettings.toDomain(): ObfuscationSettings = ObfuscationSettings( - selectedObfuscation = selectedObfuscation.toDomain(), + selectedObfuscationMode = selectedObfuscation.toDomain(), udp2tcp = udp2Tcp.toDomain(), + shadowsocks = shadowsocks.toDomain(), ) internal fun ManagementInterface.ObfuscationSettings.SelectedObfuscation.toDomain(): - SelectedObfuscation = + ObfuscationMode = when (this) { - ManagementInterface.ObfuscationSettings.SelectedObfuscation.AUTO -> SelectedObfuscation.Auto - ManagementInterface.ObfuscationSettings.SelectedObfuscation.OFF -> SelectedObfuscation.Off + ManagementInterface.ObfuscationSettings.SelectedObfuscation.AUTO -> ObfuscationMode.Auto + ManagementInterface.ObfuscationSettings.SelectedObfuscation.OFF -> ObfuscationMode.Off ManagementInterface.ObfuscationSettings.SelectedObfuscation.UDP2TCP -> - SelectedObfuscation.Udp2Tcp + ObfuscationMode.Udp2Tcp ManagementInterface.ObfuscationSettings.SelectedObfuscation.SHADOWSOCKS -> - throw IllegalArgumentException("Shadowsocks is unsupported") + ObfuscationMode.Shadowsocks ManagementInterface.ObfuscationSettings.SelectedObfuscation.UNRECOGNIZED -> throw IllegalArgumentException("Unrecognized selected obfuscation") } @@ -358,6 +360,13 @@ internal fun ManagementInterface.Udp2TcpObfuscationSettings.toDomain(): Udp2TcpO Udp2TcpObfuscationSettings(Constraint.Any) } +internal fun ManagementInterface.ShadowsocksSettings.toDomain(): ShadowsocksSettings = + if (hasPort()) { + ShadowsocksSettings(Constraint.Only(Port(port))) + } else { + ShadowsocksSettings(Constraint.Any) + } + internal fun ManagementInterface.CustomList.toDomain(): CustomList = CustomList( id = CustomListId(id), @@ -443,7 +452,10 @@ internal fun ManagementInterface.RelayList.toDomain(): RelayList = RelayList(countriesList.toDomain(), wireguard.toDomain()) internal fun ManagementInterface.WireguardEndpointData.toDomain(): WireguardEndpointData = - WireguardEndpointData(portRangesList.map { it.toDomain() }) + WireguardEndpointData( + portRangesList.map { it.toDomain() }, + shadowsocksPortRangesList.map { it.toDomain() }, + ) internal fun ManagementInterface.WireguardRelayEndpointData.toDomain(): WireguardRelayEndpointData = WireguardRelayEndpointData(daita) @@ -609,9 +621,9 @@ internal fun ManagementInterface.FeatureIndicator.toDomain() = FeatureIndicator.SERVER_IP_OVERRIDE ManagementInterface.FeatureIndicator.CUSTOM_MTU -> FeatureIndicator.CUSTOM_MTU ManagementInterface.FeatureIndicator.DAITA -> FeatureIndicator.DAITA + ManagementInterface.FeatureIndicator.SHADOWSOCKS -> FeatureIndicator.SHADOWSOCKS ManagementInterface.FeatureIndicator.DAITA_SMART_ROUTING, ManagementInterface.FeatureIndicator.LOCKDOWN_MODE, - ManagementInterface.FeatureIndicator.SHADOWSOCKS, ManagementInterface.FeatureIndicator.MULTIHOP, ManagementInterface.FeatureIndicator.BRIDGE_MODE, ManagementInterface.FeatureIndicator.CUSTOM_MSS_FIX, |
