Handle hostnames with upper-case letters
[webmin.git] / ldap-server / edit_browser.cgi
1 #!/usr/local/bin/perl
2 # Show the LDAP server's data tree
3
4 require './ldap-server-lib.pl';
5 &ui_print_header(undef, $text{'browser_title'}, "", "browser");
6 $access{'browser'} || &error($text{'browser_ecannot'});
7 &ReadParse();
8
9 # Connect to LDAP server, or die trying
10 $ldap = &connect_ldap_db();
11 if (!ref($ldap)) {
12         print &text('browser_econn', $ldap),"<p>\n";
13         &ui_print_footer("", $text{'index_return'});
14         exit;
15         }
16
17 # Work out the base (current navigation level)
18 if ($in{'goparent'}) {
19         $base = $in{'parent'};
20         }
21 elsif (!$in{'base'}) {
22         $base = &get_ldap_base();
23         }
24 else {
25         $base = $in{'base'};
26         }
27
28 # Show current base (with option to change), and parent button
29 $formno = 0;
30 print &ui_form_start("edit_browser.cgi"),"\n";
31 print "<b>$text{'browser_base'}</b>\n";
32 print &ui_textbox("base", $base, 60)," ",&ui_submit($text{'browser_ok'}),"\n";
33 $parent = $base;
34 $parent =~ s/^[^,]+,\s*//;
35 if ($parent =~ /\S/) {
36         print &ui_hidden("parent", $parent),"\n";
37         print "&nbsp;&nbsp;\n";
38         print &ui_submit($text{'browser_parent'}, "goparent"),"\n";
39         }
40 print &ui_form_end();
41 $formno++;
42
43 # Show list of objects under the base, and its attributes
44 if ($in{'search'}) {
45         $filter = '(|'.join('', map { '('.$_.'=*'.$in{'search'}.'*)' }
46                                     @search_attrs).')';
47         }
48 else {
49         $filter = '(objectClass=*)';
50         }
51 $rv = $ldap->search(base => $base,
52                     filter => $filter,
53                     scope => 'one',
54                     sizelimit => int($config{'browse_max'}),
55                    );
56 @subs = sort { lc($a->dn()) cmp lc($b->dn()) } $rv->all_entries;
57 if ($rv->code && !@subs) {
58         # Search failed
59         print &text('browser_esearch', $rv->error),"<p>\n";
60         }
61 else {
62         # Start tabs for layout
63         $in{'mode'} ||= @subs || $in{'search'} ? "subs" : "attrs";
64         @tabs = ( [ 'subs', $text{'browser_subs'} ],
65                   [ 'attrs', $text{'browser_attrs'} ] );
66         print &ui_tabs_start(\@tabs, "browser", $in{'mode'}, 1);
67
68         # Show sub-objects, if any
69         print &ui_tabs_start_tab("browser", "subs");
70         @crlinks = ( "<a href='add_form.cgi?base=".
71                      &urlize($base)."'>$text{'browser_sadd'}</a>" );
72         if ($rv->code || ($in{'search'} && !@subs)) {
73                 # Too many to show
74                 if (@subs && $in{'search'}) {
75                         # Too many results
76                         print &text('browser_toomany2', "<i>$in{'search'}</i>",
77                                     $config{'browse_max'}),"<p>\n";
78                         }
79                 elsif (@subs) {
80                         # No search, many sub-objects
81                         print &text('browser_toomany',
82                                     $config{'browse_max'}),"<p>\n";
83                         }
84                 else {
85                         # No matches
86                         print &text('browser_nomatch',
87                                     "<i>$in{'search'}</i>"),"<p>\n";
88                         }
89                 &show_search_form($text{'browser_search'});
90                 print &ui_links_row(\@crlinks);
91                 }
92         elsif (@subs) {
93                 # Search result, so show form
94                 if ($in{'search'}) {
95                         &show_search_form($text{'browser_search2'});
96                         }
97
98                 # Can show some
99                 @tds = ( "width=90%", "width=10%" );
100                 if ($in{'rename'}) {
101                         # Rename form
102                         print &ui_form_start("rename_browser.cgi", "post");
103                         print &ui_hidden("old", $in{'rename'});
104                         }
105                 else {
106                         # Delete sub-objects form
107                         print &ui_form_start("sdelete_browser.cgi", "post");
108                         @tds = ( "width=5", @tds );
109                         @links = ( &select_all_link("d", $formno),
110                                    &select_invert_link("d", $formno),
111                                    @crlinks,
112                                  );
113                         }
114                 print &ui_hidden("base", $base);
115                 print &ui_links_row(\@links);
116                 print &ui_columns_start([ $in{'rename'} ? ( ) : ( "" ),
117                                           $text{'browser_sub'},
118                                           $text{'browser_acts'},
119                                         ], 100, 0, \@tds);
120                 foreach $dn (@subs) {
121                         $link = "<a href='edit_browser.cgi?base=".
122                                 &urlize($dn->dn())."'>".
123                                 &html_escape($dn->dn())."</a>";
124                         @alinks = ( "<a href='edit_browser.cgi?base=".
125                                     &urlize($base)."&mode=subs".
126                                     "&rename=".&urlize($dn->dn()).
127                                     "'>$text{'browser_rename'}</a>" );
128                         if ($in{'rename'} eq $dn->dn()) {
129                                 # Renaming this one
130                                 @alinks = ( "<a href='edit_browser.cgi?base=".
131                                             &urlize($base)."&mode=subs".
132                                             "'>$text{'browser_cancel'}</a>" );
133                                 print &ui_columns_row([
134                                         &ui_textbox("rename", $dn->dn(), 70),
135                                         &ui_links_row(\@alinks) ], \@tds);
136                                 }
137                         elsif ($in{'rename'}) {
138                                 # Display, no delete
139                                 print &ui_columns_row([
140                                         $link,&ui_links_row(\@alinks) ], \@tds);
141                                 }
142                         else {
143                                 # Rename or select for delete
144                                 print &ui_checked_columns_row([
145                                         $link, &ui_links_row(\@alinks) ],
146                                         \@tds, "d", $dn->dn());
147                                 }
148                         }
149                 print &ui_columns_end();
150                 print &ui_links_row(\@links);
151                 print &ui_form_end([ [ undef,
152                         $in{'rename'} ? $text{'browser_rsave'}
153                                       : $text{'browser_sdelete'} ] ]);
154                 $formno++;
155                 }
156         else {
157                 # Nothing to show
158                 print "<i>$text{'browser_subnone'}</i><p>\n";
159                 print &ui_links_row(\@crlinks);
160                 }
161         print &ui_tabs_end_tab();
162         
163         # Show attributes
164         print &ui_tabs_start_tab("browser", "attrs");
165         $rv2 = $ldap->search(base => $base,
166                              filter => '(objectClass=*)',
167                              scope => 'base');
168         ($bo) = $rv2->all_entries;
169         @attrs = sort { lc($a) cmp lc($b) } $bo->attributes();
170         if (@attrs) {
171                 # Show all attributes
172                 @tds = ( "valign=top width=45%", "valign=top width=45%",
173                          "width=5% valign=top" );
174                 if ($in{'edit'}) {
175                         # Editing form
176                         print &ui_form_start("save_browser.cgi", "post");
177                         print &ui_hidden("edit", $in{'edit'});
178                         }
179                 elsif ($in{'add'}) {
180                         # Add form
181                         print &ui_form_start("add_browser.cgi", "post");
182                         }
183                 else {
184                         # Deleting form
185                         print &ui_form_start("delete_browser.cgi", "post");
186                         @links = ( &select_all_link("d", $formno),
187                                    &select_invert_link("d", $formno),
188                                    "<a href='edit_browser.cgi?base=".
189                                    &urlize($bo->dn())."&add=1&mode=attrs'>".
190                                    "$text{'browser_add'}</a>",
191                                    "<a href='add_form.cgi?base=".
192                                    &urlize($base)."&clone=1'>".
193                                    "$text{'browser_clone'}</a>" );
194                         @tds = ( "width=5", @tds );
195                         }
196                 print &ui_hidden("base", $bo->dn());
197                 print &ui_hidden("mode", "attrs");
198                 print &ui_links_row(\@links);
199                 print &ui_columns_start([
200                         $in{'edit'} || $in{'add'} ? ( ) : ( "" ),
201                         $text{'browser_name'},
202                         $text{'browser_value'},
203                         $text{'browser_acts'} ], 100, 0, \@tds);
204                 foreach $a (@attrs) {
205                         @v = $bo->get_value($a);
206                         @alinks = ( "<a href='edit_browser.cgi?base=".
207                                     &urlize($bo->dn())."&mode=attrs".
208                                     "&edit=$a'>$text{'browser_edit'}</a>" );
209                         @cols = ( $a, join(", ", @v),
210                                   &ui_links_row(\@alinks),
211                                 );
212                         if ($in{'edit'} eq $a) {
213                                 # Edit this one
214                                 @alinks = ( "<a href='edit_browser.cgi?base=".
215                                             &urlize($bo->dn())."&mode=attrs".
216                                             "'>$text{'browser_cancel'}</a>" );
217                                 print &ui_columns_row([
218                                   $a, &ui_textarea("value", join("\n", @v),
219                                                    scalar(@v)+1, 60),
220                                   &ui_links_row(\@alinks),
221                                   ], \@tds);
222                                 }
223                         elsif ($in{'edit'} || $in{'add'}) {
224                                 # Display, no delete
225                                 print &ui_columns_row(\@cols, \@tds);
226                                 }
227                         else {
228                                 # Edit or select for delete
229                                 print &ui_checked_columns_row(
230                                         \@cols, \@tds, "d", $a);
231                                 }
232                         }
233                 if ($in{'add'}) {
234                         # Show row to add an attribute
235                         @alinks = ( "<a href='edit_browser.cgi?base=".
236                                     &urlize($bo->dn())."&mode=attrs".
237                                     "'>$text{'browser_cancel'}</a>" );
238                         print &ui_columns_row([
239                                 &ui_textbox("add", undef, 20),
240                                 &ui_textbox("value", undef, 60),
241                                 &ui_links_row(\@alinks),
242                                 ], \@tds);
243                         }
244                 print &ui_columns_end();
245                 print &ui_links_row(\@links);
246                 print &ui_form_end([ [ undef, $in{'edit'} ? $text{'save'} :
247                                               $in{'add'} ? $text{'create'} :
248                                                 $text{'browser_delete'} ] ]);
249                 $formno++;
250                 }
251         else {
252                 print "<i>$text{'browser_attrnone'}</i><p>\n";
253                 print &ui_links_row(\@links);
254                 }
255         print &ui_tabs_end_tab();
256
257         print &ui_tabs_end(1);
258         }
259
260 $ldap->disconnect();
261 &ui_print_footer("", $text{'index_return'});
262
263 sub show_search_form
264 {
265 local ($msg) = @_;
266 print &ui_form_start("edit_browser.cgi");
267 print &ui_hidden("base", $base);
268 print "<b>$msg</b>\n";
269 print &ui_textbox("search", $in{'search'}, 40),"\n";
270 print &ui_submit($text{'browser_sok'}),"<p>\n";
271 print &ui_form_end();
272 $formno++;
273 }
274