Software /
code /
prosody
Comparison
net/server_epoll.lua @ 9309:33d500c25d76
net.server_epoll: Refactor Direct TLS assumptions outwards
The assumption that connections are "Direct TLS" when a TLS context is
supplided should be broken. The goal is to make it easy to add a new API
that can be given a TLS context at creation even if it should do
STARTTLS.
With this commit, only the exposed server_select-compatible API assumes
Direct TLS when a TLS context is included.
author | Kim Alvefur <zash@zash.se> |
---|---|
date | Thu, 13 Sep 2018 20:37:43 +0200 |
parent | 9306:35c128b42509 |
child | 9310:2d2d4c293efa |
comparison
equal
deleted
inserted
replaced
9308:21c2f3331c59 | 9309:33d500c25d76 |
---|---|
452 log("debug", "TLS handshake on %s complete", self); | 452 log("debug", "TLS handshake on %s complete", self); |
453 self.onwritable = nil; | 453 self.onwritable = nil; |
454 self.onreadable = nil; | 454 self.onreadable = nil; |
455 self._tls = true; | 455 self._tls = true; |
456 self:on("status", "ssl-handshake-complete"); | 456 self:on("status", "ssl-handshake-complete"); |
457 self.init = nil; -- Restore default method | |
458 self:init(); | 457 self:init(); |
459 elseif err == "wantread" then | 458 elseif err == "wantread" then |
460 log("debug", "TLS handshake on %s to wait until readable", self); | 459 log("debug", "TLS handshake on %s to wait until readable", self); |
461 self:setflags(true, false); | 460 self:setflags(true, false); |
462 self:setreadtimeout(cfg.handshake_timeout); | 461 self:setreadtimeout(cfg.handshake_timeout); |
487 conn.peername, conn.peerport = client:getpeername(); | 486 conn.peername, conn.peerport = client:getpeername(); |
488 end | 487 end |
489 if client.getsockname then | 488 if client.getsockname then |
490 conn.sockname, conn.sockport = client:getsockname(); | 489 conn.sockname, conn.sockport = client:getsockname(); |
491 end | 490 end |
492 if tls_ctx then | |
493 conn.init = interface.starttls; | |
494 end | |
495 return conn; | 491 return conn; |
496 end | 492 end |
497 | 493 |
498 -- A server interface has new incoming connections waiting | 494 -- A server interface has new incoming connections waiting |
499 -- This replaces the onreadable callback | 495 -- This replaces the onreadable callback |
502 if not conn then | 498 if not conn then |
503 log("debug", "Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval); | 499 log("debug", "Error accepting new client: %s, server will be paused for %ds", err, cfg.accept_retry_interval); |
504 self:pausefor(cfg.accept_retry_interval); | 500 self:pausefor(cfg.accept_retry_interval); |
505 return; | 501 return; |
506 end | 502 end |
507 local client = wrapsocket(conn, self, nil, self.listeners, self.tls_ctx); | 503 local client = wrapsocket(conn, self, nil, self.listeners); |
508 log("debug", "New connection %s", tostring(client)); | 504 log("debug", "New connection %s", tostring(client)); |
509 client:init(); | 505 if self.tls_direct then |
506 client:starttls(self.tls_ctx); | |
507 else | |
508 client:init(); | |
509 end | |
510 end | 510 end |
511 | 511 |
512 -- Initialization | 512 -- Initialization |
513 function interface:init() | 513 function interface:init() |
514 self:setwritetimeout(); | 514 self:setwritetimeout(); |
557 created = gettime(); | 557 created = gettime(); |
558 listeners = listeners; | 558 listeners = listeners; |
559 _pattern = pattern; | 559 _pattern = pattern; |
560 onreadable = interface.onacceptable; | 560 onreadable = interface.onacceptable; |
561 tls_ctx = tls_ctx; | 561 tls_ctx = tls_ctx; |
562 tls_direct = tls_ctx and true or false; | |
562 sockname = addr; | 563 sockname = addr; |
563 sockport = port; | 564 sockport = port; |
564 }, interface_mt); | 565 }, interface_mt); |
565 server:setflags(true, false); | 566 server:setflags(true, false); |
566 return server; | 567 return server; |
570 local function wrapclient(conn, addr, port, listeners, pattern, tls_ctx) | 571 local function wrapclient(conn, addr, port, listeners, pattern, tls_ctx) |
571 local client = wrapsocket(conn, nil, pattern, listeners, tls_ctx); | 572 local client = wrapsocket(conn, nil, pattern, listeners, tls_ctx); |
572 if not client.peername then | 573 if not client.peername then |
573 client.peername, client.peerport = addr, port; | 574 client.peername, client.peerport = addr, port; |
574 end | 575 end |
575 client:init(); | 576 if tls_ctx then |
577 client:starttls(tls_ctx); | |
578 else | |
579 client:init(); | |
580 end | |
576 return client; | 581 return client; |
577 end | 582 end |
578 | 583 |
579 -- New outgoing TCP connection | 584 -- New outgoing TCP connection |
580 local function addclient(addr, port, listeners, pattern, tls_ctx) | 585 local function addclient(addr, port, listeners, pattern, tls_ctx) |
581 local conn, err = socket.tcp(); | 586 local conn, err = socket.tcp(); |
582 if not conn then return conn, err; end | 587 if not conn then return conn, err; end |
583 conn:settimeout(0); | 588 conn:settimeout(0); |
584 conn:connect(addr, port); | 589 conn:connect(addr, port); |
585 local client = wrapsocket(conn, nil, pattern, listeners, tls_ctx) | 590 local client = wrapsocket(conn, nil, pattern, listeners, tls_ctx) |
586 client:init(); | 591 if tls_ctx then |
592 client:starttls(tls_ctx); | |
593 else | |
594 client:init(); | |
595 end | |
587 return client, conn; | 596 return client, conn; |
588 end | 597 end |
589 | 598 |
590 local function watchfd(fd, onreadable, onwriteable) | 599 local function watchfd(fd, onreadable, onwriteable) |
591 local conn = setmetatable({ | 600 local conn = setmetatable({ |