|  | diff -cr ../TIS.orig/fwtk/Makefile.config.linux fwtk/Makefile.config.linux | 
|  | *** ../TIS.orig/fwtk/Makefile.config.linux	Sat Sep  7 05:58:21 1996 | 
|  | --- fwtk/Makefile.config.linux	Sun Feb  2 05:48:01 1997 | 
|  | *************** | 
|  | *** 13,19 **** | 
|  |  | 
|  |  | 
|  | # Your C compiler (eg, "cc" or "gcc") | 
|  | ! CC=	cc | 
|  |  | 
|  |  | 
|  | # program to use for installation -- this may or may not preserve | 
|  | --- 13,19 ---- | 
|  |  | 
|  |  | 
|  | # Your C compiler (eg, "cc" or "gcc") | 
|  | ! CC=	gcc | 
|  |  | 
|  |  | 
|  | # program to use for installation -- this may or may not preserve | 
|  | *************** | 
|  | *** 24,37 **** | 
|  |  | 
|  | # Defines for your operating system | 
|  | # | 
|  | ! DEFINES=-DLINUX | 
|  | #DEFINES=-DSYSV -DSOLARIS | 
|  |  | 
|  | # Options for your compiler (eg, "-g" for debugging, "-O" for | 
|  | # optimizing, or "-g -O" for both under GCC) | 
|  | #COPT=	-g -traditional $(DEFINES) | 
|  | ! COPT=	-g $(DEFINES) | 
|  | ! #COPT=	-O $(DEFINES) | 
|  |  | 
|  | # Version of "make" you want to use | 
|  | #MAKE=	gnumake | 
|  | --- 24,37 ---- | 
|  |  | 
|  | # Defines for your operating system | 
|  | # | 
|  | ! DEFINES=-DLINUX -DUSE_IP_FILTER | 
|  | #DEFINES=-DSYSV -DSOLARIS | 
|  |  | 
|  | # Options for your compiler (eg, "-g" for debugging, "-O" for | 
|  | # optimizing, or "-g -O" for both under GCC) | 
|  | #COPT=	-g -traditional $(DEFINES) | 
|  | ! #COPT=	-g $(DEFINES) | 
|  | ! COPT=	-O $(DEFINES) | 
|  |  | 
|  | # Version of "make" you want to use | 
|  | #MAKE=	gnumake | 
|  | *************** | 
|  | *** 44,50 **** | 
|  |  | 
|  |  | 
|  | # Destination directory for installation of binaries | 
|  | ! DEST=	/usr/local/etc | 
|  |  | 
|  |  | 
|  | # Destination directory for installation of man pages | 
|  | --- 44,50 ---- | 
|  |  | 
|  |  | 
|  | # Destination directory for installation of binaries | 
|  | ! DEST=	/usr/local/sbin | 
|  |  | 
|  |  | 
|  | # Destination directory for installation of man pages | 
|  | *************** | 
|  | *** 72,78 **** | 
|  | # or -Bstatic for static binaries under SunOS 4.1.x) | 
|  | #LDFL=	-Bstatic | 
|  | #LDFL= | 
|  | ! LDFL= -g | 
|  |  | 
|  |  | 
|  | # Location of the fwtk sources [For #include by any external tools needing it] | 
|  | --- 72,79 ---- | 
|  | # or -Bstatic for static binaries under SunOS 4.1.x) | 
|  | #LDFL=	-Bstatic | 
|  | #LDFL= | 
|  | ! #LDFL= -g | 
|  | ! LDFL= -O | 
|  |  | 
|  |  | 
|  | # Location of the fwtk sources [For #include by any external tools needing it] | 
|  | *************** | 
|  | *** 81,87 **** | 
|  |  | 
|  |  | 
|  | # Location of X libraries for X-gw | 
|  | ! XLIBDIR=/usr/X11/lib | 
|  | #XLIBDIR=/usr/local/X11R5/lib | 
|  |  | 
|  | # X Libraries | 
|  | --- 82,88 ---- | 
|  |  | 
|  |  | 
|  | # Location of X libraries for X-gw | 
|  | ! XLIBDIR=/usr/X11R6/lib | 
|  | #XLIBDIR=/usr/local/X11R5/lib | 
|  |  | 
|  | # X Libraries | 
|  | *************** | 
|  | *** 96,102 **** | 
|  | #XLIBS = -L$(XLIBDIR) -lXaw -lXmu -lXt -lXext -lX11 | 
|  |  | 
|  | # Location of X include files | 
|  | ! XINCLUDE=/usr/X11/include | 
|  | #XINCLUDE=/usr/local/X11R5/include | 
|  |  | 
|  | # Objects to include in libfwall for SYSV | 
|  | --- 97,103 ---- | 
|  | #XLIBS = -L$(XLIBDIR) -lXaw -lXmu -lXt -lXext -lX11 | 
|  |  | 
|  | # Location of X include files | 
|  | ! XINCLUDE=/usr/X11R6/include | 
|  | #XINCLUDE=/usr/local/X11R5/include | 
|  |  | 
|  | # Objects to include in libfwall for SYSV | 
|  | diff -cr ../TIS.orig/fwtk/Makefile.config.solaris fwtk/Makefile.config.solaris | 
|  | *** ../TIS.orig/fwtk/Makefile.config.solaris	Sat Sep  7 06:14:13 1996 | 
|  | --- fwtk/Makefile.config.solaris	Sun Feb  2 06:09:19 1997 | 
|  | *************** | 
|  | *** 11,30 **** | 
|  | # | 
|  | # RcsId: "$Header$" | 
|  |  | 
|  |  | 
|  | # Your C compiler (eg, "cc" or "gcc") | 
|  | ! CC=	cc | 
|  |  | 
|  |  | 
|  | # program to use for installation -- this may or may not preserve | 
|  | # old versions (or whatever). assumes that it takes parameters: | 
|  | # copy source dest | 
|  | ! CP=	cp | 
|  |  | 
|  |  | 
|  | # Defines for your operating system | 
|  | # | 
|  | ! DEFINES=-DSYSV -DSOLARIS | 
|  |  | 
|  | #DEFINES=-DSYSV -DSOLARIS -Dgethostbyname=res_gethostbyname		\ | 
|  | -Dgethostbyaddr=res_gethostbyaddr -Dgetnetbyname=res_getnetbyname	\ | 
|  | --- 11,34 ---- | 
|  | # | 
|  | # RcsId: "$Header$" | 
|  |  | 
|  | + # | 
|  | + # Path to sources of ip_filter (ip_nat.h required in lib/hnam.c) | 
|  | + # | 
|  | + IPFPATH=/src/unpacked/firewall/ip_fil3.1.5 | 
|  |  | 
|  | # Your C compiler (eg, "cc" or "gcc") | 
|  | ! CC=	gcc | 
|  |  | 
|  |  | 
|  | # program to use for installation -- this may or may not preserve | 
|  | # old versions (or whatever). assumes that it takes parameters: | 
|  | # copy source dest | 
|  | ! CP=	/usr/ucb/install -c -s | 
|  |  | 
|  |  | 
|  | # Defines for your operating system | 
|  | # | 
|  | ! DEFINES=-DSYSV -DSOLARIS -DUSE_IP_FILTER -I$(IPFPATH) | 
|  |  | 
|  | #DEFINES=-DSYSV -DSOLARIS -Dgethostbyname=res_gethostbyname		\ | 
|  | -Dgethostbyaddr=res_gethostbyaddr -Dgetnetbyname=res_getnetbyname	\ | 
|  | *************** | 
|  | *** 45,52 **** | 
|  |  | 
|  |  | 
|  | # Your ranlib utility (use "touch" if you don't have ranlib) | 
|  | ! RANLIB=	ranlib | 
|  | ! #RANLIB=	touch | 
|  |  | 
|  |  | 
|  | # Destination directory for installation of binaries | 
|  | --- 49,56 ---- | 
|  |  | 
|  |  | 
|  | # Your ranlib utility (use "touch" if you don't have ranlib) | 
|  | ! # RANLIB=	ranlib | 
|  | ! RANLIB=	touch | 
|  |  | 
|  |  | 
|  | # Destination directory for installation of binaries | 
|  | diff -cr ../TIS.orig/fwtk/firewall.h fwtk/firewall.h | 
|  | *** ../TIS.orig/fwtk/firewall.h	Sun Sep  8 05:55:26 1996 | 
|  | --- fwtk/firewall.h	Sun Feb  2 05:23:33 1997 | 
|  | *************** | 
|  | *** 47,53 **** | 
|  | system. | 
|  | */ | 
|  | #ifndef	PERMFILE | 
|  | ! #define	PERMFILE	"/usr/local/etc/netperm-table" | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | --- 47,53 ---- | 
|  | system. | 
|  | */ | 
|  | #ifndef	PERMFILE | 
|  | ! #define	PERMFILE	"/etc/fwtk/netperm-table" | 
|  | #endif | 
|  |  | 
|  | /* | 
|  | *************** | 
|  | *** 67,73 **** | 
|  |  | 
|  | /* Choose a system logging facility for the firewall toolkit.  */ | 
|  | #ifndef	LFAC | 
|  | ! #define	LFAC	LOG_DAEMON | 
|  | #endif | 
|  |  | 
|  |  | 
|  | --- 67,73 ---- | 
|  |  | 
|  | /* Choose a system logging facility for the firewall toolkit.  */ | 
|  | #ifndef	LFAC | 
|  | ! #define	LFAC	LOG_LOCAL5 | 
|  | #endif | 
|  |  | 
|  |  | 
|  | *************** | 
|  | *** 215,220 **** | 
|  | #define	PERM_ALLOW	01 | 
|  | #define	PERM_DENY	02 | 
|  |  | 
|  | ! | 
|  | #define	_INCL_FWALL_H | 
|  | #endif | 
|  | --- 215,222 ---- | 
|  | #define	PERM_ALLOW	01 | 
|  | #define	PERM_DENY	02 | 
|  |  | 
|  | ! #ifdef USE_IP_FILTER | 
|  | ! extern char *getdsthost(int, int*); | 
|  | ! #endif | 
|  | #define	_INCL_FWALL_H | 
|  | #endif | 
|  | diff -cr ../TIS.orig/fwtk/ftp-gw/ftp-gw.c fwtk/ftp-gw/ftp-gw.c | 
|  | *** ../TIS.orig/fwtk/ftp-gw/ftp-gw.c	Fri Sep  6 18:55:05 1996 | 
|  | --- fwtk/ftp-gw/ftp-gw.c	Sat Feb  1 06:49:13 1997 | 
|  | *************** | 
|  | *** 50,55 **** | 
|  | --- 50,59 ---- | 
|  | #ifndef	FTPPORT | 
|  | #define	FTPPORT	21 | 
|  | #endif | 
|  | + #ifdef USE_IP_FILTER | 
|  | + static int do_transparent=0; | 
|  | + static int connectdest(); | 
|  | + #endif | 
|  |  | 
|  | static	Cfg			*confp; | 
|  | static	char			**validests = (char **)0; | 
|  | *************** | 
|  | *** 170,175 **** | 
|  | --- 174,182 ---- | 
|  | char		xuf[1024]; | 
|  | char		huf[128]; | 
|  | char		*passuser = (char *)0;	/* passed user as av */ | 
|  | + #ifdef USE_IP_FILTER | 
|  | +         char            *psychic, *hotline; | 
|  | + #endif | 
|  |  | 
|  | #ifndef	LOG_DAEMON | 
|  | openlog("ftp-gw",LOG_PID); | 
|  | *************** | 
|  | *** 313,320 **** | 
|  | } | 
|  | } else | 
|  | timeout = 60*60; | 
|  |  | 
|  | - | 
|  | /* display a welcome file or message */ | 
|  | if(passuser == (char *)0) { | 
|  | if((cf = cfg_get("welcome-msg",confp)) != (Cfg *)0) { | 
|  | --- 320,330 ---- | 
|  | } | 
|  | } else | 
|  | timeout = 60*60; | 
|  | + #ifdef USE_IP_FILTER | 
|  | + 	psychic=getdsthost(0,NULL); | 
|  | + 	if(psychic) { do_transparent++; } | 
|  | + #endif | 
|  |  | 
|  | /* display a welcome file or message */ | 
|  | if(passuser == (char *)0) { | 
|  | if((cf = cfg_get("welcome-msg",confp)) != (Cfg *)0) { | 
|  | *************** | 
|  | *** 322,327 **** | 
|  | --- 332,345 ---- | 
|  | syslog(LLEV,"fwtkcfgerr: welcome-msg must have one parameter, line %d",cf->ln); | 
|  | exit(1); | 
|  | } | 
|  | + #ifdef USE_IP_FILTER | 
|  | + 			if(do_transparent) { | 
|  | + 			  if(sayfile2(0,cf->argv[0],220)) { | 
|  | + 			    syslog(LLEV,"fwtksyserr: cannot display welcome %s: %m",cf->argv[0]); | 
|  | + 			    exit(1); | 
|  | + 			  } | 
|  | + 			} else | 
|  | + #endif /* USE_IP_FILTER */ | 
|  | if(sayfile(0,cf->argv[0],220)) { | 
|  | syslog(LLEV,"fwtksyserr: cannot display welcome %s: %m",cf->argv[0]); | 
|  | exit(1); | 
|  | *************** | 
|  | *** 332,338 **** | 
|  | if(authallflg) | 
|  | if(say(0,"220-Proxy first requires authentication")) | 
|  | exit(1); | 
|  | ! 			sprintf(xuf,"220 %s FTP proxy (Version %s) ready.",huf,FWTK_VERSION_MINOR); | 
|  | if(say(0,xuf)) | 
|  | exit(1); | 
|  | } | 
|  | --- 350,361 ---- | 
|  | if(authallflg) | 
|  | if(say(0,"220-Proxy first requires authentication")) | 
|  | exit(1); | 
|  | ! #ifdef USE_IP_FILTER | 
|  | ! 			if(do_transparent) | 
|  | ! 			  sprintf(xuf,"220-%s FTP proxy (Version %s) ready.",huf,FWTK_VERSION_MINOR); | 
|  | ! 			else | 
|  | ! #endif | 
|  | ! 			  sprintf(xuf,"220 %s FTP proxy (Version %s) ready.",huf,FWTK_VERSION_MINOR); | 
|  | if(say(0,xuf)) | 
|  | exit(1); | 
|  | } | 
|  | *************** | 
|  | *** 352,358 **** | 
|  | if(cmd_user(2,fakav,"user internal")) | 
|  | exit(1); | 
|  | } | 
|  | ! | 
|  | /* main loop */ | 
|  | while(1) { | 
|  | FD_ZERO(&rdy); | 
|  | --- 375,386 ---- | 
|  | if(cmd_user(2,fakav,"user internal")) | 
|  | exit(1); | 
|  | } | 
|  | ! #ifdef USE_IP_FILTER | 
|  | ! 	if(do_transparent) { | 
|  | ! 	  connectdest(psychic,21); | 
|  | ! 	} | 
|  | ! #endif | 
|  | ! | 
|  | /* main loop */ | 
|  | while(1) { | 
|  | FD_ZERO(&rdy); | 
|  | *************** | 
|  | *** 676,681 **** | 
|  | --- 704,719 ---- | 
|  | return(sayn(0,noad,sizeof(noad)-1)); | 
|  | } | 
|  |  | 
|  | + #ifdef USE_IP_FILTER | 
|  | + 	if(do_transparent) { | 
|  | + 	  if((rfd==(-1)) && (x=connectdest(dest,port))) return x; | 
|  | + 	  sprintf(buf,"USER %s",user); | 
|  | + 	  if(say(rfd,buf)) return(1); | 
|  | + 	  x=getresp(rfd,buf,sizeof(buf),1); | 
|  | + 	  if(sendsaved(0,x)) return(1); | 
|  | + 	  return(say(0,buf)); | 
|  | + 	} | 
|  | + #endif | 
|  | if(*dest == '\0') | 
|  | dest = "localhost"; | 
|  |  | 
|  | *************** | 
|  | *** 717,723 **** | 
|  | char	ebuf[512]; | 
|  |  | 
|  | strcpy(ebuf,buf); | 
|  | ! 		sprintf(buf,"521 %s: %s",dest,ebuf); | 
|  | rfd = -1; | 
|  | return(say(0,buf)); | 
|  | } | 
|  | --- 755,766 ---- | 
|  | char	ebuf[512]; | 
|  |  | 
|  | strcpy(ebuf,buf); | 
|  | ! #ifdef USE_IP_FILTER | 
|  | ! 		if(do_transparent) { | 
|  | ! 		  sprintf(buf,"521 %s,%d: %s",dest,ntohs(port),ebuf); | 
|  | ! 		} else | 
|  | ! #endif | 
|  | ! 		  sprintf(buf,"521 %s: %s",dest,ebuf); | 
|  | rfd = -1; | 
|  | return(say(0,buf)); | 
|  | } | 
|  | *************** | 
|  | *** 1874,1876 **** | 
|  | --- 1917,2036 ---- | 
|  | dup(nread); | 
|  | } | 
|  | #endif | 
|  | + | 
|  | + #ifdef USE_IP_FILTER | 
|  | + static int connectdest(dest, port) | 
|  | + char *dest; | 
|  | + short port; | 
|  | + { | 
|  | +       char buf[1024], mbuf[512]; | 
|  | +       int msg_int, x; | 
|  | + | 
|  | +         if(*dest == '\0') | 
|  | +                 dest = "localhost"; | 
|  | + | 
|  | +         if(validests != (char **)0) { | 
|  | +                 char    **xp; | 
|  | +                 int     x; | 
|  | + | 
|  | +                 for(xp = validests; *xp != (char *)0; xp++) { | 
|  | +                         if(**xp == '!' && hostmatch(*xp + 1,dest)) { | 
|  | +                                 return(baddest(0,dest)); | 
|  | +                         } else { | 
|  | +                                 if(hostmatch(*xp,dest)) | 
|  | +                                         break; | 
|  | +                         } | 
|  | +                 } | 
|  | +                 if(*xp == (char *)0) | 
|  | +                         return(baddest(0,dest)); | 
|  | +         } | 
|  | + | 
|  | +         /* Extended permissions processing goes in here for destination */ | 
|  | +         if(extendperm) { | 
|  | +                 msg_int = auth_perm(confp, authuser, "ftp-gw", dest,(char *)0); | 
|  | +                 if(msg_int == 1) { | 
|  | +                         sprintf(mbuf,"Permission denied for user %s to connect to %s",authuser,dest); | 
|  | +                         syslog(LLEV,"deny host=%s/%s connect to %s user=%s",rladdr,riaddr,dest,authuser); | 
|  | +                                 say(0,mbuf); | 
|  | +                                 return(1); | 
|  | +                 } else { | 
|  | +                         if(msg_int == -1) { | 
|  | +                                 sprintf(mbuf,"No match in netperm-table for %s to ftp to %s",authuser,dest); | 
|  | +                                 say(0,mbuf); | 
|  | +                                 return(1); | 
|  | +                         } | 
|  | +                 } | 
|  | +         } | 
|  | + | 
|  | +         syslog(LLEV,"permit host=%s/%s connect to %s",rladdr,riaddr,dest); | 
|  | + | 
|  | +         if((rfd = conn_server(dest,port,0,buf)) < 0) { | 
|  | +                 char    ebuf[512]; | 
|  | + | 
|  | +                 strcpy(ebuf,buf); | 
|  | +                 sprintf(buf,"521 %s: %s",dest,ebuf); | 
|  | +                 rfd = -1; | 
|  | +                 return(say(0,buf)); | 
|  | +         } | 
|  | +       if(!do_transparent) { | 
|  | +               sprintf(buf,"----GATEWAY CONNECTED TO %s----",dest); | 
|  | +               saveline(buf); | 
|  | +       } | 
|  | + | 
|  | +         /* we are now connected and need to try the autologin thing */ | 
|  | +         x = getresp(rfd,buf,sizeof(buf),1); | 
|  | +         if(x / 100 != COMPLETE) { | 
|  | +                 sendsaved(0,-1); | 
|  | +                 return(say(0,buf)); | 
|  | +         } | 
|  | +         saveline(buf); | 
|  | + | 
|  | +       sendsaved(0,-1); | 
|  | +       return 0; | 
|  | + } | 
|  | + | 
|  | + | 
|  | + /* ok, so i'm in a hurry. english paper due RSN. */ | 
|  | + sayfile2(fd,fn,code) | 
|  | + int     fd; | 
|  | + char    *fn; | 
|  | + int     code; | 
|  | + { | 
|  | +         FILE    *f; | 
|  | +         char    buf[BUFSIZ]; | 
|  | +         char    yuf[BUFSIZ]; | 
|  | +         char    *c; | 
|  | +         int     x; | 
|  | +         int     saidsomething = 0; | 
|  | + | 
|  | +         if((f = fopen(fn,"r")) == (FILE *)0) | 
|  | +                 return(1); | 
|  | +         while(fgets(buf,sizeof(buf),f) != (char *)0) { | 
|  | +                 if((c = index(buf,'\n')) != (char *)0) | 
|  | +                         *c = '\0'; | 
|  | +                 x = fgetc(f); | 
|  | +                 if(feof(f)) | 
|  | +                         sprintf(yuf,"%3.3d-%s",code,buf); | 
|  | +                 else { | 
|  | +                         sprintf(yuf,"%3.3d-%s",code,buf); | 
|  | +                         ungetc(x,f); | 
|  | +                 } | 
|  | +                 if(say(fd,yuf)) { | 
|  | +                         fclose(f); | 
|  | +                         return(1); | 
|  | +                 } | 
|  | +                 saidsomething++; | 
|  | +         } | 
|  | +         fclose(f); | 
|  | +         if (!saidsomething) { | 
|  | +                 syslog(LLEV,"fwtkcfgerr: sayfile for %d is empty",code); | 
|  | +                 sprintf(yuf, "%3.3d The file to display is empty",code); | 
|  | +                 if(say(fd,yuf)) { | 
|  | +                         fclose(f); | 
|  | +                         return(1); | 
|  | +                 } | 
|  | +         } | 
|  | +         return(0); | 
|  | + } | 
|  | + | 
|  | + #endif /* USE_IP_FILTER */ | 
|  | diff -cr ../TIS.orig/fwtk/http-gw/http-gw.c fwtk/http-gw/http-gw.c | 
|  | *** ../TIS.orig/fwtk/http-gw/http-gw.c	Mon Sep  9 20:40:53 1996 | 
|  | --- fwtk/http-gw/http-gw.c	Sun Feb  2 06:41:18 1997 | 
|  | *************** | 
|  | *** 27,32 **** | 
|  | --- 27,35 ---- | 
|  | static char http_buffer[8192]; | 
|  | static char reason[8192]; | 
|  | static	int	checkBrowserType = 1; | 
|  | + #ifdef USE_IP_FILTER | 
|  | + static  int     do_transparent=0; | 
|  | + #endif | 
|  |  | 
|  | static void do_logging() | 
|  | {	char *proto = "GOPHER"; | 
|  | *************** | 
|  | *** 422,427 **** | 
|  | --- 425,441 ---- | 
|  | /*(NOT A SPECIAL FORM)*/ | 
|  |  | 
|  | if((rem_type & TYPE_LOCAL)== 0){ | 
|  | + #ifdef USE_IP_FILTER | 
|  | +                         char *psychic=getdsthost(sockfd,&def_port); | 
|  | +                         if(psychic) { | 
|  | +                                 if(strlen(psychic)<=MAXHOSTNAMELEN) { | 
|  | +                                         do_transparent++; | 
|  | +                                         strncpy(def_httpd,psychic,strlen(psychic)); | 
|  | +                                         strncpy(def_server,psychic,strlen(psychic)); | 
|  | +                                 } | 
|  | +                         } | 
|  | + | 
|  | + #endif /* USE_IP_FILTER */ | 
|  | /*  See if it can be forwarded */ | 
|  |  | 
|  | if( can_forward(buf)){ | 
|  | *************** | 
|  | *** 1513,1518 **** | 
|  | --- 1527,1537 ---- | 
|  | parse_vec[0], | 
|  | parse_vec[1], | 
|  | ourname, ourport); | 
|  | + 				    } | 
|  | + #ifdef USE_IP_FILTER | 
|  | + 				    else if(do_transparent) { | 
|  | + 				      sprintf(new_reply,"%s\t%s\t%s\t%s",parse_vec[0],parse_vec[1],parse_vec[2],parse_vec[3]); | 
|  | + #endif	/* USE_IP_FILTER */ | 
|  | }else{ | 
|  | sprintf(new_reply,"%s\tgopher://%s:%s/%c%s\t%s\t%u", | 
|  | parse_vec[0], parse_vec[2], | 
|  | diff -cr ../TIS.orig/fwtk/lib/hnam.c fwtk/lib/hnam.c | 
|  | *** ../TIS.orig/fwtk/lib/hnam.c	Sat Nov  5 00:30:19 1994 | 
|  | --- fwtk/lib/hnam.c	Sat Feb  1 08:17:46 1997 | 
|  | *************** | 
|  | *** 20,25 **** | 
|  | --- 20,37 ---- | 
|  |  | 
|  | extern	char	*inet_ntoa(); | 
|  |  | 
|  | + #if defined(USE_IP_FILTER) | 
|  | + #include      <net/if.h> | 
|  | + #ifndef LINUX | 
|  | + #include      "ip_nat.h" | 
|  | + #endif | 
|  | + #if defined(SOLARIS) | 
|  | + #include <sys/stat.h> | 
|  | + #include <fcntl.h> | 
|  | + #include <unistd.h> | 
|  | + #include <sys/ioccom.h> | 
|  | + #endif | 
|  | + #endif /* IP_FILTER */ | 
|  |  | 
|  | #include	"firewall.h" | 
|  |  | 
|  | *************** | 
|  | *** 45,47 **** | 
|  | --- 57,158 ---- | 
|  | bcopy(hp->h_addr,&sin.sin_addr,hp->h_length); | 
|  | return(inet_ntoa(sin.sin_addr)); | 
|  | } | 
|  | + | 
|  | + | 
|  | + | 
|  | + #ifdef USE_IP_FILTER | 
|  | + char *getdsthost(fd, ptr) | 
|  | +   int fd; | 
|  | + int *ptr; | 
|  | + { | 
|  | +   struct sockaddr_in sin; | 
|  | +   struct hostent *hp; | 
|  | +   int sl=sizeof(struct sockaddr_in), err=0, local_h=0, i=0; | 
|  | +   static char buf[255], hostbuf[255]; | 
|  | + #if defined(__FreeBSD__) || defined(SOLARIS) | 
|  | +   struct sockaddr_in rsin; | 
|  | +   struct natlookup natlookup; | 
|  | +   int natfd; | 
|  | + #endif | 
|  | + | 
|  | + #ifdef linux | 
|  | +   /* This should also work for UDP. Unfortunately, it doesn't. | 
|  | +      Maybe when the Linux UDP proxy code gets a little cleaner. | 
|  | +      */ | 
|  | +   if(!(err=getsockname(0,&sin,&sl))) { | 
|  | +     if(ptr) *ptr=ntohs(sin.sin_port); | 
|  | +     sprintf(buf,"%s",inet_ntoa(sin.sin_addr)); | 
|  | +     gethostname(hostbuf,254); | 
|  | +     hp=gethostbyname(hostbuf); | 
|  | +     while(hp->h_addr_list[i]) { | 
|  | +       bzero(&sin,&sl); | 
|  | +       memcpy(&sin.sin_addr,hp->h_addr_list[i++],sizeof(hp->h_addr_list[i++])); | 
|  | +       if(!strcmp(buf,inet_ntoa(sin.sin_addr))) local_h++; | 
|  | +     } | 
|  | +     if(local_h) { /* syslog(LLEV,"DEBUG: hnam.c: non-transparent."); */ return(NULL); } | 
|  | +     else { return(buf); } | 
|  | +   } | 
|  | + #endif | 
|  | + | 
|  | + #if defined(__FreeBSD__) | 
|  | +   /* The basis for this block of code is Darren Reed's | 
|  | +      patches to the TIS ftwk's ftp-gw. | 
|  | +      */ | 
|  | +   bzero((char*)&sin,sizeof(sin)); | 
|  | +   bzero((char*)&rsin,sizeof(rsin)); | 
|  | +   if(getsockname(fd,(struct sockaddr*)&sin,&sl)<0) { | 
|  | +     return NULL; | 
|  | +   } | 
|  | +   sl=sizeof(rsin); | 
|  | +   if(getpeername(fd,(struct sockaddr*)&rsin,&sl)<0) { | 
|  | +     return NULL; | 
|  | +   } | 
|  | +   natlookup.nl_inport=sin.sin_port; | 
|  | +   natlookup.nl_outport=rsin.sin_port; | 
|  | +   natlookup.nl_inip=sin.sin_addr; | 
|  | +   natlookup.nl_outip=rsin.sin_addr; | 
|  | +   if((natfd=open("/dev/ipnat",O_RDONLY))<0) { | 
|  | +     return(NULL); | 
|  | +   } | 
|  | +   if(ioctl(natfd,SIOCGNATL,&natlookup)==(-1)) { | 
|  | +     return(NULL); | 
|  | +   } | 
|  | +   close(natfd); | 
|  | +   if(ptr) *ptr=ntohs(natlookup.nl_realport); | 
|  | +   sprintf(buf,"%s",inet_ntoa(natlookup.nl_realip)); | 
|  | + #endif | 
|  | + | 
|  | + #if defined(SOLARIS) /* for Solaris */ | 
|  | +   /* The basis for this block of code is Darren Reed's | 
|  | +    * patches to the TIS ftwk's ftp-gw. | 
|  | +    * modified for Solaris from Michael Kutzner, Michael.Kutzner@paderlinx.de | 
|  | +    */ | 
|  | +   memset((char*)&sin,  0, sizeof(sin)); | 
|  | +   memset((char*)&rsin, 0, sizeof(rsin)); | 
|  | + | 
|  | +   if(getsockname(fd,(struct sockaddr*)&sin,&sl)<0) { | 
|  | +     return NULL; | 
|  | +   } | 
|  | +   sl=sizeof(rsin); | 
|  | +   if(getpeername(fd,(struct sockaddr*)&rsin,&sl)<0) { | 
|  | +     return NULL; | 
|  | +   } | 
|  | +   natlookup.nl_inport=sin.sin_port; | 
|  | +   natlookup.nl_outport=rsin.sin_port; | 
|  | +   natlookup.nl_inip=sin.sin_addr; | 
|  | +   natlookup.nl_outip=rsin.sin_addr; | 
|  | +   if( (natfd=open(IPL_NAT,O_RDONLY)) < 0) { | 
|  | +     return(NULL); | 
|  | +   } | 
|  | +   if(ioctl(natfd, SIOCGNATL, &natlookup) == -1) { | 
|  | +     return(NULL); | 
|  | +   } | 
|  | +   close(natfd); | 
|  | +   if(ptr) *ptr=ntohs(natlookup.nl_realport); | 
|  | +   sprintf(buf,"%s",inet_ntoa(natlookup.nl_realip)); | 
|  | + #endif | 
|  | + | 
|  | +   /* No transparent proxy support */ | 
|  | +   return(NULL); | 
|  | + } | 
|  | + #endif /* USE_IP_FILTER */ | 
|  | diff -cr ../TIS.orig/fwtk/plug-gw/plug-gw.c fwtk/plug-gw/plug-gw.c | 
|  | *** ../TIS.orig/fwtk/plug-gw/plug-gw.c	Thu Sep  5 21:36:33 1996 | 
|  | --- fwtk/plug-gw/plug-gw.c	Sun Feb  2 04:50:40 1997 | 
|  | *************** | 
|  | *** 38,44 **** | 
|  | static	int		timeout = PROXY_TIMEOUT; | 
|  | static	char		**validdests = (char **)0; | 
|  | static	Cfg		*confp; | 
|  | ! | 
|  | main(ac,av) | 
|  | int	ac; | 
|  | char	*av[]; | 
|  | --- 38,46 ---- | 
|  | static	int		timeout = PROXY_TIMEOUT; | 
|  | static	char		**validdests = (char **)0; | 
|  | static	Cfg		*confp; | 
|  | ! #ifdef USE_IP_FILTER | 
|  | ! static	int		do_transparent=0; | 
|  | ! #endif | 
|  | main(ac,av) | 
|  | int	ac; | 
|  | char	*av[]; | 
|  | *************** | 
|  | *** 189,201 **** | 
|  | static	char		buf[1024 * 4]; | 
|  | void		(*op)(); | 
|  | char		*dhost = NULL; | 
|  | char		hostport[1024 * 4]; | 
|  | char		*ptr; | 
|  | int		state = 0; | 
|  | int		ssl_plug = 0; | 
|  | ! | 
|  | struct timeval	timo; | 
|  |  | 
|  | if(c->flags & PERM_DENY) { | 
|  | if (p == -1) | 
|  | syslog(LLEV,"deny host=%s/%s port=any",rhost,raddr); | 
|  | --- 191,215 ---- | 
|  | static	char		buf[1024 * 4]; | 
|  | void		(*op)(); | 
|  | char		*dhost = NULL; | 
|  | + 	char		*transhost = NULL; | 
|  | char		hostport[1024 * 4]; | 
|  | char		*ptr; | 
|  | int		state = 0; | 
|  | int		ssl_plug = 0; | 
|  | ! #ifdef USE_IP_FILTER | 
|  | ! 	int		pport; | 
|  | ! #endif | 
|  | struct timeval	timo; | 
|  |  | 
|  | + #ifdef USE_IP_FILTER | 
|  | + 	/* Transparent plug-gw is probably a bad idea, but hey .. */ | 
|  | + 	transhost=getdsthost(0,&pport); | 
|  | + 	if(transhost) { | 
|  | + 	  do_transparent++; | 
|  | + 	  portid=pport; | 
|  | + 	} | 
|  | + #endif | 
|  | + | 
|  | if(c->flags & PERM_DENY) { | 
|  | if (p == -1) | 
|  | syslog(LLEV,"deny host=%s/%s port=any",rhost,raddr); | 
|  | *************** | 
|  | *** 223,229 **** | 
|  | privport = 1; | 
|  | continue; | 
|  | } | 
|  | ! | 
|  | if (!strcmp(av[x], "-port")) { | 
|  | if (++x >= ac) { | 
|  | syslog(LLEV,"fwtkcfgerr: -port takes an argument, line %d",c->ln); | 
|  | --- 237,248 ---- | 
|  | privport = 1; | 
|  | continue; | 
|  | } | 
|  | ! #ifdef USE_IP_FILTER | 
|  | ! 		if (!strcmp(av[x],"-all-destinations")) { | 
|  | ! 		  dhost = transhost; | 
|  | ! 		  continue; | 
|  | ! 		} | 
|  | ! #endif | 
|  | if (!strcmp(av[x], "-port")) { | 
|  | if (++x >= ac) { | 
|  | syslog(LLEV,"fwtkcfgerr: -port takes an argument, line %d",c->ln); | 
|  | diff -cr ../TIS.orig/fwtk/rlogin-gw/rlogin-gw.c fwtk/rlogin-gw/rlogin-gw.c | 
|  | *** ../TIS.orig/fwtk/rlogin-gw/rlogin-gw.c	Fri Sep  6 18:56:33 1996 | 
|  | --- fwtk/rlogin-gw/rlogin-gw.c	Sun Feb  2 06:26:04 1997 | 
|  | *************** | 
|  | *** 40,46 **** | 
|  |  | 
|  | extern	char	*maphostname(); | 
|  |  | 
|  | ! | 
|  | static	int	cmd_quit(); | 
|  | static	int	cmd_help(); | 
|  | static	int	cmd_connect(); | 
|  | --- 40,48 ---- | 
|  |  | 
|  | extern	char	*maphostname(); | 
|  |  | 
|  | ! #ifdef USE_IP_FILTER | 
|  | ! static  int     do_transparent=0; | 
|  | ! #endif | 
|  | static	int	cmd_quit(); | 
|  | static	int	cmd_help(); | 
|  | static	int	cmd_connect(); | 
|  | *************** | 
|  | *** 120,125 **** | 
|  | --- 122,130 ---- | 
|  | static char	*tokav[56]; | 
|  | int		tokac; | 
|  | struct timeval	timo; | 
|  | + #ifdef USE_IP_FILTER | 
|  | +         char *psychic; | 
|  | + #endif | 
|  |  | 
|  | #ifndef	LOG_NDELAY | 
|  | openlog("rlogin-gw",LOG_PID); | 
|  | *************** | 
|  | *** 186,192 **** | 
|  | } | 
|  |  | 
|  |  | 
|  | ! | 
|  | if((cf = cfg_get("directory",confp)) != (Cfg *)0) { | 
|  | if(cf->argc != 1) { | 
|  | syslog(LLEV,"fwtkcfgerr: chroot must have one parameter, line %d",cf->ln); | 
|  | --- 191,204 ---- | 
|  | } | 
|  |  | 
|  |  | 
|  | ! #ifdef USE_IP_FILTER | 
|  | !         psychic=getdsthost(0,NULL); | 
|  | !         if(psychic) { | 
|  | !                 do_transparent++; | 
|  | !                 strncpy(dest,psychic,511); | 
|  | !                 dest[511]='\0'; | 
|  | !         } | 
|  | ! #endif /* USE_IP_FILTER */ | 
|  | if((cf = cfg_get("directory",confp)) != (Cfg *)0) { | 
|  | if(cf->argc != 1) { | 
|  | syslog(LLEV,"fwtkcfgerr: chroot must have one parameter, line %d",cf->ln); | 
|  | *************** | 
|  | *** 260,269 **** | 
|  | } | 
|  |  | 
|  | /* if present a host name, chop and save username and hostname */ | 
|  | - 	dest[0] = '\0'; | 
|  | if((p = index(rusername,'@')) != (char *)0) { | 
|  | char	*namp; | 
|  |  | 
|  | *p++ = '\0'; | 
|  | if(*p == '\0') | 
|  | p = "localhost"; | 
|  | --- 272,281 ---- | 
|  | } | 
|  |  | 
|  | /* if present a host name, chop and save username and hostname */ | 
|  | if((p = index(rusername,'@')) != (char *)0) { | 
|  | char	*namp; | 
|  |  | 
|  | + 		dest[0] = '\0'; | 
|  | *p++ = '\0'; | 
|  | if(*p == '\0') | 
|  | p = "localhost"; | 
|  | *************** | 
|  | *** 532,539 **** | 
|  | --- 544,557 ---- | 
|  | sprintf(ebuf,"Trying %s@%s...",rusername,namp); | 
|  | else | 
|  | sprintf(ebuf,"Trying %s...",namp); | 
|  | + #ifdef USE_IP_FILTER | 
|  | +                 if(!do_transparent) { | 
|  | + #endif | 
|  | if(say(0,ebuf)) | 
|  | return(1); | 
|  | + #ifdef USE_IP_FILTER | 
|  | +                 } | 
|  | + #endif | 
|  | } else | 
|  | syslog(LLEV,"permit host=%s/%s connect to %s",rhost,raddr,av[1]); | 
|  | if((serfd = conn_server(av[1],RLOGINPORT,1,buf)) < 0) { | 
|  | diff -cr ../TIS.orig/fwtk/tn-gw/tn-gw.c fwtk/tn-gw/tn-gw.c | 
|  | *** ../TIS.orig/fwtk/tn-gw/tn-gw.c	Fri Sep  6 18:55:48 1996 | 
|  | --- fwtk/tn-gw/tn-gw.c	Sun Feb  2 06:06:33 1997 | 
|  | *************** | 
|  | *** 97,102 **** | 
|  | --- 97,106 ---- | 
|  | static	int			timeout = PROXY_TIMEOUT; | 
|  | static	char			timed_out_msg[] = "\r\nConnection closed due to inactivity"; | 
|  |  | 
|  | + #ifdef USE_IP_FILTER | 
|  | + static int do_transparent=0; | 
|  | + #endif | 
|  | + | 
|  | typedef	struct	{ | 
|  | char	*name; | 
|  | char	*hmsg; | 
|  | *************** | 
|  | *** 140,145 **** | 
|  | --- 144,153 ---- | 
|  | char		tokbuf[BSIZ]; | 
|  | char		*tokav[56]; | 
|  | int		tokac; | 
|  | + #ifdef USE_IP_FILTER | 
|  | +         int port; | 
|  | +         char *psychic; | 
|  | + #endif | 
|  |  | 
|  | #ifndef	LOG_DAEMON | 
|  | openlog("tn-gw",LOG_PID); | 
|  | *************** | 
|  | *** 307,313 **** | 
|  | exit(1); | 
|  | } | 
|  | } | 
|  | ! | 
|  | while (argc > 1) { | 
|  | argc--; | 
|  | argv++; | 
|  | --- 315,349 ---- | 
|  | exit(1); | 
|  | } | 
|  | } | 
|  | ! #ifdef USE_IP_FILTER | 
|  | !        psychic=getdsthost(0,&port); | 
|  | !        if(psychic) { | 
|  | !                if((strlen(psychic) + 10) < 510) { | 
|  | !                        do_transparent++; | 
|  | !                        if(port) | 
|  | !                                sprintf(dest,"%s:%d",psychic,port); | 
|  | !                        else | 
|  | !                                sprintf(dest,"%s",psychic); | 
|  | ! | 
|  | ! | 
|  | !                if(!welcomedone) | 
|  | !                        if((cf = cfg_get("welcome-msg",confp)) != (Cfg *)0) { | 
|  | !                                 if(cf->argc != 1) { | 
|  | !                                         syslog(LLEV,"fwtkcfgerr: welcome-msg must have one parameter, line %d",cf->ln); | 
|  | !                                         exit(1); | 
|  | !                                 } | 
|  | !                                 if(sayfile(0,cf->argv[0])) { | 
|  | !                                         syslog(LLEV,"fwtksyserr: cannot display welcome %s:%m",cf->argv[0]); | 
|  | !                                         exit(1); | 
|  | !                                 } | 
|  | !                                 welcomedone = 1; | 
|  | !                                } | 
|  | ! | 
|  | ! | 
|  | !                } | 
|  | !        } | 
|  | ! | 
|  | ! #endif /* USE_IP_FILTER */ | 
|  | while (argc > 1) { | 
|  | argc--; | 
|  | argv++; | 
|  | *************** | 
|  | *** 870,877 **** | 
|  |  | 
|  | syslog(LLEV,"permit host=%s/%s destination=%s",rladdr,riaddr,namp); | 
|  | sprintf(ebuf,"Trying %s port %d...",namp,port); | 
|  | ! 		if(say(0,ebuf)) | 
|  | ! 			return(1); | 
|  | } else | 
|  | syslog(LLEV,"permit host=%s/%s destination=%s",rladdr,riaddr,av[1]); | 
|  |  | 
|  | --- 906,920 ---- | 
|  |  | 
|  | syslog(LLEV,"permit host=%s/%s destination=%s",rladdr,riaddr,namp); | 
|  | sprintf(ebuf,"Trying %s port %d...",namp,port); | 
|  | ! #ifdef USE_IP_FILTER | 
|  | !                 if(!do_transparent) { | 
|  | !                         sprintf(ebuf,"Trying %s port %d...",namp,port); | 
|  | ! #endif | 
|  | !                         if(say(0,ebuf)) | 
|  | !                                 return(1); | 
|  | ! #ifdef USE_IP_FILTER | 
|  | !                 } | 
|  | ! #endif | 
|  | } else | 
|  | syslog(LLEV,"permit host=%s/%s destination=%s",rladdr,riaddr,av[1]); | 
|  |  | 
|  | *************** | 
|  | *** 903,910 **** | 
|  |  | 
|  | syslog(LLEV,"connected host=%s/%s destination=%s",rladdr,riaddr,av[1]); | 
|  | strncpy(dest,av[1], 511); | 
|  | ! 	sprintf(buf, "Connected to %s.", dest); | 
|  | say(0, buf); | 
|  | return(2); | 
|  | } | 
|  |  | 
|  | --- 946,959 ---- | 
|  |  | 
|  | syslog(LLEV,"connected host=%s/%s destination=%s",rladdr,riaddr,av[1]); | 
|  | strncpy(dest,av[1], 511); | 
|  | ! #ifdef USE_IP_FILTER | 
|  | !         if(!do_transparent) { | 
|  | !                 sprintf(buf, "Connected to %s.", dest); | 
|  | !                 say(0, buf); | 
|  | !         } | 
|  | ! #else | 
|  | say(0, buf); | 
|  | + #endif | 
|  | return(2); | 
|  | } | 
|  |  | 
|  | diff -cr ../TIS.orig/fwtk/x-gw/socket.c fwtk/x-gw/socket.c | 
|  | *** ../TIS.orig/fwtk/x-gw/socket.c	Sat Sep  7 05:16:35 1996 | 
|  | --- fwtk/x-gw/socket.c	Sun Feb  2 05:26:44 1997 | 
|  | *************** | 
|  | *** 212,218 **** | 
|  | case AF_UNIX:	 un_name = (struct sockaddr_un *)addr; | 
|  | len = sizeof(un_name->sun_family)  + | 
|  | sizeof(un_name->sun_path) | 
|  | ! #ifdef SCM_RIGHTS  /* 4.3BSD Reno and later */ | 
|  | + sizeof(un_name->sun_len) + 1 | 
|  | #endif | 
|  | ; | 
|  | --- 212,218 ---- | 
|  | case AF_UNIX:	 un_name = (struct sockaddr_un *)addr; | 
|  | len = sizeof(un_name->sun_family)  + | 
|  | sizeof(un_name->sun_path) | 
|  | ! #if defined(SCM_RIGHTS)  && !defined(LINUX)/* 4.3BSD Reno and later */ | 
|  | + sizeof(un_name->sun_len) + 1 | 
|  | #endif | 
|  | ; | 
|  | Only in fwtk/x-gw: socket.c.bak |