auth.c
上传用户:pycemail
上传日期:2007-01-04
资源大小:329k
文件大小:7k
源码类别:

Ftp客户端

开发平台:

Unix_Linux

  1. /*
  2.  * ProFTPD - FTP server daemon
  3.  * Copyright (c) 1997, 1998 Public Flood Software
  4.  *
  5.  * This program is free software; you can redistribute it and/or modify
  6.  * it under the terms of the GNU General Public License as published by
  7.  * the Free Software Foundation; either version 2 of the License, or
  8.  * (at your option) any later version.
  9.  *
  10.  * This program is distributed in the hope that it will be useful,
  11.  * but WITHOUT ANY WARRANTY; without even the implied warranty of
  12.  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  13.  * GNU General Public License for more details.
  14.  *
  15.  * You should have received a copy of the GNU General Public License
  16.  * along with this program; if not, write to the Free Software
  17.  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307, USA.
  18.  */
  19. /* Authentication front-end for ProFTPD
  20.  * $Id: auth.c,v 1.2 1999/09/17 07:31:44 macgyver Exp $
  21.  */
  22. #include "conf.h"
  23. static cmd_rec *_make_cmd(pool *cp, int argc, ...)
  24. {
  25.   va_list args;
  26.   cmd_rec *c;
  27.   int     i;
  28.   c = pcalloc(cp,sizeof(cmd_rec));
  29.   c->argc = argc;
  30.   c->symtable_index = -1;
  31.   if(argc) {
  32.     c->argv = pcalloc(cp,sizeof(void*)*argc);
  33.     va_start(args,argc);
  34.     for(i = 0; i < argc; i++)
  35.       c->argv[i] = (void*)va_arg(args,char*);
  36.     va_end(args);
  37.   }
  38.   return c;
  39. }
  40. static modret_t *_dispatch_auth(cmd_rec *cmd, char *match)
  41. {
  42.   authtable *m;
  43.   modret_t *mr = NULL;
  44.   m = mod_find_auth_symbol(match,&cmd->symtable_index,NULL);
  45.   while(m) {
  46.     mr = call_module_auth(m->m,m->handler,cmd);
  47.     if(MODRET_ISHANDLED(mr) || MODRET_ISERROR(mr))
  48.       break;
  49.     m = mod_find_auth_symbol(match,&cmd->symtable_index,m);
  50.   }
  51.     
  52.   return mr; 
  53. }
  54. void auth_setpwent(pool *p)
  55. {
  56.   cmd_rec *c;
  57.   modret_t *mr;
  58.   c = _make_cmd(p,0);
  59.   mr = _dispatch_auth(c,"setpwent");
  60.   if(c->tmp_pool) {
  61.     destroy_pool(c->tmp_pool);
  62.     c->tmp_pool = NULL;
  63.   }
  64.   return;  
  65. }
  66. void auth_endpwent(pool *p)
  67. {
  68.   cmd_rec *c;
  69.   modret_t *mr;
  70.   c = _make_cmd(p,0);
  71.   mr = _dispatch_auth(c,"endpwent");
  72.   if(c->tmp_pool) {
  73.     destroy_pool(c->tmp_pool);
  74.     c->tmp_pool = NULL;
  75.   }
  76.   return;  
  77. }
  78. void auth_setgrent(pool *p)
  79. {
  80.   cmd_rec *c;
  81.   modret_t *mr;
  82.   c = _make_cmd(p,0);
  83.   mr = _dispatch_auth(c,"setgrent");
  84.   if(c->tmp_pool) {
  85.     destroy_pool(c->tmp_pool);
  86.     c->tmp_pool = NULL;
  87.   }
  88.   return;  
  89. }
  90. void auth_endgrent(pool *p)
  91. {
  92.   cmd_rec *c;
  93.   modret_t *mr;
  94.   c = _make_cmd(p,0);
  95.   mr = _dispatch_auth(c,"endgrent");
  96.   if(c->tmp_pool) {
  97.     destroy_pool(c->tmp_pool);
  98.     c->tmp_pool = NULL;
  99.   }
  100.   return;  
  101. }
  102. struct passwd *auth_getpwent(pool *p)
  103. {
  104.   cmd_rec *c;
  105.   modret_t *mr;
  106.   struct passwd *ret = NULL;
  107.   c = _make_cmd(p,0);
  108.   mr = _dispatch_auth(c,"getpwent");
  109.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr))
  110.     ret = mr->data;
  111.   if(c->tmp_pool) {
  112.     destroy_pool(c->tmp_pool);
  113.     c->tmp_pool = NULL;
  114.   }
  115.   return ret;
  116. }
  117. struct group *auth_getgrent(pool *p)
  118. {
  119.   cmd_rec *c;
  120.   modret_t *mr;
  121.   struct group *ret = NULL;
  122.   c = _make_cmd(p,0);
  123.   mr = _dispatch_auth(c,"getgrent");
  124.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr))
  125.     ret = mr->data;
  126.   if(c->tmp_pool) {
  127.     destroy_pool(c->tmp_pool);
  128.     c->tmp_pool = NULL;
  129.   }
  130.   return ret;
  131. }
  132. struct passwd *auth_getpwnam(pool *p, const char *name)
  133. {
  134.   cmd_rec *c;
  135.   modret_t *mr;
  136.   struct passwd *ret = NULL;
  137.   c = _make_cmd(p,1,name);
  138.   mr = _dispatch_auth(c,"getpwnam");
  139.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr))
  140.     ret = mr->data;
  141.   if(c->tmp_pool) {
  142.     destroy_pool(c->tmp_pool);
  143.     c->tmp_pool = NULL;
  144.   }
  145.   return ret;
  146. }
  147. struct passwd *auth_getpwuid(pool *p, uid_t uid)
  148. {
  149.   cmd_rec *c;
  150.   modret_t *mr;
  151.   struct passwd *ret = NULL;
  152.   c = _make_cmd(p,1,(void*)uid);
  153.   mr = _dispatch_auth(c,"getpwuid");
  154.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr))
  155.     ret = mr->data;
  156.   if(c->tmp_pool) {
  157.     destroy_pool(c->tmp_pool);
  158.     c->tmp_pool = NULL;
  159.   }
  160.   return ret;
  161. }
  162. struct group *auth_getgrnam(pool *p, const char *name)
  163. {
  164.   cmd_rec *c;
  165.   modret_t *mr;
  166.   struct group *ret = NULL;
  167.   c = _make_cmd(p,1,name);
  168.   mr = _dispatch_auth(c,"getgrnam");
  169.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr))
  170.     ret = mr->data;
  171.   if(c->tmp_pool) {
  172.     destroy_pool(c->tmp_pool);
  173.     c->tmp_pool = NULL;
  174.   }
  175.   return ret;
  176. }
  177. struct group *auth_getgrgid(pool *p, gid_t gid)
  178. {
  179.   cmd_rec *c;
  180.   modret_t *mr;
  181.   struct group *ret = NULL;
  182.   c = _make_cmd(p,1,(void*)gid);
  183.   mr = _dispatch_auth(c,"getgrgid");
  184.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr))
  185.     ret = mr->data;
  186.   if(c->tmp_pool) {
  187.     destroy_pool(c->tmp_pool);
  188.     c->tmp_pool = NULL;
  189.   }
  190.   return ret;
  191. }
  192. int auth_authenticate(pool *p, const char *name, const char *pw)
  193. {
  194.   cmd_rec *c;
  195.   modret_t *mr;
  196.   int ret = AUTH_NOPWD;
  197.   c = _make_cmd(p,2,name,pw);
  198.   mr = _dispatch_auth(c,"auth");
  199.   if(MODRET_ISHANDLED(mr))
  200.     ret = 0;
  201.   else if(MODRET_ISERROR(mr))
  202.     ret = MODRET_ERROR(mr);
  203.   if(c->tmp_pool) {
  204.     destroy_pool(c->tmp_pool);
  205.     c->tmp_pool = NULL;
  206.   }
  207.   return ret;
  208. }
  209. int auth_check(pool *p, const char *cpw, const char *name, const char *pw)
  210. {
  211.   cmd_rec *c;
  212.   modret_t *mr;
  213.   int ret = AUTH_BADPWD;
  214.   c = _make_cmd(p,3,cpw,name,pw);
  215.   mr = _dispatch_auth(c,"check");
  216.   if(MODRET_ISHANDLED(mr))
  217.     ret = 0;
  218.   if(c->tmp_pool) {
  219.     destroy_pool(c->tmp_pool);
  220.     c->tmp_pool = NULL;
  221.   }
  222.   return ret;
  223. }
  224. const char *auth_uid_name(pool *p, uid_t uid)
  225. {
  226.   cmd_rec *c;
  227.   modret_t *mr;
  228.   static char namebuf[64];
  229.   char *ret = NULL;
  230.   c = _make_cmd(p,1,(void*)uid);
  231.   mr = _dispatch_auth(c,"uid_name");
  232.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr)) {
  233.     ret = mr->data;
  234.     sstrncpy(namebuf,ret,sizeof(namebuf));
  235.     ret = namebuf;
  236.   }
  237.   if(c->tmp_pool) {
  238.     destroy_pool(c->tmp_pool);
  239.     c->tmp_pool = NULL;
  240.   }
  241.   return ret;
  242. }
  243. const char *auth_gid_name(pool *p, gid_t gid)
  244. {
  245.   cmd_rec *c;
  246.   modret_t *mr;
  247.   static char namebuf[64];
  248.   char *ret = NULL;
  249.   c = _make_cmd(p,1,(void*)gid);
  250.   mr = _dispatch_auth(c,"gid_name");
  251.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr)) {
  252.     ret = mr->data;
  253.     sstrncpy(namebuf,ret,sizeof(namebuf));
  254.     ret = namebuf;
  255.   }
  256.   if(c->tmp_pool) {
  257.     destroy_pool(c->tmp_pool);
  258.     c->tmp_pool = NULL;
  259.   }
  260.   return ret;
  261. }
  262. uid_t auth_name_uid(pool *p, const char *name)
  263. {
  264.   cmd_rec *c;
  265.   modret_t *mr;
  266.   uid_t ret = -1;
  267.   c = _make_cmd(p,1,name);
  268.   mr = _dispatch_auth(c,"name_uid");
  269.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr))
  270.     ret = (uid_t)mr->data;
  271.   if(c->tmp_pool) {
  272.     destroy_pool(c->tmp_pool);
  273.     c->tmp_pool = NULL;
  274.   }
  275.   return ret;
  276. }
  277. gid_t auth_name_gid(pool *p, const char *name)
  278. {
  279.   cmd_rec *c;
  280.   modret_t *mr;
  281.   gid_t ret = -1;
  282.   c = _make_cmd(p,1,name);
  283.   mr = _dispatch_auth(c,"name_gid");
  284.   if(MODRET_ISHANDLED(mr) && MODRET_HASDATA(mr))
  285.     ret = (gid_t)mr->data;
  286.   if(c->tmp_pool) {
  287.     destroy_pool(c->tmp_pool);
  288.     c->tmp_pool = NULL;
  289.   }
  290.   return ret;
  291. }