@@ -1054,6 +1054,9 @@ impl MimeFactory {
10541054 }
10551055 }
10561056
1057+ let use_std_header_protection = context
1058+ . get_config_bool ( Config :: StdHeaderProtectionComposing )
1059+ . await ?;
10571060 let outer_message = if let Some ( encryption_keys) = self . encryption_keys {
10581061 // Store protected headers in the inner message.
10591062 let message = protected_headers
@@ -1069,6 +1072,22 @@ impl MimeFactory {
10691072 message. header ( header, value)
10701073 } ) ;
10711074
1075+ if use_std_header_protection {
1076+ message = unprotected_headers
1077+ . iter ( )
1078+ // Structural headers shouldn't be added as "HP-Outer". They are defined in
1079+ // <https://www.rfc-editor.org/rfc/rfc9787.html#structural-header-fields>.
1080+ . filter ( |( name, _) | {
1081+ !( name. eq_ignore_ascii_case ( "mime-version" )
1082+ || name. eq_ignore_ascii_case ( "content-type" )
1083+ || name. eq_ignore_ascii_case ( "content-transfer-encoding" )
1084+ || name. eq_ignore_ascii_case ( "content-disposition" ) )
1085+ } )
1086+ . fold ( message, |message, ( name, value) | {
1087+ message. header ( format ! ( "HP-Outer: {name}" ) , value. clone ( ) )
1088+ } ) ;
1089+ }
1090+
10721091 // Add gossip headers in chats with multiple recipients
10731092 let multiple_recipients =
10741093 encryption_keys. len ( ) > 1 || context. get_config_bool ( Config :: BccSelf ) . await ?;
@@ -1158,7 +1177,13 @@ impl MimeFactory {
11581177 for ( h, v) in & mut message. headers {
11591178 if h == "Content-Type" {
11601179 if let mail_builder:: headers:: HeaderType :: ContentType ( ct) = v {
1161- * ct = ct. clone ( ) . attribute ( "protected-headers" , "v1" ) ;
1180+ let mut ct_new = ct. clone ( ) ;
1181+ ct_new = ct_new. attribute ( "protected-headers" , "v1" ) ;
1182+ if use_std_header_protection {
1183+ ct_new = ct_new. attribute ( "hp" , "cipher" ) ;
1184+ }
1185+ * ct = ct_new;
1186+ break ;
11621187 }
11631188 }
11641189 }
@@ -1244,7 +1269,13 @@ impl MimeFactory {
12441269 for ( h, v) in & mut message. headers {
12451270 if h == "Content-Type" {
12461271 if let mail_builder:: headers:: HeaderType :: ContentType ( ct) = v {
1247- * ct = ct. clone ( ) . attribute ( "protected-headers" , "v1" ) ;
1272+ let mut ct_new = ct. clone ( ) ;
1273+ ct_new = ct_new. attribute ( "protected-headers" , "v1" ) ;
1274+ if use_std_header_protection {
1275+ ct_new = ct_new. attribute ( "hp" , "clear" ) ;
1276+ }
1277+ * ct = ct_new;
1278+ break ;
12481279 }
12491280 }
12501281 }
0 commit comments