From 0ce522a7dadd0a616428fa19b198857b8ace0a73 Mon Sep 17 00:00:00 2001 From: Trevor Batley Date: Sat, 7 Sep 2024 20:31:18 +1000 Subject: [PATCH] initial commit of file from CVS for smeserver-lemonldap-ng on Sat Sep 7 20:31:17 AEST 2024 --- .gitignore | 4 + Makefile | 21 ++ README.md | 17 +- additional/.tito/packages/.readme | 3 + .../.tito/packages/smeserver-lemonldap-ng | 1 + additional/.tito/releasers.conf | 1 + additional/.tito/tito.props | 6 + additional/smeserver-lemonldap-ng.spec | 204 +++++++++++++++++ contriborbase | 1 + createlinks | 14 ++ .../db/accounts/defaults/lm-reload/type | 1 + .../configuration/defaults/lemonldap/status | 1 + .../db/configuration/defaults/lemonldap/type | 1 + .../configuration/migrate/90MigrateLemonLDAP | 14 ++ .../migrate/lemonldap-enable-mod_perl | 12 + .../migrate/lemonldap-soappasswd | 13 ++ .../events/actions/lemonldap-init-domains | 88 ++++++++ .../events/actions/lemonldap-update-conf | 43 ++++ .../etc/lemonldap-ng/lemonldap-ng.ini | 3 + .../etc/lemonldap-ng/soap-htpasswd | 3 + .../var/lib/lemonldap-ng/conf/lmConf-2 | 3 + .../httpd/conf/httpd.conf/97LemonLDAPHandler | 34 +++ .../conf/httpd.conf/LemonLDAPManager/00Setup | 10 + .../httpd.conf/LemonLDAPManager/10ServerName | 1 + .../LemonLDAPManager/80LemonLDAPManager | 114 ++++++++++ .../LemonLDAPManager/template-begin | 2 + .../httpd.conf/LemonLDAPManager/template-end | 2 + .../conf/httpd.conf/LemonLDAPPortal/00Setup | 10 + .../httpd.conf/LemonLDAPPortal/10ServerName | 1 + .../LemonLDAPPortal/80LemonLDAPPortal | 133 +++++++++++ .../httpd.conf/LemonLDAPPortal/template-begin | 2 + .../httpd.conf/LemonLDAPPortal/template-end | 2 + .../conf/httpd.conf/LemonLDAPSoap/00Setup | 10 + .../httpd.conf/LemonLDAPSoap/10ServerName | 1 + .../httpd.conf/LemonLDAPSoap/80LemonLDAPSoap | 120 ++++++++++ .../httpd.conf/LemonLDAPSoap/template-begin | 2 + .../httpd.conf/LemonLDAPSoap/template-end | 2 + .../VirtualHosts/05LemonLDAPHandler | 21 ++ .../WebAppVirtualHost/05LemonLDAPHandler | 21 ++ .../lemonldap-ng/lemonldap-ng.ini/00header | 19 ++ .../etc/lemonldap-ng/lemonldap-ng.ini/05All | 7 + .../lemonldap-ng.ini/10configuration | 11 + .../etc/lemonldap-ng/lemonldap-ng.ini/15apply | 11 + .../lemonldap-ng/lemonldap-ng.ini/20manager | 10 + .../lemonldap-ng/lemonldap-ng.ini/25handler | 6 + .../lemonldap-ng/lemonldap-ng.ini/30portal | 3 + .../lemonldap-ng/soap-htpasswd/05lemonsoap | 6 + .../var/lib/lemonldap-ng/conf/lmConf/000open | 31 +++ .../lib/lemonldap-ng/conf/lmConf/005global | 15 ++ .../var/lib/lemonldap-ng/conf/lmConf/010ldap | 17 ++ .../var/lib/lemonldap-ng/conf/lmConf/015soap | 19 ++ .../var/lib/lemonldap-ng/conf/lmConf/020auth | 34 +++ .../lib/lemonldap-ng/conf/lmConf/025localnet | 45 ++++ .../lemonldap-ng/conf/lmConf/030notifications | 10 + .../lib/lemonldap-ng/conf/lmConf/035portal | 9 + .../lib/lemonldap-ng/conf/lmConf/template-end | 16 ++ .../portal-skins/common/apps/ajaxplorer.png | Bin 0 -> 2088 bytes .../portal-skins/common/apps/backup.png | Bin 0 -> 3644 bytes .../portal-skins/common/apps/backuppc.png | Bin 0 -> 1180 bytes .../portal-skins/common/apps/calendar.png | Bin 0 -> 2642 bytes .../portal-skins/common/apps/camera.png | Bin 0 -> 2058 bytes .../portal-skins/common/apps/dl.png | Bin 0 -> 860 bytes .../portal-skins/common/apps/dokuwiki.png | Bin 0 -> 4288 bytes .../portal-skins/common/apps/freepbx.png | Bin 0 -> 1645 bytes .../portal-skins/common/apps/glpi.png | Bin 0 -> 3303 bytes .../portal-skins/common/apps/jappix.png | Bin 0 -> 1572 bytes .../portal-skins/common/apps/jenkins.png | Bin 0 -> 3383 bytes .../portal-skins/common/apps/lemonldap.png | Bin 0 -> 1576 bytes .../portal-skins/common/apps/mailman.png | Bin 0 -> 1925 bytes .../portal-skins/common/apps/mediawiki.png | Bin 0 -> 2814 bytes .../portal-skins/common/apps/nagios.png | Bin 0 -> 2570 bytes .../portal-skins/common/apps/ntop.png | Bin 0 -> 1411 bytes .../portal-skins/common/apps/openupload.png | Bin 0 -> 3663 bytes .../portal-skins/common/apps/pda.png | Bin 0 -> 2239 bytes .../portal-skins/common/apps/pfsense.png | Bin 0 -> 3335 bytes .../portal-skins/common/apps/phplist.png | Bin 0 -> 1517 bytes .../portal-skins/common/apps/phpmyadmin.png | Bin 0 -> 3814 bytes .../portal-skins/common/apps/power.png | Bin 0 -> 2002 bytes .../portal-skins/common/apps/pydio.png | Bin 0 -> 709 bytes .../portal-skins/common/apps/rdv.png | Bin 0 -> 2526 bytes .../portal-skins/common/apps/redmine.png | Bin 0 -> 3154 bytes .../portal-skins/common/apps/smeserver.png | Bin 0 -> 3074 bytes .../portal-skins/common/apps/survey.png | Bin 0 -> 1578 bytes .../portal-skins/common/apps/telephone.png | Bin 0 -> 1688 bytes .../portal-skins/common/apps/timezone.png | Bin 0 -> 2840 bytes .../portal-skins/common/apps/ttrss.png | Bin 0 -> 2381 bytes .../portal-skins/common/apps/zabbix.png | Bin 0 -> 2801 bytes smeserver-lemonldap-ng.spec | 211 ++++++++++++++++++ 88 files changed, 1420 insertions(+), 2 deletions(-) create mode 100644 .gitignore create mode 100644 Makefile create mode 100644 additional/.tito/packages/.readme create mode 100644 additional/.tito/packages/smeserver-lemonldap-ng create mode 120000 additional/.tito/releasers.conf create mode 100644 additional/.tito/tito.props create mode 100644 additional/smeserver-lemonldap-ng.spec create mode 100644 contriborbase create mode 100644 createlinks create mode 100644 root/etc/e-smith/db/accounts/defaults/lm-reload/type create mode 100644 root/etc/e-smith/db/configuration/defaults/lemonldap/status create mode 100644 root/etc/e-smith/db/configuration/defaults/lemonldap/type create mode 100644 root/etc/e-smith/db/configuration/migrate/90MigrateLemonLDAP create mode 100644 root/etc/e-smith/db/configuration/migrate/lemonldap-enable-mod_perl create mode 100644 root/etc/e-smith/db/configuration/migrate/lemonldap-soappasswd create mode 100644 root/etc/e-smith/events/actions/lemonldap-init-domains create mode 100644 root/etc/e-smith/events/actions/lemonldap-update-conf create mode 100644 root/etc/e-smith/templates.metadata/etc/lemonldap-ng/lemonldap-ng.ini create mode 100644 root/etc/e-smith/templates.metadata/etc/lemonldap-ng/soap-htpasswd create mode 100644 root/etc/e-smith/templates.metadata/var/lib/lemonldap-ng/conf/lmConf-2 create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/97LemonLDAPHandler create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/00Setup create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/10ServerName create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/80LemonLDAPManager create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/template-begin create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/template-end create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/00Setup create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/10ServerName create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/80LemonLDAPPortal create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/template-begin create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/template-end create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/00Setup create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/10ServerName create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/80LemonLDAPSoap create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/template-begin create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/template-end create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/VirtualHosts/05LemonLDAPHandler create mode 100644 root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/WebAppVirtualHost/05LemonLDAPHandler create mode 100644 root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/00header create mode 100644 root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/05All create mode 100644 root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/10configuration create mode 100644 root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/15apply create mode 100644 root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/20manager create mode 100644 root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/25handler create mode 100644 root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/30portal create mode 100644 root/etc/e-smith/templates/etc/lemonldap-ng/soap-htpasswd/05lemonsoap create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/000open create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/005global create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/010ldap create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/015soap create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/020auth create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/025localnet create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/030notifications create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/035portal create mode 100644 root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/template-end create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/ajaxplorer.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/backup.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/backuppc.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/calendar.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/camera.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/dl.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/dokuwiki.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/freepbx.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/glpi.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/jappix.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/jenkins.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/lemonldap.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/mailman.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/mediawiki.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/nagios.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/ntop.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/openupload.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/pda.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/pfsense.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/phplist.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/phpmyadmin.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/power.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/pydio.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/rdv.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/redmine.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/smeserver.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/survey.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/telephone.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/timezone.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/ttrss.png create mode 100644 root/usr/share/lemonldap-ng/portal-skins/common/apps/zabbix.png create mode 100644 smeserver-lemonldap-ng.spec diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..cbb3a13 --- /dev/null +++ b/.gitignore @@ -0,0 +1,4 @@ +*.rpm +*.log +*spec-20* +*.tar.gz diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..aae781b --- /dev/null +++ b/Makefile @@ -0,0 +1,21 @@ +# Makefile for source rpm: smeserver-lemonldap-ng +# $Id: Makefile,v 1.1 2022/08/20 03:50:58 jpp Exp $ +NAME := smeserver-lemonldap-ng +SPECFILE = $(firstword $(wildcard *.spec)) + +define find-makefile-common +for d in common ../common ../../common ; do if [ -f $$d/Makefile.common ] ; then if [ -f $$d/CVS/Root -a -w $$/Makefile.common ] ; then cd $$d ; cvs -Q update ; fi ; echo "$$d/Makefile.common" ; break ; fi ; done +endef + +MAKEFILE_COMMON := $(shell $(find-makefile-common)) + +ifeq ($(MAKEFILE_COMMON),) +# attept a checkout +define checkout-makefile-common +test -f CVS/Root && { cvs -Q -d $$(cat CVS/Root) checkout common && echo "common/Makefile.common" ; } || { echo "ERROR: I can't figure out how to checkout the 'common' module." ; exit -1 ; } >&2 +endef + +MAKEFILE_COMMON := $(shell $(checkout-makefile-common)) +endif + +include $(MAKEFILE_COMMON) diff --git a/README.md b/README.md index 18b6e6b..eca53b8 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,16 @@ -# smeserver-lemonldap-ng +# smeserver-lemonldap-ng -SMEServer Koozali developed git repo for smeserver-lemonldap-ng smecontribs \ No newline at end of file +SMEServer Koozali developed git repo for smeserver-lemonldap-ng smecontribs + +## Wiki +
https://wiki.koozali.org/LemonLDAP-NG +
https://wiki.koozali.org/LemonLDAP-NG/fr + +## Bugzilla +Show list of outstanding bugs: [here](https://bugs.koozali.org/buglist.cgi?component=smeserver-lemonldap-ng&product=SME%20Contribs&query_format=advanced&limit=0&bug_status=UNCONFIRMED&bug_status=NEW&bug_status=ASSIGNED&bug_status=REOPENED&bug_status=CONFIRMED) + +## Description + +
*This description has been generated by an LLM AI system and cannot be relied on to be fully correct.* +*Once it has been checked, then this comment will be deleted* +
diff --git a/additional/.tito/packages/.readme b/additional/.tito/packages/.readme new file mode 100644 index 0000000..b9411e2 --- /dev/null +++ b/additional/.tito/packages/.readme @@ -0,0 +1,3 @@ +the .tito/packages directory contains metadata files +named after their packages. Each file has the latest tagged +version and the project's relative directory. diff --git a/additional/.tito/packages/smeserver-lemonldap-ng b/additional/.tito/packages/smeserver-lemonldap-ng new file mode 100644 index 0000000..1590257 --- /dev/null +++ b/additional/.tito/packages/smeserver-lemonldap-ng @@ -0,0 +1 @@ +0.2.20-1 ./ diff --git a/additional/.tito/releasers.conf b/additional/.tito/releasers.conf new file mode 120000 index 0000000..867c32f --- /dev/null +++ b/additional/.tito/releasers.conf @@ -0,0 +1 @@ +../../tito_libs/releasers.conf \ No newline at end of file diff --git a/additional/.tito/tito.props b/additional/.tito/tito.props new file mode 100644 index 0000000..3c97442 --- /dev/null +++ b/additional/.tito/tito.props @@ -0,0 +1,6 @@ +[buildconfig] +builder = tito.builder.Builder +tagger = tito.tagger.VersionTagger +changelog_do_not_remove_cherrypick = 0 +changelog_format = %s (%ae) +lib_dir = ../tito_libs diff --git a/additional/smeserver-lemonldap-ng.spec b/additional/smeserver-lemonldap-ng.spec new file mode 100644 index 0000000..58b1e12 --- /dev/null +++ b/additional/smeserver-lemonldap-ng.spec @@ -0,0 +1,204 @@ +# Authority: vip-ire +# Name: Daniel Berteaud + +Summary: LemonLDAP NG is a web SSO solution +%define name smeserver-lemonldap-ng +Name: %{name} +%define version 0.2.19 +%define release 1 +Version: 0.2.20 +Release: 1%{?dist} +License: GPL +Group: SME Server +Source: %{name}-%{version}.tar.gz + +BuildArchitectures: noarch + +BuildRequires: e-smith-devtools +BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot + +Requires: e-smith-base >= 5.2.0-56 +Requires: e-smith-ldap +Requires: smeserver-webapps-common >= 0.1-8 +Requires: lemonldap-ng >= 1.4.1 +Requires: lemonldap-ng-fr-doc +Requires: perl(Authen::Captcha) + +%description +This package contains all the needed scripts and templates +to run LemonLDAP NG on your SME Server. It uses LDAP as authentication source +but can also use SSL auth (either optional with a fallback to LDAP, or SSL required) + +%changelog +* Tue Sep 03 2019 Daniel Berteaud 0.2.20-1 +- Bump version + +* Tue Sep 03 2019 Daniel Berteaud 0.2.19-1 +- new package built with tito + +* Wed Feb 15 2017 Daniel Berteaud 0.2.19-1.sme +- Set Access-Control-Allow-Origin on CAS endpoint, need for ticket renew in SOGo + +* Mon Jan 9 2017 Daniel Berteaud 0.2.18-1.sme +- Update httpd template to read the Authentication prop of domain to load + Lemonldap::NG handler + +* Wed Dec 7 2016 Daniel Berteaud 0.2.17-1.sme +- Replace My::Package with Lemonldap::NG::Handler in default vhost templates + +* Sat Jan 23 2016 Daniel Berteaud 0.2.16-1.sme +- Don't redirect to https for acme challenges + +* Wed Oct 14 2015 Daniel Berteaud 0.2.15-1.sme +- Fix DL icon size + +* Fri Sep 5 2014 Daniel Berteaud 0.2.14-1.sme +- Define localSessionStorage to prevent clashes between handlers + +* Wed Jul 30 2014 Daniel Berteaud 0.2.13-1.sme +- Add icons for mailman and phplist + +* Tue Jul 1 2014 Daniel Berteaud 0.2.12-1.sme +- Adapt for LL::NG 1.4.1 (1.4.0 was too buggy) + +* Wed Dec 11 2013 Daniel Berteaud 0.2.11-1.sme +- Add an icon for DL + +* Wed Nov 20 2013 Daniel Berteaud 0.2.10-1.sme +- Add an icon for pydio + +* Mon Nov 18 2013 Daniel Berteaud 0.2.9-1.sme +- Add two new icons (rdv.png and survey.png) + +* Wed Nov 13 2013 Daniel Berteaud 0.2.8-1.sme +- compatibility with SME9 (perl lib path) + +* Mon Nov 4 2013 Daniel Berteaud 0.2.7-1.sme +- Requires perl(Authen::Captcha) for LL::NG 1.3.0 + +* Tue Sep 17 2013 Daniel Berteaud 0.2.6-1.sme +- Small modifications to support SOGo CAS auth +- Enable CAS auth + +* Wed Aug 21 2013 Daniel Berteaud 0.2.5-1.sme +- Move custom icons to the correct directory + +* Wed Aug 21 2013 Daniel Berteaud 0.2.4-1.sme +- Add custom icons for the portal + +* Tue Sep 4 2012 Daniel Berteaud 0.2.3-1.sme +- Use Authentication prop instead of LemonLDAP + +* Wed Jun 20 2012 Daniel Berteaud 0.2.2-1.sme +- Redirect to HTTPS on port 443 + +* Wed Jun 20 2012 Daniel Berteaud 0.2.1-1.sme +- Add optional floating menu per vhost + +* Wed Jun 20 2012 Daniel Berteaud 0.2.0-1.sme +- Import in GIT +- Remove the grantSessionRule param +- Log via syslog (auth) + +* Mon Dec 19 2011 Daniel Berteaud 0.1-22.sme +- Change SSL Auth to work with LocationMatch, so CAS proxy can work with + SSL Auth enabled + +* Wed Jul 13 2011 Daniel Berteaud 0.1-21.sme +- Disable password reset form + +* Wed Jul 13 2011 Daniel Berteaud 0.1-20.sme +- Fix uninitilized values in lemonldap conf templates + +* Mon Jul 11 2011 Daniel Berteaud 0.1-19.sme +- reserve /lm-reload + +* Sun Jul 10 2011 Daniel Berteaud 0.1-18.sme +- Fix notification check + +* Sat Jul 09 2011 Daniel Berteaud 0.1-17.sme +- Don't force notifications on + +* Fri Jul 08 2011 Daniel Berteaud 0.1-16.sme +- Enable and configure notifications + +* Thu Jun 30 2011 Daniel Berteaud 0.1-15.sme +- Manage some configuration from the DB + +* Fri Mar 11 2011 Daniel Berteaud 0.1-14.sme +- Make LemonLDAP compatible with ocsinventory-ng + +* Mon Mar 7 2011 Daniel Berteaud 0.1-13.sme +- Add support for SSL Auth on the portal +- Use a separated vhost for SOAP requests + +* Tue Feb 1 2011 Daniel Berteaud 0.1-12.sme +- Requires recent version of smeserver-webapps-common +- Switch to LDAP based auth to protect the manager + +* Tue Jan 25 2011 Daniel Berteaud 0.1-11.sme +- Fix a spacing issue in httpd templates + +* Fri Jan 21 2011 Daniel Berteaud 0.1-10.sme +- Add SSLEngine directives in https virtualhosts + +* Fri Jan 21 2011 Daniel Berteaud 0.1-9.sme +- Fix empty SoapPassword + +* Thu Jan 06 2011 Daniel Berteaud 0.1-8.sme +- Fix Soap ressources authentication + +* Mon Jan 03 2011 Daniel Berteaud 0.1-7.sme +- Run the manager as a perl script (instead of CGI mode) + +* Mon Jan 03 2011 Daniel Berteaud 0.1-6.sme +- Use https links for error pages + +* Thu Dec 30 2010 Daniel Berteaud 0.1-5.sme +- use only alphanumeric characters for soap password +- use htpasswd to hash the password + +* Tue Dec 28 2010 Daniel Berteaud 0.1-4.sme +- don't load mod_auth_external if not needed +- move cache dir in /var/cache +- Fix several hosts listed in SoapAllowFrom + +* Fri Dec 24 2010 Daniel Berteaud 0.1-3.sme +- Use htpasswd file to protect SOAP services +- Configure session storage in lemonldap-ng.ini +- Support additionnal server reload URL + +* Fri Dec 17 2010 Daniel Berteaud 0.1-2.sme +- Let the manager be self-protected if ManagerAuth eq self + +* Thu Dec 16 2010 Daniel Berteaud 0.1-1.sme +- initial public release + +%prep +%setup -q -n %{name}-%{version} + +%build +perl createlinks +%{__mkdir_p} root/var/cache/lemonldap-ng +%{__mkdir_p} root/var/lib/lemonldap-ng/notifications + +%install +/bin/rm -rf $RPM_BUILD_ROOT +(cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT) +/bin/rm -f %{name}-%{version}-filelist +/sbin/e-smith/genfilelist $RPM_BUILD_ROOT \ + --dir /var/cache/lemonldap-ng 'attr(0770,root,www)' \ + --dir /var/lib/lemonldap-ng/notifications 'attr(0770,root,www)' \ + > %{name}-%{version}-filelist + +%files -f %{name}-%{version}-filelist +%defattr(-,root,root) + +%clean +rm -rf $RPM_BUILD_ROOT + +%post + +%preun + +true diff --git a/contriborbase b/contriborbase new file mode 100644 index 0000000..9b7fd51 --- /dev/null +++ b/contriborbase @@ -0,0 +1 @@ +contribs10 diff --git a/createlinks b/createlinks new file mode 100644 index 0000000..df27905 --- /dev/null +++ b/createlinks @@ -0,0 +1,14 @@ +#!/usr/bin/perl -w + +use esmith::Build::CreateLinks qw(:all); + +templates2events("/etc/lemonldap-ng/lemonldap-ng.ini", qw/webapps-update bootstrap-console-save/); +templates2events("/etc/lemonldap-ng/soap-htpasswd", qw/webapps-update bootstrap-console-save/); + +event_link("lemonldap-init-domains", "webapps-update", "20"); +foreach my $event (qw/webapps-update network-create network-delete bootstrap-ldap-save remoteaccess-update/){ + event_link("lemonldap-update-conf", "$event", "25"); +} + +safe_touch("root/etc/e-smith/templates/etc/lemonldap-ng/soap-htpasswd/template-begin"); + diff --git a/root/etc/e-smith/db/accounts/defaults/lm-reload/type b/root/etc/e-smith/db/accounts/defaults/lm-reload/type new file mode 100644 index 0000000..96cdd3b --- /dev/null +++ b/root/etc/e-smith/db/accounts/defaults/lm-reload/type @@ -0,0 +1 @@ +url diff --git a/root/etc/e-smith/db/configuration/defaults/lemonldap/status b/root/etc/e-smith/db/configuration/defaults/lemonldap/status new file mode 100644 index 0000000..86981e6 --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/lemonldap/status @@ -0,0 +1 @@ +enabled diff --git a/root/etc/e-smith/db/configuration/defaults/lemonldap/type b/root/etc/e-smith/db/configuration/defaults/lemonldap/type new file mode 100644 index 0000000..24e1098 --- /dev/null +++ b/root/etc/e-smith/db/configuration/defaults/lemonldap/type @@ -0,0 +1 @@ +service diff --git a/root/etc/e-smith/db/configuration/migrate/90MigrateLemonLDAP b/root/etc/e-smith/db/configuration/migrate/90MigrateLemonLDAP new file mode 100644 index 0000000..b1e36df --- /dev/null +++ b/root/etc/e-smith/db/configuration/migrate/90MigrateLemonLDAP @@ -0,0 +1,14 @@ +{ + +use esmith::DomainsDB; +my $d = esmith::DomainsDB->open() or die "Couldn't open DomainsDB\n"; + +foreach my $domain ($d->domains){ + my $llng = $domain->prop('LemonLDAP') || ''; + next unless $llng eq 'enabled'; + $domain->set_prop('Authentication', 'LemonLDAP'); + $domain->delete_prop('LemonLDAP'); +} + +} + diff --git a/root/etc/e-smith/db/configuration/migrate/lemonldap-enable-mod_perl b/root/etc/e-smith/db/configuration/migrate/lemonldap-enable-mod_perl new file mode 100644 index 0000000..357b79f --- /dev/null +++ b/root/etc/e-smith/db/configuration/migrate/lemonldap-enable-mod_perl @@ -0,0 +1,12 @@ +{ + + my $mp = $DB->get('modPerl') || $DB->new_record("modPerl", { type => "service", status => "enabled" }); + + if ( ($mp->prop('status') || 'disabled') eq 'enabled'){ + return ""; + } + else{ + $DB->set_prop('modPerl', 'status', 'enabled'); + } + +} diff --git a/root/etc/e-smith/db/configuration/migrate/lemonldap-soappasswd b/root/etc/e-smith/db/configuration/migrate/lemonldap-soappasswd new file mode 100644 index 0000000..2da183b --- /dev/null +++ b/root/etc/e-smith/db/configuration/migrate/lemonldap-soappasswd @@ -0,0 +1,13 @@ +{ + +my $rec = $DB->get('lemonldap') + || $DB->new_record('lemonldap', {type => 'service'}); + +my $pw = $rec->prop('SoapPassword'); + +if (not $pw){ + my $rand = `/usr/bin/openssl rand -base64 35 | tr -cd '[:alnum:]'`; + $rec->set_prop('SoapPassword', "$rand"); +} + +} diff --git a/root/etc/e-smith/events/actions/lemonldap-init-domains b/root/etc/e-smith/events/actions/lemonldap-init-domains new file mode 100644 index 0000000..f6d7c38 --- /dev/null +++ b/root/etc/e-smith/events/actions/lemonldap-init-domains @@ -0,0 +1,88 @@ +#!/usr/bin/perl -w +#---------------------------------------------------------------------- +# copyright (C) 2010 Firewall-Services +# daniel@firewall-services.com +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Technical support for this program is available from Mitel Networks +# Please visit our web site www.mitel.com/sme/ for details. +#---------------------------------------------------------------------- + +use strict; +use warnings; +use esmith::DomainsDB; +use esmith::ConfigDB; + +my $d = esmith::DomainsDB->open or die "Couldn't open DomainsDB\n"; +my $c = esmith::ConfigDB->open_ro() or die "Couldn't open ConfigDB\n"; + +my $domain = $c->get('DomainName')->value; +my $vhost; + +$vhost = $d->get("sso-manager.$domain"); + +if (!$vhost){ + $d->new_record("sso-manager.$domain",{ + type => 'domain', + Content => 'Primary', + Description => "LemonLDAP-NG Manager", + Nameservers => 'internet', + TemplatePath => 'LemonLDAPManager', + Removable => 'no', + }); + + unless ( system("/sbin/e-smith/signal-event", "domain-create", "sso-manager.$domain") == 0 ){ + die "Failed to create domain sso-manager.$domain\n"; + } +} + +$vhost = $d->get("auth.$domain"); + +if (!$vhost){ + $d->new_record("auth.$domain",{ + type => 'domain', + Content => 'Primary', + Description => "LemonLDAP-NG Portal", + Nameservers => 'internet', + TemplatePath => 'LemonLDAPPortal', + Removable => 'no', + }); + + unless ( system("/sbin/e-smith/signal-event", "domain-create", "auth.$domain") == 0 ){ + die "Failed to create domain auth.$domain\n"; + } +} + +$vhost = $d->get("soapsso.$domain"); + +if (!$vhost){ + $d->new_record("soapsso.$domain",{ + type => 'domain', + Content => 'Primary', + Description => "LemonLDAP-NG SOAP Handler", + Nameservers => 'internet', + TemplatePath => 'LemonLDAPSoap', + Removable => 'no', + }); + + unless ( system("/sbin/e-smith/signal-event", "domain-create", "soapsso.$domain") == 0 ){ + die "Failed to create domain soapsso.$domain\n"; + } +} + + +exit 0; + diff --git a/root/etc/e-smith/events/actions/lemonldap-update-conf b/root/etc/e-smith/events/actions/lemonldap-update-conf new file mode 100644 index 0000000..217fa88 --- /dev/null +++ b/root/etc/e-smith/events/actions/lemonldap-update-conf @@ -0,0 +1,43 @@ +#!/usr/bin/perl -w +#---------------------------------------------------------------------- +# copyright (C) 2011 Firewall-Services +# daniel@firewall-services.com +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA +# +# Technical support for this program is available from Mitel Networks +# Please visit our web site www.mitel.com/sme/ for details. +#---------------------------------------------------------------------- + +use esmith::ConfigDB; +use esmith::templates; + +my $c = esmith::ConfigDB->open_ro or die "Error opening ConfigDB\n"; +my $llng = $c->get('lemonldap'); + +my $status = $llng->prop('status') || 'disabled'; +my $manual = $llng->prop('ManualConf') || 'disabled'; + +# Don't touch the configuration if it's set to be manual +# or if the service is disabled +exit (0) if ($manual eq 'enabled' or $status ne 'enabled'); + +processTemplate( + { + TEMPLATE_PATH => "/var/lib/lemonldap-ng/conf/lmConf", + OUTPUT_FILENAME => "/var/lib/lemonldap-ng/conf/lmConf", + }); + +exit (0); diff --git a/root/etc/e-smith/templates.metadata/etc/lemonldap-ng/lemonldap-ng.ini b/root/etc/e-smith/templates.metadata/etc/lemonldap-ng/lemonldap-ng.ini new file mode 100644 index 0000000..bad4258 --- /dev/null +++ b/root/etc/e-smith/templates.metadata/etc/lemonldap-ng/lemonldap-ng.ini @@ -0,0 +1,3 @@ +PERMS=0640 +UID="root" +GID="www" diff --git a/root/etc/e-smith/templates.metadata/etc/lemonldap-ng/soap-htpasswd b/root/etc/e-smith/templates.metadata/etc/lemonldap-ng/soap-htpasswd new file mode 100644 index 0000000..bad4258 --- /dev/null +++ b/root/etc/e-smith/templates.metadata/etc/lemonldap-ng/soap-htpasswd @@ -0,0 +1,3 @@ +PERMS=0640 +UID="root" +GID="www" diff --git a/root/etc/e-smith/templates.metadata/var/lib/lemonldap-ng/conf/lmConf-2 b/root/etc/e-smith/templates.metadata/var/lib/lemonldap-ng/conf/lmConf-2 new file mode 100644 index 0000000..7d87103 --- /dev/null +++ b/root/etc/e-smith/templates.metadata/var/lib/lemonldap-ng/conf/lmConf-2 @@ -0,0 +1,3 @@ +PERMS=0640 +UID="www" +GID="www" diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/97LemonLDAPHandler b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/97LemonLDAPHandler new file mode 100644 index 0000000..7c54704 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/97LemonLDAPHandler @@ -0,0 +1,34 @@ +#==================================================================== +# Apache configuration for LemonLDAP::NG Handler +#==================================================================== + +# Load LemonLDAP::NG Handler +PerlOptions +GlobalRequest +PerlRequire Lemonldap/NG/Handler.pm + +# Common error page and security parameters +#ErrorDocument 403 http://auth.{$DomainName}/?lmError=403 +#ErrorDocument 500 http://auth.{$DomainName}/?lmError=500 + + +# Configuration reload mechanism (only 1 per physical server is +# needed): choose your URL to avoid restarting Apache when +# configuration change +# Dummy Alias so apache allows access to /lm-reload +Alias /lm-reload /etc/httpd/proxy/proxy.pac + + SSLRequireSSL on + Order deny,allow + Deny from all + Allow from {"$LocalIP $localAccess $externalSSLAccess";} + PerlHeaderParserHandler Lemonldap::NG::Handler->refresh + + +# Uncomment this to activate status module +# +# Order deny,allow +# Deny from all +# Allow from 127.0.0.0/8 +# PerlHeaderParserHandler Lemonldap::NG::Handler->status +# + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/00Setup b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/00Setup new file mode 100644 index 0000000..e00a95b --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/00Setup @@ -0,0 +1,10 @@ +{ + use esmith::DomainsDB; + # Convert the passed hash for the domain object back into an object. + $domain = bless \%domain, 'esmith::DB::db::Record'; + + # Make scalars from some of the properties of the domain + $virtualHost = $domain->key; + $OUT = ""; +} + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/10ServerName b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/10ServerName new file mode 100644 index 0000000..38f4ddf --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/10ServerName @@ -0,0 +1 @@ + ServerName {$virtualHost} diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/80LemonLDAPManager b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/80LemonLDAPManager new file mode 100644 index 0000000..316abce --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/80LemonLDAPManager @@ -0,0 +1,114 @@ +{ + + use esmith::util; + + if ( $port ne ($modSSL{'TCPPort'} || '443')){ + $OUT .=<<"EOF"; + + #==================================================================== + # HTTPS redirection for LemonLDAP::NG Manager + #==================================================================== + + RewriteEngine on + RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/.* + RewriteRule ^/(.*|\$) https://%{HTTP_HOST}/\$1 \[L,R\] +EOF + } + else{ + my $authtype = $lemonldap{'ManagerAuth'} || 'basic'; + my $auth = ''; + my $base = esmith::util::ldapBase($DomainName); + + unless ( $authtype eq 'self' ) { + $auth = "AuthName 'LemonLDAP NG Manager Interface'\n" . + " AuthType Basic\n" . + " AuthBasicProvider ldap\n" . + " AuthLDAPURL ldap://localhost/ou=Users,$base?uid\n" . + " AuthLDAPGroupAttribute memberUid\n" . + " AuthLDAPGroupAttributeIsDN off\n" . + " require ldap-user admin"; + } + + $OUT .=<<"EOF"; + + SSLEngine On + + PerlOptions +Parent + + #==================================================================== + # Apache configuration for LemonLDAP::NG Manager + #==================================================================== + + # DocumentRoot + DocumentRoot /var/lib/lemonldap-ng/manager/ + + Order deny,allow + Deny from all + Allow from $localAccess $externalSSLAccess + Options +ExecCGI +FollowSymlinks + $auth + Satisfy all + + + # On-line documentation + Alias /doc/ /var/lib/lemonldap-ng/doc/ + Alias /fr-doc/ /var/lib/lemonldap-ng/fr-doc/ + Alias /lib/ /var/lib/lemonldap-ng/doc/lib/ + + Order deny,allow + Allow from all + ErrorDocument 404 /notfound.html + Options +FollowSymlinks + DirectoryIndex index.pl index.html + + + Order deny,allow + Allow from all + ErrorDocument 404 /notfound.html + Options +FollowSymlinks + DirectoryIndex index.pl index.html + + + # Perl script + # Note: to avoid manager stay in memory, we don't use ModPerl::Registry + # by default. Change this to increase manager performances + + #SetHandler cgi-script + SetHandler perl-script + PerlResponseHandler ModPerl::Registry + + + # Directory index + + DirectoryIndex index.pl index.html + + + + + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css + SetOutputFilter DEFLATE + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)\$ no-gzip dont-vary + + + Header append Vary User-Agent env=!dont-vary + + + + + ExpiresActive On + ExpiresDefault "access plus 1 month" + + + + + ExpiresActive On + ExpiresDefault "access plus 1 month" + + +EOF + } +} + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/template-begin b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/template-begin new file mode 100644 index 0000000..b050035 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/template-begin @@ -0,0 +1,2 @@ + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/template-end b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/template-end new file mode 100644 index 0000000..50d3d92 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPManager/template-end @@ -0,0 +1,2 @@ + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/00Setup b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/00Setup new file mode 100644 index 0000000..e00a95b --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/00Setup @@ -0,0 +1,10 @@ +{ + use esmith::DomainsDB; + # Convert the passed hash for the domain object back into an object. + $domain = bless \%domain, 'esmith::DB::db::Record'; + + # Make scalars from some of the properties of the domain + $virtualHost = $domain->key; + $OUT = ""; +} + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/10ServerName b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/10ServerName new file mode 100644 index 0000000..38f4ddf --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/10ServerName @@ -0,0 +1 @@ + ServerName {$virtualHost} diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/80LemonLDAPPortal b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/80LemonLDAPPortal new file mode 100644 index 0000000..5057863 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/80LemonLDAPPortal @@ -0,0 +1,133 @@ +{ + +use esmith::AccountsDB; +my $a = esmith::AccountsDB->open_ro() or die "Couldn't open AccountsDB\n"; + +if ( $port ne ($modSSL{'TCPPort'} || '443')){ + $OUT .=<<"EOF"; + + #==================================================================== + # HTTPS redirection for LemonLDAP::NG Portal + #==================================================================== + + RewriteEngine on + RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/.* + RewriteRule ^/(.*|\$) https://%{HTTP_HOST}/\$1 \[L,R\] + +EOF + } +else{ + + # SSL Authentication + my $SSLAuth = $lemonldap{'SSLAuth'} || 'disabled'; + my $sslDirectives = ' # SSL Auth is disabled'; + my $sogoWorkArround = ''; + if ((-e '/etc/pki/tls/certs/cacert.pem') && + ($SSLAuth =~ m/^(require)|(optional)$/)) { + $sslDirectives =<<"HERE"; + + SSLVerifyClient $SSLAuth + SSLVerifyDepth 1 + SSLOptions +StdEnvVars + SSLUserName SSL_CLIENT_S_DN_CN + +HERE + } + if (-e '/usr/lib/perl5/site_perl/Apache/FilterChangeLength.pm' || + -e '/usr/share/perl5/vendor_perl/Apache/FilterChangeLength.pm'){ + # Looks like iPasserelle groupware is installed + # SOPE doesn't supports chunked encoding + # the following makes it happy + # see http://sogo.nu/bugs/view.php?id=2408 + $sogoWorkArround =<<"HERE"; + + BrowserMatch "SOPE/" downgrade-1.0 + PerlOutputFilterHandler Apache::FilterChangeLength + Header set Access-Control-Allow-Origin '*' + +HERE + } + + $OUT .=<<"EOF"; + + SSLEngine On + + PerlOptions +Parent + + #==================================================================== + # Apache configuration for LemonLDAP::NG Portal + #==================================================================== + + # DocumentRoot + DocumentRoot /var/lib/lemonldap-ng/portal/ + + + require Lemonldap::NG::Portal::SharedConf; + Lemonldap::NG::Portal::SharedConf->compile( + qw(delete header cache read_from_client cookie redirect unescapeHTML)); + # Uncomment this line if you use Lemonldap::NG menu + require Lemonldap::NG::Portal::Menu; + + + + Order allow,deny + Allow from all + Options +ExecCGI +FollowSymlinks + +$sslDirectives +$sogoWorkArround + + # Perl script + + SetHandler perl-script + PerlResponseHandler ModPerl::Registry + + + + DirectoryIndex index.pl index.html + + + # SAML2 Issuer + + RewriteEngine On + RewriteRule ^/saml/metadata /metadata.pl + RewriteRule ^/saml/.* /index.pl + + + # CAS Issuer + + RewriteEngine On + RewriteRule ^/cas/.* /index.pl + + + # OpenID Issuer + + RewriteEngine On + RewriteRule ^/openidserver/.* /index.pl + + + + + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css + SetOutputFilter DEFLATE + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)\$ no-gzip dont-vary + + + Header append Vary User-Agent env=!dont-vary + + + + + ExpiresActive On + ExpiresDefault "access plus 1 month" + + + +EOF + } +} + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/template-begin b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/template-begin new file mode 100644 index 0000000..b050035 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/template-begin @@ -0,0 +1,2 @@ + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/template-end b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/template-end new file mode 100644 index 0000000..50d3d92 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPPortal/template-end @@ -0,0 +1,2 @@ + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/00Setup b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/00Setup new file mode 100644 index 0000000..e00a95b --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/00Setup @@ -0,0 +1,10 @@ +{ + use esmith::DomainsDB; + # Convert the passed hash for the domain object back into an object. + $domain = bless \%domain, 'esmith::DB::db::Record'; + + # Make scalars from some of the properties of the domain + $virtualHost = $domain->key; + $OUT = ""; +} + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/10ServerName b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/10ServerName new file mode 100644 index 0000000..38f4ddf --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/10ServerName @@ -0,0 +1 @@ + ServerName {$virtualHost} diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/80LemonLDAPSoap b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/80LemonLDAPSoap new file mode 100644 index 0000000..db48acd --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/80LemonLDAPSoap @@ -0,0 +1,120 @@ +{ + +use esmith::AccountsDB; +my $a = esmith::AccountsDB->open_ro() or die "Couldn't open AccountsDB\n"; + +if ( $port ne ($modSSL{'TCPPort'} || '443')){ + $OUT .=<<"EOF"; + + #==================================================================== + # HTTPS redirection for LemonLDAP::NG Portal + #==================================================================== + + RewriteEngine on + RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/.* + RewriteRule ^/(.*|\$) https://%{HTTP_HOST}/\$1 \[L,R\] + +EOF + } +else{ + my $soapAllow = join (" ", split(/[;,]/, ($lemonldap{'SoapAllowFrom'} || ''))); + $soapAllow = ( $soapAllow eq '' ) ? '' : "Allow from $soapAllow\n "; + my $soapPassword = $lemonldap{'SoapPassword'} || ''; + $soapAllow .= ($soapPassword eq '') ? '' : + 'AuthName "LemonLDAP SOAP interface"' . "\n " . + 'AuthType Basic' . "\n " . + 'AuthBasicProvider file' . "\n " . + 'AuthUserFile /etc/lemonldap-ng/soap-htpasswd' . "\n " . + 'Require valid-user' . "\n " . + 'Satisfy all'; + + $OUT .=<<"EOF"; + + SSLEngine On + + PerlOptions +Parent + + #==================================================================== + # Apache configuration for LemonLDAP::NG Portal + #==================================================================== + + # DocumentRoot + DocumentRoot /var/lib/lemonldap-ng/portal/ + + + require Lemonldap::NG::Portal::SharedConf; + Lemonldap::NG::Portal::SharedConf->compile( + qw(delete header cache read_from_client cookie redirect unescapeHTML)); + # Uncomment this line if you use portal SOAP capabilities + require SOAP::Lite; + + + + Order allow,deny + Allow from all + Options +ExecCGI +FollowSymlinks + + + # Perl script + + SetHandler perl-script + PerlResponseHandler ModPerl::Registry + + + + DirectoryIndex index.pl index.html + + + # SOAP functions for sessions management (disabled by default) + + Order deny,allow + Deny from all + $soapAllow + + + # SOAP functions for sessions access (disabled by default) + + Order deny,allow + Deny from all + $soapAllow + + + # SOAP functions for configuration access (disabled by default) + + Order deny,allow + Deny from all + $soapAllow + + + # SOAP functions for notification insertion (disabled by default) + + Order deny,allow + Deny from all + $soapAllow + + + + + AddOutputFilterByType DEFLATE text/html text/plain text/xml text/javascript text/css + SetOutputFilter DEFLATE + BrowserMatch ^Mozilla/4 gzip-only-text/html + BrowserMatch ^Mozilla/4\.0[678] no-gzip + BrowserMatch \bMSIE !no-gzip !gzip-only-text/html + SetEnvIfNoCase Request_URI \.(?:gif|jpe?g|png)\$ no-gzip dont-vary + + + Header append Vary User-Agent env=!dont-vary + + + + + ExpiresActive On + ExpiresDefault "access plus 1 month" + + + +EOF + } +} + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/template-begin b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/template-begin new file mode 100644 index 0000000..b050035 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/template-begin @@ -0,0 +1,2 @@ + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/template-end b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/template-end new file mode 100644 index 0000000..50d3d92 --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/LemonLDAPSoap/template-end @@ -0,0 +1,2 @@ + + diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/VirtualHosts/05LemonLDAPHandler b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/VirtualHosts/05LemonLDAPHandler new file mode 100644 index 0000000..dba812d --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/VirtualHosts/05LemonLDAPHandler @@ -0,0 +1,21 @@ +{ + +my $auth = $domain->prop('Authentication') || 'none'; + +if (($modSSL{'TCPPort'} || '443') eq $port){ + if ($auth eq 'LemonLDAP'){ + $OUT .= " # This virtualhost is configured to be protected by LemonLDAP NG\n" . + " PerlHeaderParserHandler Lemonldap::NG::Handler\n" . + " ErrorDocument 403 https://auth.$DomainName/?lmError=403\n" . + " ErrorDocument 500 https://auth.$DomainName/?lmError=500\n"; + if (($domain->prop('LemonLDAPMenu') || 'disabled') eq 'enabled'){ + $OUT .= " PerlOutputFilterHandler Lemonldap::NG::Handler::Menu\n"; + } + } + elsif ($auth eq 'LemonLDAPBasic'){ + $OUT .= " # This virtualhost is configured to be protected by LemonLDAP NG (basic auth)\n" . + " PerlHeaderParserHandler Lemonldap::NG::Handler::Specific::AuthBasic\n"; + } +} + +} diff --git a/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/WebAppVirtualHost/05LemonLDAPHandler b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/WebAppVirtualHost/05LemonLDAPHandler new file mode 100644 index 0000000..dba812d --- /dev/null +++ b/root/etc/e-smith/templates/etc/httpd/conf/httpd.conf/WebAppVirtualHost/05LemonLDAPHandler @@ -0,0 +1,21 @@ +{ + +my $auth = $domain->prop('Authentication') || 'none'; + +if (($modSSL{'TCPPort'} || '443') eq $port){ + if ($auth eq 'LemonLDAP'){ + $OUT .= " # This virtualhost is configured to be protected by LemonLDAP NG\n" . + " PerlHeaderParserHandler Lemonldap::NG::Handler\n" . + " ErrorDocument 403 https://auth.$DomainName/?lmError=403\n" . + " ErrorDocument 500 https://auth.$DomainName/?lmError=500\n"; + if (($domain->prop('LemonLDAPMenu') || 'disabled') eq 'enabled'){ + $OUT .= " PerlOutputFilterHandler Lemonldap::NG::Handler::Menu\n"; + } + } + elsif ($auth eq 'LemonLDAPBasic'){ + $OUT .= " # This virtualhost is configured to be protected by LemonLDAP NG (basic auth)\n" . + " PerlHeaderParserHandler Lemonldap::NG::Handler::Specific::AuthBasic\n"; + } +} + +} diff --git a/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/00header b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/00header new file mode 100644 index 0000000..3e401fc --- /dev/null +++ b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/00header @@ -0,0 +1,19 @@ +#============================================================================== +# LemonLDAP::NG local configuration parameters +# +# This file is dedicated to configuration parameters override +# You can set here configuration parameters that will be used only by +# local LemonLDAP::NG elements +# +# Section "all" is always read first before "portal", "handler" +# and "manager" +# +# Section "configuration" is used to load global configuration and set cache +# (replace old storage.conf file) +# +# Section "apply" is read by Manager to reload handlers +# (replace old apply.conf file) +# +# Other section are only read by the specific LemonLDAP::NG component +#============================================================================== + diff --git a/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/05All b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/05All new file mode 100644 index 0000000..6c56932 --- /dev/null +++ b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/05All @@ -0,0 +1,7 @@ + +[all] +globalStorage = Apache::Session::File +globalStorageOptions = \{ 'Directory' => '/var/lib/lemonldap-ng/sessions/', 'LockDirectory' => '/var/lib/lemonldap-ng/sessions/lock/', \} +localSessionStorage=Cache::FileCache +localSessionStorageOptions=\{ 'namespace' => 'sessions', 'default_expires_in' => '600', 'directory_umask' => '007', 'cache_root' => '/var/cache/lemonldap-ng', 'cache_depth' => 3, \} + diff --git a/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/10configuration b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/10configuration new file mode 100644 index 0000000..49ee965 --- /dev/null +++ b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/10configuration @@ -0,0 +1,11 @@ + +[configuration] + +type=File +dirName = /var/lib/lemonldap-ng/conf +globalStorageOptions=\{ 'generateModule' => 'Lemonldap::NG::Common::Apache::Session::Generate::SHA256' \} + +localStorage=Cache::FileCache +localStorageOptions=\{ 'namespace' => 'localcache', 'default_expires_in' => 600, 'directory_umask' => '007', 'cache_root' => '/var/cache/lemonldap-ng', 'cache_depth' => 5, \} + + diff --git a/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/15apply b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/15apply new file mode 100644 index 0000000..5d44fe4 --- /dev/null +++ b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/15apply @@ -0,0 +1,11 @@ +[apply] + +{"$SystemName.$DomainName";} = https://{"$SystemName.$DomainName";}/lm-reload + +{ + +foreach my $srv (split(/[;,]/, ($lemonldap{'Reload'} || ''))){ + my ($name,$url) = split(/=/, $srv); + $OUT .= "$name = $url\n"; +} +} diff --git a/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/20manager b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/20manager new file mode 100644 index 0000000..466001f --- /dev/null +++ b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/20manager @@ -0,0 +1,10 @@ + +[manager] +{ + $OUT .= (($lemonldap{'ManagerAuth'} || 'basic') eq 'self') ? + 'protection = manager' : ''; +} + +[sessionsExplorer] + + diff --git a/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/25handler b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/25handler new file mode 100644 index 0000000..0be2cb2 --- /dev/null +++ b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/25handler @@ -0,0 +1,6 @@ +[handler] + +https = 1 +status = 0 +useRedirectOnError = 1 + diff --git a/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/30portal b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/30portal new file mode 100644 index 0000000..2787e6a --- /dev/null +++ b/root/etc/e-smith/templates/etc/lemonldap-ng/lemonldap-ng.ini/30portal @@ -0,0 +1,3 @@ + +[portal] + diff --git a/root/etc/e-smith/templates/etc/lemonldap-ng/soap-htpasswd/05lemonsoap b/root/etc/e-smith/templates/etc/lemonldap-ng/soap-htpasswd/05lemonsoap new file mode 100644 index 0000000..807ffd0 --- /dev/null +++ b/root/etc/e-smith/templates/etc/lemonldap-ng/soap-htpasswd/05lemonsoap @@ -0,0 +1,6 @@ +{ + my $pw = $lemonldap{'SoapPassword'} || 'secret'; + my $res = `/usr/bin/htpasswd -bnm lemonsoap $pw`; + chomp($res); + $OUT .= $res; +} diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/000open b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/000open new file mode 100644 index 0000000..f595815 --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/000open @@ -0,0 +1,31 @@ +{ +use esmith::ConfigDB; +use esmith::DomainsDB; +use esmith::NetworksDB; +use esmith::util; +use Lemonldap::NG::Common::Conf; + +$c = esmith::ConfigDB->open_ro or die "Error opening ConfigDB\n"; +$d = esmith::DomainsDB->open_ro or die "Error opening DomainsDB\n"; +$n = esmith::NetworksDB->open_ro or die "Error opening NetworksDB\n"; +$domain = $c->get('DomainName')->value; +$host = $c->get('SystemName')->value; +$base = esmith::util::ldapBase ($domain); +$ldap = $c->get('ldap') || die "Error reading ldap service entry\n"; +$port = $ldap->prop('TCPPort') || '389'; +$llng = $c->get('lemonldap'); + +$manual = $llng->prop('ManualConf') || 'disabled'; + +$confAccess = new Lemonldap::NG::Common::Conf( + { + type=>'File', + dirName=>"/var/lib/lemonldap-ng/conf", + }, +) or die "Unable to build Lemonldap::NG::Common::Conf, see Apache logs\n"; + +$conf = $confAccess->getConf(); + +$OUT = ''; + +} diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/005global b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/005global new file mode 100644 index 0000000..c3f06ee --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/005global @@ -0,0 +1,15 @@ +{ + +# Global parameters +$conf->{'domain'} = "$domain"; +$conf->{'portal'} = "https://auth.$domain/"; +$conf->{'storePassword'} = '0'; +$conf->{'portalUserAttr'} = 'cn' if (($conf->{'portalUserAttr'} || '_user') eq "_user"); +$conf->{'portalDisplayChangePassword'} = '0'; +$conf->{'syslog'} = 'auth'; +$conf->{'https'} = '1'; +$conf->{'port'} = '443'; + +$OUT .= ''; + +} diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/010ldap b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/010ldap new file mode 100644 index 0000000..d5e2cd5 --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/010ldap @@ -0,0 +1,17 @@ +{ + +# LDAP parameters +$conf->{'passwordDB'} = 'LDAP'; +$conf->{'userDB'} = 'LDAP'; +$conf->{'ldapServer'} = 'localhost'; +$conf->{'ldapPort'} = "$port"; +$conf->{'ldapVersion'} = '3'; +$conf->{'ldapBase'} = "ou=Users,$base"; +$conf->{'ldapGroupBase'} = "ou=Groups,$base"; +$conf->{'ldapGroupAttributeNameUser'} = 'uid'; +$conf->{'ldapGroupAttributeNameSearch'} = 'cn'; +$conf->{'ldapGroupAttributeName'} = 'memberUid'; +$conf->{'ldapGroupObjectClass'} = 'mailboxRelatedObject'; + +$OUT .= ''; +} diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/015soap b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/015soap new file mode 100644 index 0000000..e0c61ea --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/015soap @@ -0,0 +1,19 @@ +{ + +# SOAP +if (($llng->prop('SoapAllowFrom') || '') ne ''){ + my $password = $llng->prop('SoapPassword') || 'secret'; + $conf->{'Soap'} = '1'; + $conf->{'globalStorage'} = 'Lemonldap::NG::Common::Apache::Session::SOAP'; + $conf->{'globalStorageOptions'} = { + proxy => "https://lemonsoap:$password\@soapsso.$domain/index.pl/sessions", + generateModule => 'Lemonldap::NG::Common::Apache::Session::Generate::SHA256' + }; +} +else { + $conf->{'Soap'} = '0'; +} + +$OUT = ''; + +} diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/020auth b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/020auth new file mode 100644 index 0000000..d0871a2 --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/020auth @@ -0,0 +1,34 @@ +{ + +# SSL Auth +my $ssl = $llng->prop('SSLAuth') || ''; + +if ($ssl eq 'optional' || $ssl eq 'require'){ + # SSL Auth is enabled + # Configure common attributes + $conf->{'SSLLDAPField'} = 'uid'; + $conf->{'SSLVar'} = 'SSL_CLIENT_S_DN_CN'; + $conf->{'SSLRequire'} = '1'; + + if ($ssl eq 'optional'){ + $conf->{'authentication'} = 'Multi SSL;LDAP'; + } + else{ + $conf->{'authentication'} = 'SSL'; + } +} +else{ + $conf->{'authentication'} = 'LDAP'; +} + +# Enable CAS issuer DB +$conf->{'issuerDBCASActivation'} = 1; + +# default cookie settings +$conf->{'securedCookie'} = 1 unless ($conf->{'securedCookie'}); +$conf->{'httpOnly'} = 1 unless ($conf->{'httpOnly'}); + + +$OUT = ''; + +} diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/025localnet b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/025localnet new file mode 100644 index 0000000..fd76a08 --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/025localnet @@ -0,0 +1,45 @@ +{ + +my $reg = '$ipAddr =~ /^'; + +# Build a regexp to check if the client IP +# is part of a local network +# Then, we can easily use this macro to restrict +# access to local networks on some applications +my @net = (); + +foreach my $net ($n->networks){ + my $addr = $net->key; + my $mask = $net->prop('Mask') || '255.255.255.255'; + foreach (esmith::util::computeAllLocalNetworkPrefixes($addr,$mask)){ + push @net, "($_)"; + } +} + +$reg .= join('|', @net); +$reg .= '/'; +$reg =~ s/\./\\\./g; + +$conf->{'macros'}->{'localAccess'} = '(' . $reg . ") ? '1':'0'"; + +$reg = '$ipAddr =~ /^'; +@net = (); + +# Do the same for extenal SSL access +foreach my $net (split(/[;,]/,(${'httpd-admin'}{'ValidFrom'} || ''))){ + my ($addr,$mask) = split(/\//,$net); + foreach (esmith::util::computeAllLocalNetworkPrefixes($addr,$mask)){ + push @net, "($_)"; + } +} + +$reg .= join('|', @net); +$reg .= '/'; +$reg =~ s/\./\\\./g; + +$conf->{'macros'}->{'externalSSLAccess'} = '(' . $reg . ") ? '1':'0'"; + +$OUT = ''; + +} + diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/030notifications b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/030notifications new file mode 100644 index 0000000..5f42906 --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/030notifications @@ -0,0 +1,10 @@ +{ + +if (($conf->{'notification'} || '0') eq '1'){ + $conf->{'notificationStorage'} = 'File'; + $conf->{'notificationStorageOptions'} = { + 'dirName' => '/var/lib/lemonldap-ng/notifications' + }, +} + +} diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/035portal b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/035portal new file mode 100644 index 0000000..a7068a9 --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/035portal @@ -0,0 +1,9 @@ +{ + +# Portal elements +$conf->{'portalDisplayRegister'} = 0; +$conf->{'portalDisplayResetPassword'} = 0; + +$OUT = ''; + +} diff --git a/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/template-end b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/template-end new file mode 100644 index 0000000..14bc02a --- /dev/null +++ b/root/etc/e-smith/templates/var/lib/lemonldap-ng/conf/lmConf/template-end @@ -0,0 +1,16 @@ +{ + +# Now, update the configuration +my $num = $confAccess->saveConf($conf); + +if ($num > 0){ + esmith::util::chownFile('www', 'www', "/var/lib/lemonldap-ng/conf/lmConf-$num"); + chmod 0660, "/var/lib/lemonldap-ng/conf/lmConf-$num"; +} +else { + die "An error occured saving LemonLDAP::NG configuration: $num\n"; +} + +$OUT = '# This is just a dummy config file'; + +} diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/ajaxplorer.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/ajaxplorer.png new file mode 100644 index 0000000000000000000000000000000000000000..4da537336d58f00590a108f9e6a8f6997c18639b GIT binary patch literal 2088 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 literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/freepbx.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/freepbx.png new file mode 100644 index 0000000000000000000000000000000000000000..03f54aa88b273f27e1159b6ee7706f92695efc1f GIT binary patch literal 1645 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 literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/jenkins.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/jenkins.png new file mode 100644 index 0000000000000000000000000000000000000000..d539d102055ffefc282f2eaebb2f0ece0b7f8eba GIT binary patch literal 3383 zcmaJ^cTiL59t}jQ^tMvO0OBG9QluqPOb8^DK*Z36B_sg?q)0+X7I9aapeP_NiqZ*6 zk*c&6B6f5U5CjF3-bAD+Eck-E?!G^s@6O!&l{x49%6I0Qxyb}atfaV#H~;{Uw8deZ z`6FoO6&2=x+0oG}{6U#x?an#I^yfs7La6{0h3Q8H+0sb?RA(xQ5_RGc)eHatf@nl{ zjyv7~NoLXwNIMvVNIHwp1^~<~BUvPJFqH%HqXy6z=9-JmziWbM6mv~CBRmw(vZ4mk zaM7XEW6_R8a&#~mLD96d0GUN1`2ut*hXjhGhcMX4NOR4vx=8+fXB(mk`U>F$n`{1+ zlsldPvSNl(K}H5peKOP-3NnTnzz!Ljn3#Y;a3~B4fx;m$xIWATc?gb#LP38&n*3;? z6n~^M#^&!>{FS+8Acw<3LLdWb`*m{iqvPYwZ17} zsBCg5jm4oc8K50Sk{>gSW3I{1^sf@=tbb$~?7!Q@Zx|$!#Dc&KpgSdf1LE=jA4;eH zgJyG_ssHBtKZV)EC>9msOl32}LdpDt^Vix5#X?$zQb`N5)V?Y2j3gO(>HN`dToO_WfLp zzpM8*m-78wOuoy7@RNb;9P57_^S3R&cXp=#n3liz$M#eP-|L}#Q(s4bcL4xm6}A`@ zF>zx*Ea z`(oU>g^hys{vX46&p%ajB#ZQTyciLY)9sjgJDTtG*t*D-Q}Ki+2XCY6?ZV=zm*wjm zrvnR9R9$@Y6aahgeK50ht?GxoYi%QATbUDnkORXb(>5JfKcynToLy6+$LU@mIw$_QTw~1chm1I4?nlF z#q*wB9RYP0bT0nTB6jUbdc&C@Ppx?Bz%|F#O|UmczQw}wz`0Gu*f>;e?3+tJ)k++* z=Zsr|%fc-cqFgsVtbhw)5_+yTfAP`wU1}Lgh^XtJGfPgRJfNuJJ`|Vm`da*Ef@sIW zZokpH0yyOXC%mS&lO@|p@Vbfh@9%8-Br~%!K`@v=_t68@YQU;mMRDYLm$_TBkYW#T}^{H3wU+m!T^f+yp%L2NNQ912V4w`V-uJN&fucnuE^P~D6 z67Aoe*Bd{*UUEI3E3}U}AaJIjv7ruu%c)rKk5{XFKUvY#bbsSaQJ(FI={yVc2s>x6;C-Z}+^JZCNjedX7?1phw;%ja@uaYYT`0x}QU?w4c(a~l^< zPVu6SO(^MEPvqO@k0Q;FJGbqx*{xk%*5Z6Kp?zfqCxQmtVx%S=BA3a`%+7>yb=%N4BVneKj5%#P zViTbb*(%rQek)F7*n1;D*+D<+r?c7#{-@~fbsOxKoEOqUQ4zmnL^U%HmbyUIH3#g$n3&*Pc|_vJ{JwH(QOi*BDW?c* z|9}n!vMJ$K<)($m-|d_iWtS%(;P~_ihq7n;NO539v~jicWsfNU@iFg`UDbp)xK-G@ z>{M*Wx$V}AzVrt2;x-xnKu(nV8h*wCi&jnk_*i9J{a}G|KIY}w3-OE*cG8h+5;|r&VONqHD%iy}l&-yct^>d}3AR97`+_c;#OlgDS8- zD3)diUECC;Kt?d9^_@0IlW>XVrAKF+kIu_Ud~!Pxv>zh>hRSjP)aJ7Uw5VCMA1}=iqs7^leR0|NdmR}|!wAGeye!4Qasl*BT zKq^|foFLE1uKeS`inT>nhP|v%qOsUqLtNq~;AeMqmrncJ`)&#|Bhr)2=BQJPeWiz) z&Nu$tt)KBQE%m->#39{h<0xgNR5S6+DT zLi;{z$){pszPS|x{&cij@`^AuH90-YEByR$(XMmL;MNYs5#W))^yP*UVQg1@piAW0 z6>poNw{tKmuiWT*QC|v5C0#ec`e0alpX=e8$>+Q|50BeEF3D-RjY+>|Q@VQyT?H); zmFn$d@zd)QFSgr6V&ek`Lc*FxuDk6m9bGnC<6njgQL*l#{`W9%y>3V%@Lho#Q^_#p zSI~>eK7`iu2g0hH_12~4(!`^Wb;C7uwN*=cBnrt89QBi>fG{A)DQ~yj^+3O!Um06# KM@%K!H{n0-t<<0Z literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/lemonldap.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/lemonldap.png new file mode 100644 index 0000000000000000000000000000000000000000..1306741892077753ee49b4a5e8a0233f5c137904 GIT binary patch literal 1576 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8Vfs327lcTW-h;p(p zh3R$4PcF?(%`1WFO+n~&!l@UO5ONEEHoK%2WtOF;xE1B+Du6v~m5JLe7C6m=>P^Az z7E7FZ^?{Dj2SqDVG{b~|X$QoFCt4r}p6pZefN8x5n5ZxKH_l~XV4COY;uunKYtQua zej<(n$5#J;v#w#Hz}^SF>K`R*w%792GV&i=y*|ODrGq_bkINw4tEv z7du}V$B~6EePvrk9=v|4_{M9}{`AHxG1;sMZQ;l3A07>4UF60fX?BI-{yzN$BJ*T9 znG+aSh&s-P(p9h*NM>(vYuIq&$x+q?$%3mJOPCGB6E5xMb#Of(qMH@VuvEmG z@uZiBqLk|jaY+Y3-jXE@g1!f5F*($;1Z-)R$Q7KcDe8-Z`Lww7>FYM_ z-vnPUUa(7edU|Q4dg|Kv;00`La~XDZ7D~@BvuiSBS}MGNqrs1FUTuq#4a3 m!d$5P%;XKvWY7QSG+=0Gh`*`u^jAKp?Dll^b6Mw<&;$S-CphE) literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/mailman.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/mailman.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3482c2c4d45c628d061d3446478a83cfd3ac6f GIT binary patch literal 1925 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 R@$~ZF8QI2xkiXkE=0DrcU#kEB literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/ntop.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/ntop.png new file mode 100644 index 0000000000000000000000000000000000000000..2af60d5c583a7a441b39e56d629073320eb79760 GIT binary patch literal 1411 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE1|*BCs=fdz$r9IylHmNblJdl&R0hYC{G?O` z&)mfH)S%SFl*+=BsWuD@%nF$y5hW46K32*3xq68pHF_1f1wh>l3^w)^1&PVosU-?Y zsp*+{wo31J?^jaDOtDo8H}y5}EpSfF$n>ZxN)4{^3rViZPPR-@vbR&PsjvbXkegbP zs8ErclUHn2VXFi-*9yo63F|8VqpN|VnUk5JrHQ45 zlaV7#uSMv>2~2MaLa#GUy`Y4UTL84#CABECEH%ZgC_h&L>|v`++-|YNX&zK> z3U0SJ;?%1Tbc{YIT9Kj|CIn17ASOJ~0y*$xpPC0u>qWpsy}syqI|BpbPfr)ekcwMx zrn`GHJ4&=|HvA?Oq7$+4Xww5nmcWbM?g#51_kWmPA!@_%>SV=+1?s$F98L~LA{I%Q zt@EsLk4ud?HrLmg-}-~fliAV!r$>;4I z+r4YG9r-IB-_YOFP+q`1>D$Q=CT|6nTT3F0XD~V+VB(##D? zwKN})S+VhGmZoUY&Ml@c9sI`JhUd!H39ryP7$+<_lcCO>sZN}EUxEG}FG;SZUGcxl z3p9^hTKke^PM62hld^S3@&nlps+bonb#glLYlmfRD@Vuf2TVDQv6^#}=Dv5B^;;$5 zb@;*Fh_Dq69={oHJlk7)e#cQ`2cJ8u1PmN3Gc-dU2)+q^6xww>LY;4Eq+Ezyt4pb! zw4a`)oW`<6=Tc&|rZX0cZrH(-=^8t$G)$9~=jL|CQG+5k literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/openupload.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/openupload.png new file mode 100644 index 0000000000000000000000000000000000000000..0ed14a07d086b3aac6f012c684370bfdcbc0de1e GIT binary patch literal 3663 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 literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/pda.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/pda.png new file mode 100644 index 0000000000000000000000000000000000000000..0e88c1a3d5c15332f3f74f5753b7eacb252519d1 GIT binary patch literal 2239 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 TELj|f00000NkvXXu0mjf)5^!> literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/phpmyadmin.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/phpmyadmin.png new file mode 100644 index 0000000000000000000000000000000000000000..6d4b68644861b04edeff7e865cece0ce4e708b6d GIT binary patch literal 3814 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 literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/power.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/power.png new file mode 100644 index 0000000000000000000000000000000000000000..0d3b40b897bbb8c4005f50cbdf45251a66bd816c GIT binary patch literal 2002 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 literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/redmine.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/redmine.png new file mode 100644 index 0000000000000000000000000000000000000000..d375f37b471b7f56451487feeddadb87763cafe0 GIT binary patch literal 3154 zcmaJ@dpOg5A09eLDLu|aYgEW=V~jaxbE?VtR1UKZ8?&{|X--i&g$|A>OIexJl+3wO zNDIp`kEb5#^+pjA>S5%ap6Yr3czb`>_4|Df*L~lg!}tDP*Du4_$xd2IMG61_NITf0 zTty>r{gvD#`qG)q1<|0)KzlRXD8Yk-x%NQya7e-(Jg9stS2y@VE(?bxDh&Km$8DgLqstqBO zXwRe(+?Y=8IA$2m1P`*b0Gh=hMFM030}G5HheyznG3KCex=7J{eH#J-euFT=%t3!A z<&AL$+E8c&prIZVjDs3MfkrSrm;oGtKg7C zI>VLlPrm1+B|uyWbV?)*Cpx%bjrCAeqz#RLWl(7D6iWDyE;@%&7!-Oag$lHB zGX#1OBk+`H`ZqKNgLH_XGq4djf&>jft&30tSPjVb*Y4LloQu zZUogg5j7wBgNvfzBFTgZ#t$z3AFlN;x$8zCQ$>+c1R61lfVZVl$iQy}BZWE&M{eaY*l)9iS@4)xvAHVX$R@N8{(QnFk-14HW(Lj2M|=D($d&2C7{8 zwxWf-!`uYAHTU6+blXZ?|BF6FyB#ktkD4tJp77e=RwQmu17@;GZT^z!1)OB{r{S4) zld_j}M&5PZx^<{6L~Vx0%e{E4BO_c85P56yZGb!b#^H237C$+017!=D z7sf)6yCd20s5|B%j_FiwyrhWTRL~COaW2u|v!4O3h7k z`s9(qW%XmM@w6-IH!RP{S=1P6)SgE9W8Q@0H&j#A z$k5@(6z}-SeWvyEwt~UAZsRgjv3C7;d?)?kFP-pOxU2w?!MqeUmzGois1y*hYX>(a z__(hOVHI@Y>hfAdCoW*Tc?*MAl+~CQVqA0FVw#UIk467J`By>vINKPb*49!SaXi-9 z)0Jv*t`bHa&eN*Oc{7ey5&|Jnr>`}QYxSlV$kTQDmrtr0QyWwpO?=uaY$LnZkbNUX zJDUt>)Y;xCA8La}g&+ZV1Ol#m&x7rR%_f5$$PEmZe0krh+O1yWYM?c>bBNt%>oD_@ zb$;)Zur2juY(rF@ZQMB8Aw2pc^+d_-)=j+jiG*u#``CHh+0V^|Vc7-Wq<$TICK!(B zCwI$M+<>ErW{^R>GP$I3jahztQl#9?tG;F0Lr1fUQ)}^y2hXz4*hu{4g4wwDu2Mzu z4gf+jU3q8Y^~7ChoIS0l>Y&-=F5mIY(%xnHfcO?=b@;nCo3H@iBxR(;$&ez{!$*Ha zMeAg`s)qYYS~qgt{ODWr3kq}P9QWs?sU>l`b+SpVc{uHk9a&;8>?>=9P7BjVjceaTiYgFI~VwRw5LK-;{G+IRyP++ z=N&Qub^F{`-%A&+`~?@2J!Hk>D*QH&whHLV?!7C-tzIt^=MY2LC>@OTXqqV~Dsoj( z2W1D{EU4?xwewY7KE(;w&763SpSQg&zj(KCS>E$QSz6_RaF2~=apRUPY@}d==<<|; z`#}pjAF|SXq{F7A;EkrGqj6IC@;&!7rk<=cv73X=NT#S!mq?uAfQr3hFD*Xm%&dqTkMbgxyga zntx0l%54#Lm78aTuJ~zLWXpDep}M51!g;KiDJaOyI1 zYmB#tH8x>fUF}5cMgPY&4O1NrlBCt53Ru903D$1hK_dr&Uhtv5re`WgSA2(9CH>i} zjk7~i0-<|PvD_ewoAle&hKOeSkHl~QsYI>v|X^AIfaH)n|yFy3bR!LY)DCIZ`AzO}&B z!YAc%w1Vu!m`lgBuB4+Tjx@xSnz&a=)fMMoYqQ;OY-%G9dQf;SWy>AK_6TQv?Rxw! zp^tK_soycF{Iye7J5ZV(30z9Jaa_uc5;M6(59>O=u}k~|I{R9+;}3t8ujD^Gxtfx7^BH$j$6jshQ%(nVRmxJT@fKgx#X6J6WygG zY6(*mLUOBII+=1QRKMv|=l932-}m+Uem|Gj^E~g{^T#*U#o1m#PF)TF04QJ`Y~4gF zXzi7i7Jb<~-n?i5a_qb~?uNg)&t=pZGCO1A{h-f9AasANm9r!fwWW1=a+R0kf5 z;?8r%lXxK{b28X!FK7=JDH5PjI7ASa7D{I$xt8E>x=7J}?HUFKeS>g9EW!UI<%M$r zp&2X+$QTOOC&5kNAQJpe{ z-+ce4FdHAmq`=%LY(_YXBpO^GWGxgEiDprV90m)|V1)kYqDwG?!(az9m>{&fG02lj zCo>}1-_ST55=&=uh;$MKYikJ>@u5^I8EFDX+u7Kd+F=l;#s&s<2IeN#M&@X^p^>?n z4Z;{<@`G#3AcfN?bj}Yh`Cl&Pm)tcY(3qmgwiFgMf45+n=Tt9e&!LLKk_RB{H>XR=_9#Aj`$tTI0C`6Q16o z2Rwma1b#tR`CA9)vW&tU9M0C@98~km%QhZSwT@peYwJsJ@k-FsLgnbBByh*l9YK!Vta z$GbSAXW;%J2Zl>Pzw2$W%{{?`obg$%z-W30D%SS22R)5B9$B+$BeUs_WWd1TM>O>$ zxbN}pORr;0OJ?9k_PGv&gk*Fzy)(`JwLVskdCLtECJf09z+x&*t6C=kX&n)=;4Xv@dCiR>oQ zt9PTQtm!$YZ7TdfKPX@6xQmrIK{h$`c)`2U5!k>{S%|yW-%}KK#_wKB!%QU*xh_iDqiw#GQM1K=&75er==-v$wW+4++zp*unNkB+ibF0twWgxGAg{=+BP+3X zN~n2xROBWt#1?pu_vuFG*?u`lpA7#kM*FJ#&8K>FU@R>XJ|@3AuysQD-Vs`OiP0aS zpFVb+IIjvG@{=3C9Xry%T(uDHx?N%>c{>;gzarOgV>8%4Ho|bdB-yK@MdNJ}&|qt} zbccBNB3QknySM{2`wQ0>r&Sfo*^m94ir-7X zp8-?krh>04DzP|m@UXG-8eKe5?ok!VgCHPbDWrf=T<0;1AjMTjT;By5JlQ#&A(zl=BhsA@=qKnmq;jzrU zJ~fj7U=4l}p^>YV_6HgDi1_r)=IBigNOVBDjZT_SPclFXEKGGOF#`>hsvqv%EViWt z;^T!QVc_ffisH6(q7uqVt566ltgd_yWy0ryV>h!ZT_S0eTJ)rQb5T--b#ry*kY|yW zN(GjWI7*K9xI7wJf9+^8-(#XuBmOY7D>Tnl0;6eEP;hKV?c+qY4fu@r!luiw?5Y&i z{?37)v?xu~x<8atP&Oodt!#JC?)j0XD5tO|zEbGkx<41e4H$mru$eUM5ov>*m$m+- zhk*X5%7^iC)tq4)EtmeyM)14!#UJYW6d(%6c2ND}#>SjVZhVx777URQSy_H}mwNsX zI^lw4D>{znE6#D|iwawltNC*aop0*$RTG~}P+SdVQCiiVSv&72hG$()b9Mevh>pRCtKtN8JSqYuB(koE$3~xQKr${;lrw{JGoyU6X8|zVYD>q2}UM|VtsLNq545@ zmnQGp3O0w=H#%4Hpq8NKd&}J`J8~qj|FmZB-W^_bvdQ)1K<(o0}(n+PzGunv{nZAD6_?{06#-B><+Vd-mfU2*W=ya=0X7;w0 zs0CKI|B)!8MFlrZ3xGi1ENUIq#3!WkJhs>{V5 zYvozlfL#)KM5U>d{6XZUhRICAp%T!Df0fMC<;KYNW5mk>EeKR5)VxDHZhNOeP;;e+ zG_5#8Z}7r{(==>+R#J%m_^4zEpTNe4bf&)$Sez2%TDgo* z5dyTi_R6KS%TQM)eS$?{szJaiK^>Zu0 z^eWKdKn0Qld=k{RF=osGeZ3aL@Z%Z;0+xT8U7+vly>4{B^2iS9~Qe zT3?&+>FlVV#)c&8X@0ot(C0r2{Fc@4x1s4#AtSHaBL?Kl(_I8_#IU+T`i1 z+aBBWhhO|MtN8TImf+qbG5><9IYJt0y17)X-6D}%TQ9%mCYZMZfxO_$QG*&B&ua?g zkM(#6q$juwd(s3RoMKtaMSFtz{v@=3k1-1JqFA?G;kG?rVSLSUYFi JTAP5l{{XrJoCI)U5+IF$kOkV(1QsT-@qi{o-zK3^O-$O5wuepQ zbuei|s1KX^#KR(i$kZWa4<5}rHf^CDVu)09YSp1Y(wMACNbGCh>wj^a*w^>B2bQds zlQe1SoVTBJf4}qjo%22Ccdir)g+|)i+N5H!$X8*qER)G(oL8<~8E9&1x_tfm^}_x8 z_c?z2_{tkbM@K~^tgo+6+_-V$rlKewfd2mel>tUZMk)d@FfbrY(-fgl=xx9caP#KP ztpk{xoD@StL&CBwap%sR-!DPjy?b|S0E7^tzrSAyAw({h6QNM(ZB5g>WtyRa=5ROw zaJgKZK7IPT*REZ=R=anvR=oPl#`$0U;s*d~B>{XsUkS|l^XK2NEsNY-`djI&8F+f} zCx$Zc!lP2zws~_r2eB1g_THtvtj^4Lqjw+HuC)Wb0kS) zA$^x%K$3L5nZZ8|a_V@m5&74je^wCyAp|E*oS?O}6;0E?{x_JHu_NQuIljky?hwA_ z;I<1NJZfJPKp>EiHVhz167B8n0N9J4QjEWjl9(VB1&v2sy!cN({^*e#Xej}>efu`C zSPadfF=~%;_4`*h6$v{(gBAS-YBoYD0!ifnZO8tK>U1sNu>`(+nn;qgf$%#CG|b}6 zo<+^-B&T51+=*+?&)Kd9%f2rG*tu&b7yK7c6a}FO48tH6iy_PF?N=K1;sfgKU$d<^ zLwXjHj!v}JOUzrlu=4XbHP7k*?Ju>L9l3x1{`JS*dWK zx0GtYwkZ?}$dde`jY=EI`7?_8X_Vw=q#}?|I@ope{j!{|2{7=70kGk*{ur0T#ibu# zTA%a6bF9cQ)Vb&jwX2=%I{MxhIxl;SCZq|%)nSIKhY8dK)_L=BinB*hvr#g$Fy}r( zbN9RJa$XjJ162p;`=pOIzx^hY2itw0Q7`=nWp0-A4E!g%mz?9L zB*Qs`{YhDKYHMr5?RKvY@Y>6-(fLv*i`F9DJ>BGTITjWcR;U7veD?1Y3YU?!6e%6j z+ROM_-y)x=VIh|;Yt6DOBZOEz0zwD^fxtS|K7ufQixf*?Mj)+zjliq#plxfWWrGb% z{d|ZXK77dd`1o?TdU|@wHWUkC?C2@f

HEQfeo`WB)+ad|z&g{`_KLVSzJe&T#JB zIl|%aiW`z2{)Ob2k7N`wjza{GzW=42muVoM&o7J4vMhuUWV6{9B9s-1`Uv``k1?_b zaP6pP&)45#u~@}oHoGooZnwKkPbB~~H8o64O`+>L&CSg`efpGWG>R-MV9iq-`5Rf` zC9`c0rr1kvYz|?6z!!C_B@rGzd>D^sjaJ;<-MxHshr>ZCmBR1$Bgrc7{_Z#QzWNHm zwjSiFdh&$=!Y*#$k&#fG?t**%ISOQR2SI5bdC#kNk=GLuSY=xBo6bc2Vr>F7xd( zBoZW($qfx8tBFvOBm#lJiy?J2fM76)X_}gs zW2>zMAQp=ekH-;0uw%y#>gwt$4p0)?;o)Hn!@#y}1_uYXBmyM>9*>8Pjt&kUJXn^i zElGhSNlZ*k5Rb=kyWK>iQ4)#7rmJA-?3R`moKENJ03972#N%-ag#x|3z394*VHlgP zf~B`05D1h5sOtY28X6jCXlN)|SIU-BtUh?~;K{vv_x5jf`HhW@Nq`~&LEs{g-(m(K cNz(oQ0@voM{km_2761SM07*qoM6N<$g0=keQvd(} literal 0 HcmV?d00001 diff --git a/root/usr/share/lemonldap-ng/portal-skins/common/apps/telephone.png b/root/usr/share/lemonldap-ng/portal-skins/common/apps/telephone.png new file mode 100644 index 0000000000000000000000000000000000000000..36dc5c8dcde40674e10638e91beda3ee3cc51c4d GIT binary patch literal 1688 zcmV;J250$+P);E zK~z}7?UrkdRn-}WpS9LLw_)ZS&K%}2gF?6tRjdZfsI5~=BGiW7tTi+yP1`h;*ivaB zrCchND2S#_3KF%o=npHj(b!IG(@^YRZ|M}luR@pLNH**a&&>(|ZuP#3@}d-n3l#kc+U1pa)elePu(>FMpwA3WH( ztP)nfq_vqpGBScOG0r)hb9fKld%X9xU;?}cAp}w>lF8JFlyo#SG`w)n(mOi<{;=nd z+_8A!l?lAI{~))1^d|Pb_WF|UbLZEVO68ANs}bINthGduA&z6D6ey)oN+E>+0oFRK zwK(UHQW69KP$L*yOD2;+DfL22^W?R6-MQrCWd!#9=>RP)Q}UgiZ@f7$Fwhc)Rl+bt zDTNS%WHL!>>ul1gG_j4zq%&kPNm8jarBVqM1PqpjP)cIsn7+P#jvYHrpd{KD^7%YM zN}P4n)ur#bZ`s#=1t0-#x%GD1KXx+*4jkOu)qTD>3?q~Zm@uK9D2k|5DqK77TFT{+ z*jlvF)Mqnv_4JW%Y(QH}zA;DtU?24pG7Jt5F{w~s>eQ|UQ@Py&WFQ4A= z+}s_{K9BmwvQ@m?u`B)MuiU$}v2oI8j4@)Yuikr1Y-nw5r8*KZxj2d3#5$766mw=x z=jxWpB!YnE;w0+p>S&!ki-{9+Oq(`^e;zqb^W-9D&vqlFLI{btsNu%gxy!%#^SSY!)=|`0CF}v;pov5obNivyQk04+t<&rV<)IYnv*7A=I58P|F^#*cioMc*b)Tlc&R*85>n)) zkfTRdytwi^_w5t_D^@!8yy6<{~|PgIv=(gD?!~czF-?xg1To20R{T9ZT>2oDxE~pKSZ-LhpUM zlyaL8Vn}TH(G#p&y`1~M`-9(a-@19p#eIG9XU`oDg5X9aB|?hP&10B3^D3^M(t=d- zf*DBx<)LAYzWolB;VO;!9M(H<9&KVurJ-*P3=BNAVg1U>o$&i>H<2x5Q|Hc{+qr$~ z=DXKD@CaKrt!L}wJA5jgsyUmKC?!!+V&a%E93h*nCz(v(yrUXMSnFtNYQ)3_5O`m! zJ{+mi+tb^zZq14>yss61Z_PvGvbnmh?yg^dI!;c^PAp?W`;gj1R z{nWl!5A5je?OPc|5v9@~VHi@4BBDqWX^qwzV+>krqN=7^jfk|yXhRf5R7WC)DQtv+Fc59!CZu> zDKh2<&ei6^*x9#njQ5`5q4NFdy82lYCe&?ybkq7?fZ$RB4{uxpK%{lqJ68)nD!E`R zkr=xWLg4@HMqKQoW33pSma&&|Ul6Dk9qCU1FI|a%7=0IXb{=^3h8x<@QFI|;ZGm{N zcK*^5{6&OnGdd9@h-3Y1I6OSp$M*SWe!lIk(Fp$176d>YkWxyeo2N`owY9Y`w9Y0I zLEx$FuUcHdI*0e(3xprdW$`%Yox@|j@Wxald-(AFw|aZJ`$s>EfGQAPiNIKG{(t>z ix=fC7jAI=C0sjJ~mK*`bf7k#30000pNLf=WD)prs^6W5p;{meG_Lt%L+DEsd2* z&{RZ?K?u4ir)WH4R8}q*(1qQwEPKxE%+5WtbM|!S^?+0%Xr$6rUAt2={lD*h@B7|+ z&EPz)=Z2ECK0ZIs!K9|RCArGM3l^=IPmgAD!+p`%;n8&Zllv~cEO|a>GXLubF9m`Y z2ZuYNoMXAB3Ktg`mYHbyF^LaDHM}U47>Ll&9SWg4e57!wXUf|>ePhpW|KPpe$5}f#tprEvJ@}ImG$}RkNlnl-9_{@nu>BJOfiL`E z_`(5BVeb3%>7~2R8^B{-$6Yqn`9iZtTkZA>WgAyKQ20gwKWcx?HHP>{oITt++kGwU_6exvSWFlCVZe=o&Ou^SWLXAL z-N0y}gyD<^f1-p?B#&?~hUicbnd3p^`$9k_fkY^X**6b>l_src4Et>xRy<^!6TmI+ zZeh|~c*`hzbWvqx4lQmsrps5Lj=vB=X)m&d3McD;*Qi1hDiEV5{UxIeV2FbIhvSGu zl1PM880!mz4N|!-d=t@kno-r{M_oe}$^4}cZhiE@r_KrBx^0{8=+_Uv2ulc(ltZ&u zMwP1yjlvA1We&xhLM$-w@D9uuTOslah6uo5vVi`<1VZsFqKPaLREA7{1d?$aY4bvn;_dA z5G4jpRyXExlQE#@;1fNF(BsDkQwXJq{$viZqzPaQSpuLBC%`d5#Kx_KgDIk3t_Gj4 z#8`3CmMtsSTz>|D??3nVdwL@se=b!8q12>dtz_V|JK@SthLx`Yc!^k%V6`Z?+&U9Z z#fcaRu|JqWAeKcqQ$#kAf=$=J=87ncrV;85Q(4HmH7|j8bz$bXaj++q~j7lXAT55dAgfeT)>1va^kK3i~+b1r=LYRIaD0*NrC85rsb z!6sEz`t+yURzCJX8NiKe z+v++F?HtfOK}H>)fnon}16cgbwk7-b ztlcQKq@Xq!5ET|$+yc&OfnBJEuYy1*OTh9LhyqszFoQ(eLc%=S9Re@#$Q28a=sUMV z!ALlS+Nw%OqDZ}h*yIJ$f&j0_M*r*h)8AgDjyjC7LX~gxZyyRWSNv-I<30PfJSJb# z52cocXr~Md7ODmV4b1V{v8Q7I45ya^UVcd{oHhc@a_IAq zz~!(}>11en3DI~8!=VTos%v3Y6bPb@XVBV1R(iP)N3I~0xnQXxOGwm4t^0t$ta?+#)Vps6&6V(Tk>FtofAU= zV!}qjWRyxe#MMl1u!aI8oE?u!?@kVC;J!{t;-uC`-U#kP-Z|b2E zNEms08FWR2;Otvqe-8j*o&=vU&E588rD@TxNg&G(~%Vo9<<&NhkI&_bRZ${-VYE7l%Tj|+;>wwn4*eQ zwt(-n))2)O%0@Vyy?L7;Oa>}l4%k%%Isqt_G;&C>TmqAc5&;r83)=U63@w*k#oYYF zwrf6E_u7v9SO%OxN>^;KSGmx<&<}wu*}J6`R+oxb)?9=3LnE+SSxlSYBh?G1={Ika z1)ltWq^FOXmPlY2s(+5GslhPLm_HDyU&Ldh=sa@xV`j;kt&YwQ_lypF-Yqa39VDsX zMaoXKqxqTuIMD{xGm00N`~@#>K7d(MJ@C41#mYmG-^6qvcL`;2%fz7g*?ih_G&`Pa&_r7+m4B(bk zZ!Fr~wrguFL}QdA8%hL%STMniTNZ^>F@z02Y{SNF9hf__x-2l6f|~-%=JVyl)0r$% zB(VLR-SD`bWKnO~6H>&eIk%1!W2^O|>>Zo7aDO2T)h-B^Ip2&Pi*U;Y}Hs zqBNbsQfEx(H5}^f>^Z#;+_rklJkr6x2YOGiirosUlLEP2n7gC^&OL@3TsNcZXaZFp z3#_tOK9nQjWpjDzcqi9Ap0=lazF01e=@Jth%bX1HWpJG~DNWYq&x%RTZp7XunuBWy$lEmN7>-y?MJYgBj z%Un4}>M`x4j&`5WcYk%n2 z5E6C)34druAvLz>_Nx~d-}q{F?;mzfk}cxz8AHF0x1?B6%FtR)3r94L+M0U!d=qIl z^kM$2iKkeQ5Q!%-p4_9#mQzzu!=A%ku*fP(GJ|j=yf>3hFI=)e<9#$MCQ{Rp5l_)uMk))9_6S|# z5$Nq{8%w8`U$a4Z=+g^9B-r!YbWwKKhygoJ8N^9u7jN*1(&_Y42GEL457`+Ic zGPjYFRO*VwRPxy9NO0x+3#V`T>Url4;H%e*o8D9;#dfVOs#ij?P16O#WwB_6RLuKj qmi>$?>2Gli^ZsSCFFEJC;eP@Bqn;?KmS@8N0000r3*sd(W?byu3hssW6_I^X`53 z%=vx3_qW}n>hGWKDoZ7`r8>2(8nva4Xj|1-w%#F1wrfkpY`=E%mu_?E8{3|{jtd@s zo3D?l-@VgPN?XRH?T*Gn@uowYg)5Cl7$c~(%-e8u=)82=O9lh}yh-CmG2xt1Odda)veFVxws-Q|S2xg>?A;iT zMbA!vQr`?eeLXIk51S%fdqrj5vilaHwIUes6AbuK3O?Aho9M}QFz&9l`hDrM6QDT* zJTo0FY>F1*^ZB@R?sQ6qMFtp3rCq+*_a$yR*`T$q1LSN3Xz}e+m}fI<`otVV@kEk6`;VeA2fUv4romvhJh3&`1EYTZ#f8~FJ&#v9 z33R!FO3~`##)R+s_Ov}pYempDY;6fqRGd#)X-STu-guJg19e0KR@x4ZEH45A<-3;3}0PE{*zT{pt^7VdD7)~|J9Myk5Xw5fV2_rm_Kx&~sRQ>lZofW+4>WfLa zE()Q1!WhPm9-g!3tHu^;4%T5=R)6@75q`Js9ro_8JrM6`Sk$oZ<2^Y7>K{CBu~x(_ zt(ug@q2bSb(Eu?1(!1vug?t|@U;1NixN;ufcFewJ39(qmziT)DigjaXLaB6<4dM9=Edq$ zA&9P=DZZf9U;CDZhPaPKA5A7txg?S);+{oYEX7-|uV(JdDLDd`taynx-`hkaU_dfy zB?vypp{&s5xr+VKp`QNf(C4b&`#+s9m*S8;Jk>4B>X%I4S^8r2$$@3q*J>dH7ZfG=E~SMo zT0>{b;T+Lk6Vfb#CAEl%?oYViWzHK>8O(&{qx2&6)ecrxm_RDB>ml)B;%jAL>L5$$_ z8WL^k;t7A+-+J^XQ_uszPtF3MXyvYrp$E5Lzo{;8`__7Y^X!T;f_`6aomU?wk#ZRy zY(D}Z`)&llOPa?#SLz4AJpm7tqtJPJIe^Kt2MQ>9eAfWL!j04RZ9m~pR-Ri%FyPM- zuxsyOI(uD~PK#b9>n@zArv8ieRkJBxy}L!yvc`C)!TW?@K>O5fRSPEMP5492DFH1j zXXXIL1bWIMA%EGVaig&;om&A%>hXIqDk5%i{G_Y_h&;9v0AEVhiZRjC;bH`11a0X^ zsML28fIjhPB>=;o*bTtZd&>h^fM;aR=#j;Y7#_*ZllCs6tue+0ItV!ysknDh@0z(+ zW!H!Na<_-a^QYis!jbWcrEPsHfL-!*70nON2s;JVL%yK3R6Dw$=lKhgU2(nc+IPL; zk;989iVVpS(9zXHcRb0&Knf9s>q#WlZSK@_mL4t-#qVjZ+q2dp`EuIGQyI8q;fSD6 zs=RhldDw1xct$vHh`rt)wijqeg94?<3kIyk6-5aOLLu^lx$z${EW+3kVLm-Jf(Liz zllC-6djdC~TbQ`nODAJKiegi{?gg74U#IZCLwxZ_1QKHQqpE-fTwzl3D#PFsV<_~~p!cwR- z(`-9n-Df)*$(&11wPg{;7Nn?dZlj~Cn}R{SFl|a1&o27~9kCwr9EUHDHF3|fwWO2r zO`T1(aihaVM7AKO!~058@S~Wbl|^Zv+xy|h2#$DsXJik157x19YxOsN_rsxl0)8KL z^(Uxrj2cm9PuIyhx8&I>#L$A!mg$WB@XU`eUSs5#(yHJ2#t7nOvUX-s4_B48^VEy~ z;Hek>Mr(U)Pyr%_9eWP3;k~VdomBhyklTOwREnesUuG*I3-7xhYp1%+E5TxUR#|EQ zT#OL0UGAOS_|H$83Jcb~@!=JJT>rjPI-*F8895BcvFYhe(9qmUb4wexR%pv&UU4FH zabc^q@zcJKjaDhon5IGCAQanL%bMPk>FfMMolE)``#z(_@X3slp8F4c^85Np7u~wh zvGab|9BnOcXlnK6+g_;1mmU#To;4|wWQ?zya(@@Ih9-PP1*$(`w2cdN=D-bzNXRZ; zRh4XbVET<>WQFawet?qEVrWKq!?@;G>Vc|yfZ8p8-vDgrv+MtSdF72`e7xW{Zn2{* zQ3hOB;bJK?{RanQFesJK78nmf2}(eefMEX*q=R4Op`>+Zk7zbHyV`iAaEN5nz8Ied@ZgpZ%_T_Mt zLUB}dWa&dBIaw-EO-hC1SR!lVj!t#%AGiB{KJWWmKF{-fx95-dlsC~`L)AbP003wZ zJn%lU6}0{;E6TpSxVSmlqR)2?;QO+}`2sSR25_OW!)PD^lN>?wp^>SgpE_w606-4J zAO-LPy!N3fY$lYvj)4l992pw`z&HsxWJ(l`4+^72Fj$V@soPCp5QFLn_P6nZdvS0y zI>RH5OY@B*k|=Re6bCBUX%7e^M9T!2G(H(5WJa@iXrUwcvo2b;U%!TdL7yS~C`a($ zNdS*CxNz~p?BW%0hWN!Bo!kj#N0pz!sQz5>0x{y&t-{D$W7 zeQ5vW`#*(wBoT)O^P%zBFb;!WH4-g0#lkA+T5^ z!qpyc>-Lq4XH#OBG#39Wm--JE^;Fj(Y`a z;qIF}kV`jBtEdpY+2$LGE|T3*XLmbOlh%fd@BeC2FVu#FlIU?la67dokV9{Vlt=Z;Zl+a70HS{zxuReN%V zpR!y34$9a=q@$)#aOkhy1^UU1^p4kUaKocgcjIEo$H|P7ZSPY#!YBfvQ?1^56mWh* z+;<~kdG&2KcWdz57>L^QM5pHo(~_pKA5F{T1qI>??{KiqQf->&qoq{EutaHgu5SZH zX;4i!UFYYm0|NsKB~^J6kg4>Sz{kHzvvii&`?No#Bq7S|aT6!%EH~^n&`YN9kH5B%GUn)8NO5 zE-gGnD88aL)zIVqC}AZpCK5wTtPF6uTFV1?ydHMw)ieabUXBDrhXw`?8VNti;f~Xr zOPtk3p?Yoc#WxQv4!;siVL{HmMe)O{OQrJ*eS@Q2o%XR;>8Jdfq|efdFID&-$Ot6r z1e7dt*0NC<=)?lOv#VIAB6X`K#saG%g=;hxzbPx%{ha-VV5`tM-*V~vnR_^oH3!TC zJu9ZiUB_P;=K>rS&Lyi~c1<(5P2a4q{HFFK|I;7ECHHv~+A1~P?FZhev^Z_3Zb$Ts zLMHw)P8*5FTWVN*|U=-eC>5@ITc0rZ1cSd`VW7kw!1 zD1BGj&rZLpTziTiufr^xmu;4t)pBJ3l;s=DyD;+#>af=$%dD((9h3T1tH(4ih0jMu zbV-FHDxOEAOV_eA;naTf-d8pcQMXuTNVAoSiqw#cEf-Hl>LmH7h3@|F0M&n@zY#i$ z8Sm;M;99V^Z$2vVQ`F6yEiP2US&?qdRt7P&4S-EKkH*4G65f<<3n`xuGsU8lb_I|V?&Jm!8dfJeJklE`PhfGxeq;k0}C&B8ADHs^LpkVTy!zB$0^Q( z_0(gxOVJk(4V`Gr%zQ@AAY5qKk_Ec$4#EqN-#&xq@qSYP@kv&lKVS@Zh);XhM8BFHjPE4>r4*1uA0?jtV+xtx#d(irD1!zZKE!%C&#t8@$i_zMp%+w z4)Cm0c{F#nM{NlpWJ!&IZ98c5^C2-39$DCGY+7={(@wdhS-jszKSO|HEtKuGb}(Qn zqC!N zrLWpiqoVl%HAQy~}pVs$P{_+#6y^w+c7J>*jP<2fIn@rxWGO0}NYln#=ERm2`V! r34YU!nI?@zR#^(&nVL!xlMRXh(v~VnD-2Ft{|P0y67f~oL&^UEC3v`( literal 0 HcmV?d00001 diff --git a/smeserver-lemonldap-ng.spec b/smeserver-lemonldap-ng.spec new file mode 100644 index 0000000..744fab1 --- /dev/null +++ b/smeserver-lemonldap-ng.spec @@ -0,0 +1,211 @@ +# Authority: vip-ire +# Name: Daniel Berteaud + +Summary: LemonLDAP NG is a web SSO solution +%define name smeserver-lemonldap-ng +Name: %{name} +%define version 0.2.19 +%define release 2 +Version: 0.2.20 +Release: 1%{?dist} +License: GPL +Group: SME Server +Source: %{name}-%{version}.tar.xz + +BuildArchitectures: noarch + +BuildRequires: e-smith-devtools +BuildRoot: /var/tmp/%{name}-%{version}-%{release}-buildroot + +Requires: e-smith-base >= 5.2.0-56 +Requires: e-smith-ldap +Requires: smeserver-webapps-common >= 0.1-8 +Requires: lemonldap-ng >= 1.4.1 +Requires: lemonldap-ng-fr-doc +Requires: perl(Authen::Captcha) + +%description +This package contains all the needed scripts and templates +to run LemonLDAP NG on your SME Server. It uses LDAP as authentication source +but can also use SSL auth (either optional with a fallback to LDAP, or SSL required) + +%changelog +* Sat Sep 07 2024 cvs2git.sh aka Brian Read 0.2.19-2.sme +- Roll up patches and move to git repo [SME: 12338] + +* Sat Sep 07 2024 BogusDateBot +- Eliminated rpmbuild "bogus date" warnings due to inconsistent weekday, + by assuming the date is correct and changing the weekday. + +* Tue Sep 03 2019 Daniel Berteaud 0.2.20-1 +- Bump version + +* Tue Sep 03 2019 Daniel Berteaud 0.2.19-1 +- new package built with tito + +* Wed Feb 15 2017 Daniel Berteaud 0.2.19-1.sme +- Set Access-Control-Allow-Origin on CAS endpoint, need for ticket renew in SOGo + +* Mon Jan 9 2017 Daniel Berteaud 0.2.18-1.sme +- Update httpd template to read the Authentication prop of domain to load + Lemonldap::NG handler + +* Wed Dec 7 2016 Daniel Berteaud 0.2.17-1.sme +- Replace My::Package with Lemonldap::NG::Handler in default vhost templates + +* Sat Jan 23 2016 Daniel Berteaud 0.2.16-1.sme +- Don't redirect to https for acme challenges + +* Wed Oct 14 2015 Daniel Berteaud 0.2.15-1.sme +- Fix DL icon size + +* Fri Sep 5 2014 Daniel Berteaud 0.2.14-1.sme +- Define localSessionStorage to prevent clashes between handlers + +* Wed Jul 30 2014 Daniel Berteaud 0.2.13-1.sme +- Add icons for mailman and phplist + +* Tue Jul 1 2014 Daniel Berteaud 0.2.12-1.sme +- Adapt for LL::NG 1.4.1 (1.4.0 was too buggy) + +* Wed Dec 11 2013 Daniel Berteaud 0.2.11-1.sme +- Add an icon for DL + +* Wed Nov 20 2013 Daniel Berteaud 0.2.10-1.sme +- Add an icon for pydio + +* Mon Nov 18 2013 Daniel Berteaud 0.2.9-1.sme +- Add two new icons (rdv.png and survey.png) + +* Wed Nov 13 2013 Daniel Berteaud 0.2.8-1.sme +- compatibility with SME9 (perl lib path) + +* Mon Nov 4 2013 Daniel Berteaud 0.2.7-1.sme +- Requires perl(Authen::Captcha) for LL::NG 1.3.0 + +* Tue Sep 17 2013 Daniel Berteaud 0.2.6-1.sme +- Small modifications to support SOGo CAS auth +- Enable CAS auth + +* Wed Aug 21 2013 Daniel Berteaud 0.2.5-1.sme +- Move custom icons to the correct directory + +* Wed Aug 21 2013 Daniel Berteaud 0.2.4-1.sme +- Add custom icons for the portal + +* Tue Sep 4 2012 Daniel Berteaud 0.2.3-1.sme +- Use Authentication prop instead of LemonLDAP + +* Wed Jun 20 2012 Daniel Berteaud 0.2.2-1.sme +- Redirect to HTTPS on port 443 + +* Wed Jun 20 2012 Daniel Berteaud 0.2.1-1.sme +- Add optional floating menu per vhost + +* Wed Jun 20 2012 Daniel Berteaud 0.2.0-1.sme +- Import in GIT +- Remove the grantSessionRule param +- Log via syslog (auth) + +* Mon Dec 19 2011 Daniel Berteaud 0.1-22.sme +- Change SSL Auth to work with LocationMatch, so CAS proxy can work with + SSL Auth enabled + +* Wed Jul 13 2011 Daniel Berteaud 0.1-21.sme +- Disable password reset form + +* Wed Jul 13 2011 Daniel Berteaud 0.1-20.sme +- Fix uninitilized values in lemonldap conf templates + +* Mon Jul 11 2011 Daniel Berteaud 0.1-19.sme +- reserve /lm-reload + +* Sun Jul 10 2011 Daniel Berteaud 0.1-18.sme +- Fix notification check + +* Sat Jul 09 2011 Daniel Berteaud 0.1-17.sme +- Don't force notifications on + +* Fri Jul 08 2011 Daniel Berteaud 0.1-16.sme +- Enable and configure notifications + +* Thu Jun 30 2011 Daniel Berteaud 0.1-15.sme +- Manage some configuration from the DB + +* Fri Mar 11 2011 Daniel Berteaud 0.1-14.sme +- Make LemonLDAP compatible with ocsinventory-ng + +* Mon Mar 7 2011 Daniel Berteaud 0.1-13.sme +- Add support for SSL Auth on the portal +- Use a separated vhost for SOAP requests + +* Tue Feb 1 2011 Daniel Berteaud 0.1-12.sme +- Requires recent version of smeserver-webapps-common +- Switch to LDAP based auth to protect the manager + +* Tue Jan 25 2011 Daniel Berteaud 0.1-11.sme +- Fix a spacing issue in httpd templates + +* Fri Jan 21 2011 Daniel Berteaud 0.1-10.sme +- Add SSLEngine directives in https virtualhosts + +* Fri Jan 21 2011 Daniel Berteaud 0.1-9.sme +- Fix empty SoapPassword + +* Thu Jan 06 2011 Daniel Berteaud 0.1-8.sme +- Fix Soap ressources authentication + +* Mon Jan 03 2011 Daniel Berteaud 0.1-7.sme +- Run the manager as a perl script (instead of CGI mode) + +* Mon Jan 03 2011 Daniel Berteaud 0.1-6.sme +- Use https links for error pages + +* Thu Dec 30 2010 Daniel Berteaud 0.1-5.sme +- use only alphanumeric characters for soap password +- use htpasswd to hash the password + +* Tue Dec 28 2010 Daniel Berteaud 0.1-4.sme +- don't load mod_auth_external if not needed +- move cache dir in /var/cache +- Fix several hosts listed in SoapAllowFrom + +* Fri Dec 24 2010 Daniel Berteaud 0.1-3.sme +- Use htpasswd file to protect SOAP services +- Configure session storage in lemonldap-ng.ini +- Support additionnal server reload URL + +* Fri Dec 17 2010 Daniel Berteaud 0.1-2.sme +- Let the manager be self-protected if ManagerAuth eq self + +* Thu Dec 16 2010 Daniel Berteaud 0.1-1.sme +- initial public release + +%prep +%setup -q -n %{name}-%{version} + +%build +perl createlinks +%{__mkdir_p} root/var/cache/lemonldap-ng +%{__mkdir_p} root/var/lib/lemonldap-ng/notifications + +%install +/bin/rm -rf $RPM_BUILD_ROOT +(cd root ; /usr/bin/find . -depth -print | /bin/cpio -dump $RPM_BUILD_ROOT) +/bin/rm -f %{name}-%{version}-filelist +/sbin/e-smith/genfilelist $RPM_BUILD_ROOT \ + --dir /var/cache/lemonldap-ng 'attr(0770,root,www)' \ + --dir /var/lib/lemonldap-ng/notifications 'attr(0770,root,www)' \ + > %{name}-%{version}-filelist + +%files -f %{name}-%{version}-filelist +%defattr(-,root,root) + +%clean +rm -rf $RPM_BUILD_ROOT + +%post + +%preun + +true