summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorDavid Lönnhager <david.l@mullvad.net>2020-10-16 11:33:48 +0200
committerDavid Lönnhager <david.l@mullvad.net>2020-10-22 09:33:58 +0200
commitad7ecabcf6004bd766823ea1e1345af7af4357b6 (patch)
tree5aba275ab8e4330c3742d201985c66460a0157d3
parente7890e727d7075ec7a41b02147e74e12bbf3f966 (diff)
downloadmullvadvpn-ad7ecabcf6004bd766823ea1e1345af7af4357b6.tar.xz
mullvadvpn-ad7ecabcf6004bd766823ea1e1345af7af4357b6.zip
Add custom DNS setting to management interface
-rw-r--r--mullvad-daemon/src/management_interface.rs34
-rw-r--r--mullvad-management-interface/proto/management_interface.proto6
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;