|
DataMuseum.dkPresents historical artifacts from the history of: DKUUG/EUUG Conference tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about DKUUG/EUUG Conference tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: T u
Length: 17694 (0x451e) Types: TextFile Names: »uucp_1.shar«
└─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦3da311d67⟧ »./cops/1.04/cops_104.tar.Z« └─⟦6a2577110⟧ └─⟦4f9d7c866⟧ Bits:30007245 EUUGD6: Sikkerheds distributionen └─⟦6a2577110⟧ »./cops/1.04/cops_104.tar« └─⟦this⟧ »cops_104/extra_src/uucp_1.shar«
#!/bin/sh # This is a shell archive (produced by shar 3.49) # To extract the files from this archive, save it to a file, remove # everything above the "!/bin/sh" line above, and type "sh file_name". # # made 02/06/1992 09:19 UTC by zen@death # Source directory /big/zen/COPS/test/extra_src # # existing files will NOT be overwritten unless -c is specified # # This shar contains: # length mode name # ------ ---------- ------------------------------------------ # 1307 -rw------- Makefile # 6411 -rw------- filecheck.c # 4080 -rwx------ uucp.chk # 3236 -rw------- uufiles.list # # ============= Makefile ============== if test -f 'Makefile' -a X"$1" != X"-c"; then echo 'x - skipping Makefile (File already exists)' else echo 'x - extracting Makefile (Text)' sed 's/^X//' << 'SHAR_EOF' > 'Makefile' && X # %Z% %M% %I% %E% %U% # Makefile for "filecheck" (generated by /local/bin/makemake version 1.00.10) # Created by chip@chinacat on Tue Jun 25 17:52:12 CDT 1991 X SHELL = /bin/sh CC = cc DEFS = COPTS = -O LOPTS = LIBS = DEBUG = -g -DDEBUG LINTFLAGS = -DLINT -DNO_PROTOTYPE X TARG = filecheck OTHERS = X SRCS = filecheck.c X OBJS = filecheck.o X # Any edits below this line will be lost if "makemake" is rerun! # Commands may be inserted after the '#%custom' line at the end of this file. X CFLAGS = $(COPTS) $(DEFS) # $(DEBUG) LDFLAGS = $(LOPTS) # $(DEBUG) X all: $(TARG) $(OTHERS) clean: ; rm -f $(TARG) $(OTHERS) *.o a.out core $(TARG).lint lint: $(TARG).lint X $(TARG): $(OBJS) X $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS) X $(TARG).lint: $(TARG) X lint $(LINTFLAGS) $(DEFS) $(SRCS) $(LIBS) > $@ X filecheck.o: filecheck.c X make: ; X /local/bin/makemake -i -v1.00.10 -aMakefile \ X -DSHELL='$(SHELL)' -DCC='$(CC)' -DDEFS='$(DEFS)' \ X -DCOPTS='$(COPTS)' -DLOPTS='$(LOPTS)' -DLIBS='$(LIBS)' \ X -DDEBUG='$(DEBUG)' -DLINTFLAGS='$(LINTFLAGS)' \ X -DOTHERS='$(OTHERS)' $(TARG) $(SRCS) X #%custom - commands below this line will be maintained if 'makemake' is rerun X SHFILES = uucp.chk filecheck.c uufiles.list Makefile SHAR = cops-uucp.sh X shar : $(SHAR) X $(SHAR) : $(SHFILES) X shar $(SHFILES) >$@ X SHAR_EOF chmod 0600 Makefile || echo 'restore of Makefile failed' Wc_c="`wc -c < 'Makefile'`" test 1307 -eq "$Wc_c" || echo 'Makefile: original size 1307, current size' "$Wc_c" fi # ============= filecheck.c ============== if test -f 'filecheck.c' -a X"$1" != X"-c"; then echo 'x - skipping filecheck.c (File already exists)' else echo 'x - extracting filecheck.c (Text)' sed 's/^X//' << 'SHAR_EOF' > 'filecheck.c' && /* X * filecheck - check ownership/permissions of a set of files X * X * A list of file specifications is read, one specification per line, and X * check given by the specification is performed. If the check fails, a X * message is printed to stdout. If no failures occur, this program X * terminates with a zero exit status, otherwize nonzero if any checks failed. X * X * A specification is in the following format: X * X * pathname [!]key-list uid-list gid-list perms X * X * pathname Full pathname of the file to check. X * X * key-list A list of keys, seperated by colons, to which this spec X * applies. The key is specified by the "-k" command line X * options, or "all" if none given. If the given key is X * contained in the key-list, then this spec is checked. If the X * given key does not match then this specification is ignored. X * X * For example, if the specification contains a key-list of X * "xenix:usg" and we run "filecheck -k xenix", then the spec X * will be checked. If we run "filecheck -k sun" then the spec X * will be ignored. X * X * If the given key is "all" (or none is specified since this is X * the default), then all specifications are checked. If the X * key-list for a specification contains "all", then it will be X * checked regardless of the key given on the command line. X * X * If a "!" appears at the front of the key-list, then a X * complaint will be issued if the file specified by "pathname" X * does not exist. Otherwise, if the file does not exist the X * specification is ignored. X * X * uid-list A colon delimited list of user names. If the file is not X * owned by a user in this list, then a complaint is generated. X * If the value of this field is "-" then the user ownership X * check is suppressed. X * X * gid-list A colon delimited list of group names. If the file is not X * owned by a group in this list, then a complaint is generated. X * If the value of this field is "-" then the group ownership X * check is suppressed. X * X * perms A maximum set of permissions which this file should have. X * For example, if the specification says "755" and the X * file is actually "555" then it is OK. However, if the X * file is actually "775" then a complaint will be issued X * because the group write privilge is enabled. If the value X * of this field is "-" then the permissions check is suppressed. X */ X #include <stdio.h> #include <string.h> #include <sys/types.h> #include <sys/stat.h> #include <pwd.h> #include <grp.h> X #define USAGE "usage: [-k key] [file]\n" X #define TRUE 1 #define FALSE 0 X int check_key(); int check_uid(); int check_gid(); int check_perms(); X extern struct passwd *getpwnam(), *getpwuid(); extern struct group *getgrnam(), *getgrgid(); long strtol(); X main(argc, argv) int argc; char *argv[]; { X char *f_pathname, *f_key, *f_uname, *f_gname, *f_perms; X char buf[512], *selkey; X int must_exist, status, lineno, i; X struct stat sbuf; X extern int optind; X extern char *optarg; X X selkey = "all"; X while ((i = getopt(argc, argv, "k:")) != EOF) { X switch (i) { X case 'k': X selkey = optarg; X break; X default: X fprintf(stderr, USAGE, argv[0]); X exit(1); X } X } X X switch (argc-optind) { X case 0: X break; X case 1: X if (freopen(argv[optind], "r", stdin) == NULL) { X perror(argv[optind]); X exit(1); X } X break; X default: X fprintf(stderr, USAGE, argv[0]); X exit(1); X } X X lineno = 0; X status = 0; X while (++lineno, fgets(buf, sizeof(buf), stdin) != NULL) { X X /* X * Break up the line. Skip comments and blank lines. X */ X if ((f_pathname = strtok(buf, " \t\n")) == NULL || *f_pathname == '#' ) X continue; X if ( X (f_key = strtok((char *)NULL, " \t\n")) == NULL || X (f_uname = strtok((char *)NULL, " \t\n")) == NULL || X (f_gname = strtok((char *)NULL, " \t\n")) == NULL || X (f_perms = strtok((char *)NULL, " \t\n")) == NULL || X strtok((char *)NULL, " \t\n") != NULL X ) { X printf("%s(%d): bad line ignored\n", f_pathname, lineno); X status = 1; X continue; X } X X /* X * See if we want to insist that this file exists. X */ X must_exist = (*f_key == '!'); X if (must_exist) X ++f_key; X X /* X * See if we want to do this entry. X */ X if (!check_key(selkey, f_key)) X continue; X X /* X * Get info on this file. X */ X if (stat(f_pathname, &sbuf) != 0) { X if (must_exist) { X fprintf(stderr, "%s: could not access file\n", f_pathname); X status = 1; X } X continue; X } X X /* X * Perform checks. X */ X if (!check_uid(f_pathname, f_uname, &sbuf)) X status = 1; X if (!check_gid(f_pathname, f_gname, &sbuf)) X status = 1; X if (!check_perms(f_pathname, f_perms, &sbuf)) X status = 1; X X } X X exit(status); X /*NOTREACHED*/ } X X int check_key(key, klist) char *key, *klist; { X char *k; X if (key == NULL || klist == NULL || strcmp("all", key) == 0) X return TRUE; X while ((k = strtok(klist, ": \t\n")) != NULL) { X if (strcmp(k, key) == 0 || strcmp(k, "all") == 0) X return TRUE; X klist = NULL; X } X return FALSE; } X X int check_uid(fname, ulist, s) char *fname; char *ulist; struct stat *s; { X struct passwd *pw; X char buf[256]; X char *up, *u; X X if (strcmp(ulist, "-") == 0) X return TRUE; X up = strcpy(buf, ulist); X while ((u = strtok(up, ": \t\n")) != NULL) { X if ((pw = getpwnam(u)) != NULL && s->st_uid == pw->pw_uid) X return TRUE; X up = NULL; X } X pw = getpwuid(s->st_uid); X printf("%s: uid is %s(%d), expected %s\n", X fname, (pw == NULL ? "<unknown>" : pw->pw_name), s->st_uid, ulist); X return FALSE; } X X int check_gid(fname, glist, s) char *fname; char *glist; struct stat *s; { X struct group *gr; X char buf[256]; X char *gp, *g; X X if (strcmp(glist, "-") == 0) X return TRUE; X gp = strcpy(buf, glist); X while ((g = strtok(gp, ": \t\n")) != NULL) { X if ((gr = getgrnam(g)) != NULL && s->st_gid == gr->gr_gid) X return TRUE; X gp = NULL; X } X gr = getgrgid(s->st_gid); X printf("%s: gid is %s(%d), expected %s\n", X fname, (gr == NULL ? "<unknown>" : gr->gr_name), s->st_gid, glist); X return FALSE; } X X int check_perms(fname, perms, s) char *fname; char *perms; struct stat *s; { X int perms_want, perms_act; X X if (strcmp(perms, "-") == 0) X return TRUE; X perms_want = (int) strtol(perms, (char *)NULL, 8); X perms_act = s->st_mode & 07777; X if ((perms_act & perms_want) == perms_act) X return TRUE; X X printf("%s: permissions are %04o, should be at least %04o\n", X fname, perms_act, perms_want); X return FALSE; } X SHAR_EOF chmod 0600 filecheck.c || echo 'restore of filecheck.c failed' Wc_c="`wc -c < 'filecheck.c'`" test 6411 -eq "$Wc_c" || echo 'filecheck.c: original size 6411, current size' "$Wc_c" fi # ============= uucp.chk ============== if test -f 'uucp.chk' -a X"$1" != X"-c"; then echo 'x - skipping uucp.chk (File already exists)' else echo 'x - extracting uucp.chk (Text)' sed 's/^X//' << 'SHAR_EOF' > 'uucp.chk' && : X # # site-specific customizations # # OK_DIRS Colon-delimited list of directories uucp accounts are # allowed to access. # # OK_CMDS Colon-delimited list of commands uucp accounts are allowed # to execute. # X OK_DIRS="/tmp:/usr/tmp:/usr/spool/uucppublic" OK_CMDS="rmail:rnews:lp:who:uucp:rsmtp:rcsmtp" X # if [ -f /usr/lib/uucp/Systems ] ; then if [ -f /etc/uucp/Systems ] ; then X uutype=bnu elif [ -f /usr/lib/uucp/L.sys ] ; then X uutype=v2 else X echo "$0: cannot figure out type of uucp system" 1>&2 X exit 1 fi X # # If "uucheck" is available then run it. # if [ -x /usr/lib/uucp/uucheck ] ; then X /usr/lib/uucp/uucheck fi X # # Check the file permissions. # ./filecheck -k $uutype ./uufiles.list X # # Various checks specific to BNU uucp. # if [ $uutype = bnu ] ; then X X # X # "remote.unknown" must be executable to prevent unknown machines X # from logging in. X # X if [ ! -x /usr/lib/uucp/remote.unknown ] ; then X echo "warning - no executable 'remote.unknown' - unknown machine logins allowed" X fi X X # X # ".Admin/foreign" must be writable for login attempts by unknown X # machines to be logged. X # X cd /usr/spool/uucp/.Admin X if [ -f foreign ] ; then X set X `ls -l foreign` X perms="$2" X owner="$4" X if [ "$owner" != "uucp" ] ; then X echo "warning - .Admin/foreign is not owned by uucp" X fi X case "$perms" in X -?w???????) X ;; X *) X echo "warning - .Admin/foreign is not writable by uucp" X ;; X esac X case "$perms" in X -??????r??) X echo "warning - .Admin/foreign is readable by world" X ;; X esac X else X su uucp -c 'echo testing > foreign' 2>/dev/null X if [ -f foreign ] ; then X rm foreign X else X echo "warning - .Admin/foreign cannot be created by uucp" X fi X fi fi X # # Check access permissions granted (BNU). # if [ -f /usr/lib/uucp/Permissions ] ; then X awk ' X X $1 ~ /^#/ { rec = "" ; next } X X { X for ( i = 1 ; i <= NF ; ++i ) { X if ( substr($i,1,8) == "MACHINE=" ) { X rec = rec " " $i X continue X } X if ( substr($i,1,8) == "LOGNAME=" ) { X rec = rec " " $i X continue X } X if ( substr($i,1,5) == "READ=" ) { X mode = "read" X n = split(substr($i,6,9999), x, ":") X n_ok = split(OK_DIRS, ok, ":") X } else if ( substr($i,1,6) == "WRITE=" ) { X mode = "write" X n = split(substr($i,7,9999), x, ":") X n_ok = split(OK_DIRS, ok, ":") X } else if ( substr($i,1,9) == "COMMANDS=" ) { X mode = "execute" X n = split(substr($i,10,9999), x, ":") X n_ok = split(OK_CMDS, ok, ":") X } else { X continue X } X for ( j = 1 ; j <= n ; ++j ) { X for ( k = 1 ; k <= n_ok && x[j] != ok[k] ; ++k ) X ; X if ( k > n_ok ) X printf("warning - Permissions grants %s access to \"%s\" for%s\n", mode, x[j], rec) X } X } X } X X $NF != "\\" { rec = "" } X X ' OK_DIRS="$OK_DIRS" OK_CMDS="$OK_CMDS" /usr/lib/uucp/Permissions fi X # # Check access permissions granted (V2). # # Important note - there are so many freaking variants of how to # obtain default username/machine info from USERFILE, that I just # punted here. Unfortunately, USERFILE is a gawdawful wretched # mess (the best reason for BNU existing IMHO), so one could argue # that these checks are the most important things this could do. # if [ -f /usr/lib/uucp/USERFILE ] ; then X X awk ' X X BEGIN { X num_ok_dirs = split(OK_DIRS, ok_dir, ":") X } X X $1 ~ /^#/ { rec = "" ; next } X X { X if ( $2 == "c" ) # skip callback flag X j = 2 X else X j = 1 X while ( ++j <= NF ) { X for ( k = 1 ; k <= num_ok_dirs && ok_dir[k] != $j ; ++k ) X ; X if ( k > num_ok_dirs ) X printf("warning - USERFILE grants access to \"%s\" for %s\n", $j, $1) X } X } X X ' OK_DIRS="$OK_DIRS" /usr/lib/uucp/USERFILE X fi X # # Check execute permissions granted (V2). # cd /usr/lib/uucp for file in L.cmds L-cmds uuxqtcmds ; do X if [ -f $file ] ; then X awk ' X BEGIN { num_ok_cmds = split(OK_CMDS, ok_cmd, ":") } X $1 ~ /^PATH=/ { next } X { X for ( i = 1 ; i <= num_ok_cmds && ok_cmd[i] != $0 ; ++i ) X ; X if ( i > num_ok_cmds ) X printf("warning - %s grants execute access to \"%s\"\n", FILENAME, $0) X } X ' OK_CMDS="$OK_CMDS" $file X fi done X Xexit 0 X SHAR_EOF chmod 0700 uucp.chk || echo 'restore of uucp.chk failed' Wc_c="`wc -c < 'uucp.chk'`" test 4080 -eq "$Wc_c" || echo 'uucp.chk: original size 4080, current size' "$Wc_c" fi # ============= uufiles.list ============== if test -f 'uufiles.list' -a X"$1" != X"-c"; then echo 'x - skipping uufiles.list (File already exists)' else echo 'x - extracting uufiles.list (Text)' sed 's/^X//' << 'SHAR_EOF' > 'uufiles.list' && X # # file key user group perms # X /usr/bin/uucp !all uucp uucp:daemon 4111 /usr/bin/cu !all uucp uucp:daemon 4111 /usr/bin/uudecode all - - 755 /usr/bin/uuencode all - - 755 /usr/bin/uuname !all uucp uucp:daemon 4111 /usr/bin/uusend all - - 755 /usr/bin/uustat !all uucp uucp:daemon 4111 /usr/bin/uuto all - - 755 /usr/bin/uux !all uucp uucp:daemon 4111 X /usr/lib/uucp !all uucp uucp:daemon 755 /usr/lib/uucp/.XQTDIR !v2 uucp uucp:daemon 555 /usr/lib/uucp/Devices !bnu uucp uucp:daemon 640 /usr/lib/uucp/Dialcodes !bnu uucp uucp:daemon 640 /usr/lib/uucp/Dialers !bnu uucp uucp:daemon 640 /usr/lib/uucp/FWDFILE v2 uucp uucp:daemon 640 /usr/lib/uucp/L-cmds v2 uucp uucp:daemon 640 /usr/lib/uucp/L-devices !v2 uucp uucp:daemon 640 /usr/lib/uucp/L-dialcodes !v2 uucp uucp:daemon 640 /usr/lib/uucp/L.cmds v2 uucp uucp:daemon 640 /usr/lib/uucp/L.sys !v2 uucp uucp:daemon 640 /usr/lib/uucp/L_stat v2 uucp uucp:daemon 644 /usr/lib/uucp/L_sub v2 uucp uucp:daemon 644 /usr/lib/uucp/Maxuuscheds !bnu uucp uucp:daemon 644 /usr/lib/uucp/Maxuuxqts !bnu uucp uucp:daemon 644 /usr/lib/uucp/ORIGFILE v2 uucp uucp:daemon 640 /usr/lib/uucp/Permissions !bnu uucp uucp:daemon 640 /usr/lib/uucp/Poll !bnu uucp uucp:daemon 644 /usr/lib/uucp/SEQF v2 uucp uucp:daemon 640 /usr/lib/uucp/SQFILE v2 uucp uucp:daemon 640 /usr/lib/uucp/Systems !bnu uucp uucp:daemon 640 /usr/lib/uucp/USERFILE !v2 uucp uucp:daemon 640 /usr/lib/uucp/remote.unknown !bnu uucp uucp:daemon 755 /usr/lib/uucp/uucheck all uucp uucp:daemon 110 /usr/lib/uucp/uucico !all uucp uucp:daemon 4111 /usr/lib/uucp/uuclean all uucp uucp:daemon 4110 /usr/lib/uucp/uucleanup bnu uucp uucp:daemon 110 /usr/lib/uucp/uudemon.admin bnu uucp uucp:daemon 555 /usr/lib/uucp/uudemon.clean bnu uucp uucp:daemon 555 /usr/lib/uucp/uudemon.day bnu uucp uucp:daemon 500 /usr/lib/uucp/uudemon.hour bnu uucp uucp:daemon 555 /usr/lib/uucp/uudemon.hr v2 uucp uucp:daemon 500 /usr/lib/uucp/uudemon.poll bnu uucp uucp:daemon 555 /usr/lib/uucp/uudemon.wk v2 uucp uucp:daemon 500 /usr/lib/uucp/uulog all uucp uucp:daemon 555 /usr/lib/uucp/uupick all uucp uucp:daemon 555 /usr/lib/uucp/uusched !bnu uucp uucp:daemon 4111 /usr/lib/uucp/uusub all uucp uucp:daemon 755 /usr/lib/uucp/uuto all uucp uucp:daemon 555 /usr/lib/uucp/uutry all uucp uucp:daemon 755 /usr/lib/uucp/uuxqt !all uucp uucp:daemon 4111 /usr/lib/uucp/uuxqtcmds v2 uucp uucp:daemon 640 X /usr/spool/uucp !all uucp uucp:daemon 775 /usr/spool/uucp/.Admin !bnu uucp uucp:daemon 775 /usr/spool/uucp/.Admin/audit bnu uucp uucp:daemon 660 /usr/spool/uucp/.Admin/errors bnu uucp uucp:daemon 660 /usr/spool/uucp/.Admin/foreign bnu uucp uucp:daemon 660 /usr/spool/uucp/.Corrupt !bnu uucp uucp:daemon 775 /usr/spool/uucp/.Log !bnu uucp uucp:daemon 775 /usr/spool/uucp/.Old !bnu uucp uucp:daemon 775 /usr/spool/uucp/.Sequence !bnu uucp uucp:daemon 775 /usr/spool/uucp/.Status !bnu uucp uucp:daemon 775 /usr/spool/uucp/.Workspace !bnu uucp uucp:daemon 775 /usr/spool/uucp/.Xqtdir !bnu uucp uucp:daemon 775 /usr/spool/uucp/ERRLOG v2 uucp uucp:daemon 644 /usr/spool/uucp/LOGFILE v2 uucp uucp:daemon 664 /usr/spool/uucp/SYSLOG v2 uucp uucp:daemon 664 X SHAR_EOF chmod 0600 uufiles.list || echo 'restore of uufiles.list failed' Wc_c="`wc -c < 'uufiles.list'`" test 3236 -eq "$Wc_c" || echo 'uufiles.list: original size 3236, current size' "$Wc_c" fi exit 0