-
Notifications
You must be signed in to change notification settings - Fork 1
/
sendfax.module
288 lines (246 loc) · 10.9 KB
/
sendfax.module
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
<?php
/**
* @file
* Pierre Bastoul (@hiousi)
* freepbx ARI module to send a fax uploaded from web
* http://code.google.com/p/webfax-ari-module
* require digium's FFA
*
* a refork of Web Fax for Asterisk php script written by recluze (http://csrdu.org/nauman)
*
*/
/**
short help
First download and setup Free Fax for Asterisk (FFA) from Digium Store http://store.digium.com
Install the Fax module on Freepbx, it will help you configure inbound faxing. Test incoming faxes.
Copy sendfax.module to /%AMPROOT%/recordings/modules/sendfax.module
Copy sendfaxnotify.php to ${ASTVARLIBDIR}/bin/sendfaxnotify.php
Change the two files to be owned by the user running Asterisk.
Create the following context in /etc/asterisk/extensions_custom.conf and reload asterisk
[outboundfax]
exten => s,1,Set(FAXOPT(filename)=${FAXFILE})
exten => s,n,Set(FAXOPT(ecm)=yes)
exten => s,n,Set(FAXOPT(headerinfo)=${FAXHEADER})
exten => s,n,Set(FAXOPT(localstationid)=${LOCALID})
exten => s,n,Set(FAXOPT(maxrate)=14400)
exten => s,n,Set(FAXOPT(minrate)=2400)
exten => s,n,SendFAX(${FAXFILE},d)
exten => s,n,System(${ASTVARLIBDIR}/bin/sendfaxnotify.php INIT "${EMAIL}" "${DESTINATION}" "${TIMESTAMP}" "NO_STATUS" "NO_PAGES")
exten => h,1,NoOp(FAXOPT(ecm) : ${FAXOPT(ecm)})
exten => h,n,NoOp(FaxStatus : ${FAXSTATUS})
exten => h,n,NoOp(FaxStatusString : ${FAXSTATUSSTRING})
exten => h,n,NoOp(FaxError : ${FAXERROR})
exten => h,n,NoOp(RemoteStationID : ${REMOTESTATIONID})
exten => h,n,NoOp(FaxPages : ${FAXPAGES})
exten => h,n,NoOp(FaxBitRate : ${FAXBITRATE})
exten => h,n,NoOp(FaxResolution : ${FAXRESOLUTION})
exten => h,n,System(${ASTVARLIBDIR}/bin/sendfaxnotify.php NOTIFY "${EMAIL}" "${DESTINATION}" "${TIMESTAMP}" "${FAXSTATUSSTRING}" "${FAXPAGES}")
; end of outboundfax context
*/
//*****************************************************************************
class SendFax {
var $outbound_route = "from-internal"; // outbound route name
var $outboundfax_context = "outboundfax"; // oubound fax context
var $asterisk_spool_folder = "/var/spool/asterisk/outgoing";
//*****************************************************************************
function rank() {
$rank = 3;
return $rank;
}
//*****************************************************************************
function init() {
}
//*****************************************************************************
function navMenu($args) {
$ret .= "
<p><small><small><a href='" . $_SESSION['ARI_ROOT'] . "?m=SendFax&f=display'>" . _("Send Fax") . "</a></small></small></p>";
return $ret;
}
//*****************************************************************************
function action($args) {
// args
$m = getArgument($args,'m');
$a = getArgument($args,'a');;
$POST=array(
'faxHeader' => getArgument($args,'faxHeader'),
'localID' => getArgument($args,"localID"),
'email' => getArgument($args,"email"),
'dest' => getArgument($args,"dest")
);
if ($a=='send') {
$_SESSION['ari_error'] = "";
$POST['localID']=str_replace(' ', '', $POST['localID']);
if (!preg_match('/^[0-9\+]+$/',$POST['localID'])) {
$_SESSION['ari_error'] .= _("Check Local Station Identifier, no specials characters please") . "<br />" ;
}
$POST['dest']=str_replace(' ', '', $POST['dest']);
if ($POST['dest']=="") {
$_SESSION['ari_error'] .= _("You must give a destination Fax number") . "<br />" ;
} elseif (!preg_match('/^[0-9\+]+$/',$POST['dest'])) {
$_SESSION['ari_error'] .= _("Check destination Fax number, only digits.") . "<br />" ;
}
if (!preg_match('/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,6}$/i',$POST['email'])) {
$_SESSION['ari_error'] .= _("Email is used to notify you on fax success, please re-check it.") . "<br />" ;
}
$args=array("m"=>$m,"form"=>$POST);
if ($_SESSION['ari_error']) return $this->display($args);
// prepare file
$file=$this->getFile($args);
if ($file) {
//creating a call file and write it in /tmp
$callfile = "Channel: Local/".$POST['dest']."@".$this->outbound_route."\n" .
"MaxRetries: 1\n" .
"RetryTime: 60\n" .
"WaitTime: 60\n" .
"Archive: yes\n" .
"Context: ".$this->outboundfax_context."\n" .
"Extension: s\n" .
"Priority: 1\n" .
"Set: FAXFILE=".$file."\n" .
"Set: FAXHEADER=".$POST['faxHeader']."\n" .
"Set: TIMESTAMP=" . date("d/m/y : H:i:s",time()) . "\n" .
"Set: DESTINATION=".$POST['dest']."\n".
"Set: LOCALID=".$POST['localID']."\n" .
"Set: EMAIL=".$POST['email']."\n";
$callfilename = "/tmp/".mt_rand(). ".call";
$f = fopen($callfilename, "w");
fwrite($f, $callfile);
fclose($f);
// move file to spool
rename($callfilename, $this->asterisk_spool_folder . "/" . substr($callfilename,4));
}
}
if ($_SESSION['ari_error']) {
// display errors and form
return $this->display($args);
} else {
return $this->getHeader()."<table width=\"400\" class=\"settings\" border=\"0\" cellpadding=\"0\" cellspacing=\"0\"><tr><td>".
"<p>Your fax sending has been initiated. You should receive an email shortly ".
" when the fax reaches the queue. If you don't receive an email in 10 minutes, ".
" there has been a problem with sending your fax and you should try again.</p></td></tr></table>";
}
}
//*****************************************************************************
function getFile() {
$input_file_orig_name = basename($_FILES['faxFile']['name']);
$ext = substr($input_file_orig_name, strrpos($input_file_orig_name, '.') + 1);
if (!preg_match('/^TIF|PDF$/', strtoupper ($ext))) {
$_SESSION['ari_error'] .= _("Check your file please, either <strong>PDF</strong> or <strong>TIF</strong>") . "<br />" ;
return false;
}
$unique_name = "/tmp/".mt_rand();
if (strtoupper($ext) == "TIF") {
$input_file_tif = $unique_name . ".tif";
if (!move_uploaded_file($_FILES['faxFile']['tmp_name'], $input_file_tif)) {
$_SESSION['ari_error'] .= _("There was an error uploading your TIF file, please try again!")."<br />";
return false;
}
} elseif (strtoupper($ext) == "PDF") {
$input_file = $unique_name . ".pdf";
$input_file_tif = $unique_name . ".tif";
if(!move_uploaded_file($_FILES['faxFile']['tmp_name'], $input_file)) {
$_SESSION['ari_error'] .= _("There was an error uploading the file, please try again!") . "<br />" ;
return false;
} else {
// convert the attached PDF to .tif using ghostsccript ...
$gs_command = "gs -q -dNOPAUSE -dBATCH -dSAFER -sDEVICE=tiffg3 -sOutputFile=${input_file_tif} -f $input_file " ;
$gs_command_output = system($gs_command, $retval);
$doc_convert_output = $gs_command_output;
if ($retval != 0) {
$_SESSION['ari_error'] .= _("There was an error converting your PDF file. Try uploading the file again or with an older version of PDF") . "<br />" ;
return false;
}
}
}
return $input_file_tif;
}
//*****************************************************************************
function saveConfig($vars) {
if (is_array($vars)) {
foreach ($vars as $name => $value) {
setcookie("ari_fax[$name]", $value, time()+365*24*60*60);
}
}
}
//*****************************************************************************
function getConfig() {
return $_COOKIE['ari_fax'];
}
//*****************************************************************************
function getHeader() {
if ($_SESSION['ari_user']['admin_settings']) {
$headerText = _("Send Fax");
} else {
$headerText = sprintf(_("Send Fax for %s (%s)"),$_SESSION['ari_user']['displayname'],$_SESSION['ari_user']['extension']);
}
$display= new Display();
$ret = $display->displayHeaderText($headerText);
$ret .= $display->displayLine();
return $ret;
}
//*****************************************************************************
function getForm($v) {
$ret .= '
<table width="400" class="settings" border="0" cellpadding="0" cellspacing="0"><tr>
<td><p>Please use the form below to input the required information and click on "Send FAX" below.
You will receive a notification about the status of your fax through the email you provide below. </p>
</td>
</tr></table>
'.checkErrorMessage().'
<!-- FORM_START -->
<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
<table class="settings" border="0" cellpadding="0" cellspacing="0">
<tr>
<td><a href="#" class="info">Fax Header:<span>Type the header text you want to appear at the top of your FAX.</span></a></td>
<td><input name="faxHeader" type="text" id="faxHeader" value="'.$v['faxHeader'].'" /></td>
</tr>
<tr>
<td><a href="#" class="info">Local Station Identifier:<span>This field is required. Enter the number that should be used as the sender\'s FAX number.</span></a></td>
<td><input name="localID" type="text" id="localID" value="'.$v['localID'].'" /></td>
</tr>
<tr>
<td><a href="#" class="info">Notification Email Address:<span>This field is required. Enter the email to which FAX notifications would be sent. If you don\'t receive <strong>any</strong> email on this address after sending the FAX, it means we probably don\'t have access to the destination number. For example, if you are trying to send a FAX to Europe when we only have trunks for US/Canada.</span></a></td>
<td><input name="email" type="text" id="email" value="'.$v['email'].'" /></td>
</tr>
<tr>
<td><a href="#" class="info">FAX Destination:<span>This field is required. Destination FAX number. Please do not include any spaces or special characters.</span></a></td>
<td><input name="dest" type="text" id="dest" value="'.$v['dest'].'" /></td>
</tr>
<tr>
<td><a href="#" class="info">Attach file:<span>Filetypes acceptable: <strong>PDF</strong> , <strong>TIF</strong></span></a></td>
<td><input type="file" name="faxFile" id="faxFile" /></td>
</tr>
<tr>
<td>
<input type="submit" name="sendFax" id="sendFax" value="Send FAX" />
<input type="hidden" name="f" value="action" />
<input type="hidden" name="a" value="send" />
</td>
<td> </td>
</tr>
</table>
</form>
<!-- FORM_END -->';
return $ret;
}
function display($args) {
// args
//$m = getArgument($args,'m');
//$a = getArgument($args,'a');
$form = getArgument($args,'form');
$form = (isset($form)) ? $form : $this->getConfig();
// try to set some default values
$displayname = $_SESSION['ari_user']['displayname'];
$exten = $_SESSION['ari_user']['extension'];
$voicemail = $_SESSION['ari_user']['voicemail_email_address'];
if (!$_SESSION['ari_user']['admin_settings']) {
if (!$form['faxHeader']) $form['faxHeader'] = "from ".$displayname. " (". $voicemail.")";
if (!$form['localID']) $form['localID'] = $exten;
if (!$form['email']) $form['email'] = $voicemail;
}
// build page content
$ret = $this->getHeader().$this->getForm($form);
return $ret;
}
} // class
?>