--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian....@packages.debian.org
Usertags: unblock
X-Debbugs-Cc: secur...@debian.org
Please unblock package lemonldap-ng
[ Reason ]
lemonldap-ng 2.0.11+ds-3 has several vulnerabilities fixed in 2.0.12.
This update fixes:
* Session cache corruption can lead to authorization bypass or spoofing
(Closes: CVE-2021-35472)
* OAuth2 handler does not verify access token validity
(Closes: CVE-2021-35473)
* XSS on register form
* Bad behavior which displays TOTP secret to connected user and debug logs
[ Impact ]
One high vulnerability (CVE-2021-35472) and medium others
[ Tests ]
New upstream test not imported here. Current tests passed (both build
and autopkgtest)
[ Risks ]
Low risk. lemonldap-ng is developed following BDD/TDD, so most features
are tested.
[ Checklist ]
[X] all changes are documented in the d/changelog
[X] I reviewed all changes and I approve them
[X] attach debdiff against the package in testing
[ Other info ]
(Anything else the release team should know.)
unblock lemonldap-ng/2.0.11+ds-4
diff --git a/debian/changelog b/debian/changelog
index d3c338880..a56d54279 100644
--- a/debian/changelog
+++ b/debian/changelog
@@ -1,3 +1,15 @@
+lemonldap-ng (2.0.11+ds-4) unstable; urgency=high
+
+ * Import security fixes from 2.0.12
+ * Session cache corruption can lead to authorization bypass or spoofing
+ (Closes: CVE-2021-35472)
+ * OAuth2 handler does not verify access token validity
+ (Closes: CVE-2021-35473)
+ * Fix XSS on register form
+ * Don't display TOTP secret to connected user, neither in logs
+
+ -- Yadd <y...@debian.org> Thu, 22 Jul 2021 22:13:38 +0200
+
lemonldap-ng (2.0.11+ds-3) unstable; urgency=medium
* Add Breaks+Replaces in lemonldap-ng-handler for
diff --git a/debian/patches/CVE-2021-35472.patch
b/debian/patches/CVE-2021-35472.patch
new file mode 100644
index 000000000..16a4e4c10
--- /dev/null
+++ b/debian/patches/CVE-2021-35472.patch
@@ -0,0 +1,30 @@
+Description: fix session cache corruption
+Author: Yadd <y...@debian.org>
+Origin: upstream,
https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/commit/b6a1f946
+Bug: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/issues/2539
+Forwarded: not-needed
+Last-Update: 2021-06-25
+
+--- a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Run.pm
++++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Main/Run.pm
+@@ -139,7 +139,9 @@
+ }
+
+ # Try to recover cookie and user session
+- if ( $id = $class->fetchId($req)
++ $id = $class->fetchId($req);
++ $class->data( {} ) unless($id);
++ if ( $id
+ and $session = $class->retrieveSession( $req, $id ) )
+ {
+
+--- a/lemonldap-ng-portal/t/75-2F-Registers.t
++++ b/lemonldap-ng-portal/t/75-2F-Registers.t
+@@ -439,6 +439,7 @@
+ ),
+ 'Push U2F signature'
+ );
++ $id = expectCookie($res);
+ ok(
+ $res = $client->_get(
+ '/2fregisters',
diff --git a/debian/patches/CVE-2021-35473.patch
b/debian/patches/CVE-2021-35473.patch
new file mode 100644
index 000000000..535252b03
--- /dev/null
+++ b/debian/patches/CVE-2021-35473.patch
@@ -0,0 +1,69 @@
+Description: Add missing access token expiration check in OAuth2 handler
+Author: Maxime Besson <maxime.bes...@worteks.com>
+Origin: upstream,
https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/commit/23a8a100
+Bug: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/issues/2549
+Forwarded: not-needed
+Reviewed-By: Yadd <y...@debian.org>
+Last-Update: 2021-06-25
+
+--- a/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Lib/OAuth2.pm
++++ b/lemonldap-ng-handler/lib/Lemonldap/NG/Handler/Lib/OAuth2.pm
+@@ -10,16 +10,17 @@
+
+ # Retrieve regular session if this is not an offline access token
+ unless ($offlineId) {
+- my $data = {
+- %{
+- $class->Lemonldap::NG::Handler::Main::retrieveSession( $req,
+- $id )
+- },
+- $class->_getTokenAttributes($req)
+- };
++ my $data =
++ $class->Lemonldap::NG::Handler::Main::retrieveSession( $req, $id );
++ if ( ref($data) eq "HASH" ) {
++ $data = { %{$data}, $class->_getTokenAttributes($req) };
+
+- # Update cache
+- $class->data($data);
++ # Update cache
++ $class->data($data);
++ }
++ else {
++ $req->data->{oauth2_error} = 'invalid_token';
++ }
+ return $data;
+ }
+
+@@ -87,6 +88,10 @@
+
+ # Get access token session
+ my $infos = $class->getOIDCInfos($access_token);
++ unless ($infos) {
++ $req->data->{oauth2_error} = 'invalid_token';
++ return;
++ }
+
+ # Store scope and rpid for future session attributes
+ if ( $infos->{rp} ) {
+@@ -141,6 +146,20 @@
+ unless ( $oidcSession->error ) {
+ $class->logger->debug("Get OIDC session $id");
+
++ # Verify that session is valid
++ unless ( $oidcSession->data->{_utime} ) {
++ $class->logger->error("_utime missing from Access Token session");
++ return;
++ }
++
++ my $ttl = $class->tsv->{timeout} - time +
$oidcSession->data->{_utime};
++ $class->logger->debug( "Session TTL = " . $ttl );
++
++ if ( time - $oidcSession->data->{_utime} > $class->tsv->{timeout} ) {
++ $class->logger->info("Access Token session $id expired");
++ return;
++ }
++
+ $infos = { %{ $oidcSession->data } };
+ }
+ else {
diff --git a/debian/patches/dont-display-totp-secret.patch
b/debian/patches/dont-display-totp-secret.patch
new file mode 100644
index 000000000..d9fd960fa
--- /dev/null
+++ b/debian/patches/dont-display-totp-secret.patch
@@ -0,0 +1,21 @@
+Description: don't display TOTP secret to connected user neither in logs
+Author: Maxime Besson
+Origin: upstream
+Bug: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/issues/2543
+Forwarded: not-needed
+Reviewed-By: Yadd <y...@debian.org>
+Last-Update: 2021-06-25
+
+--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/2F/Register/TOTP.pm
++++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/2F/Register/TOTP.pm
+@@ -226,10 +226,6 @@
+ return $self->p->sendError( $req, 'notAuthorized', 200 );
+ }
+
+- elsif ( $self->conf->{totp2fDisplayExistingSecret} ) {
+- $self->logger->debug("User secret = $secret");
+- }
+-
+ else {
+ return $self->p->sendError( $req, 'totpExistingKey', 200 );
+ }
diff --git a/debian/patches/fix-trusted-domain-regex.patch
b/debian/patches/fix-trusted-domain-regex.patch
new file mode 100644
index 000000000..526b208db
--- /dev/null
+++ b/debian/patches/fix-trusted-domain-regex.patch
@@ -0,0 +1,46 @@
+Description: fix trusted domain regex
+Author: Yadd <y...@debian.org>
+Origin: upstream,
https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/commit/3b8222ae8
+Bug: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/issues/2535
+Forwarded: not-needed
+Last-Update: 2021-06-25
+
+--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Init.pm
++++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Init.pm
+@@ -391,7 +391,7 @@
+ }
+ }
+
+- my $tmp = 'https?://' . $re->as_string . '(?::\d+)?(?:/|$)';
++ my $tmp = '^https?://' . $re->as_string . '(?::\d+)?(?:/|$)';
+ $self->trustedDomainsRe(qr/$tmp/);
+
+ }
+--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm
++++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Run.pm
+@@ -885,14 +885,14 @@
+ my $csp = $self->csp . "form-action " . $self->conf->{cspFormAction};
+ if ( my $url = $req->urldc ) {
+ $self->logger->debug("Required urldc : $url");
+- $url =~ s#(https?://[^/]+).*#$1#;
++ $url =~ s#^(https?://[^/]+).*#$1#;
+ $self->logger->debug("Set CSP form-action with urldc : $url");
+ $csp .= " $url";
+ }
+ my $url = $args{params}->{URL};
+ if ( defined $url ) {
+ $self->logger->debug("Required Params URL : $url");
+- if ( $url =~ s#(https?://[^/]+).*#$1# ) {
++ if ( $url =~ s#^(https?://[^/]+).*#$1# ) {
+ $self->logger->debug("Set CSP form-action with Params URL :
$url");
+ $csp .= " $url";
+ }
+@@ -932,7 +932,7 @@
+ # Check if frames need to be embedded
+ my @url;
+ if ( $req->info ) {
+- @url = map { s#https?://([^/]+).*#$1#; $_ }
++ @url = map { s#^https?://([^/]+).*#$1#; $_ }
+ ( $req->info =~ /<iframe.*?src="(.*?)"/sg );
+ }
+ if (@url) {
diff --git a/debian/patches/fix-trusted-domain-wildcard.patch
b/debian/patches/fix-trusted-domain-wildcard.patch
new file mode 100644
index 000000000..e7e73fee2
--- /dev/null
+++ b/debian/patches/fix-trusted-domain-wildcard.patch
@@ -0,0 +1,53 @@
+Description: Reject hashes in URL
+Author: Yadd <y...@debian.org>
+Origin: upstream,
https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/commit/4b20e54b
+Bug: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/issues/2477
+Forwarded: not-needed
+Last-Update: 2021-06-25
+
+--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Process.pm
++++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Main/Process.pm
+@@ -333,6 +333,11 @@
+ "XSS attack detected (param: $name | value: $value)");
+ return $self->conf->{checkXSS};
+ }
++ if ( $value =~ m/#/ ) {
++ $self->userLogger->error(
++ "Browser parameters in URL (param: $name | value: $value)");
++ return $self->conf->{checkXSS};
++ }
+ return 0;
+ }
+
+--- /dev/null
++++ b/lemonldap-ng-portal/t/01-Reject-Hashes-in-URL.t
+@@ -0,0 +1,29 @@
++use Test::More;
++use strict;
++use IO::String;
++use MIME::Base64;
++
++require 't/test-lib.pm';
++
++my $res;
++
++my $client = LLNG::Manager::Test->new(
++ { ini => { logLevel => 'error', useSafeJail => 1 } } );
++
++ok(
++ $res = $client->_get(
++ '/',
++ query => 'url='
++ . encode_base64( 'http://bad.com#test.example.llng', '' )
++ ),
++ 'Try http://bad.com#test.example.llng'
++);
++expectReject($res);
++ok( $res->[2]->[0] =~ /37/, 'Rejected with PE_BADURL' )
++ or print STDERR Dumper( $res->[2]->[0] );
++
++count(2);
++
++clean_sessions();
++
++done_testing( count() );
diff --git a/debian/patches/fix-xss-on-register-form.patch
b/debian/patches/fix-xss-on-register-form.patch
new file mode 100644
index 000000000..60fc9eaee
--- /dev/null
+++ b/debian/patches/fix-xss-on-register-form.patch
@@ -0,0 +1,400 @@
+Description: fix XSS on register form
+Author: Maxime Besson <maxime.bes...@worteks.com>
+Origin: upstream,
https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/commit/d6968535
+ https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/commit/297dc830a
+Bug: https://gitlab.ow2.org/lemonldap-ng/lemonldap-ng/-/issues/2495
+Forwarded: not-needed
+Reviewed-By: Yadd <y...@debian.org>
+Last-Update: 2021-06-25
+
+--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/2F/Mail2F.pm
++++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/2F/Mail2F.pm
+@@ -82,8 +82,6 @@
+ }
+
+ # Build mail content
+- my %tplPrms;
+- $tplPrms{MAIN_LOGO} = $self->conf->{portalMainLogo};
+ my $tr = $self->translate($req);
+ my $subject = $self->conf->{mail2fSubject};
+
+@@ -104,12 +102,16 @@
+ $req,
+ 'mail_2fcode',
+ filter => $tr,
+- params => \%tplPrms
++ params => {
++ code => $code,
++ },
+ );
+ $html = 1;
+ }
+
+ # Replace variables in body
++ # FIXME: kept for compatibility with 2.0.0 mail templates
++ # in future versions this should only happen for plaintext emails
+ $body =~ s/\$code/$code/g;
+ $body =~ s/\$(\w+)/$req->{sessionInfo}->{$1} || ''/ge;
+
+--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/SMTP.pm
++++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Lib/SMTP.pm
+@@ -49,6 +49,7 @@
+ # HTML::Template cache interferes with email translation (#1897)
+ $prm{cache} = 0 unless defined $prm{cache};
+ $prm{params}->{STATIC_PREFIX} = $self->p->staticPrefix;
++ $prm{params}->{MAIN_LOGO} = $self->conf->{portalMainLogo};
+ my %extra =
+ $self->p->can('tplParams')
+ ? $self->p->tplParams($req)
+---
a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/CertificateResetByMail.pm
++++
b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/CertificateResetByMail.pm
+@@ -129,7 +129,7 @@
+
+ sub _certificateReset {
+ my ( $self, $req ) = @_;
+- my ( $mailToken, %tplPrms );
++ my ($mailToken);
+
+ # CertificatReset FORM => modifyCertificate()
+ if ( $req->method =~ /^POST$/i
+@@ -359,7 +359,6 @@
+ );
+
+ # Build mail content
+- $tplPrms{MAIN_LOGO} = $self->conf->{portalMainLogo};
+ my $tr = $self->translate($req);
+ my $subject = $self->conf->{certificateResetByMailStep1Subject};
+ unless ($subject) {
+@@ -380,12 +379,18 @@
+ $req,
+ 'mail_certificateConfirm',
+ filter => $tr,
+- params => \%tplPrms
++ params => {
++ expMailDate => $req->data->{expMailDate},
++ expMailTime => $req->data->{expMailTime},
++ url => $url,
++ },
+ );
+ $html = 1;
+ }
+
+ # Replace variables in body
++ # FIXME: kept for compatibility with 2.0.0 mail templates
++ # in future versions this should only happen for plaintext emails
+ $body =~ s/\$expMailDate/$req->data->{expMailDate}/ge;
+ $body =~ s/\$expMailTime/$req->data->{expMailTime}/ge;
+ $body =~ s/\$url/$url/g;
+@@ -420,7 +425,6 @@
+
+ sub modifyCertificate {
+ my ( $self, $req ) = @_;
+- my %tplPrms;
+ my $nbio;
+ my $x509;
+ my $notAfter;
+@@ -539,7 +543,6 @@
+ $req->{sessionInfo}->{ $self->conf->{mailSessionKey} } );
+
+ # Build mail content
+- $tplPrms{MAIN_LOGO} = $self->conf->{portalMainLogo};
+ my $tr = $self->translate($req);
+ my $subject = $self->conf->{certificateResetByMailStep2Subject};
+ unless ($subject) {
+@@ -560,12 +563,14 @@
+ $req,
+ 'mail_certificateReset',
+ filter => $tr,
+- params => \%tplPrms
++ params => {},
+ );
+ $html = 1;
+ }
+
+ # Replace variables in body
++ # FIXME: kept for compatibility with 2.0.0 mail templates
++ # in future versions this should only happen for plaintext emails
+ $body =~ s/\$(\w+)/$req->{sessionInfo}->{$1} || ''/ge;
+
+ # Send mail
+--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm
++++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/MailPasswordReset.pm
+@@ -91,7 +91,7 @@
+
+ sub _reset {
+ my ( $self, $req ) = @_;
+- my ( $mailToken, %tplPrms );
++ my ($mailToken);
+
+ # PASSWORD CHANGE FORM => changePwd()
+ if (
+@@ -323,7 +323,6 @@
+ );
+
+ # Build mail content
+- $tplPrms{MAIN_LOGO} = $self->conf->{portalMainLogo};
+ my $tr = $self->translate($req);
+ my $subject = $self->conf->{mailConfirmSubject};
+ unless ($subject) {
+@@ -344,12 +343,18 @@
+ $req,
+ 'mail_confirm',
+ filter => $tr,
+- params => \%tplPrms
++ params => {
++ expMailDate => $req->data->{expMailDate},
++ expMailTime => $req->data->{expMailTime},
++ url => $url,
++ },
+ );
+ $html = 1;
+ }
+
+ # Replace variables in body
++ # FIXME: kept for compatibility with 2.0.0 mail templates
++ # in future versions this should only happen for plaintext emails
+ $body =~ s/\$expMailDate/$req->data->{expMailDate}/ge;
+ $body =~ s/\$expMailTime/$req->data->{expMailTime}/ge;
+ $body =~ s/\$url/$url/g;
+@@ -496,7 +501,6 @@
+ $req->{sessionInfo}->{ $self->conf->{mailSessionKey} } );
+
+ # Build mail content
+- $tplPrms{MAIN_LOGO} = $self->conf->{portalMainLogo};
+ my $tr = $self->translate($req);
+ my $subject = $self->conf->{mailSubject};
+ unless ($subject) {
+@@ -505,6 +509,8 @@
+ }
+ my $body;
+ my $html;
++ my $password = $req->data->{newpassword};
++
+ if ( $self->conf->{mailBody} ) {
+
+ # We use a specific text message, no html
+@@ -517,13 +523,16 @@
+ $req,
+ 'mail_password',
+ filter => $tr,
+- params => \%tplPrms
++ params => {
++ %tplPrms, password => $password,
++ },
+ );
+ $html = 1;
+ }
+
+ # Replace variables in body
+- my $password = $req->data->{newpassword};
++ # FIXME: kept for compatibility with 2.0.0 mail templates
++ # in future versions this should only happen for plaintext emails
+ $body =~ s/\$password/$password/g;
+ $body =~ s/\$(\w+)/$req->{sessionInfo}->{$1} || ''/ge;
+
+--- a/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/Register.pm
++++ b/lemonldap-ng-portal/lib/Lemonldap/NG/Portal/Plugins/Register.pm
+@@ -114,7 +114,6 @@
+ # Parameters check
+ sub _register {
+ my ( $self, $req ) = @_;
+- my %tplPrms;
+
+ # Check if it's a first access
+ unless ( ( $req->method =~ /^POST$/i and $req->param('mail') )
+@@ -301,7 +300,6 @@
+ );
+
+ # Build mail content
+- $tplPrms{MAIN_LOGO} = $self->conf->{portalMainLogo};
+ my $tr = $self->translate($req);
+ my $subject = $self->conf->{registerConfirmSubject};
+ unless ($subject) {
+@@ -316,10 +314,17 @@
+ $req,
+ 'mail_register_confirm',
+ filter => $tr,
+- params => \%tplPrms
++ params => {
++ expMailDate => $req->data->{expMailDate},
++ expMailTime => $req->data->{expMailTime},
++ url => $url,
++ %{ $req->data->{registerInfo} || {} },
++ },
+ );
+
+ # Replace variables in body
++ # FIXME: kept for compatibility with 2.0.0 mail templates
++ # in future versions this should only happen for plaintext emails
+ $body =~ s/\$expMailDate/$req->data->{expMailDate}/g;
+ $body =~ s/\$expMailTime/$req->data->{expMailTime}/g;
+ $body =~ s/\$url/$url/g;
+@@ -361,7 +366,6 @@
+ }
+
+ # Build mail content
+- $tplPrms{MAIN_LOGO} = $self->conf->{portalMainLogo};
+ my $tr = $self->translate($req);
+ my $subject = $self->conf->{registerDoneSubject};
+ unless ($subject) {
+@@ -371,14 +375,6 @@
+ my $body;
+ my $html = 1;
+
+- # Use HTML template
+- $body = $self->loadMailTemplate(
+- $req,
+- 'mail_register_done',
+- filter => $tr,
+- params => \%tplPrms
+- );
+-
+ # Build portal url
+ my $url = $self->conf->{portal};
+ $url =~ s#/*$##;
+@@ -390,7 +386,20 @@
+ ( $req_url ? ( url => $req_url ) : () ),
+ );
+
++ # Use HTML template
++ $body = $self->loadMailTemplate(
++ $req,
++ 'mail_register_done',
++ filter => $tr,
++ params => {
++ url => $url,
++ %{ $req->data->{registerInfo} || {} },
++ },
++ );
++
+ # Replace variables in body
++ # FIXME: kept for compatibility with 2.0.0 mail templates
++ # in future versions this should only happen for plaintext emails
+ $body =~ s/\$url/$url/g;
+ $body =~ s/\$(\w+)/$req->data->{registerInfo}->{$1}/ge;
+
+--- a/lemonldap-ng-portal/site/templates/common/mail_2fcode.tpl
++++ b/lemonldap-ng-portal/site/templates/common/mail_2fcode.tpl
+@@ -1,10 +1,10 @@
+ <TMPL_INCLUDE NAME="mail_header.tpl">
+
+ <span>
+-<span trspan="hello">Hello</span> $cn,<br />
++<span trspan="hello">Hello</span> <TMPL_VAR NAME="session_cn"
ESCAPE=HTML>,<br />
+ <br />
+ <span trspan="yourLoginCodeIs">Your login code is</span>
+-<b>$code</b><br/>
++<b><TMPL_VAR NAME="code" ESCAPE=HTML></b><br/>
+ </span>
+
+ <TMPL_INCLUDE NAME="mail_footer.tpl">
+--- a/lemonldap-ng-portal/site/templates/common/mail_certificateConfirm.tpl
++++ b/lemonldap-ng-portal/site/templates/common/mail_certificateConfirm.tpl
+@@ -1,10 +1,10 @@
+ <TMPL_INCLUDE NAME="mail_header.tpl">
+
+ <p>
+-<span trspan="hello">Hello</span> $cn,<br />
++<span trspan="hello">Hello</span> <TMPL_VAR NAME="session_cn"
ESCAPE=HTML>,<br />
+ <br />
+ <span><img src="cid:arrow:../common/bullet_go.png" alt="go"/></span>
+-<a href="$url" style="text-decoration:none;color:orange;">
++<a href="<TMPL_VAR NAME="url" ESCAPE=HTML>"
style="text-decoration:none;color:orange;">
+ <span trspan="click2ResetCertificate">Click here to reset your
certificate</span>
+ </a>
+ </p>
+--- a/lemonldap-ng-portal/site/templates/common/mail_certificateReset.tpl
++++ b/lemonldap-ng-portal/site/templates/common/mail_certificateReset.tpl
+@@ -1,7 +1,7 @@
+ <TMPL_INCLUDE NAME="mail_header.tpl">
+
+ <p>
+-<span trspan="hello">Hello</span> $cn,<br />
++<span trspan="hello">Hello</span> <TMPL_VAR NAME="session_cn"
ESCAPE=HTML>,<br />
+ <br />
+ <span trspan="resetCertificateOK">Your certificate has been successfully
reset!</span>
+ </p>
+--- a/lemonldap-ng-portal/site/templates/common/mail_confirm.tpl
++++ b/lemonldap-ng-portal/site/templates/common/mail_confirm.tpl
+@@ -1,10 +1,10 @@
+ <TMPL_INCLUDE NAME="mail_header.tpl">
+
+ <p>
+-<span trspan="hello">Hello</span> $cn,<br />
++<span trspan="hello">Hello</span> <TMPL_VAR NAME="session_cn"
ESCAPE=HTML>,<br />
+ <br />
+ <span><img src="cid:arrow:../common/bullet_go.png" alt="go"/></span>
+-<a href="$url" style="text-decoration:none;color:orange;">
++<a href="<TMPL_VAR NAME="url" ESCAPE=HTML>"
style="text-decoration:none;color:orange;">
+ <span trspan="click2Reset">Click here to reset your password</span>
+ </a>
+ </p>
+--- a/lemonldap-ng-portal/site/templates/common/mail_footer.tpl
++++ b/lemonldap-ng-portal/site/templates/common/mail_footer.tpl
+@@ -4,7 +4,7 @@
+ <p>
+ <span trspan="autoMail">This mail was sent automatically</span><br />
+ <span trspan="requestIssuedFromIP">The request was issued from IP</span>
+-$ipAddr
++<TMPL_VAR NAME="session_ipAddr" ESCAPE=HTML>
+ </p>
+ </div>
+
+--- a/lemonldap-ng-portal/site/templates/common/mail_password.tpl
++++ b/lemonldap-ng-portal/site/templates/common/mail_password.tpl
+@@ -1,12 +1,12 @@
+ <TMPL_INCLUDE NAME="mail_header.tpl">
+
+ <p>
+-<span trspan="hello">Hello</span> $cn,<br />
++<span trspan="hello">Hello</span> <TMPL_VAR NAME="session_cn"
ESCAPE=HTML>,<br />
+ <br />
+ <TMPL_IF NAME="RESET">
+ <span trspan="newPwdIs">Your new password is</span>
+ <span><img src="cid:key:../common/key.png" alt="key"/></span>
+-<b>$password</b>
++<b><TMPL_VAR NAME="password" ESCAPE=HTML></b>
+ <TMPL_ELSE>
+ <span trspan="pwdChanged">Your password has been successfully changed!</span>
+ </TMPL_IF>
+--- a/lemonldap-ng-portal/site/templates/common/mail_register_confirm.tpl
++++ b/lemonldap-ng-portal/site/templates/common/mail_register_confirm.tpl
+@@ -1,10 +1,10 @@
+ <TMPL_INCLUDE NAME="mail_header.tpl">
+
+ <p>
+-<span trspan="hello">Hello</span> $firstname $lastname,<br />
++<span trspan="hello">Hello</span> <TMPL_VAR NAME="firstname" ESCAPE=HTML>
<TMPL_VAR NAME="lastname" ESCAPE=HTML>,<br />
+ <br />
+ <span><img src="cid:arrow:../common/bullet_go.png" alt="go"/></span>
+-<a href="$url" style="text-decoration:none;color:orange;">
++<a href="<TMPL_VAR NAME="url" ESCAPE=HTML>"
style="text-decoration:none;color:orange;">
+ <span trspan="click2Register">Click here to confirm your account
registration</span>
+ </a>
+ </p>
+--- a/lemonldap-ng-portal/site/templates/common/mail_register_done.tpl
++++ b/lemonldap-ng-portal/site/templates/common/mail_register_done.tpl
+@@ -1,19 +1,19 @@
+ <TMPL_INCLUDE NAME="mail_header.tpl">
+
+ <p>
+-<span trspan="hello">Hello</span> $firstname $lastname,<br />
++<span trspan="hello">Hello</span> <TMPL_VAR NAME="firstname" ESCAPE=HTML>
<TMPL_VAR NAME="lastname" ESCAPE=HTML>,<br />
+ <br />
+ <span trspan="accountCreated">Your account was successfully created.</span>
+ <br />
+ <br />
+ <span trspan="yourLoginIs">Your login is</span>
+ <span><img src="cid:key:../common/bullet_go.png" alt="go"/></span>
+-<b>$login</b>
++<b><TMPL_VAR NAME="login" ESCAPE=HTML></b>
+ <br />
+ <span trspan="pwdIs">Your password is</span>
+ <span><img src="cid:key:../common/key.png" alt="key"/></span>
+-<b>$password</b>
++<b><TMPL_VAR NAME="password" ESCAPE=HTML></b>
+ </p>
+-<p><a href="$url"><span trspan="goToPortal">Click here to access to
portal</span></a></p>
++<p><a href="<TMPL_VAR NAME="url" ESCAPE=HTML>"><span
trspan="goToPortal">Click here to access to portal</span></a></p>
+
+ <TMPL_INCLUDE NAME="mail_footer.tpl">
diff --git a/debian/patches/series b/debian/patches/series
index b1a4d299e..a1245fc76 100644
--- a/debian/patches/series
+++ b/debian/patches/series
@@ -2,3 +2,9 @@ javascript-path.patch
Avoid-developer-tests.patch
fix-for-pod2man.diff
replace-api-doc-by-link.diff
+CVE-2021-35472.patch
+CVE-2021-35473.patch
+fix-trusted-domain-wildcard.patch
+fix-trusted-domain-regex.patch
+fix-xss-on-register-form.patch
+dont-display-totp-secret.patch
--- End Message ---