|
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 winbindd_request request; |
| 579 |
struct winbindd_response response; |
| 580 |
struct passwd *pwd = NULL; |
| 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.name.name, user); |
| 592 |
|
| 593 |
ret = pam_winbind_request_log(pamh, ctrl, WINBINDD_LOOKUPNAME, &request, &response, user); |
| 594 |
switch (ret) { |
| 595 |
case PAM_USER_UNKNOWN: |
| 596 |
return 1; |
| 597 |
case PAM_SUCCESS: |
| 598 |
return 0; |
| 599 |
default: |
| 600 |
return -1; |
| 601 |
} |
| 573 |
} |
602 |
} |
| 574 |
|
603 |
|
| 575 |
static char *_pam_delete(register char *xx) |
604 |
static char *_pam_delete(register char *xx) |
|
Lines 897-903
Link Here
|
| 897 |
} |
960 |
} |
| 898 |
|
961 |
|
| 899 |
/* Verify the username */ |
962 |
/* Verify the username */ |
| 900 |
retval = valid_user(username); |
963 |
retval = valid_user(username, pamh, ctrl); |
| 901 |
switch (retval) { |
964 |
switch (retval) { |
| 902 |
case -1: |
965 |
case -1: |
| 903 |
/* some sort of system error. The log was already printed */ |
966 |
/* some sort of system error. The log was already printed */ |
|
Lines 1130-1135
Link Here
|
| 1130 |
|
1193 |
|
| 1131 |
if (flags & PAM_PRELIM_CHECK) { |
1194 |
if (flags & PAM_PRELIM_CHECK) { |
| 1132 |
|
1195 |
|
|
|
1196 |
/* check if this is really a user in winbindd, not only in NSS */ |
| 1197 |
retval = valid_user(user, pamh, ctrl); |
| 1198 |
switch (retval) { |
| 1199 |
case 1: |
| 1200 |
return PAM_USER_UNKNOWN; |
| 1201 |
case -1: |
| 1202 |
return PAM_SYSTEM_ERR; |
| 1203 |
default: |
| 1204 |
break; |
| 1205 |
} |
| 1206 |
|
| 1133 |
/* instruct user what is happening */ |
1207 |
/* instruct user what is happening */ |
| 1134 |
#define greeting "Changing password for " |
1208 |
#define greeting "Changing password for " |
| 1135 |
fstrcpy(Announce, greeting); |
1209 |
fstrcpy(Announce, greeting); |