diff --git a/src/www/services_router_advertisements.php b/src/www/services_router_advertisements.php index 4bc96775d..a435005b3 100644 --- a/src/www/services_router_advertisements.php +++ b/src/www/services_router_advertisements.php @@ -1,411 +1,380 @@ . - Copyright (C) 2010 Seth Mos . - All rights reserved. + Copyright (C) 2014-2016 Deciso B.V. + Copyright (C) 2003-2004 Manuel Kasper . + Copyright (C) 2010 Seth Mos . + All rights reserved. - Redistribution and use in source and binary forms, with or without - modification, are permitted provided that the following conditions are met: + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions are met: - 1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. + 1. Redistributions of source code must retain the above copyright notice, + this list of conditions and the following disclaimer. - 2. Redistributions in binary form must reproduce the above copyright - notice, this list of conditions and the following disclaimer in the - documentation and/or other materials provided with the distribution. + 2. Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. - THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, - INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY - AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE - AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, - OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF - SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS - INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN - CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) - ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE - POSSIBILITY OF SUCH DAMAGE. + THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY + AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, + OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF + SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS + INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN + CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE + POSSIBILITY OF SUCH DAMAGE. */ require_once("guiconfig.inc"); require_once("services.inc"); require_once("interfaces.inc"); -$if = $_GET['if']; -if ($_POST['if']) - $if = $_POST['if']; +if ($_SERVER['REQUEST_METHOD'] === 'GET') { + if (!empty($_GET['if']) && !empty($config['interfaces'][$_GET['if']])) { + $if = $_GET['if']; + } else { + $savemsg = "

" . gettext("The DHCPv6 Server can only be enabled on interfaces configured with static IP addresses") . ".

" . + "

" . gettext("Only interfaces configured with a static IP will be shown") . ".

"; + foreach ($config['interfaces'] as $if_id => $intf) { + if (!empty($intf['enable']) && is_ipaddrv6($intf['ipaddrv6']) && !is_linklocal($oc['ipaddrv6'])) { + $if = $if_id; + break; + } + } + } + $pconfig = array(); + $config_copy_fieldsnames = array('ramode', 'rapriority', 'rainterface', 'radomainsearchlist', 'subnets'); + foreach ($config_copy_fieldsnames as $fieldname) { + if (isset($config['dhcpdv6'][$if][$fieldname])) { + $pconfig[$fieldname] = $config['dhcpdv6'][$if][$fieldname]; + } else { + $pconfig[$fieldname] = null; + } + } + // boolean + $pconfig['rasamednsasdhcp6'] = isset($config['dhcpdv6'][$if]['rasamednsasdhcp6']); + // arrays + $pconfig['radns1'] = !empty($config['dhcpdv6'][$if]['radnsserver'][0]) ? $config['dhcpdv6'][$if]['radnsserver'] : null; + $pconfig['radns2'] = !empty($config['dhcpdv6'][$if]['radnsserver'][1]) ? $config['dhcpdv6'][$if]['radnsserver'] : null; +} elseif ($_SERVER['REQUEST_METHOD'] === 'POST') { + if (!empty($_POST['if']) && !empty($config['interfaces'][$_POST['if']])) { + $if = $_POST['if']; + } + $input_errors = array(); + $pconfig = $_POST; + /* input validation */ -if (!$_GET['if']) - $savemsg = "

" . gettext("The DHCPv6 Server can only be enabled on interfaces configured with static IP addresses") . ".

" . - "

" . gettext("Only interfaces configured with a static IP will be shown") . ".

"; + // validate and copy subnets + $pconfig['subnets'] = array("item" => array()); + foreach ($pconfig['subnet_address'] as $ids => $address) { + if (!empty($address)) { + if (is_alias($address)) { + $pconfig['subnets']['item'][] = $address; + } else { + $pconfig['subnets']['item'][] = $address . "/" . $pconfig['subnet_bits'][$idx]; + if (!is_ipaddrv6($address)) { + $input_errors[] = sprintf(gettext("An invalid subnet or alias was specified. [%s/%s]"), $address, $bits); + } + } + } + } -$iflist = get_configured_interface_with_descr(); + if ((!empty($pconfig['radns1']) && !is_ipaddrv6($pconfig['radns1'])) || ($pconfig['radns2'] && !is_ipaddrv6($pconfig['radns2']))) { + $input_errors[] = gettext("A valid IPv6 address must be specified for the primary/secondary DNS servers."); + } + if (!empty($pconfig['radomainsearchlist'])) { + $domain_array=preg_split("/[ ;]+/",$pconfig['radomainsearchlist']); + foreach ($domain_array as $curdomain) { + if (!is_domain($curdomain)) { + $input_errors[] = gettext("A valid domain search list must be specified."); + break; + } + } + } -/* set the starting interface */ -if (!$if || !isset($iflist[$if])) { - foreach ($iflist as $ifent => $ifname) { - $oc = $config['interfaces'][$ifent]; - if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) || - (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) - continue; - $if = $ifent; - break; - } + if (count($input_errors) == 0) { + if (!is_array($config['dhcpdv6'][$if])) { + $config['dhcpdv6'][$if] = array(); + } + + + $config['dhcpdv6'][$if]['ramode'] = $pconfig['ramode']; + $config['dhcpdv6'][$if]['rapriority'] = $pconfig['rapriority']; + $config['dhcpdv6'][$if]['rainterface'] = $pconfig['rainterface']; + + $config['dhcpdv6'][$if]['radomainsearchlist'] = $pconfig['radomainsearchlist']; + $config['dhcpdv6'][$if]['radnsserver'] = array(); + if (!empty($pconfig['radns1'])) { + $config['dhcpdv6'][$if]['radnsserver'][] = $pconfig['radns1']; + } + if ($pconfig['radns2']) { + $config['dhcpdv6'][$if]['radnsserver'][] = $pconfig['radns2']; + } + $config['dhcpdv6'][$if]['rasamednsasdhcp6'] = !empty($pconfig['rasamednsasdhcp6']); + + if (count($pconfig['subnets']['item'])) { + $config['dhcpdv6'][$if]['subnets'] = $pconfig['subnets']; + } else { + $config['dhcpdv6'][$if]['subnets'] = array(); + } + + write_config(); + services_radvd_configure(); + get_std_save_message(); + header("Location: services_router_advertisements.php?if={$if}"); + exit; + } } -if (is_array($config['dhcpdv6'][$if])) { - /* RA specific */ - $pconfig['ramode'] = $config['dhcpdv6'][$if]['ramode']; - $pconfig['rapriority'] = $config['dhcpdv6'][$if]['rapriority']; - if($pconfig['rapriority'] == "") - $pconfig['rapriority'] = "medium"; - $pconfig['rainterface'] = $config['dhcpdv6'][$if]['rainterface']; - $pconfig['radomainsearchlist'] = $config['dhcpdv6'][$if]['radomainsearchlist']; - list($pconfig['radns1'],$pconfig['radns2']) = $config['dhcpdv6'][$if]['radnsserver']; - $pconfig['rasamednsasdhcp6'] = isset($config['dhcpdv6'][$if]['rasamednsasdhcp6']); - - $pconfig['subnets'] = $config['dhcpdv6'][$if]['subnets']['item']; -} -if (!is_array($pconfig['subnets'])) - $pconfig['subnets'] = array(); - -$advertise_modes = array("disabled" => "Disabled", - "router" => "Router Only", - "unmanaged" => "Unmanaged", - "managed" => "Managed", - "assist" => "Assisted"); -$priority_modes = array("low" => "Low", - "medium" => "Normal", - "high" => "High"); -$carplist = get_configured_carp_interface_list(); - -$subnets_help = gettext("Subnets are specified in CIDR format. " . - "Select the CIDR mask that pertains to each entry. " . - "/128 specifies a single IPv6 host; /64 specifies a normal IPv6 network; etc. " . - "If no subnets are specified here, the Router Advertisement (RA) Daemon will advertise to the subnet to which the router's interface is assigned."); - -if ($_POST) { - unset($input_errors); - - $pconfig = $_POST; - - /* input validation */ - - $pconfig['subnets'] = array(); - for ($x = 0; $x < 5000; $x += 1) { - $address = trim($_POST['subnet_address' . $x]); - if ($address === "") - continue; - - $bits = trim($_POST['subnet_bits' . $x]); - if ($bits === "") - $bits = "128"; - - if (is_alias($address)) { - $pconfig['subnets'][] = $address; - } else { - $pconfig['subnets'][] = $address . "/" . $bits; - if (!is_ipaddrv6($address)) - $input_errors[] = sprintf(gettext("An invalid subnet or alias was specified. [%s/%s]"), $address, $bits); - } - } - - if (($_POST['radns1'] && !is_ipaddrv6($_POST['radns1'])) || ($_POST['radns2'] && !is_ipaddrv6($_POST['radns2']))) - $input_errors[] = gettext("A valid IPv6 address must be specified for the primary/secondary DNS servers."); - if ($_POST['radomainsearchlist']) { - $domain_array=preg_split("/[ ;]+/",$_POST['radomainsearchlist']); - foreach ($domain_array as $curdomain) { - if (!is_domain($curdomain)) { - $input_errors[] = gettext("A valid domain search list must be specified."); - break; - } - } - } - - if (!$input_errors) { - if (!is_array($config['dhcpdv6'][$if])) - $config['dhcpdv6'][$if] = array(); - - $config['dhcpdv6'][$if]['ramode'] = $_POST['ramode']; - $config['dhcpdv6'][$if]['rapriority'] = $_POST['rapriority']; - $config['dhcpdv6'][$if]['rainterface'] = $_POST['rainterface']; - - $config['dhcpdv6'][$if]['radomainsearchlist'] = $_POST['radomainsearchlist']; - unset($config['dhcpdv6'][$if]['radnsserver']); - if ($_POST['radns1']) - $config['dhcpdv6'][$if]['radnsserver'][] = $_POST['radns1']; - if ($_POST['radns2']) - $config['dhcpdv6'][$if]['radnsserver'][] = $_POST['radns2']; - - $config['dhcpdv6'][$if]['rasamednsasdhcp6'] = ($_POST['rasamednsasdhcp6']) ? true : false; - - if (count($pconfig['subnets'])) { - $config['dhcpdv6'][$if]['subnets']['item'] = $pconfig['subnets']; - } else { - unset($config['dhcpdv6'][$if]['subnets']); - } - - write_config(); - $retval = services_radvd_configure(); - $savemsg = get_std_save_message(); - } -} +legacy_html_escape_form_data($pconfig); include("head.inc"); - ?> - - - -
-
-
+
+
+
+ 0) print_input_errors($input_errors); ?> + +
+ $intf) { + if (!empty($intf['enable']) && is_ipaddrv6($intf['ipaddrv6'])) { + $ifname = !empty($intf['descr']) ? htmlspecialchars($intf['descr']) : strtoupper($if_id); + if ($if_id == $if) { + $tab_array_main[] = array($ifname, true, "services_dhcpv6.php?if={$if_id}"); + } else { + $tab_array_main[] = array($ifname, false, "services_dhcpv6.php?if={$if_id}"); + } + } + } - 0) print_input_errors($input_errors); ?> - - -
- - $ifname) { - $oc = $config['interfaces'][$ifent]; - if ((is_array($config['dhcpdv6'][$ifent]) && !isset($config['dhcpdv6'][$ifent]['enable']) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6'])))) || - (!is_array($config['dhcpdv6'][$ifent]) && !(is_ipaddrv6($oc['ipaddrv6']) && (!is_linklocal($oc['ipaddrv6']))))) - continue; - if ($ifent == $if) - $active = true; - else - $active = false; - $tab_array[] = array($ifname, $active, "services_dhcpv6.php?if={$ifent}"); - $tabscounter++; - } - if ($tabscounter == 0) { - echo ""; - include("foot.inc"); - echo ""; - echo ""; - exit; - } - display_top_tabs($tab_array); - ?> - -
-
-
- - - - - - - - - - 0) { - foreach($carplist as $ifname => $vip) { - if((preg_match("/^{$if}_/", $ifname)) && (is_ipaddrv6($vip))) - $carplistif[$ifname] = $vip; - } - } - if(count($carplistif) > 0) { - ?> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
- - - -
-
- -
-
- -
-
- - - - - - - - - - - -
- - - - - "> -
- -
- " > -
-
 
DNS
-
-
- -
-
- -
  - /> - -
  - - " /> -
-
-
-
-
-
-
-
- - - + $tab_array = array(); + $tab_array[] = array(gettext("DHCPv6 Server"), false, "services_dhcpv6.php?if={$if}"); + $tab_array[] = array(gettext("Router Advertisements"), true, "services_router_advertisements.php?if={$if}"); + display_top_tabs($tab_array_main); + display_top_tabs($tab_array); + ?> +
+
+ + + +
+ + + + + + + + + + 0) { + foreach($carplist as $ifname => $vip) { + if((preg_match("/^{$if}_/", $ifname)) && (is_ipaddrv6($vip))) + $carplistif[$ifname] = $vip; + } + } + if (count($carplistif) > 0):?> + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+ + +
+ + +
+ + + + + + + + + + array("")); + } + foreach($pconfig['subnets']['item'] as $item): + $parts = explode('/', $item); + if (count($parts) > 1) { + $sn_bits = $parts[1]; + } else { + $sn_bits = null; + } + $sn_address = $parts[0]; + ?> + + + + + + + + + + + + +
+
+
+ + + +
+
+
+ +
+
+ + +
+ + +
  + /> + +
  + + " /> +
+
+ +
+
+
+ + + - -