@@ -72,6 +72,7 @@ pub struct Layer<
7272 fmt_event : E ,
7373 fmt_span : format:: FmtSpanConfig ,
7474 is_ansi : bool ,
75+ ansi_sanitization : bool ,
7576 log_internal_errors : bool ,
7677 _inner : PhantomData < fn ( S ) > ,
7778}
@@ -122,6 +123,7 @@ where
122123 fmt_span : self . fmt_span ,
123124 make_writer : self . make_writer ,
124125 is_ansi : self . is_ansi ,
126+ ansi_sanitization : self . ansi_sanitization ,
125127 log_internal_errors : self . log_internal_errors ,
126128 _inner : self . _inner ,
127129 }
@@ -152,6 +154,7 @@ where
152154 fmt_span : self . fmt_span ,
153155 make_writer : self . make_writer ,
154156 is_ansi : self . is_ansi ,
157+ ansi_sanitization : self . ansi_sanitization ,
155158 log_internal_errors : self . log_internal_errors ,
156159 _inner : self . _inner ,
157160 }
@@ -185,6 +188,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
185188 fmt_event : self . fmt_event ,
186189 fmt_span : self . fmt_span ,
187190 is_ansi : self . is_ansi ,
191+ ansi_sanitization : self . ansi_sanitization ,
188192 log_internal_errors : self . log_internal_errors ,
189193 make_writer,
190194 _inner : self . _inner ,
@@ -290,6 +294,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
290294 fmt_event : self . fmt_event ,
291295 fmt_span : self . fmt_span ,
292296 is_ansi : self . is_ansi ,
297+ ansi_sanitization : self . ansi_sanitization ,
293298 log_internal_errors : self . log_internal_errors ,
294299 make_writer : TestWriter :: default ( ) ,
295300 _inner : self . _inner ,
@@ -340,6 +345,19 @@ impl<S, N, E, W> Layer<S, N, E, W> {
340345 }
341346 }
342347
348+ /// Sets whether ANSI control character sanitization is enabled.
349+ ///
350+ /// This defaults to `true` as a protective measure against terminal
351+ /// injection attacks. If this is set to `false`, ANSI sanitization is
352+ /// disabled and trusted ANSI control sequences in logged values are passed
353+ /// through unchanged.
354+ pub fn with_ansi_sanitization ( self , ansi_sanitization : bool ) -> Self {
355+ Self {
356+ ansi_sanitization,
357+ ..self
358+ }
359+ }
360+
343361 /// Sets whether to write errors from [`FormatEvent`] to the writer.
344362 /// Defaults to true.
345363 ///
@@ -386,6 +404,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
386404 fmt_event : self . fmt_event ,
387405 fmt_span : self . fmt_span ,
388406 is_ansi : self . is_ansi ,
407+ ansi_sanitization : self . ansi_sanitization ,
389408 log_internal_errors : self . log_internal_errors ,
390409 make_writer : f ( self . make_writer ) ,
391410 _inner : self . _inner ,
@@ -418,6 +437,7 @@ where
418437 fmt_span : self . fmt_span ,
419438 make_writer : self . make_writer ,
420439 is_ansi : self . is_ansi ,
440+ ansi_sanitization : self . ansi_sanitization ,
421441 log_internal_errors : self . log_internal_errors ,
422442 _inner : self . _inner ,
423443 }
@@ -431,6 +451,7 @@ where
431451 fmt_span : self . fmt_span . without_time ( ) ,
432452 make_writer : self . make_writer ,
433453 is_ansi : self . is_ansi ,
454+ ansi_sanitization : self . ansi_sanitization ,
434455 log_internal_errors : self . log_internal_errors ,
435456 _inner : self . _inner ,
436457 }
@@ -560,6 +581,7 @@ where
560581 fmt_span : self . fmt_span ,
561582 make_writer : self . make_writer ,
562583 is_ansi : self . is_ansi ,
584+ ansi_sanitization : self . ansi_sanitization ,
563585 log_internal_errors : self . log_internal_errors ,
564586 _inner : self . _inner ,
565587 }
@@ -575,6 +597,7 @@ where
575597 fmt_span : self . fmt_span ,
576598 make_writer : self . make_writer ,
577599 is_ansi : self . is_ansi ,
600+ ansi_sanitization : self . ansi_sanitization ,
578601 log_internal_errors : self . log_internal_errors ,
579602 _inner : self . _inner ,
580603 }
@@ -606,6 +629,7 @@ where
606629 make_writer : self . make_writer ,
607630 // always disable ANSI escapes in JSON mode!
608631 is_ansi : false ,
632+ ansi_sanitization : self . ansi_sanitization ,
609633 log_internal_errors : self . log_internal_errors ,
610634 _inner : self . _inner ,
611635 }
@@ -673,6 +697,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
673697 fmt_span : self . fmt_span ,
674698 make_writer : self . make_writer ,
675699 is_ansi : self . is_ansi ,
700+ ansi_sanitization : self . ansi_sanitization ,
676701 log_internal_errors : self . log_internal_errors ,
677702 _inner : self . _inner ,
678703 }
@@ -704,6 +729,7 @@ impl<S, N, E, W> Layer<S, N, E, W> {
704729 fmt_span : self . fmt_span ,
705730 make_writer : self . make_writer ,
706731 is_ansi : self . is_ansi ,
732+ ansi_sanitization : self . ansi_sanitization ,
707733 log_internal_errors : self . log_internal_errors ,
708734 _inner : self . _inner ,
709735 }
@@ -722,6 +748,7 @@ impl<S> Default for Layer<S> {
722748 fmt_span : format:: FmtSpanConfig :: default ( ) ,
723749 make_writer : io:: stdout,
724750 is_ansi : ansi,
751+ ansi_sanitization : true ,
725752 log_internal_errors : false ,
726753 _inner : PhantomData ,
727754 }
@@ -754,20 +781,32 @@ where
754781/// without conflicting.
755782///
756783/// [extensions]: crate::registry::Extensions
757- #[ derive( Default ) ]
758784pub struct FormattedFields < E : ?Sized > {
759785 _format_fields : PhantomData < fn ( E ) > ,
760786 was_ansi : bool ,
787+ was_ansi_sanitized : bool ,
761788 /// The formatted fields of a span.
762789 pub fields : String ,
763790}
764791
792+ impl < E : ?Sized > Default for FormattedFields < E > {
793+ fn default ( ) -> Self {
794+ Self {
795+ _format_fields : Default :: default ( ) ,
796+ was_ansi : Default :: default ( ) ,
797+ was_ansi_sanitized : true ,
798+ fields : Default :: default ( ) ,
799+ }
800+ }
801+ }
802+
765803impl < E : ?Sized > FormattedFields < E > {
766804 /// Returns a new `FormattedFields`.
767805 pub fn new ( fields : String ) -> Self {
768806 Self {
769807 fields,
770808 was_ansi : false ,
809+ was_ansi_sanitized : true ,
771810 _format_fields : PhantomData ,
772811 }
773812 }
@@ -777,7 +816,9 @@ impl<E: ?Sized> FormattedFields<E> {
777816 /// The returned [`format::Writer`] can be used with the
778817 /// [`FormatFields::format_fields`] method.
779818 pub fn as_writer ( & mut self ) -> format:: Writer < ' _ > {
780- format:: Writer :: new ( & mut self . fields ) . with_ansi ( self . was_ansi )
819+ format:: Writer :: new ( & mut self . fields )
820+ . with_ansi ( self . was_ansi )
821+ . with_ansi_sanitization ( self . was_ansi_sanitized )
781822 }
782823}
783824
@@ -787,6 +828,7 @@ impl<E: ?Sized> fmt::Debug for FormattedFields<E> {
787828 . field ( "fields" , & self . fields )
788829 . field ( "formatter" , & format_args ! ( "{}" , std:: any:: type_name:: <E >( ) ) )
789830 . field ( "was_ansi" , & self . was_ansi )
831+ . field ( "was_ansi_sanitized" , & self . was_ansi_sanitized )
790832 . finish ( )
791833 }
792834}
@@ -835,12 +877,13 @@ where
835877
836878 if extensions. get_mut :: < FormattedFields < N > > ( ) . is_none ( ) {
837879 let mut fields = FormattedFields :: < N > :: new ( String :: new ( ) ) ;
880+ fields. was_ansi = self . is_ansi ;
881+ fields. was_ansi_sanitized = self . ansi_sanitization ;
838882 if self
839883 . fmt_fields
840- . format_fields ( fields. as_writer ( ) . with_ansi ( self . is_ansi ) , attrs)
884+ . format_fields ( fields. as_writer ( ) , attrs)
841885 . is_ok ( )
842886 {
843- fields. was_ansi = self . is_ansi ;
844887 extensions. insert ( fields) ;
845888 } else {
846889 eprintln ! (
@@ -875,12 +918,13 @@ where
875918 }
876919
877920 let mut fields = FormattedFields :: < N > :: new ( String :: new ( ) ) ;
921+ fields. was_ansi = self . is_ansi ;
922+ fields. was_ansi_sanitized = self . ansi_sanitization ;
878923 if self
879924 . fmt_fields
880- . format_fields ( fields. as_writer ( ) . with_ansi ( self . is_ansi ) , values)
925+ . format_fields ( fields. as_writer ( ) , values)
881926 . is_ok ( )
882927 {
883- fields. was_ansi = self . is_ansi ;
884928 extensions. insert ( fields) ;
885929 }
886930 }
@@ -995,7 +1039,9 @@ where
9951039 . fmt_event
9961040 . format_event (
9971041 & ctx,
998- format:: Writer :: new ( & mut buf) . with_ansi ( self . is_ansi ) ,
1042+ format:: Writer :: new ( & mut buf)
1043+ . with_ansi ( self . is_ansi )
1044+ . with_ansi_sanitization ( self . ansi_sanitization ) ,
9991045 event,
10001046 )
10011047 . is_ok ( )
0 commit comments