res_agi: Evaluate dialplan functions and variables in agi exec if enabled

Agi commnad exec can now evaluate dialplan functions and
variables if variable AGIEXECFULL is set to yes. this can
be useful when executing Playback or Read from agi.

ASTERISK-30058 #close

Change-Id: I669991f540496e7bddd096fec82b52c083036832
This commit is contained in:
Shloime Rosenblum
2022-05-11 15:48:43 -04:00
parent 29165bf2e1
commit d1f32e75d7
2 changed files with 25 additions and 1 deletions

View File

@@ -296,6 +296,9 @@
<replaceable>options</replaceable>.</para>
<para>Returns whatever the <replaceable>application</replaceable> returns, or
<literal>-2</literal> on failure to find <replaceable>application</replaceable>.</para>
<note>
<para>exec does not evaluate dialplan functions and variables unless it is explicitly enabled by setting the <variable>AGIEXECFULL</variable> variable to <literal>yes</literal>.</para>
</note>
</description>
<see-also>
<ref type="application">AGI</ref>
@@ -3121,6 +3124,9 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, const char
{
int res, workaround;
struct ast_app *app_to_exec;
const char *agi_exec_full_str;
int agi_exec_full;
struct ast_str *data_with_var = NULL;
if (argc < 2)
return RESULT_SHOWUSAGE;
@@ -3132,8 +3138,21 @@ static int handle_exec(struct ast_channel *chan, AGI *agi, int argc, const char
if (!(workaround = ast_test_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS))) {
ast_set_flag(ast_channel_flags(chan), AST_FLAG_DISABLE_WORKAROUNDS);
}
agi_exec_full_str = pbx_builtin_getvar_helper(chan, "AGIEXECFULL");
agi_exec_full = ast_true(agi_exec_full_str);
ast_channel_unlock(chan);
res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : argv[2]);
if (agi_exec_full) {
if ((data_with_var = ast_str_create(16))) {
ast_str_substitute_variables(&data_with_var, 0, chan, argv[2]);
res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : ast_str_buffer(data_with_var));
ast_free(data_with_var);
} else {
res = -2;
}
} else {
res = pbx_exec(chan, app_to_exec, argc == 2 ? "" : argv[2]);
}
if (!workaround) {
ast_channel_clear_flag(chan, AST_FLAG_DISABLE_WORKAROUNDS);
}