45#if HAVE_SASL_H || HAVE_SASL_SASL_H
46void *lutil_sasl_defaults(
54LDAP_SASL_INTERACT_PROC lutil_sasl_interact;
56int lutil_sasl_interact(
62void lutil_sasl_freedefs(
69typedef struct lutil_sasl_defaults_s {
88 lutilSASLdefaults *defaults;
90 defaults = (lutilSASLdefaults *)
xmalloc(
sizeof(lutilSASLdefaults));
92 if (defaults ==
nullptr)
95 defaults->mech = mech ?
xstrdup(mech) : nullptr;
96 defaults->realm = realm ?
xstrdup(realm) : nullptr;
97 defaults->authcid = authcid ?
xstrdup(authcid) : nullptr;
98 defaults->passwd = passwd ?
xstrdup(passwd) : nullptr;
99 defaults->authzid = authzid ?
xstrdup(authzid) : nullptr;
101 if (defaults->mech ==
nullptr) {
102 ldap_get_option(
ld, LDAP_OPT_X_SASL_MECH, &defaults->mech);
104 if (defaults->realm ==
nullptr) {
105 ldap_get_option(
ld, LDAP_OPT_X_SASL_REALM, &defaults->realm);
107 if (defaults->authcid ==
nullptr) {
108 ldap_get_option(
ld, LDAP_OPT_X_SASL_AUTHCID, &defaults->authcid);
110 if (defaults->authzid ==
nullptr) {
111 ldap_get_option(
ld, LDAP_OPT_X_SASL_AUTHZID, &defaults->authzid);
113 defaults->resps =
nullptr;
114 defaults->nresps = 0;
122 sasl_interact_t * interact,
123 lutilSASLdefaults * defaults)
125 const char *dflt = interact->defresult;
127 switch (interact->id) {
128 case SASL_CB_GETREALM:
130 dflt = defaults->realm;
132 case SASL_CB_AUTHNAME:
134 dflt = defaults->authcid;
138 dflt = defaults->passwd;
142 dflt = defaults->authzid;
144 case SASL_CB_NOECHOPROMPT:
146 case SASL_CB_ECHOPROMPT:
154 interact->result = (dflt && *dflt) ? dflt :
"";
155 interact->len = (unsigned) strlen((
const char *) interact->result);
167 sasl_interact_t *interact = (sasl_interact_t *) in;
170 return LDAP_PARAM_ERROR;
172 while (interact->id != SASL_CB_LIST_END) {
173 int rc = interaction(flags, interact, (lutilSASLdefaults *) defaults);
187 if (
const auto defs =
static_cast<lutilSASLdefaults*
>(defaults)) {
190 xfree(defs->authcid);
192 xfree(defs->authzid);
200tool_sasl_bind(LDAP *
ld,
char *
binddn,
char *ssl)
210 unsigned sasl_flags = LDAP_SASL_INTERACTIVE;
212 unsigned sasl_flags = LDAP_SASL_QUIET;
214 char *sasl_realm =
nullptr;
215 char *sasl_authc_id =
nullptr;
216 char *sasl_authz_id =
nullptr;
217 char *sasl_mech = (
char *)
"GSSAPI";
226 struct berval passwd = {};
228 int rc = LDAP_SUCCESS;
231 sasl_secprops = (
char *)
"maxssf=0";
233 sasl_secprops = (
char *)
"maxssf=56";
237 if (sasl_secprops !=
nullptr) {
238 rc = ldap_set_option(
ld, LDAP_OPT_X_SASL_SECPROPS,
239 (
void *) sasl_secprops);
240 if (rc != LDAP_SUCCESS) {
241 error((
char *)
"%s| %s: ERROR: Could not set LDAP_OPT_X_SASL_SECPROPS: %s: %s\n",
LogTime(),
PROGRAM, sasl_secprops, ldap_err2string(rc));
245 defaults = lutil_sasl_defaults(
ld,
252 rc = ldap_sasl_interactive_bind_s(
ld,
binddn,
253 sasl_mech,
nullptr,
nullptr,
254 sasl_flags, lutil_sasl_interact, defaults);
256 lutil_sasl_freedefs(defaults);
257 if (rc != LDAP_SUCCESS) {
258 error((
char *)
"%s| %s: ERROR: ldap_sasl_interactive_bind_s error: %s\n",
LogTime(),
PROGRAM, ldap_err2string(rc));
267 fprintf(stderr,
"%s| %s: ERROR: Dummy function\n",
LogTime(),
PROGRAM);
void error(char *format,...)
const char * LogTime(void)
static const char * binddn
Comm::AcceptLimiter dummy