diff options
| author | David Lönnhager <david.l@mullvad.net> | 2020-10-16 11:33:48 +0200 |
|---|---|---|
| committer | David Lönnhager <david.l@mullvad.net> | 2020-10-22 09:33:58 +0200 |
| commit | ad7ecabcf6004bd766823ea1e1345af7af4357b6 (patch) | |
| tree | 5aba275ab8e4330c3742d201985c66460a0157d3 | |
| parent | e7890e727d7075ec7a41b02147e74e12bbf3f966 (diff) | |
| download | mullvadvpn-ad7ecabcf6004bd766823ea1e1345af7af4357b6.tar.xz mullvadvpn-ad7ecabcf6004bd766823ea1e1345af7af4357b6.zip | |
Add custom DNS setting to management interface
| -rw-r--r-- | mullvad-daemon/src/management_interface.rs | 34 | ||||
| -rw-r--r-- | mullvad-management-interface/proto/management_interface.proto | 6 |
2 files changed, 40 insertions, 0 deletions
diff --git a/mullvad-daemon/src/management_interface.rs b/mullvad-daemon/src/management_interface.rs index e3533b28e2..50caacc005 100644 --- a/mullvad-daemon/src/management_interface.rs +++ b/mullvad-daemon/src/management_interface.rs @@ -408,6 +408,33 @@ impl ManagementService for ManagementServiceImpl { .map_err(|_| Status::internal("internal error")) } + async fn set_custom_dns(&self, request: Request<types::CustomDns>) -> ServiceResult<()> { + let servers = request.into_inner(); + log::debug!("set_custom_dns({:?})", servers.addresses); + + let mut servers_ip = vec![]; + for server in servers.addresses.into_iter() { + if let Ok(addr) = server.parse() { + servers_ip.push(addr); + } else { + let err_msg = format!("failed to parse IP address: {}", server); + return Err(Status::invalid_argument(err_msg)); + } + } + + let servers_ip = if !servers_ip.is_empty() { + Some(servers_ip) + } else { + None + }; + + let (tx, rx) = oneshot::channel(); + self.send_command_to_daemon(DaemonCommand::SetCustomDns(tx, servers_ip))?; + rx.await + .map(Response::new) + .map_err(|_| Status::internal("internal error")) + } + // Account management // @@ -1140,6 +1167,13 @@ fn convert_tunnel_options(options: &TunnelOptions) -> types::TunnelOptions { }), generic: Some(types::tunnel_options::GenericOptions { enable_ipv6: options.generic.enable_ipv6, + custom_dns: options + .generic + .custom_dns + .as_ref() + .map(|addresses| types::CustomDns { + addresses: addresses.iter().map(|addr| addr.to_string()).collect(), + }), }), } } diff --git a/mullvad-management-interface/proto/management_interface.proto b/mullvad-management-interface/proto/management_interface.proto index 995bd0d346..b66bc7439f 100644 --- a/mullvad-management-interface/proto/management_interface.proto +++ b/mullvad-management-interface/proto/management_interface.proto @@ -39,6 +39,7 @@ service ManagementService { rpc SetOpenvpnMssfix(google.protobuf.UInt32Value) returns (google.protobuf.Empty) {} rpc SetWireguardMtu(google.protobuf.UInt32Value) returns (google.protobuf.Empty) {} rpc SetEnableIpv6(google.protobuf.BoolValue) returns (google.protobuf.Empty) {} + rpc SetCustomDns(CustomDns) returns (google.protobuf.Empty) {} // Account management rpc CreateNewAccount(google.protobuf.Empty) returns (google.protobuf.StringValue) {} @@ -359,6 +360,7 @@ message TunnelOptions { } message GenericOptions { bool enable_ipv6 = 1; + CustomDns custom_dns = 2; } OpenvpnOptions openvpn = 1; @@ -366,6 +368,10 @@ message TunnelOptions { GenericOptions generic = 3; } +message CustomDns { + repeated string addresses = 1; +} + message PublicKey { bytes key = 1; google.protobuf.Timestamp created = 2; |
