1
+ use std:: sync:: Arc ;
2
+
3
+ use bittorrent_udp_tracker_core:: services:: banning:: BanService ;
4
+ use tokio:: sync:: RwLock ;
1
5
use torrust_tracker_metrics:: label:: { LabelSet , LabelValue } ;
2
6
use torrust_tracker_metrics:: { label_name, metric_name} ;
3
7
use torrust_tracker_primitives:: DurationSinceUnixEpoch ;
4
8
5
- use crate :: event:: { Event , UdpRequestKind , UdpResponseKind } ;
9
+ use crate :: event:: { ErrorKind , Event , UdpRequestKind , UdpResponseKind } ;
6
10
use crate :: statistics:: repository:: Repository ;
7
11
use crate :: statistics:: {
8
12
UDP_TRACKER_SERVER_ERRORS_TOTAL , UDP_TRACKER_SERVER_PERFORMANCE_AVG_PROCESSING_TIME_NS ,
@@ -16,7 +20,12 @@ use crate::statistics::{
16
20
/// This function panics if the client IP version does not match the expected
17
21
/// version.
18
22
#[ allow( clippy:: too_many_lines) ]
19
- pub async fn handle_event ( event : Event , stats_repository : & Repository , now : DurationSinceUnixEpoch ) {
23
+ pub async fn handle_event (
24
+ event : Event ,
25
+ stats_repository : & Repository ,
26
+ ban_service : & Arc < RwLock < BanService > > ,
27
+ now : DurationSinceUnixEpoch ,
28
+ ) {
20
29
match event {
21
30
Event :: UdpRequestAborted { context } => {
22
31
// Global fixed metrics
@@ -232,7 +241,14 @@ pub async fn handle_event(event: Event, stats_repository: &Repository, now: Dura
232
241
Err ( err) => tracing:: error!( "Failed to increase the counter: {}" , err) ,
233
242
} ;
234
243
}
235
- Event :: UdpError { context, kind, error : _ } => {
244
+ Event :: UdpError { context, kind, error } => {
245
+ // Increase the number of errors
246
+ // code-review: should we ban IP due to other errors too?
247
+ if let ErrorKind :: ConnectionCookie ( _msg) = error {
248
+ let mut ban_service = ban_service. write ( ) . await ;
249
+ ban_service. increase_counter ( & context. client_socket_addr ( ) . ip ( ) ) ;
250
+ }
251
+
236
252
// Global fixed metrics
237
253
match context. client_socket_addr ( ) . ip ( ) {
238
254
std:: net:: IpAddr :: V4 ( _) => {
@@ -267,7 +283,9 @@ pub async fn handle_event(event: Event, stats_repository: &Repository, now: Dura
267
283
#[ cfg( test) ]
268
284
mod tests {
269
285
use std:: net:: { IpAddr , Ipv4Addr , Ipv6Addr , SocketAddr } ;
286
+ use std:: sync:: Arc ;
270
287
288
+ use bittorrent_udp_tracker_core:: services:: banning:: BanService ;
271
289
use torrust_tracker_clock:: clock:: Time ;
272
290
use torrust_tracker_primitives:: service_binding:: { Protocol , ServiceBinding } ;
273
291
@@ -279,6 +297,7 @@ mod tests {
279
297
#[ tokio:: test]
280
298
async fn should_increase_the_number_of_aborted_requests_when_it_receives_a_udp_request_aborted_event ( ) {
281
299
let stats_repository = Repository :: new ( ) ;
300
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
282
301
283
302
handle_event (
284
303
Event :: UdpRequestAborted {
@@ -292,6 +311,7 @@ mod tests {
292
311
) ,
293
312
} ,
294
313
& stats_repository,
314
+ & ban_service,
295
315
CurrentClock :: now ( ) ,
296
316
)
297
317
. await ;
@@ -304,6 +324,7 @@ mod tests {
304
324
#[ tokio:: test]
305
325
async fn should_increase_the_number_of_banned_requests_when_it_receives_a_udp_request_banned_event ( ) {
306
326
let stats_repository = Repository :: new ( ) ;
327
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
307
328
308
329
handle_event (
309
330
Event :: UdpRequestBanned {
@@ -317,6 +338,7 @@ mod tests {
317
338
) ,
318
339
} ,
319
340
& stats_repository,
341
+ & ban_service,
320
342
CurrentClock :: now ( ) ,
321
343
)
322
344
. await ;
@@ -329,6 +351,7 @@ mod tests {
329
351
#[ tokio:: test]
330
352
async fn should_increase_the_number_of_incoming_requests_when_it_receives_a_udp4_incoming_request_event ( ) {
331
353
let stats_repository = Repository :: new ( ) ;
354
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
332
355
333
356
handle_event (
334
357
Event :: UdpRequestReceived {
@@ -342,6 +365,7 @@ mod tests {
342
365
) ,
343
366
} ,
344
367
& stats_repository,
368
+ & ban_service,
345
369
CurrentClock :: now ( ) ,
346
370
)
347
371
. await ;
@@ -354,6 +378,7 @@ mod tests {
354
378
#[ tokio:: test]
355
379
async fn should_increase_the_udp_abort_counter_when_it_receives_a_udp_abort_event ( ) {
356
380
let stats_repository = Repository :: new ( ) ;
381
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
357
382
358
383
handle_event (
359
384
Event :: UdpRequestAborted {
@@ -367,6 +392,7 @@ mod tests {
367
392
) ,
368
393
} ,
369
394
& stats_repository,
395
+ & ban_service,
370
396
CurrentClock :: now ( ) ,
371
397
)
372
398
. await ;
@@ -376,6 +402,7 @@ mod tests {
376
402
#[ tokio:: test]
377
403
async fn should_increase_the_udp_ban_counter_when_it_receives_a_udp_banned_event ( ) {
378
404
let stats_repository = Repository :: new ( ) ;
405
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
379
406
380
407
handle_event (
381
408
Event :: UdpRequestBanned {
@@ -389,6 +416,7 @@ mod tests {
389
416
) ,
390
417
} ,
391
418
& stats_repository,
419
+ & ban_service,
392
420
CurrentClock :: now ( ) ,
393
421
)
394
422
. await ;
@@ -399,6 +427,7 @@ mod tests {
399
427
#[ tokio:: test]
400
428
async fn should_increase_the_udp4_connect_requests_counter_when_it_receives_a_udp4_request_event_of_connect_kind ( ) {
401
429
let stats_repository = Repository :: new ( ) ;
430
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
402
431
403
432
handle_event (
404
433
Event :: UdpRequestAccepted {
@@ -413,6 +442,7 @@ mod tests {
413
442
kind : crate :: event:: UdpRequestKind :: Connect ,
414
443
} ,
415
444
& stats_repository,
445
+ & ban_service,
416
446
CurrentClock :: now ( ) ,
417
447
)
418
448
. await ;
@@ -425,6 +455,7 @@ mod tests {
425
455
#[ tokio:: test]
426
456
async fn should_increase_the_udp4_announce_requests_counter_when_it_receives_a_udp4_request_event_of_announce_kind ( ) {
427
457
let stats_repository = Repository :: new ( ) ;
458
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
428
459
429
460
handle_event (
430
461
Event :: UdpRequestAccepted {
@@ -439,6 +470,7 @@ mod tests {
439
470
kind : crate :: event:: UdpRequestKind :: Announce ,
440
471
} ,
441
472
& stats_repository,
473
+ & ban_service,
442
474
CurrentClock :: now ( ) ,
443
475
)
444
476
. await ;
@@ -451,6 +483,7 @@ mod tests {
451
483
#[ tokio:: test]
452
484
async fn should_increase_the_udp4_scrape_requests_counter_when_it_receives_a_udp4_request_event_of_scrape_kind ( ) {
453
485
let stats_repository = Repository :: new ( ) ;
486
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
454
487
455
488
handle_event (
456
489
Event :: UdpRequestAccepted {
@@ -465,6 +498,7 @@ mod tests {
465
498
kind : crate :: event:: UdpRequestKind :: Scrape ,
466
499
} ,
467
500
& stats_repository,
501
+ & ban_service,
468
502
CurrentClock :: now ( ) ,
469
503
)
470
504
. await ;
@@ -477,6 +511,7 @@ mod tests {
477
511
#[ tokio:: test]
478
512
async fn should_increase_the_udp4_responses_counter_when_it_receives_a_udp4_response_event ( ) {
479
513
let stats_repository = Repository :: new ( ) ;
514
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
480
515
481
516
handle_event (
482
517
Event :: UdpResponseSent {
@@ -494,6 +529,7 @@ mod tests {
494
529
req_processing_time : std:: time:: Duration :: from_secs ( 1 ) ,
495
530
} ,
496
531
& stats_repository,
532
+ & ban_service,
497
533
CurrentClock :: now ( ) ,
498
534
)
499
535
. await ;
@@ -506,6 +542,7 @@ mod tests {
506
542
#[ tokio:: test]
507
543
async fn should_increase_the_udp4_errors_counter_when_it_receives_a_udp4_error_event ( ) {
508
544
let stats_repository = Repository :: new ( ) ;
545
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
509
546
510
547
handle_event (
511
548
Event :: UdpError {
@@ -521,6 +558,7 @@ mod tests {
521
558
error : ErrorKind :: RequestParse ( "Invalid request format" . to_string ( ) ) ,
522
559
} ,
523
560
& stats_repository,
561
+ & ban_service,
524
562
CurrentClock :: now ( ) ,
525
563
)
526
564
. await ;
@@ -533,6 +571,7 @@ mod tests {
533
571
#[ tokio:: test]
534
572
async fn should_increase_the_udp6_connect_requests_counter_when_it_receives_a_udp6_request_event_of_connect_kind ( ) {
535
573
let stats_repository = Repository :: new ( ) ;
574
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
536
575
537
576
handle_event (
538
577
Event :: UdpRequestAccepted {
@@ -547,6 +586,7 @@ mod tests {
547
586
kind : crate :: event:: UdpRequestKind :: Connect ,
548
587
} ,
549
588
& stats_repository,
589
+ & ban_service,
550
590
CurrentClock :: now ( ) ,
551
591
)
552
592
. await ;
@@ -559,6 +599,7 @@ mod tests {
559
599
#[ tokio:: test]
560
600
async fn should_increase_the_udp6_announce_requests_counter_when_it_receives_a_udp6_request_event_of_announce_kind ( ) {
561
601
let stats_repository = Repository :: new ( ) ;
602
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
562
603
563
604
handle_event (
564
605
Event :: UdpRequestAccepted {
@@ -573,6 +614,7 @@ mod tests {
573
614
kind : crate :: event:: UdpRequestKind :: Announce ,
574
615
} ,
575
616
& stats_repository,
617
+ & ban_service,
576
618
CurrentClock :: now ( ) ,
577
619
)
578
620
. await ;
@@ -585,6 +627,7 @@ mod tests {
585
627
#[ tokio:: test]
586
628
async fn should_increase_the_udp6_scrape_requests_counter_when_it_receives_a_udp6_request_event_of_scrape_kind ( ) {
587
629
let stats_repository = Repository :: new ( ) ;
630
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
588
631
589
632
handle_event (
590
633
Event :: UdpRequestAccepted {
@@ -599,6 +642,7 @@ mod tests {
599
642
kind : crate :: event:: UdpRequestKind :: Scrape ,
600
643
} ,
601
644
& stats_repository,
645
+ & ban_service,
602
646
CurrentClock :: now ( ) ,
603
647
)
604
648
. await ;
@@ -611,6 +655,7 @@ mod tests {
611
655
#[ tokio:: test]
612
656
async fn should_increase_the_udp6_response_counter_when_it_receives_a_udp6_response_event ( ) {
613
657
let stats_repository = Repository :: new ( ) ;
658
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
614
659
615
660
handle_event (
616
661
Event :: UdpResponseSent {
@@ -628,6 +673,7 @@ mod tests {
628
673
req_processing_time : std:: time:: Duration :: from_secs ( 1 ) ,
629
674
} ,
630
675
& stats_repository,
676
+ & ban_service,
631
677
CurrentClock :: now ( ) ,
632
678
)
633
679
. await ;
@@ -639,6 +685,7 @@ mod tests {
639
685
#[ tokio:: test]
640
686
async fn should_increase_the_udp6_errors_counter_when_it_receives_a_udp6_error_event ( ) {
641
687
let stats_repository = Repository :: new ( ) ;
688
+ let ban_service = Arc :: new ( tokio:: sync:: RwLock :: new ( BanService :: new ( 1 ) ) ) ;
642
689
643
690
handle_event (
644
691
Event :: UdpError {
@@ -654,6 +701,7 @@ mod tests {
654
701
error : ErrorKind :: RequestParse ( "Invalid request format" . to_string ( ) ) ,
655
702
} ,
656
703
& stats_repository,
704
+ & ban_service,
657
705
CurrentClock :: now ( ) ,
658
706
)
659
707
. await ;
0 commit comments