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 <meta name=
"viewport" content=
"width=device-width">
14 <title>[<%
ident(); %>] NAS: File Sharing
</title>
15 <link rel='stylesheet' type='text/css' href='tomato.css'
>
16 <link rel='stylesheet' type='text/css' href='color.css'
>
17 <script type='text/javascript' src='tomato.js'
></script>
20 <style type='text/css'
>
24 #ss-grid .co1
, #ss-grid
.co2
, #ss-grid
.co3
{
34 <style type='text/css'
>
41 <script type='text/javascript' src='debug.js'
></script>
43 <script type='text/javascript'
>
45 // <% nvram("smbd_enable,smbd_user,smbd_passwd,smbd_wgroup,smbd_cpage,smbd_ifnames,smbd_custom,smbd_master,smbd_wins,smbd_shares,smbd_autoshare,wan_wins"); %>
47 var ssg
= new TomatoGrid();
49 ssg
.exist = function(f
, v
)
51 var data
= this.getAllData();
52 for (var i
= 0; i
< data
.length
; ++i
) {
53 if (data
[i
][f
] == v
) return true;
58 ssg
.existName = function(name
)
60 return this.exist(0, name
);
63 ssg
.sortCompare = function(a
, b
) {
64 var col
= this.sortColumn
;
65 var da
= a
.getRowData();
66 var db
= b
.getRowData();
67 var r
= cmpText(da
[col
], db
[col
]);
68 return this.sortAscending
? r
: -r
;
71 ssg
.dataToView = function(data
) {
72 return [data
[0], data
[1], data
[2], ['Read Only', 'Read / Write'][data
[3]], ['No', 'Yes'][data
[4]]];
75 ssg
.fieldValuesToData = function(row
) {
76 var f
= fields
.getAll(row
);
77 return [f
[0].value
, f
[1].value
, f
[2].value
, f
[3].value
, f
[4].value
];
80 ssg
.verifyFields = function(row
, quiet
)
84 f
= fields
.getAll(row
);
86 s
= f
[0].value
.trim().replace(/\s+/g, ' ');
88 if (s
.search(/^[ a-zA-Z0-9_\-\$]+$/) == -1) {
89 ferror
.set(f
[0], 'Invalid share name. Only characters "$ A-Z 0-9 - _" and spaces are allowed.', quiet
);
92 if (this.existName(s
)) {
93 ferror
.set(f
[0], 'Duplicate share name.', quiet
);
99 ferror
.set(f
[0], 'Empty share name is not allowed.', quiet
);
103 if (!v_nodelim(f
[1], quiet
, 'Directory', 1) || !v_path(f
[1], quiet
, 1)) return 0;
104 if (!v_nodelim(f
[2], quiet
, 'Description', 1)) return 0;
109 ssg
.resetNewEditor = function()
113 f
= fields
.getAll(this.newEditor
);
119 f
[3].selectedIndex
= 0;
120 f
[4].selectedIndex
= 0;
123 ssg
.setup = function()
125 this.init('ss-grid', 'sort', 50, [
126 { type
: 'text', maxlen
: 32 },
127 { type
: 'text', maxlen
: 256 },
128 { type
: 'text', maxlen
: 64 },
129 { type
: 'select', options
: [[0, 'Read Only'],[1, 'Read / Write']] },
130 { type
: 'select', options
: [[0, 'No'],[1, 'Yes']] }
132 this.headerSet(['Share Name', 'Directory', 'Description', 'Access Level', 'Hidden']);
134 var s
= nvram
.smbd_shares
.split('>');
135 for (var i
= 0; i
< s
.length
; ++i
) {
136 var t
= s
[i
].split('<');
138 this.insertData(-1, t
);
143 this.showNewEditor();
144 this.resetNewEditor();
147 function verifyFields(focused
, quiet
)
151 a
= E('_smbd_enable').value
;
153 elem
.display(PR('_smbd_user'), PR('_smbd_passwd'), (a
== 2));
155 E('_smbd_wgroup').disabled
= (a
== 0);
156 E('_smbd_cpage').disabled
= (a
== 0);
157 E('_smbd_ifnames').disabled
= (a
== 0);
158 E('_smbd_custom').disabled
= (a
== 0);
159 E('_smbd_autoshare').disabled
= (a
== 0);
160 E('_f_smbd_master').disabled
= (a
== 0);
161 E('_f_smbd_wins').disabled
= (a
== 0 || (nvram
.wan_wins
!= '' && nvram
.wan_wins
!= '0.0.0.0'));
163 if (a
!= 0 && !v_length('_smbd_ifnames', quiet
, 0, 50)) return 0;
164 if (a
!= 0 && !v_length('_smbd_custom', quiet
, 0, 2048)) return 0;
167 if (!v_length('_smbd_user', quiet
, 1)) return 0;
168 if (!v_length('_smbd_passwd', quiet
, 1)) return 0;
171 if (b
.value
== 'root') {
172 ferror
.set(b
, 'User Name \"root\" is not allowed.', quiet
);
183 if (ssg
.isEditing()) return;
184 if (!verifyFields(null, 0)) return;
188 var data
= ssg
.getAllData();
190 for (var i
= 0; i
< data
.length
; ++i
) r
.push(data
[i
].join('<'));
191 fom
.smbd_shares
.value
= r
.join('>');
192 fom
.smbd_master
.value
= E('_f_smbd_master').checked
? 1 : 0;
193 if (nvram
.wan_wins
== '' || nvram
.wan_wins
== '0.0.0.0')
194 fom
.smbd_wins
.value
= E('_f_smbd_wins').checked
? 1 : 0;
196 fom
.smbd_wins
.value
= nvram
.smbd_wins
;
204 if (((c
= cookie
.get('nas_samba_notes_vis')) != null) && (c
== '1')) {
205 toggleVisibility("notes");
209 function toggleVisibility(whichone
) {
210 if(E('sesdiv' + whichone
).style
.display
=='') {
211 E('sesdiv' + whichone
).style
.display
='none';
212 E('sesdiv' + whichone
+ 'showhide').innerHTML
='(Click here to show)';
213 cookie
.set('nas_samba_' + whichone
+ '_vis', 0);
215 E('sesdiv' + whichone
).style
.display
='';
216 E('sesdiv' + whichone
+ 'showhide').innerHTML
='(Click here to hide)';
217 cookie
.set('nas_samba_' + whichone
+ '_vis', 1);
223 <body onload='init()'
>
224 <form id='_fom' method='post' action='tomato.cgi'
>
225 <table id='container' cellspacing=
0>
226 <tr><td colspan=
2 id='header'
>
227 <div class='title'
>Tomato
</div>
228 <div class='version'
>Version <%
version(); %></div>
230 <tr id='body'
><td id='navi'
><script type='text/javascript'
>navi()</script></td>
232 <div id='ident'
><%
ident(); %></div>
236 <input type='hidden' name='_nextpage' value='nas-samba.asp'
>
237 <input type='hidden' name='_service' value='samba-restart'
>
239 <input type='hidden' name='smbd_master'
>
240 <input type='hidden' name='smbd_wins'
>
241 <input type='hidden' name='smbd_shares'
>
243 <div class='section-title'
>Samba File Sharing
</div>
244 <div class='section'
>
245 <script type='text/javascript'
>
246 createFieldTable('', [
247 { title
: 'Enable File Sharing', name
: 'smbd_enable', type
: 'select',
248 options
: [['0', 'No'],['1', 'Yes, no Authentication'],['2', 'Yes, Authentication required']],
249 value
: nvram
.smbd_enable
},
250 { title
: 'User Name', indent
: 2, name
: 'smbd_user', type
: 'text', maxlen
: 50, size
: 32,
251 value
: nvram
.smbd_user
},
252 { title
: 'Password', indent
: 2, name
: 'smbd_passwd', type
: 'password', maxlen
: 50, size
: 32, peekaboo
: 1,
253 value
: nvram
.smbd_passwd
},
255 { title
: 'Workgroup Name', name
: 'smbd_wgroup', type
: 'text', maxlen
: 20, size
: 32,
256 value
: nvram
.smbd_wgroup
},
257 { title
: 'Client Codepage', name
: 'smbd_cpage', type
: 'select',
258 options
: [['', 'Unspecified'],['437', '437 (United States, Canada)'],['850', '850 (Western Europe)'],['852', '852 (Central / Eastern Europe)'],['866', '866 (Cyrillic / Russian)']
260 ,['932', '932 (Japanese)'],['936', '936 (Simplified Chinese)'],['949', '949 (Korean)'],['950', '950 (Traditional Chinese / Big5)']
263 suffix
: ' <small> (start cmd.exe and type chcp to see the current code page)</small>',
264 value
: nvram
.smbd_cpage
},
265 { title
: 'Network Interfaces', name
: 'smbd_ifnames', type
: 'text', maxlen
: 50, size
: 32,
266 suffix
: ' <small> (space-delimited)</small>',
267 value
: nvram
.smbd_ifnames
},
268 { title
: 'Samba<br>Custom Configuration', name
: 'smbd_custom', type
: 'textarea', value
: nvram
.smbd_custom
},
269 { title
: 'Auto-share all USB Partitions', name
: 'smbd_autoshare', type
: 'select',
270 options
: [['0', 'Disabled'],['1', 'Read Only'],['2', 'Read / Write'],['3', 'Hidden Read / Write']],
271 value
: nvram
.smbd_autoshare
},
272 { title
: 'Options', multi
: [
273 { suffix
: ' Master Browser ', name
: 'f_smbd_master', type
: 'checkbox', value
: nvram
.smbd_master
== 1 },
274 { suffix
: ' WINS Server ', name
: 'f_smbd_wins', type
: 'checkbox', value
: (nvram
.smbd_wins
== 1) && (nvram
.wan_wins
== '' || nvram
.wan_wins
== '0.0.0.0') }
281 <div class='section-title'
>Additional Shares List
</div>
282 <div class='section'
>
283 <table class='tomato-grid' cellspacing=
1 id='ss-grid'
></table>
284 <script type='text/javascript'
>ssg
.setup();</script>
286 <small>When no shares are specified and auto-sharing is disabled,
<i>/mnt
</i> directory is shared in Read Only mode.
</small>
291 <div class='section-title'
>Notes
<small><i><a href='javascript:toggleVisibility(
"notes");'
><span id='sesdivnotesshowhide'
>(Click here to show)
</span></a></i></small></div>
292 <div class='section' id='sesdivnotes' style='display:none'
>
294 <li><b>Network Interfaces
</b> - Space-delimited list of router interface names Samba will bind to.
296 <li>If empty,
<i>interfaces = <%
nv("lan_ifname"); %></i> will be used instead.
</li>
297 <li>The
<i>bind interfaces only = yes
</i> directive is always set.
</li>
298 <li>Refer to the
<a href=
"https://www.samba.org/samba/docs/man/manpages-3/smb.conf.5.html">Samba documentation
</a> for details.
</li>
306 <tr><td id='footer' colspan=
2>
307 <span id='footer-msg'
></span>
308 <input type='button' value='Save' id='save-button' onclick='save()'
>
309 <input type='button' value='Cancel' id='cancel-button' onclick='javascript:reloadPage();'
>
313 <script type='text/javascript'
>verifyFields(null, 1);</script>