1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
4 Copyright (C) 2006-2010 Jonathan Zarate
5 http://www.polarcloud.com/tomato/
7 For use with Tomato Firmware only.
8 No part of this file may be used without permission.
12 <meta http-equiv='content-type' content='text/html;charset=utf-
8'
>
13 <meta name='robots' content='noindex,nofollow'
>
14 <title>[<%
ident(); %>] Forwarding: UPnP / NAT-PMP
</title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'
>
17 <script type='text/javascript' src='tomato.js'
></script>
21 <style type='text/css'
>
22 #upnp-grid .co1
, #upnp-grid
.co2
{
36 <script type='text/javascript' src='debug.js'
></script>
38 <script type='text/javascript'
>
41 !!TB - additional miniupnp settings
43 // <% nvram("upnp_enable,upnp_mnp,upnp_clean,upnp_secure,upnp_clean_interval,upnp_clean_threshold,upnp_lan,upnp_lan1,upnp_lan2,upnp_lan3,lan_ifname,lan1_ifname,lan2_ifname,lan3_ifname,"); %>
47 nvram
.upnp_enable
= fixInt(nvram
.upnp_enable
, 0, 3, 0);
50 function submitDelete(proto
, eport
)
52 form
.submitHidden('upnp.cgi', {
55 _redirect
: 'forward-upnp.asp' });
58 function deleteData(data
)
60 if (!confirm('Delete ' + data
[3] + ' ' + data
[0] + ' -> ' + data
[2] + ':' + data
[1] + ' ?')) return;
61 submitDelete(data
[3], data
[0]);
64 var ug
= new TomatoGrid();
66 ug
.onClick = function(cell
) {
67 deleteData(cell
.parentNode
.getRowData());
70 ug
.rpDel = function(e
) {
71 deleteData(PR(e
).getRowData());
75 ug
.setup = function() {
76 this.init('upnp-grid', 'sort delete');
77 this.headerSet(['External', 'Internal', 'Internal Address', 'Protocol', 'Description']);
81 ug
.populate = function() {
82 var i
, j
, r
, row
, data
;
84 if (nvram
.upnp_enable
!= 0) {
85 var data
= mupnp_data
.split('\n');
86 for (i
= 0; i
< data
.length
; ++i
) {
87 r
= data
[i
].match(/^(UDP|TCP)\s+(\d+)\s+(.+?)\s+(\d+)\s+\[(.*)\](.*)$/);
88 if (r
== null) continue;
89 row
= this.insertData(-1, [r
[2], r
[4], r
[3], r
[1], r
[5]]);
92 for (j
= 0; j
< 5; ++j
) {
93 elem
.addClass(row
.cells
[j
], 'disabled');
96 for (j
= 0; j
< 5; ++j
) {
97 row
.cells
[j
].title
= 'Click to delete';
102 E('upnp-delete-all').disabled
= (ug
.getDataCount() == 0);
107 if (!confirm('Delete all entries?')) return;
108 submitDelete('*', '0');
111 function toggleFiltersVisibility(){
112 if(E('upnpsettings').style
.display
=='')
113 E('upnpsettings').style
.display
='none';
115 E('upnpsettings').style
.display
='';
118 function verifyFields(focused
, quiet
)
121 !!TB - additional miniupnp settings
123 var enable
= E('_f_enable_upnp').checked
|| E('_f_enable_natpmp').checked
;
124 var bc
= E('_f_upnp_clean').checked
;
126 E('_f_upnp_clean').disabled
= (enable
== 0);
127 E('_f_upnp_secure').disabled
= (enable
== 0);
128 E('_f_upnp_mnp').disabled
= (E('_f_enable_upnp').checked
== 0);
129 E('_upnp_clean_interval').disabled
= (enable
== 0) || (bc
== 0);
130 E('_upnp_clean_threshold').disabled
= (enable
== 0) || (bc
== 0);
131 elem
.display(PR(E('_upnp_clean_interval')), (enable
!= 0) && (bc
!= 0));
132 elem
.display(PR(E('_upnp_clean_threshold')), (enable
!= 0) && (bc
!= 0));
134 if ((enable
!= 0) && (bc
!= 0)) {
135 if (!v_range('_upnp_clean_interval', quiet
, 60, 65535)) return 0;
136 if (!v_range('_upnp_clean_threshold', quiet
, 0, 9999)) return 0;
139 ferror
.clear(E('_upnp_clean_interval'));
140 ferror
.clear(E('_upnp_clean_threshold'));
143 E('_f_upnp_lan').disabled
= ((nvram
.lan_ifname
.length
< 1) || (enable
== 0));
144 if (E('_f_upnp_lan').disabled
)
145 E('_f_upnp_lan').checked
= false;
146 E('_f_upnp_lan1').disabled
= ((nvram
.lan1_ifname
.length
< 1) || (enable
== 0));
147 if (E('_f_upnp_lan1').disabled
)
148 E('_f_upnp_lan1').checked
= false;
149 E('_f_upnp_lan2').disabled
= ((nvram
.lan2_ifname
.length
< 1) || (enable
== 0));
150 if (E('_f_upnp_lan2').disabled
)
151 E('_f_upnp_lan2').checked
= false;
152 E('_f_upnp_lan3').disabled
= ((nvram
.lan3_ifname
.length
< 1) || (enable
== 0));
153 if (E('_f_upnp_lan3').disabled
)
154 E('_f_upnp_lan3').checked
= false;
155 if ((enable
) && (!E('_f_upnp_lan').checked
) && (!E('_f_upnp_lan1').checked
) && (!E('_f_upnp_lan2').checked
) && (!E('_f_upnp_lan3').checked
)) {
156 if ((E('_f_enable_natpmp').checked
) || (E('_f_enable_upnp').checked
)) {
157 var m
= 'NAT-PMP or UPnP must be enabled in least one LAN bridge';
158 ferror
.set('_f_enable_natpmp', m
, quiet
);
159 ferror
.set('_f_enable_upnp', m
, 1);
160 ferror
.set('_f_upnp_lan', m
, 1);
161 ferror
.set('_f_upnp_lan1', m
, 1);
162 ferror
.set('_f_upnp_lan2', m
, 1);
163 ferror
.set('_f_upnp_lan3', m
, 1);
167 ferror
.clear('_f_enable_natpmp');
168 ferror
.clear('_f_enable_upnp');
169 ferror
.clear('_f_upnp_lan');
170 ferror
.clear('_f_upnp_lan1');
171 ferror
.clear('_f_upnp_lan2');
172 ferror
.clear('_f_upnp_lan3');
183 if (!verifyFields(null, 0)) return;
186 fom
.upnp_enable
.value
= 0;
187 if (fom
.f_enable_upnp
.checked
) fom
.upnp_enable
.value
= 1;
188 if (fom
.f_enable_natpmp
.checked
) fom
.upnp_enable
.value
|= 2;
191 !!TB - additional miniupnp settings
193 fom
.upnp_mnp
.value
= E('_f_upnp_mnp').checked
? 1 : 0;
194 fom
.upnp_clean
.value
= E('_f_upnp_clean').checked
? 1 : 0;
195 fom
.upnp_secure
.value
= E('_f_upnp_secure').checked
? 1 : 0;
198 fom
.upnp_lan
.value
= E('_f_upnp_lan').checked
? 1 : 0;
199 fom
.upnp_lan1
.value
= E('_f_upnp_lan1').checked
? 1 : 0;
200 fom
.upnp_lan2
.value
= E('_f_upnp_lan2').checked
? 1 : 0;
201 fom
.upnp_lan3
.value
= E('_f_upnp_lan3').checked
? 1 : 0;
214 function submit_complete()
221 <body onload='init()'
>
222 <form id='_fom' method='post' action='tomato.cgi'
>
223 <table id='container' cellspacing=
0>
224 <tr><td colspan=
2 id='header'
>
225 <div class='title'
>Tomato
</div>
226 <div class='version'
>Version <%
version(); %></div>
228 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
230 <div id='ident'
><%
ident(); %></div>
234 <input type='hidden' name='_nextpage' value='forward-upnp.asp'
>
235 <input type='hidden' name='_service' value='upnp-restart'
>
237 <input type='hidden' name='upnp_enable'
>
239 !!TB - additional miniupnp settings
241 <input type='hidden' name='upnp_mnp'
>
242 <input type='hidden' name='upnp_clean'
>
243 <input type='hidden' name='upnp_secure'
>
245 <input type='hidden' name='upnp_lan'
>
246 <input type='hidden' name='upnp_lan1'
>
247 <input type='hidden' name='upnp_lan2'
>
248 <input type='hidden' name='upnp_lan3'
>
251 <div class='section-title'
>Forwarded Ports
</div>
252 <div class='section'
>
253 <table id='upnp-grid' class='tomato-grid'
></table>
254 <div style='width:
100%; text-align: right'
><input type='button' value='Delete All' onclick='deleteAll()' id='upnp-delete-all'
> <input type='button' value='Refresh' onclick='javascript:reloadPage();'
></div>
257 <div class='section-title'
>Settings
<small><i><a href='javascript:toggleFiltersVisibility();'
>(Toggle Visibility)
</a></i></small></div>
258 <div class='section' id='upnpsettings' style='display:none'
>
259 <script type='text/javascript'
>
260 createFieldTable('', [
261 { title
: 'Enable UPnP', name
: 'f_enable_upnp', type
: 'checkbox', value
: (nvram
.upnp_enable
& 1) },
262 { title
: 'Enable NAT-PMP', name
: 'f_enable_natpmp', type
: 'checkbox', value
: (nvram
.upnp_enable
& 2) },
264 !!TB - additional miniupnp settings
266 { title
: 'Inactive Rules Cleaning', name
: 'f_upnp_clean', type
: 'checkbox', value
: (nvram
.upnp_clean
== '1') },
267 { title
: 'Cleaning Interval', indent
: 2, name
: 'upnp_clean_interval', type
: 'text', maxlen
: 5, size
: 7,
268 suffix
: ' <small>seconds</small>', value
: nvram
.upnp_clean_interval
},
269 { title
: 'Cleaning Threshold', indent
: 2, name
: 'upnp_clean_threshold', type
: 'text', maxlen
: 4, size
: 7,
270 suffix
: ' <small>redirections</small>', value
: nvram
.upnp_clean_threshold
},
271 { title
: 'Secure Mode', name
: 'f_upnp_secure', type
: 'checkbox',
272 suffix
: ' <small>(when enabled, UPnP clients are allowed to add mappings only to their IP)</small>',
273 value
: (nvram
.upnp_secure
== '1') },
275 { title
: 'Listen on' },
276 { title
: 'LAN', indent
: 2, name
: 'f_upnp_lan', type
: 'checkbox', value
: (nvram
.upnp_lan
== '1') },
277 { title
: 'LAN1', indent
: 2, name
: 'f_upnp_lan1', type
: 'checkbox', value
: (nvram
.upnp_lan1
== '1') },
278 { title
: 'LAN2', indent
: 2, name
: 'f_upnp_lan2', type
: 'checkbox', value
: (nvram
.upnp_lan2
== '1') },
279 { title
: 'LAN3', indent
: 2, name
: 'f_upnp_lan3', type
: 'checkbox', value
: (nvram
.upnp_lan3
== '1') },
281 { title
: 'Show In My Network Places', name
: 'f_upnp_mnp', type
: 'checkbox', value
: (nvram
.upnp_mnp
== '1')}
290 <tr><td id='footer' colspan=
2>
291 <span id='footer-msg'
></span>
292 <input type='button' value='Save' id='save-button' onclick='save()'
>
293 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'
>
298 !!TB - added verifyFields
300 <script type='text/javascript'
>ug
.setup();verifyFields(null, 1);</script>