Skip to content

Commit ec88cf1

Browse files
authored
Merge pull request #27 from tkhq/zeke-use-addrv4-2
Use SocketAddr:V4, not custom inputs for HostServer address
2 parents 891bd0e + 7fbb338 commit ec88cf1

File tree

6 files changed

+33
-104
lines changed

6 files changed

+33
-104
lines changed

Diff for: Cargo.lock

-16
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

Diff for: qos-host/Cargo.toml

-1
Original file line numberDiff line numberDiff line change
@@ -9,5 +9,4 @@ qos-core = { path = "../qos-core" }
99
# Third party
1010
axum = { version = "0.5.4", features = ["http1"], default-features = false }
1111
tokio = { version = "1.18", features = ["macros", "rt-multi-thread"], default-features = false }
12-
regex = { version = "1", default-features = false, features = ["std", "unicode"] }
1312
borsh = { version = "0.9" }

Diff for: qos-host/src/cli.rs

+14-66
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
//! Command line interface for creating a host server and helpers for parsing
2-
//! host specific command line arguments.
1+
//! Command line interface for running a QOS Host server.
32
4-
use std::{env, net::SocketAddr};
3+
use std::{
4+
env,
5+
net::{IpAddr, Ipv4Addr, SocketAddr},
6+
};
57

68
use qos_core::cli::EnclaveOptions;
7-
use regex::Regex;
89

910
use crate::HostServer;
1011

11-
const IP_REGEX: &str = r"^(\d{1,3})\.(\d{1,3})\.(\d{1,3})\.(\d{1,3})$";
12-
13-
/// CLI options for starting a host server
12+
/// CLI options for starting a host server.
1413
#[derive(Clone, Debug, PartialEq)]
1514
pub struct HostServerOptions {
1615
enclave: EnclaveOptions,
@@ -26,7 +25,7 @@ impl HostServerOptions {
2625
/// CLI options for host IP address and Port.
2726
#[derive(Default, Clone, Copy, Debug, PartialEq)]
2827
pub struct HostOptions {
29-
ip: Option<[u8; 4]>,
28+
ip: Option<Ipv4Addr>,
3029
port: Option<u16>,
3130
}
3231

@@ -44,11 +43,8 @@ impl HostOptions {
4443
/// Panics if the url cannot be parsed from options
4544
#[must_use]
4645
pub fn url(&self) -> String {
47-
if let Self { ip: Some(ip), port: Some(port) } = self {
48-
return format!(
49-
"http://{}.{}.{}.{}:{}",
50-
ip[0], ip[1], ip[2], ip[3], port
51-
);
46+
if let Self { ip: Some(ip), port: Some(port) } = *self {
47+
return format!("http://{}:{}", ip, port);
5248
}
5349

5450
panic!("Couldn't parse URL from options.")
@@ -69,24 +65,9 @@ impl HostOptions {
6965

7066
fn parse_ip(&mut self, cmd: &str, arg: &str) {
7167
if cmd == "--host-ip" {
72-
let re = Regex::new(IP_REGEX)
73-
.expect("Could not parse value from `--host-ip`");
74-
let mut iter = re.captures_iter(arg);
75-
76-
let parse = |string: &str| {
77-
string
78-
.to_string()
79-
.parse::<u8>()
80-
.expect("Could not parse value from `--host-ip`")
81-
};
82-
83-
if let Some(cap) = iter.next() {
84-
let ip1 = parse(&cap[1]);
85-
let ip2 = parse(&cap[2]);
86-
let ip3 = parse(&cap[3]);
87-
let ip4 = parse(&cap[4]);
88-
self.ip = Some([ip1, ip2, ip3, ip4]);
89-
}
68+
self.ip = Some(
69+
arg.parse().expect("Could not parse value from `--host-ip`"),
70+
);
9071
}
9172
}
9273

@@ -122,7 +103,7 @@ impl CLI {
122103
let options = parse_args(&args);
123104
let addr = host_addr_from_options(options.host);
124105
let enclave_addr = options.enclave.addr();
125-
HostServer::new_with_socket_addr(enclave_addr, addr).serve().await;
106+
HostServer::new(enclave_addr, addr).serve().await;
126107
}
127108
}
128109

@@ -141,41 +122,8 @@ fn parse_args(args: &[String]) -> HostServerOptions {
141122

142123
fn host_addr_from_options(options: HostOptions) -> SocketAddr {
143124
if let HostOptions { ip: Some(ip), port: Some(port), .. } = options {
144-
SocketAddr::from((ip, port))
125+
SocketAddr::new(IpAddr::V4(ip), port)
145126
} else {
146127
panic!("Invalid host address options")
147128
}
148129
}
149-
150-
#[cfg(test)]
151-
mod test {
152-
use super::*;
153-
154-
#[test]
155-
fn parse_ip_with_regex() {
156-
expect_ip("1.1.1.1", [1, 1, 1, 1]);
157-
expect_ip("1.2.3.4", [1, 2, 3, 4]);
158-
expect_ip("12.34.56.78", [12, 34, 56, 78]);
159-
expect_ip("111.222.244.255", [111, 222, 244, 255]);
160-
}
161-
162-
#[test]
163-
#[should_panic]
164-
fn no_parse_ip() {
165-
expect_ip("something111.222.244.255", [111, 222, 244, 255]);
166-
}
167-
168-
fn expect_ip(arg: &str, expected: [u8; 4]) {
169-
let mut options = HostOptions::new();
170-
options.parse_ip("--host-ip", arg);
171-
172-
if let Some(ip) = options.ip {
173-
assert_eq!(ip[0], expected[0]);
174-
assert_eq!(ip[1], expected[1]);
175-
assert_eq!(ip[2], expected[2]);
176-
assert_eq!(ip[3], expected[3]);
177-
} else {
178-
panic!("Couldn't parse ip address");
179-
}
180-
}
181-
}

Diff for: qos-host/src/lib.rs

+3-11
Original file line numberDiff line numberDiff line change
@@ -49,18 +49,10 @@ pub struct HostServer {
4949
}
5050

5151
impl HostServer {
52-
/// Create a new [`HostServer`].
52+
/// Create a new [`HostServer`]. See [`Self::serve`] for starting the
53+
/// server.
5354
#[must_use]
54-
pub fn new(enclave_addr: SocketAddress, ip: [u8; 4], port: u16) -> Self {
55-
Self { addr: SocketAddr::from((ip, port)), enclave_addr }
56-
}
57-
58-
/// Create a new [`HostServer`].
59-
#[must_use]
60-
pub fn new_with_socket_addr(
61-
enclave_addr: SocketAddress,
62-
addr: SocketAddr,
63-
) -> Self {
55+
pub fn new(enclave_addr: SocketAddress, addr: SocketAddr) -> Self {
6456
Self { enclave_addr, addr }
6557
}
6658

Diff for: qos-test/tests/load.rs

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
use std::net::{Ipv4Addr, SocketAddr, SocketAddrV4};
2+
13
use qos_core::{
24
io::SocketAddress,
35
protocol::{Executor, Load, MockNsm, ProtocolMsg, SignatureWithPubKey},
@@ -55,11 +57,10 @@ fn load_e2e() {
5557
//
5658
let enclave_addr = SocketAddress::new_unix("./rsa_verify_payload.sock");
5759
let enclave_addr2 = enclave_addr.clone();
58-
let ip = [127, 0, 0, 1];
60+
let ip = Ipv4Addr::from([127, 0, 0, 1]);
5961
let port = 3001; // Use a unique port so we don't collide with other tests
60-
let url =
61-
format!("http://{}.{}.{}.{}:{}", ip[0], ip[1], ip[2], ip[3], port);
62-
let message_url = format!("{}/{}", url, "message");
62+
let socket_addr = SocketAddrV4::new(ip, port);
63+
let message_url = format!("http://{}/message", socket_addr);
6364
let pivot_file = "./verification.pivot".to_string();
6465
let secret_file = "./verification.secret".to_string();
6566
let ephemeral_file = "./verification.ephemeral".to_string();
@@ -81,7 +82,7 @@ fn load_e2e() {
8182
});
8283

8384
std::thread::spawn(move || {
84-
let host = HostServer::new(enclave_addr2, ip, port);
85+
let host = HostServer::new(enclave_addr2, SocketAddr::V4(socket_addr));
8586

8687
let rt = tokio::runtime::Builder::new_current_thread()
8788
.enable_all()

Diff for: qos-test/tests/provision.rs

+10-5
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,9 @@
1-
use std::{fs::File, io::Read, path::Path};
1+
use std::{
2+
fs::File,
3+
io::Read,
4+
net::{Ipv4Addr, SocketAddr, SocketAddrV4},
5+
path::Path,
6+
};
27

38
use qos_core::{
49
io::SocketAddress,
@@ -12,10 +17,10 @@ async fn provision_e2e() {
1217
let usock = "./provisions_e2e.sock";
1318
let enclave_addr = SocketAddress::new_unix(usock);
1419
let enclave_addr2 = enclave_addr.clone();
15-
let ip = [127, 0, 0, 1];
20+
let ip = Ipv4Addr::from([127u8, 0, 0, 1]);
1621
let port = 3002;
17-
let url =
18-
format!("http://{}.{}.{}.{}:{}", ip[0], ip[1], ip[2], ip[3], port);
22+
let socket_addr = SocketAddrV4::new(ip, port);
23+
let url = format!("http://{}", socket_addr);
1924
let health_url = format!("{}/{}", url, "health");
2025
let message_url = format!("{}/{}", url, "message");
2126

@@ -40,7 +45,7 @@ async fn provision_e2e() {
4045
});
4146

4247
std::thread::spawn(move || {
43-
let host = HostServer::new(enclave_addr2, ip, port);
48+
let host = HostServer::new(enclave_addr2, SocketAddr::V4(socket_addr));
4449

4550
let rt = tokio::runtime::Builder::new_current_thread()
4651
.enable_all()

0 commit comments

Comments
 (0)