diff options
author | Thomas E. Dickey <dickey@invisible-island.net> | 2001-01-02 01:53:43 -0500 |
---|---|---|
committer | Thomas E. Dickey <dickey@invisible-island.net> | 2001-01-02 01:53:43 -0500 |
commit | d31fb3c41be5d6e079d415087eda3c03cc34bcdb (patch) | |
tree | 76faa032cec14cb8e3500f25c1074eacc56c1c7e /WWW/Library/Implementation/HTNews.c | |
parent | 244b955fa0312faea2e138d55330bd9a81fd92de (diff) | |
download | lynx-snapshots-d31fb3c41be5d6e079d415087eda3c03cc34bcdb.tar.gz |
snapshot of project "lynx", label v2-8-4dev_16
Diffstat (limited to 'WWW/Library/Implementation/HTNews.c')
-rw-r--r-- | WWW/Library/Implementation/HTNews.c | 167 |
1 files changed, 167 insertions, 0 deletions
diff --git a/WWW/Library/Implementation/HTNews.c b/WWW/Library/Implementation/HTNews.c index ded9af8c..b404733b 100644 --- a/WWW/Library/Implementation/HTNews.c +++ b/WWW/Library/Implementation/HTNews.c @@ -34,9 +34,21 @@ PUBLIC int HTNewsMaxChunk = 40; /* Largest number of articles in one window */ #define SERVER_FILE "/usr/local/lib/rn/server" #endif /* SERVER_FILE */ +#ifdef USE_SSL +extern SSL_CTX * ssl_ctx; +PRIVATE SSL * Handle = NULL; +PRIVATE int channel_s = 1; +#define NEWS_NETWRITE(sock, buff, size) \ + (Handle ? SSL_write(Handle, buff, size) : NETWRITE(sock, buff, size)) +#define NEWS_NETCLOSE(sock) \ + { (void)NETCLOSE(sock); if (Handle) SSL_free(Handle); Handle = NULL; } +PRIVATE char HTNewsGetCharacter NOPARAMS; +#define NEXT_CHAR HTNewsGetCharacter() +#else #define NEWS_NETWRITE NETWRITE #define NEWS_NETCLOSE NETCLOSE #define NEXT_CHAR HTGetCharacter() +#endif /* USE_SSL */ #include <HTML.h> #include <HTParse.h> @@ -2147,6 +2159,9 @@ PRIVATE int HTLoadNews ARGS4( char *ProxyHost = NULL; char *ProxyHREF = NULL; char *postfile = NULL; +#ifdef USE_SSL + char SSLprogress[256]; +#endif /* USE_SSL */ diagnostic = (format_out == WWW_SOURCE || /* set global flag */ format_out == HTAtom_for("www/download") || @@ -2195,11 +2210,13 @@ PRIVATE int HTLoadNews ARGS4( group_wanted) && strchr(arg, '@') == NULL) && (strchr(arg, '*') != NULL)); +#ifndef USE_SSL if (!strncasecomp(arg, "snewspost:", 10) || !strncasecomp(arg, "snewsreply:", 11)) { HTAlert(FAILED_CANNOT_POST_SSL); return HT_NOT_LOADED; } +#endif /* !USE_SSL */ if (post_wanted || reply_wanted || spost_wanted || sreply_wanted) { /* ** Make sure we have a non-zero path for the newsgroup(s). - FM @@ -2287,8 +2304,43 @@ PRIVATE int HTLoadNews ARGS4( StrAllocCopy(NewsHREF, command); } else if (!strncasecomp(arg, "snews:", 6)) { +#ifdef USE_SSL + if (((*(arg + 6) == '\0') || + (!strcmp((arg + 6), "/") || + !strcmp((arg + 6), "//") || + !strcmp((arg + 6), "///"))) || + ((!strncmp((arg + 6), "//", 2)) && + (!(cp = strchr((arg + 8), '/')) || *(cp + 1) == '\0'))) { + p1 = "*"; + group_wanted = FALSE; + list_wanted = TRUE; + } else if (*(arg + 6) != '/') { + p1 = (arg + 6); + } else if (*(arg + 6) == '/' && *(arg + 7) != '/') { + p1 = (arg + 7); + } else { + p1 = (cp + 1); + } + if (!(cp = HTParse(arg, "", PARSE_HOST)) || *cp == '\0') { + if (s >= 0 && NewsHost && strcasecomp(NewsHost, HTNewsHost)) { + NEWS_NETCLOSE(s); + s = -1; + } + StrAllocCopy(NewsHost, HTNewsHost); + } else { + if (s >= 0 && NewsHost && strcasecomp(NewsHost, cp)) { + NEWS_NETCLOSE(s); + s = -1; + } + StrAllocCopy(NewsHost, cp); + } + FREE(cp); + sprintf(command, "snews://%.250s/", NewsHost); + StrAllocCopy(NewsHREF, command); +#else HTAlert(gettext("This client does not contain support for SNEWS URLs.")); return HT_NOT_LOADED; +#endif /* USE_SSL */ } else if (!strncasecomp (arg, "news:/", 6)) { if (((*(arg + 6) == '\0') || @@ -2526,7 +2578,18 @@ PRIVATE int HTLoadNews ARGS4( _HTProgress(gettext("Connecting to NewsHost ...")); +#ifdef USE_SSL + if (!using_proxy && + (!strncmp(arg, "snews:", 6) || + !strncmp(arg, "snewspost:", 10) || + !strncmp(arg, "snewsreply:", 11))) + status = HTDoConnect (url, "NNTPS", SNEWS_PORT, &s); + else + status = HTDoConnect (url, "NNTP", NEWS_PORT, &s); +#else status = HTDoConnect (url, "NNTP", NEWS_PORT, &s); +#endif /* USE_SSL */ + if (status == HT_INTERRUPTED) { /* ** Interrupt cleanly. @@ -2542,6 +2605,12 @@ PRIVATE int HTLoadNews ARGS4( FREE(ProxyHost); FREE(ProxyHREF); FREE(ListArg); +#ifdef USE_SSL + if (Handle) { + SSL_free(Handle); + Handle = NULL; + } +#endif /* USE_SSL */ if (postfile) { HTSYS_remove(postfile); FREE(postfile); @@ -2572,6 +2641,54 @@ PRIVATE int HTLoadNews ARGS4( } else { CTRACE((tfp, "HTNews: Connected to news host %s.\n", NewsHost)); +#ifdef USE_SSL + /* + ** If this is an snews url, + ** then do the SSL stuff here + */ + if (!using_proxy && + (!strncmp(url, "snews", 5) || + !strncmp(url, "snewspost:", 10) || + !strncmp(url, "snewsreply:", 11))) { + Handle = HTGetSSLHandle(); + SSL_set_fd(Handle, s); + HTSSLInitPRNG(); + status = SSL_connect(Handle); + + if (status <= 0) { + unsigned long SSLerror; + CTRACE((tfp,"HTNews: Unable to complete SSL handshake for '%s', SSL_connect=%d, SSL error stack dump follows\n",url, status)); + SSL_load_error_strings(); + while((SSLerror = ERR_get_error()) != 0) { + CTRACE((tfp,"HTNews: SSL: %s\n",ERR_error_string(SSLerror,NULL))); + } + HTAlert( + "Unable to make secure connection to remote host."); + NEWS_NETCLOSE(s); + s = -1; + if (!(post_wanted || reply_wanted || + spost_wanted || sreply_wanted)) + (*targetClass._abort)(target, NULL); + FREE(NewsHost); + FREE(NewsHREF); + FREE(ProxyHost); + FREE(ProxyHREF); + FREE(ListArg); + if (postfile) { +#ifdef VMS + while (remove(postfile) == 0) + ; /* loop through all versions */ +#else + remove(postfile); +#endif /* VMS */ + FREE(postfile); + } + return HT_NOT_LOADED; + } + sprintf(SSLprogress,"Secure %d-bit %s (%s) NNTP connection",SSL_get_cipher_bits(Handle,NULL),SSL_get_cipher_version(Handle),SSL_get_cipher(Handle)); + _HTProgress(SSLprogress); + } +#endif /* USE_SSL */ HTInitInput(s); /* set up buffering */ if (proxycmd[0]) { status = NEWS_NETWRITE(s, proxycmd, strlen(proxycmd)); @@ -2922,6 +3039,56 @@ PUBLIC void HTClearNNTPAuthInfo NOARGS free_NNTP_AuthInfo(); } +#ifdef USE_SSL +PRIVATE char HTNewsGetCharacter NOARGS +{ + if (!Handle) + return HTGetCharacter(); + else + return HTGetSSLCharacter((void *)Handle); +} + +PUBLIC int HTNewsProxyConnect ARGS5 ( + int, sock, + CONST char *, url, + HTParentAnchor *, anAnchor, + HTFormat, format_out, + HTStream *, sink) +{ + int status; + CONST char * arg = url; + char SSLprogress[256]; + + s = channel_s = sock; + Handle = HTGetSSLHandle(); + SSL_set_fd(Handle, s); + HTSSLInitPRNG(); + status = SSL_connect(Handle); + + if (status <= 0) { + unsigned long SSLerror; + channel_s = -1; + CTRACE((tfp,"HTNews: Unable to complete SSL handshake for '%s', SSL_connect=%d, SSL error stack dump follows\n",url, status)); + SSL_load_error_strings(); + while((SSLerror = ERR_get_error()) != 0) { + CTRACE((tfp,"HTNews: SSL: %s\n",ERR_error_string(SSLerror,NULL))); + } + HTAlert("Unable to make secure connection to remote host."); + NEWS_NETCLOSE(s); + s = -1; + return HT_NOT_LOADED; + } + sprintf(SSLprogress,"Secure %d-bit %s (%s) NNTP connection", + SSL_get_cipher_bits(Handle,NULL), + SSL_get_cipher_version(Handle), + SSL_get_cipher(Handle)); + _HTProgress(SSLprogress); + status = HTLoadNews(arg, anAnchor, format_out, sink); + channel_s = -1; + return status; +} +#endif /* USE_SSL */ + #ifdef GLOBALDEF_IS_MACRO #define _HTNEWS_C_1_INIT { "news", HTLoadNews, NULL } GLOBALDEF (HTProtocol,HTNews,_HTNEWS_C_1_INIT); |