Annotation of researchv10no/cmd/netnews/src/control.c, revision 1.1

1.1     ! root        1: /*
        !             2:  * Control message handling code.  Deal with messages which are to be
        !             3:  * acted on by netnews itself rather than by people.
        !             4:  *
        !             5:  * See defs.h "news_version" for the real version of netnews.
        !             6:  */
        !             7: 
        !             8: static char *SccsId = "@(#)control.c   2.20    6/24/83 (this is NOT the netnews version!)";
        !             9: 
        !            10: #include "iparams.h"
        !            11: 
        !            12: #define eq(msg) (strcmp(msg, cargv[0]) == 0)
        !            13: 
        !            14: int cargc;
        !            15: char **cargv;
        !            16: 
        !            17: FILE *hfopen();
        !            18: FILE *popen(), *mhopen(), *mailhdr();
        !            19: 
        !            20: char *senderof();
        !            21: 
        !            22: control(h)
        !            23: struct hbuf *h;
        !            24: {
        !            25:        register char *ctlmsgtext;
        !            26:        int i;
        !            27: 
        !            28:        if (*h->ctlmsg)
        !            29:                ctlmsgtext = h->ctlmsg;
        !            30:        else
        !            31:                ctlmsgtext = h->title;
        !            32:        log("Ctl Msg %s from %s: %s", h->nbuf, h->path, ctlmsgtext);
        !            33:        /*
        !            34:         * Control messages have the standard format
        !            35:         *      command [args]
        !            36:         * much like shell commands.  Each site has the option
        !            37:         * of customizing this code to deal with control messages
        !            38:         * as they see fit, but we would like to buy back the
        !            39:         * code, ifdeffed or otherwise parameterized, to simplify
        !            40:         * the maintenence issues.
        !            41:         */
        !            42:        argparse(ctlmsgtext);
        !            43:        
        !            44:        if (eq("ihave"))
        !            45:                c_ihave(cargc, cargv);
        !            46:        else if (eq("sendme"))
        !            47:                c_sendme(cargc, cargv);
        !            48:        else if (eq("newgroup"))
        !            49:                c_newgroup(cargc, cargv);
        !            50:        else if (eq("rmgroup"))
        !            51:                c_rmgroup(cargc, cargv);
        !            52:        else if (eq("cancel"))
        !            53:                c_cancel(cargc, cargv);
        !            54:        else if (eq("sendsys"))
        !            55:                c_sendsys(cargc, cargv);
        !            56:        else if (eq("senduuname"))
        !            57:                c_senduuname(cargc, cargv);
        !            58:        else if (eq("version"))
        !            59:                c_version(cargc, cargv);
        !            60:        else if (eq("delsub"))
        !            61:                c_unimp(cargc, cargv);
        !            62:        else
        !            63:                c_unknown(h, ctlmsgtext);
        !            64: }
        !            65: 
        !            66: /*
        !            67:  * Parse the string str into separate words in cargc and cargv
        !            68:  * as per the usual UNIX convention.  Nothing fancy here, just
        !            69:  * blanks and tabs separating words.
        !            70:  */
        !            71: argparse(str)
        !            72: char *str;
        !            73: {
        !            74:        static char *cavpbuf[20];
        !            75:        static char cavbuf[256];
        !            76:        char *nextfree = cavbuf;
        !            77: 
        !            78:        if (str == 0)
        !            79:                xerror("Control message %s has no title", header.ident);
        !            80:        cargc = 0;
        !            81:        cargv = cavpbuf;
        !            82:        cargv[0] = cavbuf;
        !            83: 
        !            84:        while (*str) {
        !            85:                if (*str <= ' ') {
        !            86:                        *nextfree++ = 0;
        !            87:                        cargc++;
        !            88:                        cargv[cargc] = nextfree;
        !            89:                        /* skip over white space */
        !            90:                        while (*str > 0 && *str <= ' ')
        !            91:                                str++;
        !            92:                        if (*str == 0)  /* line ends in white space */
        !            93:                                return;
        !            94:                } else
        !            95:                        *nextfree++ = *str++;
        !            96:        }
        !            97: }
        !            98: 
        !            99: /*
        !           100:  * ihave <artid> <remotesys>
        !           101:  * The other system is telling you it has article <artid>, in case
        !           102:  * you decide you want it to transmit it to you.
        !           103:  */
        !           104: c_ihave(argc, argv)
        !           105: char **argv;
        !           106: {
        !           107:        char tl[256], ng[256];
        !           108: 
        !           109:        /*
        !           110:         * Check that we haven't already seen it (history)
        !           111:         * and then send back a "sendme" message if we subscribe.
        !           112:         */
        !           113:        if (history(argv[1]) == 0) {
        !           114:                /* Should probably check SUBFILE and NGFILE here. */
        !           115:                sprintf(tl, "sendme %s %s", argv[1], SYSNAME);
        !           116:                sprintf(ng, "to.%s.ctl", argv[2]);
        !           117:                xmitmsg(argv[2], tl, ng);
        !           118:        }
        !           119: }
        !           120: 
        !           121: /*
        !           122:  * sendme <artid> ... <remotesys>
        !           123:  * The other system wants me to send him article <artid>.
        !           124:  */
        !           125: c_sendme(argc, argv)
        !           126: char **argv;
        !           127: {
        !           128:        struct srec srec;
        !           129:        int i;
        !           130:        FILE *fp;
        !           131: 
        !           132:        /* Find the sys record */
        !           133:        s_openr();
        !           134:        while (s_read(&srec)) {
        !           135:                if (strncmp(srec.s_name, argv[argc-1], SNLN))
        !           136:                        continue;
        !           137:                /* It's the right one.  Send them. */
        !           138:                for (i=1; i<argc-1; i++) {
        !           139:                        /* transmit checks that other sys subscribes. */
        !           140:                        fp = hfopen(argv[i]);
        !           141:                        transmit(&srec, fp, 0);
        !           142:                        /* transmit does fclose(fp) */
        !           143:                }
        !           144:                return;
        !           145:        }
        !           146:        sprintf(bfr, "Cannot find system %s to send article %s to.",
        !           147:                argv[argc-1], argv[1]);
        !           148:        xerror(bfr);
        !           149: }
        !           150: 
        !           151: /*
        !           152:  * newgroup <groupname>
        !           153:  * A new newsgroup has been created.
        !           154:  * The body of the article, if present, is a description of the
        !           155:  * purpose of the newsgroup.
        !           156:  *
        !           157:  * Site dependent.  Should make very sure the directory has been
        !           158:  * created and properly owned.  Might want to update ngfile.
        !           159:  * Might want to notify the contact person for this installation.
        !           160:  * Default action is to create the newsgroup, if it doesn't already
        !           161:  * exist.
        !           162:  */
        !           163: c_newgroup(argc, argv)
        !           164: char **argv;
        !           165: {
        !           166:        FILE *fd;
        !           167:        strcpy(bfr, dirname(argv[1]));
        !           168:        if (access(bfr, 0) == 0)
        !           169:                return;
        !           170: 
        !           171:        mknewsg(bfr, argv[1]);
        !           172: 
        !           173:        /* update ngfile */
        !           174:        fd = fopen(NGFILE, "a");
        !           175:        fprintf(fd, "%s\n", argv[1]);
        !           176:        fclose(fd);
        !           177: 
        !           178: #ifdef NOTIFY
        !           179:        /*
        !           180:         * Sample code to notify the contact person.
        !           181:         * Probably should dig up the text of the article
        !           182:         * and enclose that, too.  It can be found in the
        !           183:         * file ARTICLE.  Also, there needs to be
        !           184:         * an automatic provision to help you add the newsgroup.
        !           185:         *
        !           186:         * Note that even if you take out the above call to mknewsg,
        !           187:         * the newsgroup will still be created by the first article
        !           188:         * that comes in on it by a different call to mknewsg in inews.c
        !           189:         * (But only if you have AUTONEWNG defined in defs.h, which we
        !           190:         * disrecommend.)
        !           191:         */
        !           192:        fd = mailhdr(NULL, "creation of new newsgroup");
        !           193:        if (fd != NULL) {
        !           194:                fprintf(fd, "\nA new newsgroup called '%s' has been created by %s.\n\n",
        !           195:                        argv[1], header.path);
        !           196:                mclose(fd);
        !           197:        }
        !           198: #endif
        !           199: }
        !           200: 
        !           201: /*
        !           202:  * rmgroup <groupname>
        !           203:  * An old newsgroup is being cancelled on a network wide basis.
        !           204:  */
        !           205: c_rmgroup(argc, argv)
        !           206: char **argv;
        !           207: {
        !           208:        FILE *fd;
        !           209:        char *groupname;
        !           210:        char groupdir[128];
        !           211:        int rc;
        !           212: 
        !           213:        groupname = argv[1];
        !           214:        verifyname(groupname);
        !           215:        if (groupname[0] == '.' || groupname[0] <= ' ')
        !           216:                xerror("Illegal group name in rmgroup");
        !           217: 
        !           218:        strcpy(groupdir, dirname(groupname));
        !           219:        if (access(groupdir, 0)) {
        !           220:                /*
        !           221:                 * If the group already is gone, it's a nonfatal error - we
        !           222:                 * want to propagate the message anyway, since what probably
        !           223:                 * happened is somebody locally already removed it.
        !           224:                 */
        !           225:                log("Cannot remove newsgroup '%s'", groupname);
        !           226:                return;
        !           227:        }
        !           228: #ifdef NOTIFY
        !           229:        fd = mailhdr(NULL, "rmgroup control message");
        !           230:        if (fd != NULL) {
        !           231: # ifndef MANUALLY
        !           232:                fprintf(fd, "\nA newsgroup called '%s' has been removed by %s.\n\n",
        !           233:                        argv[1], header.path);
        !           234: #  ifdef USG
        !           235:                fprintf(fd, "You may need to remove the directory %s by hand\n",
        !           236:                        dirname(argv[1]));
        !           237: #  endif
        !           238: # else
        !           239:                fprintf(fd, "\n%s has requested that newsgroup %s be removed.\n",
        !           240:                        header.path, argv[1]);
        !           241:                fprintf(fd, "You should remove it by hand\n");
        !           242: # endif
        !           243:                mclose(fd);
        !           244:        }
        !           245: #endif
        !           246: 
        !           247: #ifndef MANUALLY
        !           248:        /* We let the shell do all the work.  See the rmgrp shell script. */
        !           249:        setuid(geteuid());      /* otherwise it won't rmdir the dir */
        !           250:        sprintf(bfr, "rm -rf %s", groupdir);
        !           251:        rc = system(bfr); log("system(%s) status %d", bfr, rc);
        !           252:        sprintf(bfr, "cp %s /tmp/$$ ; sed '/^%s /d' </tmp/$$ > %s ; rm /tmp/$$",
        !           253:                ACTIVE, groupname, ACTIVE);
        !           254:        rc = system(bfr); log("system(%s) status %d", bfr, rc);
        !           255: #endif
        !           256: }
        !           257: 
        !           258: /*
        !           259:  * cancel <artid>
        !           260:  * Cancel the named article
        !           261:  */
        !           262: c_cancel(argc, argv)
        !           263: char **argv;
        !           264: {
        !           265:        char *line, *p, *q, *r, *s, *rr, *ss, *poster;
        !           266:        char *findhist();
        !           267:        register FILE *fp;
        !           268:        char whatsisname[150];
        !           269:        char msgbuf[256];
        !           270:        char msgng[64];
        !           271:        int su = 0;
        !           272: 
        !           273:        strcpy(whatsisname, senderof(&header));
        !           274:        strcpy(msgng, header.nbuf);
        !           275:        line = findhist(argv[1]);
        !           276:        if (line)
        !           277:                log("Cancelling %s", line);
        !           278:        else {
        !           279:                log("Can't cancel %s:  non-existent", argv[1]);
        !           280:                return;
        !           281:        }
        !           282: 
        !           283:        p = index(line, '\t');
        !           284:        p = index(p+1, '\t');
        !           285:        p++;
        !           286:        while (*p) {
        !           287:                q = index(p, ' ');
        !           288:                if (q)
        !           289:                        *q = 0;
        !           290:                strcpy(filename, dirname(p));
        !           291:                fp = xfopen(filename, "r");
        !           292:                if (hread(&header, fp, TRUE) == NULL)
        !           293:                        xerror("Article is garbled.\n");
        !           294:                fclose(fp);
        !           295:                if((uid==ROOTID||uid==0) && strncmp(msgng,"to.",3) == 0)
        !           296:                        su = 1;
        !           297:                poster = senderof(&header);
        !           298:                if (!su && strcmp(whatsisname, poster)) {
        !           299:                        sprintf(msgbuf, "Not contributor: posted by %s, and you are %s", poster, whatsisname);
        !           300:                        xerror(msgbuf);
        !           301:                }
        !           302: 
        !           303:                cancel();
        !           304:                p = q+1;
        !           305:        }
        !           306: }
        !           307: 
        !           308: /*
        !           309:  * sendsys     (no arguments)
        !           310:  *
        !           311:  * Mail the sys file to the person submitting the article.
        !           312:  * POLICY: the contents of your sys file are public information
        !           313:  * and as such, you should not change this code.  You may feel
        !           314:  * free to arrange for it to manually notify you, in the event
        !           315:  * that you want to do something to clean it up before it goes out.
        !           316:  * Secret sites on the net are expressly frowned on.
        !           317:  * 
        !           318:  * The purpose of this command is for making a network map.  The
        !           319:  * details of your link and which newsgroups are forwarded are not
        !           320:  * important, in case you want to sanitize them.  Since the definition
        !           321:  * of USENET is those sites getting net.general, you can disable this
        !           322:  * on sites not getting net articles, but if you take out the list of
        !           323:  * forwarded newsgroups, and you have sites that only get local newsgroups,
        !           324:  * you should make this clear, or remove those sites from what you send out.
        !           325:  */
        !           326: c_sendsys(argc, argv)
        !           327: char **argv;
        !           328: {
        !           329:        char buf[256];
        !           330:        FILE *f, *u;
        !           331:        int c;
        !           332: 
        !           333: #ifdef NOTIFY
        !           334:        f = mailhdr(NULL, "sendsys control message");
        !           335:        if (f != NULL) {
        !           336:                fprintf(f, "\n%s requested your sys file.\n", header.path);
        !           337:                fprintf(f, "It has been sent.\n");
        !           338:                mclose(f);
        !           339:        }
        !           340: #endif
        !           341:        f = mailhdr(&header, "Subject: response to your sendsys request\n\n");
        !           342:        u = fopen(SUBFILE, "r");
        !           343:        if (f != NULL && u != NULL) {
        !           344:                while ((c=getc(u)) != EOF)
        !           345:                        putc(c, f);
        !           346:                fclose(u);
        !           347:                mclose(f);
        !           348:        }
        !           349: }
        !           350: 
        !           351: /*
        !           352:  * senduuname  (no arguments)
        !           353:  *
        !           354:  * Run the "uuname" command and send it back to the person who submitted
        !           355:  * the article.  The purpose of this control message is for attempting to
        !           356:  * make a uucp net map.
        !           357:  *
        !           358:  * POLICY: If you view this information as not public (because you have
        !           359:  * a connection you consider secret, or know a site that considers itself
        !           360:  * secret) you can feel free to change this code in whatever way is
        !           361:  * appropriate, so long as it sends some response back to the sender.  If
        !           362:  * you don't run uucp, this code does not make sense, and so an error
        !           363:  * message (or garbage, such as "research") will be mailed back.
        !           364:  *
        !           365:  * If you wish to add or remove sites from the output of uuname, you
        !           366:  * may wish to use the euuname.sh shell script here.
        !           367:  */
        !           368: c_senduuname(argc, argv)
        !           369: char **argv;
        !           370: {
        !           371:        char buf[256];
        !           372:        FILE *fd, *u;
        !           373:        int c;
        !           374: 
        !           375: #ifdef NOTIFY
        !           376:        fd = mailhdr(NULL, "uuname control message");
        !           377:        fprintf(fd, "\n%s requested your uuname output\n", header.path);
        !           378:        mclose(fd);
        !           379: #endif
        !           380:        fd = mailhdr(&header, "response to your senduuname request");
        !           381: #ifdef UUPROG
        !           382:        if (UUPROG[0] == '/')
        !           383:                strcpy(buf, UUPROG);
        !           384:        else
        !           385:                sprintf(buf, "%s/%s", LIB, UUPROG);
        !           386: #else
        !           387:        strcpy(buf, "uuname");
        !           388: #endif
        !           389:        u = popen(buf, "r");
        !           390:        if (fd != NULL && u != NULL) {
        !           391:                while ((c=getc(u)) != EOF)
        !           392:                        putc(c, fd);
        !           393:                pclose(u);
        !           394:                mclose(fd);
        !           395:        }
        !           396: }
        !           397: 
        !           398: /*
        !           399:  * Send the version number to the right person.
        !           400:  */
        !           401: c_version(argc, argv)
        !           402: char **argv;
        !           403: {
        !           404:        FILE *f;
        !           405: 
        !           406:        f = mailhdr(&header, "Our news version");
        !           407:        if (f == NULL)
        !           408:                xerror("Cannot send back error message");
        !           409:        fprintf(f, "\nCurrently running news version %s.\n\n", news_version);
        !           410:        fprintf(f, "The header of your message follows:\n");
        !           411:        hwrite(&header, f);
        !           412:        mclose(f);
        !           413: }
        !           414: 
        !           415: /*
        !           416:  * An unknown control message has been received.
        !           417:  */
        !           418: c_unknown(h, ctlmsgtext)
        !           419: struct hbuf *h;
        !           420: char *ctlmsgtext;
        !           421: {
        !           422:        FILE *f;
        !           423: 
        !           424:        log("UNKNOWN Ctl Msg %s from %s", ctlmsgtext, h->path);
        !           425:        f = mailhdr(h, "Unrecognized Control Message");
        !           426:        if (f == NULL)
        !           427:                xerror("Cannot send back error message");
        !           428:        fprintf(f, "Currently running news B version %s.\n\n", news_version);
        !           429:        fprintf(f, "The header of the message follows:\n");
        !           430:        hwrite(h, f);
        !           431:        mclose(f);
        !           432: }
        !           433: 
        !           434: c_unimp(msg)
        !           435: char *msg;
        !           436: {
        !           437:        FILE *f;
        !           438:        char buf[256];
        !           439: 
        !           440:        f = mailhdr(&header, "Unimplemented Control Message");
        !           441:        if (f == NULL)
        !           442:                xerror("Cannot send back error message");
        !           443:        fprintf(f, "Currently running news B version %s.\n\n", news_version);
        !           444:        fprintf(f, "The header of the message follows:\n");
        !           445:        hwrite(&header, f);
        !           446:        mclose(f);
        !           447: }
        !           448: 
        !           449: xmitmsg(tosys, title, ng)
        !           450: char *tosys, *title, *ng;
        !           451: {
        !           452:        struct hbuf h;
        !           453:        struct srec srec;
        !           454:        FILE *tfp;
        !           455:        char *fname;
        !           456:        register int iu;
        !           457: 
        !           458:        /* Make an article called ARTICLE */
        !           459:        sprintf(h.from, "%s@%s%s", "usenet", FULLSYSNAME, MYDOMAIN);
        !           460:        strcpy(h.path, NEWSU);
        !           461:        strcpy(h.nbuf, ng);
        !           462:        strcpy(h.title, title);
        !           463:        strcpy(h.ctlmsg, title);
        !           464:        strcpy(h.subdate, "");
        !           465:        strcpy(h.recdate, "");
        !           466:        strcpy(h.expdate, "");
        !           467:        getident(&h);
        !           468:        dates(&h);
        !           469:        for (iu = 0; iu < NUNREC; iu++)
        !           470:                h.unrec[iu] = NULL;
        !           471:        tfp = xfopen(fname = mktemp("/tmp/xmsgXXXXXX"), "w");
        !           472:        hwrite(&h, tfp);
        !           473:        fclose(tfp);
        !           474: 
        !           475:        /* Find the sys record */
        !           476:        s_openr();
        !           477:        while (s_read(&srec)) {
        !           478:                if (strncmp(srec.s_name, tosys, SNLN))
        !           479:                        continue;
        !           480:                tfp = xfopen(fname, "r");
        !           481:                transmit(&srec, tfp, 0);
        !           482:                unlink(fname);
        !           483:                return;
        !           484:        }
        !           485:        log("Can't find sys record for %s", tosys);
        !           486:        xerror("Cannot find sys record");
        !           487: }
        !           488: 
        !           489: /*
        !           490:  * This is a modified version of popen, made more secure.  Rather than
        !           491:  * forking off a shell, you get a bare process.  You must have exactly
        !           492:  * one argument, and the command must be mail.
        !           493:  */
        !           494: /* @(#)popen.c 4.1 (Berkeley) 12/21/80 */
        !           495: #include <stdio.h>
        !           496: #include <signal.h>
        !           497: #define        RDR     0
        !           498: #define        WTR     1
        !           499: static int     mopen_pid[20];
        !           500: char *replyname();
        !           501: 
        !           502: FILE *
        !           503: mhopen(hptr)
        !           504: struct hbuf *hptr;
        !           505: {
        !           506:        int p[2];
        !           507:        register myside, hisside, pid;
        !           508:        char *sendto = NULL;
        !           509: 
        !           510:        if (hptr)
        !           511:                sendto = replyname(hptr);
        !           512:        else {
        !           513: #ifdef NOTIFY
        !           514:                if (TELLME && *TELLME)
        !           515:                        sendto = TELLME;
        !           516: #endif NOTIFY
        !           517:                if (sendto == NULL)
        !           518:                        return NULL;
        !           519:        }
        !           520:        verifyname(sendto);
        !           521:        if(pipe(p) < 0)
        !           522:                return NULL;
        !           523:        myside = p[WTR];
        !           524:        hisside = p[RDR];
        !           525:        if((pid = fork()) == 0) {
        !           526:                /* myside and hisside reverse roles in child */
        !           527:                close(myside);
        !           528:                close(0);
        !           529:                dup(hisside);
        !           530:                close(hisside);
        !           531:                execl("/bin/mail", "mail", sendto, 0);
        !           532:                execl("/usr/bin/mail", "mail", sendto, 0);
        !           533:                execl("/usr/ucb/mail", "mail", sendto, 0);
        !           534:                _exit(1);
        !           535:        }
        !           536:        if(pid == -1)
        !           537:                return NULL;
        !           538:        mopen_pid[myside] = pid;
        !           539:        close(hisside);
        !           540:        return(fdopen(myside, "w"));
        !           541: }
        !           542: 
        !           543: mclose(ptr)
        !           544: FILE *ptr;
        !           545: {
        !           546:        register f, r, (*hstat)(), (*istat)(), (*qstat)();
        !           547:        int status;
        !           548: 
        !           549:        f = fileno(ptr);
        !           550:        fclose(ptr);
        !           551:        istat = signal(SIGINT, SIG_IGN);
        !           552:        qstat = signal(SIGQUIT, SIG_IGN);
        !           553:        hstat = signal(SIGHUP, SIG_IGN);
        !           554:        while((r = wait(&status)) != mopen_pid[f] && r != -1)
        !           555:                ;
        !           556:        if(r == -1)
        !           557:                status = -1;
        !           558:        signal(SIGINT, istat);
        !           559:        signal(SIGQUIT, qstat);
        !           560:        signal(SIGHUP, hstat);
        !           561:        return(status);
        !           562: }
        !           563: 
        !           564: /*
        !           565:  * mhopen a pipe to mail, write out a std header, and return the file ptr.
        !           566:  *
        !           567:  * We don't include a From: field because this is probably uucp, i.e.
        !           568:  * explicitly routed.  Leave it up to the recipient's mailer.
        !           569:  * Always include the To: field because if we ge back failed mail, we
        !           570:  * might be able to deliver it by hand if we know to wom it was addressed.
        !           571:  * By convention, hptr==NULL means to send the message to the local contact person.
        !           572:  */
        !           573: FILE *
        !           574: mailhdr(hptr, subject)
        !           575: char  *subject;
        !           576: struct hbuf *hptr;
        !           577: {
        !           578:        FILE *fp;
        !           579:        time_t now;
        !           580:        char *to = "nobody";
        !           581: 
        !           582:        if (hptr)
        !           583:                to = replyname(hptr);
        !           584: #ifdef NOTIFY
        !           585:        if (TELLME && *TELLME)
        !           586:                to = TELLME;
        !           587: #endif NOTIFY
        !           588:        if ((fp = mhopen(hptr)) != NULL) {
        !           589:                time(&now);
        !           590:                fprintf(fp, "Date: %s\n", arpadate(&now));
        !           591:                fprintf(fp, "To: %s\n", to);
        !           592:                fprintf(fp, "Subject: %s\n", subject);
        !           593:                fprintf(fp, "Responding-System: %s%s\n", SYSNAME, MYDOMAIN);
        !           594:        }
        !           595:        return fp;
        !           596: }
        !           597: 
        !           598: /*
        !           599:  * verify that the name mail is being sent to does not contain any
        !           600:  * nasty hooks to invoke funny functions from the shell or the like.
        !           601:  */
        !           602: verifyname(sendto)
        !           603: char *sendto;
        !           604: {
        !           605:        /* Be sure we DO allow alphabetics, !, :, ., -, @. *. */
        !           606:        char *nasty = "\"'\\`^|;& <>/~";
        !           607:        register char *p;
        !           608: 
        !           609:        if (sendto[0] <= ' ') {
        !           610:                log("nasty mail name %s from %s", sendto, header.path);
        !           611:                xxit(1);
        !           612:        }
        !           613:        for (p=sendto; *p; p++) {
        !           614:                if (*p == ' ') {
        !           615:                        *p = 0;
        !           616:                        break;
        !           617:                }
        !           618:        }
        !           619:        while (*nasty) {
        !           620:                if (index(sendto, *nasty++)) {
        !           621:                        log("nasty mail name %s from %s", sendto, header.path);
        !           622:                        xxit(1);
        !           623:                }
        !           624:        }
        !           625:        for (nasty = sendto; (nasty = index(nasty, '.')) != NULL; ) {
        !           626:                if (*++nasty == '.') {  /* check for .. */
        !           627:                        log("nasty mail name %s from %s", sendto, header.path);
        !           628:                        xxit(1);
        !           629:                }
        !           630:        }
        !           631: }
        !           632: 
        !           633: /*
        !           634:  * Checks to make sure the control message is OK to post.
        !           635:  */
        !           636: ctlcheck()
        !           637: {
        !           638:        char msg[150];
        !           639:        char *p;
        !           640: 
        !           641:        if (!is_ctl)
        !           642:                return;
        !           643: 
        !           644:        if (header.ctlmsg[0])
        !           645:                strcpy(msg, header.ctlmsg);
        !           646:        else
        !           647:                strcpy(msg, header.title);
        !           648: 
        !           649:        p = index(msg, ' ');
        !           650:        if (p)
        !           651:                *p = 0;
        !           652:        
        !           653:        if (strcmp(msg, "ihave") == 0) {
        !           654:        } else if (strcmp(msg, "sendme") == 0) {
        !           655:                return; /* no restrictions */
        !           656:        } else if (strcmp(msg, "newgroup") == 0) {
        !           657:                suser();
        !           658:        } else if (strcmp(msg, "rmgroup") == 0) {
        !           659:                suser();
        !           660:                checkpass("mTDrcBCy..8Mk");
        !           661:        } else if (strcmp(msg, "sendsys") == 0) {
        !           662:                suser();
        !           663:        } else if (strcmp(msg, "senduuname") == 0) {
        !           664:                suser();
        !           665:        } else if (strcmp(msg, "version") == 0) {
        !           666:                return; /* no restrictions */
        !           667:        } else if (strcmp(msg, "cancel") == 0) {
        !           668:                return; /* no restrictions at this level */
        !           669:        } else if (strcmp(msg, "delsub") == 0) {
        !           670:                if (!prefix(header.nbuf, "to.")) {
        !           671:                        printf("Must be in a 'to.system' newsgroup.");
        !           672:                        xxit(0);
        !           673:                }
        !           674:                return;
        !           675:        } else {
        !           676:                printf("Unrecognized control message - %s\n", msg);
        !           677:                xxit(0);
        !           678:        }
        !           679: }
        !           680: 
        !           681: /* Make sure this guy is special. */
        !           682: suser()
        !           683: {
        !           684:        if (uid == 0)
        !           685:                return;
        !           686:        if (uid == ROOTID)
        !           687:                return;
        !           688:        /*
        !           689:         * We assume that since our real uid is the same as NEWSUSR
        !           690:         * (the euid) we were run by rootid and it did a setuid.
        !           691:         * Too bad we can't set just the effective uid like suid does.
        !           692:         */
        !           693:        if (uid == geteuid())
        !           694:                return;
        !           695: #ifdef IHCC
        !           696:        printf("Please use the command:\n\ttoolnews providers\n");
        !           697:        printf("then call one of the news people.\n");
        !           698: #else
        !           699:        printf("Get your local netnews contact to do it for you.\n");
        !           700: #endif
        !           701:        xxit(0);
        !           702: }
        !           703: 
        !           704: /*
        !           705:  * Demand a password from the user.
        !           706:  */
        !           707: checkpass(encpw)
        !           708: {
        !           709:        if (strcmp(encpw, crypt(getpass("Password:"), "mT"))) {
        !           710:                printf("Sorry\n");
        !           711:                xxit(0);
        !           712:        }
        !           713: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.