App-MultiLanguage

 view release on metacpan or  search on metacpan

lib/App/MultiLanguage/LDAP.pm  view on Meta::CPAN

#
# Copyright (c) 2008-2009 Pan Yu (xiaocong@vip.163.com). 
# All rights reserved.
# This program is free software; you can redistribute it and/or
# modify it under the same terms as Perl itself.
#

package App::MultiLanguage::LDAP;

use 5.006;
use strict;
use vars qw($VERSION @ISA);

$VERSION = '0.02';
@ISA     	= qw(App::MultiLanguage);

use Carp;
use Net::LDAP;
use App::MultiLanguage;


sub new {
	my $class = shift;
	my $type = ref($class) || $class;
	my $arg_ref = { @_ };
	
    my $self = bless {}, $type;
    
    if ($arg_ref->{host} =~ /(?:.+):(?:\d+)/) {
    	$self->{_ldap_server} = $arg_ref->{host};
    }else{
    	$self->{_ldap_server} .= (defined $arg_ref->{port})? ":$arg_ref->{port}":':389';
    }
	$self->{_ldap_base} = $arg_ref->{base};
	$self->{_ldap_user} = $arg_ref->{user} if (defined $arg_ref->{user});
	$self->{_ldap_pass} = $arg_ref->{password} if (defined $arg_ref->{password});
    
    eval { $self->_connect; };
    return undef if($@);
    
	$self;
}

sub parse {
	my $self = shift;
	
	$self->{search_args} = \@_;
	$self->_search;
	
	$self->SUPER::parse();
}

sub _connect {
	my $self = shift;
	
	my $ldap = Net::LDAP->new ($self->{_ldap_server}, port => $self->{_ldap_port})
			or croak "$!";
	$self->{handler} = $ldap;
	
	$self->_bind if (defined $self->{_ldap_user} && defined $self->{_ldap_pass} );
}

sub _bind {
	my $self = shift;
	
	my $result = $self->{handler}->bind($self->{_ldap_user}, 
		password => $self->{_ldap_pass},
		port     => $self->{_ldap_port} );
	croak "$!" if $result->code;
}

sub _search {
	my $self = shift;
	
	my $search_args = join ')(cn=', @{$self->{search_args}};
	my @attrs = ("cn", "en", $self->{language});
	my %search = ( base => $self->{_ldap_base},
				   scope => 'one',
				   filter => "(|(cn=$search_args))",	# (|(cn=categories)(cn=buy))
				   attrs => \@attrs );

	my $msg = $self->{handler}->search ( %search );
		croak $msg->error() if $msg->code();
	
	my %entries;
	foreach my $entry ($msg->entries()) {
		my $key = $entry->get_value('cn');
		$entries{$key} = $entry->get_value($self->{language}) || $entry->get_value('en');	# get the language you want. The default language is en.
	}
	$self->{result} = \%entries;
}


1;

__END__

=head1 NAME

App::MultiLanguage::LDAP - Multi-language support for applications

=head1 SYNOPSIS

  use App::MultiLanguage::LDAP;
  
  # two arguments 'host' and 'base' are required to make an instant connnection
  $object = new App::MultiLanguage::LDAP( host => '127.0.0.1',
                                          base => 'ou=language,dc=example,dc=com' );
  
  # set the display language expected in application



( run in 0.680 second using v1.01-cache-2.11-cpan-f56aa216473 )