Skip to content

Commit

Permalink
iSCSI Name Validation using regexes
Browse files Browse the repository at this point in the history
When adding iSCSI target disk during installation, the iSCSI Initiator name and
the Target IP is validated to enable/disable the "Start Discovery" button on the
page.  Currently, the validation of iSCSI Initiator Name is based on the
existence of dots only (".") and this can be more efficiently done by using a
regular expression.

Signed-off-by: Sujith Pandel <sujithpshankar@gmail.com>
Signed-off-by: Vratislav Podzimek <vpodzime@redhat.com>
  • Loading branch information
Sujith Pandel authored and vpodzime committed May 13, 2015
1 parent 64f4462 commit 20b78a1
Show file tree
Hide file tree
Showing 3 changed files with 102 additions and 1 deletion.
22 changes: 22 additions & 0 deletions pyanaconda/regexes.py
Expand Up @@ -135,3 +135,25 @@

# Product Version string, just the starting numbers like 21 or 21.1
VERSION_DIGITS = r'([\d.]+)'


#Regexes to validate iSCSI Names according to RFC 3720 and RFC 3721
#The conditions for iSCSI name used in the following regexes are
#(https://tools.ietf.org/html/rfc3720#section-3.2.6.3.1 , https://tools.ietf.org/html/rfc3721#page-5 and http://standards.ieee.org/regauth/oui/tutorials/EUI64.html):
#1. For iqn format:
# a. Starts with string 'iqn.'
# b. A date code specifying the year and month in which the organization
# registered the domain or sub-domain name used as the naming authority
# string. "yyyy-mm"
# c. A dot (".")
# d. The organizational naming authority string, which consists of a
# valid, reversed domain or subdomain name.
# e. Optionally, a colon (":"), followed by a string of the assigning
# organization's choosing, which must make each assigned iSCSI name
# unique. With the exception of the colon prefix, the owner of the domain
# name can assign everything after the reversed domain name as desired.
ISCSI_IQN_NAME_REGEX = re.compile(r'^iqn\.\d{4}-\d{2}((?<!-)\.(?!-)[a-zA-Z0-9\-]+){1,63}(?<!-)(?<!\.)(:[^:]+)?$')

#2. For eui format:
# a. The format is "eui." followed by an EUI-64 identifier (16 ASCII-encoded hexadecimal digits).
ISCSI_EUI_NAME_REGEX = re.compile(r'^eui\.[a-fA-F0-9]{16}$')
4 changes: 3 additions & 1 deletion pyanaconda/ui/gui/spokes/advstorage/iscsi.py
Expand Up @@ -29,6 +29,7 @@
from pyanaconda.ui.gui.utils import escape_markup
from pyanaconda.i18n import _
from pyanaconda import nm
from pyanaconda.regexes import ISCSI_IQN_NAME_REGEX, ISCSI_EUI_NAME_REGEX

__all__ = ["ISCSIDialog"]

Expand Down Expand Up @@ -303,7 +304,8 @@ def _initiator_name_valid(self):

stripped = text.strip()
#iSCSI Naming Standards: RFC 3720 and RFC 3721
return "." in stripped
#iSCSI Name validation using regex. Name should either match IQN format or EUI format.
return bool(ISCSI_IQN_NAME_REGEX.match(stripped) or ISCSI_EUI_NAME_REGEX.match(stripped))

def on_discover_field_changed(self, *args):
# Make up a credentials object so we can test if it's valid.
Expand Down
77 changes: 77 additions & 0 deletions tests/regex_tests/iscsi_name_test.py
@@ -0,0 +1,77 @@
#!/usr/bin/python
# vim:set fileencoding=utf-8
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.

# Author(s): Sujith Pandel <sujithpshankar@gmail.com>
# Ajith Pandel <ajithpandel@gmail.com>
#
import unittest

from regexcheck import regex_match
from pyanaconda.regexes import ISCSI_IQN_NAME_REGEX, ISCSI_EUI_NAME_REGEX

class iSCSIiqnnameRegexTestCase(unittest.TestCase):
def iqnname_test(self):
good_tests = [
'iqn.2014-15.com.example',
'iqn.2014-15.com.example:iscsi',
'iqn.2014-15.c-om.example:iscsi',
'iqn.2014-15.c.om.example:iscsi',
'iqn.2014-15.com.example:...',
'iqn.2014-15.com.example:iscsi_@nything_except_colon_after_colon!'
]

bad_tests = [
'iqn',
'iqn.',
'iqn.2014-15',
'iqn.2014-15.',
'iqn.2014-15..',
'iqn.2014-15.com.example.',
'iqn.2014-15.com.example...',
'iqn.2014-15.com.example:',
'iqn.2014-15.-com.example',
'iqn.2014-15.com-.example',
'iqn.2014-15.-.example',
'iqn.2014-15.com.example-:iscsi',
'abciqn.2014-15.com.example:iscsi',
'iqn.2014-15.-.example:iscsi',
'iqn.2014-15.com&com.example:iscsi',
'iqn.2014-15.com.example:iscsi:doublecolon',
'iqn.2014-15..om.example:iscsi',
]

if not regex_match(ISCSI_IQN_NAME_REGEX, good_tests, bad_tests):
self.fail()

class iSCSIeuinameRegexTestCase(unittest.TestCase):
def euiname_test(self):
good_tests = [
'eui.ABCDEF0123456789',
'eui.abcdef0123456789',
'eui.0123456789ABCDEF'
]

bad_tests = [
'eui',
'eui.',
'eui.2014-',
'eui.exampleeui789abc'
'eui.AAAABBBBCCC2345',
'eui.AAAABBBBCCCCD4567'
]

if not regex_match(ISCSI_EUI_NAME_REGEX, good_tests, bad_tests):
self.fail()

4 comments on commit 20b78a1

@SEUNICK
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

According to https://tools.ietf.org/html/rfc3720#section-3.2.6.3.1
iqn name as iqn.2001-04.com.example:storage:diskarrays-sn-a8675309 is completely valid.
But ISCSI_IQN_NAME_REGEX = re.compile(r'^iqn.\d{4}-\d{2}((?<!-).(?!-)[a-zA-Z0-9-]+){1,63}(?<!-)(?<!.)(:[^:]+)?$') identify this name invalid.

@vpodzime
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Create an issue, please, @SEUNICK

@rvykydal
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@SEUNICK
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

https://bugzilla.redhat.com/show_bug.cgi?id=1750865
This bugzila also reported by me, but no response for a long time, so I reported here.

Please sign in to comment.