Aller au contenu principal

7. Macros (Macros)

7. Macros (Macros)

Lors de l'évaluation des enregistrements de politique SPF, certaines séquences de caractères sont destinées à être remplacées par des paramètres du message ou de la connexion. Ces séquences de caractères sont appelées "macros".

7.1 Formal Specification (Spécification formelle)

La description ABNF des macros est la suivante:

domain-spec = macro-string domain-end
domain-end = ( "." toplabel [ "." ] ) / macro-expand

explain-string = *( macro-string / SP )

macro-string = *( macro-expand / macro-literal )
macro-literal = %x21-24 / %x26-7E
; visible characters except "%"

macro-expand = ( "%\{" macro-letter transformers *delimiter "}" )
/ "%%" / "%_" / "%-"

macro-letter = "s" / "l" / "o" / "d" / "i" / "p" / "h" /
"c" / "r" / "t" / "v"

transformers = *DIGIT [ "r" ]
delimiter = "." / "-" / "+" / "," / "/" / "_" / "="

toplabel = ( *alphanum ALPHA *alphanum ) /
( 1*alphanum "-" *( alphanum / "-" ) alphanum )
; LDH rule plus additional TLD restrictions
; (see [RFC5890], Section 2.3.1)

alphanum = ALPHA / DIGIT

ALPHA = %x41-5A / %x61-7A ; A-Z / a-z
DIGIT = %x30-39 ; 0-9

7.2 Macro Definitions (Définitions des macros)

Les lettres de macro disponibles et leurs significations sont les suivantes:

  • s = <sender>
  • l = local-part de <sender>
  • o = domain de <sender>
  • d = <domain>
  • i = <ip>
  • p = le nom de domaine validé de <ip>
  • v = la chaîne in-addr.arpa pour les requêtes PTR, "in-addr" pour ip4, "ip6" pour ip6
  • h = domaine HELO/EHLO

7.3 Macro Processing Details (Détails du traitement des macros)

Cette section détaille le processus d'expansion des macros.

La chaîne macro en cours d'expansion est décomposée en fragments qui commencent soit par le caractère "%", soit qui sont constitués de tous les autres caractères. Les fragments qui commencent par "%" sont appelés "expansions de macro". Tous les autres fragments sont appelés "littéraux de macro".

Chaque expansion de macro est remplacée (étendue) pour produire la chaîne résultat. Les étiquettes de nom DNS dans cette chaîne résultat sont séparées par des caractères ".", et chaque étiquette doit être constituée de la règle LDH (Lettre-Chiffre-Trait d'union): elle doit être entièrement composée de lettres ASCII minuscules, de chiffres ASCII et/ou de traits d'union. Les littéraux de macro sont repris tels quels dans le résultat. Aucun caractère n'est inséré entre les expansions de macro et les littéraux de macro.

Outre l'expansion, aucun échappement ou autre post-traitement n'est effectué sur la chaîne résultat; elle est utilisée telle quelle. Notez que cela signifie que les caractères ASCII NUL ne sont pas nécessaires et qu'aucun mécanisme n'est fourni pour produire de tels caractères dans la chaîne résultat.

Les lettres de macro sont étendues à leurs valeurs définies, comme décrit dans la Section 7.2, avec les transformations suivantes. La syntaxe de transformation est définie par le composant transformers.

r transformer:

La lettre "r" indique que la valeur doit être inversée avant l'expansion. Pour les adresses IPv6 et les noms de domaine, l'inversion est effectuée au niveau des délimiteurs de point. Pour les adresses IPv4, l'inversion est effectuée au niveau des limites de point.

DIGIT transformer:

Un ou plusieurs chiffres indiquent combien de parties séparées par des points doivent être extraites de la fin de la valeur. Si des chiffres sont présents, cela indique le nombre d'étiquettes à utiliser, à partir de la droite (valeur la plus significative).

Si aucun chiffre n'est spécifié, toutes les étiquettes sont utilisées. Le chiffre zéro indique qu'une chaîne vide doit être utilisée. La chaîne est tronquée après l'application des transformateurs.

Delimiters:

Un ou plusieurs délimiteurs indiquent quels caractères doivent être remplacés par le délimiteur "." après l'application d'autres transformateurs. Notez que les délimiteurs ne font pas naturellement partie de la valeur; ils sont appliqués lors de l'expansion de la macro. Voici les délimiteurs et leurs expansions:

  • %\{s} = <sender>
  • %\{o} = partie domaine de <sender>
  • %\{d} = <domain>
  • %\{d4} = les quatre dernières étiquettes de <domain>
  • %\{d4r} = les quatre dernières étiquettes de <domain>, inversées
  • %\{l} = local-part de <sender>
  • %\{l-} = local-part, "." remplacé par "-"
  • %\{lr} = local-part, inversé
  • %\{lr-} = local-part, inversé, "." remplacé par "-"
  • %\{l1r-} = la première partie de local-part, inversée, "." remplacé par "-"

7.4 Expansion Examples (Exemples d'expansion)

Voici quelques exemples d'expansion de macros. Supposons:

<sender> = [email protected]
<domain> = email.example.com
<ip> = 192.0.2.3

Exemples d'expansion de macros:

MacroRésultat d'expansion
%\{s}[email protected]
%\{o}email.example.com
%\{d}email.example.com
%\{d4}email.example.com
%\{d3}email.example.com
%\{d2}example.com
%\{d1}com
%\{dr}com.example.email
%\{d2r}example.email
%\{l}strong-bad
%\{l-}strong-bad
%\{lr}strong-bad
%\{lr-}strong-bad
%\{l1r-}strong-bad
%\{ir}.%\{v}._spf.%\{d2}3.2.0.192.in-addr._spf.example.com
%\{lr-}.lp._spf.%\{d2}strong-bad.lp._spf.example.com
%\{lr-}.lp.%\{ir}.%\{v}._spf.%\{d2}strong-bad.lp.3.2.0.192.in-addr._spf.example.com
%\{ir}.%\{v}.%\{l1r-}.lp._spf.%\{d2}3.2.0.192.in-addr.strong-bad.lp._spf.example.com
%\{d2}.trusted-domains.example.netexample.com.trusted-domains.example.net