What is SPF
If you have not followed my rust series on deconstructing SPF you can check it out here.
Here is some back ground on SPF.
What is a qualifier
A qualifier changes the way that a mechanism is interpreted, they are
+
Pass-
Fail~
SoftFail?
Neutral- Neutral is the default if no qualifier is matched.
What is a mechanism
An SPF mechanism can be one of several types
- Include
- A
- Mx
- Ip4
- Ip6
- All
- Ptr
- Exists
- Redirect (Technially this is a Modifier, but I will be using it as a Mechanism)
I will be attempting to just learn some of the basics of the Swift language. So I will be looking at things like:
- enum
- struct
- Optional variables
- Perhaps more if I find that I need them.
Swift: The building blocks
Qualifiers
So I need to have a way to handle qualifiers
enum Qualifier: String {
case Pass = "+"
case Fail = "-"
case SoftFail = "~"
case Neutral = "?"
case None = ""
}
This enumeration will manage my qualifiers. I have added a None
for the moment since in many cases, there is no qualifier provided, and I think I might want to be able to reproduce the mechanism in the future.
Mechanism
To handle these I will create a second enumeration
enum MechanismKind {
case Redirect, Include, A, MX, Ip4, Ip6, All;
}
Although Redirect
is a modifier, I am listing it here as a mechanism. I am also omitting ptr
and exists
. These may or may not be handled.
A mechanism is made up of a qualifier
and some mechanism
value. It also needs to have a kind. So a struct will probably work here.
struct Mechanism {
var kind: MechanismKind;
var qualifier: Qualifier;
var mechanism: String;
}
Examples
Let’s say we have an SPF record of the following type:
"v=spf1 a ip4:x.x.x.x ~all"
We want to have a struct that will represent A
and another that represents Ip4
These are conceptual examples only.
A
struct {
kind => MechanismKind.A
qualifier => Qualifers.None
mechanism => ""
}
Ip4
struct {
kind => MechanismKind.Ip4
qualifier => None
mechanism => "x.x.x.x"
}
Seeing this I can see that there will be some good cases to make some variables Optional
SPF
This struct will probably look something like what follows.
struct SPF {
var redirect: Mechanism?;
var is_redirect: Bool = false;
var include: Mechanism?;
var a: Mechanism?;
var mx: Mechanism?;
var all: Mechanism?;
}
This is merely a rough outline. Most will need to be a list of records.
You might notice the use if the ?
at the end of Mechanism
. This denotes that the variable is optional and hence can have a nil
value. That meaning it can be absent.
I refer you to the Swift Documentation
In the next article we will start to develop some code focused on the struct for a Mechanism