File: pyspf.1

package info (click to toggle)
pyspf 2.0.12t-3
  • links: PTS, VCS
  • area: main
  • in suites: bullseye, buster, sid, stretch
  • size: 664 kB
  • ctags: 324
  • sloc: python: 1,420; makefile: 36; sh: 18
file content (237 lines) | stat: -rw-r--r-- 7,519 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
\"
.\" Standard preamble:
.\" ========================================================================
.de Sh \" Subsection heading
.br
.if t .Sp
.ne 5
.PP
\fB\\$1\fR
.PP
..
.de Sp \" Vertical space (when we can't use .PP)
.if t .sp .5v
.if n .sp
..
.de Vb \" Begin verbatim text
.ft CW
.nf
.ne \\$1
..
.de Ve \" End verbatim text
.ft R
.fi
..
.\" Set up some character translations and predefined strings.  \*(-- will
.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left
.\" double quote, and \*(R" will give a right double quote.  \*(C+ will
.\" give a nicer C++.  Capital omega is used to do unbreakable dashes and
.\" therefore won't be available.  \*(C` and \*(C' expand to `' in nroff,
.\" nothing in troff, for use with C<>.
.tr \(*W-
.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p'
.ie n \{\
.    ds -- \(*W-
.    ds PI pi
.    if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
.    if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\"  diablo 12 pitch
.    ds L" ""
.    ds R" ""
.    ds C` ""
.    ds C' ""
'br\}
.el\{\
.    ds -- \|\(em\|
.    ds PI \(*p
.    ds L" ``
.    ds R" ''
'br\}
.\"
.\" If the F register is turned on, we'll generate index entries on stderr for
.\" titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and index
.\" entries marked with X<> in POD.  Of course, you'll have to process the
.\" output yourself in some meaningful fashion.
.if \nF \{\
.    de IX
.    tm Index:\\$1\t\\n%\t"\\$2"
..
.    nr % 0
.    rr F
.\}
.\"
.\" For nroff, turn off justification.  Always turn off hyphenation; it makes
.\" way too many mistakes in technical documents.
.hy 0
.if n .na
.\"
.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).
.\" Fear.  Run.  Save yourself.  No user-serviceable parts.
.    \" fudge factors for nroff and troff
.if n \{\
.    ds #H 0
.    ds #V .8m
.    ds #F .3m
.    ds #[ \f1
.    ds #] \fP
.\}
.if t \{\
.    ds #H ((1u-(\\\\n(.fu%2u))*.13m)
.    ds #V .6m
.    ds #F 0
.    ds #[ \&
.    ds #] \&
.\}
.    \" simple accents for nroff and troff
.if n \{\
.    ds ' \&
.    ds ` \&
.    ds ^ \&
.    ds , \&
.    ds ~ ~
.    ds /
.\}
.if t \{\
.    ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
.    ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
.    ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
.    ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
.    ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
.    ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
.    \" troff and (daisy-wheel) nroff accents
.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V'
.ds 8 \h'\*(#H'\(*b\h'-\*(#H'
.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#]
.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H'
.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u'
.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#]
.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#]
.ds ae a\h'-(\w'a'u*4/10)'e
.ds Ae A\h'-(\w'A'u*4/10)'E
.    \" corrections for vroff
.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u'
.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u'
.    \" for low resolution devices (crt and lpr)
.if \n(.H>23 .if \n(.V>19 \
\{\
.    ds : e
.    ds 8 ss
.    ds o a
.    ds d- d\h'-1'\(ga
.    ds D- D\h'-1'\(hy
.    ds th \o'bp'
.    ds Th \o'LP'
.    ds ae ae
.    ds Ae AE
.\}
.rm #[ #] #H #V #F C
.\" ========================================================================
.\"
.IX Title "python-spf 1"
.TH python-spf 1 "2012-02-05"
.SH "NAME"
pyspf \- pure-Python SPF library
.SH "VERSION"
.IX Header "VERSION"
2\.0\.9

.SH "DESCRIPTION"
.IX Header "DESCRIPTION"

SPF does email sender validation.  For more information about SPF,
please see http://www.openspf.org/

One incompatible change was introduced in version 1.7.  Prior to version 1.7,
connections from a local IP address (127...) would always return a Pass 
result.  The special case was eliminated.  Programs calling pySPF should not
do SPF checks on locally submitted mail.

This SPF client is intended to be installed on the border MTA, checking
if incoming SMTP clients are permitted to forward mail.  The SPF check
should be done during the MAIL FROM:<...> command.

.SH "USAGE"
.IX Header "USAGE"

There are multiple ways to use this package:

    To check an incoming mail request:
        % pyspf [\-v] {ip} {sender} {helo}
        % pyspf 69.55.226.139 tway@optsw.com mx1.wayforward.net

    To test an SPF record:
        % pyspf [\-v] "v=spf1..." {ip} {sender} {helo}
        % pyspf "v=spf1 +mx +ip4:10.0.0.1 \-all" 10.0.0.1 tway@foo.com a    

    To fetch an SPF record:
        % pyspf {domain}
        % pyspf wayforward.net

    To test this script (and to output this usage message):
        % pyspf

For instance, during an SMTP exchange from client 69.55.226.139::
        S: 220 mail.example.com ESMTP Postfix
        C: EHLO mx1.wayforward.net
        S: 250-mail.example.com
        S: ...
        S: 250 8BITMIME
        C: MAIL FROM:<terry@wayforward.net>

Then the following command line would check if this is a valid sender:
        % pyspf 69.55.226.139 terry@wayforward.net mx1.wayforward.net
        ('pass', 250, 'sender SPF authorized')

Command line calls return RFC 4408 result codes, i.e. 'pass', 'fail', 'neutral', 
\'softfail, 'permerror', or 'temperror'.

.SH "RFC 4408/7208 TEST SUITE"
.IX Header "RFC 4408/7208 TEST SUITE"

The package also installs the python-spf test driver and the current (as of the
release date) YAML (Yet Another Markup Language) RFC 4408/7208 test
definitions.  As errors or improvements in the test definitions are approved,
they are available from:

<http://www.openspf.net/Test_Suite>

To run the test suite, change the directory the test suite is installed in:

$ cd /usr/share/doc/python-spf

Uncompress testspf.py.gz, testspf.py.gz, and rfc4408-tests.yml.gz

and then run testspf.py:

$ python testspf.py (also works with python3)

The test suite supports multiple allowed results with a warning for a 
non-preferred result.  For the current version, the expected results are:

WARN: spfonly in rfc4408-tests.yml, 4.4/1: fail preferred to none
WARN: invalid-domain-long in rfc4408-tests.yml, ['4.3/1', '5/10/3']: permerror preferred to fail
WARN: txttimeout in rfc4408-tests.yml, 4.4/1: fail preferred to temperror
WARN: invalid-domain-empty-label in rfc4408-tests.yml, ['4.3/1', '5/10/3']: permerror preferred to fail
WARN: exists-dnserr in rfc4408-tests.yml, 5.7/3: fail preferred to temperror
WARN: spfoverride in rfc4408-tests.yml, 4.5/5: pass preferred to fail
WARN: multitxt1 in rfc4408-tests.yml, 4.5/5: pass preferred to permerror
WARN: mx-limit in rfc4408-tests.yml, 10.1/7: neutral preferred to permerror
WARN: multispf2 in rfc4408-tests.yml, 4.5/6: permerror preferred to pass
WARN: invalid-domain-long-via-macro in rfc4408-tests.yml, ['4.3/1', '5/10/3']: permerror preferred to fail

Due to the resolution of a number of ambiguities in the SPF specification in
RFC 7208, there should be no warnings for the RFC 7208 portions of the test
suite.

.SH "SEE ALSO"
.IX Header "SEE ALSO"

RFC 7208, <http://www.openspf.org>

.SH "AUTHORS"
.IX Header "AUTHORS"
This version of \fBpyspf\fR was written by Terence Way <terry-spf@wayforward.net>
and updated by Stuart Gathman <stuart@bmsi.com> and Scott Kitterman 
<scott@kitterman.com>.
.PP
This man-page was created by Scott Kitterman <scott@kitterman.com>.