02ef0350af
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
67 lines
2.2 KiB
Python
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'),
|
|
}
|