ad_init.c revision 9a6ff0851fc707f21165818f66ae926fa14d7226
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/*
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina SSSD
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Authors:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Stephen Gallagher <sgallagh@redhat.com>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina Copyright (C) 2012 Red Hat
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is free software; you can redistribute it and/or modify
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina it under the terms of the GNU General Public License as published by
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina the Free Software Foundation; either version 3 of the License, or
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina (at your option) any later version.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina This program is distributed in the hope that it will be useful,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina but WITHOUT ANY WARRANTY; without even the implied warranty of
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina GNU General Public License for more details.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina You should have received a copy of the GNU General Public License
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina along with this program. If not, see <http://www.gnu.org/licenses/>.
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina*/
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <sys/types.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <unistd.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <sys/stat.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <fcntl.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include <sasl/sasl.h>
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "util/util.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ad/ad_common.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ad/ad_access.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ldap/ldap_common.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ldap/sdap_access.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ldap/sdap_idmap.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/krb5/krb5_auth.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/krb5/krb5_init_shared.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ad/ad_id.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ad/ad_srv.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/dp_dyndns.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ad/ad_subdomains.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina#include "providers/ad/ad_domain_info.h"
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct ad_options *ad_options = NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastatic void
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaad_shutdown(struct be_req *req);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinastruct bet_ops ad_id_ops = {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .handler = ad_account_info_handler,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .finalize = ad_shutdown,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina .check_online = ad_check_online
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina};
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březinastruct bet_ops ad_auth_ops = {
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina .handler = krb5_pam_handler,
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina .finalize = NULL
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina};
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březinastruct bet_ops ad_chpass_ops = {
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina .handler = krb5_pam_handler,
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina .finalize = NULL
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina};
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březinastruct bet_ops ad_access_ops = {
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina .handler = ad_access_handler,
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina .finalize = NULL
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina};
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina#define AD_COMPAT_ON "1"
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březinastatic int ad_sasl_getopt(void *context, const char *plugin_name,
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina const char *option,
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina const char **result, unsigned *len)
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina{
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina if (!plugin_name || !result) {
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina return SASL_FAIL;
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina }
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina if (strcmp(plugin_name, "GSSAPI") != 0) {
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina return SASL_FAIL;
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina }
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina if (strcmp(option, "ad_compat") != 0) {
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina return SASL_FAIL;
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina }
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina *result = AD_COMPAT_ON;
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina if (len) {
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina *len = 2;
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina }
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina return SASL_OK;
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina}
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březinatypedef int (*sss_sasl_gen_cb_fn)(void);
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březina
586fa3571753ab4a607d40fc31503fc0e8effd70Pavel Březinastatic int map_sasl2sssd_log_level(int sasl_level)
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina{
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina int sssd_level;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina switch(sasl_level) {
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina case SASL_LOG_ERR: /* log unusual errors (default) */
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina sssd_level = SSSDBG_CRIT_FAILURE;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina break;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina case SASL_LOG_FAIL: /* log all authentication failures */
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina sssd_level = SSSDBG_OP_FAILURE;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina break;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina case SASL_LOG_WARN: /* log non-fatal warnings */
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina sssd_level = SSSDBG_MINOR_FAILURE;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina break;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina case SASL_LOG_NOTE: /* more verbose than LOG_WARN */
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina case SASL_LOG_DEBUG: /* more verbose than LOG_NOTE */
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina case SASL_LOG_TRACE: /* traces of internal protocols */
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina case SASL_LOG_PASS: /* traces of internal protocols, including */
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina sssd_level = SSSDBG_TRACE_ALL;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina break;
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina default:
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina sssd_level = SSSDBG_TRACE_ALL;
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina break;
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina }
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina return sssd_level;
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina}
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březinaint ad_sasl_log(void *context, int level, const char *message)
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina{
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina int sssd_level;
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina if (level == SASL_LOG_ERR || level == SASL_LOG_FAIL) {
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina sss_log(SSS_LOG_ERR, "%s\n", message);
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina }
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina sssd_level = map_sasl2sssd_log_level(level);
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina DEBUG(sssd_level, "SASL: %s\n", message);
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina return SASL_OK;
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina}
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březinastatic const sasl_callback_t ad_sasl_callbacks[] = {
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina { SASL_CB_GETOPT, (sss_sasl_gen_cb_fn)ad_sasl_getopt, NULL },
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina { SASL_CB_LOG, (sss_sasl_gen_cb_fn)ad_sasl_log, NULL },
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina { SASL_CB_LIST_END, NULL, NULL }
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina};
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina/* This is quite a hack, we *try* to fool openldap libraries by initializing
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina * sasl first so we can pass in the SASL_CB_GETOPT callback we need to set some
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina * options. Should be removed as soon as openldap exposes a way to do that */
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březinastatic void ad_sasl_initialize(void)
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina{
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina /* NOTE: this may fail if soe other library in the system happens to
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina * initialize and use openldap libraries or directly the cyrus-sasl
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina * library as this initialization function can be called only once per
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina * process */
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina (void)sasl_client_init(ad_sasl_callbacks);
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina}
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březinastatic errno_t
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březinacommon_ad_init(struct be_ctx *bectx)
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina{
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina errno_t ret;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina char *ad_servers = NULL;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina char *ad_backup_servers = NULL;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina char *ad_realm;
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina ad_sasl_initialize();
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina /* Get AD-specific options */
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina ret = ad_get_common_options(bectx, bectx->cdb,
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina bectx->conf_path,
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina bectx->domain,
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina &ad_options);
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina if (ret != EOK) {
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE,
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina "Could not parse common options: [%s]\n",
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina strerror(ret));
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina goto done;
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina }
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina
bd4c2ed5aec7f57ea04500f0e43f151eedfdde45Pavel Březina ad_servers = dp_opt_get_string(ad_options->basic, AD_SERVER);
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina ad_backup_servers = dp_opt_get_string(ad_options->basic, AD_BACKUP_SERVER);
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina ad_realm = dp_opt_get_string(ad_options->basic, AD_KRB5_REALM);
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina /* Set up the failover service */
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina ret = ad_failover_init(ad_options, bectx, ad_servers, ad_backup_servers, ad_realm,
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina AD_SERVICE_NAME, AD_GC_SERVICE_NAME,
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina dp_opt_get_string(ad_options->basic, AD_DOMAIN),
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina &ad_options->service);
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina if (ret != EOK) {
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE,
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina "Failed to init AD failover service: [%s]\n",
bf83a0faacf16196ab9bd37dcf6190b4209ccaf7Pavel Březina strerror(ret));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadone:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaint
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinasssm_ad_id_init(struct be_ctx *bectx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct bet_ops **ops,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void **pvt_data)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct ad_id_ctx *ad_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *hostname;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *ad_domain;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *ad_site_override;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct ad_srv_plugin_ctx *srv_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (!ad_options) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = common_ad_init(bectx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ad_options->id_ctx) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* already initialized */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *ops = &ad_id_ops;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *pvt_data = ad_options->id_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_ctx = ad_id_ctx_init(ad_options, bectx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ad_ctx == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_options->id_ctx = ad_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ad_dyndns_init(ad_ctx->sdap_id_ctx->be, ad_options);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Failure setting up automatic DNS update\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Continue without DNS updates */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sdap_setup_child();
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "setup_child failed [%d][%s].\n",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret, strerror(ret));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Set up various SDAP options */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ad_get_id_options(ad_options, bectx->cdb,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina bectx->conf_path,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &ad_ctx->sdap_id_ctx->opts);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sdap_id_setup_tasks(bectx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_ctx->sdap_id_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_ctx->sdap_id_ctx->opts->sdom,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_enumeration_send,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_enumeration_recv,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_ctx->sdap_id_ctx->opts->sdom->pvt = ad_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Set up the ID mapping object */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sdap_idmap_init(ad_ctx->sdap_id_ctx, ad_ctx->sdap_id_ctx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &ad_ctx->sdap_id_ctx->opts->idmap_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = setup_tls_config(ad_ctx->sdap_id_ctx->opts->basic);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "setup_tls_config failed [%s]\n", strerror(ret));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* setup SRV lookup plugin */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hostname = dp_opt_get_string(ad_options->basic, AD_HOSTNAME);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (dp_opt_get_bool(ad_options->basic, AD_ENABLE_DNS_SITES)) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* use AD plugin */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_domain = dp_opt_get_string(ad_options->basic, AD_DOMAIN);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_site_override = dp_opt_get_string(ad_options->basic, AD_SITE);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina srv_ctx = ad_srv_plugin_ctx_init(bectx, bectx->be_res,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina default_host_dbs, ad_options->id,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina hostname, ad_domain,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_site_override);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (srv_ctx == NULL) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE, "Out of memory?\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina be_fo_set_srv_lookup_plugin(bectx, ad_srv_plugin_send,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_srv_plugin_recv, srv_ctx, "AD");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina } else {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* fall back to standard plugin */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = be_fo_set_dns_srv_lookup_plugin(bectx, hostname);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Unable to set SRV lookup plugin "
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "[%d]: %s\n", ret, strerror(ret));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* setup periodical refresh of expired records */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sdap_refresh_init(bectx->refresh_ctx, ad_ctx->sdap_id_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK && ret != EEXIST) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_MINOR_FAILURE, "Periodical refresh "
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "will not work [%d]: %s\n", ret, strerror(ret));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ad_machine_account_password_renewal_init(bectx, ad_options);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_CRIT_FAILURE, "Cannot setup task for machine account "
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "password renewal.\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *ops = &ad_id_ops;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *pvt_data = ad_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadone:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_zfree(ad_options->id_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaint
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinasssm_ad_auth_init(struct be_ctx *bectx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct bet_ops **ops,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void **pvt_data)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct krb5_ctx *krb5_auth_ctx = NULL;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (!ad_options) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = common_ad_init(bectx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ad_options->auth_ctx) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Already initialized */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *ops = &ad_auth_ops;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *pvt_data = ad_options->auth_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina krb5_auth_ctx = talloc_zero(NULL, struct krb5_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (!krb5_auth_ctx) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ENOMEM;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina krb5_auth_ctx->config_type = K5C_GENERIC;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina krb5_auth_ctx->service = ad_options->service->krb5_service;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = ad_get_auth_options(krb5_auth_ctx, ad_options, bectx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina &krb5_auth_ctx->opts);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Could not determine Kerberos options\n");
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = krb5_child_init(krb5_auth_ctx, bectx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina DEBUG(SSSDBG_FATAL_FAILURE,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina "Could not initialize krb5_child settings: [%s]\n",
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina strerror(ret));
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina goto done;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_options->auth_ctx = talloc_steal(ad_options, krb5_auth_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *ops = &ad_auth_ops;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *pvt_data = ad_options->auth_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinadone:
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina talloc_free(krb5_auth_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaint
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinasssm_ad_chpass_init(struct be_ctx *bectx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct bet_ops **ops,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void **pvt_data)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (!ad_options) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = common_ad_init(bectx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ret != EOK) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina if (ad_options->auth_ctx) {
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina /* Already initialized */
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *ops = &ad_chpass_ops;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *pvt_data = ad_options->auth_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return EOK;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina }
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ret = sssm_ad_auth_init(bectx, ops, pvt_data);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina *ops = &ad_chpass_ops;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina ad_options->auth_ctx = *pvt_data;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina return ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina}
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina/* GPO parsing of PAM service names to Windows Logon Rights*/
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaerrno_t ad_gpo_parse_map_options(struct ad_access_ctx *access_ctx);
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinaint
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březinasssm_ad_access_init(struct be_ctx *bectx,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct bet_ops **ops,
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina void **pvt_data)
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina{
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina errno_t ret;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct ad_access_ctx *access_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina struct ad_id_ctx *ad_id_ctx;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *filter;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina const char *gpo_access_control_mode;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina int gpo_cache_timeout;
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina
d3dee2a07f1a8ee9ae6f94e149ced754ef76c248Pavel Březina access_ctx = talloc_zero(bectx, struct ad_access_ctx);
if (!access_ctx) return ENOMEM;
ret = sssm_ad_id_init(bectx, ops, (void **)&ad_id_ctx);
if (ret != EOK) {
goto fail;
}
access_ctx->ad_id_ctx = ad_id_ctx;
ret = dp_copy_options(access_ctx, ad_options->basic, AD_OPTS_BASIC,
&access_ctx->ad_options);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE,
"Could not initialize access provider options: [%s]\n",
strerror(ret));
goto fail;
}
/* Set up an sdap_access_ctx for checking expired/locked accounts */
access_ctx->sdap_access_ctx =
talloc_zero(access_ctx, struct sdap_access_ctx);
if (!access_ctx->sdap_access_ctx) {
ret = ENOMEM;
goto fail;
}
access_ctx->sdap_access_ctx->id_ctx = ad_id_ctx->sdap_id_ctx;
/* If ad_access_filter is set, the value of ldap_acess_order is
* expire, filter, otherwise only expire
*/
access_ctx->sdap_access_ctx->access_rule[0] = LDAP_ACCESS_EXPIRE;
filter = dp_opt_get_cstring(access_ctx->ad_options, AD_ACCESS_FILTER);
if (filter != NULL) {
/* The processing of the extended filter is performed during the access
* check itself
*/
access_ctx->sdap_access_ctx->filter = talloc_strdup(
access_ctx->sdap_access_ctx,
filter);
if (access_ctx->sdap_access_ctx->filter == NULL) {
ret = ENOMEM;
goto fail;
}
access_ctx->sdap_access_ctx->access_rule[1] = LDAP_ACCESS_FILTER;
access_ctx->sdap_access_ctx->access_rule[2] = LDAP_ACCESS_EMPTY;
} else {
access_ctx->sdap_access_ctx->access_rule[1] = LDAP_ACCESS_EMPTY;
}
/* GPO access control mode */
gpo_access_control_mode =
dp_opt_get_string(access_ctx->ad_options, AD_GPO_ACCESS_CONTROL);
if (strcasecmp(gpo_access_control_mode, "disabled") == 0) {
access_ctx->gpo_access_control_mode = GPO_ACCESS_CONTROL_DISABLED;
} else if (strcasecmp(gpo_access_control_mode, "permissive") == 0) {
access_ctx->gpo_access_control_mode = GPO_ACCESS_CONTROL_PERMISSIVE;
} else if (strcasecmp(gpo_access_control_mode, "enforcing") == 0) {
access_ctx->gpo_access_control_mode = GPO_ACCESS_CONTROL_ENFORCING;
} else {
DEBUG(SSSDBG_FATAL_FAILURE,
"Unrecognized GPO access control mode: %s\n",
gpo_access_control_mode);
ret = EINVAL;
goto fail;
}
/* GPO cache timeout */
gpo_cache_timeout =
dp_opt_get_int(access_ctx->ad_options, AD_GPO_CACHE_TIMEOUT);
access_ctx->gpo_cache_timeout = gpo_cache_timeout;
/* GPO logon maps */
ret = sss_hash_create(access_ctx, 10, &access_ctx->gpo_map_options_table);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE,
"Could not create gpo_map_options hash table: [%s]\n",
strerror(ret));
goto fail;
}
ret = ad_gpo_parse_map_options(access_ctx);
if (ret != EOK) {
DEBUG(SSSDBG_FATAL_FAILURE,
"Could not parse gpo_map_options (invalid config): [%s]\n",
strerror(ret));
goto fail;
}
*ops = &ad_access_ops;
*pvt_data = access_ctx;
return EOK;
fail:
talloc_free(access_ctx);
return ret;
}
static void
ad_shutdown(struct be_req *req)
{
/* TODO: Clean up any internal data */
sdap_handler_done(req, DP_ERR_OK, EOK, NULL);
}
int sssm_ad_subdomains_init(struct be_ctx *bectx,
struct bet_ops **ops,
void **pvt_data)
{
int ret;
struct ad_id_ctx *id_ctx;
const char *ad_domain;
ret = sssm_ad_id_init(bectx, ops, (void **) &id_ctx);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "sssm_ad_id_init failed.\n");
return ret;
}
if (ad_options == NULL) {
DEBUG(SSSDBG_CRIT_FAILURE, "Global AD options not available.\n");
return EINVAL;
}
ad_domain = dp_opt_get_cstring(ad_options->basic, AD_DOMAIN);
ret = ad_subdom_init(bectx, id_ctx, ad_domain, ops, pvt_data);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "ad_subdom_init failed.\n");
return ret;
}
return EOK;
}
int sssm_ad_sudo_init(struct be_ctx *bectx,
struct bet_ops **ops,
void **pvt_data)
{
#ifdef BUILD_SUDO
struct ad_id_ctx *id_ctx;
int ret;
DEBUG(SSSDBG_TRACE_INTERNAL, "Initializing AD sudo handler\n");
ret = sssm_ad_id_init(bectx, ops, (void **) &id_ctx);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "sssm_ad_id_init failed.\n");
return ret;
}
return ad_sudo_init(bectx, id_ctx, ops, pvt_data);
#else
DEBUG(SSSDBG_MINOR_FAILURE, "Sudo init handler called but SSSD is "
"built without sudo support, ignoring\n");
return EOK;
#endif
}
int sssm_ad_autofs_init(struct be_ctx *bectx,
struct bet_ops **ops,
void **pvt_data)
{
#ifdef BUILD_AUTOFS
struct ad_id_ctx *id_ctx;
int ret;
DEBUG(SSSDBG_TRACE_INTERNAL, "Initializing AD autofs handler\n");
ret = sssm_ad_id_init(bectx, ops, (void **) &id_ctx);
if (ret != EOK) {
DEBUG(SSSDBG_CRIT_FAILURE, "sssm_ad_id_init failed.\n");
return ret;
}
return ad_autofs_init(bectx, id_ctx, ops, pvt_data);
#else
DEBUG(SSSDBG_MINOR_FAILURE, "Autofs init handler called but SSSD is "
"built without autofs support, ignoring\n");
return EOK;
#endif
}