\n);
}
}
sub action_detail
{
my $cn = param ('cn');
$cn = shift if (@_);
die unless ($cn);
my $person = LiCoM::Person->load ($cn);
if (!$person)
{
print qq(\t
Entry "$cn" could not be loaded from DB.
\n);
return;
}
print qq(\t\t
Details for $cn
\n);
my $cn_esc = uri_escape ($cn);
print <
Name
$cn
EOF
for (@MultiFields)
{
my $field = $_;
my $values = $person->get ($field);
my $num = scalar (@$values);
my $print = defined ($FieldNames{$field}) ? $FieldNames{$field} : $field;
next unless ($num);
print "\t\t\t
\n);
}
sub action_edit
{
my %opts = @_;
my $cn = param ('cn');
$cn = $opts{'cn'} if (defined ($opts{'cn'}));
$cn ||= '';
if (!$UserID)
{
$cn = $UserCN;
}
my $person;
my $lastname;
my $firstname;
my $contacts = {};
$contacts->{$_} = [] for (@MultiFields);
if ($cn)
{
$person = LiCoM::Person->load ($cn);
if (!$person)
{
print qq(\t
Unable to load CN "$cn". Sorry.
\n);
return;
}
$lastname = $person->lastname ();
$firstname = $person->firstname ();
for (@MultiFields)
{
$contacts->{$_} = $person->get ($_);
}
}
$lastname = param ('lastname') if (param ('lastname') and $UserID);
$firstname = param ('firstname') if (param ('firstname') and $UserID);
get_contacts ($contacts);
$lastname = $opts{'lastname'} if (defined ($opts{'lastname'}));
$firstname = $opts{'firstname'} if (defined ($opts{'firstname'}));
for (@MultiFields)
{
my $field = $_;
@{$contacts->{$field}} = @{$opts{$field}} if (defined ($opts{$field}));
}
if ($cn)
{
print "\t\t
Edit contact $cn
\n";
}
else
{
print "\t\t
Create new contact
\n";
}
print <
Lastname
EOF
if ($UserID)
{
print qq(\t\t\t\t
\n);
}
else
{
print qq(\t\t\t\t
$lastname
\n);
}
print <
Firstname
EOF
if ($UserID)
{
print qq(\t\t\t\t
\n);
}
else
{
print qq(\t\t\t\t
$firstname
\n);
}
print "\t\t\t
\n";
for (@MultiFields)
{
my $field = $_;
my $print = defined ($FieldNames{$field}) ? $FieldNames{$field} : $field;
my @values = @{$contacts->{$field}};
next if (!$UserID and $field eq 'group');
push (@values, '');
for (@values)
{
my $value = $_;
print <
$print
EOF
}
}
print <
EOF
if ($UserID)
{
print <
EOF
}
print <
EOF
}
sub action_save
{
my $cn = $UserID ? param ('cn') : $UserCN;
if (verify_fields ())
{
action_edit (cn => $cn);
return;
}
if ($cn)
{
action_update ();
return;
}
die unless ($UserID);
my $button = lc (param ('button'));
$button ||= 'save';
if ($button eq 'cancel')
{
action_browse ();
return;
}
if (!param ('lastname') or !param ('firstname'))
{
print qq(\t
You have to give both, first and lastname, to identify this record.
\n);
action_edit (cn => '');
return;
}
my $lastname = param ('lastname');
my $firstname = param ('firstname');
my $contacts = get_contacts ();
my $person = LiCoM::Person->create (lastname => $lastname, firstname => $firstname, %$contacts);
if (!$person)
{
print qq(\t
Unable to save entry. Sorry.
\n);
return;
}
$cn = $person->name ();
if ($button eq 'apply')
{
action_edit (cn => $cn);
}
else
{
action_detail ($cn);
}
}
sub action_update
{
my $cn = $UserID ? param ('cn') : $UserCN;
my $person = LiCoM::Person->load ($cn);
die unless ($person);
my $button = lc (param ('button'));
$button ||= 'save';
if ($UserID and $button eq 'cancel')
{
action_detail ($cn);
return;
}
if ($UserID)
{
my $lastname = param ('lastname');
my $firstname = param ('firstname');
$person->lastname ($lastname) if ($lastname and $lastname ne $person->lastname ());
$person->firstname ($firstname) if ($firstname and $firstname ne $person->firstname ());
$cn = $person->name ();
}
my $contacts = get_contacts ();
for (@MultiFields)
{
my $field = $_;
next if (!$UserID and $field eq 'group');
if (defined ($contacts->{$field}))
{
my $values = $contacts->{$field};
$person->set ($field, $values);
}
else
{
$person->set ($field, []);
}
}
if ($button eq 'apply' or !$UserID)
{
action_edit (cn => $cn);
}
else
{
action_detail ($cn);
}
}
sub action_vcard
{
my $cn = param ('cn');
$cn = shift if (@_);
die unless ($cn);
my $person = LiCoM::Person->load ($cn);
die unless ($person);
my %vcard_types =
(
homephone => 'TEL;TYPE=home,voice',
cellphone => 'TEL;TYPE=cell',
officephone => 'TEL;TYPE=work,voice',
fax => 'TEL;TYPE=fax',
mail => 'EMAIL',
uri => 'URL',
group => 'ORG'
);
my $sn = $person->lastname ();
my $gn = $person->firstname ();
my $cn_esc = uri_escape ($cn);
print <get ($field);
next unless ($vc_fld);
for (@$values)
{
my $value = $_;
print "$vc_fld:$value\n";
}
}
print "END:VCARD\n";
}
sub action_verify
{
my $cn = param ('cn');
$cn = shift if (@_);
die unless ($cn);
my $person = LiCoM::Person->load ($cn);
die unless ($person);
my ($mail) = $person->get ('mail');
$mail ||= '';
my $message;
my $password = $person->password ();
if (!$password)
{
$password = pwgen ();
$person->password ($password);
}
$message = qq(The password for the record "$cn" is "$password".);
if ($mail)
{
if (action_verify_send_mail ($person))
{
$message .= qq( A request for verification has been sent to $mail.);
}
}
else
{
$message .= q( There was no e-mail address, thus no verification request could be sent.);
}
print qq(\t\t
$message
\n);
action_detail ($cn);
}
sub action_verify_send_mail
{
my $person = shift;
my $owner = LiCoM::Person->load ($UserCN);
my $smh;
my ($owner_mail) = $owner->get ('mail');
if (!$owner_mail)
{
my $cn = uri_escape ($UserCN);
print qq(\t\t
You have no email set in your own profile. Edit it now!
\n);
return (0);
}
my $max_width = 0;
for (keys %FieldNames)
{
$max_width = length $FieldNames{$_} if ($max_width < length $FieldNames{$_});
}
$max_width++;
my $person_name = $person->name ();
my ($person_mail) = $person->get ('mail');
my $person_gn = $person->firstname ();
my $password = $person->password ();
my $host = $ENV{'HTTP_HOST'};
my $url = 'http://' . $host . $MySelf;
open ($smh, "| /usr/sbin/sendmail -t -f $owner_mail") or die ("open pipe to sendmail: $!");
print $smh <
From: $UserCN <$owner_mail>
Subject: Please verify our entry in my address book
Hello $person_gn,
the following is your entry in my address book:
EOM
for (@MultiFields)
{
my $field = $_;
my $print = defined ($FieldNames{$field}) ? $FieldNames{$field} : $field;
my @values = $person->get ($field);
for (@values)
{
printf $smh ('%'.$max_width."s: %-s\n", $print, $_);
}
}
print $smh <$title
EOF
if ($UserID)
{
my $search = param ('search') || '';
print <
EOF
}
print "\t\t
$title
\n";
}
sub html_end
{
print <
"Lightweight Contact Manager",
written 2005 by Florian octo Forster
<octo at verplant.org>