Swift: Deconstruct SPF an Outline and Background
Adam.S

Adam.S @basman

About: Just a person interested in programming.

Location:
Tokyo
Joined:
Jan 3, 2020

Swift: Deconstruct SPF an Outline and Background

Publish Date: May 17 '21
1 0

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 = ""
}
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

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;
}
Enter fullscreen mode Exit fullscreen mode

Examples

Let's say we have an SPF record of the following type:

"v=spf1 a ip4:x.x.x.x ~all"
Enter fullscreen mode Exit fullscreen mode

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 => ""
}
Enter fullscreen mode Exit fullscreen mode
Ip4
struct {
  kind => MechanismKind.Ip4
  qualifier => None
  mechanism => "x.x.x.x"
}
Enter fullscreen mode Exit fullscreen mode

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?;
}
Enter fullscreen mode Exit fullscreen mode

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

Comments 0 total

    Add comment