From: Shloime Rosenblum Date: Wed, 11 May 2022 19:48:43 +0000 (-0400) Subject: res_agi: Evaluate dialplan functions and variables in agi exec if enabled X-Git-Tag: 18.13.0-rc1~20 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=1978732b8b8acebacf5d6f71d456f89c77bf1517;p=thirdparty%2Fasterisk.git 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 --- diff --git a/doc/CHANGES-staging/res_agi.txt b/doc/CHANGES-staging/res_agi.txt new file mode 100644 index 0000000000..eb6132d614 --- /dev/null +++ b/doc/CHANGES-staging/res_agi.txt @@ -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. \ No newline at end of file diff --git a/res/res_agi.c b/res/res_agi.c index 339a15d7fd..56e8e76c25 100644 --- a/res/res_agi.c +++ b/res/res_agi.c @@ -296,6 +296,9 @@ options. Returns whatever the application returns, or -2 on failure to find application. + + exec does not evaluate dialplan functions and variables unless it is explicitly enabled by setting the AGIEXECFULL variable to yes. + AGI @@ -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); }