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