[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#725790: marked as done (pu: ejabberd/2.1.10-4+deb7u1)



Your message dated Sat, 12 Oct 2013 19:45:06 +0100
with message-id <1381603506.13031.32.camel@jacala.jungle.funky-badger.org>
and subject line Re: Bug#706209: unblock: ejabberd 2.1.10-5
has caused the Debian Bug report #706209,
regarding pu: ejabberd/2.1.10-4+deb7u1
to be marked as done.

This means that you claim that the problem has been dealt with.
If this is not the case it is now your responsibility to reopen the
Bug report if necessary, and/or fix the problem forthwith.

(NB: If you are a system administrator and have no idea what this
message is talking about, this may indicate a serious mail system
misconfiguration somewhere. Please contact owner@bugs.debian.org
immediately.)


-- 
706209: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=706209
Debian Bug Tracking System
Contact owner@bugs.debian.org with problems
--- Begin Message ---
Package: release.debian.org
Severity: normal
User: release.debian.org@packages.debian.org
Tags: wheezy
Usertags: pu

Please let ejabberd/2.1.10-4+deb7u1 enter Wheezy.
The proposed version is built upon 2.1.10-5 [1] which was
prepared for the first Wheezy point release but missed it by a narrow
margin.

Additionally two more bugs were fixed:
* Disabled SSLv2 and weak cyphers in TLS driver [2].
* Fixed rendering of angle brackets in logs produced for
  multi-user chat (MUC) rooms when a plain-text format is enabled for
  them (resulting in nicknames disappearing from these logs and similar
  issues) [3].

I have verified both of these bugfixes work as intended.

Please see the attached debdiff.  It's a bit large but please notice
that half of it is the unborn 2.1.10-5.

1. http://bugs.debian.org/706209
2. http://bugs.debian.org/724992
3. http://bugs.debian.org/724994
diff -u ejabberd-2.1.10/debian/NEWS ejabberd-2.1.10/debian/NEWS
--- ejabberd-2.1.10/debian/NEWS
+++ ejabberd-2.1.10/debian/NEWS
@@ -1,3 +1,16 @@
+ejabberd (2.1.10-4+deb7u1) unstable; urgency=low
+
+  This release adds support for the SCRAM-SHA-1 authentication mecnahism.
+  If the fully-qualified hostname of the server differs from the name
+  of the XMPP domain it serves, in order for this mechanism to work
+  with compliant clients, a modification should be made to the ejabberd's
+  configuration file.
+
+  Please consult the section "Using SCRAM-SHA-1 authentication mechanism"
+  in the README.Debian file for detailed information.
+
+ -- Konstantin Khomoutov <flatworm@users.sourceforge.net>  Thu, 16 May 2013 13:27:56 +0000
+
 ejabberd (2.1.8-1) unstable; urgency=low
 
   This release drops support for the @recent@ shared roster group
diff -u ejabberd-2.1.10/debian/changelog ejabberd-2.1.10/debian/changelog
--- ejabberd-2.1.10/debian/changelog
+++ ejabberd-2.1.10/debian/changelog
@@ -1,3 +1,22 @@
+ejabberd (2.1.10-4+deb7u1) unstable; urgency=low
+
+  [ Konstantin Khomoutov ]
+  * Add patch fixing parsing of optional parameters in SCRAM SHA-1 headers
+    (closes: #705613, thanks to Stephen Röttger for both writing the
+    original patch and backporting it to 2.1.10).
+  * Explain the "fqdn" configuration file option which has to be used
+    in certain setups for the SCRAM-SHA-1 to work with complying clients.
+    Mention this fact in the NEWS file. (Closes: #706590)
+  * Add upstream patch fixing incorrect escaping of a single quote character
+    in SQL queries generated by the ODBC storage backend (closes: #708151,
+    thanks to Vladislav Chugunov).
+  * Add upstream patches disabling SSLv2 and weak cyphers in TLS driver
+    (closes: #724992).
+  * Add patch (extracted from upstream) which fixes rendering of angle
+    brackets in plain-text MUC logs (closes: #724994).
+
+ -- Konstantin Khomoutov <flatworm@users.sourceforge.net>  Sun, 29 Sep 2013 21:48:11 +0400
+
 ejabberd (2.1.10-4) unstable; urgency=low
 
   [ Konstantin Khomoutov ]
diff -u ejabberd-2.1.10/debian/README.Debian ejabberd-2.1.10/debian/README.Debian
--- ejabberd-2.1.10/debian/README.Debian
+++ ejabberd-2.1.10/debian/README.Debian
@@ -14,6 +14,7 @@
 6. Upgrading from 2.0.x series
 6.1 Changes in ejabberdctl program
 6.2 Changes in logging
+7. Using SCRAM-SHA-1 authentication mechanism
 
 
 1. Running
@@ -361,6 +362,47 @@
 to "--erlang-log" to match the change above.
 
 
+7. Using SCRAM-SHA-1 authentication mechanism
+=============================================
+
+Since version 2.1.9 ejabberd supports the SCRAM-SHA-1 authentication
+mechanism (which, among other things, allows to not store passwords of
+XMPP accounts in clear text if the internal database backend is used
+for storage).  This authentication process implemented by this
+mechanism includes the client sending a so-called "digest URI" which
+includes the server's identity as perceived by the connecting client.
+The SCRAM-SHA-1 RFC document requires this identity to be the
+fully-qualified host name of the server.  This hostname is typically
+obtained by the client by looking up a server-specific DNS record of
+type SRV for the XMPP domain the client wants to register in.
+
+Unfortunately, the current implementation of SCRAM-SHA-1 in ejabberd
+is not able to perform the same kind of DNS query as used by the
+clients to know its "canonical" fully-qualified host name.
+Consequently, if the actual hostname of the server differs from the
+name of the XMPP domain it serves, a special option should be included
+in the configuration file to let the server know its hostname as seen
+by its clients.  This configuration option is called "fqdn" and it
+expects a single argument -- the fully-qualified hostname of the
+server, as recorded in the appropriate DNS SRV record for the server.
+An example of its usage:
+
+{fqdn, "foo.example.com"}.
+
+It worth repeating that if the server's hostname is not different from
+the name of XMPP domain it servers (for instance, the XMPP domain is
+"example.com" and the server's hostname is also "example.com") the
+usage of this configuration option is not necessary as ejabberd will
+just use the domain name in the indicated case.
+
+It should be noted that while certain clients faithfully implement the
+SCRAM-SHA-1 specification, some other clients diverge and use the XMPP
+domain instead of the fully-qualified hostname of the server in the
+digest URI strings they send.  Ejabberd implements relaxed rules for
+interpreting digest URIs to be interoperable with broken client
+implementations.
+
+
 Authors
 =======
 
diff -u ejabberd-2.1.10/debian/patches/series ejabberd-2.1.10/debian/patches/series
--- ejabberd-2.1.10/debian/patches/series
+++ ejabberd-2.1.10/debian/patches/series
@@ -9,0 +10,5 @@
+scram-optional-parameter-parsing-bugfix.patch
+fix-odbc-escaping.patch
+disable-ssl2.patch
+disable-insecure-ssl-cyphers.patch
+fix-nicks-in-plaintext-muc-log.patch
only in patch2:
unchanged:
--- ejabberd-2.1.10.orig/debian/patches/disable-ssl2.patch
+++ ejabberd-2.1.10/debian/patches/disable-ssl2.patch
@@ -0,0 +1,36 @@
+Description: Disable SSLv2 in the TLS driver
+ SSL 2.0 is not used anywhere as it has security problems.
+ Disable it unconditionally both in server and client mode.
+ This does not disable support for SSL 2.0 compatible client
+ hello which still will be accepted in the server mode.
+ .
+ This patch is a backport of changes introduced by the commit
+ e06c1c49c14c3f56cf4ddae080514f7802669335 in the upstream Git repository
+ to the ejabberd code base as of version 2.1.12.
+Author: Janusz Dziemidowicz <rraptorr@nails.eu.org>
+Forwarded: not-needed
+Last-Update: 2013-09-29
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/src/tls/tls_drv.c
++++ b/src/tls/tls_drv.c
+@@ -354,6 +354,8 @@ static ErlDrvSSizeT tls_drv_control(ErlDrvData handle,
+ 	    res = SSL_CTX_check_private_key(ctx);
+ 	    die_unless(res > 0, "SSL_CTX_check_private_key failed");
+ 
++	    SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_TICKET);
++
+ 	    SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
+ 	    SSL_CTX_set_default_verify_paths(ctx);
+ #ifdef SSL_MODE_RELEASE_BUFFERS
+@@ -386,10 +388,8 @@ static ErlDrvSSizeT tls_drv_control(ErlDrvData handle,
+ 	 SSL_set_bio(d->ssl, d->bio_read, d->bio_write);
+ 
+ 	 if (command == SET_CERTIFICATE_FILE_ACCEPT) {
+-	    SSL_set_options(d->ssl, SSL_OP_NO_TICKET);
+ 	    SSL_set_accept_state(d->ssl);
+ 	 } else {
+-	    SSL_set_options(d->ssl, SSL_OP_NO_SSLv2|SSL_OP_NO_TICKET);
+ 	    SSL_set_connect_state(d->ssl);
+ 	 }
+ 	 break;
only in patch2:
unchanged:
--- ejabberd-2.1.10.orig/debian/patches/scram-optional-parameter-parsing-bugfix.patch
+++ ejabberd-2.1.10/debian/patches/scram-optional-parameter-parsing-bugfix.patch
@@ -0,0 +1,99 @@
+Description: Fix parsing SCRAM optional parameters
+ The server gave an authentication error, if optional parameters
+ were present in the GS2 Header. Specifically, the "a=" parameter,
+ that can be used by admins to login as a different user.
+ .
+ This patch is a backport of changes introduced by the commit
+ 9e9b0eae802ee0508db6780426954efd048e7976 in the upstream Git repository
+ to the ejabberd code base as of version 2.1.10.
+Author: Stephen Röttger <stephen.roettger@gmail.com>
+Forwarded: not-needed
+Bug: https://support.process-one.net/browse/EJAB-1632
+Last-Update: 2013-03-25
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/src/cyrsasl_scram.erl
++++ b/src/cyrsasl_scram.erl
+@@ -34,6 +34,8 @@
+ 
+ -include("ejabberd.hrl").
+ 
++-include("jlib.hrl").
++
+ -behaviour(cyrsasl).
+ 
+ -record(state, {step, stored_key, server_key, username, get_password, check_password,
+@@ -52,8 +54,12 @@
+     {ok, #state{step = 2, get_password = GetPassword}}.
+ 
+ mech_step(#state{step = 2} = State, ClientIn) ->
+-	case string:tokens(ClientIn, ",") of
+-	[CBind, UserNameAttribute, ClientNonceAttribute] when (CBind == "y") or (CBind == "n") ->
++	case re:split(ClientIn, ",", [{return, list}]) of
++	[_CBind, _AuthorizationIdentity, _UserNameAttribute, _ClientNonceAttribute, ExtensionAttribute | _]
++	when ExtensionAttribute /= [] ->
++		{error, <<"protocol-error-extension-not-supported">>};
++	[CBind, _AuthorizationIdentity, UserNameAttribute, ClientNonceAttribute | _]
++	when (CBind == "y") or (CBind == "n") ->
+ 		case parse_attribute(UserNameAttribute) of
+                 {error, Reason} ->
+ 			{error, Reason};
+@@ -100,32 +106,36 @@
+ 	case string:tokens(ClientIn, ",") of
+ 	[GS2ChannelBindingAttribute, NonceAttribute, ClientProofAttribute] ->
+ 		case parse_attribute(GS2ChannelBindingAttribute) of
+-		{$c, CVal} when (CVal == "biws") or (CVal == "eSws") ->
+-		    %% biws is base64 for n,, => channelbinding not supported
+-		    %% eSws is base64 for y,, => channelbinding supported by client only
+- 			Nonce = State#state.client_nonce ++ State#state.server_nonce,
+-			case parse_attribute(NonceAttribute) of
+-			{$r, CompareNonce} when CompareNonce == Nonce ->
+-				case parse_attribute(ClientProofAttribute) of
+-				{$p, ClientProofB64} ->
+-					ClientProof = base64:decode(ClientProofB64),
+-					AuthMessage = State#state.auth_message ++ "," ++ string:substr(ClientIn, 1, string:str(ClientIn, ",p=")-1),
+-					ClientSignature = scram:client_signature(State#state.stored_key, AuthMessage),
+-					ClientKey = scram:client_key(ClientProof, ClientSignature),
+-					CompareStoredKey = scram:stored_key(ClientKey),
+-					if CompareStoredKey == State#state.stored_key ->
+-						ServerSignature = scram:server_signature(State#state.server_key, AuthMessage),
+-						{ok, [{username, State#state.username}], "v=" ++ base64:encode_to_string(ServerSignature)};
+-					true ->
+-						{error, "bad-auth"}
++		{$c, CVal} ->
++			ChannelBindingSupport = string:left(jlib:decode_base64(CVal), 1),
++			if (ChannelBindingSupport == "n")
++			or (ChannelBindingSupport == "y") ->
++				Nonce = State#state.client_nonce ++ State#state.server_nonce,
++				case parse_attribute(NonceAttribute) of
++				{$r, CompareNonce} when CompareNonce == Nonce ->
++					case parse_attribute(ClientProofAttribute) of
++					{$p, ClientProofB64} ->
++						ClientProof = base64:decode(ClientProofB64),
++						AuthMessage = State#state.auth_message ++ "," ++ string:substr(ClientIn, 1, string:str(ClientIn, ",p=")-1),
++						ClientSignature = scram:client_signature(State#state.stored_key, AuthMessage),
++						ClientKey = scram:client_key(ClientProof, ClientSignature),
++						CompareStoredKey = scram:stored_key(ClientKey),
++						if CompareStoredKey == State#state.stored_key ->
++							ServerSignature = scram:server_signature(State#state.server_key, AuthMessage),
++							{ok, [{username, State#state.username}], "v=" ++ base64:encode_to_string(ServerSignature)};
++						true ->
++							{error, "bad-auth"}
++						end;
++					_Else ->
++						{error, "bad-protocol"}
+ 					end;
++				{$r, _} ->
++					{error, "bad-nonce"};
+ 				_Else ->
+ 					{error, "bad-protocol"}
+ 				end;
+-			{$r, _} ->
+-				{error, "bad-nonce"};
+-			_Else ->
+-				{error, "bad-protocol"}
++			true ->
++				{error, "bad-channel-binding"}
+ 			end;
+ 		_Else ->
+ 	   		{error, "bad-protocol"}
only in patch2:
unchanged:
--- ejabberd-2.1.10.orig/debian/patches/fix-nicks-in-plaintext-muc-log.patch
+++ ejabberd-2.1.10/debian/patches/fix-nicks-in-plaintext-muc-log.patch
@@ -0,0 +1,92 @@
+Description: Fix angle brackets handle in MUC plaintext log
+ If the type of log files generated by the mod_muc_module
+ is set to plaintext, the renderer cuts out all the text
+ which starts with a '<' character and ends with a '>' characters,
+ inclusive, which, among other things, inhibits displaying of
+ room nicknames.  This patch fixes this behaviour.
+ .
+ This patch is a backport of changes introduced by the commits
+ 15073aafa58871b8d5e25652d492fb3a76900d5b,
+ bc8264b2ac6cf58d267dc06bb0d45585d5d677d0,
+ e85f7566dd7895f922f63528feed2995cd3eb52b and
+ 0b96b745bf4146dca3c3709765945fc97679465f in the upstream
+ Git repository to the ejabberd code base as of version 2.1.13.
+Author: Badlop <badlop@process-one.net>
+Forwarded: not-needed
+Last-Update: 2013-09-30
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/src/mod_muc/mod_muc_log.erl
++++ b/src/mod_muc/mod_muc_log.erl
+@@ -52,6 +52,9 @@
+ -define(PROCNAME, ejabberd_mod_muc_log).
+ -record(room, {jid, title, subject, subject_author, config}).
+ 
++-define(PLAINTEXT_CO, "ZZCZZ").
++-define(PLAINTEXT_IN, "ZZIZZ").
++-define(PLAINTEXT_OUT, "ZZOZZ").
+ 
+ -record(logstate, {host,
+ 		out_dir,
+@@ -311,6 +314,11 @@
+     fw(F, "  <a href=\"http://jigsaw.w3.org/css-validator/\";><img style=\"border:0;width:88px;height:31px\" src=\"~s/vcss.png\" alt=\"Valid CSS!\"/></a>", [Images_dir]),
+     fw(F, "</span></div></body></html>").
+ 
++htmlize_nick(Nick1, html) ->
++    htmlize("<"++Nick1++">", html);
++htmlize_nick(Nick1, plaintext) ->
++    htmlize(?PLAINTEXT_IN++Nick1++?PLAINTEXT_OUT, plaintext).
++
+ add_message_to_log(Nick1, Message, RoomJID, Opts, State) ->
+     #logstate{out_dir = OutDir,
+ 	   dir_type = DirType,
+@@ -323,7 +331,7 @@
+ 	   top_link = TopLink} = State,
+     Room = get_room_info(RoomJID, Opts),
+     Nick = htmlize(Nick1, FileFormat),
+-    Nick2 = htmlize("<"++Nick1++">", FileFormat),
++    Nick2 = htmlize_nick(Nick1, FileFormat),
+     Now = now(),
+     TimeStamp = case Timezone of
+ 		    local -> calendar:now_to_local_time(Now);
+@@ -438,7 +446,7 @@
+     STimeUnique = io_lib:format("~s.~w", [STime, Microsecs]),
+ 
+     %% Write message
+-    fw(F, io_lib:format("<a id=\"~s\" name=\"~s\" href=\"#~s\" class=\"ts\">[~s]</a> ", 
++    catch fw(F, io_lib:format("<a id=\"~s\" name=\"~s\" href=\"#~s\" class=\"ts\">[~s]</a> ",
+ 			[STimeUnique, STimeUnique, STimeUnique, STime]) ++ Text, FileFormat),
+ 
+     %% Close file
+@@ -662,7 +670,10 @@
+ 	     html ->
+ 		 S1;
+ 	     plaintext ->
+-		 ejabberd_regexp:greplace(S1, "<[^>]*>", "")
++		 S1a = ejabberd_regexp:greplace(S1, "<[^<^>]*>", ""),
++		 S1x = ejabberd_regexp:greplace(S1a, ?PLAINTEXT_CO, "~~"),
++		 S1y = ejabberd_regexp:greplace(S1x, ?PLAINTEXT_IN, "<"),
++		 ejabberd_regexp:greplace(S1y, ?PLAINTEXT_OUT, ">")
+ 	 end,
+     io:format(F, S2, []).
+ 
+@@ -767,14 +778,16 @@
+     htmlize(S1, html).
+ 
+ htmlize(S1, plaintext) ->
+-    S1;
++    ejabberd_regexp:greplace(S1, "~", ?PLAINTEXT_CO);
+ htmlize(S1, FileFormat) ->
+     htmlize(S1, false, FileFormat).
+ 
+ %% The NoFollow parameter tell if the spam prevention should be applied to the link found
+ %% true means 'apply nofollow on links'.
+-htmlize(S1, _NoFollow, plaintext) ->
+-    S1;
++htmlize(S0, _NoFollow, plaintext) ->
++    S1  = ejabberd_regexp:greplace(S0, "~", ?PLAINTEXT_CO),
++    S1x = ejabberd_regexp:greplace(S1, "<", ?PLAINTEXT_IN),
++    ejabberd_regexp:greplace(S1x, ">", ?PLAINTEXT_OUT);
+ htmlize(S1, NoFollow, _FileFormat) ->
+     S2_list = string:tokens(S1, "\n"),
+     lists:foldl(
only in patch2:
unchanged:
--- ejabberd-2.1.10.orig/debian/patches/disable-insecure-ssl-cyphers.patch
+++ ejabberd-2.1.10/debian/patches/disable-insecure-ssl-cyphers.patch
@@ -0,0 +1,34 @@
+Description: Disable old and insecure cyphers in TLS driver
+ Disabled:
+ * Export ciphers - broken by design, 40 and 56 bit encryption.
+ * Low encryption ciphers - 56 and 64 bit encryption.
+ * SSLv2 ciphers - some ciphers using MD5 MAC.
+ .
+ This patch is a backport of changes introduced by the commit
+ d2d51381ec3fea97d0bd968cd7ffed2364b644c6 in the upstream Git repository
+ to the ejabberd code base as of version 2.1.12.
+Author: Janusz Dziemidowicz <rraptorr@nails.eu.org>
+Forwarded: not-needed
+Last-Update: 2013-09-29
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/src/tls/tls_drv.c
++++ b/src/tls/tls_drv.c
+@@ -44,6 +44,8 @@ typedef unsigned __int32 uint32_t;
+ #define SSL_OP_NO_TICKET 0
+ #endif
+ 
++#define CIPHERS "DEFAULT:!EXPORT:!LOW:!SSLv2"
++
+ /*
+  * R15B changed several driver callbacks to use ErlDrvSizeT and
+  * ErlDrvSSizeT typedefs instead of int.
+@@ -356,6 +358,8 @@ static ErlDrvSSizeT tls_drv_control(ErlDrvData handle,
+ 
+ 	    SSL_CTX_set_options(ctx, SSL_OP_NO_SSLv2|SSL_OP_NO_TICKET);
+ 
++	    SSL_CTX_set_cipher_list(ctx, CIPHERS);
++
+ 	    SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
+ 	    SSL_CTX_set_default_verify_paths(ctx);
+ #ifdef SSL_MODE_RELEASE_BUFFERS
only in patch2:
unchanged:
--- ejabberd-2.1.10.orig/debian/patches/fix-odbc-escaping.patch
+++ ejabberd-2.1.10/debian/patches/fix-odbc-escaping.patch
@@ -0,0 +1,35 @@
+Description: Fix escaping of single quotes in SQL queries
+ The ODBC backend code improperly used a backslash character
+ to escape a single quote character in SQL queries instead of
+ duplicating the single quote character as required by SQL-92,
+ rendering the generated queries not understandable for certain
+ SQL servers, namely PostgreSQL.  The patch corrects this problem.
+ .
+ This patch is extracted from the commit
+ 89aa7baa5b5601c078d90bcd64deede218c7e5a8 in the upstream Git repository.
+ .
+ The first upstream version to integrate this patch is 2.1.11.
+Author: Evgeniy Khramtsov <ekhramtsov@process-one.net>
+Forwarded: not-needed
+Bug: https://github.com/processone/ejabberd/issues/24
+Last-Update: 2013-05-15
+XXX
+commit 
+Date:   Tue Jan 31 11:18:14 2012 +1000
+
+    Replace a single quote with double quotes in
+    an ODBC escape (thanks to Vladislav Chugunov)
+
+---
+This patch header follows DEP-3: http://dep.debian.net/deps/dep3/
+--- a/src/odbc/odbc_queries.erl
++++ b/src/odbc/odbc_queries.erl
+@@ -557,7 +557,7 @@ escape($\n) -> "\\n";
+ escape($\t) -> "\\t";
+ escape($\b) -> "\\b";
+ escape($\r) -> "\\r";
+-escape($')  -> "\\'";
++escape($')  -> "''";
+ escape($")  -> "\\\"";
+ escape($\\) -> "\\\\";
+ escape(C)   -> C.

--- End Message ---
--- Begin Message ---
On Tue, 2013-10-08 at 17:51 +0400, Konstantin Khomoutov wrote:
> In addition to the changes introduced in 2.1.10-5, two more bugs have
> been fixed:
> * Disabled SSLv2 and weak cyphers in TLS driver [2].
> * Fixed rendering of angle brackets in logs produced for
>   multi-user chat (MUC) rooms when a plain-text format is enabled for
>   them (resulting in nicknames disappearing from these logs and similar
>   issues) [3].
> 
> I have verified both of these bugfixes work as intended.
> 
> Please see the attached debdiff.  It's a bit large but please notice
> that half of it is the unborn 2.1.10-5.

As far as I can tell, this was all handled via security as 2.1.10-4
+deb7u1; if that's not the case, please explain what's still missing.

Regards,

Adam

--- End Message ---

Reply to: