/* -*- Mode: C; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 2 -*- * * The contents of this file are subject to the Netscape Public License * Version 1.0 (the "NPL"); you may not use this file except in * compliance with the NPL. You may obtain a copy of the NPL at * http://www.mozilla.org/NPL/ * * Software distributed under the NPL is distributed on an "AS IS" basis, * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the NPL * for the specific language governing rights and limitations under the * NPL. * * The Initial Developer of this code under the NPL is Netscape * Communications Corporation. Portions created by Netscape are * Copyright (C) 1998 Netscape Communications Corporation. All Rights * Reserved. */ /* forks a telnet process * * Designed and implemented by Lou Montulli */ /* Please leave outside of ifdef for windows precompiled headers */ #include "xp.h" #include "plstr.h" #include "prmem.h" #include "netutils.h" #include "mkselect.h" #include "mktcp.h" #include "mkgeturl.h" #ifdef MOZILLA_CLIENT #include "mkparse.h" #include "remoturl.h" #include "glhist.h" #include "mkgeturl.h" /* for URL types */ #include "merrors.h" /* * begin a session with a remote host. * * URL types permitted: Telnet, TN3270, and Rlogin */ MODULE_PRIVATE int32 NET_RemoteHostLoad (ActiveEntry * cur_entry) { char * host_string; int url_type; char * cp; char * username; char * hostname; char * port_string; TRACEMSG(("In NET_RemoteHostLoad")); GH_UpdateGlobalHistory(cur_entry->URL_s); if(cur_entry->format_out == FO_CACHE_AND_PRESENT || cur_entry->format_out == FO_PRESENT) { url_type = NET_URL_Type(cur_entry->URL_s->address); host_string = NET_ParseURL(cur_entry->URL_s->address, GET_USERNAME_PART | GET_PASSWORD_PART | GET_HOST_PART); hostname = PL_strchr(host_string, '@'); port_string = PL_strchr(host_string, ':'); if (hostname) { *hostname++ = '\0'; username = NET_UnEscape(host_string); } else { hostname = host_string; username = NULL; /* no username given */ } if (port_string) { *port_string++ = '\0'; /* Sanity check the port part * prevent telnet://hostname:30;rm -rf * URL's (VERY BAD) * only allow digits */ for(cp=port_string; *cp != '\0'; cp++) if(!isdigit(*cp)) { *cp = '\0'; break; } } if(username) { /* Sanity check the username part * prevent telnet://hostname:30;rm -rf * URL's (VERY BAD) * only allow alphanums */ for(cp=username; *cp != '\0'; cp++) if(!isalnum(*cp)) { *cp = '\0'; break; } } /* now sanity check the hostname part * prevent telnet://hostname;rm -rf * URL's (VERY BAD) * only allow alphanumeric characters and a few symbols */ for(cp=hostname; *cp != '\0'; cp++) if(!isalnum(*cp) && *cp != '_' && *cp != '-' && *cp != '+' && *cp != ':' && *cp != '.' && *cp != '@') { *cp = '\0'; break; } TRACEMSG(("username: %s, hostname: %s, port: %s", username ? username : "(null)", hostname ? hostname : "(null)", port_string ? port_string : "(null)")); if(url_type == TELNET_TYPE_URL) { FE_ConnectToRemoteHost(cur_entry->window_id, FE_TELNET_URL_TYPE, hostname, port_string, username); } else if(url_type == TN3270_TYPE_URL) { FE_ConnectToRemoteHost(cur_entry->window_id, FE_TN3270_URL_TYPE, hostname, port_string, username); } else if(url_type == RLOGIN_TYPE_URL) { FE_ConnectToRemoteHost(cur_entry->window_id, FE_RLOGIN_URL_TYPE, hostname, port_string, username); } /* fall through if it wasn't any of the above url types */ PR_Free(host_string); } cur_entry->status = MK_NO_DATA; return -1; } PRIVATE int32 net_ProcessRemote(ActiveEntry *ce) { PR_ASSERT(0); return -1; } PRIVATE int32 net_InterruptRemote(ActiveEntry *ce) { PR_ASSERT(0); return -1; } PRIVATE void net_CleanupRemote(void) { } MODULE_PRIVATE void NET_InitRemoteProtocol(void) { static NET_ProtoImpl remote_proto_impl; remote_proto_impl.init = NET_RemoteHostLoad; remote_proto_impl.process = net_ProcessRemote; remote_proto_impl.interrupt = net_InterruptRemote; remote_proto_impl.cleanup = net_CleanupRemote; NET_RegisterProtocolImplementation(&remote_proto_impl, RLOGIN_TYPE_URL); NET_RegisterProtocolImplementation(&remote_proto_impl, TELNET_TYPE_URL); NET_RegisterProtocolImplementation(&remote_proto_impl, TN3270_TYPE_URL); } #endif /* MOZILLA_CLIENT */