mirror of
https://salsa.debian.org/freeipa-team/freeipa.git
synced 2025-02-25 18:55:28 -06:00
Prompt for nameserver IP address in dnszone-add
Prompt for nameserver IP address in interactive mode of dnszone-add. Add a corresponding field to dnszone creation dialog in the web UI. This parameter is required if and only if: * New zone is a forward zone * Nameserver is defined inside the new zone Add a new unit test to cover this functionality. https://fedorahosted.org/freeipa/ticket/3603
This commit is contained in:
parent
78774916c8
commit
c5bfeb1ed0
@ -299,6 +299,11 @@ return {
|
|||||||
name: 'other',
|
name: 'other',
|
||||||
fields: [
|
fields: [
|
||||||
'idnssoamname',
|
'idnssoamname',
|
||||||
|
{
|
||||||
|
name: 'ip_address',
|
||||||
|
validators: [ 'ip_address' ],
|
||||||
|
metadata: '@mc-opt:dnszone_add:ip_address'
|
||||||
|
},
|
||||||
{
|
{
|
||||||
name: 'idnssoarname',
|
name: 'idnssoarname',
|
||||||
required: false
|
required: false
|
||||||
@ -576,11 +581,64 @@ IPA.dnszone_adder_dialog = function(spec) {
|
|||||||
|
|
||||||
var that = IPA.entity_adder_dialog(spec);
|
var that = IPA.entity_adder_dialog(spec);
|
||||||
|
|
||||||
|
function ends_with(str, suffix) {
|
||||||
|
return str.indexOf(suffix, str.length - suffix.length) !== -1;
|
||||||
|
}
|
||||||
|
|
||||||
|
var init = function() {
|
||||||
|
var zone_w = that.fields.get_field('idnsname').widget;
|
||||||
|
var reverse_zone_w = that.fields.get_field('name_from_ip').widget;
|
||||||
|
var ns_w = that.fields.get_field('idnssoamname').widget;
|
||||||
|
|
||||||
|
zone_w.value_changed.attach(that.check_ns_ip);
|
||||||
|
reverse_zone_w.value_changed.attach(that.check_ns_ip);
|
||||||
|
ns_w.value_changed.attach(that.check_ns_ip);
|
||||||
|
};
|
||||||
|
|
||||||
|
that.check_ns_ip = function() {
|
||||||
|
var ip_address_f = that.fields.get_field('ip_address');
|
||||||
|
var zone_w = that.fields.get_field('idnsname').widget;
|
||||||
|
var ns_w = that.fields.get_field('idnssoamname').widget;
|
||||||
|
|
||||||
|
var zone = zone_w.save()[0] || '';
|
||||||
|
var ns = ns_w.save()[0] || '';
|
||||||
|
|
||||||
|
var zone_is_reverse = !zone_w.is_enabled() ||
|
||||||
|
ends_with(zone, '.in-addr.arpa.') ||
|
||||||
|
ends_with(zone, '.ip6.arpa.');
|
||||||
|
var relative_ns = true;
|
||||||
|
var ns_in_zone = false;
|
||||||
|
|
||||||
|
if (ns && ns[ns.length-1] === '.') {
|
||||||
|
relative_ns = false;
|
||||||
|
ns = ns.slice(0, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (zone && zone[zone.length-1] === '.') {
|
||||||
|
zone = zone.slice(0, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ns && zone && ends_with(ns, '.' + zone)) {
|
||||||
|
ns_in_zone = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!zone_is_reverse && (relative_ns || ns_in_zone)) {
|
||||||
|
ip_address_f.set_enabled(true);
|
||||||
|
ip_address_f.set_required(true);
|
||||||
|
} else {
|
||||||
|
ip_address_f.reset();
|
||||||
|
ip_address_f.set_required(false);
|
||||||
|
ip_address_f.set_enabled(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
that.create = function() {
|
that.create = function() {
|
||||||
that.entity_adder_dialog_create();
|
that.entity_adder_dialog_create();
|
||||||
that.container.addClass('dnszone-adder-dialog');
|
that.container.addClass('dnszone-adder-dialog');
|
||||||
};
|
};
|
||||||
|
|
||||||
|
init();
|
||||||
|
|
||||||
return that;
|
return that;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -303,6 +303,10 @@ IPA.text_widget = function(spec) {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
that.is_enabled = function(value) {
|
||||||
|
return !that.input.prop('disabled');
|
||||||
|
};
|
||||||
|
|
||||||
that.set_enabled = function(value) {
|
that.set_enabled = function(value) {
|
||||||
|
|
||||||
that.input.prop('disabled', !value);
|
that.input.prop('disabled', !value);
|
||||||
|
@ -7651,6 +7651,17 @@
|
|||||||
"required": true,
|
"required": true,
|
||||||
"type": "unicode"
|
"type": "unicode"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"attribute": true,
|
||||||
|
"class": "Str",
|
||||||
|
"doc": "Add forward record for nameserver located in the created zone",
|
||||||
|
"flags": [],
|
||||||
|
"label": "Nameserver IP address",
|
||||||
|
"name": "ip_address",
|
||||||
|
"noextrawhitespace": true,
|
||||||
|
"required": true,
|
||||||
|
"type": "unicode"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"attribute": true,
|
"attribute": true,
|
||||||
"class": "Str",
|
"class": "Str",
|
||||||
|
@ -1781,9 +1781,30 @@ class dnszone_add(LDAPCreate):
|
|||||||
),
|
),
|
||||||
Str('ip_address?', _validate_ipaddr,
|
Str('ip_address?', _validate_ipaddr,
|
||||||
doc=_('Add forward record for nameserver located in the created zone'),
|
doc=_('Add forward record for nameserver located in the created zone'),
|
||||||
|
label=_('Nameserver IP address'),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
def interactive_prompt_callback(self, kw):
|
||||||
|
"""
|
||||||
|
Interactive mode should prompt for nameserver IP address only if all
|
||||||
|
of the following conditions are true:
|
||||||
|
* New zone is a forward zone
|
||||||
|
* NS is defined inside the new zone (NS can be given either in the
|
||||||
|
form of absolute or relative name)
|
||||||
|
"""
|
||||||
|
if kw.get('ip_address', None):
|
||||||
|
return
|
||||||
|
|
||||||
|
zone = normalize_zone(kw['idnsname'])
|
||||||
|
ns = kw['idnssoamname']
|
||||||
|
relative_ns = not ns.endswith('.')
|
||||||
|
ns_in_zone = self.obj.get_name_in_zone(zone, ns)
|
||||||
|
|
||||||
|
if not zone_is_reverse(zone) and (relative_ns or ns_in_zone):
|
||||||
|
ip_address = self.Backend.textui.prompt(_(u'Nameserver IP address'))
|
||||||
|
kw['ip_address'] = ip_address
|
||||||
|
|
||||||
def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options):
|
def pre_callback(self, ldap, dn, entry_attrs, attrs_list, *keys, **options):
|
||||||
assert isinstance(dn, DN)
|
assert isinstance(dn, DN)
|
||||||
if not dns_container_exists(self.api.Backend.ldap2):
|
if not dns_container_exists(self.api.Backend.ldap2):
|
||||||
|
@ -258,3 +258,70 @@ class TestCLIParsing(object):
|
|||||||
version=API_VERSION)
|
version=API_VERSION)
|
||||||
finally:
|
finally:
|
||||||
self.run_command('dnszone_del', idnsname=u'test-example.com')
|
self.run_command('dnszone_del', idnsname=u'test-example.com')
|
||||||
|
|
||||||
|
def test_dnszone_add(self):
|
||||||
|
"""
|
||||||
|
Test dnszone-add with nameserver IP passed interatively
|
||||||
|
"""
|
||||||
|
# Pass IP of nameserver interactively for nameserver in zone
|
||||||
|
# (absolute name)
|
||||||
|
with self.fake_stdin('1.1.1.1\n'):
|
||||||
|
self.check_command(
|
||||||
|
'dnszone_add example.com --name-server=ns.example.com. '
|
||||||
|
'--admin-email=admin@example.com',
|
||||||
|
'dnszone_add',
|
||||||
|
idnsname=u'example.com',
|
||||||
|
idnssoamname=u'ns.example.com.',
|
||||||
|
idnssoarname=u'admin@example.com',
|
||||||
|
ip_address=u'1.1.1.1',
|
||||||
|
idnssoaexpire=util.Fuzzy(type=int),
|
||||||
|
idnssoaserial=util.Fuzzy(type=int),
|
||||||
|
idnssoaretry=util.Fuzzy(type=int),
|
||||||
|
idnssoaminimum=util.Fuzzy(type=int),
|
||||||
|
idnssoarefresh=util.Fuzzy(type=int),
|
||||||
|
all=False,
|
||||||
|
raw=False,
|
||||||
|
force=False,
|
||||||
|
version=API_VERSION
|
||||||
|
)
|
||||||
|
|
||||||
|
# Pass IP of nameserver interactively for nameserver in zone
|
||||||
|
# (relative name)
|
||||||
|
with self.fake_stdin('1.1.1.1\n'):
|
||||||
|
self.check_command(
|
||||||
|
'dnszone_add example.com --name-server=ns '
|
||||||
|
'--admin-email=admin@example.com',
|
||||||
|
'dnszone_add',
|
||||||
|
idnsname=u'example.com',
|
||||||
|
idnssoamname=u'ns',
|
||||||
|
idnssoarname=u'admin@example.com',
|
||||||
|
ip_address=u'1.1.1.1',
|
||||||
|
idnssoaexpire=util.Fuzzy(type=int),
|
||||||
|
idnssoaserial=util.Fuzzy(type=int),
|
||||||
|
idnssoaretry=util.Fuzzy(type=int),
|
||||||
|
idnssoaminimum=util.Fuzzy(type=int),
|
||||||
|
idnssoarefresh=util.Fuzzy(type=int),
|
||||||
|
all=False,
|
||||||
|
raw=False,
|
||||||
|
force=False,
|
||||||
|
version=API_VERSION
|
||||||
|
)
|
||||||
|
|
||||||
|
# Nameserver is outside the zone - no need to pass the IP
|
||||||
|
self.check_command(
|
||||||
|
'dnszone_add example.com --name-server=ns.example.net. '
|
||||||
|
'--admin-email=admin@example.com',
|
||||||
|
'dnszone_add',
|
||||||
|
idnsname=u'example.com',
|
||||||
|
idnssoamname=u'ns.example.net.',
|
||||||
|
idnssoarname=u'admin@example.com',
|
||||||
|
idnssoaexpire=util.Fuzzy(type=int),
|
||||||
|
idnssoaserial=util.Fuzzy(type=int),
|
||||||
|
idnssoaretry=util.Fuzzy(type=int),
|
||||||
|
idnssoaminimum=util.Fuzzy(type=int),
|
||||||
|
idnssoarefresh=util.Fuzzy(type=int),
|
||||||
|
all=False,
|
||||||
|
raw=False,
|
||||||
|
force=False,
|
||||||
|
version=API_VERSION
|
||||||
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user