Commit 29b8c868 authored by Yadd's avatar Yadd
Browse files

Doxygen doc

parent a8601a0e
## @file
# Lemonldap::NG manager main file
## @class
# Lemonldap::NG manager main class
package Lemonldap::NG::Manager;
use strict;
use Lemonldap::NG::Handler::CGI qw(:globalStorage :locationRules);
use Lemonldap::NG::Manager::Help; #inherits
use Lemonldap::NG::Handler::CGI qw(:globalStorage :locationRules); #inherits
use Lemonldap::NG::Manager::Help; #inherits
our $VERSION = '0.93';
our @ISA = qw(
......@@ -17,6 +22,10 @@ BEGIN {
*process = *doall;
}
## @cmethod Lemonldap::NG::Manager new(hashRef args)
# Class constructor.
#@param args hash reference
#@return Lemonldap::NG::Manager object
sub new {
my ( $class, $args ) = @_;
my $self = $class->SUPER::new($args)
......@@ -63,9 +72,12 @@ sub new {
return $self;
}
## @method string menu()
# Build the tree menu.
# @return HTML string
sub menu {
my $self = shift;
require Lemonldap::NG::Manager::Downloader; #inherits
require Lemonldap::NG::Manager::Downloader;
return
'<ul class="simpleTree">'
. $self->li( 'root', 'root' )
......
##@file
# Configuration tree file
##@class Lemonldap::NG::Manager::Downloader
# Configuration tree builder
package Lemonldap::NG::Manager::Downloader;
use MIME::Base64;
......@@ -5,9 +10,14 @@ use MIME::Base64;
# TODO
use Data::Dumper;
require Lemonldap::NG::Manager::_Struct; #inherits
require Lemonldap::NG::Manager::_i18n; #inherits
require Lemonldap::NG::Manager::_Struct; #inherits
require Lemonldap::NG::Manager::_i18n; #inherits
## @method string node(string node)
# Build the part of the tree that does not depends of the the configuration.
# Call corresp(), ajaxNode(), confNode() or itself with li() and span().
#@param $node Node to display
#@return HTML string
sub node {
my ( $self, $node ) = @_;
my $res;
......@@ -71,6 +81,15 @@ sub node {
return $res;
}
## @method string confNode(string node, string target, string help, string js)
# Build the part of the tree that does not depends of the the configuration.
# Call ajaxNode(), itself, keyToH(), li(), span().
# @param node Unique identifier for the node
# @param target String that represents the type and the position of the
# parameter in the configuration
# @param help Help chapter to display when selected
# @param js Javascript function to launch when selected
# @return HTML string
sub confNode {
my ( $self, $node, $target, $help, $js ) = @_;
my $res;
......@@ -164,6 +183,11 @@ sub confNode {
return $res;
}
## @method hashref keyToH(string key, hashref h)
# Return the part of $h corresponding to $key.
# Example, if $h={a=>{b=>{c=>1}}} and $key='/a/b' then keyToH() will
# return {c=>1}
# @return hashref
sub keyToH {
my ( $self, $key, $h ) = @_;
$key =~ s/^\///;
......@@ -174,6 +198,19 @@ sub keyToH {
return $h;
}
## @method array corresp(string key,boolean last)
# Search a the key $key in the hashref Lemonldap::NG::Manager::struct().
# If $key is not set, uses Lemonldap::NG::Manager::struct().
# If the URL parameter key is set, uses Lemonldap::NG::Manager::cstruct()
# with this parameter.
# This function call itself 1 time if the key is not found using cstruct()
# using the flag $last.
# @return An array containing :
# - the (sub)structure of the menu
# - the help chapter (using inheritance of the up key)
# - the optional javascript function to use when node is selected
# @param key string
# @param last optional boolean
sub corresp {
my ( $self, $key, $last ) = @_;
$key =~ s/^\///;
......@@ -218,6 +255,10 @@ sub corresp {
return $h, $help, $js;
}
## @method protected hashref conf()
# If configuration is not in memory, calls
# Lemonldap::NG::Common::Conf::getConf() and returns it.
# @return Lemonldap::NG configuration
sub conf {
my $self = shift;
return $self->{_conf} if ( $self->{_conf} );
......@@ -230,6 +271,10 @@ sub conf {
return $self->{_conf};
}
## @method protected Lemonldap::NG::Common::Conf confObj()
# At the first call, creates a new Lemonldap::NG::Common::Conf object and
# return it. This object is cached for later calls.
# @return Lemonldap::NG::Common::Conf object
sub confObj {
my $self = shift;
return $self->{_confObj} if ( $self->{_confObj} );
......@@ -244,11 +289,17 @@ sub confObj {
return $self->{_confObj};
}
## @method protected void ajaxnode(string id, string text, string param)
# Display tree node with Ajax functions inside for opening the node.
# @param $id HTML id of the element.
## @method protected string ajaxnode(string id,string text,string param,string help,string js,string data,boolean noT)
# Returns a tree node with Ajax functions inside for opening the node later.
# Call li() and span().
# @param $id HTML id of the element
# @param $text text to display
# @param $param Parameters for the Ajax query
# @param $help Help chapter to display
# @param $js Javascript function to call when selected
# @param $data Value of the parameter
# @param $noT Optional flag to block translation
# @return HTML string
sub ajaxNode {
my ( $self, $id, $text, $param, $help, $js, $data, $noT ) = @_;
$param .= "&amp;cfgNum=$self->{cfgNum}";
......@@ -262,6 +313,16 @@ sub ajaxNode {
. "}</li></ul></li>\n";
}
## @method protected string span(string id,string text,string param,string help,string js,string data,boolean noT)
# Return the span part of the node
# @param $id HTML id of the element
# @param $text text to display
# @param $param Parameters for the Ajax query
# @param $help Help chapter to display
# @param $js Javascript function to call when selected
# @param $data Value of the parameter
# @param $noT Optional flag to block translation
# @return HTML string
sub span {
my ( $self, $id, $text, $data, $js, $help, $noT ) = @_;
use Carp qw(cluck);
......@@ -281,6 +342,11 @@ sub span {
";
}
## @method protected string li(string id,string class)
# Returns the LI part of the node.
# @param $id HTML id of the element
# @param $class CSS class
# @return HTML string
sub li {
my ( $self, $id, $class ) = @_;
$id = "li_" . encode_base64( $id, '' );
......
## @file
# Test uploaded parameters and store new configuration
## @class
# Test uploaded parameters and store new configuration
package Lemonldap::NG::Manager::Uploader;
use strict;
......@@ -7,13 +12,17 @@ use MIME::Base64;
# TODO
use Data::Dumper;
use Lemonldap::NG::Common::Safelib; #link protected safe Safe object
use Lemonldap::NG::Manager::Downloader;
use Lemonldap::NG::Manager::_Struct;
use Lemonldap::NG::Common::Safelib; #link protected safe Safe object
use Lemonldap::NG::Manager::Downloader; #inherits
use Lemonldap::NG::Manager::_Struct; #inherits
our $VERSION = '0.1';
our ( $stylesheet, $parser );
## @method void confUpload(ref rdata)
# Parse rdata to find parameters using XSLT, test them and tries to store the
# new configuration
# @param $rdata pointer to posted datas
sub confUpload {
my ( $self, $rdata ) = @_;
$$rdata =~ s/<img.*?>//g;
......@@ -48,7 +57,7 @@ sub confUpload {
$id =~ s/\r//g;
$id =~ s/^\///;
$id =~ s/(?:\/[^\/]*)?$/\/$name/ if ($NK);
print STDERR "$id\n"if($NK);
print STDERR "$id\n" if ($NK);
next if ( $id =~ /^(generalParameters|virtualHosts)/ );
my ( $confKey, $test ) = $self->getConfTests($id);
my ( $res, $m );
......@@ -103,7 +112,7 @@ sub confUpload {
foreach ( @{ $result->getChildrenByTagName('ignore') } ) {
my $node = $_->getAttribute('value');
$node =~ s/^.*node=(.*?)(?:&.*)?\}$/$1/;
foreach my $k ( $self->findAllConfKeys( $self->corresp($node,1) ) ) {
foreach my $k ( $self->findAllConfKeys( $self->corresp( $node, 1 ) ) ) {
my $v = $self->keyToH( $k, $self->conf );
$v = $self->keyToH( $k, $self->defaultConf ) unless ( defined $v );
if ( defined $v ) {
......@@ -113,26 +122,36 @@ sub confUpload {
$self->lmLog( "No default value found for $k", 'warn' );
}
}
print LOG "Ignore $node\n";
}
#print STDERR Dumper( $newConf, \%errors, \%warnings );
close LOG;
$res->{result}->{cfgNum} = $self->confObj->saveConf($newConf) unless($res->{errors});
#print STDERR Dumper( $newConf, $res );
$res->{result}->{cfgNum} = $self->confObj->saveConf($newConf)
unless ( $res->{errors} );
my $buf = '{';
my $i=0;
my $i = 0;
while ( my ( $type, $h ) = each %$res ) {
$buf .= ',' if($i);
$buf .= ',' if ($i);
$buf .= "'$type':{";
$buf .= join( ',', map { "'$_':'$h->{$_}'" } keys %$h );
$buf .= '}';
$i++;
}
$buf .= '}';
print $self->header( -type => 'application/json', -Content_Length => length($buf) ).$buf;
print $self->header(
-type => 'application/json',
-Content_Length => length($buf)
) . $buf;
$self->quit();
}
## @method protected array applyTest(void* test,string value)
# Apply the test to the value and return the result and an optional message
# returned by the test if the sub ref.
# @param $test Ref to a regexp or a sub
# @param $value Value to test
# @return Array containing:
# - the test result
# - an optional message
sub applyTest {
my ( $self, $test, $value ) = @_;
my ( $res, $msg );
......@@ -145,6 +164,8 @@ sub applyTest {
return ( $res, $msg );
}
## @method protected array getConfTests(string id)
# Call Lemonldap::NG::Manager::_Struct::testStruct().
sub getConfTests {
my ( $self, $id ) = @_;
my ( $confKey, $tmp ) = ( $id =~ /^(.*?)(?:\/(.*))?$/ );
......@@ -155,6 +176,11 @@ sub getConfTests {
return ( $confKey, $h );
}
## @method protected array findAllConfKeys(hashref h)
# Parse a tree structure to find all nodes corresponding to a configuration
# value.
# @param $h Tree structure
# @return Array of configuration parameter names
sub findAllConfKeys {
my ( $self, $h ) = @_;
my @res = ();
......@@ -168,10 +194,17 @@ sub findAllConfKeys {
push @res, ( $m =~ /^(?:.*?:)?(.*?)(?:\:.*)?$/ ? $1 : () );
}
}
push @res, @{$h->{_upload}} if($h->{_upload});
push @res, @{ $h->{_upload} } if ( $h->{_upload} );
return @res;
}
## @method protected void setKeyToH(hashref h,string key,string k2,string value)
# Insert key=>$value in $h at the position declared with $key. If $k2 is set,
# insert key=>{$k2=>$value}. Note that $key is splited with "/". The last part
# is used as key.
# @param $h New Lemonldap::NG configuration
# @param $key String "/path/key"
# @param $k2 Optional subkey
sub setKeyToH {
my $value = pop;
my ( $self, $h, $key, $k2 ) = @_;
......@@ -196,12 +229,18 @@ sub setKeyToH {
}
}
## @method private XML::LibXML parser()
# @return XML::LibXML object (cached in global $parser variable)
sub parser {
my $self = shift;
return $parser if ($parser);
$parser = XML::LibXML->new();
}
## @method private XML::LibXSLT stylesheet()
# Returns XML::LibXSLT parser (cached in global $stylesheet variable). Use
# datas stored at the end of this file to initialize the object.
# @return XML::LibXSLT object
sub stylesheet {
my $self = shift;
......
## @file
# Manager tree structure and tests
## @class
# Manager tree structure and tests
package Lemonldap::NG::Manager::_Struct;
use strict;
our $VERSION = '0.1';
## @method protected hashref cstruct(hashref h,string k)
# Merge $h with the structure produced with $k and return it.
# Used to manage virtual hosts.
#@param $h Result of struct()
#@param $k Name of the virtual host
#@return Tree structure
sub cstruct {
shift;
my ( $h, $k ) = @_;
......@@ -23,6 +34,11 @@ sub cstruct {
return $h;
}
## @method protected hashref struct(hashref h,string k)
# Returns the tree structure
#@param $h Result of struct()
#@param $k Name of the virtual host
#@return Tree structure
sub struct {
return {
_nodes => [qw(n:generalParameters n:groups n:virtualHosts)],
......@@ -129,6 +145,9 @@ sub struct {
};
}
## @method protected hashref testStruct()
# Returns the tests to do with the datas uploaded.
# @return hashref
sub testStruct {
my $assignTest = qr/(?<=[^=<!>\?])=(?![=~])/;
my $assignMsg = 'containsAnAssignment';
......@@ -302,6 +321,8 @@ sub testStruct {
};
}
## @method protected hashref defaultConf()
#@return Hashref of default values
sub defaultConf {
return {
authentication => 'LDAP',
......@@ -316,17 +337,4 @@ sub defaultConf {
};
}
sub newNode {
virtualHost => {
'*' => {
exportedHeaders => { 'Auth-User' => '$uid' },
locationRules => { 'default' => 'deny' },
}
},
groups => { 'NewGroup' => '0', },
macro => { 'NewMacro' => '', },
globalStorageOptions => { 'NewOption' => '', },
;
}
1;
......@@ -11,8 +11,11 @@ use strict;
use AutoLoader qw(AUTOLOAD);
our $VERSION = '0.5';
## @fn void import(string lang)
# Import messages
## @method string translate(string text,string lang)
# Returns $text translated in $lang.
#@param $text textId
#@param $lang Optional language string. If not set, uses Accept-Language
# HTTP header.
sub translate {
my ( $self, $text, $lang ) = @_;
return $text unless ( $text =~ /[a-z]/ );
......@@ -39,6 +42,7 @@ sub translate {
*en_us = *en;
1;
__END__
sub en {
return {
......@@ -106,130 +110,3 @@ sub fr {
};
}
__END__
=pod
=cut
sub en {
return {
apacheSessionModule => 'Apache::Session module',
applyConf => 'Apply',
areYouSure => 'Are you sure ?',
authenticationType => 'Authentication Type',
canNotReadApplyConfFile => 'Configuration not applied: cannot read configuration file',
changesAppliedLater => 'Changes will be effective within 10 minutes. Use "apachectl reload" on concerned servers for immediate reloading',
checkLogs => 'Check Apache logs',
confSaved => 'Configuration saved with number',
configLoaded => 'Configuration loaded',
configurationDeleted => 'Configuration deleted',
configurationNotDeleted => 'Configuration not deleted',
configurationWasChanged => 'Configuration has been changed since you got it',
confirmDeleteConf => "You're going to delete configuration. Do you confirm ?",
containsAnAssignment => 'contains an assignment ("="). Possible confusion with "==".',
deleteConf => 'Delete',
deleteNode => 'Delete',
deleteVirtualHost => 'Delete virtual host',
error => 'Error',
field => 'Field',
group => 'Group',
httpHeaders => 'HTTP Headers',
invalidLine => 'Invalid Line',
invalidVirtualHostName => 'Invalid virtual host name',
invalidWhatToTrace => "Data to use in Apache's logs can contain only an exported attribute or a macro",
isNotANumber => 'is not a number',
isNotAValidAttributeName => 'is not a valid attribute name',
isNotAValidCookieName => 'is not a valid cookie name',
isNotAValidDomainName => 'is not a valid domain name',
isNotAValidGroupName => 'is not a valid group name',
isNotAValidHTTPHeaderName => 'is not a valid HTTP header name',
isNotAValidLDAPAttributeName => 'is not a valid LDAP attribute name',
isNotAValidMacroName => 'is not a valid macro name',
isNotAValidVirtualHostName => 'is not a valid virtual host name',
lastConf => 'Last',
locationRules => 'Rules',
macro => 'Macro',
newGSOpt => 'New Option',
newGroup => 'New Group',
newHeader => 'New Header',
newMacro => 'New Macro',
newVar => 'New Variable',
newVirtualHost => 'New Virtual Host',
nextConf => 'Next',
prevConf => 'Previous',
result => 'Result',
rule => 'Rule',
saveConf => 'Save',
saveFailure => 'Save failure',
syntaxError => 'Syntax error',
unableToSave => 'Your browser does not support XMLHTTPRequest objects: fail to save.',
unknownError => 'Unknown error',
unknownErrorInVars => 'Unknown error in exported attributes',
userGroups => 'User Groups',
value => 'Value',
waitingResult => 'Waiting result...',
warningConfNotApplied => 'You have to reload handlers to take the saved configuration in account',
};
}
sub fr {
return {
apacheSessionModule => 'Module Apache::Session',
applyConf => 'Appliquer',
areYouSure => 'Êtes vous sur ?',
authenticationType => "Type d'authentification",
canNotReadApplyConfFile => 'Configuration non appliquée: impossible de lire le fichier de configuration',
changesAppliedLater => "Les changements seront effectifs d'ici 10 minutes. Utilisez \"apachectl reload\" sur les serveurs concernés pour forcer la prise en compte immédiate",
checkLogs => "Consultez les journaux d'Apache",
confSaved => 'Configuration sauvegardée sous le numéro',
configLoaded => 'Configuration chargée',
configurationDeleted => 'Configuration éffacée',
configurationNotDeleted => 'Configuration non éffacée',
configurationWasChanged => "configuration modifiée depuis que vous l'avez téléchargée",
confirmDeleteConf => 'Vous allez effacer cette configuration. Confirmez-vous ?',
containsAnAssignment => 'contient une affectation ("="). Confusion possible avec "==".',
deleteConf => 'Effacer',
deleteNode => 'Supprimer',
deleteVirtualHost => "Supprimer l'hôte virtuel",
error => 'Erreur',
field => 'Champ',
group => 'Groupe',
httpHeaders => 'En-têtes HTTP',
invalidLine => 'Ligne invalide',
invalidVirtualHostName => "Nom de d'hôte virtuel incorrect",
invalidWhatToTrace => "La donnée à inscrire dans les journaux ne peut contenir qu'un attribut exporté ou une macro",
isNotANumber => "n'est pas un nombre",
isNotAValidAttributeName => "n'est pas un nom d'attribut valide",
isNotAValidCookieName => "n'est pas un nom de cookie valide",
isNotAValidDomainName => "n'est pas un nom de domaine valide",
isNotAValidGroupName => "n'est pas un nom de groupe valide",
isNotAValidHTTPHeaderName => "n'est pas un nom d'en-tête HTTP valide",
isNotAValidLDAPAttributeName => "n'est pas un nom d'attribut LDAP valide",
isNotAValidMacroName => "n'est pas un nom de macro valide",
isNotAValidVirtualHostName => "n'est pas un nom d'hôte virtuel valide",
lastConf => 'Dernière',
locationRules => 'Règles',
macro => 'Macro',
macros => 'Macros',
newGSOpt => 'Nouvelle option',
newGroup => 'Nouveau groupe',
newHeader => 'Nouvel en-tête',
newMacro => 'Nouvelle macro',
newVar => 'Nouvelle variable',
newVirtualHost => 'Nouvel hôte virtuel',
nextConf => 'Suivante',
prevConf => 'Précédente',
result => 'Résultat',
rule => 'Règle',
saveConf => 'Sauvegarder',
saveFailure => 'Échec de la sauvegarde',
syntaxError => 'Erreur de syntaxe',
unableToSave => 'Votre navigateur ne supporte pas les objets XMLHTTPRequest: sauvegarde impossible.',
unknownError => 'Erreur inconnue',
unknownErrorInVars => 'Erreur inconnue dans les attributs exportés',
userGroups => "Groupes d'utilisateurs",
value => 'Valeur',
waitingResult => 'En attente...',
warningConfNotApplied => 'Vous devez recharger les agents pour que la configuration sauvegardée soit appliquée',
};
}
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment