home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 35 Internet / 35-Internet.zip / tnlogin.zip / login2.c < prev    next >
C/C++ Source or Header  |  1997-01-20  |  5KB  |  219 lines

  1. /* login2.c - "login" program using /etc/passwd
  2.  *
  3.  * Author:  Kai Uwe Rommel <rommel@ars.muc.de>
  4.  * Created: Mon Mar 28 1994
  5.  */
  6.  
  7. static char *rcsid =
  8. "$Id: login2.c,v 1.2 1994/09/18 19:42:21 rommel Exp rommel $";
  9. static char *rcsrev = "$Revision: 1.2 $";
  10.  
  11. /*
  12.  * $Log: login2.c,v $
  13.  * Revision 1.2  1994/09/18 19:42:21  rommel
  14.  * forbid calling the program directly
  15.  *
  16.  * Revision 1.1  1994/09/16 08:32:48  rommel
  17.  * Initial revision
  18.  * 
  19.  */
  20.  
  21. #include <stdio.h>
  22. #include <stdlib.h>
  23. #include <signal.h>
  24. #include <process.h>
  25. #include <string.h>
  26. #include <ctype.h>
  27. #include <pwd.h>
  28. #include <time.h>
  29.  
  30. extern char *crypt(char *, char*);
  31.  
  32. extern char *getpass(char *);
  33. char *getline(const char *prompt);
  34.  
  35. int log(int error, char *message, char *arg)
  36. {
  37.   char buffer[256], *ptr;
  38.   FILE *file;
  39.   time_t now;
  40.   struct tm *tm;
  41.  
  42.   if ((ptr = getenv("ETC")) == NULL)
  43.     return -1;
  44.  
  45.   strcpy(buffer, ptr);
  46.   strcat(buffer, "/");
  47.   strcat(buffer, error ? "login.bad" : "login.log");
  48.  
  49.   if ((file = fopen(buffer, "a")) == NULL)
  50.     return -1;
  51.  
  52.   time(&now);
  53.   tm = localtime(&now);
  54.   strftime(buffer, sizeof(buffer), "%d/%m/%y %H:%M:%S", tm);
  55.  
  56.   fprintf(file, "%s: %s: %s\n", buffer, message, arg);
  57.  
  58.   fclose(file);
  59.  
  60.   return 0;
  61. }
  62.  
  63. int showfile(char *name)
  64. {
  65.   char buffer[256], *ptr;
  66.   FILE *file;
  67.  
  68.   if ((ptr = getenv("ETC")) == NULL)
  69.     return -1;
  70.  
  71.   strcpy(buffer, ptr);
  72.   strcat(buffer, "/");
  73.   strcat(buffer, name);
  74.  
  75.   if ((file = fopen(buffer, "r")) == NULL)
  76.     return -1;
  77.  
  78.   while (fgets(buffer, sizeof(buffer), file) != NULL)
  79.     fputs(buffer, stdout);
  80.  
  81.   fclose(file);
  82.  
  83.   return 0;
  84. }
  85.  
  86. void session(struct passwd *pw)
  87. {
  88.   char user[64], logname[64], fullname[256], uid[32], gid[32], home[256];
  89.   char shell[256], cmd[512], *args;
  90.  
  91.   if (showfile("motd"))
  92.     printf("login successful.\n");
  93.  
  94.   sprintf(user, "USER=%s", pw->pw_name);
  95.   putenv(user);
  96.   sprintf(logname, "LOGNAME=%s", pw->pw_name);
  97.   putenv(logname);
  98.   sprintf(fullname, "FULLNAME=%s", pw->pw_gecos);
  99.   putenv(fullname);
  100.  
  101.   sprintf(uid, "UNIX.UID=%d", pw->pw_uid);
  102.   putenv(uid);
  103.   sprintf(gid, "UNIX.GID=%d", pw->pw_gid);
  104.   putenv(gid);
  105.  
  106.   sprintf(home, "HOME=%s", pw->pw_dir);
  107.   putenv(home);
  108.  
  109.   sprintf(shell, "SHELL=%s", pw->pw_shell);
  110.   putenv(shell);
  111.  
  112.   if (isalpha(pw->pw_dir[0]) && pw->pw_dir[1] == ':')
  113.     _chdrive(toupper(pw->pw_dir[0]) - 'A' + 1);
  114.   _chdir(pw->pw_dir);
  115.  
  116.   strcpy(cmd, pw->pw_shell);
  117.   if ((args = strchr(cmd, ' ')) != NULL)
  118.     *args++ = 0;
  119.  
  120.   spawnle(P_WAIT, cmd, cmd,
  121.       /* bug in IBM C Set++: */ /*args ? cmd : NULL, */
  122.       args, NULL, environ);
  123.  
  124.   putenv("USER");
  125.   putenv("LOGNAME");
  126.   putenv("FULLNAME");
  127.   putenv("UNIX.UID");
  128.   putenv("UNIX.GID");
  129.   putenv("HOME");
  130.   putenv("SHELL");
  131. }
  132.  
  133. void ignore(int sig)
  134. {
  135.   signal(SIGINT, ignore);
  136.   signal(SIGBREAK, ignore);
  137.   msleep(5 * 1000);
  138. }
  139.  
  140. int main(int argc, char **argv)
  141. {
  142.   struct passwd *pw;
  143.   char user[64], password[64], crypted[64], *cp;
  144.   static char buffer[256];
  145.   int cnt, failed = 0;
  146.  
  147.   signal(SIGINT, ignore);
  148.   signal(SIGBREAK, ignore);
  149.  
  150.   if ((cp = getenv("TELNET_COMSPEC")) == NULL)
  151.   {
  152.     printf("\nThis program cannot be called directly, only by the telnet daemon.\n");
  153.     exit(1);
  154.   }
  155.  
  156.   sprintf(buffer, "COMSPEC=%s", cp);
  157.   putenv(buffer);
  158.   putenv("TELNET_COMSPEC=");
  159.  
  160.   log(0, "telnet login started", "");
  161.  
  162.   for (;;)
  163.   {
  164.     if (showfile("issue"))
  165.       printf("\nOS/2 %d.%02d (%s)\n", 
  166.          _osmajor / 10, _osminor, getenv("HOSTNAME"));
  167.  
  168.     for (;;)
  169.     {
  170.       strcpy(user, getline("login: "));
  171.       strcpy(password, getpass("password: "));
  172.       failed++;
  173.  
  174.       if ((pw = getpwnam(user)) == NULL)
  175.       {
  176.     memset(password, 0, sizeof(password));
  177.     printf("login failed.\n\n");
  178.     log(1, "no such user", user);
  179.       }
  180.       else
  181.       {
  182.     strcpy(crypted, crypt(password, pw->pw_passwd));
  183.     memset(password, 0, sizeof(password));
  184.  
  185.     if (strcmp(pw->pw_passwd, crypted) != 0)
  186.     {
  187.       printf("login failed.\n\n");
  188.       log(1, "wrong password for user", user);
  189.     }
  190.     else if (strlen(pw->pw_dir) == 0 || strlen(pw->pw_shell) == 0)
  191.     {
  192.       printf("login failed.\n\n");
  193.       log(1, "login not permitted", user);
  194.     }
  195.     else
  196.     {
  197.       log(0, "user login", user);
  198.       session(pw);
  199.       log(0, "user logout", user);
  200.       failed = 0;
  201.       return 0;
  202.     }
  203.       }
  204.  
  205.       if (failed >= 5)
  206.       {
  207.     log(1, "telnet login aborted after maximum number of failed login attempts", "");
  208.     return 1;
  209.       }
  210.  
  211.       msleep(5 * 1000);
  212.     }
  213.   }
  214.   
  215.   return 0;
  216. }
  217.  
  218. /* end of login.c */
  219.