diff options
author | jim-p <jimp@pfsense.org> | 2013-08-12 12:33:46 -0400 |
---|---|---|
committer | jim-p <jimp@pfsense.org> | 2013-08-12 12:33:46 -0400 |
commit | afa76eff3d145d089e11b93d95a06d27f3249efa (patch) | |
tree | 62377a026d77c6381e05dd6561463396e7a0a457 | |
parent | a2dc7392fc3e3a2cbb6584dfcab8e02d26598000 (diff) | |
download | pfsense-afa76eff3d145d089e11b93d95a06d27f3249efa.zip pfsense-afa76eff3d145d089e11b93d95a06d27f3249efa.tar.gz |
Fix interface selections on UPnP to show the customized descriptions entered by the user. While here, add an external interface selection knob. Fixes #3141
-rw-r--r-- | etc/inc/pkg-utils.inc | 15 | ||||
-rw-r--r-- | usr/local/pkg/miniupnpd.inc | 22 | ||||
-rw-r--r-- | usr/local/pkg/miniupnpd.xml | 19 |
3 files changed, 52 insertions, 4 deletions
diff --git a/etc/inc/pkg-utils.inc b/etc/inc/pkg-utils.inc index 431d675..bf99a64 100644 --- a/etc/inc/pkg-utils.inc +++ b/etc/inc/pkg-utils.inc @@ -1348,4 +1348,19 @@ function stop_packages() { } } +function get_pkg_interfaces_select_source($include_localhost=false) { + $interfaces = get_configured_interface_with_descr(); + $ssifs = array(); + foreach ($interfaces as $iface => $ifacename) { + $tmp["name"] = $ifacename; + $tmp["value"] = $iface; + $ssifs[] = $tmp; + } + if ($include_localhost) { + $tmp["name"] = "Localhost"; + $tmp["value"] = "lo0"; + $ssifs[] = $tmp; + } + return $ssifs; +} ?>
\ No newline at end of file diff --git a/usr/local/pkg/miniupnpd.inc b/usr/local/pkg/miniupnpd.inc index 92c0ab0..a7ebfb6 100644 --- a/usr/local/pkg/miniupnpd.inc +++ b/usr/local/pkg/miniupnpd.inc @@ -80,9 +80,12 @@ if($post['enable'] && (!$post['enable_upnp'] && !$post['enable_natpmp'])) $input_errors[] = 'At least one of \'UPnP\' or \'NAT-PMP\' must be allowed'; if($post['iface_array']) - foreach($post['iface_array'] as $iface) + foreach($post['iface_array'] as $iface) { if($iface == 'wan') $input_errors[] = 'It is a security risk to specify WAN in the \'Interface\' field'; + elseif ($iface == $post['ext_iface']) + $input_errors[] = 'You cannot select the external interface as an internal interface.'; + } if($post['overridewanip'] && !upnp_validate_ip($post['overridewanip'],false)) $input_errors[] = 'You must specify a valid ip address in the \'Override WAN address\' field'; if(($post['download'] && !$post['upload']) || ($post['upload'] && !$post['download'])) @@ -124,7 +127,19 @@ $upnp_config = $config['installedpackages']['miniupnpd']['config'][0]; $config_file = '/var/etc/miniupnpd.conf'; - $config_text = "ext_ifname=".get_real_interface()."\n"; + if (!isset($upnp_config['ext_iface']) || empty($upnp_config['ext_iface'])) + $ext_ifname = get_real_interface(); + else { + $if = convert_friendly_interface_to_real_interface_name($upnp_config['ext_iface']); + if ($if != $upnp_config['ext_iface']) + $ext_ifname = $if; + else { + $ext_ifname = get_real_interface(); + upnp_warn("Could not resolve real interface for {$upnp_config['ext_iface']}, defaulting to WAN"); + } + } + + $config_text = "ext_ifname={$ext_ifname}\n"; $config_text .= "port=2189\n"; $ifaces_active = ''; @@ -134,6 +149,9 @@ $iface_array = explode(',', $upnp_config['iface_array']); foreach($iface_array as $iface) { + /* Setting the same internal and external interface is not allowed. */ + if ($iface == $upnp_config['ext_iface']) + continue; $if = convert_friendly_interface_to_real_interface_name($iface); /* above function returns iface if fail */ if($if!=$iface) { diff --git a/usr/local/pkg/miniupnpd.xml b/usr/local/pkg/miniupnpd.xml index 03bdddf..a5d9fa4 100644 --- a/usr/local/pkg/miniupnpd.xml +++ b/usr/local/pkg/miniupnpd.xml @@ -56,12 +56,27 @@ <description>This protocol is often used by Apple-compatible systems.</description> </field> <field> + <fielddescr>External Interface (generally WAN)</fielddescr> + <fieldname>ext_iface</fieldname> + <default_value>wan</default_value> + <size>3</size> + <type>select_source</type> + <source><![CDATA[get_pkg_interfaces_select_source(false)]]></source> + <source_name>name</source_name> + <source_value>value</source_value> + <description>Select only your primary WAN interface (interface with your default route). Only one interface is allowed here, not multiple.</description> + <required/> + </field> + <field> <fielddescr>Interfaces (generally LAN)</fielddescr> <fieldname>iface_array</fieldname> - <value>lan</value> + <default_value>lan</default_value> <multiple>true</multiple> <size>3</size> - <type>interfaces_selection</type> + <type>select_source</type> + <source><![CDATA[get_pkg_interfaces_select_source(true)]]></source> + <source_name>name</source_name> + <source_value>value</source_value> <description>You can use the CTRL or COMMAND key to select multiple interfaces.</description> <required/> </field> |