163 pam_handle_t *pamh =
nullptr;
164 int retval = PAM_SUCCESS;
168 time_t pamh_created = 0;
171 int no_acct_mgmt = 0;
175 setvbuf(stdout,
nullptr, _IOLBF, 0);
178 int ch =
getopt(argc, argv,
"1n:t:or");
198 fprintf(stderr,
"FATAL: Unknown getopt value '%c'\n", ch);
205 fprintf(stderr,
"FATAL: Unknown option '%s'\n", argv[
optind]);
212 password_buf = strchr(buf,
'\n');
214 debug(
"ERROR: %s: Unexpected input '%s'\n", argv[0], buf);
217 *password_buf =
'\0';
218 password_buf = strchr(buf,
' ');
220 debug(
"ERROR: %s: Unexpected input '%s'\n", argv[0], buf);
223 *password_buf =
'\0';
227 conv.appdata_ptr = (
char *) password_buf;
233 char * user_ptr = strchr(user,
'@');
234 if (user_ptr) *user_ptr = 0;
236 user_ptr = strchr(user,
'\\');
237 if (user_ptr) user = user_ptr + 1;
245 password = password_buf;
249 retval = pam_start(service, user, &
conv, &pamh);
250 if (retval != PAM_SUCCESS) {
251 debug(
"ERROR: failed to create PAM authenticator\n");
254 }
else if (!pamh || (time(
NULL) - pamh_created) >= ttl || pamh_created > time(
NULL)) {
257 retval = pam_end(pamh, retval);
258 if (retval != PAM_SUCCESS) {
259 debug(
"WARNING: failed to release PAM authenticator\n");
264 retval = pam_start(service,
"squid@", &
conv, &pamh);
265 if (retval != PAM_SUCCESS) {
266 debug(
"ERROR: failed to create PAM authenticator\n");
269 pamh_created = time(
NULL);
272 retval = PAM_SUCCESS;
274 retval = pam_set_item(pamh, PAM_USER, user);
275 if (retval == PAM_SUCCESS)
276 retval = pam_set_item(pamh, PAM_CONV, &
conv);
278 if (retval == PAM_SUCCESS)
279 retval = pam_authenticate(pamh, 0);
280 if (retval == PAM_SUCCESS && !no_acct_mgmt)
281 retval = pam_acct_mgmt(pamh, 0);
282 if (retval == PAM_SUCCESS) {
289 retval = PAM_SUCCESS;
290#if defined(PAM_AUTHTOK)
291 if (ttl != 0 && pamh) {
292 retval = pam_set_item(pamh, PAM_AUTHTOK,
nullptr);
295 if (pamh && (ttl == 0 || retval != PAM_SUCCESS)) {
296 retval = pam_end(pamh, retval);
297 if (retval != PAM_SUCCESS) {
298 debug(
"WARNING: failed to release PAM authenticator\n");
305 retval = pam_end(pamh, retval);
306 if (retval != PAM_SUCCESS) {
308 debug(
"ERROR: failed to release PAM authenticator\n");