mirror of git://git.psyced.org/git/psyced
general autodetect
This commit is contained in:
parent
2fb613538c
commit
86f6ec1749
|
@ -83,6 +83,13 @@ object connect(int uid, int port, string service) {
|
||||||
} \
|
} \
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// doesn't work. at this point autodetect hasn't completed.. so to
|
||||||
|
// make sure TLS is enabled we need to check again later in the
|
||||||
|
// server object.. FIXME :(
|
||||||
|
#define TLS_ENFORCE \
|
||||||
|
if (tls_query_connection_state(ME) == 0) \
|
||||||
|
return (object) 0;
|
||||||
|
|
||||||
#if __EFUN_DEFINED__(tls_want_peer_certificate)
|
#if __EFUN_DEFINED__(tls_want_peer_certificate)
|
||||||
// Specify that a subsequent call to tls_init_connection
|
// Specify that a subsequent call to tls_init_connection
|
||||||
// should request a peer certificate.
|
// should request a peer certificate.
|
||||||
|
@ -98,25 +105,81 @@ object connect(int uid, int port, string service) {
|
||||||
# define TLS_INIT_GET_CERT TLS_INIT
|
# define TLS_INIT_GET_CERT TLS_INIT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if AUTODETECT
|
// in the first switch we handle ports that MUST not support
|
||||||
# define TLS_INIT_AUTODETECT TLS_INIT
|
// immediate TLS (currently that's just 5269) or that want a
|
||||||
#else
|
// peer certificate from the other side (PSYC). for all other
|
||||||
# define TLS_INIT_AUTODETECT // do nothing
|
// ports the default is to attempt a TLS autodetection.
|
||||||
#endif
|
|
||||||
|
|
||||||
// we dont want the telnet machine most of the time
|
|
||||||
// but disabling and re-enabling it for telnet doesn't work
|
|
||||||
switch(port) {
|
switch(port) {
|
||||||
#if HAS_PORT(PSYC_PORT, PSYC_PATH) && AUTODETECT
|
#if HAS_PORT(JABBER_S2S_PORT, JABBER_PATH)
|
||||||
case PSYC_PORT:
|
case JABBER_S2S_PORT:
|
||||||
// make TLS available even on the default psyc port using the autodetection feature
|
# ifdef DRIVER_HAS_CALL_BY_REFERENCE
|
||||||
|
arg = ME;
|
||||||
|
query_ip_number(&arg);
|
||||||
|
// this assumes network byte order provided by driver
|
||||||
|
peerport = pointerp(arg) ? (arg[2]*256 + arg[3]) : 0;
|
||||||
|
if (peerport < 0) peerport = 65536 + peerport;
|
||||||
|
if (peerport == JABBER_S2S_SERVICE) peerport = 0;
|
||||||
|
# else
|
||||||
|
// as long as the object names don't collide, this is okay too
|
||||||
|
peerport = 65536 + random(9999999);
|
||||||
|
# endif
|
||||||
|
# if __EFUN_DEFINED__(enable_telnet)
|
||||||
|
enable_telnet(0);
|
||||||
|
# endif
|
||||||
|
t = "S:xmpp:"+query_ip_number();
|
||||||
|
// it's just an object name, but let's be consequent minus peerport
|
||||||
|
if (peerport) t += ":-"+peerport;
|
||||||
|
# ifdef _flag_log_sockets_XMPP
|
||||||
|
SIMUL_EFUN_FILE -> log_file("RAW_XMPP", "\n\n%O: %O -> load(%O, %O)",
|
||||||
|
ME, t,
|
||||||
|
# ifdef _flag_log_hosts
|
||||||
|
query_ip_number(),
|
||||||
|
# else
|
||||||
|
"?",
|
||||||
|
# endif
|
||||||
|
-peerport);
|
||||||
|
# endif
|
||||||
|
P3(("%O -> load(%O, %O)\n", t, query_ip_number(), -peerport))
|
||||||
|
return t -> load(query_ip_number(), -peerport);
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(PSYCS_PORT, PSYC_PATH)
|
#if HAS_PORT(PSYCS_PORT, PSYC_PATH)
|
||||||
case PSYCS_PORT: // inofficial & temporary
|
case PSYCS_PORT: // inofficial & temporary
|
||||||
#endif
|
|
||||||
TLS_INIT_GET_CERT
|
TLS_INIT_GET_CERT
|
||||||
// fall thru
|
break;
|
||||||
#if HAS_PORT(PSYC_PORT, PSYC_PATH) &&! AUTODETECT
|
#endif
|
||||||
|
#if HAS_PORT(PSYC_PORT, PSYC_PATH) && AUTODETECT
|
||||||
|
case PSYC_PORT:
|
||||||
|
// make TLS available on the default PSYC port
|
||||||
|
// using the autodetection feature (official approach)
|
||||||
|
TLS_INIT_GET_CERT
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(SPYCS_PORT, SPYC_PATH)
|
||||||
|
case SPYCS_PORT: // even more inofficial
|
||||||
|
TLS_INIT_GET_CERT
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(SPYC_PORT, SPYC_PATH) && AUTODETECT
|
||||||
|
case SPYC_PORT: // even more inofficial
|
||||||
|
TLS_INIT_GET_CERT
|
||||||
|
break;
|
||||||
|
#endif
|
||||||
|
default:
|
||||||
|
#if AUTODETECT
|
||||||
|
// if autodetect is available, let's check if this connection
|
||||||
|
// has TLS enabled and activate it, no matter which protocol.
|
||||||
|
TLS_INIT
|
||||||
|
#endif
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
// if we got here, we may have initialized TLS successfully
|
||||||
|
switch(port) {
|
||||||
|
#if HAS_PORT(PSYCS_PORT, PSYC_PATH)
|
||||||
|
case PSYCS_PORT: // inofficial & temporary
|
||||||
|
TLS_ENFORCE
|
||||||
|
#endif
|
||||||
|
#if HAS_PORT(PSYC_PORT, PSYC_PATH)
|
||||||
case PSYC_PORT:
|
case PSYC_PORT:
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(PSYC_PORT, PSYC_PATH) || HAS_PORT(PSYCS_PORT, PSYC_PATH)
|
#if HAS_PORT(PSYC_PORT, PSYC_PATH) || HAS_PORT(PSYCS_PORT, PSYC_PATH)
|
||||||
|
@ -145,13 +208,10 @@ object connect(int uid, int port, string service) {
|
||||||
return t -> load(query_ip_number(), -peerport);
|
return t -> load(query_ip_number(), -peerport);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// dedicated SPYC port.. should not be used, we have AUTODETECT
|
// dedicated SPYC port.. should not be used
|
||||||
#if HAS_PORT(SPYCS_PORT, SPYC_PATH)
|
#if HAS_PORT(SPYCS_PORT, SPYC_PATH)
|
||||||
case SPYCS_PORT: // interim name for PSYC 1.0 according to SPEC
|
case SPYCS_PORT: // interim name for PSYC 1.0 according to SPEC
|
||||||
# if __EFUN_DEFINED__(tls_want_peer_certificate)
|
TLS_ENFORCE
|
||||||
tls_want_peer_certificate(ME);
|
|
||||||
# endif
|
|
||||||
TLS_INIT
|
|
||||||
#endif // fall thru
|
#endif // fall thru
|
||||||
#if HAS_PORT(SPYC_PORT, SPYC_PATH)
|
#if HAS_PORT(SPYC_PORT, SPYC_PATH)
|
||||||
case SPYC_PORT:
|
case SPYC_PORT:
|
||||||
|
@ -186,7 +246,7 @@ object connect(int uid, int port, string service) {
|
||||||
|
|
||||||
#if HAS_PORT(POP3S_PORT, POP3_PATH)
|
#if HAS_PORT(POP3S_PORT, POP3_PATH)
|
||||||
case POP3S_PORT:
|
case POP3S_PORT:
|
||||||
TLS_INIT
|
TLS_ENFORCE
|
||||||
return clone_object(POP3_PATH "server");
|
return clone_object(POP3_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(POP3_PORT, POP3_PATH)
|
#if HAS_PORT(POP3_PORT, POP3_PATH)
|
||||||
|
@ -196,7 +256,7 @@ object connect(int uid, int port, string service) {
|
||||||
|
|
||||||
#if HAS_PORT(SMTPS_PORT, NNTP_PATH)
|
#if HAS_PORT(SMTPS_PORT, NNTP_PATH)
|
||||||
case SMTPS_PORT:
|
case SMTPS_PORT:
|
||||||
TLS_INIT
|
TLS_ENFORCE
|
||||||
return clone_object(SMTP_PATH "server");
|
return clone_object(SMTP_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(SMTP_PORT, SMTP_PATH)
|
#if HAS_PORT(SMTP_PORT, SMTP_PATH)
|
||||||
|
@ -212,7 +272,7 @@ object connect(int uid, int port, string service) {
|
||||||
|
|
||||||
#if HAS_PORT(NNTPS_PORT, NNTP_PATH)
|
#if HAS_PORT(NNTPS_PORT, NNTP_PATH)
|
||||||
case NNTPS_PORT:
|
case NNTPS_PORT:
|
||||||
TLS_INIT
|
TLS_ENFORCE
|
||||||
return clone_object(NNTP_PATH "server");
|
return clone_object(NNTP_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(NNTP_PORT, NNTP_PATH)
|
#if HAS_PORT(NNTP_PORT, NNTP_PATH)
|
||||||
|
@ -222,50 +282,19 @@ object connect(int uid, int port, string service) {
|
||||||
|
|
||||||
#if HAS_PORT(JABBERS_PORT, JABBER_PATH)
|
#if HAS_PORT(JABBERS_PORT, JABBER_PATH)
|
||||||
case JABBERS_PORT:
|
case JABBERS_PORT:
|
||||||
TLS_INIT
|
TLS_ENFORCE
|
||||||
return clone_object(JABBER_PATH "server");
|
return clone_object(JABBER_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(JABBER_PORT, JABBER_PATH)
|
#if HAS_PORT(JABBER_PORT, JABBER_PATH)
|
||||||
case JABBER_PORT:
|
case JABBER_PORT:
|
||||||
# if __EFUN_DEFINED__(enable_telnet)
|
# if __EFUN_DEFINED__(enable_telnet)
|
||||||
|
// we dont want the telnet machine most of the time
|
||||||
|
// but disabling and re-enabling it for telnet doesn't work
|
||||||
enable_telnet(0); // are you sure!???
|
enable_telnet(0); // are you sure!???
|
||||||
# endif
|
# endif
|
||||||
return clone_object(JABBER_PATH "server");
|
return clone_object(JABBER_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_PORT(JABBER_S2S_PORT, JABBER_PATH)
|
|
||||||
case JABBER_S2S_PORT:
|
|
||||||
# ifdef DRIVER_HAS_CALL_BY_REFERENCE
|
|
||||||
arg = ME;
|
|
||||||
query_ip_number(&arg);
|
|
||||||
// this assumes network byte order provided by driver
|
|
||||||
peerport = pointerp(arg) ? (arg[2]*256 + arg[3]) : 0;
|
|
||||||
if (peerport < 0) peerport = 65536 + peerport;
|
|
||||||
if (peerport == JABBER_S2S_SERVICE) peerport = 0;
|
|
||||||
# else
|
|
||||||
// as long as the object names don't collide, this is okay too
|
|
||||||
peerport = 65536 + random(9999999);
|
|
||||||
# endif
|
|
||||||
# if __EFUN_DEFINED__(enable_telnet)
|
|
||||||
enable_telnet(0);
|
|
||||||
# endif
|
|
||||||
t = "S:xmpp:"+query_ip_number();
|
|
||||||
// it's just an object name, but let's be consequent minus peerport
|
|
||||||
if (peerport) t += ":-"+peerport;
|
|
||||||
# ifdef _flag_log_sockets_XMPP
|
|
||||||
SIMUL_EFUN_FILE -> log_file("RAW_XMPP", "\n\n%O: %O -> load(%O, %O)",
|
|
||||||
ME, t,
|
|
||||||
# ifdef _flag_log_hosts
|
|
||||||
query_ip_number(),
|
|
||||||
# else
|
|
||||||
"?",
|
|
||||||
# endif
|
|
||||||
-peerport);
|
|
||||||
# endif
|
|
||||||
P3(("%O -> load(%O, %O)\n", t, query_ip_number(), -peerport))
|
|
||||||
return t -> load(query_ip_number(), -peerport);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#if 0 //__EFUN_DEFINED__(enable_binary)
|
#if 0 //__EFUN_DEFINED__(enable_binary)
|
||||||
// work in progress
|
// work in progress
|
||||||
case 8888:
|
case 8888:
|
||||||
|
@ -280,12 +309,11 @@ object connect(int uid, int port, string service) {
|
||||||
|
|
||||||
#if HAS_PORT(IRCS_PORT, IRC_PATH)
|
#if HAS_PORT(IRCS_PORT, IRC_PATH)
|
||||||
case IRCS_PORT:
|
case IRCS_PORT:
|
||||||
TLS_INIT
|
TLS_ENFORCE
|
||||||
return clone_object(IRC_PATH "server");
|
return clone_object(IRC_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(IRC_PORT, IRC_PATH)
|
#if HAS_PORT(IRC_PORT, IRC_PATH)
|
||||||
case IRC_PORT:
|
case IRC_PORT:
|
||||||
TLS_INIT_AUTODETECT
|
|
||||||
return clone_object(IRC_PATH "server");
|
return clone_object(IRC_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -299,14 +327,13 @@ object connect(int uid, int port, string service) {
|
||||||
|
|
||||||
#if HAS_PORT(TELNETS_PORT, TELNET_PATH)
|
#if HAS_PORT(TELNETS_PORT, TELNET_PATH)
|
||||||
case TELNETS_PORT:
|
case TELNETS_PORT:
|
||||||
TLS_INIT
|
TLS_ENFORCE
|
||||||
// we could do the UID2NICK thing here, too, but why should we?
|
// we could do the UID2NICK thing here, too, but why should we?
|
||||||
// what do you need tls for on a localhost tcp link?
|
// what do you need tls for on a localhost tcp link?
|
||||||
return clone_object(TELNET_PATH "server");
|
return clone_object(TELNET_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(TELNET_PORT, TELNET_PATH)
|
#if HAS_PORT(TELNET_PORT, TELNET_PATH)
|
||||||
case TELNET_PORT:
|
case TELNET_PORT:
|
||||||
TLS_INIT_AUTODETECT
|
|
||||||
t = clone_object(TELNET_PATH "server");
|
t = clone_object(TELNET_PATH "server");
|
||||||
# ifdef UID2NICK
|
# ifdef UID2NICK
|
||||||
if (uid && (arg = UID2NICK(uid))) { t -> sName(arg); }
|
if (uid && (arg = UID2NICK(uid))) { t -> sName(arg); }
|
||||||
|
@ -316,42 +343,29 @@ object connect(int uid, int port, string service) {
|
||||||
|
|
||||||
#if HAS_PORT(HTTPS_PORT, HTTP_PATH)
|
#if HAS_PORT(HTTPS_PORT, HTTP_PATH)
|
||||||
case HTTPS_PORT:
|
case HTTPS_PORT:
|
||||||
t = tls_init_connection(this_object());
|
TLS_ENFORCE
|
||||||
if (t < 0) {
|
|
||||||
D1( if (t != ERR_TLS_NOT_DETECTED) PP(( "TLS(%O) on %O: %O\n",
|
|
||||||
t, port, tls_error(t) )); )
|
|
||||||
#if !HAS_PORT(HTTP_PORT, HTTP_PATH)
|
|
||||||
// if we have no http port, it may be intentional
|
|
||||||
return (object)0;
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
D2( else if (t > 0) PP(( "Setting up TLS connection in the background.\n" )); )
|
|
||||||
D2( else PP(( "Oh yeah, I'm initializing an https session!\n" )); )
|
|
||||||
return clone_object(HTTP_PATH "server");
|
return clone_object(HTTP_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
/* don't fall thru. allow for https: to be available without http: */
|
// don't fall thru. allow for https: to be available without http:
|
||||||
#if HAS_PORT(HTTP_PORT, HTTP_PATH) &&! AUTODETECT
|
#if HAS_PORT(HTTP_PORT, HTTP_PATH)
|
||||||
case HTTP_PORT:
|
case HTTP_PORT:
|
||||||
TLS_INIT_AUTODETECT
|
|
||||||
return clone_object(HTTP_PATH "server");
|
return clone_object(HTTP_PATH "server");
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#if HAS_PORT(MUDS_PORT, MUD_PATH)
|
#if HAS_PORT(MUDS_PORT, MUD_PATH)
|
||||||
case MUDS_PORT:
|
case MUDS_PORT:
|
||||||
TLS_INIT
|
TLS_ENFORCE
|
||||||
return clone_object(MUD_PATH "login");
|
return clone_object(MUD_PATH "login");
|
||||||
#endif
|
#endif
|
||||||
#if HAS_PORT(MUD_PORT, MUD_PATH)
|
#if HAS_PORT(MUD_PORT, MUD_PATH)
|
||||||
default:
|
default:
|
||||||
// if you want to multiplex psyced with an LPMUD game
|
// if you want to multiplex psyced with an LPMUD game
|
||||||
TLS_INIT_AUTODETECT
|
|
||||||
// set_prompt("> ");
|
// set_prompt("> ");
|
||||||
return clone_object(MUD_PATH "login");
|
return clone_object(MUD_PATH "login");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
PP(("Received connection on port %O which isn't configured.\n",
|
P0(("Received connection on port %O which isn't configured.\n", port));
|
||||||
port));
|
|
||||||
return (object)0;
|
return (object)0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue