We want to be able to select the default for Socket differently in the
future.
This change augments the API for dkimpy_milter.util.own_socketfile()
by adding an optional sockname argument. This is a
backward-compatible change. If we aren't committed to API stability
for this function, we could make a more invasive change that would
probably be a more reasonable API going forward, but this is probably
good enough.
This covers conversion of the whole project to python3, *except* for
the strings/bytes distinction in __init__.py, which i'm leaving for a
second commit.
The changes in this commit are intended to be relatively
uncontroversial, so that the following commit contains the tricky
bits.
This test makes use of DNSOverride and the new verifying milter to
ensure that signatures can be verified properly.
It doesn't test the actual interaction with the public DNS, but
getting that kind of test to work on arbitrary platforms might be more
trouble than it's worth.
I note that the DNSOverride only works as long as testkey.dns is a
single line, which is fine for ed25519, but maybe not for RSA.
If a string-based configuation entry had whitespace in it, it would be
reassembled via a round-trip through the python interpreter, resulting
in a line like this:
PidFile /home/dkimpy-milter/pid file
produces a string like "['/home/dkimpy-milter/pid', 'file']", which is
clearly wrong.
I don't want to encourage people to use paths or other strings with
whitespace in them, but if we're going to fail on them we should be
failing explicitly, not doing a weird transformation that will just
break.
This is concretely useful for the DNSOverride mechanism, which is
where i ran into the problem when trying to set up testing that could
work without setting up an emulated DNS system.
Without this fix, a verifying dkimpy-milter that has no explicit
AuthservID produces the following crashing behavior as it tries to
create the authres header:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/Milter/__init__.py", line 772, in <lambda>
milter.set_eom_callback(lambda ctx: ctx.getpriv().eom())
File "…/dkimpy_milter/__init__.py", line 199, in eom
h = fold(str(h))
File "/usr/lib/python2.7/dist-packages/authres/core.py", line 476, in __str__
return ''.join((self.HEADER_FIELD_NAME, ': ', self.header_value()))
File "/usr/lib/python2.7/dist-packages/authres/core.py", line 496, in header_value
return ''.join(strs)
Changing ownership of sockets that doesn't exist isn't a great
practice.
A better approach would be to apply os.chown() to the file descriptor
of the open socket, but at the very least dkimpy-milter shouldn't
crash the way it currently does if the socket isn't already present.
Without this patch, this simple script for miltertest:
----
conn = mt.connect("unix:milter.sock")
if conn == nil then
error "mt.connect() failed"
end
if mt.conninfo(conn, nil, "unspec") ~= nil then
error "mt.conninfo() failed"
end
if mt.getreply(conn) ~= SMFIR_CONTINUE then
error "mt.conninfo() unexpected reply"
end
mt.disconnect(conn)
----
Produces the following error:
Traceback (most recent call last):
File "/usr/lib/python2.7/dist-packages/Milter/__init__.py", line 702, in connect_callback
return m.connect(hostname,family,hostaddr)
File "/usr/lib/python2.7/dist-packages/Milter/__init__.py", line 173, in wrapper
rc = func(self,*args)
File "/home/dkg/src/dkimpy-milter/dkimpy-milter/dkimpy_milter/__init__.py", line 64, in connect
self.receiver = self.getsymval('j').strip()
AttributeError: 'NoneType' object has no attribute 'strip'