42 #elif HAVE_SASL_SASL_H
43 #include <sasl/sasl.h>
46 #if HAVE_SASL_H || HAVE_SASL_SASL_H
47 void *lutil_sasl_defaults(
55 LDAP_SASL_INTERACT_PROC lutil_sasl_interact;
57 int lutil_sasl_interact(
63 void lutil_sasl_freedefs(
70 typedef struct lutil_sasl_defaults_s {
89 lutilSASLdefaults *defaults;
91 defaults = (lutilSASLdefaults *)
xmalloc(
sizeof(lutilSASLdefaults));
93 if (defaults ==
nullptr)
96 defaults->mech = mech ?
xstrdup(mech) : nullptr;
97 defaults->realm = realm ?
xstrdup(realm) : nullptr;
98 defaults->authcid = authcid ?
xstrdup(authcid) : nullptr;
99 defaults->passwd = passwd ?
xstrdup(passwd) : nullptr;
100 defaults->authzid = authzid ?
xstrdup(authzid) : nullptr;
102 if (defaults->mech ==
nullptr) {
103 ldap_get_option(
ld, LDAP_OPT_X_SASL_MECH, &defaults->mech);
105 if (defaults->realm ==
nullptr) {
106 ldap_get_option(
ld, LDAP_OPT_X_SASL_REALM, &defaults->realm);
108 if (defaults->authcid ==
nullptr) {
109 ldap_get_option(
ld, LDAP_OPT_X_SASL_AUTHCID, &defaults->authcid);
111 if (defaults->authzid ==
nullptr) {
112 ldap_get_option(
ld, LDAP_OPT_X_SASL_AUTHZID, &defaults->authzid);
114 defaults->resps =
nullptr;
115 defaults->nresps = 0;
123 sasl_interact_t * interact,
124 lutilSASLdefaults * defaults)
126 const char *dflt = interact->defresult;
128 switch (interact->id) {
129 case SASL_CB_GETREALM:
131 dflt = defaults->realm;
133 case SASL_CB_AUTHNAME:
135 dflt = defaults->authcid;
139 dflt = defaults->passwd;
143 dflt = defaults->authzid;
145 case SASL_CB_NOECHOPROMPT:
147 case SASL_CB_ECHOPROMPT:
155 interact->result = (dflt && *dflt) ? dflt :
"";
156 interact->len = (unsigned) strlen((
const char *) interact->result);
168 sasl_interact_t *interact = (sasl_interact_t *) in;
171 return LDAP_PARAM_ERROR;
173 while (interact->id != SASL_CB_LIST_END) {
174 int rc = interaction(flags, interact, (lutilSASLdefaults *) defaults);
188 if (
const auto defs =
static_cast<lutilSASLdefaults*
>(defaults)) {
191 xfree(defs->authcid);
193 xfree(defs->authzid);
201 tool_sasl_bind(LDAP *
ld,
char *
binddn,
char *ssl)
210 #if HAVE_SUN_LDAP_SDK
211 unsigned sasl_flags = LDAP_SASL_INTERACTIVE;
213 unsigned sasl_flags = LDAP_SASL_QUIET;
215 char *sasl_realm =
nullptr;
216 char *sasl_authc_id =
nullptr;
217 char *sasl_authz_id =
nullptr;
218 char *sasl_mech = (
char *)
"GSSAPI";
227 struct berval passwd = {};
229 int rc = LDAP_SUCCESS;
232 sasl_secprops = (
char *)
"maxssf=0";
234 sasl_secprops = (
char *)
"maxssf=56";
238 if (sasl_secprops !=
nullptr) {
239 rc = ldap_set_option(
ld, LDAP_OPT_X_SASL_SECPROPS,
240 (
void *) sasl_secprops);
241 if (rc != LDAP_SUCCESS) {
242 error((
char *)
"%s| %s: ERROR: Could not set LDAP_OPT_X_SASL_SECPROPS: %s: %s\n",
LogTime(),
PROGRAM, sasl_secprops, ldap_err2string(rc));
246 defaults = lutil_sasl_defaults(
ld,
253 rc = ldap_sasl_interactive_bind_s(
ld,
binddn,
254 sasl_mech,
nullptr,
nullptr,
255 sasl_flags, lutil_sasl_interact, defaults);
257 lutil_sasl_freedefs(defaults);
258 if (rc != LDAP_SUCCESS) {
259 error((
char *)
"%s| %s: ERROR: ldap_sasl_interactive_bind_s error: %s\n",
LogTime(),
PROGRAM, ldap_err2string(rc));
268 fprintf(stderr,
"%s| %s: ERROR: Dummy function\n",
LogTime(),
PROGRAM);