diff options
Diffstat (limited to 'base/tps/lib/perl/PKI/TPS/Common.pm')
-rwxr-xr-x | base/tps/lib/perl/PKI/TPS/Common.pm | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/base/tps/lib/perl/PKI/TPS/Common.pm b/base/tps/lib/perl/PKI/TPS/Common.pm new file mode 100755 index 000000000..c66942599 --- /dev/null +++ b/base/tps/lib/perl/PKI/TPS/Common.pm @@ -0,0 +1,148 @@ +#!/usr/bin/perl +# +# --- BEGIN COPYRIGHT BLOCK --- +# This library is free software; you can redistribute it and/or +# modify it under the terms of the GNU Lesser General Public +# License as published by the Free Software Foundation; +# version 2.1 of the License. +# +# This library is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# Lesser General Public License for more details. +# +# You should have received a copy of the GNU Lesser General Public +# License along with this library; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, +# Boston, MA 02110-1301 USA +# +# Copyright (C) 2007 Red Hat, Inc. +# All rights reserved. +# --- END COPYRIGHT BLOCK --- +# + +package PKI::TPS::Common; + +use strict; +use warnings; +use Exporter; +use Mozilla::LDAP::Conn; +use Mozilla::LDAP::LDIF; + +use vars qw(@ISA @EXPORT @EXPORT_OK); +@ISA = qw(Exporter Autoloader); +@EXPORT = qw(r yes no import_ldif test_and_make_connection make_connection); + +$PKI::TPS::Common::VERSION = '1.00'; + +sub yes { + return sub {1}; +} + +sub no { + return sub {0}; +} + +sub r { + my $a = shift; + return sub { $a; } +} + +# special function to add schema elements. This assumes the entry +# is ldif update format with changetype "modify" and operation "add" +# +sub add_schema_update +{ + my ($conn, $aentry, $err_ref) = @_; + + my $sentry = $conn->search($aentry->{dn}, "base", "(objectclass=*)", 0, ("*", "aci")); + if (!$sentry) { + $$err_ref .= "Error: trying to update entry that does not exist: " . $aentry->{dn} . "\n"; + return 0; + } + + my @addtypes = ("attributeTypes", "objectClasses"); + + foreach my $attr (@addtypes) { + my @vals = $aentry->getValues($attr); + push @vals, $vals[0]; # HACK! for some reason, first value always fails with server unwilling to perform + + foreach my $val (@vals) { + $sentry->addValue( $attr, $val ); + $conn->update($sentry); + my $rc = $conn->getErrorCode(); + if ( $rc != 0 ) { + my $string = $conn->getErrorString(); + $$err_ref .= "Error: updating entry " . $sentry->{dn} . " with value $val : $string\n"; + } else { + $$err_ref .= "Updated entry ". $sentry->{dn} . " with value $val : rc = $rc\n"; + } + } + } + return 1; +} + +sub import_ldif +{ + my ($conn, $ldif_file, $msg_ref, $schema) = @_; + + if (!open( MYLDIF, "$ldif_file" )) { + $$msg_ref = "Could not open $ldif_file: $!\n"; + return 0; + } + + my $in = new Mozilla::LDAP::LDIF(*MYLDIF); + while (my $entry = readOneEntry $in) { + if (defined($schema) && ($schema == 1)) { + add_schema_update($conn, $entry, $msg_ref); + } else { + if (!$conn->add($entry)) { + $$msg_ref .= "Error: could not add entry " . $entry->getDN() . ":" . $conn->getErrorString() . "\n"; + } + } + } + close( MYLDIF ); + return 1; +} + +# this subroutine checks if an ldaps connection is successful first +# and then if an ldap connection is successful. +# This prevents a hanging condition when someone tries to connect to a ldaps +# port using LDAP +# +# The arg hash is assumed to have the certdir (key == cert) defined. + +sub test_and_make_connection +{ + my ($arg_ref, $secureconn, $msg_ref) = @_; + my $conn = new Mozilla::LDAP::Conn($arg_ref); + if ($conn) { #ldaps succeeds + if ($secureconn eq "false") { + $$msg_ref = "SSL not selected, but this looks like an SSL port."; + return undef; + } + } else { #ldaps failed + if ($secureconn eq "true") { + $$msg_ref = "Failed to connect to LDAPS port"; + return undef; + } + delete $arg_ref->{cert}; + $conn = new Mozilla::LDAP::Conn($arg_ref); + if (!$conn) { # ldap failed + $$msg_ref = "Failed to connect to LDAP port:"; + return undef; + } + } + return $conn; +} + +sub make_connection +{ + my ($arg_ref, $secureconn) = @_; + if ($secureconn eq "false") { + delete $arg_ref->{cert}; + } + return new Mozilla::LDAP::Conn($arg_ref); +} + +1; |