dolibarr 23.0.3
wrapper.php
Go to the documentation of this file.
1<?php
2/* Copyright (C) 2009-2010 Laurent Destailleur <eldy@users.sourceforge.net>
3 * Copyright (C) 2024-2025 Frédéric France <frederic.france@free.fr>
4 * Copyright (C) 2024-2025 MDW <mdeweerd@users.noreply.github.com>
5 *
6 * This program is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 3 of the License, or
9 * (at your option) any later version.
10 *
11 * This program is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
15 *
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <https://www.gnu.org/licenses/>.
18 */
19
32if (!defined('NOREQUIRESOC')) {
33 define('NOREQUIRESOC', '1');
34}
35if (!defined('NOREQUIRETRAN')) {
36 define('NOREQUIRETRAN', '1');
37}
38if (!defined('NOTOKENRENEWAL')) {
39 define('NOTOKENRENEWAL', '1');
40}
41if (!defined('NOREQUIREMENU')) {
42 define('NOREQUIREMENU', '1');
43}
44if (!defined('NOREQUIREHTML')) {
45 define('NOREQUIREHTML', '1');
46}
47if (!defined('NOREQUIREAJAX')) {
48 define('NOREQUIREAJAX', '1');
49}
50
73function llxHeader($head = '', $title = '', $help_url = '', $target = '', $disablejs = 0, $disablehead = 0, $arrayofjs = '', $arrayofcss = '', $morequerystring = '', $morecssonbody = '', $replacemainareaby = '', $disablenofollow = 0, $disablenoindex = 0) // @phan-suppress-current-line PhanRedefineFunction
74{
75 print '<html>'."\n";
76 print '<head>'."\n";
77 print '<title>Asterisk redirection from Dolibarr...</title>'."\n";
78 print '</head>'."\n";
79}
80
91function llxFooter($comment = '', $zone = 'private', $disabledoutputofmessages = 0) // @phan-suppress-current-line PhanRedefineFunction
92{
93 print "\n".'</html>'."\n";
94}
95
96require_once '../main.inc.php';
105require_once DOL_DOCUMENT_ROOT.'/core/lib/functions.lib.php';
106require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php';
107
108// Security check
109if (!isModEnabled('clicktodial')) {
111}
112
113
114// Define Asterisk setup
115if (getDolGlobalString('ASTERISK_INDICATIF') == 'NONE') {
116 $conf->global->ASTERISK_INDICATIF = '';
117}
118
119$login = GETPOST('login', 'alphanohtml');
120$password = GETPOST('password', 'password');
121$caller = GETPOST('caller', 'alphanohtml');
122$called = GETPOST('called', 'alphanohtml');
123
124// Sanitize input data to avoid to use the wrapper to inject malicious paylod into asterisk
125$login = preg_replace('/[\n\r]/', '', $login);
126$password = preg_replace('/[\n\r]/', '', $password);
127$caller = preg_replace('/[\n\r]/', '', $caller);
128$called = preg_replace('/[\n\r]/', '', $called);
129
130// IP address of Asterisk server
131$strHost = getDolGlobalString('ASTERISK_HOST', '127.0.0.1');
132
133// Specify the type of extension through which your extension is connected.
134// ex: SIP/, IAX2/, ZAP/, etc
135$channel = getDolGlobalString('ASTERISK_TYPE', 'SIP/');
136
137// Outgoing call sign
138$prefix = getDolGlobalString('ASTERISK_INDICATIF', '0');
139
140// Asterisk Port
141$port = getDolGlobalInt('ASTERISK_PORT', 5038);
142
143// Context ( generalement from-internal )
144$strContext = getDolGlobalString('ASTERISK_CONTEXT', 'from-internal');
145
146// Waiting time before hanging up
147$strWaitTime = getDolGlobalString('ASTERISK_WAIT_TIME', '30');
148
149// Priority
150$strPriority = getDolGlobalString('ASTERISK_PRIORITY', '1');
151
152// Number of call attempts
153$strMaxRetry = getDolGlobalString('ASTERISK_MAX_RETRY', "2");
154
155
156/*
157 * View
158 */
159
160llxHeader('', '', '', '', 0, 0, '', '', '', 'mod-asterisk page-wrapper');
161
162$sql = "SELECT s.nom as name FROM ".MAIN_DB_PREFIX."societe as s";
163$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."socpeople as sp ON sp.fk_soc = s.rowid";
164$sql .= " WHERE s.entity IN (".getEntity('societe').")";
165$sql .= " AND (s.phone='".$db->escape($called)."'";
166$sql .= " OR sp.phone='".$db->escape($called)."'";
167$sql .= " OR sp.phone_perso='".$db->escape($called)."'";
168$sql .= " OR sp.phone_mobile='".$db->escape($called)."')";
169$sql .= $db->plimit(1);
170
171dol_syslog('click to dial search information with phone '.$called, LOG_DEBUG);
172$resql = $db->query($sql);
173if ($resql) {
174 $obj = $db->fetch_object($resql);
175 if ($obj) {
176 $found = $obj->name;
177 } else {
178 $found = 'Not found';
179 }
180 $db->free($resql);
181} else {
182 dol_print_error($db, 'Error');
183 $found = 'Error';
184}
185
186$number = strtolower($called);
187$pos = strpos($number, "local");
188if (!empty($number)) {
189 if ($pos === false) {
190 $errno = 0;
191 $errstr = 0;
192 $strCallerId = "Dolibarr caller $found <".strtolower($number).">";
193 $oSocket = @fsockopen($strHost, (int) $port, $errno, $errstr, 10);
194 if (!$oSocket) {
195 print '<body>'."\n";
196 $txt = "Failed to execute fsockopen($strHost, $port, \$errno, \$errstr, 10)<br>\n";
197 print $txt;
198 dol_syslog($txt, LOG_ERR);
199 $txt = $errstr." (".$errno.")<br>\n";
200 print $txt;
201 dol_syslog($txt, LOG_ERR);
202 print '</body>'."\n";
203 } else {
204 $txt = "Call Asterisk dialer for caller: ".$caller.", called: ".$called." clicktodiallogin: ".$login;
205 dol_syslog($txt);
206 print '<body onload="history.go(-1);">'."\n";
207 print '<!-- '.$txt.' -->';
208 fwrite($oSocket, "Action: login\r\n");
209 fwrite($oSocket, "Events: off\r\n");
210 fwrite($oSocket, "Username: $login\r\n");
211 fwrite($oSocket, "Secret: $password\r\n\r\n");
212 fwrite($oSocket, "Action: originate\r\n");
213 fwrite($oSocket, "Channel: ".$channel.$caller."\r\n");
214 fwrite($oSocket, "WaitTime: $strWaitTime\r\n");
215 fwrite($oSocket, "CallerId: $strCallerId\r\n");
216 fwrite($oSocket, "Exten: ".$prefix.$number."\r\n");
217 fwrite($oSocket, "Context: $strContext\r\n");
218 fwrite($oSocket, "Priority: $strPriority\r\n\r\n");
219 fwrite($oSocket, "Action: Logoff\r\n\r\n");
220 sleep(2);
221 fclose($oSocket);
222 print '</body>'."\n";
223 }
224 }
225} else {
226 print 'Bad parameters in URL. Must be '.dol_escape_htmltag($_SERVER['PHP_SELF']).'?caller=99999&called=99999&login=xxxxx&password=xxxxx';
227}
228
229// End of page
230llxFooter();
231$db->close();
llxFooter($comment='', $zone='private', $disabledoutputofmessages=0)
Empty footer.
Definition wrapper.php:91
if(!defined('NOREQUIRESOC')) if(!defined( 'NOREQUIRETRAN')) if(!defined('NOTOKENRENEWAL')) if(!defined( 'NOREQUIREMENU')) if(!defined('NOREQUIREHTML')) if(!defined( 'NOREQUIREAJAX')) llxHeader($head='', $title='', $help_url='', $target='', $disablejs=0, $disablehead=0, $arrayofjs='', $arrayofcss='', $morequerystring='', $morecssonbody='', $replacemainareaby='', $disablenofollow=0, $disablenoindex=0)
Empty header.
Definition wrapper.php:73
getDolGlobalInt($key, $default=0)
Return a Dolibarr global constant int value.
GETPOST($paramname, $check='alphanohtml', $method=0, $filter=null, $options=null, $noreplace=0)
Return value of a param into GET or POST supervariable.
dol_print_error($db=null, $error='', $errors=null)
Displays error message system with all the information to facilitate the diagnosis and the escalation...
getDolGlobalString($key, $default='')
Return a Dolibarr global constant string value.
isModEnabled($module)
Is Dolibarr module enabled.
dol_syslog($message, $level=LOG_INFO, $ident=0, $suffixinfilename='', $restricttologhandler='', $logcontext=null)
Write log message into outputs.
accessforbidden($message='', $printheader=1, $printfooter=1, $showonlymessage=0, $params=null)
Show a message to say access is forbidden and stop program.