Annotation of researchv10dc/ipc/mgrs/oauthmgr/secserver.c, revision 1.1

1.1     ! root        1: #include "authmgr.h"
        !             2: 
        !             3: char admins[128];
        !             4: int max_failures = MAX_FAILURES;
        !             5: struct disallow* badlist;
        !             6: int pushed_ld;
        !             7: int gnotflg = 0;               /* set if we shouldn't ask for a new number */
        !             8: int dconflg = 0;               /* set if real dest is dcon/mesgdcon */
        !             9: int usepasswd = 0;             /* set if we should ignore the key file */
        !            10: 
        !            11: char dialbuf[128];
        !            12: char* dialstring;              /* dialstring from CSOURCE params */
        !            13: char physource[128];           /* the switch.mod.chan stuff from CSOURCE */
        !            14: char srcid[128]="";            /* the first field in CSOURCE */
        !            15: char username[16]="";          /* the user's login name from CSOURCE */
        !            16: char eusername[30]="";         /* effective login name */
        !            17: char nettype[16];              /* shouldn't get bigger than this */
        !            18: char options[16] ;
        !            19: char redialbuf[128] ;
        !            20: char defsvc[16]="";            /* default service */
        !            21: FILE *log=0;                   /* log file */
        !            22: 
        !            23: struct secmap *secidlist;      /* list of security ID mappings */
        !            24: 
        !            25: #define MLIST_SIZE 10
        !            26: regsubexp mlist[MLIST_SIZE];   /* a match list for regexec */
        !            27: 
        !            28: char* SYNTAX = "authmgr: Syntax error at line %d of control file\n";
        !            29: #define DCON_CHALLENGE "CH"    /* the dcon challenge response */
        !            30: 
        !            31: int init();            /*forward*/
        !            32: extern struct keyinfo* getkeyinfo();
        !            33: char *makesourceid();  /*forward*/
        !            34: char *getenv();
        !            35: char *getpass();
        !            36: 
        !            37: /*
        !            38:  * security - an authentication server
        !            39:  *
        !            40:  * For a given user, this locates that user's key in the
        !            41:  * key database, challenges the user to encrypt some data,
        !            42:  * and compares that user's result with the result of
        !            43:  * encrypting the data with the user's real key.  If the
        !            44:  * results are the same, the user is authenticated, otherwise,
        !            45:  * no.
        !            46:  */
        !            47: main(argc, argv)
        !            48:        int argc;
        !            49:        char* argv[];
        !            50: {
        !            51:        int i, rc;
        !            52:        char buf[128];
        !            53:        char logname[30], logtries[128];
        !            54:        char *bp, *dp;
        !            55:        struct keyinfo *kp;
        !            56:        unsigned data, l, r;
        !            57:        ipcinfo info;
        !            58:        struct tm *tm = localtime(time((long *) 0));
        !            59:        long now = tm->tm_mday + 100*(tm->tm_mon) + 10000*(tm->tm_yday);
        !            60: 
        !            61:        if(rc=init(argc, argv) != 0) {
        !            62:            puts("REFUSED");
        !            63:            exit(rc);
        !            64:        }
        !            65: 
        !            66:        
        !            67:        /* main protocol section */
        !            68:        for(i=0; i<max_failures; i++) {
        !            69:                if(dconflg || gnotflg) {
        !            70:                        printf("%s", DCON_CHALLENGE);
        !            71:                        if(safegets(buf, sizeof(buf)) == NULL)
        !            72:                                exit(0);
        !            73:                        logname[8] = '\0';
        !            74:                        strncpy(logname, buf, 8);
        !            75:                        kp = getkeyinfo(logname, usepasswd);
        !            76:                        bp = (*kp->kt->chal)(kp);
        !            77:                        if(bp)
        !            78:                                printf("%s\n", bp);     /* send the challenge */
        !            79:                        else
        !            80:                                putchar('\n');
        !            81:                        if(safegets(buf, sizeof(buf)) == NULL)
        !            82:                                exit(0);
        !            83:                } else {
        !            84:                        if(*eusername != '\0') {
        !            85:                                strcpy(logname, eusername);
        !            86:                                *eusername = '\0';
        !            87:                                printf("login: %s\n", logname);
        !            88:                        } else {
        !            89:                                printf("login: ");
        !            90:                                if(safegets(logname, sizeof(logname)) == NULL || *logname == '\0')
        !            91:                                        exit(0);
        !            92:                        }
        !            93:                        kp = getkeyinfo(logname, usepasswd);
        !            94:                        bp = (*kp->kt->chal)(kp);
        !            95:                        if(bp) {
        !            96:                                printf("Enter response code for %s: ", bp);
        !            97:                                if(safegets(buf, sizeof(buf)) == NULL || buf[0] == '\0')
        !            98:                                        exit(0);
        !            99:                        } else {
        !           100:                                printf("Password: ");
        !           101:                                readnoecho(buf, sizeof buf);
        !           102:                        }
        !           103:                }
        !           104:                (void) strcat(logtries, logname);
        !           105:                (void) strcat(logtries, " ");
        !           106:                strcpy(eusername, logname);
        !           107: 
        !           108:                if((kp->expire >= now) && (*kp->kt->comp)(kp, buf) == 0) {
        !           109:                        goto success;
        !           110:                }
        !           111:        }
        !           112: 
        !           113:        doadmin(logtries);
        !           114:        puts("REFUSED");
        !           115:        exit(1);
        !           116: success:
        !           117:        /* if no dialstring, ask for one */
        !           118:        /* if dconflg is set, dialstring isn't 0 */
        !           119:        if(dialstring == 0 || *dialstring == 0) {
        !           120:                i = 0;
        !           121:                while(i < max_failures) {
        !           122:                        printf("\nDestination please: ");
        !           123:                        fflush(stdout);
        !           124:                        if(safegets(dialbuf, sizeof dialbuf) == NULL)
        !           125:                                exit(0);
        !           126:                        dialstring = dialbuf;
        !           127:                        while(*dialstring == ' ' || *dialstring == '\t')
        !           128:                                *dialstring++;
        !           129:                        for(dp = dialstring;
        !           130:                                *dp != '\0' && *dp != ' ' && *dp != '\t'; dp++)
        !           131:                                ;
        !           132:                        *dp = '\0';
        !           133:                        if(*dialstring != '\0')
        !           134:                                break;
        !           135:                        i++ ;
        !           136:                }
        !           137:                if(i == max_failures) {
        !           138:                        puts("\nNo new dialstring.  Goodbye.\n");
        !           139:                        exit(1);
        !           140:                }
        !           141:        }
        !           142: 
        !           143:        if (gnotflg)
        !           144:                options[0] = 'U' ;
        !           145:        else
        !           146:                options[0] = '-' ;
        !           147:        options[1] = 0 ;
        !           148: 
        !           149:        /* using "dialstring", send a redial msg to mgr */
        !           150:        strcpy(redialbuf, options) ;
        !           151:        strcat(redialbuf, ">") ;
        !           152:        strcat(redialbuf, dialstring) ;
        !           153: 
        !           154:        info.rfd = -1;
        !           155:        info.cfd = 0;   /* pass back fd 0 */
        !           156:        info.myname = NULL;
        !           157:        info.user = logname;
        !           158:        info.machine = "";
        !           159:        info.uid = info.gid = -1;
        !           160:        info.name = ipcpath(redialbuf, nettype, defsvc);
        !           161:        info.param = "light";   /* bogus */
        !           162:        info.flags = 0;
        !           163:        if (log != 0) {
        !           164:                lognow();
        !           165:                fprintf(log, "%s %s (%s) redialing to %s\n", 
        !           166:                        srcid, username, eusername, info.name);
        !           167:                fclose(log);
        !           168:        }
        !           169:        if(pushed_ld)
        !           170:                ioctl(0, FIOPOPLD, (void *)0);
        !           171:        if(ipcredial(&info) != 0)
        !           172:                ;       /* should complain somehow! */
        !           173:        exit(0);
        !           174: }
        !           175: 
        !           176: int
        !           177: init(ac, av)
        !           178:        int ac;
        !           179:        char* av[];
        !           180: {
        !           181:        FILE* cf;
        !           182:        char line[128] ;
        !           183: #define NFLDS  10
        !           184:        char *fld[NFLDS];
        !           185:        int l, i, j, errflg = 0;
        !           186:        struct disallow *d = 0, *dp;
        !           187:        struct secmap *sp, *slp = 0;
        !           188:        regexp *prog;
        !           189:        char *c, *c2 = 0;
        !           190:        char *cntlfile = CONTROL_FILE;
        !           191:        int seen_defmap = 0;
        !           192:        char *malloc();
        !           193:        extern char *optarg;
        !           194:        extern int optind;
        !           195: 
        !           196:        while((i = getopt(ac, av, "nf:")) != -1)
        !           197:                switch(i) {
        !           198:                case 'n':
        !           199:                        gnotflg++;
        !           200:                        break;
        !           201:                case 'f':
        !           202:                        cntlfile = optarg;
        !           203:                        break;
        !           204:                case '?':
        !           205:                        errflg++;
        !           206:                        break;
        !           207:                }
        !           208:        if(errflg) {
        !           209:                fprintf(stderr, "authmgr: bad arglist\n");
        !           210:                return 1;
        !           211:        }
        !           212:        strcpy(physource, "auth1.1.1.F");
        !           213:        chdir("/tmp");  /* in case of core dumps; I wanna find them */
        !           214:        c = getenv("CSOURCE");
        !           215:        if(c) {
        !           216:                /* this "knows" the format of a CSOURCE */
        !           217:                if(strncmp(c, "source=", 7) == 0) {
        !           218:                        c += 7;
        !           219:                        c2 = nettype;
        !           220:                        while(*c != '!')
        !           221:                                *c2++ = *c++;
        !           222:                        *c2 = '\0';
        !           223: 
        !           224:                        c++;
        !           225:                        c2 = srcid;
        !           226:                        while(*c != ' ')
        !           227:                                *c2++ = *c++;
        !           228:                        *c2 = '\0';
        !           229:                } else
        !           230:                        strcpy(nettype, "dk");  /* XXX */
        !           231: 
        !           232:                while(c = strchr(c, ' ')) {
        !           233:                        c++;
        !           234:                        if(strncmp(c, "user=", 5) == 0) {
        !           235:                                c += 5;
        !           236:                                c2 = username;
        !           237:                                i = 0;
        !           238:                                while(*c != ' ') {
        !           239:                                        if(*c >= '0' && *c <= '9')
        !           240:                                                i++;
        !           241:                                        *c2++ = *c++;
        !           242:                                }
        !           243:                                *c2 = '\0';
        !           244:                                c++;
        !           245:                                /*
        !           246:                                 * ignore the user name if it's numeric or
        !           247:                                 * if it's the magic unknown user
        !           248:                                 */
        !           249:                                if(i == strlen(username) || strcmp(username, "_unknown_") == 0)
        !           250:                                        username[0] = '\0';
        !           251:                        }
        !           252:                        if(strncmp(c, "line=", 5) == 0) {
        !           253:                                strcpy(physource, c+5);
        !           254:                                break;
        !           255:                        }
        !           256:                }
        !           257:        }
        !           258:        strcpy(eusername, username);
        !           259:        c = getenv("CDEST");
        !           260:        if(c) {
        !           261:                strcpy(line, c);
        !           262:                c = line;
        !           263:                setfields("!");
        !           264:                i = getfields(c, fld, NFLDS);
        !           265:                if(i >= 4) {
        !           266:                        /* check if it matches my service; if so, ignore it */
        !           267:                        j = strlen(fld[2]);
        !           268:                        if((i = strlen(fld[3])) <= j ||
        !           269:                                strcmp(&fld[3][i-j], fld[2]) != 0) {
        !           270:                                strcpy(dialbuf, fld[3]);
        !           271:                                dialstring = dialbuf;
        !           272:                        }
        !           273:                }
        !           274:        }
        !           275: 
        !           276:        if(dialstring != NULL) {
        !           277:                if((i = strlen(dialstring)) > 4 &&
        !           278:                        strcmp(&dialstring[i-4], "dcon") == 0)
        !           279:                        dconflg++;
        !           280:        }
        !           281:        if(!dconflg && !gnotflg)
        !           282:                printf("Security Authentication check\n\n");
        !           283: 
        !           284:        if((cf = fopen(cntlfile, "r")) == NULL) {
        !           285:            fprintf(stderr, "authmgr: No control file\n");
        !           286:            return 2;
        !           287:        }
        !           288: 
        !           289:        setfields(" \t");
        !           290:        l = 0;
        !           291:        while(fgets(line, 128, cf) != NULL) {
        !           292:            l++;
        !           293:            for(i=0; line[i] == ' ' || line[i] == '\t'; i++)
        !           294:                ;
        !           295:            if(line[i] == '#') /* ignore comments */
        !           296:                continue;
        !           297:            if((c = strchr(&line[i], '\n')) != NULL) /* strip newline */
        !           298:                *c = '\0';
        !           299: 
        !           300:            i = getmfields(&line[i], fld, NFLDS);
        !           301:            if(i == 0)  /* blank line */
        !           302:                continue;
        !           303: 
        !           304:            if(strcmp(fld[0], "admin") == 0) {
        !           305:                if(i < 2) {
        !           306:                    fprintf(stderr, SYNTAX, l);
        !           307:                    return 3;
        !           308:                }
        !           309:                (void) strcpy(admins, fld[1]);
        !           310:                for(j=2; j<i; j++) {
        !           311:                        strcat(admins, " ");
        !           312:                        strcat(admins, fld[j]);
        !           313:                }
        !           314:            } else if(strcmp(fld[0], "failures") == 0) {
        !           315:                if(i != 2 || (max_failures = atoi(fld[1])) < 3) {
        !           316:                    fprintf(stderr, SYNTAX, l);
        !           317:                    return 4;
        !           318:                }
        !           319:            } else if(strcmp(fld[0], "disallow") == 0) {
        !           320:                if(i != 2) {
        !           321:                    fprintf(stderr, SYNTAX, l);
        !           322:                    return 5;
        !           323:                }
        !           324:                dp = (struct disallow*) malloc(sizeof(struct disallow));
        !           325:                if(dp == 0) {
        !           326:                    fprintf(stderr, "authmgr: out of memory\n");
        !           327:                    return 6;
        !           328:                }
        !           329:                (void) strncpy(dp->logname, fld[1], 8);
        !           330:                dp->logname[8] = '\0';
        !           331:                dp->next = NULL;
        !           332:                if(d == 0) {
        !           333:                    badlist = d = dp;
        !           334:                } else {
        !           335:                    d->next = dp;
        !           336:                    d = dp;
        !           337:                }
        !           338:            } else if(strcmp(fld[0], "usepasswd") == 0) {
        !           339:                if(i != 2) {
        !           340:                    fprintf(stderr, SYNTAX, l);
        !           341:                    return 7;
        !           342:                }
        !           343:                if((prog = regcomp(fld[1])) == NULL) {
        !           344:                    fprintf(stderr, SYNTAX, l);
        !           345:                    free((char*)prog);
        !           346:                    return 8;
        !           347:                }
        !           348:                if(regexec(prog, srcid, mlist, MLIST_SIZE) != 0) {
        !           349:                    usepasswd++;
        !           350:                }
        !           351:            } else if(strcmp(fld[0], "setuser") == 0) {
        !           352:                if((i < 2) | (i > 3)) {
        !           353:                    fprintf(stderr, SYNTAX, l);
        !           354:                    return 9;
        !           355:                }
        !           356:                if((prog = regcomp(fld[1])) == NULL) {
        !           357:                    fprintf(stderr, SYNTAX, l);
        !           358:                    free((char*)prog);
        !           359:                    return 10;
        !           360:                }
        !           361:                if(regexec(prog, srcid, mlist, MLIST_SIZE) != 0) {
        !           362:                        if (i == 2)
        !           363:                                eusername[0] = '\0';
        !           364:                        else {
        !           365:                                strncpy(eusername, fld[2], 8);
        !           366:                                eusername[8] = '\0';
        !           367:                        }
        !           368:                }
        !           369:            } else if(strcmp(fld[0], "setsvc") == 0) {
        !           370:                if(i != 3) {
        !           371:                    fprintf(stderr, SYNTAX, l);
        !           372:                    return 11;
        !           373:                }
        !           374:                if((prog = regcomp(fld[1])) == NULL) {
        !           375:                    fprintf(stderr, SYNTAX, l);
        !           376:                    free((char*)prog);
        !           377:                    return 12;
        !           378:                }
        !           379:                if(regexec(prog, srcid, mlist, MLIST_SIZE) == 0)
        !           380:                        continue;
        !           381:                strncpy(defsvc, fld[2], 16);
        !           382:                defsvc[16]='\0';
        !           383:            } else if(strcmp(fld[0], "setlog") == 0) {
        !           384:                if(i != 3) {
        !           385:                    fprintf(stderr, SYNTAX, l);
        !           386:                    return 13;
        !           387:                }
        !           388:                if((prog = regcomp(fld[1])) == NULL) {
        !           389:                    fprintf(stderr, SYNTAX, l);
        !           390:                    free((char*)prog);
        !           391:                    return 13;
        !           392:                }
        !           393:                if(regexec(prog, srcid, mlist, MLIST_SIZE) == 0)
        !           394:                        continue;
        !           395:                if((log = fopen(fld[2], "a")) == NULL) {
        !           396:                        fprintf(stderr, "Can't open log file %s\n", fld[2]);
        !           397:                        return 20;
        !           398:                }
        !           399:            } else if(strcmp(fld[0], "secidmap") == 0) {
        !           400:                if(i != 3) {
        !           401:                    fprintf(stderr, SYNTAX, l);
        !           402:                    return 14;
        !           403:                }
        !           404:                sp = (struct secmap*) malloc(sizeof(struct secmap));
        !           405:                if(strcmp(fld[1], ".*") == 0)
        !           406:                        seen_defmap = 1;
        !           407:                else if(seen_defmap) {
        !           408:                    fprintf(stderr, "authmgr: Warning; default secidmap is not last secidmap at line %d\n", l);
        !           409:                    free((char *)sp);
        !           410:                    continue;
        !           411:                }
        !           412:                if((sp->prog = regcomp(fld[1])) == NULL) {
        !           413:                    fprintf(stderr, SYNTAX, l);
        !           414:                    free((char *)sp);
        !           415:                    return 15;
        !           416:                }
        !           417:                if(slp == 0)
        !           418:                        slp = secidlist = sp;
        !           419:                else {
        !           420:                        slp->next = sp;
        !           421:                        slp = sp;
        !           422:                }
        !           423:                slp->secid = strdup(fld[2]);
        !           424:                slp->next = NULL;
        !           425:            } else {
        !           426:                fprintf(stderr, SYNTAX, l);
        !           427:                return 16;
        !           428:            }
        !           429:        }
        !           430:        if(!seen_defmap) {
        !           431:                fprintf(stderr, "authmgr: No default ID configured. Help!\n");
        !           432:                return 17;
        !           433:        }
        !           434:        if(!dconflg && !gnotflg) {
        !           435:                struct tchars tcbuf;
        !           436:                extern int tty_ld;
        !           437:                /* make sure interface is usable by humans */
        !           438:                if(ioctl(0, TIOCGETC, &tcbuf) < 0) {
        !           439:                        /* no tty ld (of any type) present; push one */
        !           440:                        if(ioctl(0, FIOPUSHLD, &tty_ld) < 0)
        !           441:                                printf("No tty processing supported; sorry\n");
        !           442:                        pushed_ld++;
        !           443:                }
        !           444:        }
        !           445:        return 0;
        !           446: }
        !           447: 
        !           448: char*
        !           449: makesourceid()
        !           450: {
        !           451:        static char sbuf[128];
        !           452:        struct secmap *sp = secidlist;
        !           453: 
        !           454:        while(sp != NULL) {
        !           455:                if(regexec(sp->prog, srcid, mlist, MLIST_SIZE) != 0) {
        !           456:                        sprintf(sbuf, "%s.%s", sp->secid, physource);
        !           457:                        return sbuf;
        !           458:                }
        !           459:                sp = sp->next;
        !           460:        }
        !           461: }
        !           462: 
        !           463: readnoecho(rbuf, n)
        !           464:        char *rbuf;
        !           465:        int n;
        !           466: {
        !           467:        struct sgttyb sg, noecho;
        !           468:        int failed = 0;
        !           469: 
        !           470:        failed = ioctl(0, TIOCGETP, &sg);
        !           471:        if(failed >= 0) {
        !           472:                noecho = sg;
        !           473:                noecho.sg_flags &= ~ECHO;
        !           474:                ioctl(0, TIOCSETP, &noecho);
        !           475:        }
        !           476:        safegets(rbuf, n);
        !           477:        if(failed >= 0)
        !           478:                ioctl(0, TIOCSETP, &sg);
        !           479: }
        !           480: 
        !           481: void
        !           482: regerror(msg)
        !           483:        char *msg;
        !           484: {
        !           485:        fprintf(stderr, "authmgr: %s\n", msg);
        !           486:        return;
        !           487: }
        !           488: 
        !           489: #include <utsname.h>
        !           490: 
        !           491: /*
        !           492:  * doadmin -
        !           493:  *  do whatever administrative muck is necessary when a login
        !           494:  *  fails to authenticate itself after max_failures tries.
        !           495:  */
        !           496: doadmin(logname)
        !           497:        char* logname;
        !           498: {
        !           499:        char buf[256];
        !           500:        FILE* f;
        !           501:        struct utsname un;
        !           502: 
        !           503:        if (log != NULL) {
        !           504:                lognow();
        !           505:                fprintf(log, "%s %s (%s) failed\n",
        !           506:                        srcid, username, eusername);
        !           507:                fclose(log);
        !           508:        }
        !           509: 
        !           510:        (void) uname(&un);
        !           511:        sprintf(buf, "/bin/mail %s", admins);
        !           512:        if((f = popen(buf, "w")) == NULL)
        !           513:                return; /* XXX */
        !           514: 
        !           515:        fprintf(f, "\
        !           516: Subject: security alert from server %s\n\
        !           517: \n\
        !           518: The login(s) ``%s'' failed to correctly authenticate\n\
        !           519: itself after %d consecutive attempts.\n\
        !           520: The source of the attempts was:\n\
        !           521:        %s\n\
        !           522: Recommendation: disable and investigate the login(s).\n",
        !           523:                un.nodename, logname, max_failures, getenv("CSOURCE"));
        !           524: 
        !           525:        (void) pclose(f);
        !           526: }
        !           527: 
        !           528: 
        !           529: /*
        !           530:  *  a safe version of gets
        !           531:  */
        !           532: safegets(bp, n)
        !           533:        char *bp;
        !           534:        int n;
        !           535: {
        !           536:        char *cp;
        !           537: 
        !           538:        if(fgets(bp, n, stdin)==NULL)
        !           539:                return NULL;
        !           540:        for(cp=bp; *cp; cp++)
        !           541:                if(*cp=='\r' || *cp =='\n'){
        !           542:                        *cp = 0;
        !           543:                        break;
        !           544:                }
        !           545:        return bp;
        !           546: }
        !           547: 
        !           548: lognow()
        !           549: {
        !           550:        struct  tm *now;
        !           551:        long    seconds;
        !           552: 
        !           553:        (void) time(&seconds); 
        !           554:        now = localtime(&seconds);
        !           555:        fprintf(log, "%02d/%02d %02d:%02d:%02d  ",
        !           556:                now->tm_mon+1, now->tm_mday,
        !           557:                now->tm_hour, now->tm_min, now->tm_sec);
        !           558: }

unix.superglobalmegacorp.com

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