00001 
00008 #ifdef CPLUSPLUS
00009     #undef CPLUSPLUS
00010 #endif
00011 
00012 
00013 #include  "password.h"
00014 
00015 
00027 char*   get_passwd(char* user_id)
00028 {
00029     struct passwd* pw;
00030     struct spwd*   sp;
00031     char*  pass;
00032 
00033     pass = (char*)malloc(LPASS+1);
00034     if (pass==NULL) return NULL;
00035     memset(pass, 0, LPASS+1);
00036 
00037     
00038     pw = getpwnam((const char*)user_id);
00039     if (pw==NULL) {
00040         free(pass);
00041         return NULL;
00042     }
00043     strncpy(pass, pw->pw_passwd, LPASS);
00044     if (strcmp(pass, "*") && strcmp(pass, "x") && strcmp(pass, "!")) return pass;
00045 
00046 #ifdef HAVE_GETSPNAM
00047     
00048     sp = getspnam((const char*)user_id);
00049     if (sp!=NULL) {
00050         strncpy(pass, sp->sp_pwdp, LPASS);
00051         return pass;
00052     }
00053 #endif
00054 
00055 #ifdef HAVE_RPCSVC_YPCLNT_H
00056     
00057     pw = getnisnam(user_id);
00058     if (pw!=NULL) {
00059         strncpy(pass, pw->pw_passwd, LPASS);
00060         free_pw(pw);
00061         return pass;
00062     }
00063 #endif
00064 
00065     return NULL;
00066 }
00067 
00068 
00069 
00070 #ifdef HAVE_RPCSVC_YPCLNT_H
00071 
00080 char* get_nis_passwdf(char* usrid)
00081 {
00082     const char* inmap="passwd.byname";
00083     int   ret, keylen, vallen, usrlen;
00084     char* domainname;
00085     char* key;
00086     char* val;
00087     char* uname;
00088     char* nis;
00089 
00090     usrlen = strlen(usrid);
00091     uname = (char*)malloc(usrlen + 2);
00092     if (uname==NULL) return NULL;
00093     strncpy(uname, usrid, usrlen);
00094     uname[usrlen]   = ':';
00095     uname[usrlen+1] = '\0';
00096 
00097     yp_get_default_domain(&domainname);
00098 
00099     ret = yp_first(domainname, inmap, &key, &keylen, &val, &vallen);   
00100     while(ret==0){
00101         if (!strncmp(val, uname, usrlen+1)) {
00102             free(uname);
00103             nis = (char*)malloc(strlen(val)+1);
00104             if (nis==NULL) return NULL;
00105             strncpy(nis, val, strlen(val)+1);
00106             return nis;
00107         }
00108         ret = yp_next(domainname, inmap, key, keylen, &key, &keylen, &val, &vallen);   
00109     }
00110 
00111     free(uname);
00112     return NULL;
00113 }
00114 
00115 
00116 
00126 struct passwd* getnisnam(char* usrid)
00127 {
00128     struct passwd* pw;
00129     char*  buf;
00130     char*  nis;
00131 
00132     nis = get_nis_passwdf(usrid);
00133     if (nis==NULL) return NULL;
00134     pw = (struct passwd*)malloc(sizeof(struct passwd));
00135     if (pw==NULL) {
00136         free(nis);
00137         return NULL;
00138     }
00139 
00140     pw->pw_name   = awk(nis, ':', 1);
00141     pw->pw_passwd = awk(nis, ':', 2);
00142     pw->pw_gecos  = awk(nis, ':', 5);
00143     pw->pw_dir      = awk(nis, ':', 6);
00144     pw->pw_shell  = awk(nis, ':', 7);
00145 
00146     buf = awk(nis, ':', 3);
00147     if (buf!=NULL) pw->pw_uid = atoi(buf);
00148     free(buf);
00149 
00150     buf = awk(nis, ':', 4);
00151     if (buf!=NULL) pw->pw_gid = atoi(buf);
00152     free(buf);
00153 
00154     free(nis);
00155     return pw;
00156 }
00157         
00158 #endif        // HAVE_RPCSVC_YPCLNT_H
00159 
00160 
00161 
00172 void  free_pw(struct passwd* pw)
00173 {
00174     if (pw==NULL) return;
00175 
00176     freeNull(pw->pw_name);
00177     freeNull(pw->pw_passwd);
00178     freeNull(pw->pw_gecos);
00179     freeNull(pw->pw_dir);
00180     freeNull(pw->pw_shell);
00181     freeNull(pw);
00182     return;
00183 }
00184 
00185 
00186 
00200 char*   x2crypt(char* pass, char* bsalt)
00201 {
00202     char* cpass;
00203     char* dpass = NULL;
00204     char* csalt;
00205 
00206     if (pass==NULL || bsalt==NULL) return NULL;
00207 
00208     csalt = get_line(bsalt, 1);
00209     cpass = crypt(pass, csalt);
00210     freeNull(csalt);
00211     csalt = get_line(bsalt, 2);
00212     if (csalt==NULL) return NULL;
00213 
00214     if (cpass[0]=='$') {
00215         int lsalt = 0;
00216         if      (cpass[1]=='1') lsalt = LEN_DOLLAR_SALT;
00217         else if (cpass[1]=='2') lsalt = LEN_DOLLAR2_SALT;
00218         else if (cpass[1]=='5') lsalt = LEN_DOLLAR5_SALT;
00219         else if (cpass[1]=='6') lsalt = LEN_DOLLAR6_SALT;
00220 
00221         if (lsalt!=0) {
00222             int passlen = strlen(cpass);
00223             dpass = cut_str(cpass, lsalt, passlen-1);
00224             cpass = crypt(dpass, csalt);
00225             freeNull(dpass);
00226             dpass = cut_str(cpass, lsalt, passlen-1);
00227         }
00228     }
00229     else if (strlen(cpass)==LEN_DESPASS) {
00230         dpass = cut_str(cpass, LEN_DESSALT, LEN_DESPASS-1);
00231         freeNull(cpass);
00232         cpass = crypt(dpass, csalt);
00233         freeNull(dpass);
00234         dpass = cut_str(cpass, LEN_DESSALT, LEN_DESPASS-1);
00235     }
00236 
00237     freeNull(csalt);
00238     return dpass;
00239 }
00240 
00241 
00242 
00255 int  check_passwd(char* passwd, char* cryptpass)
00256 {
00257     int   samepass=FALSE;
00258     char* salt;
00259 
00260     if (passwd==NULL || cryptpass==NULL) return FALSE;
00261 
00262 
00263 
00264     if (cryptpass[0]=='$') {
00265         int lsalt = 0;
00266         if      (cryptpass[1]=='1') lsalt = LEN_DOLLAR_SALT;
00267         else if (cryptpass[1]=='2') lsalt = LEN_DOLLAR2_SALT;
00268         else if (cryptpass[1]=='5') lsalt = LEN_DOLLAR5_SALT;
00269         else if (cryptpass[1]=='6') lsalt = LEN_DOLLAR6_SALT;
00270 
00271         if (lsalt!=0) {
00272             salt = cut_str(cryptpass, 0, lsalt-1);
00273             if (!strcmp(crypt(passwd, salt), cryptpass)) {
00274                 samepass = TRUE;
00275             }
00276             free(salt);
00277         }
00278     }
00279     else if (strlen(cryptpass)==LEN_DESPASS) {
00280         
00281         salt = cut_str(cryptpass, 0, LEN_DESSALT-1);
00282         if (!strcmp(crypt(passwd, salt), cryptpass)) {
00283             samepass = TRUE;
00284         }
00285         free(salt);
00286     }
00287 
00288     return samepass;
00289 }
00290 
00291 
00292 
00309 int  check_salt(char* passwd)
00310 {
00311     int ret = -1;
00312     int len = strlen(passwd);
00313 
00314     if (LEN_DESPASS<len) {
00315         if (passwd[0]=='$' && passwd[2]=='$' && passwd[11]=='$') {
00316             ret = (short int)passwd[1] - (short int)'1' + 1;
00317         }
00318     }
00319     else if (LEN_DESPASS==len) {
00320         ret = 0;
00321     }
00322 
00323     return ret;
00324 }
00325