1
- use ambient_authority:: AmbientAuthority ;
1
+ #[ cfg( test) ]
2
+ use crate :: ambient_authority;
3
+ use crate :: AmbientAuthority ;
2
4
use ipnet:: IpNet ;
5
+ #[ cfg( test) ]
6
+ use std:: str:: FromStr ;
3
7
use std:: { io, net} ;
4
8
5
9
// TODO: Perhaps we should have our own version of `ToSocketAddrs` which
@@ -21,12 +25,27 @@ impl AddrSet {
21
25
#[ derive( Clone ) ]
22
26
struct IpGrant {
23
27
set : AddrSet ,
24
- port : u16 , // TODO: IANA port names, TODO: range
28
+ ports_start : u16 ,
29
+ ports_end : Option < u16 > ,
25
30
}
26
31
27
32
impl IpGrant {
28
33
fn contains ( & self , addr : & net:: SocketAddr ) -> bool {
29
- self . set . contains ( addr. ip ( ) ) && addr. port ( ) == self . port
34
+ if !self . set . contains ( addr. ip ( ) ) {
35
+ return false ;
36
+ }
37
+
38
+ let port = addr. port ( ) ;
39
+ if port < self . ports_start {
40
+ return false ;
41
+ }
42
+ if let Some ( ports_end) = self . ports_end {
43
+ if port >= ports_end {
44
+ return false ;
45
+ }
46
+ }
47
+
48
+ true
30
49
}
31
50
}
32
51
@@ -46,25 +65,57 @@ impl Pool {
46
65
Self { grants : Vec :: new ( ) }
47
66
}
48
67
49
- /// Add a range of network addresses with a specific port to the pool.
68
+ /// Add a range of network addresses, accepting any port, to the pool.
50
69
///
51
70
/// # Ambient Authority
52
71
///
53
72
/// This function allows ambient access to any IP address.
54
- pub fn insert_ip_net (
73
+ pub fn insert_ip_net_port_any (
55
74
& mut self ,
56
75
ip_net : ipnet:: IpNet ,
57
- port : u16 ,
76
+ ambient_authority : AmbientAuthority ,
77
+ ) {
78
+ self . insert_ip_net_port_range ( ip_net, 0 , None , ambient_authority)
79
+ }
80
+
81
+ /// Add a range of network addresses, accepting a range of ports, to the pool.
82
+ ///
83
+ /// This grants access to the port range starting at `ports_start` and,
84
+ /// if `ports_end` is provided, ending before `ports_end`.
85
+ ///
86
+ /// # Ambient Authority
87
+ ///
88
+ /// This function allows ambient access to any IP address.
89
+ pub fn insert_ip_net_port_range (
90
+ & mut self ,
91
+ ip_net : ipnet:: IpNet ,
92
+ ports_start : u16 ,
93
+ ports_end : Option < u16 > ,
58
94
ambient_authority : AmbientAuthority ,
59
95
) {
60
96
let _ = ambient_authority;
61
97
62
98
self . grants . push ( IpGrant {
63
99
set : AddrSet :: Net ( ip_net) ,
64
- port,
100
+ ports_start,
101
+ ports_end,
65
102
} )
66
103
}
67
104
105
+ /// Add a range of network addresses with a specific port to the pool.
106
+ ///
107
+ /// # Ambient Authority
108
+ ///
109
+ /// This function allows ambient access to any IP address.
110
+ pub fn insert_ip_net (
111
+ & mut self ,
112
+ ip_net : ipnet:: IpNet ,
113
+ port : u16 ,
114
+ ambient_authority : AmbientAuthority ,
115
+ ) {
116
+ self . insert_ip_net_port_range ( ip_net, port, port. checked_add ( 1 ) , ambient_authority)
117
+ }
118
+
68
119
/// Add a specific [`net::SocketAddr`] to the pool.
69
120
///
70
121
/// # Ambient Authority
@@ -75,12 +126,7 @@ impl Pool {
75
126
addr : net:: SocketAddr ,
76
127
ambient_authority : AmbientAuthority ,
77
128
) {
78
- let _ = ambient_authority;
79
-
80
- self . grants . push ( IpGrant {
81
- set : AddrSet :: Net ( addr. ip ( ) . into ( ) ) ,
82
- port : addr. port ( ) ,
83
- } )
129
+ self . insert_ip_net ( addr. ip ( ) . into ( ) , addr. port ( ) , ambient_authority)
84
130
}
85
131
86
132
/// Check whether the given address is within the pool.
@@ -98,3 +144,82 @@ impl Pool {
98
144
99
145
/// An empty array of `SocketAddr`s.
100
146
pub const NO_SOCKET_ADDRS : & [ net:: SocketAddr ] = & [ ] ;
147
+
148
+ #[ test]
149
+ fn test_empty ( ) {
150
+ let p = Pool :: new ( ) ;
151
+
152
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:0" ) . unwrap ( ) )
153
+ . unwrap_err ( ) ;
154
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:1023" ) . unwrap ( ) )
155
+ . unwrap_err ( ) ;
156
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:1024" ) . unwrap ( ) )
157
+ . unwrap_err ( ) ;
158
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:8080" ) . unwrap ( ) )
159
+ . unwrap_err ( ) ;
160
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:65535" ) . unwrap ( ) )
161
+ . unwrap_err ( ) ;
162
+ }
163
+
164
+ #[ test]
165
+ fn test_port_any ( ) {
166
+ let mut p = Pool :: new ( ) ;
167
+ p. insert_ip_net_port_any (
168
+ IpNet :: new ( net:: IpAddr :: V6 ( net:: Ipv6Addr :: LOCALHOST ) , 48 ) . unwrap ( ) ,
169
+ ambient_authority ( ) ,
170
+ ) ;
171
+
172
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:0" ) . unwrap ( ) )
173
+ . unwrap ( ) ;
174
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:1023" ) . unwrap ( ) )
175
+ . unwrap ( ) ;
176
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:1024" ) . unwrap ( ) )
177
+ . unwrap ( ) ;
178
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:8080" ) . unwrap ( ) )
179
+ . unwrap ( ) ;
180
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:65535" ) . unwrap ( ) )
181
+ . unwrap ( ) ;
182
+ }
183
+
184
+ #[ test]
185
+ fn test_port_range ( ) {
186
+ let mut p = Pool :: new ( ) ;
187
+ p. insert_ip_net_port_range (
188
+ IpNet :: new ( net:: IpAddr :: V6 ( net:: Ipv6Addr :: LOCALHOST ) , 48 ) . unwrap ( ) ,
189
+ 1024 ,
190
+ Some ( 9000 ) ,
191
+ ambient_authority ( ) ,
192
+ ) ;
193
+
194
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:0" ) . unwrap ( ) )
195
+ . unwrap_err ( ) ;
196
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:1023" ) . unwrap ( ) )
197
+ . unwrap_err ( ) ;
198
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:1024" ) . unwrap ( ) )
199
+ . unwrap ( ) ;
200
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:8080" ) . unwrap ( ) )
201
+ . unwrap ( ) ;
202
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:65535" ) . unwrap ( ) )
203
+ . unwrap_err ( ) ;
204
+ }
205
+
206
+ #[ test]
207
+ fn test_port_one ( ) {
208
+ let mut p = Pool :: new ( ) ;
209
+ p. insert_ip_net (
210
+ IpNet :: new ( net:: IpAddr :: V6 ( net:: Ipv6Addr :: LOCALHOST ) , 48 ) . unwrap ( ) ,
211
+ 8080 ,
212
+ ambient_authority ( ) ,
213
+ ) ;
214
+
215
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:0" ) . unwrap ( ) )
216
+ . unwrap_err ( ) ;
217
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:1023" ) . unwrap ( ) )
218
+ . unwrap_err ( ) ;
219
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:1024" ) . unwrap ( ) )
220
+ . unwrap_err ( ) ;
221
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:8080" ) . unwrap ( ) )
222
+ . unwrap ( ) ;
223
+ p. check_addr ( & net:: SocketAddr :: from_str ( "[::1]:65535" ) . unwrap ( ) )
224
+ . unwrap_err ( ) ;
225
+ }
0 commit comments