--- bin/ldap-rewrite.pl 2009/03/15 19:48:21 10 +++ bin/ldap-rewrite.pl 2009/03/16 18:11:12 27 @@ -9,6 +9,7 @@ use IO::Select; use IO::Socket; +use IO::Socket::SSL; use warnings; use Data::Dump qw/dump/; use Convert::ASN1 qw(asn_read); @@ -17,6 +18,35 @@ use fields qw(socket target); use YAML qw/LoadFile/; +my $config = { + yaml_dir => './yaml/', + listen => 'localhost:1389', + upstream_ldap => 'ldap.ffzg.hr', + upstream_ssl => 1, + overlay_prefix => 'ffzg-', + log_file => 'log', + +}; + +my $log_fh; + +sub log { + open($log_fh, '>', $config->{log_file}) || die "can't open ", $config->{log_file},": $!"; + $log_fh->autoflush(1); + print $log_fh join("\n", @_),"\n"; +} + +BEGIN { + $SIG{'__WARN__'} = sub { warn @_; main::log(@_); } +} + + +if ( ! -d $config->{yaml_dir} ) { + warn "DISABLE ", $config->{yaml_dir}," data overlay"; +} + +warn "# config = ",dump( $config ); + sub handle { my $clientsocket=shift; my $serversocket=shift; @@ -68,15 +98,23 @@ my $uid = $response->{protocolOp}->{searchResEntry}->{objectName}; warn "## SEARCH $uid"; -if(0) { + my @attrs; + map { - if ( $_->{type} eq 'postalAddress' ) { - $_->{vals} = [ 'foobar' ]; + if ( $_->{type} eq 'hrEduPersonUniqueNumber' ) { + foreach my $val ( @{ $_->{vals} } ) { + next if $val !~ m{.+:.+}; + my ( $n, $v ) = split(/\s*:\s*/, $val ); + push @attrs, { type => $_->{type} . '_' . $n, vals => [ $v ] }; + } } } @{ $response->{protocolOp}->{searchResEntry}->{attributes} }; -} - my $path = "yaml/$uid.yaml"; + warn "# ++ attrs ",dump( @attrs ); + + push @{ $response->{protocolOp}->{searchResEntry}->{attributes} }, $_ foreach @attrs; + + my $path = $config->{yaml_dir} . "$uid.yaml"; if ( -e $path ) { my $data = LoadFile($path); warn "# yaml = ",dump($data); @@ -84,12 +122,11 @@ foreach my $type ( keys %$data ) { my $vals = $data->{$type}; - $vals =~ s{#\s*$}{}; - - my @vals = split(/\s*#\s*/, $vals); - push @{ $response->{protocolOp}->{searchResEntry}->{attributes} }, - { type => "ffzg-$type", vals => [ @vals ] }; + push @{ $response->{protocolOp}->{searchResEntry}->{attributes} }, { + type => $config->{overlay_prefix} . $type, + vals => ref($vals) eq 'ARRAY' ? $vals : [ $vals ], + }; } } @@ -130,19 +167,24 @@ } +$ENV{LANG} = 'C'; # so we don't double-encode utf-8 if LANG is utf-8 + my $listenersock = IO::Socket::INET->new( Listen => 5, Proto => 'tcp', Reuse => 1, - LocalPort => 1389 + LocalAddr => $config->{listen}, ); -my $targetsock = new IO::Socket::INET ( - Proto => 'tcp', - PeerAddr => 'ldap.ffzg.hr', - PeerPort => 389, -); +my $targetsock = $config->{upstream_ssl} + ? IO::Socket::INET->new( + Proto => 'tcp', + PeerAddr => $config->{upstream_ldap}, + PeerPort => 389, + ) + : IO::Socket::SSL->new( $config->{upstream_ldap} . ':ldaps') + ; run_proxy($listenersock,$targetsock);