summaryrefslogtreecommitdiffhomepage
path: root/android/lib/daemon-grpc/src
diff options
context:
space:
mode:
authorJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-09-17 15:34:41 +0200
committerJonatan Rhodin <jonatan.rhodin@mullvad.net>2024-09-17 15:34:41 +0200
commit95cd7d3e57fe08a93068c34d069d259c9d58dddd (patch)
treee1a608d11a51fa2246002695b5ecaed9c71f1da5 /android/lib/daemon-grpc/src
parent196061b0c06c031d3e19b4bfa13268010e8a4e2c (diff)
downloadmullvadvpn-95cd7d3e57fe08a93068c34d069d259c9d58dddd.tar.xz
mullvadvpn-95cd7d3e57fe08a93068c34d069d259c9d58dddd.zip
Implement wireguard over shadowsocks
Diffstat (limited to 'android/lib/daemon-grpc/src')
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/ManagementService.kt26
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/FromDomain.kt25
-rw-r--r--android/lib/daemon-grpc/src/main/kotlin/net/mullvad/mullvadvpn/lib/daemon/grpc/mapper/ToDomain.kt34
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,