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 db824d8f6d
commit 1978732b8b
2 changed files with 25 additions and 1 deletions

View File

@ -0,0 +1,5 @@
Subject: res_agi
Agi command 'exec' can now be enabled
to evaluate dialplan functions and variables
by setting the variable AGIEXECFULL to yes.

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);
}