From: octo Date: Sat, 7 May 2005 08:25:13 +0000 (+0000) Subject: Foo X-Git-Tag: Release-0.3~6 X-Git-Url: https://git.octo.it/?p=licom.git;a=commitdiff_plain;h=4c5254efaa25f9fbb401ea66cee3430bcde41bd2 Foo --- diff --git a/lib/LiCoM/Group.pm b/lib/LiCoM/Group.pm index e828115..79530f1 100644 --- a/lib/LiCoM/Group.pm +++ b/lib/LiCoM/Group.pm @@ -43,13 +43,41 @@ sub load { my $pkg = shift; my $name = shift; - my $member_dn = _cn_to_dn ($name); + my $obj; + + my $mesg = $Ldap->search + ( + base => get_config ('base_dn'), + filter => "(&(objectClass=groupOfNames)(cn=$name))" + ); + + if ($mesg->is_error ()) + { + warn ("Error while querying LDAP server: " . $mesg->error_text ()); + return (undef); + } + + for ($mesg->entries ()) + { + my $entry = $_; + $obj = new ($pkg, $entry); + last; + } + + return ($obj); +} + +sub load_by_member +{ + my $pkg = shift; + my $cn = shift; + my $dn = _cn_to_dn ($cn); my @retval = (); my $mesg = $Ldap->search ( base => get_config ('base_dn'), - filter => "(&(objectClass=groupOfNames)(|(cn=$name)(member=$member_dn)))" + filter => "(&(objectClass=groupOfNames)(member=$dn))" ); if ($mesg->is_error ()) @@ -67,10 +95,11 @@ sub load return (@retval); } -=item LiCoM::Group-EB (I<$name>, I<$description>, I<@members>) + +=item LiCoM::Group-EB (I<$name>, I<$description>, I<@member_cns>) Creates and returns a new group. At least one member has to be given to meet -LDAP requirements. I<@members> is an array of B-objects. +LDAP requirements. I<@members> is an array of CNs. =cut @@ -81,12 +110,14 @@ sub create ($$$@) my $desc = shift; my @members = @_; my $dn = _cn_to_dn ($name); + my ($ou) = get_config ('base_dn') =~ m/\bou\s*=\s*([^,]+)/i; my $entry = Net::LDAP::Entry->new (); $entry->add (objectClass => [qw(top groupOfNames)]); + $entry->add (ou => $ou); $entry->add (cn => $name); - $entry->add (member => [map { $_->get ('dn') } (@members)]); + $entry->add (member => [map { _cn_to_dn ($_) } (@members)]); $entry->add (description => $desc); $entry->dn ($dn); diff --git a/lib/LiCoM/Person.pm b/lib/LiCoM/Person.pm index 6ba43a9..20a6690 100644 --- a/lib/LiCoM/Person.pm +++ b/lib/LiCoM/Person.pm @@ -105,6 +105,7 @@ sub create my %hash = @_; my $entry = Net::LDAP::Entry->new (); my $dn; + my $ou; $entry->add (objectClass => [qw(top organizationalUnit person organizationalPerson inetOrgPerson)]); @@ -165,8 +166,9 @@ sub create } $dn = "cn=$sn $gn," . get_config ('base_dn'); + ($ou) = get_config ('base_dn') =~ m/\bou\s*=\s*([^,]+)/i; - $entry->add (cn => "$sn $gn"); + $entry->add (cn => "$sn $gn", ou => $ou); $entry->dn ($dn); $entry->changetype ('add'); diff --git a/licom.cgi b/licom.cgi index f0dfd12..015c34b 100755 --- a/licom.cgi +++ b/licom.cgi @@ -109,85 +109,60 @@ sub action_browse $group = shift if (@_); $group ||= ''; - return (''); - - my @all; - if ($group) - { - @all = LiCoM::Person->search ([[group => $group]]); - } - else - { - @all = LiCoM::Person->search (); - } - if (!$group) { - my @nogroup = (); - my %groups = (); - for (@all) - { - my $person = $_; - my @g = $person->get ('group'); - - $groups{$_} = (defined ($groups{$_}) ? $groups{$_} + 1 : 1) for (@g); - - push (@nogroup, $person) if (!@g); - } - @all = @nogroup; + my @groups = LiCoM::Group->all (); print qq(\t\t

Contact Groups

\n\t\t
    \n); - for (sort (keys (%groups))) + for (@groups) { my $group = $_; - my $group_esc = uri_escape ($group); - my $num = $groups{$group}; - - print qq(\t\t\t
  • $group ($num)
  • \n); + my @members = $group->get_members (); + my $members = scalar (@members); + my $group_name = $group->name (); + my $group_esc = uri_escape ($group_name); + my $desc = $group->description (); + + print qq#\t\t\t
  • $group_name ($members Members)#; + print qq(
    \n\t\t\t\t$desc) if ($desc); + print "
  • \n"; } - if (!%groups) + if (!@groups) { print qq(\t\t\t
  • There are no groups yet.
  • \n); } - print qq(\t\t
\n\n); - } - - if ($group) - { - print qq(\t\t

Contact Group "$group"

\n); + print < + +EOF } else { - print qq(\t\t

Contacts without a group

\n); - } - - print qq(\t\t
    \n); - for (sort { $a->name () cmp $b->name () } (@all)) - { - my $person = $_; - my $cn = $person->name (); - my $cn_esc = uri_escape ($cn); - - print qq(\t\t\t
  • $cn
  • \n); - } - if (!@all) - { - print "\t\t\t
  • There are no matching entries.
  • \n"; - } - print qq(\t\t
\n\n); + my $group_obj = LiCoM::Group->load ($group); + my $group_esc = uri_escape ($group_obj->name ()); + my @member_names = $group_obj->get_members (); + + print qq(\t\t

Contact Group "$group"

\n), + qq(\t\t
    \n); + for (sort (@member_names)) + { + my $cn = $_; + my $cn_esc = uri_escape ($cn); - print qq(\t\t\n); } sub action_list @@ -505,26 +480,34 @@ EOF if ($UserID) { - my %c_groups = map { $_ => 1 } (@{$contacts->{'group'}}); - my %a_groups = (); - my @a_persons = LiCoM::Person->search (); + my @all_groups = LiCoM::Group->all (); - for (@a_persons) + if (@all_groups) { - $a_groups{$_} = 1 for ($_->get ('group')); - } + print "\t\t\t\n", + "\t\t\t\tGroup(s)\n", + qq(\t\t\t\t\n); - for (sort (keys %a_groups)) - { - my $group = $_; - my $selec = defined ($c_groups{$group}) ? ' selected="selected"' : ''; + for (@all_groups) + { + my $group = $_; + my $group_name = $group->name (); + my $selected = ''; + + if (grep { $cn eq $_ } ($group->get_members ())) + { + $selected = ' selected="selected"'; + } - print qq(\t\t\t\t\t\n); + print qq(\t\t\t\t\t\n); + } + print "\t\t\t\t\n", + "\t\t\t\n"; } - print "\t\t\t\t\n", + + print "\t\t\t\n", + "\t\t\t\tNew Group\n", + qq(\t\t\t\t\n), "\t\t\t\n"; } @@ -597,6 +580,28 @@ sub action_save $cn = $person->name (); + for (param ('group')) + { + my $group_name = $_; + my $group = LiCoM::Group->load ($group_name); + + if ($group) + { + $group->add_members ($cn); + } + else + { + print qq(\t
    Group "$group_name" does not exist or could not be loaded.
    \n); + } + } + + if (param ('newgroup')) + { + # FIXME add error handling + my $group_name = param ('newgroup'); + LiCoM::Group->create ($group_name, '', $cn); + } + if ($button eq 'apply') { action_edit (cn => $cn); @@ -632,6 +637,7 @@ sub action_update $person->firstname ($firstname) if ($firstname and $firstname ne $person->firstname ()); $cn = $person->name (); + # FIXME Fix groups } my $contacts = get_contacts (); @@ -653,6 +659,38 @@ sub action_update } } + my %changed_groups = map { $_ => 1 } (param ('group')); + my @current_groups = LiCoM::Group->load_by_member ($cn); + + for (@current_groups) + { + my $group_obj = $_; + my $group_name = $group_obj->name (); + + if (!defined ($changed_groups{$group_name})) + { + $group_obj->del_members ($cn); + } + else + { + delete ($changed_groups{$group_name}); + } + } + for (keys %changed_groups) + { + my $group_name = $_; + my $group_obj = LiCoM::Group->load ($group_name) or die; + + $group_obj->add_members ($cn); + } + + if (param ('newgroup')) + { + # FIXME add error handling + my $group_name = param ('newgroup'); + LiCoM::Group->create ($group_name, '', $cn); + } + if ($button eq 'apply' or !$UserID) { action_edit (cn => $cn);