diff options
Diffstat (limited to 'xlators/protocol/server/src/authenticate.c')
-rw-r--r-- | xlators/protocol/server/src/authenticate.c | 327 |
1 files changed, 161 insertions, 166 deletions
diff --git a/xlators/protocol/server/src/authenticate.c b/xlators/protocol/server/src/authenticate.c index 0d95b9a7ac9..c1229f9ebf3 100644 --- a/xlators/protocol/server/src/authenticate.c +++ b/xlators/protocol/server/src/authenticate.c @@ -8,8 +8,6 @@ cases as published by the Free Software Foundation. */ - - #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif @@ -21,217 +19,214 @@ #include "server-messages.h" static int -init (dict_t *this, char *key, data_t *value, void *data) +init(dict_t *this, char *key, data_t *value, void *data) { - void *handle = NULL; - char *auth_file = NULL; - auth_handle_t *auth_handle = NULL; - auth_fn_t authenticate = NULL; - int *error = NULL; - int ret = 0; - - /* It gets over written */ - error = data; - - if (!strncasecmp (key, "ip", SLEN ("ip"))) { - gf_msg ("authenticate", GF_LOG_ERROR, 0, - PS_MSG_AUTHENTICATE_ERROR, "AUTHENTICATION MODULE " - "\"IP\" HAS BEEN REPLACED BY \"ADDR\""); - dict_set (this, key, data_from_dynptr (NULL, 0)); - /* TODO: 1.3.x backward compatibility */ - // *error = -1; - // return; - key = "addr"; - } - - ret = gf_asprintf (&auth_file, "%s/%s.so", LIBDIR, key); - if (-1 == ret) { - dict_set (this, key, data_from_dynptr (NULL, 0)); - *error = -1; - return -1; - } - - handle = dlopen (auth_file, RTLD_LAZY); - if (!handle) { - gf_msg ("authenticate", GF_LOG_ERROR, 0, - PS_MSG_AUTHENTICATE_ERROR, "dlopen(%s): %s\n", - auth_file, dlerror ()); - dict_set (this, key, data_from_dynptr (NULL, 0)); - GF_FREE (auth_file); - *error = -1; - return -1; - } - GF_FREE (auth_file); - - authenticate = dlsym (handle, "gf_auth"); - if (!authenticate) { - gf_msg ("authenticate", GF_LOG_ERROR, 0, - PS_MSG_AUTHENTICATE_ERROR, "dlsym(gf_auth) on %s\n", - dlerror ()); - dict_set (this, key, data_from_dynptr (NULL, 0)); - dlclose (handle); - *error = -1; - return -1; - } - - auth_handle = GF_CALLOC (1, sizeof (*auth_handle), - gf_common_mt_auth_handle_t); - if (!auth_handle) { - dict_set (this, key, data_from_dynptr (NULL, 0)); - *error = -1; - dlclose (handle); - return -1; - } - auth_handle->vol_opt = GF_CALLOC (1, sizeof (volume_opt_list_t), - gf_common_mt_volume_opt_list_t); - if (!auth_handle->vol_opt) { - dict_set (this, key, data_from_dynptr (NULL, 0)); - *error = -1; - GF_FREE (auth_handle); - dlclose (handle); - return -1; - } - auth_handle->vol_opt->given_opt = dlsym (handle, "options"); - if (auth_handle->vol_opt->given_opt == NULL) { - gf_msg_debug ("authenticate", 0, "volume option validation " - "not specified"); - } - - auth_handle->authenticate = authenticate; - auth_handle->handle = handle; - - dict_set (this, key, - data_from_dynptr (auth_handle, sizeof (*auth_handle))); - return 0; + void *handle = NULL; + char *auth_file = NULL; + auth_handle_t *auth_handle = NULL; + auth_fn_t authenticate = NULL; + int *error = NULL; + int ret = 0; + + /* It gets over written */ + error = data; + + if (!strncasecmp(key, "ip", SLEN("ip"))) { + gf_msg("authenticate", GF_LOG_ERROR, 0, PS_MSG_AUTHENTICATE_ERROR, + "AUTHENTICATION MODULE " + "\"IP\" HAS BEEN REPLACED BY \"ADDR\""); + dict_set(this, key, data_from_dynptr(NULL, 0)); + /* TODO: 1.3.x backward compatibility */ + // *error = -1; + // return; + key = "addr"; + } + + ret = gf_asprintf(&auth_file, "%s/%s.so", LIBDIR, key); + if (-1 == ret) { + dict_set(this, key, data_from_dynptr(NULL, 0)); + *error = -1; + return -1; + } + + handle = dlopen(auth_file, RTLD_LAZY); + if (!handle) { + gf_msg("authenticate", GF_LOG_ERROR, 0, PS_MSG_AUTHENTICATE_ERROR, + "dlopen(%s): %s\n", auth_file, dlerror()); + dict_set(this, key, data_from_dynptr(NULL, 0)); + GF_FREE(auth_file); + *error = -1; + return -1; + } + GF_FREE(auth_file); + + authenticate = dlsym(handle, "gf_auth"); + if (!authenticate) { + gf_msg("authenticate", GF_LOG_ERROR, 0, PS_MSG_AUTHENTICATE_ERROR, + "dlsym(gf_auth) on %s\n", dlerror()); + dict_set(this, key, data_from_dynptr(NULL, 0)); + dlclose(handle); + *error = -1; + return -1; + } + + auth_handle = GF_CALLOC(1, sizeof(*auth_handle), + gf_common_mt_auth_handle_t); + if (!auth_handle) { + dict_set(this, key, data_from_dynptr(NULL, 0)); + *error = -1; + dlclose(handle); + return -1; + } + auth_handle->vol_opt = GF_CALLOC(1, sizeof(volume_opt_list_t), + gf_common_mt_volume_opt_list_t); + if (!auth_handle->vol_opt) { + dict_set(this, key, data_from_dynptr(NULL, 0)); + *error = -1; + GF_FREE(auth_handle); + dlclose(handle); + return -1; + } + auth_handle->vol_opt->given_opt = dlsym(handle, "options"); + if (auth_handle->vol_opt->given_opt == NULL) { + gf_msg_debug("authenticate", 0, + "volume option validation " + "not specified"); + } + + auth_handle->authenticate = authenticate; + auth_handle->handle = handle; + + dict_set(this, key, data_from_dynptr(auth_handle, sizeof(*auth_handle))); + return 0; } static int -fini (dict_t *this, char *key, data_t *value, void *data) +fini(dict_t *this, char *key, data_t *value, void *data) { - auth_handle_t *handle = data_to_ptr (value); - if (handle) { - dlclose (handle->handle); - } - return 0; + auth_handle_t *handle = data_to_ptr(value); + if (handle) { + dlclose(handle->handle); + } + return 0; } static int -_gf_auth_option_validate (dict_t *d, char *k, data_t *v, void *tmp) +_gf_auth_option_validate(dict_t *d, char *k, data_t *v, void *tmp) { - auth_handle_t *handle = NULL; - xlator_t *xl = NULL; - int ret = 0; + auth_handle_t *handle = NULL; + xlator_t *xl = NULL; + int ret = 0; - xl = tmp; + xl = tmp; - handle = data_to_ptr (v); - if (!handle) - return 0; + handle = data_to_ptr(v); + if (!handle) + return 0; - list_add_tail (&(handle->vol_opt->list), &(xl->volume_options)); + list_add_tail(&(handle->vol_opt->list), &(xl->volume_options)); - ret = xlator_options_validate_list (xl, xl->options, - handle->vol_opt, NULL); - if (ret) { - gf_msg ("authenticate", GF_LOG_ERROR, 0, - PS_MSG_VOL_VALIDATE_FAILED, "volume option validation " - "failed"); - return -1; - } - return 0; + ret = xlator_options_validate_list(xl, xl->options, handle->vol_opt, NULL); + if (ret) { + gf_msg("authenticate", GF_LOG_ERROR, 0, PS_MSG_VOL_VALIDATE_FAILED, + "volume option validation " + "failed"); + return -1; + } + return 0; } int32_t -gf_auth_init (xlator_t *xl, dict_t *auth_modules) +gf_auth_init(xlator_t *xl, dict_t *auth_modules) { - int ret = 0; + int ret = 0; - dict_foreach (auth_modules, init, &ret); - if (ret) - goto out; + dict_foreach(auth_modules, init, &ret); + if (ret) + goto out; - ret = dict_foreach (auth_modules, _gf_auth_option_validate, xl); + ret = dict_foreach(auth_modules, _gf_auth_option_validate, xl); out: - if (ret) { - gf_msg (xl->name, GF_LOG_ERROR, 0, PS_MSG_AUTH_INIT_FAILED, - "authentication init failed"); - dict_foreach (auth_modules, fini, &ret); - ret = -1; - } - return ret; + if (ret) { + gf_msg(xl->name, GF_LOG_ERROR, 0, PS_MSG_AUTH_INIT_FAILED, + "authentication init failed"); + dict_foreach(auth_modules, fini, &ret); + ret = -1; + } + return ret; } typedef struct { - dict_t *iparams; - dict_t *cparams; - int64_t result; + dict_t *iparams; + dict_t *cparams; + int64_t result; } gf_auth_args_t; static int -gf_auth_one_method (dict_t *this, char *key, data_t *value, void *data) +gf_auth_one_method(dict_t *this, char *key, data_t *value, void *data) { - gf_auth_args_t *args = data; - auth_handle_t *handle = NULL; + gf_auth_args_t *args = data; + auth_handle_t *handle = NULL; - if (!value) { - return 0; - } + if (!value) { + return 0; + } - handle = data_to_ptr (value); - if (!handle || !handle->authenticate) { - return 0; - } + handle = data_to_ptr(value); + if (!handle || !handle->authenticate) { + return 0; + } - switch (handle->authenticate (args->iparams, args->cparams)) { + switch (handle->authenticate(args->iparams, args->cparams)) { case AUTH_ACCEPT: - if (args->result != AUTH_REJECT) { - args->result = AUTH_ACCEPT; - } - /* FALLTHROUGH */ + if (args->result != AUTH_REJECT) { + args->result = AUTH_ACCEPT; + } + /* FALLTHROUGH */ default: - return 0; + return 0; case AUTH_REJECT: - args->result = AUTH_REJECT; - return -1; - } + args->result = AUTH_REJECT; + return -1; + } } auth_result_t -gf_authenticate (dict_t *input_params, - dict_t *config_params, - dict_t *auth_modules) +gf_authenticate(dict_t *input_params, dict_t *config_params, + dict_t *auth_modules) { - char *name = NULL; - data_t *peerinfo_data = NULL; - gf_auth_args_t args; - - args.iparams = input_params; - args.cparams = config_params; - args.result = AUTH_DONT_CARE; + char *name = NULL; + data_t *peerinfo_data = NULL; + gf_auth_args_t args; - dict_foreach (auth_modules, gf_auth_one_method, &args); + args.iparams = input_params; + args.cparams = config_params; + args.result = AUTH_DONT_CARE; - if (AUTH_DONT_CARE == args.result) { - peerinfo_data = dict_get (input_params, "peer-info-name"); + dict_foreach(auth_modules, gf_auth_one_method, &args); - if (peerinfo_data) { - name = peerinfo_data->data; - } + if (AUTH_DONT_CARE == args.result) { + peerinfo_data = dict_get(input_params, "peer-info-name"); - gf_msg ("auth", GF_LOG_ERROR, 0, PS_MSG_REMOTE_CLIENT_REFUSED, - "no authentication module is interested in " - "accepting remote-client %s", name); - args.result = AUTH_REJECT; + if (peerinfo_data) { + name = peerinfo_data->data; } - return args.result; + gf_msg("auth", GF_LOG_ERROR, 0, PS_MSG_REMOTE_CLIENT_REFUSED, + "no authentication module is interested in " + "accepting remote-client %s", + name); + args.result = AUTH_REJECT; + } + + return args.result; } void -gf_auth_fini (dict_t *auth_modules) +gf_auth_fini(dict_t *auth_modules) { - int32_t dummy; + int32_t dummy; - dict_foreach (auth_modules, fini, &dummy); + dict_foreach(auth_modules, fini, &dummy); } |