auth_log.c
上传用户:ycwykj01
上传日期:2007-01-04
资源大小:1819k
文件大小:4k
源码类别:

网络编程

开发平台:

Unix_Linux

  1. /*
  2.  * Program: Login authenticator
  3.  *
  4.  * Author: Mark Crispin
  5.  * Networks and Distributed Computing
  6.  * Computing & Communications
  7.  * University of Washington
  8.  * Administration Building, AG-44
  9.  * Seattle, WA  98195
  10.  * Internet: MRC@CAC.Washington.EDU
  11.  *
  12.  * Date: 5 December 1995
  13.  * Last Edited: 1 December 1998
  14.  *
  15.  * Copyright 1998 by the University of Washington
  16.  *
  17.  *  Permission to use, copy, modify, and distribute this software and its
  18.  * documentation for any purpose and without fee is hereby granted, provided
  19.  * that the above copyright notice appears in all copies and that both the
  20.  * above copyright notice and this permission notice appear in supporting
  21.  * documentation, and that the name of the University of Washington not be
  22.  * used in advertising or publicity pertaining to distribution of the software
  23.  * without specific, written prior permission.  This software is made available
  24.  * "as is", and
  25.  * THE UNIVERSITY OF WASHINGTON DISCLAIMS ALL WARRANTIES, EXPRESS OR IMPLIED,
  26.  * WITH REGARD TO THIS SOFTWARE, INCLUDING WITHOUT LIMITATION ALL IMPLIED
  27.  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, AND IN
  28.  * NO EVENT SHALL THE UNIVERSITY OF WASHINGTON BE LIABLE FOR ANY SPECIAL,
  29.  * INDIRECT OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
  30.  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, TORT
  31.  * (INCLUDING NEGLIGENCE) OR STRICT LIABILITY, ARISING OUT OF OR IN CONNECTION
  32.  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  33.  *
  34.  */
  35. long auth_login_client (authchallenge_t challenger,authrespond_t responder,
  36. NETMBX *mb,void *stream,unsigned long *trial,
  37. char *user);
  38. char *auth_login_server (authresponse_t responder,int argc,char *argv[]);
  39. AUTHENTICATOR auth_log = {
  40.   NIL, /* not secure */
  41.   "LOGIN", /* authenticator name */
  42.   NIL, /* always valid */
  43.   auth_login_client, /* client method */
  44.   auth_login_server, /* server method */
  45.   NIL /* next authenticator */
  46. };
  47. #define PWD_USER "User Name"
  48. #define PWD_PWD "Password"
  49. /* Client authenticator
  50.  * Accepts: challenger function
  51.  *     responder function
  52.  *     parsed network mailbox structure
  53.  *     stream argument for functions
  54.  *     pointer to current trial count
  55.  *     returned user name
  56.  * Returns: T if success, NIL otherwise, number of trials incremented if retry
  57.  */
  58. long auth_login_client (authchallenge_t challenger,authrespond_t responder,
  59. NETMBX *mb,void *stream,unsigned long *trial,
  60. char *user)
  61. {
  62.   char pwd[MAILTMPLEN];
  63.   void *challenge;
  64.   unsigned long clen;
  65. /* get user name prompt */
  66.   if (challenge = (*challenger) (stream,&clen)) {
  67.     fs_give ((void **) &challenge);
  68. /* prompt user */
  69.     mm_login (mb,user,pwd,*trial);
  70.     if (!pwd[0]) { /* user requested abort */
  71.       (*responder) (stream,NIL,0);
  72.       *trial = 0; /* don't retry */
  73.       return T; /* will get a NO response back */
  74.     }
  75. /* send user name */
  76.     else if ((*responder) (stream,user,strlen (user)) &&
  77.      (challenge = (*challenger) (stream,&clen))) {
  78.       fs_give ((void **) &challenge);
  79. /* send password */
  80.       if ((*responder) (stream,pwd,strlen (pwd)) &&
  81.   !(challenge = (*challenger) (stream,&clen))) {
  82. ++*trial; /* can try again if necessary */
  83. return T; /* check the authentication */
  84.       }
  85.     }
  86.   }
  87.   *trial = 0; /* don't retry */
  88.   return NIL; /* failed */
  89. }
  90. /* Server authenticator
  91.  * Accepts: responder function
  92.  *     argument count
  93.  *     argument vector
  94.  * Returns: authenticated user name or NIL
  95.  */
  96. char *auth_login_server (authresponse_t responder,int argc,char *argv[])
  97. {
  98.   char *ret = NIL;
  99.   char *user,*pass;
  100.   if (user = (*responder) (PWD_USER,sizeof (PWD_USER),NIL)) {
  101.     if (pass = (*responder) (PWD_PWD,sizeof (PWD_PWD),NIL)) {
  102.       if (server_login (user,pass,argc,argv)) ret = myusername ();
  103.       fs_give ((void **) &pass);
  104.     }
  105.     fs_give ((void **) &user);
  106.   }
  107.   return ret;
  108. }