xref: /netbsd-src/external/bsd/openldap/dist/servers/slapd/back-perl/SampleLDAP.pm (revision e670fd5c413e99c2f6a37901bb21c537fcd322d2)
12de962bdSlukem# This is a sample Perl module for the OpenLDAP server slapd.
2d11b170bStron# $OpenLDAP$
32de962bdSlukem## This work is part of OpenLDAP Software <http://www.openldap.org/>.
42de962bdSlukem##
5*e670fd5cSchristos## Copyright 1998-2021 The OpenLDAP Foundation.
62de962bdSlukem## Portions Copyright 1999 John C. Quillan.
72de962bdSlukem## All rights reserved.
82de962bdSlukem##
92de962bdSlukem## Redistribution and use in source and binary forms, with or without
102de962bdSlukem## modification, are permitted only as authorized by the OpenLDAP
112de962bdSlukem## Public License.
122de962bdSlukem##
132de962bdSlukem## A copy of this license is available in the file LICENSE in the
142de962bdSlukem## top-level directory of the distribution or, alternatively, at
152de962bdSlukem## <http://www.OpenLDAP.org/license.html>.
16d11b170bStron
172de962bdSlukem# Usage: Add something like this to slapd.conf:
182de962bdSlukem#
192de962bdSlukem#	database	perl
202de962bdSlukem#	suffix		"o=AnyOrg,c=US"
212de962bdSlukem#	perlModulePath	/directory/containing/this/module
222de962bdSlukem#	perlModule	SampleLDAP
232de962bdSlukem#
242de962bdSlukem# See the slapd-perl(5) manual page for details.
25d11b170bStron#
26d11b170bStron# This demo module keeps an in-memory hash {"DN" => "LDIF entry", ...}
27d11b170bStron# built in sub add{} & co.  The data is lost when slapd shuts down.
282de962bdSlukem
292de962bdSlukempackage SampleLDAP;
302de962bdSlukemuse strict;
312de962bdSlukemuse warnings;
322de962bdSlukemuse POSIX;
332de962bdSlukem
342de962bdSlukem$SampleLDAP::VERSION = '1.01';
352de962bdSlukem
362de962bdSlukemsub new {
372de962bdSlukem    my $class = shift;
382de962bdSlukem
392de962bdSlukem    my $this = {};
402de962bdSlukem    bless $this, $class;
412de962bdSlukem    print {*STDERR} "Here in new\n";
422de962bdSlukem    print {*STDERR} 'Posix Var ' . BUFSIZ . ' and ' . FILENAME_MAX . "\n";
432de962bdSlukem    return $this;
442de962bdSlukem}
452de962bdSlukem
462de962bdSlukemsub init {
472de962bdSlukem    return 0;
482de962bdSlukem}
492de962bdSlukem
502de962bdSlukemsub search {
512de962bdSlukem    my $this = shift;
522de962bdSlukem    my ( $base, $scope, $deref, $sizeLim, $timeLim, $filterStr, $attrOnly,
532de962bdSlukem        @attrs )
542de962bdSlukem      = @_;
55d11b170bStron    print {*STDERR} "====$filterStr====\n";
562de962bdSlukem    $filterStr =~ s/\(|\)//gm;
572de962bdSlukem    $filterStr =~ s/=/: /m;
582de962bdSlukem
592de962bdSlukem    my @match_dn = ();
602de962bdSlukem    for my $dn ( keys %{$this} ) {
612de962bdSlukem        if ( $this->{$dn} =~ /$filterStr/imx ) {
622de962bdSlukem            push @match_dn, $dn;
632de962bdSlukem            last if ( scalar @match_dn == $sizeLim );
642de962bdSlukem
652de962bdSlukem        }
662de962bdSlukem    }
672de962bdSlukem
682de962bdSlukem    my @match_entries = ();
692de962bdSlukem
702de962bdSlukem    for my $dn (@match_dn) {
712de962bdSlukem        push @match_entries, $this->{$dn};
722de962bdSlukem    }
732de962bdSlukem
742de962bdSlukem    return ( 0, @match_entries );
752de962bdSlukem
762de962bdSlukem}
772de962bdSlukem
782de962bdSlukemsub compare {
792de962bdSlukem    my $this = shift;
802de962bdSlukem    my ( $dn, $avaStr ) = @_;
812de962bdSlukem    my $rc = 5;    # LDAP_COMPARE_FALSE
822de962bdSlukem
832de962bdSlukem    $avaStr =~ s/=/: /m;
842de962bdSlukem
852de962bdSlukem    if ( $this->{$dn} =~ /$avaStr/im ) {
862de962bdSlukem        $rc = 6;    # LDAP_COMPARE_TRUE
872de962bdSlukem    }
882de962bdSlukem
892de962bdSlukem    return $rc;
902de962bdSlukem}
912de962bdSlukem
922de962bdSlukemsub modify {
932de962bdSlukem    my $this = shift;
942de962bdSlukem
952de962bdSlukem    my ( $dn, @list ) = @_;
962de962bdSlukem
972de962bdSlukem    while ( @list > 0 ) {
982de962bdSlukem        my $action = shift @list;
992de962bdSlukem        my $key    = shift @list;
1002de962bdSlukem        my $value  = shift @list;
1012de962bdSlukem
1022de962bdSlukem        if ( $action eq 'ADD' ) {
1032de962bdSlukem            $this->{$dn} .= "$key: $value\n";
1042de962bdSlukem
1052de962bdSlukem        }
1062de962bdSlukem        elsif ( $action eq 'DELETE' ) {
1072de962bdSlukem            $this->{$dn} =~ s/^$key:\s*$value\n//im;
1082de962bdSlukem
1092de962bdSlukem        }
1102de962bdSlukem        elsif ( $action eq 'REPLACE' ) {
1112de962bdSlukem            $this->{$dn} =~ s/$key: .*$/$key: $value/im;
1122de962bdSlukem        }
1132de962bdSlukem    }
1142de962bdSlukem
1152de962bdSlukem    return 0;
1162de962bdSlukem}
1172de962bdSlukem
1182de962bdSlukemsub add {
1192de962bdSlukem    my $this = shift;
1202de962bdSlukem
1212de962bdSlukem    my ($entryStr) = @_;
1222de962bdSlukem
1232de962bdSlukem    my ($dn) = ( $entryStr =~ /dn:\s(.*)$/m );
1242de962bdSlukem
1252de962bdSlukem    #
1262de962bdSlukem    # This needs to be here until a normalized dn is
1272de962bdSlukem    # passed to this routine.
1282de962bdSlukem    #
1292de962bdSlukem    $dn = uc $dn;
1302de962bdSlukem    $dn =~ s/\s*//gm;
1312de962bdSlukem
1322de962bdSlukem    $this->{$dn} = $entryStr;
1332de962bdSlukem
1342de962bdSlukem    return 0;
1352de962bdSlukem}
1362de962bdSlukem
1372de962bdSlukemsub modrdn {
1382de962bdSlukem    my $this = shift;
1392de962bdSlukem
1402de962bdSlukem    my ( $dn, $newdn, $delFlag ) = @_;
1412de962bdSlukem
1422de962bdSlukem    $this->{$newdn} = $this->{$dn};
1432de962bdSlukem
1442de962bdSlukem    if ($delFlag) {
1452de962bdSlukem        delete $this->{$dn};
1462de962bdSlukem    }
1472de962bdSlukem    return 0;
1482de962bdSlukem
1492de962bdSlukem}
1502de962bdSlukem
1512de962bdSlukemsub delete {
1522de962bdSlukem    my $this = shift;
1532de962bdSlukem
1542de962bdSlukem    my ($dn) = @_;
1552de962bdSlukem
1562de962bdSlukem    print {*STDERR} "XXXXXX $dn XXXXXXX\n";
1572de962bdSlukem    delete $this->{$dn};
1582de962bdSlukem    return 0;
1592de962bdSlukem}
1602de962bdSlukem
1612de962bdSlukemsub config {
1622de962bdSlukem    my $this = shift;
1632de962bdSlukem
1642de962bdSlukem    my (@args) = @_;
1652de962bdSlukem    local $, = ' - ';
1662de962bdSlukem    print {*STDERR} @args;
1672de962bdSlukem    print {*STDERR} "\n";
1682de962bdSlukem    return 0;
1692de962bdSlukem}
1702de962bdSlukem
1712de962bdSlukem1;
172