|
Lines 566-575
Link Here
|
| 566 |
* 0 = OK |
569 |
* 0 = OK |
| 567 |
* -1 = System error |
570 |
* -1 = System error |
| 568 |
*/ |
571 |
*/ |
| 569 |
static int valid_user(const char *user) |
572 |
static int valid_user(const char *user, pam_handle_t *pamh, int ctrl) |
| 570 |
{ |
573 |
{ |
| 571 |
if (getpwnam(user)) return 0; |
574 |
/* check not only if the user is available over NSS calls, also make |
| 572 |
return 1; |
575 |
* sure it's really a winbind user, this is important when stacking PAM |
|
|
576 |
* modules in the 'account' or 'password' facility. */ |
| 577 |
|
| 578 |
struct passwd *pwd = NULL; |
| 579 |
struct winbindd_request request; |
| 580 |
struct winbindd_response response; |
| 581 |
int ret; |
| 582 |
|
| 583 |
ZERO_STRUCT(request); |
| 584 |
ZERO_STRUCT(response); |
| 585 |
|
| 586 |
pwd = getpwnam(user); |
| 587 |
if (pwd == NULL) { |
| 588 |
return 1; |
| 589 |
} |
| 590 |
|
| 591 |
fstrcpy(request.data.username, user); |
| 592 |
|
| 593 |
ret = pam_winbind_request_log(pamh, ctrl, WINBINDD_GETPWNAM, &request, &response, user); |
| 594 |
|
| 595 |
switch (ret) { |
| 596 |
case PAM_USER_UNKNOWN: |
| 597 |
return 1; |
| 598 |
case PAM_SUCCESS: |
| 599 |
return 0; |
| 600 |
default: |
| 601 |
break; |
| 602 |
} |
| 603 |
return -1; |
| 573 |
} |
604 |
} |
| 574 |
|
605 |
|
| 575 |
static char *_pam_delete(register char *xx) |
606 |
static char *_pam_delete(register char *xx) |
|
Lines 897-903
Link Here
|
| 897 |
} |
972 |
} |
| 898 |
|
973 |
|
| 899 |
/* Verify the username */ |
974 |
/* Verify the username */ |
| 900 |
retval = valid_user(username); |
975 |
retval = valid_user(username, pamh, ctrl); |
| 901 |
switch (retval) { |
976 |
switch (retval) { |
| 902 |
case -1: |
977 |
case -1: |
| 903 |
/* some sort of system error. The log was already printed */ |
978 |
/* some sort of system error. The log was already printed */ |
|
Lines 1123-1128
Link Here
|
| 1123 |
return retval; |
1198 |
return retval; |
| 1124 |
} |
1199 |
} |
| 1125 |
|
1200 |
|
|
|
1201 |
/* check if this is really a user in winbindd, not only in NSS */ |
| 1202 |
retval = valid_user(user, pamh, ctrl); |
| 1203 |
switch (retval) { |
| 1204 |
case 1: |
| 1205 |
return PAM_USER_UNKNOWN; |
| 1206 |
case -1: |
| 1207 |
return PAM_SYSTEM_ERR; |
| 1208 |
default: |
| 1209 |
break; |
| 1210 |
} |
| 1211 |
|
| 1126 |
/* |
1212 |
/* |
| 1127 |
* obtain and verify the current password (OLDAUTHTOK) for |
1213 |
* obtain and verify the current password (OLDAUTHTOK) for |
| 1128 |
* the user. |
1214 |
* the user. |