/ [pam-modules] / trunk / pam_fshadow / pam_fshadow.c
To checkout: svn checkout http://svn.gnu.org.ua/sources/pam-modules/trunk/pam_fshadow/pam_fshadow.c
Puszcza

Diff of /trunk/pam_fshadow/pam_fshadow.c

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 62 by gray, Tue Aug 28 13:00:56 2007 UTC revision 63 by gray, Thu Mar 13 13:53:32 2008 UTC
# Line 1  Line 1 
1  /* This file is part of pam-modules.  /* This file is part of pam-modules.
2   * Copyright (C) 2001, 2005, 2007 Sergey Poznyakoff   * Copyright (C) 2001, 2005, 2007, 2008 Sergey Poznyakoff
3   *   *
4   * This program is free software; you can redistribute it and/or modify it   * This program is free software; you can redistribute it and/or modify it
5   * under the terms of the GNU General Public License as published by the   * under the terms of the GNU General Public License as published by the
# Line 17  Line 17 
17    
18  /* pam_fshadow */  /* pam_fshadow */
19    
20  #if defined(HAVE_CONFIG_H)  #include <graypam.h>
 # include <config.h>  
 #endif  
   
 #include <security/_pam_aconf.h>  
   
 #include <stdlib.h>  
 #include <stdio.h>  
 #include <unistd.h>  
 #include <string.h>  
 #include <syslog.h>  
 #include <stdarg.h>  
21  #include <time.h>  #include <time.h>
 #include <sys/types.h>  
 #include <sys/stat.h>  
 #include <fcntl.h>  
 #include <errno.h>  
22  #include <pwd.h>  #include <pwd.h>
23  #include <shadow.h>  #include <shadow.h>
24  #include <regex.h>  
25    #if defined(HAVE_CRYPT_H)
26    # include <crypt.h>
27    #else
28    extern char *crypt(const char *, const char *);
29    #endif
30    
31  #define PAM_SM_AUTH  #define PAM_SM_AUTH
32  #define PAM_SM_ACCOUNT  #define PAM_SM_ACCOUNT
33    
34  #include <security/pam_modules.h>  #include <security/pam_modules.h>
35    
 #include <common.c>  
   
36  char *sysconfdir = SYSCONFDIR;  char *sysconfdir = SYSCONFDIR;
37  static int cntl_flags = 0;  static int cntl_flags = 0;
38    
# Line 53  Line 41 
41  static int username_index = 1;  static int username_index = 1;
42  static int domain_index = 2;  static int domain_index = 2;
43    
44  #define CNTL_DEBUG       0x0001  #define CNTL_AUTHTOK     0x0010
45  #define CNTL_AUTHTOK     0x0002  #define CNTL_NOPASSWD    0x0020
46  #define CNTL_NOPASSWD    0x0004  #define CNTL_REGEX       0x0040
 #define CNTL_REGEX       0x0008  
   
 #define CNTL_DEBUG_LEV() (cntl_flags>>16)  
 #define CNTL_SET_DEBUG_LEV(cntl,n) (cntl |= ((n)<<16))  
 #define DEBUG(m,c) if (CNTL_DEBUG_LEV()>=(m)) _pam_debug c  
47    
48  static int  static int
49  _pam_parse(pam_handle_t *pamh, int argc, const char **argv)  _pam_parse(pam_handle_t *pamh, int argc, const char **argv)
# Line 68  Line 51 
51          int regex_flags = 0;          int regex_flags = 0;
52          int retval = PAM_SUCCESS;          int retval = PAM_SUCCESS;
53                    
54            gray_log_init(0, MODULE_NAME, LOG_AUTHPRIV);
55            
56          /* step through arguments */          /* step through arguments */
57          for (cntl_flags = 0; argc-- > 0; ++argv) {          for (cntl_flags = 0; argc-- > 0; ++argv) {
58    
# Line 132  Line 117 
117                  } else {                  } else {
118                          cntl_flags |= CNTL_REGEX;                          cntl_flags |= CNTL_REGEX;
119                          rc = pam_set_data(pamh, "REGEX", &rexp,                          rc = pam_set_data(pamh, "REGEX", &rexp,
120                                            _cleanup_regex);                                            gray_cleanup_regex);
121                                                    
122                          if (rc != PAM_SUCCESS) {                          if (rc != PAM_SUCCESS) {
123                                  _pam_log(LOG_NOTICE,                                  _pam_log(LOG_NOTICE,
# Line 147  Line 132 
132  }  }
133    
134  static int  static int
 converse(pam_handle_t *pamh,  
          int nargs,  
          struct pam_message **message,  
          struct pam_response **response)  
 {  
         int retval;  
         struct pam_conv *conv;  
   
         DEBUG(100,("enter converse"));  
   
         retval = pam_get_item(pamh, PAM_CONV, (const void **) &conv);  
         DEBUG(10,("pam_get_item(PAM_CONV): %d", retval));  
         if (retval == PAM_SUCCESS) {  
   
                 retval = conv->conv(nargs,  
                                     (const struct pam_message **) message,  
                                     response,  
                                     conv->appdata_ptr);  
                   
                 DEBUG(10, ("app conversation returned %d", retval));  
   
                 if (retval != PAM_SUCCESS) {  
                         _pam_log(LOG_ERR,  
                                  "conversation failure [%s]",  
                                  pam_strerror(pamh, retval));  
                 }  
         } else if (retval != PAM_CONV_AGAIN) {  
                 _pam_log(LOG_ERR,  
                          "couldn't obtain coversation function: %s",  
                          pam_strerror(pamh, retval));  
         }  
   
         DEBUG(100,("exit converse: %d", retval));  
   
         return retval;          /* propagate error status */  
 }  
   
 static int  
135  _pam_get_password(pam_handle_t *pamh, char **password, const char *prompt)  _pam_get_password(pam_handle_t *pamh, char **password, const char *prompt)
136  {  {
137          char *item, *token;          char *item, *token;
# Line 229  Line 176 
176          /* run conversation */          /* run conversation */
177          resp = NULL;          resp = NULL;
178          token = NULL;          token = NULL;
179          retval = converse(pamh, i, pmsg, &resp);          retval = gray_converse(pamh, i, pmsg, &resp);
180    
181          if (resp != NULL) {          if (resp != NULL) {
182                  if (retval == PAM_SUCCESS) {    /* a good conversation */                  if (retval == PAM_SUCCESS) {    /* a good conversation */
# Line 253  Line 200 
200                   */                   */
201                  retval = pam_set_data(pamh, "password",                  retval = pam_set_data(pamh, "password",
202                                        (void *)token,                                        (void *)token,
203                                        _cleanup_string);                                        gray_cleanup_string);
204                  if (retval != PAM_SUCCESS) {                  if (retval != PAM_SUCCESS) {
205                          _pam_log(LOG_CRIT,                          _pam_log(LOG_CRIT,
206                                   "can't keep password: %s",                                   "can't keep password: %s",
207                                   pam_strerror(pamh, retval));                                   pam_strerror(pamh, retval));
208                          _pam_delete(token);                          gray_pam_delete(token);
209                  } else {                  } else {
210                          *password = token;                          *password = token;
211                          token = NULL;   /* break link to password */                          token = NULL;   /* break link to password */
# Line 397  Line 344 
344                  _pam_log(LOG_CRIT, "not enough memory");                  _pam_log(LOG_CRIT, "not enough memory");
345                  return PAM_SYSTEM_ERR;                  return PAM_SYSTEM_ERR;
346          }          }
347          rc = pam_set_data(pamh, name, (void *)str, _cleanup_string);          rc = pam_set_data(pamh, name, (void *)str, gray_cleanup_string);
348          if (rc != PAM_SUCCESS) {          if (rc != PAM_SUCCESS) {
349                  _pam_log(LOG_CRIT,                  _pam_log(LOG_CRIT,
350                           "can't keep data [%s]: %s",                           "can't keep data [%s]: %s",
351                           name,                           name,
352                           pam_strerror(pamh, rc));                           pam_strerror(pamh, rc));
353                  _pam_delete(str);                  gray_pam_delete(str);
354          } else {          } else {
355                  if (size != 0)                  if (size != 0)
356                          memcpy(str, buf + rmatch[index].rm_so, size);                          memcpy(str, buf + rmatch[index].rm_so, size);
# Line 453  Line 400 
400                                  return rc;                                  return rc;
401                          confdir = mkfilename(sysconfdir, domain);                          confdir = mkfilename(sysconfdir, domain);
402                          pam_set_data(pamh, "CONFDIR",                          pam_set_data(pamh, "CONFDIR",
403                                       (void *)confdir, _cleanup_string);                                       (void *)confdir, gray_cleanup_string);
404                  } else {                  } else {
405                          _pam_log(LOG_DEBUG,                          _pam_log(LOG_DEBUG,
406                                   "user name `%s' does not match regular "                                   "user name `%s' does not match regular "

Legend:
Removed from v.62  
changed lines
  Added in v.63

Send suggestions and bug reports to Sergey Poznyakoff
ViewVC Help
Powered by ViewVC 1.1.20