Compare commits
No commits in common. "master" and "2.8.0/master" have entirely different histories.
master
...
2.8.0/mast
|
@ -1,4 +0,0 @@
|
||||||
# Backup and swap files
|
|
||||||
*~
|
|
||||||
*#
|
|
||||||
*.swp
|
|
6
Makefile
6
Makefile
|
@ -3,9 +3,9 @@
|
||||||
################################
|
################################
|
||||||
|
|
||||||
SOURCE=eole-lemonldap
|
SOURCE=eole-lemonldap
|
||||||
VERSION=0.1
|
VERSION=2.8.0
|
||||||
EOLE_VERSION=2.7
|
EOLE_VERSION=2.8
|
||||||
EOLE_RELEASE=2.7.2
|
EOLE_RELEASE=2.8.0
|
||||||
PKGAPPS=non
|
PKGAPPS=non
|
||||||
#FLASK_MODULE=<APPLICATION>
|
#FLASK_MODULE=<APPLICATION>
|
||||||
|
|
||||||
|
|
21
README.md
21
README.md
|
@ -4,27 +4,6 @@ LemonLDAP::NG EOLE integration
|
||||||
|
|
||||||
## Howto
|
## Howto
|
||||||
|
|
||||||
### Repository configuration
|
|
||||||
|
|
||||||
* Add the lemonldap-ng deb respository we need the last version of LemonLDAP.
|
|
||||||
|
|
||||||
GenConfig -> Mode Expert -> Dépôts tiers -> Libellé du dépôt
|
|
||||||
|
|
||||||
#### LemonLDAP::NG repository (if you use EOLE 2.8.X this is not needed anymore)
|
|
||||||
|
|
||||||
* deb https://lemonldap-ng.org/deb stable main
|
|
||||||
* deb-src https://lemonldap-ng.org/deb stable main
|
|
||||||
* Key URL : https://lemonldap-ng.org/_media/rpm-gpg-key-ow2
|
|
||||||
|
|
||||||
#### Cadoles Repository
|
|
||||||
* deb [ arch=all ] https://vulcain.cadoles.com 2.7.2-dev main
|
|
||||||
* Key URL : https://vulcain.cadoles.com/cadoles.gpg
|
|
||||||
|
|
||||||
### Install packages
|
|
||||||
|
|
||||||
apt update
|
|
||||||
apt install eole-lemonldap
|
|
||||||
|
|
||||||
### Configure LemonLDAP in GenConfig
|
### Configure LemonLDAP in GenConfig
|
||||||
|
|
||||||
* Enable lemonldap in "Services" tab
|
* Enable lemonldap in "Services" tab
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
<creole>
|
<creole>
|
||||||
|
|
||||||
<files>
|
<files>
|
||||||
|
|
||||||
<file filelist='lemonldap' name='/etc/lemonldap-ng/lemonldap-ng.ini' mkdir='True' rm='True'/>
|
<file filelist='lemonldap' name='/etc/lemonldap-ng/lemonldap-ng.ini' mkdir='True' rm='True'/>
|
||||||
<file filelist='lemonldap' name='/var/lib/lemonldap-ng/conf/lmConf-1.json' mkdir='True' rm='True'/>
|
<file filelist='lemonldap' name='/var/lib/lemonldap-ng/conf/lmConf-1.json' mkdir='True' rm='True'/>
|
||||||
<file filelist='lemonldap' name='/etc/default/lemonldap-ng-fastcgi-server' mkdir='True' rm='True'/>
|
<file filelist='lemonldap' name='/etc/default/lemonldap-ng-fastcgi-server' mkdir='True' rm='True'/>
|
||||||
|
@ -9,13 +10,12 @@
|
||||||
<file filelist='lemonldap-nginx' name='/etc/lemonldap-ng/manager-nginx.conf' mkdir='True' rm='True'/>
|
<file filelist='lemonldap-nginx' name='/etc/lemonldap-ng/manager-nginx.conf' mkdir='True' rm='True'/>
|
||||||
<file filelist='lemonldap-nginx' name='/etc/lemonldap-ng/handler-nginx.conf' mkdir='True' rm='True'/>
|
<file filelist='lemonldap-nginx' name='/etc/lemonldap-ng/handler-nginx.conf' mkdir='True' rm='True'/>
|
||||||
<file filelist='lemonldap-nginx' name='/etc/lemonldap-ng/portal-nginx.conf' mkdir='True' rm='True'/>
|
<file filelist='lemonldap-nginx' name='/etc/lemonldap-ng/portal-nginx.conf' mkdir='True' rm='True'/>
|
||||||
<file filelist='lemonldap-nginx' name='/etc/lemonldap-ng/nginx-lmlog.conf' mkdir='True' rm='True'/>
|
|
||||||
|
|
||||||
<file filelist='lemonldap-apache' name='/etc/lemonldap-ng/manager-apache2.X.conf' mkdir='True' rm='True'/>
|
<file filelist='lemonldap-apache' name='/etc/lemonldap-ng/manager-apache2.X.conf' mkdir='True' rm='True'/>
|
||||||
<file filelist='lemonldap-apache' name='/etc/lemonldap-ng/handler-apache2.X.conf' mkdir='True' rm='True'/>
|
<file filelist='lemonldap-apache' name='/etc/lemonldap-ng/handler-apache2.X.conf' mkdir='True' rm='True'/>
|
||||||
<file filelist='lemonldap-apache' name='/etc/lemonldap-ng/portal-apache2.X.conf' mkdir='True' rm='True'/>
|
<file filelist='lemonldap-apache' name='/etc/lemonldap-ng/portal-apache2.X.conf' mkdir='True' rm='True'/>
|
||||||
|
|
||||||
<service servicelist="sllemon">lemonldap-ng-fastcgi-server</service>
|
<service>lemonldap-ng-fastcgi-server</service>
|
||||||
|
|
||||||
<service method='apache' servicelist='lemonldap-apache'>manager-apache2</service>
|
<service method='apache' servicelist='lemonldap-apache'>manager-apache2</service>
|
||||||
<service method='apache' servicelist='lemonldap-apache'>portal-apache2</service>
|
<service method='apache' servicelist='lemonldap-apache'>portal-apache2</service>
|
||||||
|
@ -28,14 +28,6 @@
|
||||||
</files>
|
</files>
|
||||||
|
|
||||||
<variables>
|
<variables>
|
||||||
<family name='eole-sso'>
|
|
||||||
<variable name='eolesso_cas_folder' redefine="True" exists='True'>
|
|
||||||
<value>/cas</value>
|
|
||||||
</variable>
|
|
||||||
<variable name='eolesso_port' redefine="True" exists='True'>
|
|
||||||
<value>443</value>
|
|
||||||
</variable>
|
|
||||||
</family>
|
|
||||||
<family name='Services'>
|
<family name='Services'>
|
||||||
<variable name='activerLemon' type='oui/non' description="Activer LemonLDAP::NG">
|
<variable name='activerLemon' type='oui/non' description="Activer LemonLDAP::NG">
|
||||||
<value>non</value>
|
<value>non</value>
|
||||||
|
@ -48,10 +40,6 @@
|
||||||
<variable name='authWebName' type='string' description="Nom DNS du service d'authentification LemonLDAP-NG"/>
|
<variable name='authWebName' type='string' description="Nom DNS du service d'authentification LemonLDAP-NG"/>
|
||||||
<variable name='reloadWebName' type='string' description="Nom DNS du service Reload de LemonLDAP-NG" mode="expert"/>
|
<variable name='reloadWebName' type='string' description="Nom DNS du service Reload de LemonLDAP-NG" mode="expert"/>
|
||||||
|
|
||||||
<variable name='lemon_user_db' type='string' description="Backend pour les comptes utilisateurs" mode="expert">
|
|
||||||
<value>LDAP</value>
|
|
||||||
</variable>
|
|
||||||
|
|
||||||
<variable name='ldapScheme' type='string' description="Protocole LDAP à utiliser" mandatory='True'/>
|
<variable name='ldapScheme' type='string' description="Protocole LDAP à utiliser" mandatory='True'/>
|
||||||
<variable name='ldapServer' type='string' description="Adresse du Serveur LDAP utilisé par LemonLDAP::NG" mandatory="True"/>
|
<variable name='ldapServer' type='string' description="Adresse du Serveur LDAP utilisé par LemonLDAP::NG" mandatory="True"/>
|
||||||
<variable name='ldapServerPort' type='number' description="Port d'écoute du LDAP utilisé par LemonLDAP::NG" mandatory='True'/>
|
<variable name='ldapServerPort' type='number' description="Port d'écoute du LDAP utilisé par LemonLDAP::NG" mandatory='True'/>
|
||||||
|
@ -59,18 +47,11 @@
|
||||||
<variable name='ldapBindUserDN' type='string' description="Utilisateur de connection à l'annuaire" mandatory="True"/>
|
<variable name='ldapBindUserDN' type='string' description="Utilisateur de connection à l'annuaire" mandatory="True"/>
|
||||||
<variable name='ldapBindUserPassword' type='password' description="Mot de passe de l'utilisateur de connection à l'annuaire" mandatory="True"/>
|
<variable name='ldapBindUserPassword' type='password' description="Mot de passe de l'utilisateur de connection à l'annuaire" mandatory="True"/>
|
||||||
<variable name="samlOrganizationName" type='string' description="Nom de l'organisation SAML" mode='expert'/>
|
<variable name="samlOrganizationName" type='string' description="Nom de l'organisation SAML" mode='expert'/>
|
||||||
<variable name='lmldapverify' type='oui/non' description="Vérifier les certificats SSL du serveur LDAP">
|
|
||||||
<value>oui</value>
|
|
||||||
</variable>
|
|
||||||
|
|
||||||
<variable name="lemonproc" type='number' description="Nombre de processus dédié à Lemon (équivalent au nombre de processeurs)" mandatory="True">
|
<variable name="lemonproc" type='number' description="Nombre de processus dédié à Lemon (équivalent au nombre de processeurs)" mandatory="True">
|
||||||
<value>4</value>
|
<value>4</value>
|
||||||
</variable>
|
</variable>
|
||||||
|
|
||||||
<variable name="lm_loglevel" type='string' description="Verbosité des journaux" mode='expert'>
|
|
||||||
<value>info</value>
|
|
||||||
</variable>
|
|
||||||
|
|
||||||
<variable name="lemonAdmin" type='string' description="LemonLDAP Administrator username" mode='expert'>
|
<variable name="lemonAdmin" type='string' description="LemonLDAP Administrator username" mode='expert'>
|
||||||
<value>admin</value>
|
<value>admin</value>
|
||||||
</variable>
|
</variable>
|
||||||
|
@ -93,19 +74,7 @@
|
||||||
<variable name='llCheckLogins' type='oui/non' description="Permettre aux utilisateurs d'afficher l'historique de connection">
|
<variable name='llCheckLogins' type='oui/non' description="Permettre aux utilisateurs d'afficher l'historique de connection">
|
||||||
<value>non</value>
|
<value>non</value>
|
||||||
</variable>
|
</variable>
|
||||||
<variable name='llResetPassword' type='oui/non' description="Permettre aux utilisateurs de réinitialiser leurs mots de passe par mail">
|
<variable name='llResetPassword' type='oui/non' description="Permettre aux utilisateurs de réinitialiser leurs mots de passe">
|
||||||
<value>oui</value>
|
|
||||||
</variable>
|
|
||||||
<variable name='llChangePassword' type='oui/non' description="Permettre aux utilisateurs de changer leurs mots de passe depuis LemonLDAP">
|
|
||||||
<value>oui</value>
|
|
||||||
</variable>
|
|
||||||
<variable name='llADPasswordMaxAge' type='number' description="Durée de vie des mots de passe (en secondes)" mode='expert'>
|
|
||||||
<value>5184000</value>
|
|
||||||
</variable>
|
|
||||||
<variable name='llADPasswordExpireWarn' type='number' description="Délai avant affichage d'un message d'alerte sur l'expiration du mot de passe (en secondes)">
|
|
||||||
<value>3456000</value>
|
|
||||||
</variable>
|
|
||||||
<variable name='llResetExpiredPassword' type='oui/non' description="Autoriser le renouvellement des mots de passe expirés">
|
|
||||||
<value>oui</value>
|
<value>oui</value>
|
||||||
</variable>
|
</variable>
|
||||||
<variable name='llResetUrl' type='string' description="Adresse de l'application pour réinitialiser leurs mots de passe" />
|
<variable name='llResetUrl' type='string' description="Adresse de l'application pour réinitialiser leurs mots de passe" />
|
||||||
|
@ -149,34 +118,20 @@
|
||||||
<param>['ldaps','ldap']</param>
|
<param>['ldaps','ldap']</param>
|
||||||
</check>
|
</check>
|
||||||
|
|
||||||
<check name="valid_enum" target="lemon_user_db">
|
|
||||||
<param>['LDAP','AD']</param>
|
|
||||||
</check>
|
|
||||||
|
|
||||||
<check name='valid_enum' target="lm_loglevel">
|
|
||||||
<param>['info','notice','warn','error','debug']</param>
|
|
||||||
</check>
|
|
||||||
|
|
||||||
<check name="valid_enum" target="llRegisterDB">
|
<check name="valid_enum" target="llRegisterDB">
|
||||||
<param>['LDAP','AD','Demo','Custom']</param>
|
<param>['LDAP','Demo','Custom']</param>
|
||||||
</check>
|
</check>
|
||||||
|
|
||||||
<group master="casAttribute">
|
<group master="casAttribute">
|
||||||
<slave>casLDAPAttribute</slave>
|
<slave>casLDAPAttribute</slave>
|
||||||
</group>
|
</group>
|
||||||
|
|
||||||
<condition name='disabled_if_not_in' source='lemon_user_db'>
|
|
||||||
<param>AD</param>
|
|
||||||
<target type='variable'>llADPasswordMaxAge</target>
|
|
||||||
<target type='variable'>llADPasswordExpireWarn</target>
|
|
||||||
</condition>
|
|
||||||
|
|
||||||
<condition name='disabled_if_in' source='activerLemon'>
|
<condition name='disabled_if_in' source='activerLemon'>
|
||||||
<param>non</param>
|
<param>non</param>
|
||||||
<target type='filelist'>lemonldap</target>
|
<target type='filelist'>lemonldap</target>
|
||||||
<target type='filelist'>lemonldap-nginx</target>
|
<target type='filelist'>lemonldap-nginx</target>
|
||||||
<target type='filelist'>lemonldap-apache</target>
|
<target type='filelist'>lemonldap-apache</target>
|
||||||
<target type='servicelist'>lemonldap-apache</target>
|
<target type='servicelist'>lemonldap-apache</target>
|
||||||
<target type='servicelist'>sllemon</target>
|
|
||||||
<target type='family'>LemonLDAP</target>
|
<target type='family'>LemonLDAP</target>
|
||||||
<target type='service_accesslist'>saLemon</target>
|
<target type='service_accesslist'>saLemon</target>
|
||||||
</condition>
|
</condition>
|
||||||
|
@ -203,7 +158,6 @@
|
||||||
<condition name='disabled_if_in' source='llResetPassword'>
|
<condition name='disabled_if_in' source='llResetPassword'>
|
||||||
<param>non</param>
|
<param>non</param>
|
||||||
<target type='variable'>llResetUrl</target>
|
<target type='variable'>llResetUrl</target>
|
||||||
<target type='variable'>llResetExpiredPassword</target>
|
|
||||||
</condition>
|
</condition>
|
||||||
<check name='valid_enum' target='llSkin'>
|
<check name='valid_enum' target='llSkin'>
|
||||||
<param>['bootstrap','dark','impact','pastel']</param>
|
<param>['bootstrap','dark','impact','pastel']</param>
|
||||||
|
|
|
@ -7,11 +7,19 @@
|
||||||
|
|
||||||
<family name='eole sso'>
|
<family name='eole sso'>
|
||||||
<variable name='eolesso_adresse' description="Nom de domaine du serveur d'authentification SSO" redefine="True" exists='True' />
|
<variable name='eolesso_adresse' description="Nom de domaine du serveur d'authentification SSO" redefine="True" exists='True' />
|
||||||
|
<variable name='ldap_tls' redefine="True" exists='True' />
|
||||||
|
<variable name='eolesso_cas_folder' redefine="True" exists='True'>
|
||||||
|
<value>cas</value>
|
||||||
|
</variable>
|
||||||
|
<variable name='eolesso_port' redefine="True" exists='True'>
|
||||||
|
<value>443</value>
|
||||||
|
</variable>
|
||||||
</family>
|
</family>
|
||||||
|
|
||||||
</variables>
|
</variables>
|
||||||
|
|
||||||
<constraints>
|
<constraints>
|
||||||
|
|
||||||
<fill name='calc_multi_condition' target='activer_sso'>
|
<fill name='calc_multi_condition' target='activer_sso'>
|
||||||
<param>oui</param>
|
<param>oui</param>
|
||||||
<param type='eole' name='condition_1'>activerLemon</param>
|
<param type='eole' name='condition_1'>activerLemon</param>
|
||||||
|
@ -24,6 +32,12 @@
|
||||||
<target type='variable'>activer_sso</target>
|
<target type='variable'>activer_sso</target>
|
||||||
</condition>
|
</condition>
|
||||||
|
|
||||||
|
<auto name='calc_multi_condition' target='ldapScheme'>
|
||||||
|
<param>oui</param>
|
||||||
|
<param type='eole' name='condition_1'>ldap_tls</param>
|
||||||
|
<param name='match'>ldaps</param>
|
||||||
|
<param name='default_mismatch'>ldap</param>
|
||||||
|
</auto>
|
||||||
|
|
||||||
<fill name='calc_val_first_value' target='eolesso_adresse'>
|
<fill name='calc_val_first_value' target='eolesso_adresse'>
|
||||||
<param type='eole' optional='True' hidden='False'>authWebName</param>
|
<param type='eole' optional='True' hidden='False'>authWebName</param>
|
||||||
|
@ -36,13 +50,6 @@
|
||||||
<target type='variable'>eolesso_adresse</target>
|
<target type='variable'>eolesso_adresse</target>
|
||||||
</condition>
|
</condition>
|
||||||
|
|
||||||
<auto name='calc_multi_condition' target='ldapScheme'>
|
|
||||||
<param>oui</param>
|
|
||||||
<param type='eole' name='condition_1'>ldap_tls</param>
|
|
||||||
<param name='match'>ldaps</param>
|
|
||||||
<param name='default_mismatch'>ldap</param>
|
|
||||||
</auto>
|
|
||||||
|
|
||||||
<auto name='calc_val' target='ldapServer'>
|
<auto name='calc_val' target='ldapServer'>
|
||||||
<param type='eole'>adresse_ip_ldap</param>
|
<param type='eole'>adresse_ip_ldap</param>
|
||||||
</auto>
|
</auto>
|
||||||
|
@ -51,16 +58,10 @@
|
||||||
<param type='eole'>ldap_port</param>
|
<param type='eole'>ldap_port</param>
|
||||||
</auto>
|
</auto>
|
||||||
|
|
||||||
<auto name='calc_val' target='lemon_user_db'>
|
|
||||||
<param>LDAP</param>
|
|
||||||
</auto>
|
|
||||||
|
|
||||||
<auto name='calc_val' target='llRegisterDB'>
|
|
||||||
<param>LDAP</param>
|
|
||||||
</auto>
|
|
||||||
<auto name='calc_val' target='ldapUserBaseDN'>
|
<auto name='calc_val' target='ldapUserBaseDN'>
|
||||||
<param type='eole'>ldap_base_dn</param>
|
<param type='eole'>ldap_base_dn</param>
|
||||||
</auto>
|
</auto>
|
||||||
|
|
||||||
<auto name='calc_val' target='ldapBindUserDN'>
|
<auto name='calc_val' target='ldapBindUserDN'>
|
||||||
<param type='eole'>ldap_reader</param>
|
<param type='eole'>ldap_reader</param>
|
||||||
</auto>
|
</auto>
|
||||||
|
|
|
@ -1,2 +0,0 @@
|
||||||
creolefuncs_DATA_DIR := $(DESTDIR)/usr/share/creole/funcs
|
|
||||||
lemonldap-ng_DATA_DIR := $(eole_DIR)/lemonldap-ng
|
|
|
@ -0,0 +1 @@
|
||||||
|
creolefuncs_DATA_DIR := $(DESTDIR)/usr/share/creole/funcs
|
|
@ -1,102 +0,0 @@
|
||||||
package Lemonldap::NG::Portal::UserDB::LDAP;
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
use Mouse;
|
|
||||||
use utf8;
|
|
||||||
use Lemonldap::NG::Portal::Main::Constants qw(PE_OK);
|
|
||||||
|
|
||||||
extends 'Lemonldap::NG::Portal::Lib::LDAP';
|
|
||||||
|
|
||||||
our $VERSION = '2.0.6';
|
|
||||||
|
|
||||||
has ldapGroupAttributeNameSearch => (
|
|
||||||
is => 'rw',
|
|
||||||
lazy => 1,
|
|
||||||
builder => sub {
|
|
||||||
my $attributes = [];
|
|
||||||
@$attributes =
|
|
||||||
split( /\s+/, $_[0]->{conf}->{ldapGroupAttributeNameSearch} )
|
|
||||||
if $_[0]->{conf}->{ldapGroupAttributeNameSearch};
|
|
||||||
push( @$attributes, $_[0]->{conf}->{ldapGroupAttributeNameGroup} )
|
|
||||||
if ( $_[0]->{conf}->{ldapGroupRecursive}
|
|
||||||
and $_[0]->{conf}->{ldapGroupAttributeNameGroup} ne "dn" );
|
|
||||||
return $attributes;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
# RUNNING METHODS
|
|
||||||
#
|
|
||||||
# getUser is provided by Portal::Lib::LDAP
|
|
||||||
|
|
||||||
# Load all parameters included in exportedVars parameter.
|
|
||||||
# Multi-value parameters are loaded in a single string with
|
|
||||||
# a separator (param multiValuesSeparator)
|
|
||||||
# @return Lemonldap::NG::Portal constant
|
|
||||||
sub setSessionInfo {
|
|
||||||
my ( $self, $req ) = @_;
|
|
||||||
$req->{sessionInfo}->{_dn} = $req->data->{dn};
|
|
||||||
|
|
||||||
my %vars = ( %{ $self->conf->{exportedVars} },
|
|
||||||
%{ $self->conf->{ldapExportedVars} } );
|
|
||||||
while ( my ( $k, $v ) = each %vars ) {
|
|
||||||
|
|
||||||
# getLdapValue returns an empty string for missing attribute
|
|
||||||
# but we really want to return undef so they don't get stored in session
|
|
||||||
$req->sessionInfo->{$k} =
|
|
||||||
$self->ldap->getLdapValue( $req->data->{ldapentry}, $v ) || undef;
|
|
||||||
}
|
|
||||||
|
|
||||||
PE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
# Load all groups in $groups.
|
|
||||||
# @return Lemonldap::NG::Portal constant
|
|
||||||
sub setGroups {
|
|
||||||
my ( $self, $req ) = @_;
|
|
||||||
my $groups = $req->{sessionInfo}->{groups};
|
|
||||||
my $hGroups = $req->{sessionInfo}->{hGroups};
|
|
||||||
|
|
||||||
if ( $self->conf->{ldapGroupBase} ) {
|
|
||||||
|
|
||||||
# Get value for group search
|
|
||||||
my $group_value = $self->ldap->getLdapValue( $req->data->{ldapentry},
|
|
||||||
$self->conf->{ldapGroupAttributeNameUser} );
|
|
||||||
|
|
||||||
if ( $self->conf->{ldapGroupDecodeSearchedValue} ) {
|
|
||||||
utf8::decode($group_value);
|
|
||||||
}
|
|
||||||
|
|
||||||
$self->logger->debug( "Searching LDAP groups in "
|
|
||||||
. $self->conf->{ldapGroupBase}
|
|
||||||
. " for $group_value" );
|
|
||||||
|
|
||||||
# Call searchGroups
|
|
||||||
my $ldapGroups = $self->ldap->searchGroups(
|
|
||||||
$self->conf->{ldapGroupBase},
|
|
||||||
$self->conf->{ldapGroupAttributeName},
|
|
||||||
$group_value,
|
|
||||||
$self->ldapGroupAttributeNameSearch,
|
|
||||||
$req->{ldapGroupDuplicateCheck}
|
|
||||||
);
|
|
||||||
|
|
||||||
foreach ( keys %$ldapGroups ) {
|
|
||||||
my $groupName = $_;
|
|
||||||
$hGroups->{$groupName} = $ldapGroups->{$groupName};
|
|
||||||
my $groupValues = [];
|
|
||||||
foreach ( @{ $self->ldapGroupAttributeNameSearch } ) {
|
|
||||||
next if $_ =~ /^name$/;
|
|
||||||
my $firstValue = $ldapGroups->{$groupName}->{$_}->[0];
|
|
||||||
push @$groupValues, $firstValue;
|
|
||||||
}
|
|
||||||
$groups .= $self->conf->{multiValuesSeparator} if $groups;
|
|
||||||
$groups .= join( '|', @$groupValues );
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
$req->{sessionInfo}->{groups} = $groups;
|
|
||||||
$req->{sessionInfo}->{hGroups} = $hGroups;
|
|
||||||
PE_OK;
|
|
||||||
}
|
|
||||||
|
|
||||||
1;
|
|
|
@ -1,20 +0,0 @@
|
||||||
--- /usr/share/perl5/Lemonldap/NG/Portal/UserDB/LDAP.pm.old 2019-12-11 12:05:54.000000000 +0100
|
|
||||||
+++ /usr/share/perl5/Lemonldap/NG/Portal/UserDB/LDAP.pm 2021-01-05 10:54:19.188732119 +0100
|
|
||||||
@@ -40,10 +40,15 @@
|
|
||||||
%{ $self->conf->{ldapExportedVars} } );
|
|
||||||
while ( my ( $k, $v ) = each %vars ) {
|
|
||||||
|
|
||||||
+ my $value = $self->ldap->getLdapValue( $req->data->{ldapentry}, $v );
|
|
||||||
+
|
|
||||||
# getLdapValue returns an empty string for missing attribute
|
|
||||||
# but we really want to return undef so they don't get stored in session
|
|
||||||
- $req->sessionInfo->{$k} =
|
|
||||||
- $self->ldap->getLdapValue( $req->data->{ldapentry}, $v ) || undef;
|
|
||||||
+ # This has to be a string comparison because "0" is a valid attribute
|
|
||||||
+ # value. See #2403
|
|
||||||
+ $value = undef if ( $value eq "" );
|
|
||||||
+
|
|
||||||
+ $req->sessionInfo->{$k} = $value;
|
|
||||||
}
|
|
||||||
|
|
||||||
PE_OK;
|
|
|
@ -1,12 +1,6 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
[ "$(CreoleGet activerLemon non)" = 'oui' ] || exit 0
|
||||||
[[ $(CreoleGet activerLemon non) == "non" ]] && exit 0
|
|
||||||
|
|
||||||
# Updating Configuration cache
|
|
||||||
|
|
||||||
cmd="/usr/share/lemonldap-ng/bin/lemonldap-ng-cli update-cache"
|
|
||||||
opt="update-cache"
|
|
||||||
|
|
||||||
# Updating Configuration cache
|
# Updating Configuration cache
|
||||||
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli update-cache 2>&1
|
/usr/share/lemonldap-ng/bin/lemonldap-ng-cli update-cache 2>&1
|
||||||
|
|
|
@ -1,12 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# vérifie si le patch est déjà appliqué
|
|
||||||
grep -q 2403 /usr/share/perl5/Lemonldap/NG/Portal/UserDB/LDAP.pm && exit 0
|
|
||||||
|
|
||||||
# copie de sauvegarde
|
|
||||||
cp -a /usr/share/perl5/Lemonldap/NG/Portal/UserDB/LDAP.pm /usr/share/eole/lemonldap-ng/
|
|
||||||
|
|
||||||
# application du patch
|
|
||||||
patch -d / -p 0 < /usr/share/eole/lemonldap-ng/LDAP.pm.patch
|
|
||||||
|
|
||||||
exit 0
|
|
|
@ -29,17 +29,6 @@ ErrorDocument 503 https://%%authWebName/lmerror/503
|
||||||
<VirtualHost %%adresse_ip_eth0:443>
|
<VirtualHost %%adresse_ip_eth0:443>
|
||||||
ServerName %%reloadWebName
|
ServerName %%reloadWebName
|
||||||
|
|
||||||
SSLEngine on
|
|
||||||
SSLCertificateFile %%server_cert
|
|
||||||
SSLCertificateKeyFile %%server_key
|
|
||||||
SSLCertificateChainFile /etc/ssl/certs/ca_local.crt
|
|
||||||
SSLProtocol all -SSLv3 -SSLv2
|
|
||||||
SSLProxyEngine on
|
|
||||||
|
|
||||||
LogLevel %%lm_loglevel
|
|
||||||
|
|
||||||
ErrorLog /var/log/apache2/handler_error.log
|
|
||||||
CustomLog /var/log/apache2/handler_access.log common
|
|
||||||
# Configuration reload mechanism (only 1 per physical server is
|
# Configuration reload mechanism (only 1 per physical server is
|
||||||
# needed): choose your URL to avoid restarting Apache when
|
# needed): choose your URL to avoid restarting Apache when
|
||||||
# configuration change
|
# configuration change
|
||||||
|
|
|
@ -23,7 +23,8 @@ server {
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 ssl;
|
listen 443;
|
||||||
|
ssl on;
|
||||||
%if %%cert_type == "letsencrypt"
|
%if %%cert_type == "letsencrypt"
|
||||||
ssl_certificate %%le_config_dir/live/%%managerWebName/cert.pem;
|
ssl_certificate %%le_config_dir/live/%%managerWebName/cert.pem;
|
||||||
ssl_certificate_key %%le_config_dir/live/%%managerWebName/privkey.pem;
|
ssl_certificate_key %%le_config_dir/live/%%managerWebName/privkey.pem;
|
||||||
|
@ -61,7 +62,7 @@ server {
|
||||||
deny all;
|
deny all;
|
||||||
|
|
||||||
# Uncomment this if you use https only
|
# Uncomment this if you use https only
|
||||||
add_header Strict-Transport-Security "max-age=15768000";
|
#add_header Strict-Transport-Security "max-age=15768000";
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -36,7 +36,7 @@
|
||||||
;
|
;
|
||||||
; 1 - Defined logging level
|
; 1 - Defined logging level
|
||||||
; Set here one of error, warn, notice, info or debug
|
; Set here one of error, warn, notice, info or debug
|
||||||
logLevel = %%lm_loglevel
|
logLevel = debug
|
||||||
; Note that this has no effect for Apache2 logging: Apache LogLevel is used
|
; Note that this has no effect for Apache2 logging: Apache LogLevel is used
|
||||||
; instead
|
; instead
|
||||||
;
|
;
|
||||||
|
@ -65,9 +65,9 @@ logLevel = %%lm_loglevel
|
||||||
; 2.1 - Using Syslog
|
; 2.1 - Using Syslog
|
||||||
;
|
;
|
||||||
; For Syslog logging, you can also overwrite facilities. Default values:
|
; For Syslog logging, you can also overwrite facilities. Default values:
|
||||||
logger = Lemonldap::NG::Common::Logger::Syslog
|
;logger = Lemonldap::NG::Common::Logger::Syslog
|
||||||
syslogFacility = daemon
|
;syslogFacility = daemon
|
||||||
userSyslogFacility = auth
|
;userSyslogFacility = auth
|
||||||
;
|
;
|
||||||
; 2.2 - Using Log4perl
|
; 2.2 - Using Log4perl
|
||||||
;
|
;
|
||||||
|
@ -197,11 +197,11 @@ portalSkin = %%llSkin
|
||||||
; Modules displayed
|
; Modules displayed
|
||||||
;portalDisplayLogout = 1
|
;portalDisplayLogout = 1
|
||||||
portalDisplayResetPassword = %%boolean[%%llResetPassword]
|
portalDisplayResetPassword = %%boolean[%%llResetPassword]
|
||||||
portalDisplayChangePassword = %%boolean[%%llChangePassword]
|
;portalDisplayChangePassword = 1
|
||||||
;portalDisplayAppslist = 1
|
;portalDisplayAppslist = 1
|
||||||
;portalDisplayLoginHistory = 1
|
;portalDisplayLoginHistory = 1
|
||||||
; Require the old password when changing password
|
; Require the old password when changing password
|
||||||
portalRequireOldPassword = %%boolean[%%llChangePassword]
|
;portalRequireOldPassword = 1
|
||||||
; Attribute displayed as connected user
|
; Attribute displayed as connected user
|
||||||
;portalUserAttr = mail
|
;portalUserAttr = mail
|
||||||
; Old menu HTML code
|
; Old menu HTML code
|
||||||
|
|
|
@ -1,30 +1,20 @@
|
||||||
%set %%boolean = {'oui': 1, 'non': 0}
|
%set %%boolean = {'oui': 1, 'non': 0}
|
||||||
%set %%ssoFilters = %%getSSOFilters
|
%set %%ssoFilters = %%getSSOFilters
|
||||||
%set %%ldapAttributes = {"uid": "uid", "mail": "mail", "cn":"cn"}
|
|
||||||
%set %%exported_vars = ['"UA": "HTTP_USER_AGENT"']
|
%set %%exported_vars = ['"UA": "HTTP_USER_AGENT"']
|
||||||
%set %%cas_attributes = []
|
%set %%cas_attributes = []
|
||||||
%set %%ldap_attributes = {}
|
|
||||||
%for %%attr in %%casAttribute
|
%for %%attr in %%casAttribute
|
||||||
%silent %%exported_vars.append('"' + %%attr + '": "' + %%attr.casLDAPAttribute + '"')
|
%silent %%exported_vars.append('"' + %%attr + '": "' + %%attr + '.casLDAPAttribute"')
|
||||||
%silent %%cas_attributes.append('"' + %%attr + '": "' + %%attr.casLDAPAttribute + '"')
|
%silent %%cas_attributes.append('"' + %%attr + '": "' + %%attr + '.casLDAPAttribute"')
|
||||||
%set %%ldap_attributes[%%attr.casLDAPAttribute] = %%attr.casLDAPAttribute
|
|
||||||
%end for
|
%end for
|
||||||
%for %%key, %%value in %%ssoFilters
|
%for %%key, %%value in %%ssoFilters
|
||||||
%silent %%exported_vars.append('"' + %%key + '": "' + %%value + '"')
|
%silent %%exported_vars.append('"' + %%key + '": "' + %%value + '"')
|
||||||
%silent %%cas_attributes.append('"' + %%key + '": "' + %%value + '"')
|
%silent %%cas_attributes.append('"' + %%key + '": "' + %%value + '"')
|
||||||
%set %%ldap_attributes[%%value] = %%value
|
|
||||||
%end for
|
%end for
|
||||||
%silent %%exported_vars.sort()
|
%silent %%exported_vars.sort()
|
||||||
%silent %%cas_attributes.sort()
|
%silent %%cas_attributes.sort()
|
||||||
%set %%ldapAttr = []
|
|
||||||
%for %%k, %%v in %%ldap_attributes.items()
|
|
||||||
%silent %%ldapAttr.append('"' + %%k + '": "' + %%v + '"')
|
|
||||||
%end for
|
|
||||||
{
|
{
|
||||||
%if %%lemon_user_db == "AD"
|
"ADPwdExpireWarning": 0,
|
||||||
"ADPwdExpireWarning": %%llADPasswordExpireWarn,
|
"ADPwdMaxAge": 0,
|
||||||
"ADPwdMaxAge": %%llADPasswordMaxAge,
|
|
||||||
%end if
|
|
||||||
"CAS_authnLevel": 1,
|
"CAS_authnLevel": 1,
|
||||||
"CAS_pgtFile": "/tmp/pgt.txt",
|
"CAS_pgtFile": "/tmp/pgt.txt",
|
||||||
"CAS_proxiedServices": {},
|
"CAS_proxiedServices": {},
|
||||||
|
@ -95,7 +85,7 @@
|
||||||
},
|
},
|
||||||
"authChoiceModules": {},
|
"authChoiceModules": {},
|
||||||
"authChoiceParam": "lmAuth",
|
"authChoiceParam": "lmAuth",
|
||||||
"authentication": "%%lemon_user_db",
|
"authentication": "LDAP",
|
||||||
"browserIdAuthnLevel": 1,
|
"browserIdAuthnLevel": 1,
|
||||||
"captchaStorage": "Apache::Session::File",
|
"captchaStorage": "Apache::Session::File",
|
||||||
"captchaStorageOptions": {
|
"captchaStorageOptions": {
|
||||||
|
@ -162,26 +152,14 @@
|
||||||
"issuerDBSAMLRule": 1,
|
"issuerDBSAMLRule": 1,
|
||||||
"jsRedirect": 0,
|
"jsRedirect": 0,
|
||||||
"key": "e\"bTCt3*eU9^\\V%b",
|
"key": "e\"bTCt3*eU9^\\V%b",
|
||||||
%if %%llResetPassword == "oui"
|
|
||||||
%if %%llResetExpiredPassword == "oui"
|
|
||||||
%if %%lemon_user_db == "AD"
|
|
||||||
"ldapPpolicyControl": 0,
|
|
||||||
%else
|
|
||||||
"ldapPpolicyControl": 1,
|
|
||||||
%end if
|
|
||||||
"ldapAllowResetExpiredPassword": 1,
|
|
||||||
"ldapChangePasswordAsUser": 1,
|
|
||||||
%else
|
|
||||||
"ldapPpolicyControl": 0,
|
|
||||||
"ldapAllowResetExpiredPassword": 0,
|
"ldapAllowResetExpiredPassword": 0,
|
||||||
"ldapChangePasswordAsUser": 1,
|
|
||||||
%end if
|
|
||||||
%end if
|
|
||||||
"ldapAuthnLevel": 2,
|
"ldapAuthnLevel": 2,
|
||||||
"ldapSearchDeref": "find",
|
|
||||||
"ldapBase": "%%ldapUserBaseDN",
|
"ldapBase": "%%ldapUserBaseDN",
|
||||||
|
"ldapChangePasswordAsUser": 0,
|
||||||
"ldapExportedVars": {
|
"ldapExportedVars": {
|
||||||
%%custom_join(%%ldapAttr, ',\n ')
|
"cn": "cn",
|
||||||
|
"mail": "mail",
|
||||||
|
"uid": "uid"
|
||||||
},
|
},
|
||||||
"ldapGroupAttributeName": "memberUid",
|
"ldapGroupAttributeName": "memberUid",
|
||||||
"ldapGroupAttributeNameGroup": "dn",
|
"ldapGroupAttributeNameGroup": "dn",
|
||||||
|
@ -192,15 +170,9 @@
|
||||||
"ldapPasswordResetAttribute": "pwdReset",
|
"ldapPasswordResetAttribute": "pwdReset",
|
||||||
"ldapPasswordResetAttributeValue": "TRUE",
|
"ldapPasswordResetAttributeValue": "TRUE",
|
||||||
"ldapPort": "%%ldapServerPort",
|
"ldapPort": "%%ldapServerPort",
|
||||||
|
"ldapPpolicyControl": 0,
|
||||||
"ldapPwdEnc": "utf-8",
|
"ldapPwdEnc": "utf-8",
|
||||||
"ldapServer": "%%ldapScheme://%%ldapServer",
|
"ldapServer": "%%ldapScheme://%%ldapServer",
|
||||||
%if %%ldapScheme == "ldaps"
|
|
||||||
%if %%lmldapverify == "oui"
|
|
||||||
"ldapVerify": "Require",
|
|
||||||
%else
|
|
||||||
"ldapVerify": "None",
|
|
||||||
%end if
|
|
||||||
%end if
|
|
||||||
"ldapSetPassword": 0,
|
"ldapSetPassword": 0,
|
||||||
"ldapTimeout": 120,
|
"ldapTimeout": 120,
|
||||||
"ldapUsePasswordResetAttribute": 1,
|
"ldapUsePasswordResetAttribute": 1,
|
||||||
|
@ -233,7 +205,7 @@
|
||||||
"mailTimeout": 0,
|
"mailTimeout": 0,
|
||||||
%if %%llResetPassword == "oui"
|
%if %%llResetPassword == "oui"
|
||||||
%if %%is_empty(%%llResetUrl)
|
%if %%is_empty(%%llResetUrl)
|
||||||
"mailUrl": "https://%%authWebName/resetpwd",
|
"mailUrl": "https://%%authWebName/mail.pl",
|
||||||
%else
|
%else
|
||||||
"mailUrl": "%%llResetUrl",
|
"mailUrl": "%%llResetUrl",
|
||||||
%end if
|
%end if
|
||||||
|
@ -272,7 +244,7 @@
|
||||||
"openIdSreg_fullname": "cn",
|
"openIdSreg_fullname": "cn",
|
||||||
"openIdSreg_nickname": "uid",
|
"openIdSreg_nickname": "uid",
|
||||||
"openIdSreg_timezone": "_timezone",
|
"openIdSreg_timezone": "_timezone",
|
||||||
"passwordDB": "%%lemon_user_db",
|
"passwordDB": "LDAP",
|
||||||
"persistentStorage": "Apache::Session::File",
|
"persistentStorage": "Apache::Session::File",
|
||||||
"persistentStorageOptions": {
|
"persistentStorageOptions": {
|
||||||
"Directory": "/var/lib/lemonldap-ng/psessions",
|
"Directory": "/var/lib/lemonldap-ng/psessions",
|
||||||
|
@ -282,10 +254,10 @@
|
||||||
"portalAntiFrame": 1,
|
"portalAntiFrame": 1,
|
||||||
"portalCheckLogins": %%boolean[%%llCheckLogins],
|
"portalCheckLogins": %%boolean[%%llCheckLogins],
|
||||||
"portalDisplayAppslist": 1,
|
"portalDisplayAppslist": 1,
|
||||||
"portalDisplayChangePassword": "$_auth =~ /^(AD|LDAP|DBI|Demo)$/",
|
"portalDisplayChangePassword": "$_auth =~ /^(LDAP|DBI|Demo)$/",
|
||||||
"portalDisplayLoginHistory": 1,
|
"portalDisplayLoginHistory": 1,
|
||||||
"portalDisplayLogout": 1,
|
"portalDisplayLogout": 1,
|
||||||
"portalDisplayRegister": %%boolean[%%llRegisterAccount],
|
"portalDisplayRegister": 1,
|
||||||
"portalDisplayResetPassword": %%boolean[%%llResetPassword],
|
"portalDisplayResetPassword": %%boolean[%%llResetPassword],
|
||||||
"portalForceAuthn": 0,
|
"portalForceAuthn": 0,
|
||||||
"portalForceAuthnInterval": 0,
|
"portalForceAuthnInterval": 0,
|
||||||
|
@ -392,7 +364,7 @@
|
||||||
"useRedirectOnForbidden": 0,
|
"useRedirectOnForbidden": 0,
|
||||||
"useSafeJail": 1,
|
"useSafeJail": 1,
|
||||||
"userControl": "^[\\w\\.\\-@]+$",
|
"userControl": "^[\\w\\.\\-@]+$",
|
||||||
"userDB": "%%lemon_user_db",
|
"userDB": "LDAP",
|
||||||
"vhostOptions": {
|
"vhostOptions": {
|
||||||
"%%managerWebName": {
|
"%%managerWebName": {
|
||||||
"vhostHttps": "1"
|
"vhostHttps": "1"
|
||||||
|
|
|
@ -13,13 +13,13 @@
|
||||||
<VirtualHost %%adresse_ip_eth0:443>
|
<VirtualHost %%adresse_ip_eth0:443>
|
||||||
ServerName %%managerWebName
|
ServerName %%managerWebName
|
||||||
SSLEngine on
|
SSLEngine on
|
||||||
SSLCertificateFile %%server_cert
|
SSLCertificateFile /etc/ssl/certs/eole.crt
|
||||||
SSLCertificateKeyFile %%server_key
|
SSLCertificateKeyFile /etc/ssl/private/eole.key
|
||||||
SSLCertificateChainFile /etc/ssl/certs/ca_local.crt
|
SSLCertificateChainFile /etc/ssl/certs/ca_local.crt
|
||||||
SSLProtocol all -SSLv3 -SSLv2
|
SSLProtocol all -SSLv3 -SSLv2
|
||||||
SSLProxyEngine on
|
SSLProxyEngine on
|
||||||
|
|
||||||
LogLevel %%lm_loglevel
|
LogLevel info
|
||||||
ErrorLog /var/log/apache2/manager_error.log
|
ErrorLog /var/log/apache2/manager_error.log
|
||||||
CustomLog /var/log/apache2/manager_access.log common
|
CustomLog /var/log/apache2/manager_access.log common
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,8 @@ server {
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 ssl;
|
listen 443;
|
||||||
|
ssl on;
|
||||||
%if %%cert_type == "letsencrypt"
|
%if %%cert_type == "letsencrypt"
|
||||||
ssl_certificate %%le_config_dir/live/%%managerWebName/cert.pem;
|
ssl_certificate %%le_config_dir/live/%%managerWebName/cert.pem;
|
||||||
ssl_certificate_key %%le_config_dir/live/%%managerWebName/privkey.pem;
|
ssl_certificate_key %%le_config_dir/live/%%managerWebName/privkey.pem;
|
||||||
|
@ -69,8 +70,8 @@ server {
|
||||||
|
|
||||||
# DEBIAN
|
# DEBIAN
|
||||||
# If install was made with USEDEBIANLIBS (official releases), uncomment this
|
# If install was made with USEDEBIANLIBS (official releases), uncomment this
|
||||||
location /javascript/ {
|
#location /javascript/ {
|
||||||
alias /usr/share/javascript/;
|
# alias /usr/share/javascript/;
|
||||||
}
|
#}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,3 @@
|
||||||
log_format lm_app '$remote_addr - $upstream_http_lm_remote_user [$time_local] '
|
log_format lm_combined '$remote_addr - $lmremote_user [$time_local] '
|
||||||
'"$request" $status $body_bytes_sent '
|
'"$request" $status $body_bytes_sent '
|
||||||
'"$http_referer" "$http_user_agent" $upstream_http_lm_remote_custom';
|
'"$http_referer" "$http_user_agent"';
|
||||||
|
|
|
@ -13,13 +13,13 @@
|
||||||
<VirtualHost %%adresse_ip_eth0:443>
|
<VirtualHost %%adresse_ip_eth0:443>
|
||||||
ServerName %%authWebName
|
ServerName %%authWebName
|
||||||
SSLEngine on
|
SSLEngine on
|
||||||
SSLCertificateFile %%server_cert
|
SSLCertificateFile /etc/ssl/certs/eole.crt
|
||||||
SSLCertificateKeyFile %%server_key
|
SSLCertificateKeyFile /etc/ssl/private/eole.key
|
||||||
SSLCertificateChainFile /etc/ssl/certs/ca_local.crt
|
SSLCertificateChainFile /etc/ssl/certs/ca_local.crt
|
||||||
SSLProtocol all -SSLv3 -SSLv2
|
SSLProtocol all -SSLv3 -SSLv2
|
||||||
SSLProxyEngine on
|
SSLProxyEngine on
|
||||||
|
|
||||||
LogLevel %%lm_loglevel
|
LogLevel info
|
||||||
ErrorLog /var/log/apache2/portal_error.log
|
ErrorLog /var/log/apache2/portal_error.log
|
||||||
CustomLog /var/log/apache2/portal_access.log common
|
CustomLog /var/log/apache2/portal_access.log common
|
||||||
|
|
||||||
|
|
|
@ -15,7 +15,8 @@ server {
|
||||||
}
|
}
|
||||||
|
|
||||||
server {
|
server {
|
||||||
listen 443 ssl;
|
listen 443;
|
||||||
|
ssl on;
|
||||||
%if %%cert_type == "letsencrypt"
|
%if %%cert_type == "letsencrypt"
|
||||||
ssl_certificate %%le_config_dir/live/%%authWebName/cert.pem;
|
ssl_certificate %%le_config_dir/live/%%authWebName/cert.pem;
|
||||||
ssl_certificate_key %%le_config_dir/live/%%authWebName/privkey.pem;
|
ssl_certificate_key %%le_config_dir/live/%%authWebName/privkey.pem;
|
||||||
|
@ -82,7 +83,7 @@ server {
|
||||||
|
|
||||||
# DEBIAN
|
# DEBIAN
|
||||||
# If install was made with USEDEBIANLIBS (official releases), uncomment this
|
# If install was made with USEDEBIANLIBS (official releases), uncomment this
|
||||||
location /javascript/ {
|
#location /javascript/ {
|
||||||
alias /usr/share/javascript/;
|
# alias /usr/share/javascript/;
|
||||||
}
|
#}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue