Advertisement
FlyFar

tacacs_auth.c

May 16th, 2024
396
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.22 KB | Cybersecurity | 0 0
  1. #ifdef TACACS_AUTH
  2. /*
  3. /*
  4. **  tacacs_auth.c
  5. **
  6. **  TACACS support for pop3d password authentication
  7. **
  8. **  Author: Filippo Grassilli (phil@hyppo.com)
  9. **  Date:   14-Jun-97
  10. **
  11. **  This patch was written for systems that use TACACS authentication:
  12. **  although when a mbx resides on a host this entry must be present in
  13. **  users file, can be useful to keep authentication on another server.
  14. **  I use it also for logging reason.
  15. **  It works under Linux, *should* be portable!
  16. **
  17. */
  18.  
  19. #include <stdio.h>
  20. #include <signal.h>
  21. #include <netdb.h>
  22. #include <netinet/in.h>
  23. typedef unsigned char uchar;
  24. /* typedef unsigned long ulong; */
  25. #include "tacacs.h"
  26.  
  27. /************************************************************************/
  28. /* PROTO                                */
  29. /************************************************************************/
  30. void alrm(int sig);
  31. int get_servername(char sname[]);
  32. void get_myaddress(struct in_addr *addr);
  33.  
  34. /************************************************************************/
  35. /* TACACS_VERIFY_USER                           */
  36. /************************************************************************/
  37. int tacacs_verify_user(char *user, char *pass)
  38. {
  39. int s,len,r;
  40. struct hostent *he;
  41. struct servent *se;
  42. struct sockaddr_in sa;
  43. char buf[256];
  44. char tacacs_server[48];
  45. struct in_addr my_hostaddress, server_addr;
  46. xtacacstype *tp;
  47.  
  48.     if(!get_servername(tacacs_server)) {
  49.     /*
  50.     printf("tacacs server not found\n");
  51.     */
  52.     return(-1);
  53.     }
  54.     he=gethostbyname(tacacs_server);
  55.     if(!he) {
  56.     /*
  57.     printf("gethostbyname() failed [%s]\n",sys_errlist[errno]);
  58.     */
  59.     return(-1);
  60.     }
  61.     memcpy((char *)&server_addr.s_addr,he->h_addr,4);
  62.     bzero((caddr_t)&sa,sizeof(sa));
  63.     sa.sin_family      = AF_INET;
  64.     sa.sin_addr.s_addr = server_addr.s_addr;
  65.     /* Tries to get svc name from services, else uses default       */
  66.     se=getservbyname(TACACS_SVC_NAME,"udp");
  67.     if(se) sa.sin_port = se->s_port;
  68.     else   sa.sin_port = htons(TACACS_PORT);
  69.     /*
  70.     printf("Server: %s  Port: %d\n",inet_ntoa(server_addr),ntohs(sa.sin_port));
  71.     */
  72.     if((s=socket(AF_INET,SOCK_DGRAM,0))<0) {
  73.     /* printf("socket() failed [%s]\n",sys_errlist[errno]); */
  74.     return(-1);
  75.     }
  76.     /* My address to tell tac-server the host contacted         */
  77.     get_myaddress(&my_hostaddress);
  78.  
  79.     bzero(buf,sizeof(buf));
  80.     tp=(xtacacstype *)&buf[0];
  81.     tp->type=XTA_LOGIN;         /* Can be used also XTA_CONNECT */
  82.     tp->version=XTA_VERSION;
  83.     tp->trans=htons(getpid());      /* Haven't better idea??    */
  84.     tp->reason=XTA_A_NONE;
  85.     tp->dhost=my_hostaddress.s_addr;    /* Already in network order */
  86.     tp->dport=htons(110);       /* Use pop3 port number     */
  87.     tp->lport=htons(0);         /* Is it used by your server?   */
  88.     tp->namelen=(char)strlen(user);
  89.     tp->pwlen=(char)strlen(pass);
  90.     len=XTACACSSIZE+tp->namelen+tp->pwlen;
  91.     memcpy(&buf[XTACACSSIZE],user,tp->namelen);
  92.     memcpy(&buf[XTACACSSIZE+tp->namelen],pass,tp->pwlen);
  93.     sendto(s,buf,len,0,(struct sockaddr *)&sa,sizeof(struct sockaddr_in));
  94.  
  95.     /* Prepare to receive the answer                    */
  96.     memset(buf,0,sizeof(buf));
  97.     /* Set an appropriate timeout                   */
  98.     signal(SIGALRM,alrm);
  99.     alarm(ANSWER_TIMEOUT);
  100.     len=sizeof(struct sockaddr_in);
  101.     r=recvfrom(s,buf,sizeof(buf),0,(struct sockaddr *)&sa,&len);
  102.     alarm(0);
  103.     /* Probably timeout...                      */
  104.     if(r==-1) {
  105.     /*
  106.     printf(">>> XTACACS Timeout\n");
  107.     */
  108.     return(-1);
  109.     }
  110.     /*
  111.     printf(">>> XTACACS response (%d bytes): [V%02x %s]\n",r,tp->version,tp->response==1?"Accepted":"Rejected");
  112.     printf(">>> V%02x  Type:%d  Answer:%d %s (reason %d)\n",tp->version,tp->type,tp->response,tp->response==1?"Accepted":"Rejected",tp->reason);
  113.     */
  114.     close(s);
  115.     return(tp->response==1?0:-1);
  116. }
  117. /************************************************************************/
  118. /* ALRM                                 */
  119. /************************************************************************/
  120. void alrm(int sig)
  121. {
  122.     return;
  123. }
  124. /************************************************************************/
  125. /* GET_SERVERNAME                           */
  126. /************************************************************************/
  127. int get_servername(char sname[])
  128. {
  129. FILE *FP;
  130. char buf[80];
  131. int ok=0;
  132.  
  133.     FP=fopen(SERVER_FILE,"r");
  134.     if(!FP) {
  135.     fprintf(stdout,"-ERR %s unavailable\r\n",SERVER_FILE);
  136.     return(0);
  137.     }
  138.     while(fgets(buf,sizeof(buf),FP)) {
  139.     buf[strlen(buf)-1]='\0';
  140.     if(!strncmp(buf,"server ",7)) {
  141.         strcpy(sname,&buf[7]);
  142.         ok=1;
  143.         break;
  144.     }
  145.     }
  146.     fclose(FP);
  147.     if(!ok) {
  148.     fprintf(stdout,"-ERR server not found in %s\r\n",SERVER_FILE);
  149.     }
  150.     return(ok);
  151. }
  152. /************************************************************************/
  153. /* GET_MYADDRESS                            */
  154. /************************************************************************/
  155. void get_myaddress(struct in_addr *addr)
  156. {
  157. char name[48];
  158. struct hostent *he;
  159.  
  160.     gethostname(name,sizeof(name));
  161.     strncat(name,".",sizeof(name)-strlen(name)-1);
  162.     if(getdomainname(&name[strlen(name)],sizeof(name)-strlen(name-1))!=0) {
  163.     gethostname(name,sizeof(name));
  164.     }
  165.     he=gethostbyname(name);
  166.     memcpy((char *)&addr->s_addr,he->h_addr,4);
  167.     /* printf("%s\n",inet_ntoa(*addr)); */
  168. }
  169. /* EOF ******************************************************************/
  170. #endif
  171.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement