relicence under MirOS Licence, granted by private deal with the CTO
[shellsnippets/shellsnippets.git] / mksh / rechte-mock.shar
1 # This is a bigger CGI sample application.
2 #-
3 # This is a shell archive.  Save it in a file, remove anything before
4 # this line, and then unpack it by entering "sh file".  Note, it may
5 # create directories; files and directories will be owned by you and
6 # have default permissions.
7 #
8 # This archive contains:
9 #
10 #       rechte-mock/.htaccess
11 #       rechte-mock/addrole.cgi
12 #       rechte-mock/common
13 #       rechte-mock/grpimport.cgi
14 #       rechte-mock/grprole.cgi
15 #       rechte-mock/roleperm.cgi
16 #       rechte-mock/se.cgi
17 #
18 mkdir rechte-mock
19 echo x - rechte-mock/.htaccess
20 sed 's/^X//' >rechte-mock/.htaccess << 'END-of-rechte-mock/.htaccess'
21 X# $Id$
22 X
23 XOptions +ExecCGI
24 XAddHandler cgi-script .cgi
25 END-of-rechte-mock/.htaccess
26 echo x - rechte-mock/addrole.cgi
27 sed 's/^X//' >rechte-mock/addrole.cgi << 'END-of-rechte-mock/addrole.cgi'
28 X#!/bin/mksh
29 X# $Id$
30 X#-
31 X# Copyright © 2011, 2012
32 X#      Thorsten “mirabilos” Glaser <t.glaser@tarent.de>
33 X#
34 X# Provided that these terms and disclaimer and all copyright notices
35 X# are retained or reproduced in an accompanying document, permission
36 X# is granted to deal in this work without restriction, including un‐
37 X# limited rights to use, publicly perform, distribute, sell, modify,
38 X# merge, give away, or sublicence.
39 X#
40 X# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
41 X# the utmost extent permitted by applicable law, neither express nor
42 X# implied; without malicious intent or gross negligence. In no event
43 X# may a licensor, author or contributor be held liable for indirect,
44 X# direct, other damage, loss, or other issues arising in any way out
45 X# of dealing in the work, even if advised of the possibility of such
46 X# damage or existence of a defect, except proven that it results out
47 X# of said person’s immediate fault when using the work as intended.
48 X
49 X. "$(dirname "$0")"/common
50 X
51 Xparse_getparms Submit name
52 Xif [[ -n $parm_Submit && -n $parm_name ]]; then
53 X       print 0 >data/roles/"$parm_name"
54 X       html_open "Add Role"
55 X       print "<p>Role $parm_name added successfully.</p>"
56 X       html_close
57 X       exit 0
58 Xfi
59 X
60 Xhtml_open "Add Role"
61 Xprint '<form method="get" action="addrole.cgi">'
62 Xprint '<p>New role: <input type="text" name="name" size="20" /></p>'
63 Xprint '<p><input type="submit" name="Submit" value="Rolle hinzufügen" /></p>'
64 Xprint '</form>'
65 Xprint '<p>Existierende Rollen:</p><ul>'
66 Xcd data/roles
67 Xfor i in *; do
68 X       print -r " <li>$i</li>"
69 Xdone
70 Xprint '</ul>'
71 Xhtml_close
72 Xexit 0
73 END-of-rechte-mock/addrole.cgi
74 echo x - rechte-mock/common
75 sed 's/^X//' >rechte-mock/common << 'END-of-rechte-mock/common'
76 X# $Id$
77 X#-
78 X# Copyright © 2011, 2012
79 X#      Thorsten “mirabilos” Glaser <t.glaser@tarent.de>
80 X#
81 X# Provided that these terms and disclaimer and all copyright notices
82 X# are retained or reproduced in an accompanying document, permission
83 X# is granted to deal in this work without restriction, including un‐
84 X# limited rights to use, publicly perform, distribute, sell, modify,
85 X# merge, give away, or sublicence.
86 X#
87 X# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
88 X# the utmost extent permitted by applicable law, neither express nor
89 X# implied; without malicious intent or gross negligence. In no event
90 X# may a licensor, author or contributor be held liable for indirect,
91 X# direct, other damage, loss, or other issues arising in any way out
92 X# of dealing in the work, even if advised of the possibility of such
93 X# damage or existence of a defect, except proven that it results out
94 X# of said person’s immediate fault when using the work as intended.
95 X
96 Xexport LC_ALL=C
97 Xunset LANGUAGE
98 X
99 X# check for new enough mksh version
100 X#set -A PIPESTATUS -- 23 42
101 Xfalse | true | true
102 Xset -A rv -- "${PIPESTATUS[@]}"
103 Xif [[ ${#rv[*]} != 3 || ${rv[0]} != 1 || ${rv[1]} != 0 || ${rv[2]} != 0 ]]; then
104 X       print -u2 need mksh R40
105 X       exit 255
106 Xfi
107 X
108 X# ensure cwd is right and data dirs exist
109 Xcd "$(dirname "$0")"
110 Xmkdir -p data/{roles,groups/{isactive,roles}}
111 X
112 X# Base64 encoder/decoder
113 Xset -A Lb64encode_code -- A B C D E F G H I J K L M N O P Q R S T U V W X Y Z \
114 X    a b c d e f g h i j k l m n o p q r s t u v w x y z 0 1 2 3 4 5 6 7 8 9 + /
115 Xfunction b64encode {
116 X       [[ -o utf8-mode ]]; local u=$?
117 X       set +U
118 X       local c s t
119 X       if (( $# )); then
120 X               read -raN-1 s <<<"$*"
121 X               unset s[${#s[*]}-1]
122 X       else
123 X               read -raN-1 s
124 X       fi
125 X       local -i i=0 n=${#s[*]} j v
126 X
127 X       while (( i < n )); do
128 X               (( v = s[i++] << 16 ))
129 X               (( j = i < n ? s[i++] : 0 ))
130 X               (( v |= j << 8 ))
131 X               (( j = i < n ? s[i++] : 0 ))
132 X               (( v |= j ))
133 X               t+=${Lb64encode_code[v >> 18]}${Lb64encode_code[v >> 12 & 63]}
134 X               c=${Lb64encode_code[v >> 6 & 63]}
135 X               if (( i <= n )); then
136 X                       t+=$c${Lb64encode_code[v & 63]}
137 X               elif (( i == n + 1 )); then
138 X                       t+=$c=
139 X               else
140 X                       t+===
141 X               fi
142 X               if (( ${#t} == 76 || i >= n )); then
143 X                       print $t
144 X                       t=
145 X               fi
146 X       done
147 X       (( u )) || set -U
148 X}
149 X
150 Xfunction b64decode {
151 X       typeset c s="$*" t=
152 X       typeset -i i=0 n=${#s} p=0 v x
153 X       typeset -i1 o
154 X
155 X       while (( i < n )); do
156 X               c=${s:(i++):1}
157 X               case $c {
158 X               (=)     break ;;
159 X               ([A-Z]) (( v = 1#$c - 65 )) ;;
160 X               ([a-z]) (( v = 1#$c - 71 )) ;;
161 X               ([0-9]) (( v = 1#$c + 4 )) ;;
162 X               (+)     v=62 ;;
163 X               (/)     v=63 ;;
164 X               (*)     continue ;;
165 X               }
166 X               (( x = (x << 6) | v ))
167 X               case $((p++)) {
168 X               (0)     continue ;;
169 X               (1)     (( o = (x >> 4) & 255 )) ;;
170 X               (2)     (( o = (x >> 2) & 255 )) ;;
171 X               (3)     (( o = x & 255 ))
172 X                       p=0
173 X                       ;;
174 X               }
175 X               t=$t${o#1#}
176 X       done
177 X       print -nr -- "$t"
178 X}
179 X
180 X# make an LDAP request
181 XLDAP_SERVER=dc-slave.lan.tarent.de
182 Xfunction ldapshow {
183 X       local rv
184 X
185 X       ldapsearch -xLLL -ZZ -h "$LDAP_SERVER" "$@" | \
186 X           tr '\n' $'\a' | sed -e $'s/\a //g' | tr $'\a' '\n'
187 X       set -A rv -- "${PIPESTATUS[@]}"
188 X       return ${rv[0]}
189 X}
190 X
191 X# start and finish an HTML page
192 Xfunction html_open {
193 X       local title="$*"
194 X
195 X       cat <<EOF
196 XContent-Type: text/html; charset=utf-8
197 X
198 X<?xml version="1.0"?>\r
199 X<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN"
200 X "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
201 X<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en"><head>
202 X <meta http-equiv="content-type" content="text/html; charset=utf-8" />
203 X <title>${title}</title>
204 X</head><body>
205 XEOF
206 X}
207 Xfunction html_close {
208 X       print '</body></html>'
209 X}
210 X
211 X# set of permission bits and their names
212 Xset -A perm_bits -- \
213 X    'Eigene Leistungen eintragen/ändern/löschen/umbuchen' \
214 X    'Fremde Leistungen in einem Projekt sehen' \
215 X    'Fremde Leistungen eines Bereichs sehen' \
216 X    'Alle fremden Leistungen sehen' \
217 X    'Fremde Leistungen löschen' \
218 X    'Fremde Leistungen umbuchen' \
219 X    'Fremde Leistungen importieren/exportieren' \
220 X    'Eigene Überstunden eintragen/ändern/löschen' \
221 X    'Fremde Überstunden in einem Projekt sehen' \
222 X    'Fremde Überstunden in einem Projekt exportieren' \
223 X    'Fremde Überstunden eines Bereichs sehen' \
224 X    'Fremde Überstunden eines Bereichs exportieren' \
225 X    'Alle fremden Überstunden sehen' \
226 X    'Alle Überstunden eines Bereichs exportieren' \
227 X    'Fremde Überstunden eintragen/löschen/abfeiern' \
228 X    'Eigene Abwesenheiten beantragen/ändern/löschen' \
229 X    'Abwesenheiten genehmigen' \
230 X    'Fremde Abwesenheiten in einem Projekt sehen' \
231 X    'Fremde Abwesenheiten eines Bereichs sehen' \
232 X    'Alle fremden Abwesenheiten sehen' \
233 X    'Alle fremden Abwesenheiten exportieren' \
234 X    'Fremde Abwesenheiten löschen/ändern' \
235 X    'Kunden anlegen/ändern/löschen' \
236 X    'Projekte anlegen' \
237 X    'Eigene Projekte ändern/löschen' \
238 X    'Projekte eines Bereichs ändern/löschen' \
239 X    'Alle Projekte ändern/löschen' \
240 X    'Eigene Projekte sehen' \
241 X    'Projekte eines Bereichs sehen' \
242 X    'Alle Projekte sehen' \
243 X    'Aufträge anlegen' \
244 X    'Eigene Aufträge ändern/löschen' \
245 X    'Aufträge eines Bereichs ändern/löschen' \
246 X    'Alle Aufträge ändern/löschen' \
247 X    'Eigene Aufträge sehen' \
248 X    'Aufträge eines Bereichs sehen' \
249 X    'Alle Aufträge sehen' \
250 X    'Rechnungen zu Aufträgen sehen' \
251 X    'Positionen anlegen' \
252 X    'Eigene Positionen ändern/löschen' \
253 X    'Positionen eines Bereichs ändern/löschen' \
254 X    'Alle Positionen ändern löschen' \
255 X    'Eigene Positionen sehen' \
256 X    'Positionen eines Bereichs sehen' \
257 X    'Alle Positionen sehen' \
258 X    'Ressourcen zu Positionen hinzufügen/löschen' \
259 X    'Ressourcen anlegen/bearbeiten/sperren/löschen' \
260 X    'Ressourcen einsehen' \
261 X    'Ressourcen Rechte zuteilen' \
262 X    'Auftragsrechnungen einstellen/bearbeiten/löschen' \
263 X    'Auftragsrechnungen sehen' \
264 X    'Projektrechnungen einstellen/bearbeiten/löschen' \
265 X    'Projektrechnungen sehen' \
266 X    'activity Einstellungen ändern' \
267 X# add only here; the keys are indicēs
268 X
269 X# parse query string
270 Xfunction parse_getparms {
271 X       local saveIFS flds fld cfld k v
272 X
273 X       saveIFS=$IFS
274 X       IFS='&;'
275 X       set -A flds -- $QUERY_STRING
276 X       IFS=$saveIFS
277 X
278 X       for cfld in "$@"; do
279 X               eval parm_$cfld=
280 X       done
281 X
282 X       for fld in "${flds[@]}"; do
283 X               k=${fld%%=*}
284 X               v=${fld#*=}
285 X               for cfld in "$@"; do
286 X                       [[ $k = "$cfld" ]] || continue
287 X                       eval parm_$cfld=\$v
288 X                       break
289 X               done
290 X       done
291 X}
292 END-of-rechte-mock/common
293 echo x - rechte-mock/grpimport.cgi
294 sed 's/^X//' >rechte-mock/grpimport.cgi << 'END-of-rechte-mock/grpimport.cgi'
295 X#!/bin/mksh
296 X# $Id$
297 X#-
298 X# Copyright © 2011, 2012
299 X#      Thorsten “mirabilos” Glaser <t.glaser@tarent.de>
300 X#
301 X# Provided that these terms and disclaimer and all copyright notices
302 X# are retained or reproduced in an accompanying document, permission
303 X# is granted to deal in this work without restriction, including un‐
304 X# limited rights to use, publicly perform, distribute, sell, modify,
305 X# merge, give away, or sublicence.
306 X#
307 X# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
308 X# the utmost extent permitted by applicable law, neither express nor
309 X# implied; without malicious intent or gross negligence. In no event
310 X# may a licensor, author or contributor be held liable for indirect,
311 X# direct, other damage, loss, or other issues arising in any way out
312 X# of dealing in the work, even if advised of the possibility of such
313 X# damage or existence of a defect, except proven that it results out
314 X# of said person’s immediate fault when using the work as intended.
315 X
316 X. "$(dirname "$0")"/common
317 X
318 Xcurcn=
319 Xldapshow -b cn=groups,dc=tarent,dc=de objectClass=posixGroup cn | \
320 X    while read key value; do
321 X       case $key {
322 X       (cn:)   curcn=$value ;;
323 X       (cn::)  curcn=$(b64decode "$value") ;;
324 X       }
325 X
326 X       # ignore unknown lines / keys
327 X       [[ -z $key ]] || continue
328 X       # empty lines separate records
329 X
330 X       if [[ -n $curcn ]]; then
331 X               [[ $curcn = */* ]] || print -r -- "$curcn"
332 X       fi
333 X       curcn=
334 Xdone | sort -fu |&
335 XIFS=$'\n' read -p -A -N-1 all_ldap_groups
336 Xall_ldap_groups_=${#all_ldap_groups[*]}
337 X
338 Xset -A all_ldap_groups_enabledp
339 X
340 X#QUERY_STRING='grp%5B%5D=Administrators&grp%5B%5D=Controller&Submit=Gruppen+freischalten'
341 Xparse_getparms Submit
342 Xif [[ -n $parm_Submit ]]; then
343 X       saveIFS=$IFS
344 X       IFS='&;'
345 X       set -A flds -- $QUERY_STRING
346 X       IFS=$saveIFS
347 X
348 X       for fld in "${flds[@]}"; do
349 X               k=${fld%%=*}
350 X               [[ $k = 'grp%5B%5D' || $k = 'grp%5b%5d' || $k = 'grp[]' ]] || continue
351 X               v=${fld#*=}
352 X               v=${v//+/ }
353 X               i=-1
354 X               while (( ++i < all_ldap_groups_ )); do
355 X                       [[ ${all_ldap_groups[i]} = "$v" ]] || continue
356 X                       all_ldap_groups_enabledp[i]=1
357 X                       break
358 X               done
359 X       done
360 X
361 X       i=-1
362 X       while (( ++i < all_ldap_groups_ )); do
363 X               n=${all_ldap_groups[i]}
364 X               x=0
365 X               [[ ${all_ldap_groups_enabledp[i]} = 1 ]] && x=1
366 X               print $x >data/groups/isactive/"$n"
367 X       done
368 Xfi
369 X
370 Xset -A all_ldap_groups_enabledp
371 X
372 Xi=-1
373 Xwhile (( ++i < all_ldap_groups_ )); do
374 X       n=${all_ldap_groups[i]}
375 X       x=0
376 X       [[ -s data/groups/isactive/$n && \
377 X           "$(<data/groups/isactive/$n)" = *1* ]] && x=1
378 X       all_ldap_groups_enabledp[i]=$x
379 Xdone
380 X
381 Xhtml_open "Import LDAP groups"
382 Xprint '<form method="get" action="grpimport.cgi">'
383 Xprint '<div><table border="1">'
384 Xprint '<tr><th width="10em">Import?</th><th>Group Common Name</th></tr>'
385 Xi=-1
386 Xwhile (( ++i < all_ldap_groups_ )); do
387 X       n=${all_ldap_groups[i]}
388 X       x=${all_ldap_groups_enabledp[i]}
389 X       print -n '<td><input type="checkbox" name="grp[]" value="'"$n"\"
390 X       (( x )) && print -n ' checked="checked"'
391 X       print " /></td><td>$n</td></tr>"
392 Xdone
393 Xprint '</table></div><div>'
394 Xprint '<p><input type="submit" name="Submit" value="Gruppen freischalten" /></p>'
395 Xprint '</div></form>'
396 Xhtml_close
397 Xexit 0
398 END-of-rechte-mock/grpimport.cgi
399 echo x - rechte-mock/grprole.cgi
400 sed 's/^X//' >rechte-mock/grprole.cgi << 'END-of-rechte-mock/grprole.cgi'
401 X#!/bin/mksh
402 X# $Id$
403 X#-
404 X# Copyright © 2011, 2012
405 X#      Thorsten “mirabilos” Glaser <t.glaser@tarent.de>
406 X#
407 X# Provided that these terms and disclaimer and all copyright notices
408 X# are retained or reproduced in an accompanying document, permission
409 X# is granted to deal in this work without restriction, including un‐
410 X# limited rights to use, publicly perform, distribute, sell, modify,
411 X# merge, give away, or sublicence.
412 X#
413 X# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
414 X# the utmost extent permitted by applicable law, neither express nor
415 X# implied; without malicious intent or gross negligence. In no event
416 X# may a licensor, author or contributor be held liable for indirect,
417 X# direct, other damage, loss, or other issues arising in any way out
418 X# of dealing in the work, even if advised of the possibility of such
419 X# damage or existence of a defect, except proven that it results out
420 X# of said person’s immediate fault when using the work as intended.
421 X
422 X. "$(dirname "$0")"/common
423 X
424 X(cd data/groups/isactive; for n in *; do
425 X       [[ $(<$n) = *1* ]] && print -r -- "$n"
426 Xdone) |&
427 XIFS=$'\n' read -p -A -N-1 ldap_groups
428 X
429 X(cd data/roles; for n in *; do
430 X       [[ -s $n ]] && print -r -- "$n"
431 Xdone) |&
432 XIFS=$'\n' read -p -A -N-1 roles
433 X
434 Xparse_getparms Submit
435 Xif [[ -n $parm_Submit ]]; then
436 X       saveIFS=$IFS
437 X       IFS='&;'
438 X       set -A flds -- $QUERY_STRING
439 X       IFS=$saveIFS
440 X
441 X       rm -rf data/groups/roles
442 X       for n in "${ldap_groups[@]}"; do
443 X               mkdir -p data/groups/roles/"$n"
444 X       done
445 X
446 X       for fld in "${flds[@]}"; do
447 X               k=${fld%%=*}
448 X               [[ $k = 'gr%5B%5D' || $k = 'gr%5b%5d' || $k = 'gr[]' ]] || continue
449 X               v=${fld#*=}
450 X               v=${v//+/ }
451 X               v=${v//\\/\\\\}
452 X               v=${v//[%]/\\x}
453 X               v=$(print -- "$v")
454 X               va=${v%/*}
455 X               vb=${v#*/}
456 X               [[ -d data/groups/roles/"$va"/. ]] || continue
457 X               for r in "${roles[@]}"; do
458 X                       [[ $r = "$vb" ]] || continue
459 X                       :>data/groups/roles/"$v"
460 X                       break
461 X               done
462 X       done
463 Xfi
464 X
465 Xhtml_open "Assign Roles to Groups"
466 Xprint '<form method="get" action="grprole.cgi">'
467 Xprint '<div><table border="1">'
468 Xprint '<tr>'
469 Xprint ' <th align="right">Group \ Role</th>'
470 Xfor r in "${roles[@]}"; do
471 X       print " <th>$r</th>"
472 Xdone
473 Xprint '</tr>'
474 Xfor n in "${ldap_groups[@]}"; do
475 X       mkdir -p data/groups/roles/"$n"
476 X       print '<tr>'
477 X       print " <th align=\"right\">$n</th>"
478 X       for r in "${roles[@]}"; do
479 X               print -n ' <td><input type="checkbox" name="gr[]" value="'"$n/$r"\"
480 X               [[ -e data/groups/roles/$n/$r ]] && print -n ' checked="checked"'
481 X               print " /></td>"
482 X       done
483 X       print '</tr>'
484 Xdone
485 Xprint '</table></div><div>'
486 Xprint '<p><input type="submit" name="Submit" value="Rollen zuweisen" /></p>'
487 Xprint '</div></form>'
488 Xhtml_close
489 Xexit 0
490 END-of-rechte-mock/grprole.cgi
491 echo x - rechte-mock/roleperm.cgi
492 sed 's/^X//' >rechte-mock/roleperm.cgi << 'END-of-rechte-mock/roleperm.cgi'
493 X#!/bin/mksh
494 X# $Id$
495 X#-
496 X# Copyright © 2011, 2012
497 X#      Thorsten “mirabilos” Glaser <t.glaser@tarent.de>
498 X#
499 X# Provided that these terms and disclaimer and all copyright notices
500 X# are retained or reproduced in an accompanying document, permission
501 X# is granted to deal in this work without restriction, including un‐
502 X# limited rights to use, publicly perform, distribute, sell, modify,
503 X# merge, give away, or sublicence.
504 X#
505 X# This work is provided “AS IS” and WITHOUT WARRANTY of any kind, to
506 X# the utmost extent permitted by applicable law, neither express nor
507 X# implied; without malicious intent or gross negligence. In no event
508 X# may a licensor, author or contributor be held liable for indirect,
509 X# direct, other damage, loss, or other issues arising in any way out
510 X# of dealing in the work, even if advised of the possibility of such
511 X# damage or existence of a defect, except proven that it results out
512 X# of said person’s immediate fault when using the work as intended.
513 X
514 X. "$(dirname "$0")"/common
515 X
516 X(cd data/roles; for n in *; do
517 X       [[ -s $n ]] && print -r -- "$n"
518 Xdone) |&
519 XIFS=$'\n' read -p -A -N-1 roles
520 X
521 Xparse_getparms Submit
522 Xif [[ -n $parm_Submit ]]; then
523 X       saveIFS=$IFS
524 X       IFS='&;'
525 X       set -A flds -- $QUERY_STRING
526 X       IFS=$saveIFS
527 X
528 X       allnull=
529 X       j=-1
530 X       while (( ++j < ${#perm_bits[*]} )); do
531 X               allnull+=' 0'
532 X       done
533 X
534 X       j=-1
535 X       for r in "${roles[@]}"; do
536 X               u=role_bits_$((++j))
537 X               eval set -A $u $allnull
538 X       done
539 X
540 X       for fld in "${flds[@]}"; do
541 X               k=${fld%%=*}
542 X               [[ $k = 'rp%5B%5D' || $k = 'rp%5b%5d' || $k = 'rp[]' ]] || continue
543 X               v=${fld#*=}
544 X               v=${v//+/ }
545 X               v=${v//\\/\\\\}
546 X               v=${v//[%]/\\x}
547 X               v=$(print -- "$v")
548 X               va=${v%,*}
549 X               vb=${v#*,}
550 X               [[ $va = +([0-9]) ]] || continue
551 X               (( va < 0 || va >= ${#perm_bits[*]} )) && continue
552 X               j=-1
553 X               for r in "${roles[@]}"; do
554 X                       u=role_bits_$((++j))
555 X                       [[ $r = "$vb" ]] || continue
556 X                       eval $u'[va]=1'
557 X                       break
558 X               done
559 X       done
560 X
561 X       j=-1
562 X       for r in "${roles[@]}"; do
563 X               u=role_bits_$((++j))
564 X               eval 'print ${'$u'[*]} >data/roles/"$r"'
565 X       done
566 Xfi
567 X
568 Xi=-1
569 Xfor n in "${perm_bits[@]}"; do
570 X       v=role_perm_$((++i))
571 X       eval set -A $v
572 X       j=0
573 X       for r in "${roles[@]}"; do
574 X               set -A cur_perms -- $(<data/roles/$r)
575 X               w=0
576 X               [[ ${cur_perms[i]} = *1* ]] && w=1
577 X               eval $v'[j++]=$w'
578 X       done
579 Xdone
580 X
581 Xhtml_open "Assign Permissions to Roles"
582 Xprint '<form method="get" action="roleperm.cgi">'
583 Xprint '<div><table border="1">'
584 Xprint '<tr>'
585 Xprint ' <th align="right">Permission \ Role</th>'
586 Xfor r in "${roles[@]}"; do
587 X       print " <th>$r</th>"
588 Xdone
589 Xprint '</tr>'
590 Xi=-1
591 Xfor n in "${perm_bits[@]}"; do
592 X       v=role_perm_$((++i))
593 X       print '<tr>'
594 X       print " <th align=\"right\">$n</th>"
595 X       j=0
596 X       for r in "${roles[@]}"; do
597 X               print -n ' <td><input type="checkbox" name="rp[]" value="'"$i,$r"\"
598 X               eval w='${'$v'[j++]}'
599 X               (( w )) && print -n ' checked="checked"'
600 X               print " /></td>"
601 X       done
602 X       print '</tr>'
603 Xdone
604 Xprint '</table></div><div>'
605 Xprint '<p><input type="submit" name="Submit" value="Rechte an Rollen zuweisen" /></p>'
606 Xprint '</div></form>'
607 Xhtml_close
608 Xexit 0
609 END-of-rechte-mock/roleperm.cgi
610 echo x - rechte-mock/se.cgi
611 sed 's/^X//' >rechte-mock/se.cgi << 'END-of-rechte-mock/se.cgi'
612 X#!/bin/mksh
613 X# $Id$
614 X#-
615 X# Copyright © Thorsten Glaser, taken from MirBSD with permission.
616 X
617 Xvars=$(set)
618 X#set -A args -- "$0" "$@"
619 X#opts=$(set -o)
620 X#set -o arc4random
621 Xprint Content-type: text/plain
622 X#print Entropy: $RANDOM
623 Xprint
624 Xinteger i=0
625 Xwhile (( i < ${#args[*]} )); do
626 X       print -r "ARGV[$i]=${args[i]}"
627 X       let i++
628 Xdone
629 Xprint -r -- "$vars"
630 Xprint -- ------------------------------------------------------------------------------
631 X#print -r -- "$opts"
632 X#print -- ------------------------------------------------------------------------------
633 Xif [[ $REQUEST_METHOD = POST ]]; then
634 X       cat
635 X       print
636 X       print -- ------------------------------------------------------------------------------
637 Xfi
638 Xexit 0
639 END-of-rechte-mock/se.cgi
640 exit