Release a new version of the Apache module, with the context support.
[itkacl] / itkacl-web-1.0 / web / view.pl
1 #! /usr/bin/perl -T
2 use strict;
3 use warnings;
4 use HTML::Entities;
5 use utf8;
6
7 use lib '../include';
8 use itkaclcommon;
9
10 itkaclcommon::print_header();
11 my $entry = $itkaclcommon::cgi->param('entry');
12 itkaclcommon::print_tree(0, $entry);
13
14 my $ref = $itkaclcommon::dbh->selectrow_hashref('SELECT * FROM objects WHERE id=?', undef, $entry);
15
16 print "<script src=\"jquery-1.7.min.js\" type=\"text/javascript\"></script>\n";
17 print "<script src=\"itkacl.js\" type=\"text/javascript\"></script>\n";
18 print "<h1>$ref->{'description'}</h1>\n";
19
20 # Follow the tree up to the root to find the full path
21 my $path = "/" . $ref->{'name'};
22 my @ids = ();
23 while (defined($ref->{'parent'})) {
24         $ref = $itkaclcommon::dbh->selectrow_hashref('SELECT * FROM objects WHERE id=?', undef, $ref->{'parent'});
25         $path = "/" . $ref->{'name'} . $path;
26         push @ids, $ref->{'id'};
27 }
28         
29 print "<h2>$path</h2>\n";
30
31 #
32 # Now, fetch all ACL entries to find inherited rights; since ACLs are
33 # applied starting from the root, we traverse the tree from the root as
34 # well.
35 #
36
37 my $num_inherited = 0;
38 my $curpath = "";
39 for my $id (reverse @ids) {
40         $ref = $itkaclcommon::dbh->selectrow_hashref('SELECT * FROM objects WHERE id=?', undef, $id);
41         $curpath .= "/" . $ref->{'name'};
42         
43         my $aes = $itkaclcommon::dbh->selectall_arrayref('SELECT entity_type,entity,allow FROM aclentries WHERE object=? ORDER BY entity_type ASC, allow DESC',
44                 undef, $id);
45
46         for my $ae (@{$aes}) {
47                 if ($num_inherited == 0) {
48                         # This is the first entry, we'll have to make
49                         # the table borders and such
50                         print <<"EOF";
51 <h3>Arvede rettigheter</h3>
52
53 <table>
54   <tr>
55     <th>#</th>
56     <th>Till.</th>
57     <th>Type</th>
58     <th>Hvem</th>
59     <th>Arvet fra</th>
60   </tr>
61 EOF
62                 }
63         
64                 my ($entity_type, $entity, $allow) = @{$ae};
65                 my $et_text;
66                 if ($entity_type eq 'group') {
67                         $et_text = 'Gruppe';
68                 } else {
69                         $et_text = 'Bruker';
70                 }
71                 my $e_text = HTML::Entities::encode_entities($entity);
72         
73                 ++$num_inherited;
74                 print <<"EOF";
75   <tr>
76     <td>$num_inherited</td>
77     <td style="text-align: center;"><img src="/img/$allow.png" alt="$ae->[2]" /></td>
78     <td>$et_text</td>
79     <td>$e_text</td>
80     <td><a href="/view.pl?entry=$id">$curpath</a></td>
81   </tr>
82 EOF
83         }
84 }
85
86 if ($num_inherited != 0) {
87         print "</table>\n";
88 }
89
90 #
91 # Same, for non-inherited rights. Yes, it's a bit of code duplication,
92 # but it really won't be that much cleaner implementing it as a
93 # function, unfortunately.
94 #
95
96 print "<h3>Rettigheter</h3>\n";
97
98 my $num_rights = 0;
99 $ref = $itkaclcommon::dbh->selectrow_hashref('SELECT * FROM objects WHERE id=?', undef, $entry);
100 my $aes = $itkaclcommon::dbh->selectall_arrayref('SELECT entity_type,entity,allow,comment FROM aclentries WHERE object=? ORDER BY entity_type ASC, allow DESC',
101         undef, $entry);
102
103 for my $ae (@{$aes}) {
104         if ($num_rights == 0) {
105                 # This is the first entry, we'll have to make
106                 # the table borders and such
107                 print <<"EOF";
108
109 <table>
110   <tr>
111     <th>#</th>
112     <th>Till.</th>
113     <th>Type</th>
114     <th>Hvem</th>
115     <th>Slett</th>
116     <th>Kommentar</th>
117   </tr>
118 EOF
119                 }
120         
121         my ($entity_type, $entity, $allow, $comment) = @{$ae};
122         my $et_text;
123         if ($entity_type eq 'group') {
124                 $et_text = 'Gruppe';
125         } else {
126                 $et_text = 'Bruker';
127         }
128         my $e_text = HTML::Entities::encode_entities($entity);
129         my $c_text = HTML::Entities::encode_entities($comment // '');
130
131         ++$num_rights;
132         print <<"EOF";
133   <tr>
134     <td>$num_rights</td>
135     <td style="text-align: center;"><img src="/img/$allow.png" alt="$ae->[2]" /></td>
136     <td>$et_text</td>
137     <td>$e_text</td>
138     <td style="text-align: center;">
139       <a href="/delete.pl?entry=$entry&amp;entity_type=$entity_type&amp;entity=$e_text&amp;csrftoken=$itkaclcommon::masked_csrf_token">
140         <img src="/img/delete.png" alt="Slett" />
141       </a>
142     </td>
143     <td ondblclick="enableEdit(this);" itkacl:entry="$entry" itkacl:entity-type="$entity_type" itkacl:entity="$e_text" itkacl:csrftoken="$itkaclcommon::masked_csrf_token">$c_text</td>
144   </tr>
145 EOF
146 }
147
148 if ($num_rights != 0) {
149         print "</table>\n";
150 } else {
151         print "<p>Ingen rettigheter er satt ennå for dette objektet.</p>\n";
152 }
153
154 #
155 # I'm a bit unsure if we want to have this all in one page, but OK, here
156 # goes...
157 #
158 print <<"EOF";
159
160 <h3>Legg til nye rettigheter</h3>
161
162 <p>Du kan legge til nye rettigheter på dette objektet. Merk at verdiene
163   dine ikke vil sjekkes for gyldighet (du kan mao. fint gi tilganger til
164   en ikke-eksisterende bruker eller gruppe, men det kan gi uforutsigbare
165   resultater ved ACL-sjekking seinere).</p>
166
167 <p>Den spesielle gruppen "&lt;everyone&gt;" inneholder alle brukere.</p>
168
169 <form method="post" action="add.pl">
170   <input type="hidden" name="csrftoken" value="$itkaclcommon::masked_csrf_token" />
171   <input type="hidden" name="entry" value="$entry" />
172   <table>
173     <tr style="text-align: left;">
174       <th>Tillatelse:</th>
175       <td>
176         <select name="allow">
177           <option value="deny">Nekt</option>
178           <option value="grant">Tillat</option>
179         </select>
180       </td>
181     </tr>
182     <tr style="text-align: left;">
183       <th>Type:</th>
184       <td>
185         <select name="entity_type">
186           <option value="user">Bruker</option>
187           <option value="group">Gruppe</option>
188         </select>
189       </td>
190     </tr>
191     <tr style="text-align: left;">
192       <th>Bruker-/gruppenavn:</th>
193       <td><input name="entity" size="16" /></td>
194     </tr>
195     <tr style="text-align: left;">
196       <th>Kommentar:</th>
197       <td><input name="comment" size="40" /></td>
198     </tr>
199     <tr>
200       <td colspan="2" style="text-align: center;">
201         <input type="submit" value="Legg til" />
202       </td>
203     </tr>
204   </table>
205 </form>
206
207 <h3>Legg til nye tilgangsområder</h3>
208
209 <p>Du kan legge til nye tilgangsområder under denne noden. Merk at du
210   er begrenset til store og små bokstaver (kun små anbefales, områder
211   er case-sensitive) samt tall og bindestrek.</p>
212
213 <form method="post" action="addnode.pl">
214   <input type="hidden" name="csrftoken" value="$itkaclcommon::masked_csrf_token" />
215   <input type="hidden" name="parent" value="$entry" />
216   <table>
217     <tr style="text-align: left;">
218       <th>Sti:</th>
219       <td>
220         $path/<input name="name" size="16" />
221       </td>
222     </tr>
223     <tr style="text-align: left;">
224       <th>Beskrivelse</th>
225       <td>
226         <input name="description" size="50" />
227       </td>
228     </tr>
229     <tr>
230       <td colspan="2" style="text-align: center;">
231         <input type="submit" value="Legg til" />
232       </td>
233     </tr>
234   </table>
235 </form>
236
237 <h3>Slett dette området</h3>
238
239 EOF
240
241 $ref = $itkaclcommon::dbh->selectrow_hashref('SELECT COUNT(*) AS num_aclentries FROM aclentries WHERE object=?', undef, $entry);
242 if ($ref->{'num_aclentries'} > 0) {
243         print <<"EOF";
244 <p>Du kan ikke slette dette området ettersom det har tilordnet tilganger. Dersom du ønsker å
245   slette det må du først slette alle tilganger og eventuelle underområder.</p>
246 EOF
247 } else {
248         $ref = $itkaclcommon::dbh->selectrow_hashref('SELECT COUNT(*) AS num_children FROM objects WHERE parent=?', undef, $entry);
249         if ($ref->{'num_children'} > 0) {
250                 print <<"EOF";
251 <p>Du kan ikke slette dette området ettersom det har underområder. Dersom du ønsker å slette
252   det må du først slette alle underområdene.</p>
253 EOF
254         } else {
255                 print <<"EOF";
256 <p>Dersom du ønsker, kan du slette dette området. All tilgangskontroll mot det i fremtiden vil
257   feile, så sjekk grundig før du sletter det at det ikke fortsatt er i bruk.</p>
258   
259 <form method="post" action="deletenode.pl">
260   <input type="hidden" name="csrftoken" value="$itkaclcommon::masked_csrf_token" />
261   <input type="hidden" name="entry" value="$entry" />
262   <p><input type="submit" value="Slett dette området" /></p>
263 </form>
264 EOF
265         }
266 }
267
268 itkaclcommon::print_footer();