- // Got the capability we want, handle as needed.
- // As only one capability is requested at a time, no need to split
- QString acceptedCap = e->params().at(2).trimmed().toLower();
-
- // Mark this cap as accepted
- coreNet->acknowledgeCap(acceptedCap);
+ // Got the capabilities we want, handle as needed.
+ QStringList acceptedCaps;
+ acceptedCaps = e->params().at(2).split(' ');
+
+ // Store what capability was acknowledged
+ QString acceptedCap;
+
+ // Keep track of whether or not a capability requires further configuration. Due to queuing
+ // logic in CoreNetwork::queueCap(), this shouldn't ever happen when more than one
+ // capability is requested, but it's better to handle edge cases or faulty servers.
+ bool capsRequireConfiguration = false;
+
+ for (int i = 0; i < acceptedCaps.count(); ++i) {
+ acceptedCap = acceptedCaps[i].trimmed().toLower();
+ // Mark this cap as accepted
+ coreNet->acknowledgeCap(acceptedCap);
+ if (!capsRequireConfiguration &&
+ coreNet->capsRequiringConfiguration.contains(acceptedCap)) {
+ capsRequireConfiguration = true;
+ // Some capabilities (e.g. SASL) require further messages to finish. If so, do NOT
+ // send the next capability; it will be handled elsewhere in CoreNetwork.
+ // Otherwise, allow moving on to the next capability.
+ }
+ }