@@ -13,14 +13,11 @@ use std::sync::Arc;
13
13
use bittorrent_http_protocol:: v1:: requests:: announce:: { peer_from_request, Announce } ;
14
14
use bittorrent_http_protocol:: v1:: responses;
15
15
use bittorrent_http_protocol:: v1:: services:: peer_ip_resolver:: { self , ClientIpSources } ;
16
- use bittorrent_primitives:: info_hash:: InfoHash ;
17
16
use bittorrent_tracker_core:: announce_handler:: { AnnounceHandler , PeersWanted } ;
18
17
use bittorrent_tracker_core:: authentication:: service:: AuthenticationService ;
19
- use bittorrent_tracker_core:: error:: AnnounceError ;
20
18
use bittorrent_tracker_core:: whitelist;
21
19
use torrust_tracker_configuration:: Core ;
22
20
use torrust_tracker_primitives:: core:: AnnounceData ;
23
- use torrust_tracker_primitives:: peer;
24
21
25
22
use crate :: packages:: http_tracker_core;
26
23
@@ -69,34 +66,11 @@ pub async fn handle_announce(
69
66
None => PeersWanted :: AsManyAsPossible ,
70
67
} ;
71
68
72
- let announce_data = invoke (
73
- announce_handler. clone ( ) ,
74
- opt_http_stats_event_sender. clone ( ) ,
75
- announce_request. info_hash ,
76
- & mut peer,
77
- & peers_wanted,
78
- )
79
- . await
80
- . map_err ( responses:: error:: Error :: from) ?;
81
-
82
- Ok ( announce_data)
83
- }
84
-
85
- /// # Errors
86
- ///
87
- /// This function will return an error if the announce requests failed.
88
- pub async fn invoke (
89
- announce_handler : Arc < AnnounceHandler > ,
90
- opt_http_stats_event_sender : Arc < Option < Box < dyn http_tracker_core:: statistics:: event:: sender:: Sender > > > ,
91
- info_hash : InfoHash ,
92
- peer : & mut peer:: Peer ,
93
- peers_wanted : & PeersWanted ,
94
- ) -> Result < AnnounceData , AnnounceError > {
95
69
let original_peer_ip = peer. peer_addr . ip ( ) ;
96
70
97
71
// The tracker could change the original peer ip
98
72
let announce_data = announce_handler
99
- . announce ( & info_hash, peer, & original_peer_ip, peers_wanted)
73
+ . announce ( & announce_request . info_hash , & mut peer, & original_peer_ip, & peers_wanted)
100
74
. await ?;
101
75
102
76
if let Some ( http_stats_event_sender) = opt_http_stats_event_sender. as_deref ( ) {
@@ -123,34 +97,45 @@ mod tests {
123
97
use std:: sync:: Arc ;
124
98
125
99
use aquatic_udp_protocol:: { AnnounceEvent , NumberOfBytes , PeerId } ;
100
+ use bittorrent_http_protocol:: v1:: requests:: announce:: Announce ;
101
+ use bittorrent_http_protocol:: v1:: services:: peer_ip_resolver:: ClientIpSources ;
126
102
use bittorrent_tracker_core:: announce_handler:: AnnounceHandler ;
103
+ use bittorrent_tracker_core:: authentication:: key:: repository:: in_memory:: InMemoryKeyRepository ;
104
+ use bittorrent_tracker_core:: authentication:: service:: AuthenticationService ;
127
105
use bittorrent_tracker_core:: databases:: setup:: initialize_database;
128
106
use bittorrent_tracker_core:: torrent:: repository:: in_memory:: InMemoryTorrentRepository ;
129
107
use bittorrent_tracker_core:: torrent:: repository:: persisted:: DatabasePersistentTorrentRepository ;
130
108
use bittorrent_tracker_core:: whitelist:: authorization:: WhitelistAuthorization ;
131
109
use bittorrent_tracker_core:: whitelist:: repository:: in_memory:: InMemoryWhitelist ;
132
- use torrust_tracker_configuration:: Core ;
110
+ use torrust_tracker_configuration:: { Configuration , Core } ;
111
+ use torrust_tracker_primitives:: peer:: Peer ;
133
112
use torrust_tracker_primitives:: { peer, DurationSinceUnixEpoch } ;
134
113
use torrust_tracker_test_helpers:: configuration;
135
114
136
115
struct CoreTrackerServices {
137
116
pub core_config : Arc < Core > ,
138
117
pub announce_handler : Arc < AnnounceHandler > ,
118
+ pub authentication_service : Arc < AuthenticationService > ,
119
+ pub whitelist_authorization : Arc < WhitelistAuthorization > ,
139
120
}
140
121
141
122
struct CoreHttpTrackerServices {
142
123
pub http_stats_event_sender : Arc < Option < Box < dyn http_tracker_core:: statistics:: event:: sender:: Sender > > > ,
143
124
}
144
125
145
126
fn initialize_core_tracker_services ( ) -> ( CoreTrackerServices , CoreHttpTrackerServices ) {
146
- let config = configuration:: ephemeral_public ( ) ;
127
+ initialize_core_tracker_services_with_config ( & configuration:: ephemeral_public ( ) )
128
+ }
147
129
130
+ fn initialize_core_tracker_services_with_config ( config : & Configuration ) -> ( CoreTrackerServices , CoreHttpTrackerServices ) {
148
131
let core_config = Arc :: new ( config. core . clone ( ) ) ;
149
132
let database = initialize_database ( & config. core ) ;
150
133
let in_memory_torrent_repository = Arc :: new ( InMemoryTorrentRepository :: default ( ) ) ;
151
134
let db_torrent_repository = Arc :: new ( DatabasePersistentTorrentRepository :: new ( & database) ) ;
152
135
let in_memory_whitelist = Arc :: new ( InMemoryWhitelist :: default ( ) ) ;
153
136
let whitelist_authorization = Arc :: new ( WhitelistAuthorization :: new ( & config. core , & in_memory_whitelist. clone ( ) ) ) ;
137
+ let in_memory_key_repository = Arc :: new ( InMemoryKeyRepository :: default ( ) ) ;
138
+ let authentication_service = Arc :: new ( AuthenticationService :: new ( & core_config, & in_memory_key_repository) ) ;
154
139
155
140
let announce_handler = Arc :: new ( AnnounceHandler :: new (
156
141
& config. core ,
@@ -169,6 +154,8 @@ mod tests {
169
154
CoreTrackerServices {
170
155
core_config,
171
156
announce_handler,
157
+ authentication_service,
158
+ whitelist_authorization,
172
159
} ,
173
160
CoreHttpTrackerServices { http_stats_event_sender } ,
174
161
)
@@ -199,11 +186,33 @@ mod tests {
199
186
}
200
187
}
201
188
189
+ fn sample_announce_request_for_peer ( peer : Peer ) -> ( Announce , ClientIpSources ) {
190
+ let announce_request = Announce {
191
+ info_hash : sample_info_hash ( ) ,
192
+ peer_id : peer. peer_id ,
193
+ port : peer. peer_addr . port ( ) ,
194
+ uploaded : Some ( peer. uploaded ) ,
195
+ downloaded : Some ( peer. downloaded ) ,
196
+ left : Some ( peer. left ) ,
197
+ event : Some ( peer. event . into ( ) ) ,
198
+ compact : None ,
199
+ numwant : None ,
200
+ } ;
201
+
202
+ let client_ip_sources = ClientIpSources {
203
+ right_most_x_forwarded_for : None ,
204
+ connection_info_ip : Some ( peer. peer_addr . ip ( ) ) ,
205
+ } ;
206
+
207
+ ( announce_request, client_ip_sources)
208
+ }
209
+
202
210
use futures:: future:: BoxFuture ;
203
211
use mockall:: mock;
204
212
use tokio:: sync:: mpsc:: error:: SendError ;
205
213
206
214
use crate :: packages:: http_tracker_core;
215
+ use crate :: servers:: http:: test_helpers:: tests:: sample_info_hash;
207
216
208
217
mock ! {
209
218
HttpStatsEventSender { }
@@ -217,55 +226,37 @@ mod tests {
217
226
use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr } ;
218
227
use std:: sync:: Arc ;
219
228
220
- use bittorrent_tracker_core:: announce_handler:: { AnnounceHandler , PeersWanted } ;
221
- use bittorrent_tracker_core:: databases:: setup:: initialize_database;
222
- use bittorrent_tracker_core:: torrent:: repository:: in_memory:: InMemoryTorrentRepository ;
223
- use bittorrent_tracker_core:: torrent:: repository:: persisted:: DatabasePersistentTorrentRepository ;
224
- use bittorrent_tracker_core:: whitelist:: authorization:: WhitelistAuthorization ;
225
- use bittorrent_tracker_core:: whitelist:: repository:: in_memory:: InMemoryWhitelist ;
226
229
use mockall:: predicate:: eq;
230
+ use torrust_tracker_configuration:: Configuration ;
227
231
use torrust_tracker_primitives:: core:: AnnounceData ;
228
232
use torrust_tracker_primitives:: peer;
229
233
use torrust_tracker_primitives:: swarm_metadata:: SwarmMetadata ;
230
234
use torrust_tracker_test_helpers:: configuration;
231
235
232
236
use super :: { sample_peer_using_ipv4, sample_peer_using_ipv6} ;
233
237
use crate :: packages:: http_tracker_core;
234
- use crate :: packages:: http_tracker_core:: services:: announce:: invoke ;
238
+ use crate :: packages:: http_tracker_core:: services:: announce:: handle_announce ;
235
239
use crate :: packages:: http_tracker_core:: services:: announce:: tests:: {
236
- initialize_core_tracker_services, sample_peer, MockHttpStatsEventSender ,
240
+ initialize_core_tracker_services, initialize_core_tracker_services_with_config, sample_announce_request_for_peer,
241
+ sample_peer, MockHttpStatsEventSender ,
237
242
} ;
238
- use crate :: servers:: http:: test_helpers:: tests:: sample_info_hash;
239
-
240
- fn initialize_announce_handler ( ) -> Arc < AnnounceHandler > {
241
- let config = configuration:: ephemeral ( ) ;
242
-
243
- let database = initialize_database ( & config. core ) ;
244
- let in_memory_torrent_repository = Arc :: new ( InMemoryTorrentRepository :: default ( ) ) ;
245
- let db_torrent_repository = Arc :: new ( DatabasePersistentTorrentRepository :: new ( & database) ) ;
246
- let in_memory_whitelist = Arc :: new ( InMemoryWhitelist :: default ( ) ) ;
247
- let whitelist_authorization = Arc :: new ( WhitelistAuthorization :: new ( & config. core , & in_memory_whitelist. clone ( ) ) ) ;
248
-
249
- Arc :: new ( AnnounceHandler :: new (
250
- & config. core ,
251
- & whitelist_authorization,
252
- & in_memory_torrent_repository,
253
- & db_torrent_repository,
254
- ) )
255
- }
256
243
257
244
#[ tokio:: test]
258
245
async fn it_should_return_the_announce_data ( ) {
259
246
let ( core_tracker_services, core_http_tracker_services) = initialize_core_tracker_services ( ) ;
260
247
261
- let mut peer = sample_peer ( ) ;
248
+ let peer = sample_peer ( ) ;
262
249
263
- let announce_data = invoke (
264
- core_tracker_services. announce_handler . clone ( ) ,
265
- core_http_tracker_services. http_stats_event_sender . clone ( ) ,
266
- sample_info_hash ( ) ,
267
- & mut peer,
268
- & PeersWanted :: AsManyAsPossible ,
250
+ let ( announce_request, client_ip_sources) = sample_announce_request_for_peer ( peer) ;
251
+
252
+ let announce_data = handle_announce (
253
+ & core_tracker_services. core_config ,
254
+ & core_tracker_services. announce_handler ,
255
+ & core_tracker_services. authentication_service ,
256
+ & core_tracker_services. whitelist_authorization ,
257
+ & core_http_tracker_services. http_stats_event_sender ,
258
+ & announce_request,
259
+ & client_ip_sources,
269
260
)
270
261
. await
271
262
. unwrap ( ) ;
@@ -294,28 +285,32 @@ mod tests {
294
285
let http_stats_event_sender: Arc < Option < Box < dyn http_tracker_core:: statistics:: event:: sender:: Sender > > > =
295
286
Arc :: new ( Some ( Box :: new ( http_stats_event_sender_mock) ) ) ;
296
287
297
- let announce_handler = initialize_announce_handler ( ) ;
288
+ let ( core_tracker_services, mut core_http_tracker_services) = initialize_core_tracker_services ( ) ;
289
+ core_http_tracker_services. http_stats_event_sender = http_stats_event_sender;
298
290
299
- let mut peer = sample_peer_using_ipv4 ( ) ;
291
+ let peer = sample_peer_using_ipv4 ( ) ;
300
292
301
- let _announce_data = invoke (
302
- announce_handler,
303
- http_stats_event_sender,
304
- sample_info_hash ( ) ,
305
- & mut peer,
306
- & PeersWanted :: AsManyAsPossible ,
293
+ let ( announce_request, client_ip_sources) = sample_announce_request_for_peer ( peer) ;
294
+
295
+ let _announce_data = handle_announce (
296
+ & core_tracker_services. core_config ,
297
+ & core_tracker_services. announce_handler ,
298
+ & core_tracker_services. authentication_service ,
299
+ & core_tracker_services. whitelist_authorization ,
300
+ & core_http_tracker_services. http_stats_event_sender ,
301
+ & announce_request,
302
+ & client_ip_sources,
307
303
)
308
304
. await
309
305
. unwrap ( ) ;
310
306
}
311
307
312
- fn tracker_with_an_ipv6_external_ip ( ) -> Arc < AnnounceHandler > {
308
+ fn tracker_with_an_ipv6_external_ip ( ) -> Configuration {
313
309
let mut configuration = configuration:: ephemeral ( ) ;
314
310
configuration. core . net . external_ip = Some ( IpAddr :: V6 ( Ipv6Addr :: new (
315
311
0x6969 , 0x6969 , 0x6969 , 0x6969 , 0x6969 , 0x6969 , 0x6969 , 0x6969 ,
316
312
) ) ) ;
317
-
318
- initialize_announce_handler ( )
313
+ configuration
319
314
}
320
315
321
316
fn peer_with_the_ipv4_loopback_ip ( ) -> peer:: Peer {
@@ -340,16 +335,22 @@ mod tests {
340
335
let http_stats_event_sender: Arc < Option < Box < dyn http_tracker_core:: statistics:: event:: sender:: Sender > > > =
341
336
Arc :: new ( Some ( Box :: new ( http_stats_event_sender_mock) ) ) ;
342
337
343
- let mut peer = peer_with_the_ipv4_loopback_ip ( ) ;
338
+ let ( core_tracker_services, mut core_http_tracker_services) =
339
+ initialize_core_tracker_services_with_config ( & tracker_with_an_ipv6_external_ip ( ) ) ;
340
+ core_http_tracker_services. http_stats_event_sender = http_stats_event_sender;
344
341
345
- let announce_handler = tracker_with_an_ipv6_external_ip ( ) ;
342
+ let peer = peer_with_the_ipv4_loopback_ip ( ) ;
346
343
347
- let _announce_data = invoke (
348
- announce_handler,
349
- http_stats_event_sender,
350
- sample_info_hash ( ) ,
351
- & mut peer,
352
- & PeersWanted :: AsManyAsPossible ,
344
+ let ( announce_request, client_ip_sources) = sample_announce_request_for_peer ( peer) ;
345
+
346
+ let _announce_data = handle_announce (
347
+ & core_tracker_services. core_config ,
348
+ & core_tracker_services. announce_handler ,
349
+ & core_tracker_services. authentication_service ,
350
+ & core_tracker_services. whitelist_authorization ,
351
+ & core_http_tracker_services. http_stats_event_sender ,
352
+ & announce_request,
353
+ & client_ip_sources,
353
354
)
354
355
. await
355
356
. unwrap ( ) ;
@@ -367,16 +368,21 @@ mod tests {
367
368
let http_stats_event_sender: Arc < Option < Box < dyn http_tracker_core:: statistics:: event:: sender:: Sender > > > =
368
369
Arc :: new ( Some ( Box :: new ( http_stats_event_sender_mock) ) ) ;
369
370
370
- let announce_handler = initialize_announce_handler ( ) ;
371
+ let ( core_tracker_services, mut core_http_tracker_services) = initialize_core_tracker_services ( ) ;
372
+ core_http_tracker_services. http_stats_event_sender = http_stats_event_sender;
371
373
372
- let mut peer = sample_peer_using_ipv6 ( ) ;
374
+ let peer = sample_peer_using_ipv6 ( ) ;
373
375
374
- let _announce_data = invoke (
375
- announce_handler,
376
- http_stats_event_sender,
377
- sample_info_hash ( ) ,
378
- & mut peer,
379
- & PeersWanted :: AsManyAsPossible ,
376
+ let ( announce_request, client_ip_sources) = sample_announce_request_for_peer ( peer) ;
377
+
378
+ let _announce_data = handle_announce (
379
+ & core_tracker_services. core_config ,
380
+ & core_tracker_services. announce_handler ,
381
+ & core_tracker_services. authentication_service ,
382
+ & core_tracker_services. whitelist_authorization ,
383
+ & core_http_tracker_services. http_stats_event_sender ,
384
+ & announce_request,
385
+ & client_ip_sources,
380
386
)
381
387
. await
382
388
. unwrap ( ) ;
0 commit comments