Add syntax checking of proposed firewall rules
[hcoop/portal.git] / sec.mlt
CommitLineData
dfb0d0d7
AC
1<% val you = Init.getUserId ();
2val yourname = Init.getUserName ();
3
3d2ed222
AC
4val nodeNum = case $"node" of
5 "" => 2
6 | node => Web.stoi node;
7val nodeName = Init.nodeName nodeNum;
8
dfb0d0d7
AC
9val uname = case $"uname" of
10 "" => yourname
11 | uname => uname;
12
3d2ed222
AC
13val socks = Sec.socketPerms {node = nodeNum, uname = uname};
14val tpe = Sec.isTpe {node = nodeNum, uname = uname};
15val cron = Sec.cronAllowed {node = nodeNum, uname = uname};
16val ftp = Sec.ftpAllowed {node = nodeNum, uname = uname};
dfb0d0d7
AC
17
18ref showNormal = true;
19
20@header [("title", ["Security settings"])];
21
22if $"cmd" = "socks" then
23 showNormal := false;
24 val socks = $"socks";
3d2ed222
AC
25 %>Are you sure you want to request that socket permissions for <b><% Web.html uname %></b> on <b><% Web.html nodeName %></b> be changed to <b><% Web.html socks %></b>?<br>
26 <a href="sec?cmd=socks2&node=<% nodeNum %>&uname=<% Web.urlEncode uname %>&socks=<% Web.urlEncode socks %>&msg=<% Web.urlEncode ($"msg") %>">Yes, place the request!</a><%
dfb0d0d7 27elseif $"cmd" = "socks2" then
3d2ed222 28 val id = Sec.Req.add {usr = you, node = nodeNum, data = String.concat [uname, ": change socket permissions to ", $"socks"], msg = $"msg"};
dfb0d0d7 29 if not (Sec.Req.notifyNew id) then
b6dd1aaf 30 %><h3>Error sending e-mail notification</h3><%
dfb0d0d7 31 end
b6dd1aaf 32 %><h3>Request added</h3><%
dfb0d0d7
AC
33
34elseif $"cmd" = "tpe" then
35 showNormal := false;
36 val tpe = iff $"tpe" = "yes" then "on" else "off";
3d2ed222
AC
37 %>Are you sure you want to request that trusted-path-executables-only for <b><% Web.html uname %></b> on <b><% Web.html nodeName %></b> be turned <b><% tpe %></b>?<br>
38 <a href="sec?cmd=tpe2&node=<% nodeNum %>&uname=<% Web.urlEncode uname %>&tpe=<% tpe %>&msg=<% Web.urlEncode ($"msg") %>">Yes, place the request!</a><%
dfb0d0d7 39elseif $"cmd" = "tpe2" then
3d2ed222 40 val id = Sec.Req.add {usr = you, node = nodeNum, data = String.concat [uname, ": turn tpe ", $"tpe"], msg = $"msg"};
dfb0d0d7 41 if not (Sec.Req.notifyNew id) then
b6dd1aaf 42 %><h3>Error sending e-mail notification</h3><%
dfb0d0d7 43 end
b6dd1aaf 44 %><h3>Request added</h3><%
dfb0d0d7 45
e510b9bd
AC
46elseif $"cmd" = "cron" then
47 showNormal := false;
48 val cron = iff $"cron" = "yes" then "enabled" else "disabled";
3d2ed222
AC
49 %>Are you sure you want to request that <tt>cron</tt> permissions for <b><% Web.html uname %></b> on <b><% Web.html nodeName %></b> be <b><% cron %></b>?<br>
50 <a href="sec?cmd=cron2&node=<% nodeNum %>&uname=<% Web.urlEncode uname %>&cron=<% cron %>&msg=<% Web.urlEncode ($"msg") %>">Yes, place the request!</a><%
e510b9bd
AC
51elseif $"cmd" = "cron2" then
52 val cron = iff $"cron" = "enabled" then "enable" else "disable";
3d2ed222 53 val id = Sec.Req.add {usr = you, node = nodeNum, data = String.concat [uname, ": ", cron, " cron access"], msg = $"msg"};
e510b9bd 54 if not (Sec.Req.notifyNew id) then
b6dd1aaf 55 %><h3>Error sending e-mail notification</h3><%
e510b9bd 56 end
b6dd1aaf 57 %><h3>Request added</h3><%
e510b9bd 58
f432bce2
AC
59elseif $"cmd" = "ftp" then
60 showNormal := false;
61 val ftp = iff $"ftp" = "yes" then "enabled" else "disabled";
3d2ed222
AC
62 %>Are you sure you want to request that FTP permissions for <b><% Web.html uname %></b> on <b><% Web.html nodeName %></b> be <b><% ftp %></b>?<br>
63 <a href="sec?cmd=ftp2&node=<% nodeNum %>&uname=<% Web.urlEncode uname %>&ftp=<% ftp %>&msg=<% Web.urlEncode ($"msg") %>">Yes, place the request!</a><%
f432bce2
AC
64elseif $"cmd" = "ftp2" then
65 val ftp = iff $"ftp" = "enabled" then "enable" else "disable";
3d2ed222 66 val id = Sec.Req.add {usr = you, node = nodeNum, data = String.concat [uname, ": ", ftp, " FTP access"], msg = $"msg"};
f432bce2 67 if not (Sec.Req.notifyNew id) then
b6dd1aaf 68 %><h3>Error sending e-mail notification</h3><%
f432bce2 69 end
b6dd1aaf 70 %><h3>Request added</h3><%
f432bce2 71
e510b9bd
AC
72elseif $"cmd" = "rule" then
73 showNormal := false;
74 val rule = $"rule";
308f44e7
AC
75
76 if Sec.validRule rule then
77 %>Are you sure you want to request the firewall rule <b><% Web.html uname %>&nbsp;<% Web.html rule %></b> on <b><% Web.html nodeName %></b>?<br>
3d2ed222 78 <a href="sec?cmd=rule2&node=<% nodeNum %>&uname=<% Web.urlEncode uname %>&rule=<% Web.urlEncode rule %>&msg=<% Web.urlEncode ($"msg") %>">Yes, place the request!</a><%
308f44e7
AC
79 else
80 %>"<% Web.html rule %>" is not a valid firewall rule! Please reread <a href="http://wiki.hcoop.net/wiki/FirewallRules">the instructions</a>, and remember to leave off the initial username portion.<%
81 end
82
e510b9bd 83elseif $"cmd" = "rule2" then
308f44e7
AC
84 val rule = $"rule";
85
86 if Sec.validRule rule then
87 val id = Sec.Req.add {usr = you, node = nodeNum, data = String.concat ["Add firewall rule \"", uname, " ", rule, "\""], msg = $"msg"};
88 if not (Sec.Req.notifyNew id) then
89 %><h3>Error sending e-mail notification</h3><%
90 end
91 %><h3>Request added</h3><%
92 else
93 %>"<% Web.html rule %>" is not a valid firewall rule! Please reread <a href="http://wiki.hcoop.net/wiki/FirewallRules">the instructions</a>, and remember to leave off the initial username portion.<%
e510b9bd 94 end
e510b9bd
AC
95
96elseif $"modRule" <> "" then
97 showNormal := false;
98 val oldRule = $"modRule";
99 val rule = $"rule"
100 if oldRule = rule then
101 %>You didn't modify the textbox for this rule before clicking the button, so there is no request to be made.<%
102 else
3d2ed222
AC
103 %>Are you sure you want to request that firewall rule <b><% Web.html uname %>&nbsp;<% Web.html oldRule %></b> be replaced by <b><% Web.html uname %>&nbsp;<% Web.html rule %></b> on <b><% Web.html nodeName %></b>?<br>
104 <a href="sec?node=<% nodeNum %>&uname=<% Web.urlEncode uname %>&modRule2=<% Web.urlEncode oldRule %>&rule=<% Web.urlEncode rule %>&msg=<% Web.urlEncode ($"msg") %>">Yes, place the request!</a><%
e510b9bd
AC
105 end
106elseif $"modRule2" <> "" then
3d2ed222 107 val id = Sec.Req.add {usr = you, node = nodeNum, data = String.concat ["Change firewall rule \"", uname, " ", $"modRule2", "\" to \"", uname, " ", $"rule", "\""], msg = $"msg"};
e510b9bd 108 if not (Sec.Req.notifyNew id) then
b6dd1aaf 109 %><h3>Error sending e-mail notification</h3><%
e510b9bd 110 end
b6dd1aaf 111 %><h3>Request added</h3><%
e510b9bd
AC
112
113elseif $"delRule" <> "" then
114 showNormal := false;
115 val oldRule = $"delRule";
3d2ed222
AC
116 %>Are you sure you want to request that firewall rule <b><% Web.html uname %>&nbsp;<% Web.html oldRule %></b> on <b><% Web.html nodeName %></b> be <b>deleted</bD>?<br>
117 <a href="sec?node=<% nodeNum %>&uname=<% Web.urlEncode uname %>&delRule2=<% Web.urlEncode oldRule %>&msg=<% Web.urlEncode ($"msg") %>">Yes, place the request!</a><%
e510b9bd 118elseif $"delRule2" <> "" then
3d2ed222 119 val id = Sec.Req.add {usr = you, node = nodeNum, data = String.concat ["Delete firewall rule \"", uname, " ", $"delRule2", "\""], msg = $"msg"};
e510b9bd 120 if not (Sec.Req.notifyNew id) then
b6dd1aaf 121 %><h3>Error sending e-mail notification</h3><%
e510b9bd 122 end
b6dd1aaf 123 %><h3>Request added</h3><%
e510b9bd 124
dfb0d0d7
AC
125elseif $"cmd" = "open" then
126 showNormal := false;
127 Group.requireGroupName "server";
b6dd1aaf 128 %><h3>Open requests</h3>
dfb0d0d7
AC
129 <a href="sec?cmd=list">List all requests</a><%
130
131 foreach (name, req) in Sec.Req.listOpen () do %>
132<br><hr><br>
b6dd1aaf
AC
133<table class="blanks">
134<tr> <td>By:</td> <td><a href="user?id=<% #usr req %>"><% name %></a></td> </tr>
135<tr> <td>Time:</td> <td><% #stamp req %></td> </tr>
3d2ed222 136<tr> <td>Node:</td> <td><% Web.html (Init.nodeName (#node req)) %></td> </tr>
b6dd1aaf
AC
137<tr> <td>Request:</td> <td><% #data req %></td> </tr>
138<tr> <td>Msg:</td> <td colspan="2"><% Web.html (#msg req) %></td> </tr>
dfb0d0d7
AC
139</table>
140
141<br>
142<a href="sec?mod=<% #id req %>">[Modify]</a>
143<a href="sec?del=<% #id req %>">[Delete]</a><br>
144
145<% end
146
147elseif $"cmd" = "list" then
148 showNormal := false;
149 Group.requireGroupName "server"
b6dd1aaf 150 %><h3>All requests</h3><%
dfb0d0d7
AC
151
152 foreach (name, req) in Sec.Req.list () do %>
153<br><hr><br>
b6dd1aaf
AC
154<table class="blanks">
155<tr> <td>By:</td> <td colspan="2"><a href="user?id=<% #usr req %>"><% name %></a></td> </tr>
156<tr> <td>Time:</td> <td colspan="2"><% #stamp req %></td> </tr>
3d2ed222 157<tr> <td>Node:</td> <td><% Web.html (Init.nodeName (#node req)) %></td> </tr>
b6dd1aaf
AC
158<tr> <td>Request:</td> <td><% #data req %></td> </tr>
159<tr> <td>Reason:</td> <td colspan="2"><% Web.html (#msg req) %></td> </tr>
dfb0d0d7
AC
160</table>
161
162<br>
163<a href="sec?mod=<% #id req %>">[Modify]</a>
164<a href="sec?del=<% #id req %>">[Delete]</a>
165
166<% end
167
168elseif $"mod" <> "" then
169 showNormal := false;
170 Group.requireGroupName "server";
171 val id = Web.stoi ($"mod");
172 val req = Sec.Req.lookup id;
173 val user = Init.lookupUser (#usr req) %>
b6dd1aaf 174<h3>Handle request</h3>
dfb0d0d7
AC
175
176<form action="sec" method="post">
177<input type="hidden" name="save" value="<% id %>">
b6dd1aaf
AC
178<table class="blanks">
179<tr> <td>Requestor:</td> <td><a href="user?id=<% #usr req %>"><% #name user %></a></td> </tr>
180<tr> <td>Time:</td> <td><% #stamp req %></td> </tr>
181<tr> <td>Status:</td> <td><select name="status">
dfb0d0d7
AC
182 <option value="0"<% if #status req = Sec.Req.NEW then %> selected<% end %>>New</option>
183 <option value="1"<% if #status req = Sec.Req.INSTALLED then %> selected<% end %>>Installed</option>
184 <option value="2"<% if #status req = Sec.Req.REJECTED then %> selected<% end %>>Rejected</option>
185</select></td> </tr>
3d2ed222
AC
186<tr> <td>Node:</td> <td><select name="node">
187<% foreach node in Init.listNodes () do %>
188 <option value="<% #id node %>"<% if nodeNum = #node req then %> selected<% end %>><% Web.html (#name node) %> (<% Web.html (#descr node) %>)</option>
189<% end %></select></td> </tr>
b6dd1aaf
AC
190<tr> <td>Request:</td> <td><input name="req" value="<% #data req %>"></td> </tr>
191<tr> <td>Message:</td> <td><textarea name="msg" rows="10" cols="80" wrap="soft"><% Web.html (#msg req) %></textarea></td> </tr>
dfb0d0d7
AC
192<tr> <td><input type="submit" value="Save"></td> </tr>
193</table>
194</form>
195
196<% elseif $"save" <> "" then
197 showNormal := false;
198 Group.requireGroupName "server";
199 val id = Web.stoi ($"save");
200 val req = Sec.Req.lookup id;
201 val oldStatus = #status req;
202 val newStatus = Sec.Req.statusFromInt (Web.stoi ($"status"));
3d2ed222 203 Sec.Req.modify {req with node = nodeNum, data = $"req", msg = $"msg", status = newStatus};
dfb0d0d7 204 if oldStatus <> newStatus then
3d2ed222 205 if not (Sec.Req.notifyMod {old = oldStatus, new = newStatus, changer = Init.getUserName(), req = id}) then
b6dd1aaf 206 %><h3>Error sending e-mail notification</h3><%
dfb0d0d7
AC
207 end
208 end
b6dd1aaf 209 %><h3>Request modified</h3>
dfb0d0d7
AC
210 Back to: <a href="sec?cmd=open">open requests</a>, <a href="sec?cmd=list">all requests</a>
211
212<% elseif $"del" <> "" then
213 showNormal := false;
214 Group.requireGroupName "server";
215 val id = Web.stoi ($"del");
216 val req = Sec.Req.lookup id;
217 val user = Init.lookupUser (#usr req)
3d2ed222 218 %><h3>Are you sure you want to delete request by <% #name user %> for "<% #data req %>" on <% Web.html (Init.nodeName (#node req)) %>?</h3>
dfb0d0d7
AC
219 <a href="sec?del2=<% id %>">Yes, I'm sure!</a>
220
221<% elseif $"del2" <> "" then
222 showNormal := false;
223 Group.requireGroupName "server";
224 val id = Web.stoi ($"del2");
225 Sec.Req.delete id
b6dd1aaf 226 %><h3>Request deleted</b><h3>
dfb0d0d7
AC
227 Back to: <a href="sec?cmd=open">open requests</a>, <a href="sec?cmd=list">all requests</a>
228
229<% end;
230
231if showNormal then %>
232
3d2ed222
AC
233<table class="blanks">
234<form action="sec" method="post">
235<input type="hidden" name="uname" value="<% Web.html uname %>">
236<tr> <td>Machines:</td> <td><select name="node">
237<% foreach node in Init.listNodes () do %>
238 <option value="<% #id node %>"<% if nodeNum = #id node then %> selected<% end %>><% Web.html (#name node) %> (<% Web.html (#descr node) %>)</option>
239<% end %></select></td>
240<td><input type="submit" value="Switch"></td> </tr>
241</form>
dfb0d0d7 242<form action="sec" method="post">
3d2ed222
AC
243<input type="hidden" name="node" value="<% nodeNum %>">
244<tr> <td>Your users:</td> <td><select name="uname">
dfb0d0d7
AC
245<% foreach name in (yourname :: Sec.findSubusers yourname) do %>
246 <option value="<% name %>"<% if uname = name then %> selected<% end %>><% name %></option>
3d2ed222
AC
247<% end %></select></td>
248<td><input type="submit" value="Switch"></td> </tr>
249</form>
250</table>
dfb0d0d7 251
b6dd1aaf 252<h3>Request socket permissions change</h3>
dfb0d0d7
AC
253
254<form action="sec" method="post">
3d2ed222 255<input type="hidden" name="node" value="<% nodeNum %>">
dfb0d0d7
AC
256<input type="hidden" name="uname" value="<% uname %>">
257<input type="hidden" name="cmd" value="socks">
b6dd1aaf
AC
258<table class="blanks">
259<tr> <td>New permissions:</td> <td><select name="socks">
dfb0d0d7
AC
260 <option value="none"<% if socks = Sec.NADA then %> selected<% end %>>None</option>
261 <option value="any"<% if socks = Sec.ANY then %> selected<% end %>>Any</option>
262 <option value="client"<% if socks = Sec.CLIENT_ONLY then %> selected<% end %>>Client only</option>
263 <option value="server"<% if socks = Sec.SERVER_ONLY then %> selected<% end %>>Server only</option>
264</select></td> </tr>
b6dd1aaf 265<tr> <td>Reason:</td> <td><textarea name="msg" wrap="soft" rows="3" cols="80"></textarea></td> </tr>
dfb0d0d7
AC
266<tr> <td><input type="submit" value="Request"></td> </tr>
267</table>
268</form>
269
b6dd1aaf 270<h3>Request change to your execute permissions</h3>
dfb0d0d7
AC
271
272<form action="sec" method="post">
3d2ed222 273<input type="hidden" name="node" value="<% nodeNum %>">
dfb0d0d7
AC
274<input type="hidden" name="uname" value="<% uname %>">
275<input type="hidden" name="cmd" value="tpe">
b6dd1aaf
AC
276<table class="blanks">
277<tr> <td>Trusted path executables only?</td> <td><select name="tpe">
dfb0d0d7
AC
278 <option value="no"<% if not tpe then %> selected<% end %>>No</option>
279 <option value="yes"<% if tpe then %> selected<% end %>>Yes</option>
280</select></td> </tr>
b6dd1aaf 281<tr> <td>Reason:</td> <td><textarea name="msg" wrap="soft" rows="3" cols="80"></textarea></td> </tr>
dfb0d0d7
AC
282<tr> <td><input type="submit" value="Request"></td> </tr>
283</table>
284</form>
285
b6dd1aaf 286<h3>Request change to your <tt>cron</tt> permissions</h3>
e510b9bd
AC
287
288<form action="sec" method="post">
3d2ed222 289<input type="hidden" name="node" value="<% nodeNum %>">
e510b9bd
AC
290<input type="hidden" name="uname" value="<% uname %>">
291<input type="hidden" name="cmd" value="cron">
b6dd1aaf
AC
292<table class="blanks">
293<tr> <td>Allowed to use cron?</td> <td><select name="cron">
18eeb749 294 <option value="no"<% if not cron then %> selected<% end %>>No</option>
e510b9bd
AC
295 <option value="yes"<% if cron then %> selected<% end %>>Yes</option>
296</select></td> </tr>
b6dd1aaf 297<tr> <td>Reason:</td> <td><textarea name="msg" wrap="soft" rows="3" cols="80"></textarea></td> </tr>
e510b9bd
AC
298<tr> <td><input type="submit" value="Request"></td> </tr>
299</table>
300</form>
301
b6dd1aaf 302<h3>Request change to your FTP permissions</h3>
f432bce2 303
18eeb749
AC
304<p>Please read <a href="http://wiki.hcoop.net/wiki/FileTransfer">our wiki instructions on file transfer</a> before requesting FTP access. Almost everyone should use alternative protocols to FTP that provide superior security benefits.</p>
305
f432bce2 306<form action="sec" method="post">
3d2ed222 307<input type="hidden" name="node" value="<% nodeNum %>">
f432bce2
AC
308<input type="hidden" name="uname" value="<% uname %>">
309<input type="hidden" name="cmd" value="ftp">
b6dd1aaf
AC
310<table class="blanks">
311<tr> <td>Allowed to use FTP?</td> <td><select name="ftp">
f432bce2
AC
312 <option value="no"<% if not ftp then %> selected<% end %>>No</option>
313 <option value="yes"<% if ftp then %> selected<% end %>>Yes</option>
314</select></td> </tr>
b6dd1aaf 315<tr> <td>Reason:</td> <td><textarea name="msg" wrap="soft" rows="3" cols="80"></textarea></td> </tr>
f432bce2
AC
316<tr> <td><input type="submit" value="Request"></td> </tr>
317</table>
318</form>
319
3d2ed222 320<% val rules = Sec.findFirewallRules {node = nodeNum, uname = uname};
e510b9bd
AC
321switch rules of
322 _::_ => %>
b6dd1aaf 323<h3>Your firewall rules</h3>
e510b9bd
AC
324
325<% foreach rule in rules do %>
326<form action="sec" method="post">
3d2ed222 327<input type="hidden" name="node" value="<% nodeNum %>">
e510b9bd
AC
328<input type="hidden" name="uname" value="<% uname %>">
329<input type="hidden" name="modRule" value="<% Web.html rule %>">
330<input name="rule" value="<% Web.html rule %>">
331<a href="sec?delRule=<% Web.urlEncode rule %>">[Request deletion]</a>
332<input type="submit" value="Request change">
333</form><br>
334<% end
335end%>
336
b6dd1aaf 337<h3>Request a new firewall rule</h3>
e510b9bd
AC
338
339<p>You can find a description of rule formats <a href="http://wiki.hcoop.net/wiki/FirewallRules">on our wiki</a>. Enter here the rule you want, without the initial <tt>user</tt> portion.</p>
340
18eeb749
AC
341<p>Please note that <b>your firewall rule will be useless</b> if you don't first request the corresponding socket privileges at the top of this page.</p>
342
e510b9bd 343<form action="sec" method="post">
3d2ed222 344<input type="hidden" name="node" value="<% nodeNum %>">
e510b9bd
AC
345<input type="hidden" name="uname" value="<% uname %>">
346<input type="hidden" name="cmd" value="rule">
b6dd1aaf
AC
347<table class="blanks">
348<tr> <td>Rule</td> <td><input name="rule" size="80"></td> </tr>
349<tr> <td>Reason:</td> <td><textarea name="msg" wrap="soft" rows="3" cols="80"></textarea></td> </tr>
e510b9bd
AC
350<tr> <td><input type="submit" value="Request"></td> </tr>
351</table>
352</form>
353
dfb0d0d7
AC
354<% end %>
355
356<% @footer[] %>