Mercurial > prosody-hg
comparison net/server_event.lua @ 5962:27eacbb6e71f
net/server_event: pcall require ssl rather than relying on globals
| author | daurnimator <quae@daurnimator.com> |
|---|---|
| date | Wed, 18 Dec 2013 18:11:17 -0500 |
| parents | 451b4649fad2 |
| children | 3bd90108cc3c |
comparison
equal
deleted
inserted
replaced
| 5961:5745bb2b6890 | 5962:27eacbb6e71f |
|---|---|
| 42 local setmetatable = use "setmetatable" | 42 local setmetatable = use "setmetatable" |
| 43 | 43 |
| 44 local t_insert = table.insert | 44 local t_insert = table.insert |
| 45 local t_concat = table.concat | 45 local t_concat = table.concat |
| 46 | 46 |
| 47 local ssl = use "ssl" | 47 local has_luasec, ssl = pcall ( require , "ssl" ) |
| 48 local socket = use "socket" or require "socket" | 48 local socket = use "socket" or require "socket" |
| 49 | 49 |
| 50 local log = require ("util.logger").init("socket") | 50 local log = require ("util.logger").init("socket") |
| 51 | 51 |
| 52 local function debug(...) | 52 local function debug(...) |
| 134 self.fatalerror = "connection timeout" | 134 self.fatalerror = "connection timeout" |
| 135 self:ontimeout() -- call timeout listener | 135 self:ontimeout() -- call timeout listener |
| 136 self:_close() | 136 self:_close() |
| 137 debug( "new connection failed. id:", self.id, "error:", self.fatalerror ) | 137 debug( "new connection failed. id:", self.id, "error:", self.fatalerror ) |
| 138 else | 138 else |
| 139 if plainssl and ssl then -- start ssl session | 139 if plainssl and has_luasec then -- start ssl session |
| 140 self:starttls(self._sslctx, true) | 140 self:starttls(self._sslctx, true) |
| 141 else -- normal connection | 141 else -- normal connection |
| 142 self:_start_session(true) | 142 self:_start_session(true) |
| 143 end | 143 end |
| 144 debug( "new connection established. id:", self.id ) | 144 debug( "new connection established. id:", self.id ) |
| 504 _ip = ip, _port = port, _server = server, _pattern = pattern, | 504 _ip = ip, _port = port, _server = server, _pattern = pattern, |
| 505 _serverport = (server and server:port() or nil), | 505 _serverport = (server and server:port() or nil), |
| 506 _sslctx = sslctx; -- parameters | 506 _sslctx = sslctx; -- parameters |
| 507 _usingssl = false; -- client is using ssl; | 507 _usingssl = false; -- client is using ssl; |
| 508 } | 508 } |
| 509 if not ssl then interface.starttls = false; end | 509 if not has_luasec then interface.starttls = false; end |
| 510 interface.id = tostring(interface):match("%x+$"); | 510 interface.id = tostring(interface):match("%x+$"); |
| 511 interface.writecallback = function( event ) -- called on write events | 511 interface.writecallback = function( event ) -- called on write events |
| 512 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) | 512 --vdebug( "new client write event, id/ip/port:", interface, ip, port ) |
| 513 if interface.nowriting or ( interface.fatalerror and ( "client to close" ~= interface.fatalerror ) ) then -- leave this event | 513 if interface.nowriting or ( interface.fatalerror and ( "client to close" ~= interface.fatalerror ) ) then -- leave this event |
| 514 --vdebug( "leaving this event because:", interface.nowriting or interface.fatalerror ) | 514 --vdebug( "leaving this event because:", interface.nowriting or interface.fatalerror ) |
| 687 end | 687 end |
| 688 local client_ip, client_port = client:getpeername( ) | 688 local client_ip, client_port = client:getpeername( ) |
| 689 interface._connections = interface._connections + 1 -- increase connection count | 689 interface._connections = interface._connections + 1 -- increase connection count |
| 690 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) | 690 local clientinterface = handleclient( client, client_ip, client_port, interface, pattern, listener, sslctx ) |
| 691 --vdebug( "client id:", clientinterface, "startssl:", startssl ) | 691 --vdebug( "client id:", clientinterface, "startssl:", startssl ) |
| 692 if ssl and sslctx then | 692 if has_luasec and sslctx then |
| 693 clientinterface:starttls(sslctx, true) | 693 clientinterface:starttls(sslctx, true) |
| 694 else | 694 else |
| 695 clientinterface:_start_session( true ) | 695 clientinterface:_start_session( true ) |
| 696 end | 696 end |
| 697 debug( "accepted incoming client connection from:", client_ip or "<unknown IP>", client_port or "<unknown port>", "to", port or "<unknown port>"); | 697 debug( "accepted incoming client connection from:", client_ip or "<unknown IP>", client_port or "<unknown port>", "to", port or "<unknown port>"); |
| 708 return interface | 708 return interface |
| 709 end | 709 end |
| 710 end | 710 end |
| 711 | 711 |
| 712 local addserver = ( function( ) | 712 local addserver = ( function( ) |
| 713 return function( addr, port, listener, pattern, sslcfg, startssl ) -- TODO: check arguments | 713 return function( addr, port, listener, pattern, sslctx, startssl ) -- TODO: check arguments |
| 714 --vdebug( "creating new tcp server with following parameters:", addr or "nil", port or "nil", sslcfg or "nil", startssl or "nil") | 714 --vdebug( "creating new tcp server with following parameters:", addr or "nil", port or "nil", sslctx or "nil", startssl or "nil") |
| 715 if sslctx and not has_luasec then | |
| 716 debug "fatal error: luasec not found" | |
| 717 return nil, "luasec not found" | |
| 718 end | |
| 715 local server, err = socket.bind( addr, port, cfg.ACCEPT_QUEUE ) -- create server socket | 719 local server, err = socket.bind( addr, port, cfg.ACCEPT_QUEUE ) -- create server socket |
| 716 if not server then | 720 if not server then |
| 717 debug( "creating server socket on "..addr.." port "..port.." failed:", err ) | 721 debug( "creating server socket on "..addr.." port "..port.." failed:", err ) |
| 718 return nil, err | 722 return nil, err |
| 719 end | |
| 720 local sslctx | |
| 721 if sslcfg then | |
| 722 if not ssl then | |
| 723 debug "fatal error: luasec not found" | |
| 724 return nil, "luasec not found" | |
| 725 end | |
| 726 sslctx, err = sslcfg | |
| 727 if err then | |
| 728 debug( "error while creating new ssl context for server socket:", err ) | |
| 729 return nil, err | |
| 730 end | |
| 731 end | 723 end |
| 732 local interface = handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- new server handler | 724 local interface = handleserver( server, addr, port, pattern, listener, sslctx, startssl ) -- new server handler |
| 733 debug( "new server created with id:", tostring(interface)) | 725 debug( "new server created with id:", tostring(interface)) |
| 734 return interface | 726 return interface |
| 735 end | 727 end |
| 743 return interface, client | 735 return interface, client |
| 744 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface | 736 --function handleclient( client, ip, port, server, pattern, listener, _, sslctx ) -- creates an client interface |
| 745 end | 737 end |
| 746 | 738 |
| 747 function addclient( addr, serverport, listener, pattern, sslctx ) | 739 function addclient( addr, serverport, listener, pattern, sslctx ) |
| 748 if sslctx and not ssl then | 740 if sslctx and not has_luasec then |
| 749 debug "need luasec, but not available" | 741 debug "need luasec, but not available" |
| 750 return nil, "luasec not found" | 742 return nil, "luasec not found" |
| 751 end | 743 end |
| 752 local client, err = socket.tcp() -- creating new socket | 744 local client, err = socket.tcp() -- creating new socket |
| 753 if not client then | 745 if not client then |
