aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar jesopo2019-02-05 19:20:02 +0000
committerGravatar jesopo2019-02-05 19:20:02 +0000
commit5991e02b0a234a138897007fa369cedaba2251e9 (patch)
tree067fec5731614f8ed8f989d81b3de2eac511f22a
parentDisconnect from server and throw an exception if SCRAM server verification fails (diff)
signature
Manually count ACK/NAK for REQed CAPs before ENDing CAP negotiation
-rw-r--r--modules/line_handler.py19
-rw-r--r--src/IRCServer.py2
2 files changed, 11 insertions, 10 deletions
diff --git a/modules/line_handler.py b/modules/line_handler.py
index cb5d5631..7a692bd1 100644
--- a/modules/line_handler.py
+++ b/modules/line_handler.py
@@ -314,17 +314,16 @@ class Module(ModuleManager.BaseModule):
capabilities=capabilities)
elif subcommand == "ack":
event["server"].capabilities.update(capabilities)
- if not is_multiline:
- self._event(event, "cap.ack",
- capabilities=event["server"].capabilities,
- server=event["server"])
+ self._event(event, "cap.ack", capabilities=capabilities,
+ server=event["server"])
- if event["server"].cap_started and not event["server"
- ].waiting_for_capabilities():
- event["server"].cap_started = False
- event["server"].send_capability_end()
- elif subcommand == "nack":
- event["server"].send_capability_end()
+ if subcommand == "ack" or subcommand == "nak":
+ for capability in capabilities:
+ event["server"].requested_capabilities.remove(capability)
+ if (event["server"].cap_started and
+ not event["server"].waiting_for_capabilities()):
+ event["server"].cap_started = False
+ event["server"].send_capability_end()
# the server is asking for authentication
@utils.hook("raw.received.authenticate")
diff --git a/src/IRCServer.py b/src/IRCServer.py
index 69235f54..c01c83f5 100644
--- a/src/IRCServer.py
+++ b/src/IRCServer.py
@@ -30,6 +30,7 @@ class Server(IRCObject.Object):
self._capability_queue = set([]) # type: typing.Set[str]
self._capabilities_waiting = set([]) # type: typing.Set[str]
self.capabilities = set([]) # type: typing.Set[str]
+ self.requested_capabilities = [] # type: typing.List[str]
self.server_capabilities = {} # type: typing.Dict[str, str]
self.batches = {} # type: typing.Dict[str, utils.irc.IRCLine]
self.cap_started = False
@@ -363,6 +364,7 @@ class Server(IRCObject.Object):
def send_capability_queue(self):
if self.has_capability_queue():
capabilities = " ".join(self._capability_queue)
+ self.requested_capabilities = list(self._capability_queue)
self._capability_queue.clear()
self.send_capability_request(capabilities)
def has_capability_queue(self):