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 verifyFields(focused
, quiet
)
114 !!TB - additional miniupnp settings
116 var enable
= E('_f_enable_upnp').checked
|| E('_f_enable_natpmp').checked
;
117 var bc
= E('_f_upnp_clean').checked
;
119 E('_f_upnp_clean').disabled
= (enable
== 0);
120 E('_f_upnp_secure').disabled
= (enable
== 0);
121 E('_f_upnp_mnp').disabled
= (E('_f_enable_upnp').checked
== 0);
122 E('_upnp_clean_interval').disabled
= (enable
== 0) || (bc
== 0);
123 E('_upnp_clean_threshold').disabled
= (enable
== 0) || (bc
== 0);
124 elem
.display(PR(E('_upnp_clean_interval')), (enable
!= 0) && (bc
!= 0));
125 elem
.display(PR(E('_upnp_clean_threshold')), (enable
!= 0) && (bc
!= 0));
127 if ((enable
!= 0) && (bc
!= 0)) {
128 if (!v_range('_upnp_clean_interval', quiet
, 60, 65535)) return 0;
129 if (!v_range('_upnp_clean_threshold', quiet
, 0, 9999)) return 0;
132 ferror
.clear(E('_upnp_clean_interval'));
133 ferror
.clear(E('_upnp_clean_threshold'));
136 E('_f_upnp_lan').disabled
= ((nvram
.lan_ifname
.length
< 1) || (enable
== 0));
137 if (E('_f_upnp_lan').disabled
)
138 E('_f_upnp_lan').checked
= false;
139 E('_f_upnp_lan1').disabled
= ((nvram
.lan1_ifname
.length
< 1) || (enable
== 0));
140 if (E('_f_upnp_lan1').disabled
)
141 E('_f_upnp_lan1').checked
= false;
142 E('_f_upnp_lan2').disabled
= ((nvram
.lan2_ifname
.length
< 1) || (enable
== 0));
143 if (E('_f_upnp_lan2').disabled
)
144 E('_f_upnp_lan2').checked
= false;
145 E('_f_upnp_lan3').disabled
= ((nvram
.lan3_ifname
.length
< 1) || (enable
== 0));
146 if (E('_f_upnp_lan3').disabled
)
147 E('_f_upnp_lan3').checked
= false;
148 if ((enable
) && (!E('_f_upnp_lan').checked
) && (!E('_f_upnp_lan1').checked
) && (!E('_f_upnp_lan2').checked
) && (!E('_f_upnp_lan3').checked
)) {
149 if ((E('_f_enable_natpmp').checked
) || (E('_f_enable_upnp').checked
)) {
150 var m
= 'NAT-PMP or UPnP must be enabled in least one LAN bridge';
151 ferror
.set('_f_enable_natpmp', m
, quiet
);
152 ferror
.set('_f_enable_upnp', m
, 1);
153 ferror
.set('_f_upnp_lan', m
, 1);
154 ferror
.set('_f_upnp_lan1', m
, 1);
155 ferror
.set('_f_upnp_lan2', m
, 1);
156 ferror
.set('_f_upnp_lan3', m
, 1);
160 ferror
.clear('_f_enable_natpmp');
161 ferror
.clear('_f_enable_upnp');
162 ferror
.clear('_f_upnp_lan');
163 ferror
.clear('_f_upnp_lan1');
164 ferror
.clear('_f_upnp_lan2');
165 ferror
.clear('_f_upnp_lan3');
175 if (!verifyFields(null, 0)) return;
178 fom
.upnp_enable
.value
= 0;
179 if (fom
.f_enable_upnp
.checked
) fom
.upnp_enable
.value
= 1;
180 if (fom
.f_enable_natpmp
.checked
) fom
.upnp_enable
.value
|= 2;
183 !!TB - additional miniupnp settings
185 fom
.upnp_mnp
.value
= E('_f_upnp_mnp').checked
? 1 : 0;
186 fom
.upnp_clean
.value
= E('_f_upnp_clean').checked
? 1 : 0;
187 fom
.upnp_secure
.value
= E('_f_upnp_secure').checked
? 1 : 0;
189 fom
.upnp_lan
.value
= E('_f_upnp_lan').checked
? 1 : 0;
190 fom
.upnp_lan1
.value
= E('_f_upnp_lan1').checked
? 1 : 0;
191 fom
.upnp_lan2
.value
= E('_f_upnp_lan2').checked
? 1 : 0;
192 fom
.upnp_lan3
.value
= E('_f_upnp_lan3').checked
? 1 : 0;
204 function submit_complete()
211 <body onload='init()'
>
212 <form id='_fom' method='post' action='tomato.cgi'
>
213 <table id='container' cellspacing=
0>
214 <tr><td colspan=
2 id='header'
>
215 <div class='title'
>Tomato
</div>
216 <div class='version'
>Version <%
version(); %></div>
218 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
220 <div id='ident'
><%
ident(); %></div>
224 <input type='hidden' name='_nextpage' value='forward-upnp.asp'
>
225 <input type='hidden' name='_service' value='upnp-restart'
>
227 <input type='hidden' name='upnp_enable'
>
229 !!TB - additional miniupnp settings
231 <input type='hidden' name='upnp_mnp'
>
232 <input type='hidden' name='upnp_clean'
>
233 <input type='hidden' name='upnp_secure'
>
234 <input type='hidden' name='upnp_lan'
>
235 <input type='hidden' name='upnp_lan1'
>
236 <input type='hidden' name='upnp_lan2'
>
237 <input type='hidden' name='upnp_lan3'
>
239 <div class='section-title'
>Forwarded Ports
</div>
240 <div class='section'
>
241 <table id='upnp-grid' class='tomato-grid'
></table>
242 <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>
245 <div class='section-title'
>Settings
</div>
246 <div class='section'
>
247 <script type='text/javascript'
>
248 createFieldTable('', [
249 { title
: 'Enable UPnP', name
: 'f_enable_upnp', type
: 'checkbox', value
: (nvram
.upnp_enable
& 1) },
250 { title
: 'Enable NAT-PMP', name
: 'f_enable_natpmp', type
: 'checkbox', value
: (nvram
.upnp_enable
& 2) },
252 !!TB - additional miniupnp settings
254 { title
: 'Inactive Rules Cleaning', name
: 'f_upnp_clean', type
: 'checkbox', value
: (nvram
.upnp_clean
== '1') },
255 { title
: 'Cleaning Interval', indent
: 2, name
: 'upnp_clean_interval', type
: 'text', maxlen
: 5, size
: 7,
256 suffix
: ' <small>seconds</small>', value
: nvram
.upnp_clean_interval
},
257 { title
: 'Cleaning Threshold', indent
: 2, name
: 'upnp_clean_threshold', type
: 'text', maxlen
: 4, size
: 7,
258 suffix
: ' <small>redirections</small>', value
: nvram
.upnp_clean_threshold
},
259 { title
: 'Secure Mode', name
: 'f_upnp_secure', type
: 'checkbox',
260 suffix
: ' <small>(when enabled, UPnP clients are allowed to add mappings only to their IP)</small>',
261 value
: (nvram
.upnp_secure
== '1') },
262 { title
: 'Listen on' },
263 { title
: 'LAN', indent
: 2, name
: 'f_upnp_lan', type
: 'checkbox', value
: (nvram
.upnp_lan
== '1') },
264 { title
: 'LAN1', indent
: 2, name
: 'f_upnp_lan1', type
: 'checkbox', value
: (nvram
.upnp_lan1
== '1') },
265 { title
: 'LAN2', indent
: 2, name
: 'f_upnp_lan2', type
: 'checkbox', value
: (nvram
.upnp_lan2
== '1') },
266 { title
: 'LAN3', indent
: 2, name
: 'f_upnp_lan3', type
: 'checkbox', value
: (nvram
.upnp_lan3
== '1') },
267 { title
: 'Show In My Network Places', name
: 'f_upnp_mnp', type
: 'checkbox', value
: (nvram
.upnp_mnp
== '1')}
276 <tr><td id='footer' colspan=
2>
277 <span id='footer-msg'
></span>
278 <input type='button' value='Save' id='save-button' onclick='save()'
>
279 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'
>
284 !!TB - added verifyFields
286 <script type='text/javascript'
>ug
.setup();verifyFields(null, 1);</script>