From bc22e1dece7080c8b680b4722d210c7a21c5f1ba Mon Sep 17 00:00:00 2001 From: Andrey Yatskov Date: Tue, 19 Sep 2017 19:08:35 +0300 Subject: [PATCH] ADMINUI-2339 Should not allow user to enter an IPv4 address for DNS when Subnet is IPv6 --- package.json | 3 ++- www/js/views/network-form.js | 27 +++++++++++++++++++++++++++ 2 files changed, 29 insertions(+), 1 deletion(-) diff --git a/package.json b/package.json index 85c9bc5c..183322d9 100644 --- a/package.json +++ b/package.json @@ -24,6 +24,7 @@ "clone": "0.1.19", "filed": "0.1.0", "handlebars": "1.2.1", + "ipaddr.js": "1.5.2", "kang": "1.1.0", "less": "1.7.5", "mime": "1.2.11", @@ -34,10 +35,10 @@ "reactify": "1.0.0", "restify": "4.3.1", "sdc-clients": "10.2.1", - "ufds": "1.3.0", "superagent": "0.21.0", "through": "2.3.4", "trace-event": "1.3.0", + "ufds": "1.3.0", "uglify-js": "2.4.16", "underscore": "1.8.3", "underscore.string": "3.0.3", diff --git a/www/js/views/network-form.js b/www/js/views/network-form.js index b1618f8f..b3182c48 100644 --- a/www/js/views/network-form.js +++ b/www/js/views/network-form.js @@ -14,6 +14,7 @@ require('backbone.syphon'); var _ = require('underscore'); var $ = require('jquery'); +var ipaddr = require('ipaddr.js'); var adminui = require('../adminui'); var Template = require('../tpl/networks-form.hbs'); @@ -198,6 +199,32 @@ var View = Backbone.Marionette.Layout.extend({ var params = {}; var network = this.model.toJSON(); + var subnetType; + try { + subnetType = data.subnet && ipaddr.parse(data.subnet.substr(0, data.subnet.indexOf('/'))).kind(); + } catch (ex) { + // ignore + } + if (!subnetType) { + this.showError([{field: 'subnet', message: 'Subnet must be in CIDR form'}]); + return; + } + var resolversError = data.resolvers.some(function (resolver) { + var addrType; + try { + addrType = ipaddr.parse(resolver).kind(); + } catch (ex) { + // ignore + } + + return !addrType || subnetType !== addrType; + }); + + if (resolversError) { + this.showError([{field: 'resolvers', message: 'resolvers should match subnet type'}]); + return; + } + if (this.model.isNew()) { this.model.set(data); this.model.save().done(self.onSaved.bind(self)).fail(self.onError.bind(self));