Guest User

Untitled

a guest
Mar 2nd, 2018
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 17.04 KB | None | 0 0
  1. --- ../libpam-ldap-minimal/pam_ldap.c 2008-04-15 14:44:58.000000000 -0400
  2. +++ pam_ldap.c 2008-04-02 18:40:02.000000000 -0400
  3. @@ -1228,10 +1228,14 @@
  4. int rc = ldapssl_client_init (session->conf->sslpath, NULL);
  5. if (rc != LDAP_SUCCESS)
  6. {
  7. - syslog (LOG_ERR, "pam_ldap: ldapssl_client_init %s",
  8. + syslog (LOG_ERR, "pam_ldap: _open_session() failed with PAM_SERVICE_ERR: ldapssl_client_init failed: %s",
  9. ldap_err2string (rc));
  10. return PAM_SERVICE_ERR;
  11. }
  12. + else
  13. + {
  14. + syslog (LOG_INFO, "pam_ldap: _open_session(): ldapssl_client_init successful");
  15. + }
  16. ssl_initialized = 1;
  17. }
  18.  
  19. @@ -1239,6 +1243,7 @@
  20. {
  21. session->ld = ldapssl_init (session->conf->host,
  22. session->conf->port, TRUE);
  23. + if (session->ld == NULL) syslog (LOG_ERR, "pam_ldap: _open_session(): ldapssl_init() failed");
  24. }
  25. else
  26. #endif /* HAVE_LDAPSSL_INIT */
  27. @@ -1247,7 +1252,11 @@
  28. /* set defaults for global TLS-related options */
  29. if (_set_ssl_default_options (session) != LDAP_SUCCESS)
  30. {
  31. - syslog (LOG_ERR, "pam_ldap: _set_ssl_default_options failed");
  32. + syslog (LOG_ERR, "pam_ldap: _open_session(): _set_ssl_default_options() failed");
  33. + }
  34. + else
  35. + {
  36. + syslog (LOG_DEBUG, "pam_ldap: _open_session(): _set_ssl_default_options() successful");
  37. }
  38. #endif
  39. #ifdef HAVE_LDAP_INITIALIZE
  40. @@ -1256,18 +1265,24 @@
  41. int rc = ldap_initialize (&session->ld, session->conf->uri);
  42. if (rc != LDAP_SUCCESS)
  43. {
  44. - syslog (LOG_ERR, "pam_ldap: ldap_initialize %s",
  45. + syslog (LOG_ERR, "pam_ldap: _open_session() failed with PAM_SERVICE_ERR: ldap_initialize() failed: %s",
  46. ldap_err2string (rc));
  47. return PAM_SERVICE_ERR;
  48. }
  49. + else
  50. + {
  51. + syslog (LOG_DEBUG, "pam_ldap: _open_session(): ldap_initialize() successful");
  52. + }
  53. }
  54. else
  55. {
  56. #endif /* HAVE_LDAP_INTITIALIZE */
  57. #ifdef HAVE_LDAP_INIT
  58. session->ld = ldap_init (session->conf->host, session->conf->port);
  59. + if (session->ld == NULL) syslog (LOG_ERR, "pam_ldap: _open_session(): ldap_init() failed");
  60. #else
  61. session->ld = ldap_open (session->conf->host, session->conf->port);
  62. + if (session->ld == NULL) syslog (LOG_ERR, "pam_ldap: _open_session(): ldap_open() failed");
  63. #endif /* HAVE_LDAP_INIT */
  64. #ifdef HAVE_LDAP_INITIALIZE
  65. }
  66. @@ -1276,9 +1291,12 @@
  67.  
  68. if (session->ld == NULL)
  69. {
  70. + syslog (LOG_ERR, "pam_ldap: _open_session(): failed with PAM_SERVICE_ERR: unable to establish an LDAP session");
  71. return PAM_SERVICE_ERR;
  72. }
  73.  
  74. + syslog (LOG_DEBUG, "pam_ldap: _open_session(): calling ldap_set_option() for SSL");
  75. +
  76. #if defined(HAVE_LDAP_SET_OPTION) && defined(LDAP_OPT_X_TLS)
  77. if (session->conf->ssl_on == SSL_LDAPS)
  78. {
  79. @@ -1286,19 +1304,26 @@
  80. int rc = ldap_set_option (session->ld, LDAP_OPT_X_TLS, &tls);
  81. if (rc != LDAP_SUCCESS)
  82. {
  83. - syslog (LOG_ERR, "pam_ldap: ldap_set_option(LDAP_OPT_X_TLS) %s",
  84. + syslog (LOG_ERR, "pam_ldap: _open_session() failed with PAM_SERVICE_ERR: ldap_set_option(LDAP_OPT_X_TLS) failed: %s",
  85. ldap_err2string (rc));
  86. return PAM_SERVICE_ERR;
  87. }
  88. + else
  89. + {
  90. + syslog (LOG_DEBUG, "pam_ldap: _open_session(): ldap_set_option(LDAP_OPT_X_TLS) successful");
  91. + }
  92.  
  93. /* set up SSL per-context settings */
  94. if (_set_ssl_options (session) != LDAP_SUCCESS)
  95. {
  96. - syslog (LOG_ERR, "pam_ldap: _set_ssl_options failed");
  97. + syslog (LOG_ERR, "pam_ldap: _open_session(): _set_ssl_options() failed");
  98. }
  99. }
  100. #endif /* LDAP_OPT_X_TLS */
  101.  
  102. + syslog (LOG_DEBUG, "pam_ldap: _open_session(): calling ldap_set_option() for misc options");
  103. +
  104. +
  105. #if defined(HAVE_LDAP_SET_OPTION) && defined(LDAP_OPT_PROTOCOL_VERSION)
  106. (void) ldap_set_option (session->ld, LDAP_OPT_PROTOCOL_VERSION,
  107. &session->conf->version);
  108. @@ -1333,13 +1358,19 @@
  109. * we use the bind_timelimit to control this.
  110. */
  111. timeout = session->conf->bind_timelimit * 1000;
  112. - (void) ldap_set_option (session->ld, LDAP_X_OPT_CONNECT_TIMEOUT, &timeout);
  113. + int rc = ldap_set_option (session->ld, LDAP_X_OPT_CONNECT_TIMEOUT, &timeout);
  114. + if (rc != LDAP_OPT_SUCCESS) {
  115. + syslog(LOG_ERR, "pam_ldap:_open_session() failed to set option LDAP_X_OPT_CONNECT_TIMEOUT=%u: %s", timeout, ldap_err2string(rc));
  116. + }
  117. #endif
  118.  
  119. #if defined(HAVE_LDAP_SET_OPTION) && defined(LDAP_OPT_NETWORK_TIMEOUT)
  120. tv.tv_sec = session->conf->bind_timelimit;
  121. tv.tv_usec = 0;
  122. - (void) ldap_set_option (session->ld, LDAP_OPT_NETWORK_TIMEOUT, &tv);
  123. + int rc = ldap_set_option (session->ld, LDAP_OPT_NETWORK_TIMEOUT, &tv);
  124. + if (rc != LDAP_OPT_SUCCESS) {
  125. + syslog(LOG_ERR, "pam_ldap:_open_session() failed to set option LDAP_OPT_NETWORK_TIMEOUT=%u: %s", tv.tv_sec, ldap_err2string(rc));
  126. + }
  127. #endif
  128.  
  129. #if defined(HAVE_LDAP_SET_OPTION) && defined(LDAP_OPT_REFERRALS)
  130. @@ -1372,19 +1403,32 @@
  131. /* set up SSL context */
  132. if (_set_ssl_options (session) != LDAP_SUCCESS)
  133. {
  134. - syslog (LOG_ERR, "pam_ldap: _set_ssl_options failed");
  135. + syslog (LOG_ERR, "pam_ldap: _open_session(): _set_ssl_options() failed in SSL_START_TLS block");
  136. + }
  137. + else
  138. + {
  139. + syslog (LOG_DEBUG, "pam_ldap: _open_session(): _set_ssl_options() successful");
  140. }
  141.  
  142. rc = ldap_start_tls_s (session->ld, NULL, NULL);
  143. if (rc != LDAP_SUCCESS)
  144. {
  145. - syslog (LOG_ERR, "pam_ldap: ldap_starttls_s: %s",
  146. + syslog (LOG_ERR, "pam_ldap: _open_session() failed with PAM_SERVICE_ERR: ldap_starttls_s() failed: %s",
  147. ldap_err2string (rc));
  148. return PAM_SERVICE_ERR;
  149. }
  150. + else
  151. + {
  152. + syslog (LOG_DEBUG, "pam_ldap: _open_session(): ldap_starttls_s(): successful");
  153. + }
  154. + }
  155. + else
  156. + {
  157. + syslog (LOG_ERR, "pam_ldap: _open_session(): ldap_get_option(LDAP_OPT_PROTOCOL_VERSION) failed");
  158. }
  159. }
  160. #endif /* HAVE_LDAP_START_TLS_S */
  161. + syslog (LOG_DEBUG, "pam_ldap: _open_session() successful");
  162. return PAM_SUCCESS;
  163. }
  164.  
  165. @@ -1515,9 +1559,11 @@
  166.  
  167. if (session->ld == NULL)
  168. {
  169. + if (session->info != NULL) {
  170. + syslog(LOG_DEBUG, "pam_ldap: _connect_anonymously() called with non-null session: session->info->username = %s", session->info->username);
  171. + }
  172. rc = _open_session (session);
  173. - if (rc != PAM_SUCCESS)
  174. - return rc;
  175. + if (rc != PAM_SUCCESS) return rc;
  176. }
  177.  
  178. if (session->conf->rootbinddn && geteuid () == 0)
  179. @@ -1525,17 +1571,31 @@
  180. msgid = ldap_simple_bind (session->ld,
  181. session->conf->rootbinddn,
  182. session->conf->rootbindpw);
  183. +
  184. + if (msgid == -1) {
  185. + syslog (LOG_ERR,
  186. + "pam_ldap: _connect_anonymously(): ldap_simple_bind() using rootbinddn %s failed: %s",
  187. + session->conf->rootbinddn,
  188. + ldap_err2string (ldap_get_lderrno (session->ld, 0, 0))
  189. + );
  190. + }
  191. }
  192. else
  193. {
  194. msgid = ldap_simple_bind (session->ld,
  195. session->conf->binddn, session->conf->bindpw);
  196. +
  197. + if (msgid == -1) {
  198. + syslog (LOG_ERR,
  199. + "pam_ldap: _connect_anonymously(): ldap_simple_bind() using user dn %s failed: %s",
  200. + session->conf->binddn,
  201. + ldap_err2string (ldap_get_lderrno (session->ld, 0, 0))
  202. + );
  203. + }
  204. }
  205.  
  206. if (msgid == -1)
  207. {
  208. - syslog (LOG_ERR, "pam_ldap: ldap_simple_bind %s",
  209. - ldap_err2string (ldap_get_lderrno (session->ld, 0, 0)));
  210. return PAM_AUTHINFO_UNAVAIL;
  211. }
  212.  
  213. @@ -1544,7 +1604,7 @@
  214. rc = ldap_result (session->ld, msgid, FALSE, &timeout, &result);
  215. if (rc == -1 || rc == 0)
  216. {
  217. - syslog (LOG_ERR, "pam_ldap: ldap_result %s",
  218. + syslog (LOG_ERR, "pam_ldap: _connect_anonymously() failed with PAM_AUTHINFO_UNAVAIL: ldap_result %s",
  219. ldap_err2string (ldap_get_lderrno (session->ld, 0, 0)));
  220. return PAM_AUTHINFO_UNAVAIL;
  221. }
  222. @@ -1557,7 +1617,7 @@
  223.  
  224. if (rc != LDAP_SUCCESS)
  225. {
  226. - syslog (LOG_ERR, "pam_ldap: error trying to bind (%s)",
  227. + syslog (LOG_ERR, "pam_ldap: _connect_anonymously() failed with PAM_CRED_INSUFFICIENT: error trying to bind (%s)",
  228. ldap_err2string (rc));
  229. return PAM_CRED_INSUFFICIENT;
  230. }
  231. @@ -1885,23 +1945,31 @@
  232. #endif /* HAVE_LDAP_PARSE_RESULT && HAVE_LDAP_CONTROLS_FREE */
  233.  
  234. /* avoid binding anonymously with a DN but no password */
  235. - if (password == NULL || password[0] == '\0')
  236. + if (password == NULL || password[0] == '\0') {
  237. + syslog(LOG_INFO, "pam_ldap: _connect_as_user() failed: returning PAM_AUTH_ERR due to null password");
  238. return PAM_AUTH_ERR;
  239. + }
  240.  
  241. /* this shouldn't ever happen */
  242. - if (session->info == NULL)
  243. + if (session->info == NULL) {
  244. + syslog(LOG_ERR, "pam_ldap: _connect_as_user() failed: returning PAM_SYSTEM_ERR due to null session. Please file a bug report - this should be impossible!");
  245. return PAM_SYSTEM_ERR;
  246. + }
  247.  
  248. /* if we already bound as the user don't bother retrying */
  249. - if (session->info->bound_as_user)
  250. + if (session->info->bound_as_user) {
  251. + syslog(LOG_DEBUG, "pam_ldap: _connect_as_user() success: reusing existing session for %s", session->info->username);
  252. return PAM_SUCCESS;
  253. + }
  254.  
  255. if (session->ld == NULL)
  256. {
  257. rc = _open_session (session);
  258. - if (rc != PAM_SUCCESS)
  259. + if (rc != PAM_SUCCESS) {
  260. + syslog(LOG_ERR, "pam_ldap: _connect_as_user() failed: _open_sesssion() for user %s returned %d", session->info->username, rc);
  261. return rc;
  262. }
  263. + }
  264.  
  265. /*
  266. * We copy the password temporarily so that when referrals are
  267. @@ -1915,12 +1983,15 @@
  268. }
  269.  
  270. session->info->userpw = strdup (password);
  271. - if (session->info->userpw == NULL)
  272. + if (session->info->userpw == NULL) {
  273. + syslog(LOG_ERR, "pam_ldap: _connect_as_user() failed: returning PAM_BUF_ERR due to null password after strdup");
  274. return PAM_BUF_ERR;
  275. + }
  276.  
  277. #if (defined(HAVE_SASL_SASL_H) || defined(HAVE_SASL_H)) && defined(HAVE_LDAP_SASL_INTERACTIVE_BIND_S)
  278. if (session->conf->sasl_mechanism != NULL)
  279. {
  280. + syslog(LOG_DEBUG, "pam_ldap: _connect_as_user() starting SASL negotiation");
  281. void *args[] = { pamh, session };
  282.  
  283. passwd_policy_req.ldctl_oid = LDAP_CONTROL_PASSWORDPOLICYREQUEST;
  284. @@ -1945,13 +2016,16 @@
  285. _do_sasl_interact, &args);
  286. if (rc != LDAP_SUCCESS)
  287. {
  288. - syslog (LOG_ERR, "pam_ldap: ldap_sasl_interactive_bind %s",
  289. - ldap_err2string (ldap_get_lderrno (session->ld, 0, 0)));
  290. + syslog (LOG_ERR, "pam_ldap: _connect_as_user() failed: ldap_sasl_interactive_bind(%s) failed: %s",
  291. + session->info->userdn,
  292. + ldap_err2string (ldap_get_lderrno (session->ld, 0, 0))
  293. + );
  294. _pam_overwrite (session->info->userpw);
  295. _pam_drop (session->info->userpw);
  296. return PAM_AUTHINFO_UNAVAIL;
  297. }
  298. session->info->bound_as_user = 1;
  299. + syslog(LOG_DEBUG, "pam_ldap: _connect_as_user() successful: ldap_sasl_interactive_bind_s complete");
  300. return PAM_SUCCESS;
  301. }
  302. #endif
  303. @@ -1967,17 +2041,21 @@
  304. srvctrls[0] = &passwd_policy_req;
  305. srvctrls[1] = 0;
  306.  
  307. - rc =
  308. - ldap_sasl_bind (session->ld, session->info->userdn, LDAP_SASL_SIMPLE,
  309. - &userpw, srvctrls, 0, &msgid);
  310. + rc = ldap_sasl_bind (session->ld, session->info->userdn, LDAP_SASL_SIMPLE, &userpw, srvctrls, 0, &msgid);
  311. if (rc != LDAP_SUCCESS || msgid == -1)
  312. {
  313. - syslog (LOG_ERR, "pam_ldap: ldap_sasl_bind %s",
  314. - ldap_err2string (ldap_get_lderrno (session->ld, 0, 0)));
  315. + syslog (LOG_ERR, "pam_ldap: _connect_as_user(): ldap_sasl_bind(%s) failed: %s",
  316. + session->info->userdn,
  317. + ldap_err2string (ldap_get_lderrno (session->ld, 0, 0))
  318. + );
  319. _pam_overwrite (session->info->userpw);
  320. _pam_drop (session->info->userpw);
  321. return PAM_AUTHINFO_UNAVAIL;
  322. }
  323. + else
  324. + {
  325. + syslog (LOG_DEBUG, "pam_ldap: _connect_as_user(): ldap_sasl_bind(%s) successful", session->info->userdn);
  326. + }
  327. }
  328. else
  329. {
  330. @@ -1985,12 +2063,18 @@
  331. session->info->userpw);
  332. if (msgid == -1)
  333. {
  334. - syslog (LOG_ERR, "pam_ldap: ldap_simple_bind %s",
  335. - ldap_err2string (ldap_get_lderrno (session->ld, 0, 0)));
  336. + syslog (LOG_ERR, "pam_ldap: _connect_as_user() failed: ldap_simple_bind(%s) failed: %s",
  337. + session->info->userdn,
  338. + ldap_err2string (ldap_get_lderrno (session->ld, 0, 0))
  339. + );
  340. _pam_overwrite (session->info->userpw);
  341. _pam_drop (session->info->userpw);
  342. return PAM_AUTHINFO_UNAVAIL;
  343. }
  344. + else
  345. + {
  346. + syslog (LOG_DEBUG, "pam_ldap: _connect_as_user(): ldap_simple_bind(%s) successful", session->info->userdn);
  347. + }
  348. }
  349. #else
  350. msgid =
  351. @@ -1998,12 +2082,18 @@
  352. session->info->userpw);
  353. if (msgid == -1)
  354. {
  355. - syslog (LOG_ERR, "pam_ldap: ldap_simple_bind %s",
  356. - ldap_err2string (ldap_get_lderrno (session->ld, 0, 0)));
  357. + syslog (LOG_ERR, "pam_ldap: _connect_as_user() failed: ldap_simple_bind(%s) failed: %s",
  358. + session->info->userdn,
  359. + ldap_err2string (ldap_get_lderrno (session->ld, 0, 0))
  360. + );
  361. _pam_overwrite (session->info->userpw);
  362. _pam_drop (session->info->userpw);
  363. return PAM_AUTHINFO_UNAVAIL;
  364. }
  365. + else
  366. + {
  367. + syslog (LOG_DEBUG, "pam_ldap: _connect_as_user(): ldap_simple_bind(%s) successful", session->info->userdn);
  368. + }
  369. #endif /* HAVE_LDAP_SASL_BIND && LDAP_SASL_SIMPLE */
  370.  
  371. timeout.tv_sec = 10;
  372. @@ -2017,6 +2107,10 @@
  373. _pam_drop (session->info->userpw);
  374. return PAM_AUTHINFO_UNAVAIL;
  375. }
  376. + else
  377. + {
  378. + syslog (LOG_DEBUG, "pam_ldap: _connect_as_user(): ldap_result() successful");
  379. + }
  380.  
  381. #if defined(HAVE_LDAP_PARSE_RESULT) && defined(HAVE_LDAP_CONTROLS_FREE)
  382. controls = 0;
  383. @@ -2030,6 +2124,11 @@
  384. _pam_drop (session->info->userpw);
  385. return PAM_SERVICE_ERR;
  386. }
  387. + else
  388. + {
  389. + syslog (LOG_DEBUG, "pam_ldap: _connect_as_user(): ldap_parse_result() successful");
  390. + }
  391. +
  392. if (controls != NULL)
  393. {
  394. LDAPControl **ctlp;
  395. @@ -2111,8 +2210,10 @@
  396.  
  397. if (rc != LDAP_SUCCESS)
  398. {
  399. - syslog (LOG_ERR, "pam_ldap: error trying to bind as user \"%s\" (%s)",
  400. - session->info->userdn, ldap_err2string (rc));
  401. + syslog (LOG_ERR, "pam_ldap: _connect_as_user(\"%s\") failed: (%s)",
  402. + session->info->userdn,
  403. + ldap_err2string (rc)
  404. + );
  405. _pam_overwrite (session->info->userpw);
  406. _pam_drop (session->info->userpw);
  407. return PAM_AUTH_ERR;
  408. @@ -2127,6 +2228,7 @@
  409.  
  410. session->info->bound_as_user = 1;
  411.  
  412. + syslog (LOG_DEBUG, "pam_ldap: _connect_as_user() successfully bound as user \"%s\"", session->info->userdn);
  413. return PAM_SUCCESS;
  414. }
  415.  
  416. @@ -2534,8 +2636,7 @@
  417. }
  418. else
  419. {
  420. - snprintf (filter, sizeof filter, "(%s=%s)",
  421. - session->conf->userattr, escapedUser);
  422. + snprintf (filter, sizeof filter, "(%s=%s)", session->conf->userattr, escapedUser);
  423. }
  424.  
  425. rc = ldap_search_s (session->ld, ssd->base, ssd->scope,
  426. @@ -2544,9 +2645,13 @@
  427. if (rc != LDAP_SUCCESS &&
  428. rc != LDAP_TIMELIMIT_EXCEEDED && rc != LDAP_SIZELIMIT_EXCEEDED)
  429. {
  430. - syslog (LOG_ERR, "pam_ldap: ldap_search_s %s", ldap_err2string (rc));
  431. + syslog (LOG_ERR, "pam_ldap: _get_user_info() failed: ldap_search_s(base=\"%s\", filter=\"%s\") failed: %s", ssd->base, filter, ldap_err2string (rc));
  432. return PAM_USER_UNKNOWN;
  433. }
  434. + else
  435. + {
  436. + syslog (LOG_DEBUG, "pam_ldap: _get_user_info(): ldap_search_s(base=\"%s\", filter=\"%s\") successful", ssd->base, filter);
  437. + }
  438.  
  439. msg = ldap_first_entry (session->ld, res);
  440. if (msg == NULL)
  441. @@ -2832,12 +2937,18 @@
  442. {
  443. rc = _get_user_info (session, user);
  444. if (rc != PAM_SUCCESS)
  445. + {
  446. + syslog(LOG_INFO, "pam_ldap:_do_authentication() failed: expected PAM_SUCCESS but _get_user_info() returned %d", rc);
  447. return rc;
  448. }
  449. + }
  450.  
  451. rc = _session_reopen (session);
  452. if (rc != PAM_SUCCESS)
  453. + {
  454. + syslog(LOG_INFO, "pam_ldap:_do_authentication() failed: expected PAM_SUCCESS but _session_reopen() returned %d", rc);
  455. return rc;
  456. + }
  457.  
  458. rc = _connect_as_user (pamh, session, password);
  459. _session_reopen (session);
  460. @@ -2896,12 +3007,10 @@
  461. * user can bypass local password policy
  462. */
  463. rc = _session_reopen (session);
  464. - if (rc != PAM_SUCCESS)
  465. - return rc;
  466. + if (rc != PAM_SUCCESS) return rc;
  467.  
  468. rc = _connect_as_user (pamh, session, old_password);
  469. - if (rc != PAM_SUCCESS)
  470. - return rc;
  471. + if (rc != PAM_SUCCESS) return rc;
  472. }
  473.  
  474. switch (session->conf->password_type)
  475. @@ -3224,7 +3333,7 @@
  476. else if (!strcmp (argv[i], "debug"))
  477. ;
  478. else
  479. - syslog (LOG_ERR, "illegal option %s", argv[i]);
  480. + syslog (LOG_ERR, "pam_ldap: illegal option %s", argv[i]);
  481. }
  482.  
  483. rc = pam_get_user (pamh, (CONST_ARG char **) &username, NULL);
  484. @@ -3356,7 +3465,7 @@
  485. else if (!strcmp (argv[i], "use_authtok"))
  486. use_authtok = 1;
  487. else
  488. - syslog (LOG_ERR, "illegal option %s", argv[i]);
  489. + syslog (LOG_ERR, "pam_ldap: illegal option %s", argv[i]);
  490. }
  491.  
  492. if (flags & PAM_SILENT)
  493. @@ -3758,7 +3867,7 @@
  494. else if (!strcmp (argv[i], "debug"))
  495. ;
  496. else
  497. - syslog (LOG_ERR, "illegal option %s", argv[i]);
  498. + syslog (LOG_ERR, "pam_ldap: illegal option %s", argv[i]);
  499. }
  500.  
  501. if (flags & PAM_SILENT)
Add Comment
Please, Sign In to add comment