8 use CGI::Carp (qw(fatalsToBrowser));
17 our @MultiFields = (qw(address homephone cellphone officephone fax mail uri group));
19 our $MySelf = $ENV{'SCRIPT_NAME'};
21 our $Action = param ('action');
22 $Action ||= 'default';
26 default => \&action_default,
27 edit => \&action_edit,
28 save => \&action_save,
29 search => \&action_search
34 # make sure AuthLDAPRemoteUserIsDN is enabled.
35 die unless ($ENV{'REMOTE_USER'});
36 $Config{'base_dn'} = $ENV{'REMOTE_USER'};
40 uri => $Config{'uri'},
41 base_dn => $Config{'base_dn'},
42 bind_dn => $Config{'bind_dn'},
43 password => $Config{'password'}
46 our ($UserCN, $UserID) = Person->get_user ($Config{'base_dn'});
48 if (!$UserID and $Action ne 'save')
54 Content-Type: text/html; charset=UTF-8
58 print_html_start ("octo's Address Book");
65 if (!defined ($Actions{$Action}))
70 $Actions{$Action}->();
72 print qq#<div>Authenticated as ($UserCN, $UserID, #, $Config{'base_dn'}, qq#)</div>\n#;
76 Person->disconnect ();
84 print "<code>action_default</code>\n";
89 print "<code>action_search</code>\n";
96 my $cn = param ('cn');
98 $cn = $opts{'cn'} if (defined ($opts{'cn'}));
112 $contacts->{$_} = [] for (@MultiFields);
116 $person = Person->load ($cn);
120 print qq(\t<div class="error">Unable to load CN "$cn". Sorry.</div>\n);
124 $lastname = $person->lastname ();
125 $firstname = $person->firstname ();
126 $contacts->{'address'} = $person->address ();
127 $contacts->{'homephone'} = $person->homephone ();
128 $contacts->{'cellphone'} = $person->cellphone ();
129 $contacts->{'officephone'} = $person->officephone ();
130 $contacts->{'fax'} = $person->fax ();
131 $contacts->{'mail'} = $person->mail ();
132 $contacts->{'uri'} = $person->uri ();
133 $contacts->{'group'} = $person->group ();
136 $lastname = param ('lastname') if (param ('lastname') and $UserID);
137 $firstname = param ('firstname') if (param ('firstname') and $UserID);
139 get_contacts ($contacts);
141 $lastname = $opts{'lastname'} if (defined ($opts{'lastname'}));
142 $firstname = $opts{'firstname'} if (defined ($opts{'firstname'}));
146 @{$contacts->{$field}} = @{$opts{$field}} if (defined ($opts{$field}));
151 print "<h2>Edit contact $cn</h2>\n";
155 print "<h2>Create new contact</h2>\n";
160 my $selected = @_ ? shift : '';
164 [none => '-- Contact --'],
165 [address => 'Address'],
166 [homephone => 'Home Phone'],
167 [cellphone => 'Cellphone'],
168 [officephone => 'Office Phone'],
171 [uri => 'URI (Homepage)'],
175 print qq(<select name="c_type">\n);
178 my ($field, $print) = @$_;
179 my $sel = $field eq $selected ? ' selected="selected"' : '';
180 print qq(\t\t\t\t<option value="$field"$sel>$print</option>\n);
182 print qq(\t\t\t</select>);
186 <form action="$MySelf" method="post">
187 <input type="hidden" name="action" value="save" />
188 <input type="hidden" name="cn" value="$cn" />
195 print qq(\t\t\t<td><input type="text" name="lastname" value="$lastname" /></td>\n);
199 print qq(\t\t\t<td>$lastname</td>\n);
208 print qq(\t\t\t<td><input type="text" name="firstname" value="$firstname" /></td>\n);
212 print qq(\t\t\t<td>$firstname</td>\n);
220 my @values = @{$contacts->{$field}};
222 @values = ('') unless (@values);
230 print "</td>\n", <<EOF;
231 <td><input type="text" name="c_value" value="$value" /></td>
240 print "</td>\n", <<EOF;
241 <td><input type="text" name="c_value" value="" /></td>
244 <td colspan="2"><input type="submit" name="button" value="Save" /></td>
253 my $cn = $UserID ? param ('cn') : $UserCN;
261 die unless ($UserID);
263 if (!param ('lastname') or !param ('firstname'))
265 print qq(\t<div class="error">You have to give both, first and lastname, to identify this record.</div>\n);
266 action_edit (cn => '');
270 my $lastname = param ('lastname');
271 my $firstname = param ('firstname');
273 my $contacts = get_contacts ();
275 my $person = Person->create (lastname => $lastname, firstname => $firstname, %$contacts);
279 print qq(\t<div class="error">Unable to save entry. Sorry.</div>\n);
283 $cn = $person->name ();
285 action_edit (cn => $cn);
290 my $cn = $UserID ? param ('cn') : $UserCN;
291 my $person = Person->load ($cn);
293 die unless ($person);
297 my $lastname = param ('lastname');
298 my $firstname = param ('firstname');
300 $person->lastname ($lastname) if ($lastname);
301 $person->firstname ($firstname) if ($firstname);
303 $cn = $person->name ();
306 my $contacts = get_contacts ();
312 if (defined ($contacts->{$field}))
314 my $values = $contacts->{$field};
315 $person->set ($field, $values);
319 $person->set ($field, []);
323 action_edit (cn => $cn);
329 $title = 'Search for names' unless ($title);
334 <title>$title</title>
335 <style type="text/css">
340 background-color: white;
346 background-color: yellow;
350 border: 2px solid red;
356 background-color: white;
360 border-top: 1px solid black;
378 background-color: #cccccc;
384 background-color: #999999;
395 my $search = param ('search') || '';
398 <form action="$MySelf" method="post">
399 <input type="hidden" name="action" value="search" />
400 <input type="text" name="search" value="$search" />
401 <input type="submit" name="button" value="Search" />
403 <form action="$MySelf" method="post">
404 <input type="hidden" name="action" value="edit" />
405 <input type="hidden" name="dn" value="" />
406 <input type="submit" name="button" value="Add New" />
412 print "\t<h1>octo's lightweight address book</h1>\n";
418 <div class="foot">octo's Address Book <octo at verplant.org></div>
426 my $file = '/var/www/html/cgi.verplant.org/address/book.conf';
429 open ($fh, "< $file") or die ("open ($file): $!");
435 if ($line =~ m/^(\w+):\s*"(.+)"\s*$/)
440 $Config{$key} = $val;
446 for (qw(uri bind_dn password))
448 die ("Not defined: $_") unless (defined ($Config{$_}));
454 my $contacts = @_ ? shift : {};
456 if (param ('c_value'))
458 my @c_values = param ('c_value');
459 my @c_types = param ('c_type');
463 die if (scalar (@c_values) != scalar (@c_types));
465 for (my $i = 0; $i < scalar (@c_values); $i++)
467 my $type = $c_types[$i];
468 my $value = $c_values[$i];
470 $cts{$type} = [] unless (defined ($cts{$type}));
471 push (@{$cts{$type}}, $value) if ($value);
477 @{$contacts->{$type}} = @{$cts{$type}} if (defined ($cts{$type}));