]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
res_agi: Evaluate dialplan functions and variables in agi exec if enabled
authorShloime Rosenblum <shloimerosenblum@gmail.com>
Wed, 11 May 2022 19:48:43 +0000 (15:48 -0400)
committerKevin Harwell <kharwell@digium.com>
Tue, 31 May 2022 21:26:22 +0000 (16:26 -0500)
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

doc/CHANGES-staging/res_agi.txt [new file with mode: 0644]
res/res_agi.c

diff --git a/doc/CHANGES-staging/res_agi.txt b/doc/CHANGES-staging/res_agi.txt
new file mode 100644 (file)
index 0000000..eb6132d
--- /dev/null
@@ -0,0 +1,5 @@
+Subject: res_agi\r
+\r
+Agi command 'exec' can now be enabled\r
+to evaluate dialplan functions and variables\r
+by setting the variable AGIEXECFULL to yes.
\ No newline at end of file
index af85445482c77ed082d23fef104e03d8885f6743..93279050d809534f6fe756dc5c7caf1c4b4075e8 100644 (file)
                        <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);
                }