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