sdap.c revision 10b6b1fc57bb7c2edb4cfd0a0038303bd33722bc
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik LDAP Helper routines
a7797068c4deb6ce2bdbcda27c45ff1bbb4a8e78Jakub Hrozek Copyright (C) Simo Sorce <ssorce@redhat.com>
a7797068c4deb6ce2bdbcda27c45ff1bbb4a8e78Jakub Hrozek This program is free software; you can redistribute it and/or modify
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik it under the terms of the GNU General Public License as published by
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik the Free Software Foundation; either version 3 of the License, or
531661c7bb54eb71853977a64cb30f80c20b963eJakub Hrozek (at your option) any later version.
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek This program is distributed in the hope that it will be useful,
ad805face83ba7d67b1cf2067a1982c7e63d1060Jakub Hrozek but WITHOUT ANY WARRANTY; without even the implied warranty of
ad805face83ba7d67b1cf2067a1982c7e63d1060Jakub Hrozek MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
a7797068c4deb6ce2bdbcda27c45ff1bbb4a8e78Jakub Hrozek GNU General Public License for more details.
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik You should have received a copy of the GNU General Public License
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik along with this program. If not, see <http://www.gnu.org/licenses/>.
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek/* =Retrieve-Options====================================================== */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik map = talloc_array(memctx, struct sdap_attr_map, num_entries);
f10ebaa51ecdcbbd10f171d19fe8e680e5bc74aaJakub Hrozek for (i = 0; i < num_entries; i++) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = confdb_get_string(cdb, map, conf_path,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(0, ("Failed to retrieve value for %s\n", map[i].opt_name));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = sss_filter_sanitize(map, name, &map[i].name);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("Could not sanitize attribute [%s]\n", name));
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek DEBUG(0, ("Failed to retrieve value for %s\n", map[i].opt_name));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(5, ("Option %s has value %s\n", map[i].opt_name, map[i].name));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik/* =Parse-msg============================================================= */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik struct sdap_handle *sh, struct sdap_msg *sm,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = ldap_set_option(sh->ldap, LDAP_OPT_RESULT_CODE, &lerrno);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("ldap_set_option failed [%s], ignored.\n",
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ldap_get_option(sh->ldap, LDAP_OPT_RESULT_CODE, &lerrno);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = sysdb_attrs_add_string(attrs, SYSDB_ORIG_DN, str);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik vals = ldap_get_values_len(sh->ldap, sm->msg, "objectClass");
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("Unknown entry type, no objectClasses found!\n"));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik for (i = 0; vals[i]; i++) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik /* the objectclass is always the first name in the map */
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek /* ok it's an entry of the right type */
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek str = ldap_first_attribute(sh->ldap, sm->msg, &ber);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ldap_get_option(sh->ldap, LDAP_OPT_RESULT_CODE, &lerrno);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("Entry has no attributes [%d(%s)]!?\n",
be5cc3c013ece0c957f2f8c28a217052227dfd07Jakub Hrozek /* check if this attr is valid with the chosen schema */
be5cc3c013ece0c957f2f8c28a217052227dfd07Jakub Hrozek /* check if it is an attr we are interested in */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik if (strcasecmp(str, map[a].name) == 0) break;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik /* interesting attr */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("Attribute [%s] has range sub-attribute "
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik "which is currently not supported, skipping.\n", str));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik vals = ldap_get_values_len(sh->ldap, sm->msg, str);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ldap_get_option(sh->ldap, LDAP_OPT_RESULT_CODE, &lerrno);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(5, ("Attribute [%s] has no values, skipping.\n", str));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("Missing value after ldap_get_values() ??\n"));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik for (i = 0; vals[i]; i++) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik str = ldap_next_attribute(sh->ldap, sm->msg, ber);
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek ldap_get_option(sh->ldap, LDAP_OPT_RESULT_CODE, &lerrno);
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek/* This function converts an ldap message into a sysdb_attrs structure.
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek * It converts only known user attributes, the rest are ignored.
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek * If the entry is not that of an user an error is returned.
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek * The original DN is stored as an attribute named originalDN */
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozekint sdap_parse_user(TALLOC_CTX *memctx, struct sdap_options *opts,
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek return sdap_parse_entry(memctx, sh, sm, opts->user_map,
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek/* This function converts an ldap message into a sysdb_attrs structure.
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek * It converts only known group attributes, the rest are ignored.
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek * If the entry is not that of an user an error is returned.
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek * The original DN is stored as an attribute named originalDN */
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozekint sdap_parse_group(TALLOC_CTX *memctx, struct sdap_options *opts,
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek return sdap_parse_entry(memctx, sh, sm, opts->group_map,
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek/* Parses an LDAPDerefRes into sdap_deref_attrs structure */
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek const char **ocs;
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek const char *name;
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek res = talloc_array(tmp_ctx, struct sdap_deref_attrs *, num_maps);
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek for (i=0; i < num_maps; i++) {
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek res[i] = talloc_zero(res, struct sdap_deref_attrs);
f10ebaa51ecdcbbd10f171d19fe8e680e5bc74aaJakub Hrozek DEBUG(2, ("Dereferenced entry has no attributes\n"));
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek for (dval = dref->attrVals; dval != NULL; dval = dval->next) {
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek if (strcasecmp("objectClass", dval->type) == 0) {
d25fa6f2608d5fe0617ada47f9d426f45deb96ffJakub Hrozek DEBUG(4, ("No value for objectClass, skipping\n"));
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek ocs = talloc_array(tmp_ctx, const char *, len+1);
4c9419d98b89a6161a3dde11f9f80be39d12e72aJakub Hrozek for (i=0; i<len; i++) {
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek DEBUG(9, ("Dereferenced objectClass value: %s\n",
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek ocs[i] = talloc_strdup(ocs, dval->vals[i].bv_val);
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek DEBUG(1, ("Unknown entry type, no objectClasses found!\n"));
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek for (i=0; ocs[i]; i++) {
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek /* the objectclass is always the first name in the map */
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek if (strcasecmp(minfo[mi].map[0].name, ocs[i]) == 0) {
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek DEBUG(9, ("Found map for objectclass '%s'\n", ocs[i]));
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek if (!map) continue;
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozek ret = sysdb_attrs_add_string(res[mi]->attrs, SYSDB_ORIG_DN,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik for (dval = dref->attrVals; dval != NULL; dval = dval->next) {
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek DEBUG(8, ("Dereferenced attribute: %s\n", dval->type));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik /* check if this attr is valid with the chosen schema */
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek /* check if it is an attr we are interested in */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik if (strcasecmp(dval->type, map[a].name) == 0) break;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik /* interesting attr */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(4, ("No value for attribute %s, skipping\n", name));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(9, ("Dereferenced attribute value: %s\n",
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = sysdb_attrs_add_val(res[mi]->attrs, name, &v);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik/* =Get-DN-from-message=================================================== */
a23014d69b56cbdf48ad05229c334648b5309d8fJakub Hrozekint sdap_get_msg_dn(TALLOC_CTX *memctx, struct sdap_handle *sh,
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek ret = ldap_set_option(sh->ldap, LDAP_OPT_RESULT_CODE, &lerrno);
36b56482ca1e53d832accef0354124fd79711172Jakub Hrozek DEBUG(1, ("ldap_set_option failed [%s], ignored.\n",
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek ldap_get_option(sh->ldap, LDAP_OPT_RESULT_CODE, &lerrno);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnikerrno_t setup_tls_config(struct dp_option *basic_opts)
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik tls_opt = dp_opt_get_string(basic_opts, SDAP_TLS_REQCERT);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ldap_opt_x_tls_require_cert = LDAP_OPT_X_TLS_NEVER;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik else if (strcasecmp(tls_opt, "allow") == 0) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ldap_opt_x_tls_require_cert = LDAP_OPT_X_TLS_ALLOW;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ldap_opt_x_tls_require_cert = LDAP_OPT_X_TLS_TRY;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ldap_opt_x_tls_require_cert = LDAP_OPT_X_TLS_DEMAND;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik else if (strcasecmp(tls_opt, "hard") == 0) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ldap_opt_x_tls_require_cert = LDAP_OPT_X_TLS_HARD;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("Unknown value for tls_reqcert.\n"));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik /* LDAP_OPT_X_TLS_REQUIRE_CERT has to be set as a global option,
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek * because the SSL/TLS context is initialized from this value. */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = ldap_set_option(NULL, LDAP_OPT_X_TLS_REQUIRE_CERT,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("ldap_set_option failed: %s\n", sss_ldap_err2string(ret)));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik tls_opt = dp_opt_get_string(basic_opts, SDAP_TLS_CACERT);
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek ret = ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTFILE, tls_opt);
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek DEBUG(1, ("ldap_set_option failed: %s\n", sss_ldap_err2string(ret)));
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek tls_opt = dp_opt_get_string(basic_opts, SDAP_TLS_CACERTDIR);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = ldap_set_option(NULL, LDAP_OPT_X_TLS_CACERTDIR, tls_opt);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("ldap_set_option failed: %s\n", sss_ldap_err2string(ret)));
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek tls_opt = dp_opt_get_string(basic_opts, SDAP_TLS_CERT);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = ldap_set_option(NULL, LDAP_OPT_X_TLS_CERTFILE, tls_opt);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("ldap_set_option failed: %s\n", sss_ldap_err2string(ret)));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik tls_opt = dp_opt_get_string(basic_opts, SDAP_TLS_KEY);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = ldap_set_option(NULL, LDAP_OPT_X_TLS_KEYFILE, tls_opt);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("ldap_set_option failed: %s\n", sss_ldap_err2string(ret)));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik tls_opt = dp_opt_get_string(basic_opts, SDAP_TLS_CIPHER_SUITE);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = ldap_set_option(NULL, LDAP_OPT_X_TLS_CIPHER_SUITE, tls_opt);
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek DEBUG(1, ("ldap_set_option failed: %s\n", sss_ldap_err2string(ret)));
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnikbool sdap_check_sup_list(struct sup_list *l, const char *val)
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik return false;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik for (i = 0; i < l->num_vals; i++) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik return false;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnikstatic int sdap_init_sup_list(TALLOC_CTX *memctx,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik list->vals = talloc_array(memctx, char *, num);
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek for (i = 0; i < num; i++) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnikint sdap_set_rootdse_supported_lists(struct sysdb_attrs *rootdse,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik if (strcasecmp(el->name, "supportedControl") == 0) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = sdap_init_sup_list(sh, &sh->supported_controls,
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek } else if (strcasecmp(el->name, "supportedExtension") == 0) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = sdap_init_sup_list(sh, &sh->supported_extensions,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik } else if (strcasecmp(el->name, "supportedSASLMechanisms") == 0) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = sdap_init_sup_list(sh, &sh->supported_saslmechs,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnikstatic char *get_single_value_as_string(TALLOC_CTX *mem_ctx,
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek str = talloc_strndup(mem_ctx, (char *) el->values[0].data,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnikstatic char *get_naming_context(TALLOC_CTX *mem_ctx,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik SDAP_ROOTDSE_ATTR_DEFAULT_NAMING_CONTEXT) == 0) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(3, ("No attributes [%s] or [%s] found in rootDSE.\n",
481ec0e1eb0058195732cb320845b41f6f4d43ebJakub Hrozek DEBUG(5, ("Using value from [%s] as naming context.\n",
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek naming_context = get_single_value_as_string(mem_ctx, dnc);
36b56482ca1e53d832accef0354124fd79711172Jakub Hrozek DEBUG(5, ("Using value from [%s] as naming context.\n",
36b56482ca1e53d832accef0354124fd79711172Jakub Hrozek naming_context = get_single_value_as_string(mem_ctx, nc);
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozekstatic errno_t sdap_set_search_base(struct sdap_options *opts,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ("Setting option [%s] to [%s].\n",
be5cc3c013ece0c957f2f8c28a217052227dfd07Jakub Hrozek ret = dp_opt_set_string(opts->basic, class, naming_context);
36b56482ca1e53d832accef0354124fd79711172Jakub Hrozek ret = sdap_parse_search_base(opts, opts->basic, class, bases);
5ee3fba0bd812242a1ffe189f5ddf2689e6e6811Jakub Hrozekerrno_t sdap_set_config_options_with_rootdse(struct sysdb_attrs *rootdse,
5ee3fba0bd812242a1ffe189f5ddf2689e6e6811Jakub Hrozek naming_context = get_naming_context(opts->basic, rootdse);
5ee3fba0bd812242a1ffe189f5ddf2689e6e6811Jakub Hrozek /* Default */
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek /* Groups */
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek /* Netgroups */
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozekint sdap_get_server_opts_from_rootdse(TALLOC_CTX *memctx,
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek } usn_attrs[] = { { SDAP_IPA_LAST_USN, SDAP_IPA_USN },
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek so = talloc_zero(memctx, struct sdap_server_opts);
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek last_usn_name = opts->gen_map[SDAP_AT_LAST_USN].name;
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek entry_usn_name = opts->gen_map[SDAP_AT_ENTRY_USN].name;
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek DEBUG(1, ("%s configured but not found in rootdse!\n",
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek DEBUG(1, ("Multiple values of %s found in rootdse!\n",
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek DEBUG(1, ("Unkown error (%d) checking rootdse!\n", ret));
f45a20d6ba9e8d695ec3ab707f0cc082999aa4a3Jakub Hrozek DEBUG(1, ("%s found in rootdse but %s is not set!\n",
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek so->last_usn = strtoul(last_usn_value, &endptr, 10);
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek if (endptr != NULL && (*endptr != '\0' || endptr == last_usn_value)) {
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek DEBUG(3, ("USN is not valid (value: %s)\n", last_usn_value));
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek DEBUG(9, ("USN value: %s (int: %lu)\n", last_usn_value, so->last_usn));
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek /* no usn option configure, let's try to autodetect. */
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek /* Fixate discovered configuration */
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek talloc_strdup(opts->gen_map, usn_attrs[i].last_name);
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek talloc_strdup(opts->gen_map, usn_attrs[i].entry_name);
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek so->last_usn = strtoul(last_usn_value, &endptr, 10);
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek if (endptr != NULL && (*endptr != '\0' || endptr == last_usn_value)) {
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek DEBUG(3, ("USN is not valid (value: %s)\n", last_usn_value));
0142e7e2558a887992b1c5d4dc3051178e377687Jakub Hrozek DEBUG(9, ("USN value: %s (int: %lu)\n", last_usn_value, so->last_usn));
f10ebaa51ecdcbbd10f171d19fe8e680e5bc74aaJakub Hrozek DEBUG(5, ("No known USN scheme is supported by this server!\n"));
f10ebaa51ecdcbbd10f171d19fe8e680e5bc74aaJakub Hrozek DEBUG(5, ("Will use modification timestamp as usn!\n"));
f10ebaa51ecdcbbd10f171d19fe8e680e5bc74aaJakub Hrozek talloc_strdup(opts->gen_map, "modifyTimestamp");
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozek if (!opts->group_map[SDAP_AT_GROUP_USN].name) {
b47fd11a259c50e63cd674c7cba0da3f2549cae0Jakub Hrozekvoid sdap_steal_server_opts(struct sdap_id_ctx *id_ctx,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik id_ctx->srv_opts = talloc_move(id_ctx, srv_opts);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik /* discard if same as previous so we do not reset max usn values
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik * unnecessarily */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik if (strcmp(id_ctx->srv_opts->server_id, (*srv_opts)->server_id) == 0) {
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik id_ctx->srv_opts = talloc_move(id_ctx, srv_opts);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik const char **attrs;
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik attrs = talloc_array(memctx, const char *, size + 1);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik /* first attribute is "objectclass" not the specifc one */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik attrs[0] = talloc_strdup(memctx, "objectClass");
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik /* add the others */
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnikint sdap_control_create(struct sdap_handle *sh, const char *oid, int iscritical,
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik struct berval *value, int dupval, LDAPControl **ctrlp)
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik ret = sss_ldap_control_create(oid, iscritical, value, dupval, ctrlp);
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(1, ("sss_ldap_control_create failed [%d][%s].\n",
ad73be9b4d8712dfd9c14da4b984e63eaa8f2499Lukas Slebodnik DEBUG(3, ("Server does not support the requested control [%s].\n", oid));