Files
designate/designate/objects/rrdata_spf.py
T
Dmitry Galkin 02ef0350af Check TXT/SPF records for RFC1035 sec. 5.1
If record data has empty spaces it should be surrounded by double quotes.
This patch will raise an error during validation if record has whitespaces,
empty spaces, tabs, etc., but not wrapped in " " (double quotes).

Corresponding RFC part:

<character-string> is expressed in one or two ways: as a contiguous set
of characters without interior spaces, or as a string beginning with a "
and ending with a ".  Inside a " delimited string any character can
occur, except for a " itself, which must be quoted using \ (back slash).

Closes-Bug: 1755788
Depends-On: https://review.openstack.org/#/c/617809/
Change-Id: I159d0732688ddf1337ab3602a84a43fd043dcaa2
2019-03-25 15:02:26 +01:00

67 lines
2.2 KiB
Python

# Copyright (c) 2014 Rackspace Hosting
# All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License"); you may
# not use this file except in compliance with the License. You may obtain
# a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
# License for the specific language governing permissions and limitations
# under the License.
from designate.objects.record import Record
from designate.objects.record import RecordList
from designate.objects import base
from designate.objects import fields
from designate.exceptions import InvalidObject
@base.DesignateRegistry.register
class SPF(Record):
"""
SPF Resource Record Type
Defined in: RFC4408
"""
fields = {
'txt_data': fields.StringFields()
}
def _to_string(self):
return self.txt_data
def _from_string(self, value):
if (not value.startswith('"') and not value.endswith('"')):
# value with spaces should be quoted as per RFC1035 5.1
for element in value:
if element.isspace():
err = ("Empty spaces are not allowed in SPF record, "
"unless wrapped in double quotes.")
raise InvalidObject(err)
else:
# quotes within value should be escaped with backslash
strip_value = value.strip('"')
for index, char in enumerate(strip_value):
if char == '"':
if strip_value[index - 1] != "\\":
err = ("Quotation marks should be escaped with "
"backslash.")
raise InvalidObject(err)
self.txt_data = value
# The record type is defined in the RFC. This will be used when the record
# is sent by mini-dns.
RECORD_TYPE = 99
@base.DesignateRegistry.register
class SPFList(RecordList):
LIST_ITEM_TYPE = SPF
fields = {
'objects': fields.ListOfObjectsField('SPF'),
}