1 <!DOCTYPE HTML PUBLIC '-//W3C//DTD HTML
4.0//EN'
>
6 For use with Tomato Firmware only.
7 No part of this file may be used without permission.
11 <meta http-equiv='content-type' content='text/html;charset=utf-
8'
>
12 <meta name='robots' content='noindex,nofollow'
>
13 <title>[<%
ident(); %>] NAS: File Sharing
</title>
14 <link rel='stylesheet' type='text/css' href='tomato.css'
>
15 <link rel='stylesheet' type='text/css' href='color.css'
>
16 <script type='text/javascript' src='tomato.js'
></script>
19 <style tyle='text/css'
>
23 #ss-grid .co1, #ss-grid .co2, #ss-grid .co3 {
33 <style type='text/css'
>
40 <script type='text/javascript' src='debug.js'
></script>
42 <script type='text/javascript'
>
44 // <% nvram("smbd_enable,smbd_user,smbd_passwd,smbd_wgroup,smbd_cpage,smbd_custom,smbd_loglevel,smbd_master,smbd_wins,smbd_shares,smbd_autoshare,wan_wins"); %>
46 function v_nodelim(e
, quiet
, name
)
48 e
.value
= e
.value
.trim().replace(/>/g
, '_');
49 if (e
.value
.indexOf('<') != -1) {
50 ferror
.set(e
, 'Invalid ' + name
, quiet
);
57 var ssg
= new TomatoGrid();
59 ssg
.exist = function(f
, v
)
61 var data
= this.getAllData();
62 for (var i
= 0; i
< data
.length
; ++i
) {
63 if (data
[i
][f
] == v
) return true;
68 ssg
.existName = function(name
)
70 return this.exist(0, name
);
73 ssg
.sortCompare = function(a
, b
) {
74 var col
= this.sortColumn
;
75 var da
= a
.getRowData();
76 var db
= b
.getRowData();
77 var r
= cmpText(da
[col
], db
[col
]);
78 return this.sortAscending
? r
: -r
;
81 ssg
.dataToView = function(data
) {
82 return [data
[0], data
[1], data
[2], ['Read Only', 'Read / Write'][data
[3]], ['No', 'Yes'][data
[4]]];
85 ssg
.fieldValuesToData = function(row
) {
86 var f
= fields
.getAll(row
);
87 return [f
[0].value
, f
[1].value
, f
[2].value
, f
[3].value
, f
[4].value
];
90 ssg
.verifyFields = function(row
, quiet
)
93 f
= fields
.getAll(row
);
95 s
= f
[0].value
.trim().replace(/\s+/g, ' ');
97 if (s
.search(/^[ a-zA-Z0-9_\-\$]+$/) == -1) {
98 ferror
.set(f
[0], 'Invalid share name. Only characters "$ A-Z 0-9 - _" and spaces are allowed.', quiet
);
101 if (this.existName(s
)) {
102 ferror
.set(f
[0], 'Duplicate share name.', quiet
);
108 ferror
.set(f
[0], 'Empty share name is not allowed.', quiet
);
112 if ((!v_nodelim(f
[1], quiet
, 'Directory')) || (!v_nodelim(f
[2], quiet
, 'Description')))
115 if (f
[1].value
.length
<= 0) {
116 ferror
.set(f
[1], 'Directory must not be empty.', quiet
);
123 ssg
.resetNewEditor = function()
127 f
= fields
.getAll(this.newEditor
);
133 f
[3].selectedIndex
= 0;
134 f
[4].selectedIndex
= 0;
137 ssg
.setup = function()
139 this.init('ss-grid', 'sort', 50, [
140 { type
: 'text', maxlen
: 32 },
141 { type
: 'text', maxlen
: 256 },
142 { type
: 'text', maxlen
: 64 },
143 { type
: 'select', options
: [[0, 'Read Only'],[1, 'Read / Write']] },
144 { type
: 'select', options
: [[0, 'No'],[1, 'Yes']] }
146 this.headerSet(['Share Name', 'Directory', 'Description', 'Access Level', 'Hidden']);
148 var s
= nvram
.smbd_shares
.split('>');
149 for (var i
= 0; i
< s
.length
; ++i
) {
150 var t
= s
[i
].split('<');
152 this.insertData(-1, t
);
157 this.showNewEditor();
158 this.resetNewEditor();
161 function verifyFields(focused
, quiet
)
165 a
= E('_smbd_enable').value
;
167 elem
.display(PR('_smbd_user'), PR('_smbd_passwd'), (a
== 2));
169 E('_smbd_wgroup').disabled
= (a
== 0);
170 E('_smbd_cpage').disabled
= (a
== 0);
171 E('_smbd_custom').disabled
= (a
== 0);
172 E('_smbd_loglevel').disabled
= (a
== 0);
173 E('_smbd_autoshare').disabled
= (a
== 0);
174 E('_f_smbd_master').disabled
= (a
== 0);
175 E('_f_smbd_wins').disabled
= (a
== 0 || (nvram
.wan_wins
!= '' && nvram
.wan_wins
!= '0.0.0.0'));
178 if (!v_range('_smbd_autoshare', quiet
, 0, 3)) return 0;
179 if (!v_range('_smbd_loglevel', quiet
, 0, 100)) return 0;
180 if (!v_length('_smbd_custom', quiet
, 0, 2048)) return 0;
181 if (!v_length('_smbd_wgroup', quiet
, 1, 20)) return 0;
187 ferror
.set(b
, 'User Name must not be empty.', quiet
);
190 if (b
.value
== 'root') {
191 ferror
.set(b
, 'User Name root is not allowed.', quiet
);
194 if (!v_length(b
, quiet
, 1, 50)) return 0;
197 b
= E('_smbd_passwd');
199 ferror
.set(b
, 'Password must not be empty.', quiet
);
202 if (!v_length(b
, quiet
, 1, 50)) return 0;
211 if (ssg
.isEditing()) return;
212 if (!verifyFields(null, 0)) return;
216 var data
= ssg
.getAllData();
218 for (var i
= 0; i
< data
.length
; ++i
) r
.push(data
[i
].join('<'));
219 fom
.smbd_shares
.value
= r
.join('>');
220 fom
.smbd_master
.value
= E('_f_smbd_master').checked
? 1 : 0;
221 if (nvram
.wan_wins
== '' || nvram
.wan_wins
== '0.0.0.0')
222 fom
.smbd_wins
.value
= E('_f_smbd_wins').checked
? 1 : 0;
224 fom
.smbd_wins
.value
= nvram
.smbd_wins
;
232 <form id='_fom' method='post' action='tomato.cgi'
>
233 <table id='container' cellspacing=
0>
234 <tr><td colspan=
2 id='header'
>
235 <div class='title'
>Tomato
</div>
236 <div class='version'
>Version <%
version(); %></div>
238 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
240 <div id='ident'
><%
ident(); %></div>
244 <input type='hidden' name='_nextpage' value='nas-samba.asp'
>
245 <input type='hidden' name='_service' value='samba-restart'
>
247 <input type='hidden' name='smbd_master'
>
248 <input type='hidden' name='smbd_wins'
>
249 <input type='hidden' name='smbd_shares'
>
251 <div class='section-title'
>Samba File Sharing
</div>
252 <div class='section'
>
253 <script type='text/javascript'
>
254 createFieldTable('', [
255 { title
: 'Enable File Sharing', name
: 'smbd_enable', type
: 'select',
256 options
: [['0', 'No'],['1', 'Yes, no Authentication'],['2', 'Yes, Authentication required']],
257 value
: nvram
.smbd_enable
},
258 { title
: 'User Name', indent
: 2, name
: 'smbd_user', type
: 'text', maxlen
: 50, size
: 32,
259 value
: nvram
.smbd_user
},
260 { title
: 'Password', indent
: 2, name
: 'smbd_passwd', type
: 'text', maxlen
: 50, size
: 32,
261 value
: nvram
.smbd_passwd
},
263 { title
: 'Workgroup Name', name
: 'smbd_wgroup', type
: 'text', maxlen
: 20, size
: 32,
264 value
: nvram
.smbd_wgroup
},
265 { title
: 'Client Codepage', name
: 'smbd_cpage', type
: 'select',
266 options
: [['', 'Unspecified'],['437', '437 (United States, Canada)'],['850', '850 (Western Europe)'],['852', '852 (Central / Eastern Europe)'],['866', '866 (Cyrillic / Russian)']
268 ,['932', '932 (Japanese)'],['936', '936 (Simplified Chinese)'],['949', '949 (Korean)'],['950', '950 (Traditional Chinese / Big5)']
271 suffix
: ' <small> (start cmd.exe and type chcp to see the current code page)</small>',
272 value
: nvram
.smbd_cpage
},
273 { title
: 'Samba<br>Custom Configuration', name
: 'smbd_custom', type
: 'textarea', value
: nvram
.smbd_custom
},
274 { title
: 'Auto-share all USB Partitions', name
: 'smbd_autoshare', type
: 'select',
275 options
: [['0', 'Disabled'],['1', 'Read Only'],['2', 'Read / Write'],['3', 'Hidden Read / Write']],
276 value
: nvram
.smbd_autoshare
},
277 { title
: 'Options', multi
: [
278 { suffix
: ' Master Browser ', name
: 'f_smbd_master', type
: 'checkbox', value
: nvram
.smbd_master
== 1 },
279 { suffix
: ' WINS Server ', name
: 'f_smbd_wins', type
: 'checkbox', value
: (nvram
.smbd_wins
== 1) && (nvram
.wan_wins
== '' || nvram
.wan_wins
== '0.0.0.0') }
282 { title
: 'Samba Log Level', name
: 'smbd_loglevel', type
: 'select',
283 options
: [['0', '0'],['1', '1'],['2', '2'],['3', '3'],['4', '4'],['5', '5'],['6', '6'],['7', '7'],['8', '8'],['9', '9'],['10', '10'],['50', '50'],['100', '100']],
284 value
: nvram
.smbd_loglevel
}
290 <div class='section-title'
>Network Shares List
</div>
291 <div class='section'
>
292 <table class='tomato-grid' cellspacing=
1 id='ss-grid'
></table>
293 <script type='text/javascript'
>ssg
.setup();</script>
295 <small>When no shares are specified,
<i>/mnt
</i> directory is shared in Read Only mode.
</small>
301 <tr><td id='footer' colspan=
2>
302 <span id='footer-msg'
></span>
303 <input type='button' value='Save' id='save-button' onclick='save()'
>
304 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'
>
308 <script type='text/javascript'
>verifyFields(null, 1);</script>