Annotation of 43BSDReno/contrib/isode-beta/quipu/dish/bind.c, revision 1.1.1.1

1.1       root        1: /* bind.c - */
                      2: 
                      3: #ifndef        lint
                      4: static char *rcsid = "$Header: /f/osi/quipu/dish/RCS/bind.c,v 7.5 90/07/09 14:46:57 mrose Exp $";
                      5: #endif
                      6: 
                      7: /* 
                      8:  * $Header: /f/osi/quipu/dish/RCS/bind.c,v 7.5 90/07/09 14:46:57 mrose Exp $
                      9:  *
                     10:  *
                     11:  * $Log:       bind.c,v $
                     12:  * Revision 7.5  90/07/09  14:46:57  mrose
                     13:  * sync
                     14:  * 
                     15:  * Revision 7.4  90/04/18  08:49:30  mrose
                     16:  * 6.2
                     17:  * 
                     18:  * Revision 7.3  90/03/15  11:18:16  mrose
                     19:  * quipu-sync
                     20:  * 
                     21:  * Revision 7.2  90/01/11  18:37:33  mrose
                     22:  * real-sync
                     23:  * 
                     24:  * Revision 7.1  89/12/19  16:20:58  mrose
                     25:  * sync
                     26:  * 
                     27:  * Revision 7.0  89/11/23  22:19:56  mrose
                     28:  * Release 6.0
                     29:  * 
                     30:  */
                     31: 
                     32: /*
                     33:  *                               NOTICE
                     34:  *
                     35:  *    Acquisition, use, and distribution of this module and related
                     36:  *    materials are subject to the restrictions of a license agreement.
                     37:  *    Consult the Preface in the User's Manual for the full terms of
                     38:  *    this agreement.
                     39:  *
                     40:  */
                     41: 
                     42: 
                     43: #include <signal.h>
                     44: #include "manifest.h"
                     45: #include "quipu/util.h"
                     46: #include <fcntl.h>
                     47: #include <sys/stat.h>
                     48: #include "quipu/dua.h"
                     49: #include "quipu/name.h"
                     50: #include "quipu/bind.h"
                     51: #include "quipu/dsp.h"
                     52: #include "quipu/ds_error.h"
                     53: #include "tailor.h"
                     54: 
                     55: extern DN       fixed_pos;
                     56: DN             user_name;
                     57: 
                     58: #define        OPT     (!frompipe || rps -> ps_byteno == 0 ? opt : rps)
                     59: #define        RPS     (!frompipe || opt -> ps_byteno == 0 ? rps : opt)
                     60: extern char    frompipe;
                     61: extern PS      opt, rps;
                     62: 
                     63: extern char    retpipe[],
                     64:                inbuf [],
                     65:                bound;
                     66: 
                     67: extern int     dsap_ad;
                     68: extern unsigned        connect_time,
                     69:                cache_time;
                     70: 
                     71: static char    username [LINESIZE];
                     72: static char    password [LINESIZE];
                     73: static int     auth_type = DBA_AUTH_SIMPLE; 
                     74: static char    first_bind = TRUE;
                     75: 
                     76: char           neverefer = FALSE;
                     77: 
                     78: static struct ds_bind_arg bindarg;
                     79: static struct ds_bind_arg bindresult;
                     80: static struct ds_bind_error binderr;
                     81: 
                     82: static int     main_dsa_id;
                     83: static int     referral_dsa;
                     84: 
                     85: #ifndef NO_STATS
                     86: extern LLog * log_stat;
                     87: #endif 
                     88: extern LLog * log_dsap;
                     89: 
                     90: extern int parent_pid;
                     91: static unsigned waiting = 0;
                     92: 
                     93: extern char *new_version();
                     94: extern long hash_passwd();
                     95: extern char *hash2str();
                     96: extern struct signature *sign_operation();
                     97: extern struct certificate *cert_cpy();
                     98: extern int encode_DAS_TokenToSign();
                     99: 
                    100: SFD alarm_sig ()
                    101: {
                    102: SFD dish_quit ();
                    103: 
                    104:        if (frompipe && (parent_pid != 0))
                    105:                if (kill (parent_pid,0) == -1) {
                    106:                        /* invoking shell gone - exit */
                    107:                        dish_quit (SIGHUP);
                    108:                }
                    109:                
                    110: 
                    111:        if (bound) {
                    112:                (void) dap_unbind (main_dsa_id);
                    113: #ifndef NO_STATS
                    114:        LLOG (log_stat,LLOG_NOTICE,("Connection closed"));
                    115: #endif
                    116:                bound = FALSE;
                    117:                if (referral_dsa != 0) {
                    118:                        (void) dap_unbind (referral_dsa);
                    119:                        referral_dsa = 0;
                    120:                }
                    121:        }
                    122: 
                    123:        waiting += connect_time;
                    124:        if (frompipe && (waiting >= cache_time))
                    125:                dish_quit (SIGHUP);
                    126:                
                    127:        (void) signal (SIGALRM, alarm_sig);
                    128:        (void) alarm (connect_time);
                    129: }
                    130: 
                    131: set_alarm ()
                    132: {
                    133:        waiting = 0;
                    134:        (void) signal (SIGALRM, alarm_sig);
                    135:        (void) alarm (connect_time);
                    136: }
                    137: 
                    138: SFD bind_sig ()
                    139: {
                    140: extern jmp_buf  dish_env;
                    141: 
                    142:        ps_print (OPT,"Bind timeout\n");
                    143:        if (referral_dsa != 0) {
                    144:                referral_dsa = 0;
                    145:                dsap_ad = main_dsa_id;
                    146:        }
                    147:        longjmp (dish_env,1);
                    148: }
                    149: 
                    150: bind_alarm ()
                    151: {
                    152:        (void) signal (SIGALRM, bind_sig);
                    153:        (void) alarm (connect_time);
                    154: }
                    155: 
                    156: call_bind (argc,argv)
                    157: int argc;
                    158: char ** argv;
                    159: {
                    160: int    x;
                    161: char    noconnect = FALSE;
                    162: static  char    bdsa  [LINESIZE], save_bdsa[LINESIZE];
                    163: char   *save_address;
                    164: extern  char * dsa_address,
                    165:             * myname;
                    166: FILE    *fp;
                    167: char    buf[BUFSIZ];
                    168: DN     newdn;
                    169: extern  char * tailfile;
                    170: extern DN sequence_dn ();
                    171: char got_name = FALSE;
                    172: char got_pass = FALSE;
                    173: 
                    174:        bdsa[0] = 0;
                    175:        save_address = dsa_address;
                    176: 
                    177:        for (x=1; x<argc; x++) {
                    178:                if (test_arg (argv[x], "-noconnect",3))
                    179:                        noconnect = TRUE;
                    180: #ifdef PDU_DUMP
                    181:                else if (test_arg (argv[x], "-pdus",2)) {
                    182:                        if (++x == argc) {
                    183:                                ps_print (OPT,"PDU file name missing\n");
                    184:                                Usage (argv[0]);
                    185:                                return (NOTOK);
                    186:                        }
                    187:                        ps_printf (RPS,"Dumping PDUs in directory %s\n",argv[x]);
                    188:                        pdu_dump_init (argv[x]);
                    189:                }
                    190: #endif         
                    191:                else if (test_arg (argv[x], "-user",1)) {
                    192:                        got_name = TRUE;
                    193:                        if ((++x == argc) || (*argv[x] == '-')) {
                    194:                                x--;
                    195:                                *username = 0;
                    196:                        } else
                    197:                                (void) strcpy (username,argv[x]);
                    198:                } else if (test_arg (argv[x], "-pipe",2)) {
                    199:                        if (strcmp (argv[0],"dish") == 0)
                    200:                                ps_print (OPT,"Sorry... '-pipe' must be the first argument to dish.\n");
                    201:                        else 
                    202:                                Usage (argv[0]);
                    203:                        return (NOTOK);
                    204:                } else if (test_arg (argv[x], "-norefer",3))
                    205:                        neverefer = TRUE;
                    206:                else if (test_arg (argv[x], "-refer",1))
                    207:                        neverefer = FALSE;
                    208:                /* these flags select the mode of authentication only */
                    209:                else if (test_arg (argv[x],"-noauthentication",3)) 
                    210:                        auth_type = DBA_AUTH_NONE;
                    211:                else if (test_arg (argv[x], "-protected", 3))
                    212:                        auth_type = DBA_AUTH_PROTECTED;
                    213:                else if (test_arg (argv[x], "-simple", 3))
                    214:                        auth_type = DBA_AUTH_SIMPLE;
                    215:                else if (test_arg (argv[x], "-strong", 3))
                    216:                        auth_type = DBA_AUTH_STRONG;
                    217:                /* -password sets the `key', whatever the mode  */
                    218:                else if (test_arg (argv[x], "-password",2)) {
                    219:                        got_pass = TRUE;
                    220:                        if ((++x == argc)  || (*argv[x] == '-')) {
                    221:                                x--;
                    222:                                *password = 0;
                    223:                        } else {
                    224:                                int i;
                    225:                                (void) strcpy (password,argv[x]);
                    226:                                for (i=0; i< strlen(password) ; i++)
                    227:                                        if ( i < 4 )
                    228:                                                argv[x][i] = 'X';
                    229:                                        else
                    230:                                                argv[x][i] = 0;
                    231: 
                    232:                        }
                    233:                } else if (test_arg (argv[x], "-call",1)) {
                    234:                        if (++x == argc) {
                    235:                                ps_print (OPT,"dsa name missing\n");
                    236:                                Usage (argv[0]);
                    237:                                return (NOTOK);
                    238:                        }
                    239:                        (void) strcpy (bdsa,argv[x]);
                    240:                } else {
                    241:                        /* assume its the user name */
                    242:                        if (got_name) {
                    243:                                ps_print (OPT,"One user name only please!\n");
                    244:                                Usage (argv[0]);
                    245:                                return (NOTOK);
                    246:                        } 
                    247:                        got_name = TRUE;
                    248:                        (void) strcpy (username,argv[x]);
                    249:                        if (*username == '-') {
                    250:                                ps_printf (OPT,"Unknown option %s\n",username);
                    251:                                Usage (argv[0]);
                    252:                                return (NOTOK);
                    253:                        }
                    254:                }
                    255:        }
                    256: 
                    257: 
                    258:        if (noconnect)
                    259:                return (OK);
                    260: 
                    261:        if (isdigit (*username)) {
                    262:            PS      ps;
                    263: 
                    264:            if ((newdn = sequence_dn (atoi (username))) == NULLDN) {
                    265:                ps_printf (OPT,"Invalid sequence in username %s\n",username);
                    266:                Usage (argv[0]);
                    267:                return (NOTOK);
                    268:            }
                    269:            if ((ps = ps_alloc (str_open)) == NULLPS) {
                    270:                ps_printf (OPT, "Unable to expand sequence: out of memory\n");
                    271:                return NOTOK;
                    272:            }
                    273:            if (str_setup (ps, username, sizeof username - 2, 1) == NOTOK) {
                    274:                ps_printf (OPT, "Unable to expand sequence: %s\n",
                    275:                           ps_error (ps -> ps_errno));
                    276:                ps_free (ps);
                    277:                return NOTOK;
                    278:            }
                    279:            dn_print (ps, newdn, EDBOUT);
                    280:            ps_print (ps, " ");
                    281:            *--ps -> ps_ptr = NULL, ps -> ps_cnt++;
                    282: 
                    283:            ps_free (ps);
                    284:        }
                    285:        else
                    286:            newdn = NULLDN;
                    287: 
                    288:        if ((got_name && ! got_pass) || (*password == 0)) {
                    289:                bindarg.dba_passwd_len = 0;
                    290:                bindarg.dba_passwd[0]  = 0;
                    291:                if ((*username != 0) && (auth_type != DBA_AUTH_NONE)) {
                    292:                        get_password (username, password);
                    293:                        (void) strcpy(&bindarg.dba_passwd[0], password);
                    294:                        bindarg.dba_passwd_len = strlen (&bindarg.dba_passwd[0]);
                    295:                }
                    296:        } else {
                    297:                bindarg.dba_passwd_len = strlen (password);
                    298:                (void) strcpy (bindarg.dba_passwd, password);
                    299:        }
                    300: 
                    301:        if ((bindarg.dba_passwd_len == 0) && (auth_type != DBA_AUTH_STRONG))
                    302:                auth_type = DBA_AUTH_NONE;
                    303: 
                    304:        if (*username == 0) {
                    305:                bindarg.dba_dn = NULLDN;
                    306:                /* Don't need credentials to bind as NULLDN! */
                    307:                auth_type = DBA_AUTH_NONE;
                    308:        }
                    309:        else
                    310:                if (newdn)
                    311:                    bindarg.dba_dn = dn_cpy (newdn);
                    312:                else {
                    313:                    if ((bindarg.dba_dn = str2dn (username[0] != '@' ? username
                    314:                                                                  : username + 1))
                    315:                            == NULLDN) {
                    316:                        ps_printf (OPT,"Invalid DN for username: %s\n",username);
                    317:                        Usage (argv[0]);
                    318:                        return (NOTOK);
                    319:                    }
                    320:                }
                    321: 
                    322:        /* prepare credentials */
                    323:        bindarg.dba_auth_type = auth_type;
                    324:        switch (auth_type) {
                    325:        case DBA_AUTH_NONE:
                    326:        case DBA_AUTH_SIMPLE:
                    327:                break;
                    328:        case DBA_AUTH_PROTECTED: 
                    329:                protect_password();
                    330:                break;
                    331:        case DBA_AUTH_STRONG:
                    332:                sign_bindarg();
                    333:                break;
                    334:        }
                    335: 
                    336:        /* now set dsa_address */
                    337:        if (bdsa[0] != 0) {
                    338:                (void) strcpy (myname = save_bdsa, bdsa);
                    339:                dsa_address = NULLCP;
                    340: 
                    341:                /* read tailor file to get address */
                    342:                
                    343:                if( (fp = fopen(isodefile(tailfile, 0), "r")) == (FILE *)NULL) {
                    344:                        LLOG (log_dsap,LLOG_FATAL,("can't open %s",tailfile));
                    345:                        fatal (-72, "Cannot open tailor file");
                    346:                }
                    347: 
                    348:                while(fgets(buf, sizeof(buf), fp) != NULLCP)
                    349:                        if ( (*buf != '#') && (*buf != '\n') )
                    350:                                /* not a comment or blank */
                    351:                                if (tai_string (buf) == NOTOK)
                    352:                                        DLOG (log_dsap,LLOG_DEBUG,("tai_string failed %s",buf));
                    353: 
                    354:                (void) fclose(fp);
                    355:                
                    356:                if (dsa_address == NULLCP)
                    357:                        dsa_address = myname;
                    358:        }
                    359: 
                    360:        if (bound) 
                    361:                (void) ds_unbind ();
                    362:                
                    363:        bound = FALSE;
                    364:        first_bind = FALSE;
                    365: 
                    366:        binderr.dbe_value = 0;
                    367:        bind_alarm ();
                    368:        if (secure_ds_bind (&bindarg, &binderr, &bindresult) != OK) {
                    369:                (void) signal (SIGALRM, SIG_IGN);
                    370:                if (binderr.dbe_value == 0)
                    371:                        ps_print (OPT, "*** Service error : Unable to contact DSA ***\n");
                    372:                else
                    373:                        ds_bind_error(OPT, &binderr);
                    374:                dsa_address = save_address;
                    375:                return (NOTOK);
                    376:        } 
                    377:        (void) signal (SIGALRM, SIG_IGN);
                    378:        main_dsa_id = dsap_ad;
                    379: 
                    380: #ifndef NO_STATS
                    381:        LLOG (log_stat,LLOG_NOTICE,("Bound '%s' to '%s'",username,myname));
                    382: #endif
                    383: 
                    384:        bound = TRUE;
                    385:        user_name = bindarg.dba_dn;
                    386: 
                    387:        return (OK);
                    388:        
                    389: }
                    390: 
                    391: rebind () {
                    392: 
                    393:        if (referral_dsa != 0) {
                    394:                (void) dap_unbind (referral_dsa);
                    395:                referral_dsa = 0;
                    396:                dsap_ad = main_dsa_id;
                    397:        }
                    398: 
                    399:        if (first_bind) {
                    400:                char * buff = "bind";
                    401:                return (call_bind (1,&buff));
                    402:        }
                    403: 
                    404:        if (bound)
                    405:                return (OK);
                    406:                
                    407:        /* prepare credentials */
                    408:        bindarg.dba_auth_type = auth_type;
                    409:        switch (auth_type) {
                    410:        case DBA_AUTH_NONE:
                    411:        case DBA_AUTH_SIMPLE:
                    412:                break;
                    413:        case DBA_AUTH_PROTECTED: 
                    414:                protect_password();
                    415:                break;
                    416:        case DBA_AUTH_STRONG:
                    417:                sign_bindarg();
                    418:                break;
                    419:        }
                    420: 
                    421:        binderr.dbe_value = 0;
                    422:        bind_alarm ();
                    423:        if (secure_ds_bind (&bindarg, &binderr, &bindresult) != OK) {
                    424:                (void) signal (SIGALRM, SIG_IGN);
                    425:                if (binderr.dbe_value == 0)
                    426:                        ps_print (OPT, "*** Service error: Unable to contact DSA ***\n");
                    427:                else
                    428:                        ds_bind_error(OPT, &binderr);
                    429:                return (NOTOK);
                    430:        } 
                    431:        (void) signal (SIGALRM, SIG_IGN);
                    432:        main_dsa_id = dsap_ad;
                    433: #ifndef NO_STATS
                    434:        LLOG (log_stat,LLOG_NOTICE,("re-connect"));
                    435: #endif
                    436: 
                    437:        bound = TRUE;
                    438:        user_name = bindarg.dba_dn;
                    439:        return (OK);
                    440: }
                    441: 
                    442: referral_bind (addr) 
                    443: struct PSAPaddr * addr;
                    444: {
                    445:        if (referral_dsa != 0) 
                    446:                (void) dap_unbind (referral_dsa++);
                    447:        else
                    448:                referral_dsa = dsap_ad + 1;
                    449: 
                    450:        dsap_ad = referral_dsa;
                    451: 
                    452:        /* prepare credentials */
                    453:        bindarg.dba_auth_type = auth_type;
                    454:        switch (auth_type) {
                    455:        case DBA_AUTH_NONE:
                    456:        case DBA_AUTH_SIMPLE:
                    457:                break;
                    458:        case DBA_AUTH_PROTECTED: 
                    459:                protect_password();
                    460:                break;
                    461:        case DBA_AUTH_STRONG:
                    462:                sign_bindarg();
                    463:                break;
                    464:        }
                    465: 
                    466:        binderr.dbe_value = 0;
                    467:        bind_alarm ();
                    468:        if (dap_bind (&dsap_ad, &bindarg, &binderr, &bindresult, addr) != OK) {
                    469:                (void) signal (SIGALRM, SIG_IGN);
                    470:                if (binderr.dbe_value == 0)
                    471:                        ps_print (OPT, "*** Service error : Unable to contact DSA ***\n");
                    472:                else
                    473:                        ds_bind_error(OPT, &binderr);
                    474:                referral_dsa = 0;
                    475:                dsap_ad = main_dsa_id;
                    476:                return (0);
                    477:        }
                    478:        (void) signal (SIGALRM, SIG_IGN);
                    479:        referral_dsa = dsap_ad;
                    480: 
                    481: #ifndef NO_STATS
                    482:        LLOG (log_stat,LLOG_NOTICE,("referral connect"));
                    483: #endif
                    484: 
                    485:        return (1);
                    486: }
                    487: 
                    488: call_unbind (argc,argv)
                    489: int argc;
                    490: char ** argv;
                    491: {
                    492:        int             x;
                    493:        char            noquit = FALSE;
                    494:        extern char     resbuf [];
                    495: 
                    496:        for (x=1; x<argc; x++) {
                    497:                if (test_arg (argv[x], "-noquit",3))
                    498:                        noquit = TRUE;
                    499:                else {
                    500:                        Usage (argv[0]);
                    501:                        return;
                    502:                }
                    503:        }
                    504:        if (!noquit) 
                    505:                (void) signal (SIGINT, SIG_DFL);
                    506: 
                    507:        if (bound) {
                    508:                (void) dap_unbind (main_dsa_id);
                    509:                if (referral_dsa != 0) {
                    510:                        (void) dap_unbind (referral_dsa);
                    511:                        referral_dsa = 0;
                    512:                }
                    513:        }
                    514:                
                    515:        bound = FALSE;
                    516:                
                    517:        if (! noquit) {
                    518:                if (frompipe)
                    519:                        exit_pipe ();
                    520:                ps_free (opt);
                    521:                ps_free (rps);
                    522:                exit (0);
                    523:        }
                    524: }
                    525: 
                    526: extern char no_rcfile;
                    527: static time_t rc_mod_time;
                    528: extern time_t time ();
                    529: static char Dish_Home[LINESIZE];
                    530: 
                    531: user_tailor ()
                    532: {
                    533:        int             isenv;
                    534:        char           *part1;
                    535:        char           *part2;
                    536:        char           *getenv ();
                    537:        char           *home;
                    538: 
                    539:        FILE           *file;
                    540:        char            Read_in_Stuff[LINESIZE];
                    541:        char           *p, 
                    542:                       *TidyString();
                    543:        extern char    *local_dit;
                    544:        extern char     dishinit;
                    545:        struct   stat   sbuf;
                    546: 
                    547:        *password = 0;
                    548:        *username = 0;
                    549: 
                    550:        set_sequence ("default");
                    551: 
                    552:        (void) set_cmd_default ("modify","-dontusecopy");       
                    553:                /* we dont want to make templates with copies */
                    554: 
                    555:        bindarg.dba_version = DBA_VERSION_V1988;
                    556:        bindarg.dba_dn = NULLDN;
                    557:        bindarg.dba_passwd_len = 0;
                    558:        bindarg.dba_passwd[0] = 0;
                    559: 
                    560:        isenv = 0;
                    561:        if (home = getenv ("QUIPURC"))
                    562:            (void) strcpy (Dish_Home, home), isenv = 1;
                    563:        else
                    564:            if (home = getenv ("HOME"))
                    565:                (void) sprintf (Dish_Home, "%s/.quipurc", home);
                    566:            else
                    567:                (void) strcpy (Dish_Home, "./.quipurc");
                    568: 
                    569:        if (no_rcfile)
                    570:            goto out;
                    571: 
                    572:        if (stat (Dish_Home,&sbuf) != 0) {
                    573:                if (isenv)
                    574:                    goto no_dice;
                    575: 
                    576:                if (dishinit && !frompipe) {
                    577:                        char cmd_buf [LINESIZE];
                    578:                        int msk;
                    579: 
                    580:                        ps_print (OPT,"Please wait whilst I initialise everything...\n");
                    581:                        msk = umask (0111);
                    582:                        (void) strcpy (cmd_buf, isodefile ("new_quipurc", 1));
                    583:                        if ((file = fopen (Dish_Home, "w")) == 0) 
                    584:                                return (OK);    /* cant make one */
                    585:                        (void) umask (msk);
                    586:                        (void) fclose (file);
                    587:                        if (system (cmd_buf) == 0) {
                    588:                                (void) chmod (Dish_Home,0600);
                    589:                                if ((file = fopen (Dish_Home, "r")) == 0) {
                    590:                                        (void) fprintf (stderr,"Cant open %s - BUT I just created it!!!\n", Dish_Home);
                    591:                                        return (NOTOK);
                    592:                                }
                    593:                        } else {
                    594:                                (void) unlink (Dish_Home);
                    595:                                return (NOTOK);
                    596:                        }
                    597:                        rc_mod_time = time ((time_t *)0);
                    598:                } else {
                    599:                        rc_mod_time = time ((time_t *)0);
                    600:                        goto out;
                    601:                }
                    602:        } else 
                    603:                rc_mod_time = sbuf.st_mtime;
                    604: 
                    605:        if ((file = fopen (Dish_Home, "r")) == 0) {
                    606: no_dice: ;
                    607:                (void) fprintf (stderr,"Cant open ");
                    608:                perror (Dish_Home);
                    609:                return NOTOK;
                    610:        }
                    611: 
                    612:        while (fgets (Read_in_Stuff, LINESIZE, file) != 0) {
                    613:                p = SkipSpace (Read_in_Stuff);
                    614:                if (( *p == '#') || (*p == '\0'))
                    615:                        continue;  /* ignore comments and blanks */
                    616:                        
                    617:                part1 = p;
                    618:                if ((part2 = index (p,':')) == NULLCP) {
                    619:                        ps_printf (OPT,"Seperator missing '%s'\n",p);
                    620:                        return (NOTOK);
                    621:                } 
                    622:                
                    623:                *part2++ = '\0';
                    624:                part2 = TidyString (part2);
                    625: 
                    626:                if (lexequ (part1, "username") == 0) {
                    627:                        if ((user_name = str2dn (*part2 != '@' ? part2
                    628:                                                               : part2 + 1))
                    629:                            == NULLDN) {
                    630:                                ps_printf (OPT,"Invalid DN for username: %s\n",part2);
                    631:                                return (NOTOK);
                    632:                        }
                    633:                        (void) strcpy (username, part2);
                    634:                        bindarg.dba_dn = user_name;
                    635:                }
                    636:                else if (lexequ (part1, "password") == 0) {
                    637:                        (void) strcpy (bindarg.dba_passwd,part2);
                    638:                        (void) strcpy (password, part2);
                    639:                        bindarg.dba_passwd_len = strlen (part2);
                    640:                } 
                    641:                else if (lexequ (part1, "certificate") == 0) {
                    642:                        extern struct certificate *my_certificate;
                    643:                        struct certificate *str2cert();
                    644:                        my_certificate = str2cert(part2);
                    645:                } else if (lexequ (part1, "secret_key") == 0) 
                    646:                        (void) set_secret_key(part2);
                    647:                else if (lexequ (part1, "cache_time") == 0) 
                    648:                        cache_time = MIN (atoi(part2) * 60, 180000);
                    649:                                        /* enforce 5 hour maximum */
                    650:                else if (lexequ (part1, "connect_time") == 0) 
                    651:                        connect_time = MIN (atoi(part2) * 60, 300);
                    652:                                        /* enforce 5 minute maximum */
                    653:                else if (lexequ (part1, "service") == 0) 
                    654:                        new_service (part2);
                    655:                else if (lexequ (part1, "type") == 0) {
                    656:                        if (lexequ (part2,"unknown") == 0)
                    657:                                show_unknown();
                    658:                } else if (lexequ (part1, "notype") == 0)
                    659:                        new_ignore (part2);
                    660:                else if (lexequ (part1, "sequence") == 0) {
                    661:                        DN sdn;
                    662:                        if ( (sdn = str2dn (*part2 != '@' ? part2 : part2 + 1))
                    663:                            == NULLDN) {
                    664:                                 ps_printf (OPT,"Invalid DN for sequence: %s\n",part2);
                    665:                                 return (NOTOK);
                    666:                        }
                    667:                        (void) add_sequence (sdn);
                    668:                } else if (lexequ (part1, "dsap") == 0)
                    669:                        (void) tai_string (part2);
                    670:                else if (lexequ (part1, "isode") == 0) {
                    671:                        char * split;
                    672:                        if ((split = index (part2,' ')) != NULLCP) {
                    673:                                *split++ = 0;
                    674:                                (void)isodesetvar (part2,strdup(split),0);
                    675:                        }
                    676:                } else if (set_cmd_default (part1,part2) != OK) {
                    677:                        if (*part2 == '@')
                    678:                                part2++;
                    679:                        if (add_alias (part1,part2) != OK) {
                    680:                                ps_printf (OPT,"Unknown parameter %s\n",part1);
                    681:                                return (NOTOK);
                    682:                        }
                    683:                }
                    684:        }
                    685:        (void) fclose (file);
                    686: 
                    687: out:;
                    688:        if ((local_dit != NULLCP) && (strcmp ("@", TidyString(local_dit)) != 0))
                    689:                if ((fixed_pos = str2dn (*local_dit != '@' ? local_dit
                    690:                                                           : local_dit + 1))
                    691:                    == NULLDN) {
                    692:                        ps_printf (OPT,"Invalid DN for dsaptailor default position: %s\n",local_dit);
                    693:                        return (NOTOK);
                    694:                }
                    695: 
                    696:        (void) strcpy (bindarg.dba_passwd,password);
                    697:        bindarg.dba_passwd_len = strlen (password);
                    698: 
                    699:        isodexport (NULLCP);
                    700:        
                    701:        return (OK);
                    702: }
                    703: 
                    704: test_rc_file (ps)
                    705: PS  ps;
                    706: {
                    707:        struct   stat   sbuf;
                    708: 
                    709:        if (stat (Dish_Home,&sbuf) != 0)
                    710:                return;
                    711: 
                    712:        if (rc_mod_time < sbuf.st_mtime) {
                    713:                ps_printf (ps,"WARNING: %s has changed - but not re-read!!!\n",
                    714:                          Dish_Home);
                    715:                rc_mod_time = sbuf.st_mtime;
                    716:        }
                    717: 
                    718: }
                    719: 
                    720: SFD dish_quit (sig)
                    721: int sig;
                    722: {
                    723:        if (bound) {
                    724:                (void) dap_unbind (main_dsa_id);
                    725:                if (referral_dsa != 0) {
                    726:                        (void) dap_unbind (referral_dsa);
                    727:                        referral_dsa = 0;
                    728:                }
                    729:        }
                    730: 
                    731:        if (frompipe)
                    732:                exit_pipe ();
                    733:        else
                    734:                (void) fprintf (stderr,"Dish Problem\n");
                    735: 
                    736:        hide_picture();
                    737: 
                    738:        switch (sig) {
                    739:                case SIGALRM:
                    740:                        LLOG (log_dsap, LLOG_EXCEPTIONS, ("Timer expired :- Dish quitting"));
                    741:                        exit (0);
                    742:                case SIGHUP:
                    743:                case SIGINT:
                    744:                case SIGTERM:
                    745:                        LLOG (log_dsap, LLOG_EXCEPTIONS, ("Dish quitting - signal %d",sig));
                    746:                        exit (0);
                    747:                default:
                    748:                        LLOG (log_dsap, LLOG_FATAL, ("Dish problem - signal %d",sig));
                    749:                        (void) signal (sig, SIG_DFL); /* to stop recursion */
                    750:                        abort ();
                    751:        }
                    752:                        
                    753: }
                    754: 
                    755: static int protect_password()
                    756: {
                    757: long hash;
                    758: char *cp;
                    759: int len;
                    760: 
                    761:        bindarg.dba_time1 = new_version();
                    762:        bindarg.dba_time2 = NULLCP;
                    763:        bindarg.dba_r1.n_bits = 0;
                    764:        bindarg.dba_r1.value = NULLCP;
                    765:        bindarg.dba_r2.n_bits = 0;
                    766:        bindarg.dba_r2.value = NULLCP;
                    767:        hash = 0;
                    768:        hash = hash_passwd(hash, password, strlen(password));
                    769:        hash = hash_passwd(hash, bindarg.dba_time1, strlen(bindarg.dba_time1));
                    770:        cp = hash2str(hash, &len);
                    771:        bcopy(cp, bindarg.dba_passwd, len);
                    772:        bindarg.dba_passwd_len = len;
                    773: }
                    774: 
                    775: 
                    776: static int sign_bindarg()
                    777: {
                    778: struct signature sig;
                    779: 
                    780:        bindarg.dba_time1 = new_version();
                    781:        bindarg.dba_time2 = NULLCP;
                    782: 
                    783:        /* Have to send a random number, but don't care what it is */
                    784:        bindarg.dba_r1.n_bits = 8;
                    785:        bindarg.dba_r1.value = strdup("*");
                    786:        bindarg.dba_r2.n_bits = 8;
                    787:        bindarg.dba_r2.value = strdup("*");
                    788: 
                    789:         bindarg.dba_sig = &sig;
                    790:        /* Have to build a signature alg_id now, so can sign it. This will
                    791:         * subsequently be replaced with a new alg_id by sign_operation.
                    792:         */
                    793:         sig.alg.algorithm = oid_cpy(ode2oid("sq_mod_n_with_rsa"));
                    794:         sig.alg.p_type = ALG_PARM_NUMERIC;
                    795:         sig.alg.un.numeric = 512;
                    796:        sig.alg.asn = NULLPE;
                    797: 
                    798:        bindarg.dba_sig = sign_operation((caddr_t) &bindarg, 
                    799:                        encode_DAS_TokenToSign);
                    800:        if (my_certificate)
                    801:        {
                    802:        bindarg.dba_cpath = (struct certificate_list *) 
                    803:                calloc(1, sizeof(struct certificate_list));
                    804:        bindarg.dba_cpath->cert = cert_cpy(my_certificate);
                    805:        }
                    806: }

unix.superglobalmegacorp.com

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