Annotation of libwww/Library/src/HTTelnet.c, revision 1.1.1.1
1.1 timbl 1: /* Telnet Acees, Roligin, etc HTAccess.c
2: ** ==========================
3: **
4: ** Authors
5: ** TBL Tim Berners-Lee timbl@info.cern.ch
6: ** JFG Jean-Francois Groff jgh@next.com
7: ** DD Denis DeLaRoca (310) 825-4580 <CSP1DWD@mvs.oac.ucla.edu>
8: ** History
9: ** 8 Jun 92 Telnet hopping prohibited as telnet is not secure (TBL)
10: ** 26 Jun 92 When over DECnet, suppressed FTP, Gopher and News. (JFG)
11: ** 6 Oct 92 Moved HTClientHost and logfile into here. (TBL)
12: ** 17 Dec 92 Tn3270 added, bug fix. (DD)
13: ** 2 Feb 93 Split from HTAccess.c. Registration.(TBL)
14: */
15:
16: /* Implements:
17: */
18: #include HTTelnet.h
19:
20: #include "HTParse.h"
21: #include "HTUtils.h"
22: #include "WWW.h"
23: #include "HTAnchor.h"
24: #include "HTTP.h"
25: #include "HTFile.h"
26: #include <errno.h>
27: #include <stdio.h>
28:
29: #include "tcp.h"
30: #include "HText.h"
31:
32: #include "HTAccess.h"
33:
34: #define HT_NO_DATA -9999
35:
36:
37: /* Telnet or "rlogin" access
38: ** -------------------------
39: */
40: PRIVATE int remote_session ARGS2(char *, access, char *, host)
41: {
42: char * user = host;
43: char * hostname = strchr(host, '@');
44: char * port = strchr(host, ':');
45: char command[256];
46: enum _login_protocol { telnet, rlogin, tn3270 } login_protocol =
47: strcmp(access, "rlogin") == 0 ? rlogin :
48: strcmp(access, "tn3270") == 0 ? tn3270 : telnet;
49:
50: if (hostname) {
51: *hostname++ = 0; /* Split */
52: } else {
53: hostname = host;
54: user = 0; /* No user specified */
55: }
56: if (port) *port++ = 0; /* Split */
57:
58:
59: /* If the person is already telnetting etc, forbid hopping */
60: /* This is a security precaution, for us and remote site */
61:
62: if (HTClientHost) {
63:
64: #ifdef TELNETHOPPER_MAIL
65: sprintf(command,
66: "finger @%s | mail -s \"**telnethopper %s\" tbl@dxcern.cern.ch",
67: HTClientHost, HTClientHost);
68: system(command);
69: #endif
70: printf("\n\nSorry, but the service you have selected is one\n");
71: printf("to which you have to log in. If you were running www\n");
72: printf("on your own computer, you would be automatically connected.\n");
73: printf("For security reasons, this is not allowed when\n");
74: printf("you log in to this information service remotely.\n\n");
75:
76: printf("You can manually connect to this service using %s\n",
77: access);
78: printf("to host %s", hostname);
79: if (user) printf(", user name %s", user);
80: if (port) printf(", port %s", port);
81: printf(".\n\n");
82: return HT_NO_DATA;
83: }
84:
85: /* Not all telnet servers get it even if user name is specified
86: ** so we always tell the guy what to log in as
87: */
88: if (user) printf("When you are connected, log in as %s\n", user);
89:
90: #ifdef NeXT
91: #define TELNET_MINUS_L
92: #endif
93: #ifdef ultrix
94: #define TELNET_MINUS_L
95: #endif
96:
97: #ifdef TELNET_MINUS_L
98: #endif
99: sprintf(command, "%s%s%s %s %s", access,
100: user ? " -l " : "",
101: user ? user : "",
102: hostname,
103: port ? port : "");
104:
105: if (TRACE) fprintf(stderr, "HTaccess: Command is: %s\n", command);
106: system(command);
107: return HT_NO_DATA; /* Ok - it was done but no data */
108: #define TELNET_DONE
109:
110: /* Most unix machines suppport username only with rlogin */
111: #ifdef unix
112: #ifndef TELNET_DONE
113: if (login_protocol != rlogin) {
114: sprintf(command, "%s %s %s", access,
115: hostname,
116: port ? port : "");
117: } else {
118: sprintf(command, "%s%s%s %s %s", access,
119: user ? " -l " : "",
120: user ? user : "",
121: hostname,
122: port ? port : "");
123: }
124: if (TRACE) fprintf(stderr, "HTaccess: Command is: %s\n", command);
125: system(command);
126: return HT_NO_DATA; /* Ok - it was done but no data */
127: #define TELNET_DONE
128: #endif
129: #endif
130:
131: #ifdef MULTINET /* VMS varieties */
132: if (login_protocol == telnet) {
133: sprintf(command, "TELNET %s%s %s",
134: port ? "/PORT=" : "",
135: port ? port : "",
136: hostname);
137: } else if (login_protocol == tn3270) {
138: sprintf(command, "TN3270 %s%s %s",
139: port ? "/PORT=" : "",
140: port ? port : "",
141: hostname);
142: } else {
143: sprintf(command, "RLOGIN%s%s%s%s %s", access,
144: user ? "/USERNAME=" : "",
145: user ? user : "",
146: port ? "/PORT=" : "",
147: port ? port : "",
148: hostname);
149: }
150: if (TRACE) fprintf(stderr, "HTaccess: Command is: %s\n", command);
151: system(command);
152: return HT_NO_DATA; /* Ok - it was done but no data */
153: #define TELNET_DONE
154: #endif
155:
156: #ifdef UCX
157: #define SIMPLE_TELNET
158: #endif
159: #ifdef VM
160: #define SIMPLE_TELNET
161: #endif
162: #ifdef SIMPLE_TELNET
163: if (login_protocol == telnet) { /* telnet only */
164: sprintf(command, "TELNET %s", /* @@ Bug: port ignored */
165: hostname);
166: if (TRACE) fprintf(stderr, "HTaccess: Command is: %s\n", command);
167: system(command);
168: return HT_NO_DATA; /* Ok - it was done but no data */
169: }
170: #endif
171:
172: #ifndef TELNET_DONE
173: fprintf(stderr,
174: "Sorry, this browser was compiled without the %s access option.\n",
175: access);
176: fprintf(stderr,
177: "\nTo access the information you must %s to %s", access, hostname);
178: if (port) fprintf(stderr," (port %s)", port);
179: if (user) fprintf(stderr," logging in with username %s", user);
180: fprintf(stderr, ".\n");
181: return -1;
182: #endif
183: }
184:
185: /* "Load a document" -- establishes a session
186: ** ------------------------------------------
187: **
188: ** On entry,
189: ** addr must point to the fully qualified hypertext reference.
190: **
191: ** On exit,
192: ** returns <0 Error has occured.
193: ** >=0 Value of file descriptor or socket to be used
194: ** to read data.
195: ** *pFormat Set to the format of the file, if known.
196: ** (See WWW.h)
197: **
198: */
199: PRIVATE int HTLoadTelnet
200: ARGS3
201: (
202: CONST char *, addr,
203: HTParentAnchor *, anchor,
204: int, diagnostic
205: )
206: {
207: char * access = HTParse(addr, "file:", PARSE_ACCESS);
208:
209: char * host = HTParse(addr, "", PARSE_HOST);
210: int status = remote_session(access, host);
211:
212: free(host);
213: free(access);
214: return status;
215: }
216:
217:
218: PUBLIC HTAccessMethod HTTelnet = { "telnet", HTLoadTelnet, NULL };
219: PUBLIC HTAccessMethod HTRlogin = { "rlogin", HTLoadTelnet, NULL };
220: PUBLIC HTAccessMethod HTTn3270 = { "tn3270", HTLoadTelnet, NULL };
221:
222:
Webmaster