return 0;
}
-static rlm_rcode_t mod_map_proc(UNUSED void *mod_inst, UNUSED void *proc_inst, UNUSED request_t *request,
- UNUSED fr_value_box_list_t *src, UNUSED map_list_t const *maps)
+static unlang_action_t mod_map_proc(rlm_rcode_t *p_result, UNUSED void *mod_inst, UNUSED void *proc_inst,
+ UNUSED request_t *request, UNUSED fr_value_box_list_t *src,
+ UNUSED map_list_t const *maps)
{
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
static request_t *request_clone(request_t *old, int number, CONF_SECTION *server_cs)
* Evaluate the map processor src template, then call a map processor function to do
* something with the expanded src template and map the result to attributes in the request.
*
+ * @param[out] p_result Result code of evaluating the map.
* @param[in] request The current request.
* @param[in] inst of a map processor.
* @param[in,out] result Result of expanding the map input. May be consumed
* by the map processor.
+ * @return one of UNLANG_ACTION_*
*/
-rlm_rcode_t map_proc(request_t *request, map_proc_inst_t const *inst, fr_value_box_list_t *result)
+unlang_action_t map_proc(rlm_rcode_t *p_result, request_t *request, map_proc_inst_t const *inst, fr_value_box_list_t *result)
{
- return inst->proc->evaluate(inst->proc->mod_inst, inst->data, request, result, inst->maps);
+ return inst->proc->evaluate(p_result, inst->proc->mod_inst, inst->data, request, result, inst->maps);
}
/** Free all map_processors unregistering them
/** Function to evaluate the src string and map the result to server attributes
*
+ * @param[out] p_result Result of applying the map:
+ * - #RLM_MODULE_NOOP - If no data available for given src, or no mappings matched available data.
+ * - #RLM_MODULE_UPDATED - If new pairs were added to the request.
+ * - #RLM_MODULE_FAIL - If an error occurred performing the mapping.
* @param[in] mod_inst Instance of the module that registered the map_proc.
* @param[in] proc_inst Map proc data created by #map_proc_instantiate_t.
* @param[in] request The current request.
* @param[in,out] result Input data for the map processor. May be consumed by the
* map processor.
* @param[in] maps Head of the list of maps to process.
- * @return
- * - #RLM_MODULE_NOOP - If no data available for given src, or no mappings matched available data.
- * - #RLM_MODULE_UPDATED - If new pairs were added to the request.
- * - #RLM_MODULE_FAIL - If an error occurred performing the mapping.
+ * @return one of UNLANG_ACTION_*
*/
-typedef rlm_rcode_t (*map_proc_func_t)(void *mod_inst, void *proc_inst, request_t *request,
- fr_value_box_list_t *result, map_list_t const *maps);
+typedef unlang_action_t (*map_proc_func_t)(rlm_rcode_t *p_result, void *mod_inst, void *proc_inst, request_t *request,
+ fr_value_box_list_t *result, map_list_t const *maps);
/** Allocate new instance data for a map processor
*
map_proc_inst_t *map_proc_instantiate(TALLOC_CTX *ctx, map_proc_t const *proc,
CONF_SECTION *cs, tmpl_t const *src, map_list_t const *maps);
-rlm_rcode_t map_proc(request_t *request, map_proc_inst_t const *inst, fr_value_box_list_t *src);
+unlang_action_t map_proc(rlm_rcode_t *p_result, request_t *request, map_proc_inst_t const *inst, fr_value_box_list_t *src);
#ifdef __cplusplus
}
map_proc_inst_t *inst = gext->proc_inst;
unlang_frame_state_map_proc_t *map_proc_state = talloc_get_type_abort(frame->state, unlang_frame_state_map_proc_t);
+ unlang_action_t ret;
RDEBUG2("MAP %s \"%pM\"", inst->proc->name, &map_proc_state->src_result);
* FIXME - We don't yet support async LHS/RHS expansions for map procs
*/
VALUE_BOX_LIST_VERIFY(&map_proc_state->src_result);
- *p_result = map_proc(request, gext->proc_inst, &map_proc_state->src_result);
+ ret = map_proc(p_result, request, gext->proc_inst, &map_proc_state->src_result);
VALUE_BOX_LIST_VERIFY(&map_proc_state->src_result);
- return UNLANG_ACTION_CALCULATE_RESULT;
+ return ret;
}
static unlang_action_t unlang_map_state_init(rlm_rcode_t *p_result, request_t *request, unlang_stack_frame_t *frame)
/** Map multiple attributes from a client into the request
*
+ * @param[out] p_result Result of applying the map:
+ * - #RLM_MODULE_NOOP no rows were returned.
+ * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
+ * - #RLM_MODULE_FAIL if an error occurred.
* @param[in] mod_inst NULL.
* @param[in] proc_inst NULL.
* @param[in] request The current request.
* @param[in] client_override If NULL, use the current client, else use the client matching
* the ip given.
* @param[in] maps Head of the map list.
- * @return
- * - #RLM_MODULE_NOOP no rows were returned.
- * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
- * - #RLM_MODULE_FAIL if an error occurred.
+ * @return UNLANG_ACTION_CALCULATE_RESULT
*/
-static rlm_rcode_t map_proc_client(UNUSED void *mod_inst, UNUSED void *proc_inst, request_t *request,
- fr_value_box_list_t *client_override, map_list_t const *maps)
+static unlang_action_t map_proc_client(rlm_rcode_t *p_result, UNUSED void *mod_inst, UNUSED void *proc_inst,
+ request_t *request, fr_value_box_list_t *client_override, map_list_t const *maps)
{
rlm_rcode_t rcode = RLM_MODULE_OK;
map_t const *map = NULL;
FR_VALUE_BOX_LIST_FREE, true,
SIZE_MAX) < 0) {
REDEBUG("Failed concatenating input data");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
client_str = client_override_head->vb_strvalue;
client = client_from_request(request);
if (!client) {
REDEBUG("No client associated with this request");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
}
uctx.cs = client->cs;
REXDENT();
finish:
- return rcode;
+ RETURN_MODULE_RCODE(rcode);
}
static xlat_arg_parser_t const xlat_client_args[] = {
#include <freeradius-devel/server/map_proc.h>
-static rlm_rcode_t mod_map_proc(void *mod_inst, UNUSED void *proc_inst, request_t *request,
- fr_value_box_list_t *key, map_list_t const *maps);
+static unlang_action_t mod_map_proc(rlm_rcode_t *p_result, void *mod_inst, UNUSED void *proc_inst, request_t *request,
+ fr_value_box_list_t *key, map_list_t const *maps);
/*
* Define a structure for our module configuration.
/** Perform a search and map the result of the search to server attributes
*
+* @param[out] p_result Result of applying map:
+ * - #RLM_MODULE_NOOP no rows were returned.
+ * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
+ * - #RLM_MODULE_FAIL if an error occurred.
* @param[in] mod_inst #rlm_csv_t.
* @param[in] proc_inst mapping map entries to field numbers.
* @param[in,out] request The current request.
* @param[in] key key to look for
* @param[in] maps Head of the map list.
- * @return
- * - #RLM_MODULE_NOOP no rows were returned.
- * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
- * - #RLM_MODULE_FAIL if an error occurred.
+ * @return UNLANG_ACTION_CALCULATE_RESULT
*/
-static rlm_rcode_t mod_map_proc(void *mod_inst, UNUSED void *proc_inst, request_t *request,
- fr_value_box_list_t *key, map_list_t const *maps)
+static unlang_action_t mod_map_proc(rlm_rcode_t *p_result, void *mod_inst, UNUSED void *proc_inst, request_t *request,
+ fr_value_box_list_t *key, map_list_t const *maps)
{
rlm_csv_t *inst = talloc_get_type_abort(mod_inst, rlm_csv_t);
fr_value_box_t *key_head = fr_value_box_list_head(key);
if (!key_head) {
REDEBUG("CSV key cannot be (null)");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
if ((inst->key_data_type == FR_TYPE_OCTETS) || (inst->key_data_type == FR_TYPE_STRING)) {
FR_VALUE_BOX_LIST_FREE, true,
SIZE_MAX) < 0) {
REDEBUG("Failed parsing key");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
}
- return mod_map_apply(inst, request, key_head, maps);
+ RETURN_MODULE_RCODE(mod_map_apply(inst, request, key_head, maps));
}
/** Parses a JSON string, and executes jpath queries against it to map values to attributes
*
+ * @param p_result Result of applying map:
+ * - #RLM_MODULE_NOOP no rows were returned or columns matched.
+ * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
+ * - #RLM_MODULE_FAIL if a fault occurred.
* @param mod_inst unused.
* @param proc_inst cached jpath sequences.
* @param request The current request.
* @param json JSON string to parse.
* @param maps Head of the map list.
- * @return
- * - #RLM_MODULE_NOOP no rows were returned or columns matched.
- * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
- * - #RLM_MODULE_FAIL if a fault occurred.
+ * @return UNLANG_ACTION_CALCULATE_RESULT
*/
-static rlm_rcode_t mod_map_proc(UNUSED void *mod_inst, void *proc_inst, request_t *request,
- fr_value_box_list_t *json, map_list_t const *maps)
+static unlang_action_t mod_map_proc(rlm_rcode_t *p_result, UNUSED void *mod_inst, void *proc_inst, request_t *request,
+ fr_value_box_list_t *json, map_list_t const *maps)
{
rlm_rcode_t rcode = RLM_MODULE_UPDATED;
struct json_tokener *tok;
if (!json_head) {
REDEBUG("JSON map input cannot be (null)");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
if (fr_value_box_list_concat_in_place(request,
FR_VALUE_BOX_LIST_FREE, true,
SIZE_MAX) < 0) {
REDEBUG("Failed concatenating input");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
json_str = json_head->vb_strvalue;
if ((talloc_array_length(json_str) - 1) == 0) {
REDEBUG("JSON map input length must be > 0");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
tok = json_tokener_new();
json_object_put(to_eval.root);
json_tokener_free(tok);
- return rcode;
+ RETURN_MODULE_RCODE(rcode);
}
static int mod_bootstrap(module_inst_ctx_t const *mctx)
* @todo For xlat expansions we need to parse the raw URL first, and then apply
* different escape functions to the different parts.
*
+ * @param[out] p_result Result of map expansion:
+ * - #RLM_MODULE_NOOP no rows were returned.
+ * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
+ * - #RLM_MODULE_FAIL if an error occurred.
* @param[in] mod_inst #rlm_ldap_t
* @param[in] proc_inst unused.
* @param[in,out] request The current request.
* @param[in] url LDAP url specifying base DN and filter.
* @param[in] maps Head of the map list.
- * @return
- * - #RLM_MODULE_NOOP no rows were returned.
- * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
- * - #RLM_MODULE_FAIL if an error occurred.
+ * @return UNLANG_ACTION_CALCULATE_RESULT
*/
-static rlm_rcode_t mod_map_proc(void *mod_inst, UNUSED void *proc_inst, request_t *request,
- fr_value_box_list_t *url, map_list_t const *maps)
+static unlang_action_t mod_map_proc(rlm_rcode_t *p_result, void *mod_inst, UNUSED void *proc_inst, request_t *request,
+ fr_value_box_list_t *url, map_list_t const *maps)
{
rlm_rcode_t rcode = RLM_MODULE_UPDATED;
rlm_ldap_t *inst = talloc_get_type_abort(mod_inst, rlm_ldap_t);
*/
if (!url_head) {
REDEBUG("LDAP URL cannot be (null)");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
if (fr_value_box_list_concat_in_place(request,
FR_VALUE_BOX_LIST_FREE, true,
SIZE_MAX) < 0) {
REDEBUG("Failed concatenating input");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
url_str = url_head->vb_strvalue;
if (!ldap_is_ldap_url(url_str)) {
REDEBUG("Map query string does not look like a valid LDAP URI");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
if (ldap_url_parse(url_str, &ldap_url)){
REDEBUG("Parsing LDAP URL failed");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
/*
free_urldesc:
ldap_free_urldesc(ldap_url);
- return rcode;
+ RETURN_MODULE_RCODE(rcode);
}
/** Perform LDAP-Group comparison checking
/** Executes a SELECT query and maps the result to server attributes
*
+ * @param p_result Result of map expansion:
+ * - #RLM_MODULE_NOOP no rows were returned or columns matched.
+ * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
+ * - #RLM_MODULE_FAIL if a fault occurred.
* @param mod_inst #rlm_sql_t instance.
* @param proc_inst Instance data for this specific mod_proc call (unused).
* @param request The current request.
* @param query string to execute.
* @param maps Head of the map list.
- * @return
- * - #RLM_MODULE_NOOP no rows were returned or columns matched.
- * - #RLM_MODULE_UPDATED if one or more #fr_pair_t were added to the #request_t.
- * - #RLM_MODULE_FAIL if a fault occurred.
+ * @return UNLANG_ACTION_CALCULATE_RESULT
*/
-static rlm_rcode_t mod_map_proc(void *mod_inst, UNUSED void *proc_inst, request_t *request,
- fr_value_box_list_t *query, map_list_t const *maps)
+static unlang_action_t mod_map_proc(rlm_rcode_t *p_result, void *mod_inst, UNUSED void *proc_inst, request_t *request,
+ fr_value_box_list_t *query, map_list_t const *maps)
{
rlm_sql_t *inst = talloc_get_type_abort(mod_inst, rlm_sql_t);
rlm_sql_handle_t *handle = NULL;
if (!query_head) {
REDEBUG("Query cannot be (null)");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
if (fr_value_box_list_concat_in_place(request,
FR_VALUE_BOX_LIST_FREE, true,
SIZE_MAX) < 0) {
RPEDEBUG("Failed concatenating input string");
- return RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
}
query_str = query_head->vb_strvalue;
handle = fr_pool_connection_get(inst->pool, request); /* connection pool should produce error */
if (!handle) {
- rcode = RLM_MODULE_FAIL;
+ RETURN_MODULE_FAIL;
goto finish;
}
talloc_free(fields);
fr_pool_connection_release(inst->pool, request, handle);
- return rcode;
+ RETURN_MODULE_RCODE(rcode);
}