#include "uucp.h" #include "uucpdefs.h" #include #include #include #define APPCMD(d) {\ char *p;\ for (p = d; *p != '\0';) *cmdp++ = *p++;\ *cmdp++ = ' ';\ *cmdp = '\0';} /* * uuxqt will execute commands set up by a uux command, * usually from a remote machine - set by uucp. */ char *Cmds[] = { "mail", "rmail", "lpr", "opr", "fsend", "fget", NULL }; #define CMDOK(a, b) cmdok(a,b) #define PATH "PATH=/bin:/usr/bin;" /* to remove restrictions from uuxqt * redefine CMDOK 0 * * to add allowable commands, add to the list under Cmds[] */ main(argc, argv) char *argv[]; { char xcmd[100]; int cmdnok; char xfile[MAXFULLNAME], user[10], buf[BUFSIZ]; char lbuf[30]; char cfile[NAMESIZE], dfile[MAXFULLNAME]; char file[NAMESIZE]; char fin[MAXFULLNAME], sysout[NAMESIZE], fout[MAXFULLNAME]; FILE *xfp, *dfp, *fp; char path[MAXFULLNAME]; char cmd[BUFSIZ]; char *cmdp, prm[MAXFULLNAME], *ptr; char *getprm(); int uid, ret; int stcico = 0; Debug = 0; Ofn = 1; Ifn = 0; while (argc>1 && argv[1][0] == '-') { switch(argv[1][1]){ case 'x': Debug = atoi(&argv[1][2]); if (Debug <= 0) Debug = 1; break; default: sprintf(stderr, "unknown flag %s\n", argv[1]); break; } --argc; argv++; } DEBUG(4, "\n\n** %s **\n", "START"); chdir(Spool); strcpy(Wrkdir, Spool); uid = getuid(); guinfo(uid, User, path); DEBUG(4, "User - %s\n", User); if (ulockf(X_LOCK, X_LOCKTIME) != 0) exit(0); DEBUG(4, "process %s\n", ""); while (gtxfile(xfile) > 0) { DEBUG(4, "xfile - %s\n", xfile); xfp = fopen(xfile, "r"); ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile); /* initialize to default */ strcpy(user, User); strcpy(fin, "/dev/null"); strcpy(fout, "/dev/null"); sprintf(sysout, "%.7s", Myname); while (fgets(buf, BUFSIZ, xfp) != NULL) { switch (buf[0]) { case X_USER: sscanf(&buf[1], "%s%s", user, Rmtname); break; case X_STDIN: sscanf(&buf[1], "%s", fin); expfile(fin); break; case X_STDOUT: sscanf(&buf[1], "%s%s", fout, sysout); sysout[7] = '\0'; if (fout[0] != '~' || prefix(sysout, Myname)) expfile(fout); break; case X_CMD: strcpy(cmd, &buf[2]); if (*(cmd + strlen(cmd) - 1) == '\n') *(cmd + strlen(cmd) - 1) = '\0'; break; default: break; } } fclose(xfp); DEBUG(4, "fin - %s, ", fin); DEBUG(4, "fout - %s, ", fout); DEBUG(4, "sysout - %s, ", sysout); DEBUG(4, "user - %s\n", user); DEBUG(4, "cmd - %s\n", cmd); /* command execution */ if (strcmp(fout, "/dev/null") == SAME) strcpy(dfile,"/dev/null"); else gename(DATAPRE, sysout, 'O', dfile); /* expand file names where necessary */ expfile(dfile); strcpy(buf, PATH); cmdp = buf + strlen(buf); ptr = cmd; xcmd[0] = '\0'; cmdnok = 0; while ((ptr = getprm(ptr, prm)) != NULL) { if (prm[0] == ';' || prm[0] == '^' || prm[0] == '|') { xcmd[0] = '\0'; APPCMD(prm); continue; } if ((cmdnok = CMDOK(xcmd, prm)) != 0) /* command not valid */ break; if (prm[0] == '~') expfile(prm); APPCMD(prm); } if (cmdnok) { sprintf(lbuf, "%s XQT DENIED", user); logent(cmd, lbuf); DEBUG(4, "bad command %s\n", prm); goto rmfiles; } sprintf(lbuf, "%s XQT", user); logent(buf, lbuf); DEBUG(4, "cmd %s\n", buf); mvxfiles(xfile); chdir(XQTDIR); ret = shio(buf, fin, dfile, user); DEBUG(4, "exit cmd - %d\n", ret); chdir(Spool); rmxfiles(xfile); if (ret != 0) { /* exit status not zero */ dfp = fopen(dfile, "a"); ASSERT(dfp != NULL, "CAN'T OPEN %s", dfile); fprintf(dfp, "exit status %d", ret); fclose(dfp); } if (strcmp(fout, "/dev/null") != SAME) { if (prefix(sysout, Myname)) { xmv(dfile, fout); } else { gename(CMDPRE, sysout, 'O', cfile); fp = fopen(cfile, "w"); ASSERT(fp != NULL, "OPEN %s", cfile); chmod(cfile, 0666); fprintf(fp, "S %s %s %s - %s 0666\n", dfile, fout, user, lastpart(dfile)); fclose(fp); } } rmfiles: xfp = fopen(xfile, "r"); ASSERT(xfp != NULL, "CAN'T OPEN %s", xfile); while (fgets(buf, BUFSIZ, xfp) != NULL) { if (buf[0] != X_RQDFILE) continue; sscanf(&buf[1], "%s", file); unlink(file); } unlink(xfile); } if (stcico) xuucico(""); cleanup(0); } cleanup(code) int code; { logcls(); rmlock(NULL); exit(code); } /******* * gtxfile(file) get a file to execute * char *file; * * return codes: 0 - no file | 1 - file to execute */ gtxfile(file) char *file; { static FILE *pdir; char pre[2]; if (pdir == NULL) { pdir = fopen(Spool, "r"); ASSERT(pdir != NULL, "GTXFILE CAN'T OPEN %s", Spool); } pre[0] = XQTPRE; pre[1] = '\0'; while (gnamef(pdir, file) != 0) { DEBUG(4, "file - %s\n", file); if (!prefix(pre, file)) continue; if (gotfiles(file)) /* return file to execute */ return(1); } fclose(pdir); return(0); } /*** * gotfiles(file) check for needed files * char *file; * * return codes: 0 - not ready | 1 - all files ready */ gotfiles(file) char *file; { struct stat stbuf; FILE *fp; char buf[BUFSIZ], rqfile[MAXFULLNAME]; fp = fopen(file, "r"); if (fp == NULL) return(0); while (fgets(buf, BUFSIZ, fp) != NULL) { DEBUG(4, "%s\n", buf); if (buf[0] != X_RQDFILE) continue; sscanf(&buf[1], "%s", rqfile); expfile(rqfile); if (stat(rqfile, &stbuf) == -1) { fclose(fp); return(0); } } fclose(fp); return(1); } /*** * rmxfiles(xfile) remove execute files to x-directory * char *xfile; * * return codes - none */ rmxfiles(xfile) char *xfile; { FILE *fp; char buf[BUFSIZ], file[NAMESIZE], tfile[NAMESIZE]; char tfull[MAXFULLNAME]; if((fp = fopen(xfile, "r")) == NULL) return; while (fgets(buf, BUFSIZ, fp) != NULL) { if (buf[0] != X_RQDFILE) continue; if (sscanf(&buf[1], "%s%s", file, tfile) < 2) continue; sprintf(tfull, "%s/%s", XQTDIR, tfile); unlink(tfull); } fclose(fp); return; } /*** * mvxfiles(xfile) move execute files to x-directory * char *xfile; * * return codes - none */ mvxfiles(xfile) char *xfile; { FILE *fp; char buf[BUFSIZ], ffile[MAXFULLNAME], tfile[NAMESIZE]; char tfull[MAXFULLNAME]; int ret; if((fp = fopen(xfile, "r")) == NULL) return; while (fgets(buf, BUFSIZ, fp) != NULL) { if (buf[0] != X_RQDFILE) continue; if (sscanf(&buf[1], "%s%s", ffile, tfile) < 2) continue; expfile(ffile); sprintf(tfull, "%s/%s", XQTDIR, tfile); unlink(tfull); ret = link(ffile, tfull); ASSERT(ret == 0, "LINK RET-%d", ret); unlink(ffile); } fclose(fp); return; } /*** * cmdok(xc, cmd) check for valid command * char *xc, *cmd; * * return 0 - ok | 1 nok */ cmdok(xc, cmd) char *xc, *cmd; { char **ptr; if (xc[0] != '\0') return(0); ptr = Cmds; while(*ptr != NULL) { DEBUG(4, "cmd %s, ", cmd); DEBUG(4, "ptr %s\n", *ptr); if (strcmp(cmd, *ptr) == SAME) break; ptr++; } if (*ptr == NULL) return(1); strcpy(xc, cmd); return(0); }