home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume26 / modempool / part01 / login.c < prev    next >
C/C++ Source or Header  |  1993-04-05  |  6KB  |  273 lines

  1. /*******************************************************************
  2.  * 
  3.  * Module: @(#)login.c    4.4 92/04/21
  4.  *
  5.  * Description:
  6.  *    Handle login during user callup.
  7.  *
  8.  * Revision:
  9.  *    Date    By            Reason    
  10.  *    ----    --            ------    
  11.  *    920309    Lars Berntzon        Created
  12.  *
  13.  *******************************************************************/
  14. static char SccsId[] = "@(#)login.c    4.4 92/04/21";
  15.  
  16. #include <stdio.h>
  17. #ifndef NOSTDLIB
  18. #include <stdlib.h>
  19. #endif
  20. #include <unistd.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <errno.h>
  24.  
  25. #include "modempool.h"
  26.  
  27. #ifdef RLOGIN
  28. #include <pwd.h>
  29. #endif
  30.  
  31. /*******************************************************************
  32.  *        H D L _C O N N E C T
  33.  *        --------------------
  34.  *
  35.  * Description:
  36.  *    Handles initial connection to callback server.
  37.  *
  38.  * Arguments:
  39.  *    mod_rc    - Return code from modem specifying connection.
  40.  *
  41.  *******************************************************************/
  42. int
  43. hdl_connect(int mod_rc)
  44. {
  45.     slot_t msg_slot;    /* A message carrier between do_login and callback */
  46.     int rc;
  47.  
  48.     switch(mod_rc)
  49.     {
  50.     case MOD_CONNECT:
  51.     case MOD_CONNECT_300:
  52.     slot.baud = 300;
  53.     break;
  54.  
  55.     case MOD_CONNECT_1200:
  56.     slot.baud = 1200;
  57.     break;
  58.         
  59.     case MOD_CONNECT_2400:
  60.     slot.baud = 2400;
  61.     break;
  62.         
  63.      case MOD_CONNECT_4800:
  64.     slot.baud = 4800;
  65.     break;
  66.         
  67.     case MOD_CONNECT_9600:
  68.     slot.baud = 9600;
  69.     break;
  70.  
  71.     case MOD_RING:
  72.     case MOD_OK:
  73.     return E_RETRY;
  74.  
  75.     default:
  76.     logerr("connect: unknown modem code: %d", mod_rc);
  77.     return E_FAIL;
  78.     }
  79.  
  80.     /*
  81.      * Don't accept dialup orders during login.
  82.      */
  83.     slot.status = SLOT_LOGIN;
  84.     slot_write(&slot);
  85.  
  86.     log("connected at baud %d", slot.baud);
  87.     /* Also set the message data to correct baud */
  88.     msg_slot.baud = slot.baud;
  89.  
  90.     /*
  91.      * Setup port in sane mode.
  92.      */
  93.     tty_baud(slot.baud);
  94.     tty_local(0);
  95.     tty_sane();
  96.     tty_flush();
  97.  
  98.     /*
  99.      * Request everything from calling user.
  100.      */
  101.     rc = do_login(&msg_slot);
  102.  
  103.     tty_raw();
  104.  
  105.     /* Turn back off DCD checking */
  106.     tty_local(1);
  107.  
  108.     /* If login successful, do a callback.
  109.      * If I'm the only free server left, the
  110.      * call to callback will never return.
  111.      */
  112.     if (rc != E_OK)  {
  113.     return E_FAIL;
  114.     }
  115.  
  116.     mod_put(MSG_HANGUP);
  117.     if (callback(&msg_slot) != E_OK) {
  118.     logerr("callback failed");
  119.     return E_FAIL;
  120.     }
  121.  
  122.     return E_OK;
  123. }
  124.  
  125. /*******************************************************************
  126.  *
  127.  *         DO_LOGIN
  128.  *        --------
  129.  *
  130.  * Description:
  131.  *    Reads username and password, does a check and return phone number
  132.  *
  133.  *******************************************************************/
  134. int
  135. do_login(slot_t *sp)
  136. {
  137.     char passwd[NAME_SIZE];        /* Temporary password        */
  138.     char str[200];            /* Temporary string             */
  139.     char *field[N_FIELDS];        /* Fields in the USERS file    */
  140.     int rc;                             /* Return code                  */
  141.     int retry;                /* Retry counter        */
  142.     FILE *fp;                /* Temporary file pointer    */
  143.     char *p;                /* Temporary char pointer    */
  144.  
  145.     /*
  146.      * Give greetings message.
  147.      */
  148.     if ((fp = fopen(GREETINGSFILE, "r")) != NULL) {
  149.     while(fgets(str, sizeof str, fp) != NULL) {
  150.         mod_put(str);
  151.         mod_put("\r");
  152.     }
  153.     fclose(fp);
  154.     }
  155.     else {
  156.     logerr("failed to open greetings file");
  157.     }
  158.  
  159.     for(retry = 0; retry < MAX_RETRY; retry++)
  160.     {
  161.     /* Get login name */
  162.     do {
  163.         rc = prompt(MSG_NAME, sp->name, sizeof sp->name, LOGIN_TMOUT);
  164.     }
  165.     while(rc == E_OK && strlen(sp->name) == 0);
  166.  
  167.     if (rc != E_OK) {
  168.         if (rc == E_TMOUT) {
  169.         debug("do_login: timeout");
  170.             mod_put(MSG_LOGINFAIL);
  171.         return E_FAIL;
  172.         }
  173.         debug("do_login: login: rc = %d, errno = %d", rc, errno);
  174.         mod_put(MSG_LOGINFAIL);
  175.         continue;
  176.     }
  177.  
  178.     /* Get passwd */
  179.     tty_noecho();
  180.     rc = prompt(MSG_PASSWD, passwd, sizeof passwd, LOGIN_TMOUT);
  181.     tty_echo();
  182.     mod_put("\r\n");
  183.  
  184.     if (rc != E_OK) {
  185.         debug("do_login: passwd: rc = %d, errno = %d", rc, errno);
  186.         mod_put(MSG_LOGINFAIL);
  187.         continue;
  188.     }
  189.  
  190.     /* Get user data */
  191.     if (db_find(USERS, field, sizeof field / sizeof field[0], 0, sp->name) != E_OK)
  192.     {
  193.         debug("do_login: db_find: rc = %d, errno = %d", rc, errno);
  194.             mod_put(MSG_LOGINFAIL);
  195.         continue;
  196.     }
  197.  
  198.     /* Check validity */
  199.     if (field[0] == NULL || field[1] == NULL || field[2] == NULL
  200. #ifdef RLOGIN
  201.         || field[3] == NULL
  202. #endif
  203.        )
  204.     {
  205.         logerr("do_login: illegal data for user '%s'", sp->name);
  206.         mod_put(MSG_LOGINFAIL);
  207.         return E_FAIL;
  208.     }
  209.  
  210.     /* Check if password is ok */
  211.     if (strcmp(field[1], passwd) != 0) {
  212.         debug("do_login: wrong password");
  213.         mod_put(MSG_LOGINFAIL);
  214.         continue;
  215.     }
  216.  
  217.     /* Login succeded */
  218.     strncpy(sp->name, field[0], sizeof sp->name);
  219. #ifdef RLOGIN
  220.     strncpy(sp->host, field[3], sizeof sp->host);
  221. #endif
  222.  
  223.     /*
  224.      * Check if wildcard phonenumber or phonenumber list.
  225.      */
  226.     if ((strchr(field[2], '*') != NULL) || (strchr(field[2], '/') != NULL)) {
  227.         /*
  228.          * Request phonenumber from user.
  229.          */
  230.         do {
  231.         rc = prompt(MSG_PHONE, sp->phone, sizeof sp->phone, LOGIN_TMOUT);
  232.         }
  233.         while(rc == E_OK && strlen(sp->phone) == 0);
  234.         if (rc != E_OK) {
  235.         log("failed to read phone number");
  236.         mod_put(MSG_LOGINFAIL);
  237.         continue;
  238.         }
  239.  
  240.         /* 
  241.          * Check entered number against list.
  242.          */
  243.         for(p = strtok(field[2], "/"); p != NULL; p = strtok(NULL, "/"))
  244.         {
  245. debug("trying '%s' vs. '%s'\n", p, sp->phone);
  246.         if ((strcmp(p, "*") == 0) || (strcmp(p, sp->phone) == 0)) {
  247.             break;
  248.         }
  249.         }
  250.         if (p == NULL) {
  251.         log("wrong phonenumber");
  252.         mod_put(MSG_LOGINFAIL);
  253.         continue;
  254.         }
  255.  
  256.         if (strcmp(p, "*") == 0) {
  257.         log("privileged user '%s' succeded to login (phone: %s)", sp->name, sp->phone);
  258.         }
  259.         else {
  260.         log("user '%s' succeded to login (phone: %s)", sp->name, sp->phone);
  261.         }
  262.     }
  263.     else {
  264.         strncpy(sp->phone, field[2], sizeof sp->phone);
  265.         log("user '%s' succeded to login", sp->name);
  266.     }
  267.  
  268.     return E_OK;
  269.     }
  270.     log("user '%s' tried to login but failed", sp->name);
  271.     return E_FAIL;
  272. }
  273.