summaryrefslogtreecommitdiff
path: root/cpp/src/qpid/cluster/Connection.cpp
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2010-07-20 19:56:42 +0000
committerAlan Conway <aconway@apache.org>2010-07-20 19:56:42 +0000
commit0af66bbe3d82b53e224b63b8756f5b11192a36ca (patch)
treef990b65c9a4ed9a62d3e05a59a14547c76a31f90 /cpp/src/qpid/cluster/Connection.cpp
parent21f05c5ae445a134d75d5e6501e38f3f6e913fc7 (diff)
downloadqpid-python-0af66bbe3d82b53e224b63b8756f5b11192a36ca.tar.gz
Fix bug in cluster with authentication: nodes exit with "unauthorized-access"
Adding a node to a cluster on which authentication is enabled and on which there are existing connections authenticated with mechanisms other than anonymous, may result in nodes exiting the cluster with inconsistent authorisation errors. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk/qpid@965979 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'cpp/src/qpid/cluster/Connection.cpp')
-rw-r--r--cpp/src/qpid/cluster/Connection.cpp11
1 files changed, 11 insertions, 0 deletions
diff --git a/cpp/src/qpid/cluster/Connection.cpp b/cpp/src/qpid/cluster/Connection.cpp
index ee296d7f35..923d66ad34 100644
--- a/cpp/src/qpid/cluster/Connection.cpp
+++ b/cpp/src/qpid/cluster/Connection.cpp
@@ -304,10 +304,17 @@ size_t Connection::decode(const char* data, size_t size) {
const char* ptr = data;
const char* end = data + size;
if (catchUp) { // Handle catch-up locally.
+ bool wasOpen = connection->isOpen();
Buffer buf(const_cast<char*>(ptr), size);
ptr += size;
while (localDecoder.decode(buf))
received(localDecoder.getFrame());
+ if (!wasOpen && connection->isOpen()) {
+ // Connections marked as federation links are allowed to proxy
+ // messages with user-ID that doesn't match the connection's
+ // authenticated ID. This is important for updates.
+ connection->setFederationLink(isCatchUp());
+ }
}
else { // Multicast local connections.
assert(isLocalClient());
@@ -384,6 +391,10 @@ void Connection::shadowPrepare(const std::string& mgmtId) {
updateIn.nextShadowMgmtId = mgmtId;
}
+void Connection::shadowSetUser(const std::string& userId) {
+ connection->setUserId(userId);
+}
+
void Connection::consumerState(const string& name, bool blocked, bool notifyEnabled, const SequenceNumber& position)
{
broker::SemanticState::ConsumerImpl& c = semanticState().find(name);