Commit 5ba11780 authored by Xavier Guimard's avatar Xavier Guimard

LEMONLDAP::NG : New Makefile in progress. Debian install is broken for now.

parent 82fd48c9
This diff is collapsed.
NameVirtualHost *
# Perl environment
PerlRequire __DIR__/handler/MyHandler.pm
PerlRequire __HANDLER__
<Files ~ "\.(pl)$">
SetHandler perl-script
PerlHandler Apache::Registry
......@@ -20,8 +20,8 @@ LogLevel warn
ServerName auth.__DNSDOMAIN__
# DocumentRoot
DocumentRoot __DIR__/portal/
<Directory __DIR__/portal/>
DocumentRoot __PORTALDIR__
<Directory __PORTALDIR__>
Order allow,deny
Allow from all
Options +ExecCGI
......@@ -34,8 +34,8 @@ LogLevel warn
ServerName manager.__DNSDOMAIN__
# DocumentRoot
DocumentRoot __DIR__/manager/
<Directory __DIR__/manager/>
DocumentRoot __MANAGERDIR__
<Directory __MANAGERDIR__>
Order deny,allow
Deny from all
Allow from 127.0.0.0/8
......@@ -43,8 +43,8 @@ LogLevel warn
</Directory>
# On-line documentation
Alias /docs/ __DIR__/docs/
<Directory __DIR__/docs/>
Alias /docs/ __DOCDIR__/docs/
<Directory __DOCDIR__/docs/>
Order deny,allow
Allow from all
</Directory>
......@@ -59,8 +59,8 @@ LogLevel warn
PerlHeaderParserHandler My::Package
# DocumentRoot
DocumentRoot __DIR__/test/
<Directory __DIR__/test/>
DocumentRoot __TESTDIR__
<Directory __TESTDIR__>
Order deny,allow
Allow from all
Options +ExecCGI
......@@ -93,8 +93,8 @@ LogLevel warn
PerlHeaderParserHandler My::Package
# DocumentRoot
DocumentRoot __DIR__/test/
<Directory __DIR__/test/>
DocumentRoot __TESTDIR__
<Directory __TESTDIR__>
Order deny,allow
Allow from all
Options +ExecCGI
......@@ -119,3 +119,4 @@ LogLevel warn
#</Location>
</VirtualHost>
NameVirtualHost *
# Perl environment
PerlRequire __DIR__/handler/MyHandler.pm
PerlRequire __HANDLER__
PerlOptions +GlobalRequest
<Files ~ "\.(pl)$">
SetHandler perl-script
......@@ -22,8 +22,8 @@ LogLevel warn
ServerName auth.__DNSDOMAIN__
# DocumentRoot
DocumentRoot __DIR__/portal/
<Directory __DIR__/portal/>
DocumentRoot __PORTALDIR__
<Directory __PORTALDIR__>
Order allow,deny
Allow from all
Options +ExecCGI
......@@ -36,8 +36,8 @@ LogLevel warn
ServerName manager.__DNSDOMAIN__
# DocumentRoot
DocumentRoot __DIR__/manager/
<Directory __DIR__/manager/>
DocumentRoot __MANAGERDIR__
<Directory __MANAGERDIR__>
Order deny,allow
Deny from all
Allow from 127.0.0.0/8
......@@ -45,8 +45,8 @@ LogLevel warn
</Directory>
# On-line documentation
Alias /docs/ __DIR__/docs/
<Directory __DIR__/docs/>
Alias /docs/ __DOCDIR__/docs/
<Directory __DOCDIR__/docs/>
Order deny,allow
Allow from all
</Directory>
......@@ -61,8 +61,8 @@ LogLevel warn
PerlHeaderParserHandler My::Package
# DocumentRoot
DocumentRoot __DIR__/test/
<Directory __DIR__/test/>
DocumentRoot __TESTDIR__
<Directory __TESTDIR__>
Order deny,allow
Allow from all
Options +ExecCGI
......@@ -95,8 +95,8 @@ LogLevel warn
PerlHeaderParserHandler My::Package
# DocumentRoot
DocumentRoot __DIR__/test/
<Directory __DIR__/test/>
DocumentRoot __TESTDIR__
<Directory __TESTDIR__>
Order deny,allow
Allow from all
Options +ExecCGI
......
#!/usr/bin/perl
#================================================
# LemonLDAP::NG default test page
# Display headers and environment
#================================================
# Init CGI
use CGI;
my $cgi = CGI->new;
# GET parameters
my $name = $cgi->param("name") || "LemonLDAP::NG sample protected application";
my $color = $cgi->param("color") || "#ddd";
# Local parameters
my $manager_url = "http://manager.__DNSDOMAIN__";
my $portal_url = "http://auth.__DNSDOMAIN__";
# CSS
my $css = <<EOT;
body{
background:$color;
font-family:sans-serif;
font-size:11pt;
padding:0 5%;
margin:0;
}
#content{
background:#fff;
padding:10px;
}
#menu{
text-align:center;
margin-top:30px;
}
a{
text-decoration:none;
font-weight:bold;
}
h1{
font-size:16pt;
text-align:center;
margin:5px 100px;
border:2px solid $color;
}
h2{
border-bottom:2px solid $color;
}
p.note{
border:1px solid #ccc;
padding:5px;
background:#eee;
}
table{
border:1px solid #ccc;
border-collapse:collapse;
margin:5px 0;
width:100%;
font-size:small;
}
tr{
border:1px dotted #ccc;
}
tr:hover{
background:#eee;
}
th{
background:#eee;
}
td, th{
padding:3px 5px;
}
td.emphase{
background-color:#eee;
font-weight:bold;
}
EOT
# Read headers
my %headers;
foreach(sort keys %ENV) {
if($_ =~ /^HTTP_/) {
($a=$_) =~ s/^HTTP_//i;
$a = join '-', map {ucfirst(lc)} split '_',$a;
$headers->{$a} = $_;
}
}
# Display page
print $cgi->header;
print $cgi->start_html( -title => "$name",
-style => { -code => $css } );
print "<div id=\"content\">\n";
print "<h1>$name</h1>\n";
print "<div id=\"menu\"><a href=\"$portal_url\">Portal</a> - <a href=\"/logout\">Logout</a></div>\n";
print "<h2>Main informations</h2>\n";
print "<ul>\n";
print "<li>Authentication status: SUCCESS</li>\n";
print "<li>Connected user: <ul>\n";
print "<li><tt>\$ENV{HTTP_AUTH_USER}</tt>: $ENV{HTTP_AUTH_USER}</li>\n";
print "<li><tt>\$ENV{REMOTE_USER}</tt>: $ENV{REMOTE_USER}</li>\n";
print "</ul></li>\n";
print "</ul>\n";
print "<p class=\"note\">Be carefull, the <tt>\$ENV{REMOTE_USER}</tt> is set only if your script is
in the same server than Lemonldap::NG Handler (<tt>\$whatToTrace</tt> parameter). If you use
it on a reverse-proxy, <tt>\$ENV{REMOTE_USER}</tt> is not set.</p>\n";
print "<h2>HTTP headers</h2>\n";
print "<p>To know who is connected in your applications, you can read HTTP headers:</p>\n";
print "<table>\n";
print "<tr><th>Header</th><th>Perl CGI</th><th>PHP script</th><th>Value</th></tr>\n";
foreach(sort keys %$headers) {
$style = $_ eq 'Auth-User' ? 'class="emphase"' : '';
print "<tr>
<td $style>$_</td>
<td $style><tt>\$ENV{$headers->{$_}}</tt></td>
<td $style><tt>\$_SERVER{$headers->{$_}}</tt></td>
<td $style>$ENV{$headers->{$_}}</td>
</tr>\n"
}
print "</table>\n";
print "<p class=\"note\">Note that Lemonldap::NG cookie is hidden. So that application developpers can
not spoof sessions.</p>\n";
print "<p class=\"note\">You can access to any information (IP address or LDAP attribute) by customizing
exported headers with the <a href=\"$manager_url\">Lemonldap::NG Management interface</a></p>\n";
print "<h2>Environment for Perl CGI</h2>\n";
print "<table>\n";
print "<tr><th>Environment variable</th><th>Value</th></tr>\n";
foreach(sort keys %ENV) {
my $tmp = $ENV{$_};
$tmp =~ s/&/&amp;/g;
$tmp =~ s/>/&gt;/g;
$tmp =~ s/</&lt;/g;
print "<tr><td>$_</td><td>=&gt; $tmp</td></tr>\n";
}
print "</table>\n";
print "</div>\n";
print $cgi->end_html;
Revision history for Perl extension Lemonldap::NG::Common.
0.1 Mon Nov 17 16:34:56 2008
0.9 Mon Nov 17 16:34:56 2008
- New package including the old Lemonldap::NG::manager::Conf
......@@ -13,8 +13,10 @@ MANIFEST
META.yml Module meta-data (added by MakeMaker)
README
scripts/lmConfig_File2MySQL
storage.conf
t/01-Manager-Conf.t
t/02-Manager-Conf-File.t
t/03-Manager-Conf-DBI.t
t/04-Manager-Conf-SOAP.t
t/10-Common.t
tools/lmConfig.mysql
use ExtUtils::MakeMaker;
# See lib/ExtUtils/MakeMaker.pm for details of how to influence
# the contents of the Makefile that is written.
sub MY::top_targets {
my $self=shift;
my $r = $self->MM::top_targets(@_);
if(my $cf = $ENV{LMNGCONFFILE}) {
$r =~ s/^(all.*)$/$1 my_target/m;
$cf = quotemeta($cf);
$r .= <<"EOT";
my_target:
perl -i -pe 's/^(use constant DEFAULTCONFFILE =>).*\$\$/\$\$1 "$cf";/' blib/lib/Lemonldap/NG/Common/Conf.pm
EOT
}
return $r;
}
WriteMakefile(
NAME => 'Lemonldap::NG::Common',
VERSION_FROM => 'lib/Lemonldap/NG/Common.pm', # finds $VERSION
......
package Lemonldap::NG::Common;
our $VERSION='0.9';
use strict;
1;
......
......@@ -6,9 +6,13 @@ use Data::Dumper;
use Lemonldap::NG::Common::Conf::Constants;
use Regexp::Assemble;
use constant DEFAULTCONFFILE => '/etc/lemonldap-ng/storage.conf';
our $VERSION = 0.51;
our $msg;
our %_confFiles;
sub new {
my $class = shift;
my $args;
......@@ -21,15 +25,16 @@ sub new {
%$self = @_;
}
unless ( $self->{mdone} ) {
$self->_readConfFile( $self->{confFile} );
unless ( $self->{type} ) {
$msg = "configStorage: type is not defined\n";
$msg .= "configStorage: type is not defined\n";
return 0;
}
$self->{type} = "Lemonldap::NG::Common::Conf::$self->{type}"
unless $self->{type} =~ /^Lemonldap/;
unless $self->{type} =~ /^Lemonldap::/;
eval "require $self->{type}";
if ($@) {
$msg = "Unknown package $self->{type}";
$msg .= "Unknown package $self->{type}";
return 0;
}
return 0 unless $self->prereq;
......@@ -39,7 +44,7 @@ sub new {
if ( $self->{localStorage} and not defined( $self->{refLocalStorage} ) ) {
eval "use $self->{localStorage};";
if ($@) {
$msg = "Unable to load $self->{localStorage}: $@";
$msg .= "Unable to load $self->{localStorage}: $@";
}
else {
$self->{refLocalStorage} =
......@@ -49,6 +54,35 @@ sub new {
return $self;
}
sub _readConfFile {
my $self = shift;
my $file = shift || DEFAULTCONFFILE;
unless ( $_confFiles{$file} ) {
unless ( open F, $file ) {
$msg = "/etc/lemonldap-ng/storage.conf: $!";
return 0;
}
while (<F>) {
next if ( /^\s*$/ or /^\s*#/ );
chomp;
s/\r//g;
/^\s*([\w]+)(?:\s*[:=]\s*|\s+)(["']?)([\S].*[\S])\2\s*$/ or next;
my $k = $1;
$_confFiles{$file}->{$k} = $3;
if ( $_confFiles{$file}->{$k} =~ /^[{\[].*[}\]]$/ ) {
eval "\$_confFiles{'$file'}->{'$k'} = $_confFiles{$file}->{$k}";
if ($@) {
$msg = "Error in file $file : $@";
return 0;
}
}
}
close F;
}
%$self = ( %$self, %{ $_confFiles{$file} } );
return 1;
}
sub saveConf {
my ( $self, $conf ) = @_;
......@@ -99,7 +133,7 @@ sub getConf {
return $self->getDBConf($args);
}
my $r = $self->{refLocalStorage}->get('conf');
if ($r->{cfgNum} == $args->{cfgNum}) {
if ( $r->{cfgNum} == $args->{cfgNum} ) {
$msg = "configuration unchanged, get configuration from cache";
return $r;
}
......@@ -157,7 +191,7 @@ sub getDBConf {
}
$msg = "Get configuration $conf->{cfgNum}";
my $re = Regexp::Assemble->new();
foreach(keys %{$conf->{locationRules}}) {
foreach ( keys %{ $conf->{locationRules} } ) {
quotemeta($_);
$re->add($_);
}
......
#
# This file contains parameters used by Lemonldap::NG to find its configuration
#
#
# 1 - Type
#
# You can use one of the following:
# * File: you have to set 'dirName' parameter. Example:
#
# type = File
# dirName = /var/lib/lemonldap-ng/conf
#
# * DBI : you have to set 'dbiChain' (required) and 'dbiUser' and 'dbiPassword'
# if needed. Example:
#
# type = DBI
# dbiChain = DBI:mysql:database=lemonldap-ng;host=1.2.3.4
# dbiUser = lemonldap
# dbiPassword = password
#
# * SOAP: SOAP configuration access is a sort of proxy: the SOAP server that
# runs Lemonldap::NG::Manager::SOAPServer is configured to use the real
# session storage type (DBI or File for example).
# You have to set 'proxy' parameter. Example:
#
# type = SOAP
# proxy = https://manager.example.com/soapmanager.pl
# proxyOptions = { timeout => 5 }
# User = lemonldap
# Password = mypassword
#
# 2 - LocalStorage
#
# To increase performances, use a local cache for the configuration. You have
# to choose a Cache::Cache module and set it's parameters (1 line). Example:
#
# localStorage = Cache::FileCache
# localStorageOptions = { 'namespace' => 'MyNamespace', 'default_expires_in' => 600, 'directory_umask' => '007', 'cache_root' => '/tmp', 'cache_depth' => 5, }
type = File
dirName = /var/lib/lemonldap-ng/conf
localStorage = Cache::FileCache
localStorageOptions = { 'namespace' => 'MyNamespace', 'default_expires_in' => 600, 'directory_umask' => '007', 'cache_root' => '/tmp', 'cache_depth' => 5, }
......@@ -3,20 +3,6 @@ use Lemonldap::NG::Handler::SharedConf;
@ISA = qw(Lemonldap::NG::Handler::SharedConf);
__PACKAGE__->init ( {
localStorage => "Cache::FileCache",
localStorageOptions => {
'namespace' => 'MyNamespace',
'default_expires_in' => 600,
'directory_umask' => '007',
'cache_root' => '/tmp',
'cache_depth' => 5,
},
configStorage => {
type => 'File',
dirName => '__CONFDIR__',
},
https => 0,
# Uncomment this to activate status module
# status => 1,
......
......@@ -4,20 +4,6 @@ use Lemonldap::NG::Handler::SharedConf;
__PACKAGE__->init(
{
localStorage => "Cache::FileCache",
localStorageOptions => {
'namespace' => 'MyNamespace',
'default_expires_in' => 600,
'directory_umask' => '007',
'cache_root' => '/tmp',
'cache_depth' => 5,
},
configStorage => {
type => 'File',
dirName => '__CONFDIR__',
},
https => 0,
# Uncomment this to activate status module
# status => 1,
......
#!/usr/bin/perl
my $cgi = new Lemonldap::NG::Handler::CGI ( {
localStorage => "Cache::FileCache",
localStorageOptions => {
'namespace' => 'MyNamespace',
'default_expires_in' => 600,
},
configStorage => {
type => 'File',
dirName => '__CONFDIR__',
},
https => 0,
}
);
......
......@@ -22,21 +22,6 @@ use strict;
our $cgi;
$cgi = Lemonldap::NG::Handler::CGI->new(
{
localStorage => "Cache::FileCache",
localStorageOptions => {
'namespace' => 'MyNamespace',
'default_expires_in' => 600,
'directory_umask' => '007',
'cache_root' => '/tmp',
'cache_depth' => 5,
},
# DEBIAN USERS : use this instead of classic configStorage
#configStorage => $Lemonldap::NG::Conf::configStorage,
configStorage => {
type => 'File',
dirName => '__CONFDIR__',
},
https => 0,
}
) or die;
......
......@@ -71,11 +71,9 @@ example/imgs/tombs_mag.gif
example/index.pl
example/jquery.js
example/lemonldap-ng-manager.js
example/lmConfig.mysql
example/mrtg/lmng-mrtg
example/mrtg/mrtg.cfg.example
example/scripts/lmConfigEditor
example/scripts/lmSessionDump
example/sessions.pl
example/soapserver.pl
example/theme/default.css
......
......@@ -4,12 +4,8 @@ use Lemonldap::NG::Manager;
my $h = new Lemonldap::NG::Manager(
{
configStorage => {
type => 'File',
dirName => "__CONFDIR__",
},
dhtmlXTreeImageLocation => "/imgs/",
applyConfFile => '__DIR__/manager/apply.conf',
applyConfFile => '__APPLYCONFFILE__',
cssFile => 'theme/default.css',
textareaW => 50,
textareaH => 2,
......
CREATE TABLE lmConfig (
cfgNum int not null primary key,
locationRules text,
exportedHeaders text,
globalStorage text,
globalStorageOptions text,
macros text,
groups text,
portal text,
domain text,
ldapServer text,
ldapPort int,
ldapBase text,
securedCookie int,
cookieName text,
authentication text,
exportedVars text,
managerDn text,
managerPassword text,
timeout int,
whatToTrace text
);
......@@ -11,12 +11,7 @@ our $editFile = `mktemp`;
chomp $refFile;
chomp $editFile;
my $conf = Lemonldap::NG::Common::Conf->new(
{
type => 'File',
dirName => '__CONFDIR__',
}
);
my $conf = Lemonldap::NG::Common::Conf->new();
open F1, ">$refFile" or quit($!);
open F2, ">$editFile" or quit($!);
......
#!/usr/bin/perl
# Set here the session storage you use
$sessionStorage = 'Apache::Session::File';
$sessionStorageOptions = {
Directory => '__SESSIONDIR__',
};
############
usage() unless($ARGV[0]);
eval "use $sessionStorage";
die $@ if($@);
tie %h, $sessionStorage, $ARGV[0], $sessionStorageOptions;
print "Attributes and macros :\n";
my @t = sort keys(%h);
print "$_ " foreach(@t);
print "\n";
foreach my $k ( sort keys(%h) ) {
next if($k eq 'groups');
print "\t$k\t=> $h{$k}\n";
}
if( $h{groups} ) {
print "Groups :\n";
print "\t$_\n" foreach( sort split /\s+/, $h{groups} );
}
......@@ -5,20 +5,6 @@ use strict;
use Lemonldap::NG::Manager::Sessions;
our $cgi = Lemonldap::NG::Manager::Sessions->new({
localStorage => "Cache::FileCache",
localStorageOptions => {
'namespace' => 'MyNamespace',
'default_expires_in' => 600,
'directory_umask' => '007',
'cache_root' => '/tmp',
'cache_depth' => 5,
},
# Use configStorage with Debian
#configStorage => $Lemonldap::NG::Conf::configStorage,
configStorage => {
type => 'File',
dirName => "__CONFDIR__",
},
https => 0,
jqueryUri => 'jquery.js',
imagePath => '/images/',
......
......@@ -2,11 +2,6 @@
use Lemonldap::NG::Manager::SOAPServer;
Lemonldap::NG::Manager::SOAPServer->start(
configStorage => {
type => "File",
dirName => "__CONFDIR__"
}
);
Lemonldap::NG::Manager::SOAPServer->start();
__END__
......@@ -10,11 +10,6 @@ use Lemonldap::NG::Portal::AuthLA;
my $portal = Lemonldap::NG::Portal::AuthLA->new(
{
configStorage => {
type => 'File',
dirName => '__CONFDIR__',
},
# Liberty Parameters
laSp => {
certificate => "__DIR__/ressources/lemonsp-key-public.pem",
......
......@@ -80,12 +80,7 @@ print $cgi->header(
print "LEMONLDAP::NG::PORTAL STATUS\n\nConfiguration : ";
my $lmconf = Lemonldap::NG::Common::Conf->new(
{
type => 'File',
dirName => '__CONFDIR__',
}
);
my $lmconf = Lemonldap::NG::Common::Conf->new();