@@ 30-741 (lines=712) @@ | ||
27 | It supports Captcha, HTML Emails, sending emails |
|
28 | conditionally, File atachments and more. |
|
29 | */ |
|
30 | class FGContactForm |
|
31 | { |
|
32 | var $receipients; |
|
33 | var $errors; |
|
34 | var $error_message; |
|
35 | var $name; |
|
36 | var $email; |
|
37 | var $message; |
|
38 | var $from_address; |
|
39 | var $form_random_key; |
|
40 | var $conditional_field; |
|
41 | var $arr_conditional_receipients; |
|
42 | var $fileupload_fields; |
|
43 | var $captcha_handler; |
|
44 | var $mailer; |
|
45 | ||
46 | function FGContactForm() |
|
47 | { |
|
48 | $this->receipients = array(); |
|
49 | $this->errors = array(); |
|
50 | $this->form_random_key = 'HTgsjhartag'; |
|
51 | $this->conditional_field=''; |
|
52 | $this->arr_conditional_receipients=array(); |
|
53 | $this->fileupload_fields=array(); |
|
54 | $this->mailer = new PHPMailer(); |
|
55 | $this->mailer->CharSet = 'utf-8'; |
|
56 | $this->mailer->IsSMTP(); |
|
57 | $this->mailer->Host = elgg_get_plugin_setting('phpmailer_host', 'phpmailer'); // SMTP server |
|
58 | $this->mailer->Port = elgg_get_plugin_setting('ep_phpmailer_port', 'phpmailer'); // SMTP server port |
|
59 | $this->mailer->SMTPSecure = 'tls'; |
|
60 | $this->mailer->SMTPAuth = 'true'; |
|
61 | $this->mailer->Username = elgg_get_plugin_setting('phpmailer_username', 'phpmailer'); |
|
62 | $this->mailer->Password = elgg_get_plugin_setting('phpmailer_password', 'phpmailer'); |
|
63 | } |
|
64 | ||
65 | function EnableCaptcha($captcha_handler) |
|
66 | { |
|
67 | $this->captcha_handler = $captcha_handler; |
|
68 | session_start(); |
|
69 | } |
|
70 | ||
71 | function AddRecipient($email,$name="") |
|
72 | { |
|
73 | $this->mailer->AddAddress($email,$name); |
|
74 | } |
|
75 | ||
76 | function SetFromAddress($from) |
|
77 | { |
|
78 | $this->from_address = $from; |
|
79 | } |
|
80 | function SetFormRandomKey($key) |
|
81 | { |
|
82 | $this->form_random_key = $key; |
|
83 | } |
|
84 | function GetSpamTrapInputName() |
|
85 | { |
|
86 | return 'sp'.md5('KHGdnbvsgst'.$this->GetKey()); |
|
87 | } |
|
88 | function SafeDisplay($value_name) |
|
89 | { |
|
90 | if(empty($_POST[$value_name])) |
|
91 | { |
|
92 | return''; |
|
93 | } |
|
94 | return htmlentities($_POST[$value_name]); |
|
95 | } |
|
96 | function GetFormIDInputName() |
|
97 | { |
|
98 | $rand = md5('TygshRt'.$this->GetKey()); |
|
99 | ||
100 | $rand = substr($rand,0,20); |
|
101 | return 'id'.$rand; |
|
102 | } |
|
103 | ||
104 | ||
105 | function GetFormIDInputValue() |
|
106 | { |
|
107 | return md5('jhgahTsajhg'.$this->GetKey()); |
|
108 | } |
|
109 | ||
110 | function SetConditionalField($field) |
|
111 | { |
|
112 | $this->conditional_field = $field; |
|
113 | } |
|
114 | function AddConditionalReceipent($value,$email) |
|
115 | { |
|
116 | $this->arr_conditional_receipients[$value] = $email; |
|
117 | } |
|
118 | ||
119 | function AddFileUploadField($file_field_name,$accepted_types,$max_size) |
|
120 | { |
|
121 | ||
122 | $this->fileupload_fields[] = |
|
123 | array("name"=>$file_field_name, |
|
124 | "file_types"=>$accepted_types, |
|
125 | "maxsize"=>$max_size); |
|
126 | } |
|
127 | ||
128 | function ProcessForm() |
|
129 | { |
|
130 | if(!isset($_POST['submitted'])) |
|
131 | { |
|
132 | return false; |
|
133 | } |
|
134 | if(!$this->Validate()) |
|
135 | { |
|
136 | // $this->error_message = implode('<br/><br/><br/>',$this->errors); |
|
137 | return false; |
|
138 | } |
|
139 | $this->CollectData(); |
|
140 | ||
141 | $ret = $this->SendFormSubmission(); |
|
142 | ||
143 | return $ret; |
|
144 | } |
|
145 | ||
146 | function RedirectToURL($url) |
|
147 | { |
|
148 | header("Location: $url"); |
|
149 | exit; |
|
150 | } |
|
151 | ||
152 | function GetErrorMessage() |
|
153 | { |
|
154 | return $this->error_message; |
|
155 | } |
|
156 | function GetSelfScript() |
|
157 | { |
|
158 | return htmlentities($_SERVER['PHP_SELF']); |
|
159 | } |
|
160 | ||
161 | function GetName() |
|
162 | { |
|
163 | return $this->name; |
|
164 | } |
|
165 | function GetEmail() |
|
166 | { |
|
167 | return $this->email; |
|
168 | } |
|
169 | function GetMessage() |
|
170 | { |
|
171 | return htmlentities($this->message,ENT_QUOTES,"UTF-8"); |
|
172 | } |
|
173 | ||
174 | /*-------- Private (Internal) Functions -------- */ |
|
175 | ||
176 | ||
177 | function SendFormSubmission() |
|
178 | { |
|
179 | $reason = $_POST['reason']; |
|
180 | $option = explode("$", $_POST['reason']); |
|
181 | $categoryfr = $option[0]; |
|
182 | $categoryen = $option[1]; |
|
183 | ||
184 | $depart = $_POST['depart']; |
|
185 | $reason = $_POST['reason']; |
|
186 | $option = explode("$", $_POST['reason']); |
|
187 | $french = $option[0]; |
|
188 | $english = $option[1]; |
|
189 | if(empty($_POST['subject'])) |
|
190 | { |
|
191 | $subject = $categoryen." - ".$depart. " - $this->name / ".$categoryfr." - ".$depart. " - $this->name"; |
|
192 | }else{ |
|
193 | $subject = "GCconnex - ".$depart. " - $this->name / GCconnex - ".$depart. " - $this->name"; |
|
194 | } |
|
195 | ||
196 | $this->CollectConditionalReceipients(); |
|
197 | $this->mailer->CharSet = 'utf-8'; |
|
198 | $this->mailer->Subject = $subject; |
|
199 | $this->mailer->From = elgg_get_plugin_setting('phpmailer_from_email', 'phpmailer'); |
|
200 | $this->mailer->FromName = elgg_get_plugin_setting('phpmailer_from_name', 'phpmailer'); |
|
201 | $this->mailer->AddCC($this->email); |
|
202 | $message = $this->ComposeFormtoEmail(); |
|
203 | $this->mailer->ConfirmReadingTo = $this->email; |
|
204 | $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message))); |
|
205 | $this->mailer->AltBody = @html_entity_decode($textMsg,ENT_QUOTES,"UTF-8"); |
|
206 | $this->mailer->MsgHTML($message); |
|
207 | $this->AttachFiles(); |
|
208 | ||
209 | if(!$this->mailer->Send()) |
|
210 | { |
|
211 | $this->add_error("Failed sending email!"); |
|
212 | return false; |
|
213 | } |
|
214 | ||
215 | return true; |
|
216 | } |
|
217 | ||
218 | function CollectConditionalReceipients() |
|
219 | { |
|
220 | if(count($this->arr_conditional_receipients)>0 && |
|
221 | !empty($this->conditional_field) && |
|
222 | !empty($_POST[$this->conditional_field])) |
|
223 | { |
|
224 | foreach($this->arr_conditional_receipients as $condn => $rec) |
|
225 | { |
|
226 | if(strcasecmp($condn,$_POST[$this->conditional_field])==0 && |
|
227 | !empty($rec)) |
|
228 | { |
|
229 | $this->AddRecipient($rec); |
|
230 | } |
|
231 | } |
|
232 | } |
|
233 | } |
|
234 | ||
235 | /* |
|
236 | Internal variables, that you donot want to appear in the email |
|
237 | Add those variables in this array. |
|
238 | */ |
|
239 | function IsInternalVariable($varname) |
|
240 | { |
|
241 | $arr_interanl_vars = array('scaptcha', |
|
242 | 'submitted', |
|
243 | $this->GetSpamTrapInputName(), |
|
244 | $this->GetFormIDInputName() |
|
245 | ); |
|
246 | if(in_array($varname,$arr_interanl_vars)) |
|
247 | { |
|
248 | return true; |
|
249 | } |
|
250 | return false; |
|
251 | } |
|
252 | ||
253 | function FormSubmissionToMail() |
|
254 | { |
|
255 | $ret_str=''; |
|
256 | ||
257 | $name = $_POST['name']; |
|
258 | $email = $_POST['email']; |
|
259 | $reason = $_POST['reason']; |
|
260 | $option = explode("$", $_POST['reason']); |
|
261 | $french = $option[0]; |
|
262 | $english = $option[1]; |
|
263 | if(empty($_POST['subject'])) |
|
264 | { |
|
265 | $subject = "$this->name has contacted you about ". $english." / $this->name vous a envoyé un message à propos de ".$french; |
|
266 | }else{ |
|
267 | $subject = $_POST['subject']; |
|
268 | } |
|
269 | ||
270 | $message = $_POST['message']; |
|
271 | ||
272 | $name=htmlentities($name, ENT_QUOTES, "UTF-8"); |
|
273 | $email=htmlentities($email, ENT_QUOTES, "UTF-8"); |
|
274 | $reason=htmlentities($reason, ENT_QUOTES, "UTF-8"); |
|
275 | $subject=htmlentities($subject, ENT_QUOTES, "UTF-8"); |
|
276 | $message=htmlentities($message, ENT_QUOTES, "UTF-8"); |
|
277 | ||
278 | $value = htmlentities($value,ENT_QUOTES,"UTF-8"); |
|
279 | $value = nl2br($value); |
|
280 | $key = ucfirst($key); |
|
281 | $ret_str .= ' |
|
282 | ||
283 | <!-- beginning of email template --> |
|
284 | <div width="100%" bgcolor="#fcfcfc"> |
|
285 | <div> |
|
286 | <div> |
|
287 | ||
288 | <!-- email header --> |
|
289 | <div align="center" width="100%" style="background-color:#f5f5f5; padding:20px 30px 15px 30px; font-family: sans-serif; font-size: 12px; color: #055959"> |
|
290 | Thank you for contacting the GCconnex Help desk. This is a copy of your request.<br/><br/> Merci d\'avoir communiqué avec le bureau de soutien de GCconnex. Ceci est une copie de votre requête. |
|
291 | </div> |
|
292 | ||
293 | ||
294 | <!-- GCconnex banner --> |
|
295 | <div width="100%" style="padding: 0 0 0 10px; color:#ffffff; font-family: sans-serif; font-size: 35px; line-height:38px; font-weight: bold; background-color:#047177;"> |
|
296 | <span style="padding: 0 0 0 3px; font-size: 20px; color: #ffffff; font-family: sans-serif;">GCconnex</span> |
|
297 | </div> |
|
298 | ||
299 | <!-- email divider --> |
|
300 | <div style="height:1px; background:#bdbdbd; border-bottom:1px solid #ffffff"></div> |
|
301 | ||
302 | <!-- english --> |
|
303 | ||
304 | <!-- main content of the notification (ENGLISH) --> |
|
305 | <!-- *optional* email message (DO NOT REPLY) --> |
|
306 | <div width="100%" style="padding:30px 30px 10px 30px; font-size:12px; line-height:22px; font-family:sans-serif;"> |
|
307 | ||
308 | <!-- The French Follows... --> |
|
309 | <span style="font-size:12px; font-weight: normal;"><i>(Le français suit)</i></span><br/> |
|
310 | </div> |
|
311 | ||
312 | <div width="100%" style="padding:30px 30px 30px 30px; color:#153643; font-family:sans-serif; font-size:16px; line-height:22px; "> |
|
313 | <!-- TITLE OF CONTENT --> |
|
314 | <h2 style="padding: 0px 0px 15px 0px"> |
|
315 | <strong> GCconnex Contact Us Form </strong> |
|
316 | </h2> |
|
317 | ||
318 | <!-- BODY OF CONTENT --> |
|
319 | <b>Name:</b> '.$name.'<br/> |
|
320 | <b>Email:</b> '.$email.'<br/> |
|
321 | <b>Reason:</b> '.$english.' <br/> |
|
322 | <b>Subject:</b> '.$subject.'<br/> |
|
323 | <b>Message:</b>'.$message .'<br/> |
|
324 | </div> |
|
325 | ||
326 | <div style="margin-top:15px; padding: 5px; color: #6d6d6d; border-bottom: 1px solid #ddd;"></div> |
|
327 | ||
328 | <!-- french --> |
|
329 | ||
330 | <!-- main content of the notification (FRENCH) --> |
|
331 | <!-- *optional* email message (DO NOT REPLY) --> |
|
332 | <div id="gcc_fr_suit" name="gcc_fr_suit" width="100%" style="padding:30px 30px 10px 30px; font-size:12px; line-height:22px; font-family:sans-serif;"></div> |
|
333 | ||
334 | <div width="100%" style="padding:30px 30px 30px 30px; color:#153643; font-family:sans-serif; font-size:16px; line-height:22px;"> |
|
335 | <!-- TITLE OF CONTENT --> |
|
336 | <h2 style="padding: 0px 0px 15px 0px"> |
|
337 | <strong> Formulaire contactez-nous de GCconnex</strong> |
|
338 | </h2> |
|
339 | ||
340 | <!-- BODY OF CONTENT --> |
|
341 | <b>Nom :</b> '.$name.'<br/> |
|
342 | <b>Courriel :</b> '.$email.'<br/> |
|
343 | <b>Raison :</b> '.$french.'<br/> |
|
344 | <b>Sujet :</b> '.$subject.'<br/> |
|
345 | <b>Message :</b>'.$message.'<br/> |
|
346 | </div> |
|
347 | <div style="margin-top:15px; padding: 5px; color: #6d6d6d;"></div> |
|
348 | ||
349 | <!-- email divider --> |
|
350 | <div style="height:1px; background:#bdbdbd; border-bottom:1px solid #ffffff"></div> |
|
351 | ||
352 | <!-- email footer --> |
|
353 | <div align="center" width="100%" style="background-color:#f5f5f5; padding:20px 30px 15px 30px; font-family: sans-serif; font-size: 16px; color: #055959"> |
|
354 | Please do not reply to this message | Veuillez ne pas répondre à ce message |
|
355 | </div> |
|
356 | ||
357 | </div> |
|
358 | </div> |
|
359 | </div>'; |
|
360 | ||
361 | foreach($this->fileupload_fields as $upload_field) |
|
362 | { |
|
363 | $field_name = $upload_field["name"]; |
|
364 | if(!$this->IsFileUploaded($field_name)) |
|
365 | { |
|
366 | continue; |
|
367 | } |
|
368 | ||
369 | $filename = basename($_FILES[$field_name]['name']); |
|
370 | $ret_str .= "<div class='label'>File upload '$field_name' :</div><div class='value'>$filename </div>\n"; |
|
371 | } |
|
372 | return $ret_str; |
|
373 | } |
|
374 | ||
375 | function ExtraInfoToMail() |
|
376 | { |
|
377 | $ret_str=''; |
|
378 | ||
379 | $ip = $_SERVER['REMOTE_ADDR']; |
|
380 | $ret_str = "<div class='label'>IP address of the submitter:</div><div class='value'>$ip</div>\n"; |
|
381 | ||
382 | return $ret_str; |
|
383 | } |
|
384 | ||
385 | function GetHTMLHeaderPart() |
|
386 | { |
|
387 | $retstr = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'."\n". |
|
388 | '<html><head><title></title><style type="text/css"> |
|
389 | body {margin: 0; padding: 0; min-width: 100%!important;} |
|
390 | img {height: auto;} |
|
391 | .content {width: 100%; max-width: 600px;} |
|
392 | .header {padding: 40px 30px 20px 30px;} |
|
393 | .innerpadding {padding: 30px 30px 30px 30px;} |
|
394 | .borderbottom {border-bottom: 1px solid #f2eeed;} |
|
395 | .subhead {font-size: 15px; color: #ffffff; font-family: sans-serif; } |
|
396 | .h1, .h2, .bodycopy {color: #153643; font-family: sans-serif;} |
|
397 | .h1 {font-size: 33px; line-height: 38px; font-weight: bold;} |
|
398 | .h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;} |
|
399 | .bodycopy {font-size: 16px; line-height: 22px;} |
|
400 | .button {text-align: center; font-size: 18px; font-family: sans-serif; font-weight: bold; padding: 0 30px 0 30px;} |
|
401 | .button a {color: #ffffff; text-decoration: none;} |
|
402 | .footer {padding: 20px 30px 15px 30px;} |
|
403 | .footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;} |
|
404 | .footercopy a {color: #ffffff; text-decoration: underline;} |
|
405 | @media only screen and (max-width: 550px), screen and (max-device-width: 550px) { |
|
406 | body[yahoo] .hide {display: none!important;} |
|
407 | body[yahoo] .buttonwrapper {background-color: transparent!important;} |
|
408 | body[yahoo] .button {padding: 0px!important;} |
|
409 | body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;} |
|
410 | body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;} |
|
411 | } |
|
412 | /*@media only screen and (min-device-width: 601px) { |
|
413 | .content {width: 600px !important;} |
|
414 | .col425 {width: 425px!important;} |
|
415 | .col380 {width: 380px!important;} |
|
416 | }*/ |
|
417 | </style>'. |
|
418 | '<meta http-equiv=Content-Type content="text/html; charset=utf-8">'; |
|
419 | ||
420 | $retstr .= '</head><body yahoo bgcolor="#fcfcfc" style="margin: 0; padding: 0; min-width: 100%!important;">'; |
|
421 | return $retstr; |
|
422 | } |
|
423 | ||
424 | function GetHTMLFooterPart() |
|
425 | { |
|
426 | $retstr ='</body></html>'; |
|
427 | return $retstr ; |
|
428 | } |
|
429 | ||
430 | function ComposeFormtoEmail() |
|
431 | { |
|
432 | $header = $this->GetHTMLHeaderPart(); |
|
433 | $formsubmission = $this->FormSubmissionToMail(); |
|
434 | $footer = $this->GetHTMLFooterPart(); |
|
435 | $message = $header."<p>$formsubmission</p><hr/>$extra_info".$footer; |
|
436 | ||
437 | return $message; |
|
438 | } |
|
439 | ||
440 | function AttachFiles() |
|
441 | { |
|
442 | foreach($this->fileupload_fields as $upld_field) |
|
443 | { |
|
444 | $field_name = $upld_field["name"]; |
|
445 | if(!$this->IsFileUploaded($field_name)) |
|
446 | { |
|
447 | continue; |
|
448 | } |
|
449 | ||
450 | $filename =basename($_FILES[$field_name]['name']); |
|
451 | $this->mailer->AddAttachment($_FILES[$field_name]["tmp_name"],$filename); |
|
452 | } |
|
453 | } |
|
454 | ||
455 | function GetFromAddress() |
|
456 | { |
|
457 | if(!empty($this->from_address)) |
|
458 | { |
|
459 | return $this->from_address; |
|
460 | } |
|
461 | ||
462 | $host = $_SERVER['SERVER_NAME']; |
|
463 | $from ="nobody@$host"; |
|
464 | return $from; |
|
465 | } |
|
466 | ||
467 | function Validate() |
|
468 | { |
|
469 | $ret = true; |
|
470 | $numErr=0; |
|
471 | //security validations |
|
472 | if(empty($_POST[$this->GetFormIDInputName()]) || |
|
473 | $_POST[$this->GetFormIDInputName()] != $this->GetFormIDInputValue() ) |
|
474 | { |
|
475 | $numErr=$numErr+1; |
|
476 | //The proper error is not given intentionally |
|
477 | $this->add_error(); |
|
478 | register_error("Automated submission prevention: case 1 failed"); |
|
479 | $ret = false; |
|
480 | } |
|
481 | ||
482 | //This is a hidden input field. Humans won't fill this field. |
|
483 | if(!empty($_POST[$this->GetSpamTrapInputName()]) ) |
|
484 | { |
|
485 | $numErr=$numErr+1; |
|
486 | //The proper error is not given intentionally |
|
487 | $this->add_error(); |
|
488 | register_error("Automated submission prevention: case 2 failed"); |
|
489 | $ret = false; |
|
490 | } |
|
491 | ||
492 | //select validations |
|
493 | if((($_POST['reason']) =='Select...') || (($_POST['reason']) == "Choisir...")) |
|
494 | { |
|
495 | $numErr=$numErr+1; |
|
496 | $this->add_error(); |
|
497 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errreason'))); |
|
498 | $ret = false; |
|
499 | } |
|
500 | ||
501 | if ($_POST['reason'] == 'Autres$Other') |
|
502 | { |
|
503 | if (empty($_POST['subject'])) |
|
504 | { |
|
505 | $numErr=$numErr+1; |
|
506 | $this->add_error(); |
|
507 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errsubject'))); |
|
508 | $ret = false; |
|
509 | } |
|
510 | } |
|
511 | ||
512 | //name validations |
|
513 | if(empty($_POST['name'])) |
|
514 | { |
|
515 | $numErr=$numErr+1; |
|
516 | $this->add_error(); |
|
517 | //'contactform:Errname' |
|
518 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errname'))); |
|
519 | $ret = false; |
|
520 | } |
|
521 | else |
|
522 | if(strlen($_POST['name'])>75) |
|
523 | { |
|
524 | $numErr=$numErr+1; |
|
525 | $this->add_error(); |
|
526 | //'contactform:Errnamebig' |
|
527 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errnamebig'))); |
|
528 | $ret = false; |
|
529 | } |
|
530 | ||
531 | //email validations |
|
532 | if(empty($_POST['email'])) |
|
533 | { |
|
534 | $numErr=$numErr+1; |
|
535 | $this->add_error(); |
|
536 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Erremail'))); |
|
537 | $ret = false; |
|
538 | } |
|
539 | else |
|
540 | if(strlen($_POST['email'])>100) |
|
541 | { |
|
542 | $numErr=$numErr+1; |
|
543 | $this->add_error(); |
|
544 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Erremailbig'))); |
|
545 | $ret = false; |
|
546 | } |
|
547 | else |
|
548 | if(!$this->validate_email($_POST['email'])) |
|
549 | { |
|
550 | $numErr=$numErr+1; |
|
551 | $this->add_error(); |
|
552 | //'contactform:Erremailvalid' |
|
553 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Erremailvalid'))); |
|
554 | $ret = false; |
|
555 | } |
|
556 | ||
557 | //department validaions |
|
558 | if (elgg_is_active_plugin('gcconnex_theme')) { |
|
559 | if(empty($_POST['depart'])) |
|
560 | { |
|
561 | $numErr=$numErr+1; |
|
562 | $this->add_error(); |
|
563 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errdepart'))); |
|
564 | $ret = false; |
|
565 | } |
|
566 | else |
|
567 | if(strlen($_POST['depart'])>255) |
|
568 | { |
|
569 | $numErr=$numErr+1; |
|
570 | $this->add_error(); |
|
571 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errdepartbig'))); |
|
572 | $ret = false; |
|
573 | } |
|
574 | } |
|
575 | ||
576 | //message validaions |
|
577 | if(empty($_POST['message'])) |
|
578 | { |
|
579 | $numErr=$numErr+1; |
|
580 | $this->add_error(); |
|
581 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errmess'))); |
|
582 | $ret = false; |
|
583 | } |
|
584 | else |
|
585 | if(strlen($_POST['message'])>2048) |
|
586 | { |
|
587 | $numErr=$numErr+1; |
|
588 | $this->add_error(); |
|
589 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errmessbig'))); |
|
590 | $ret = false; |
|
591 | } |
|
592 | ||
593 | //file upload validations |
|
594 | if(!empty($this->fileupload_fields)) |
|
595 | { |
|
596 | $numErr=$numErr+1; |
|
597 | if(!$this->ValidateFileUploads($numErr)) |
|
598 | { |
|
599 | $ret = false; |
|
600 | } |
|
601 | } |
|
602 | return $ret; |
|
603 | } |
|
604 | ||
605 | function ValidateFileType($field_name,$valid_filetypes) |
|
606 | { |
|
607 | $ret=true; |
|
608 | $info = pathinfo($_FILES[$field_name]['name']); |
|
609 | $extn = $info['extension']; |
|
610 | $extn = strtolower($extn); |
|
611 | ||
612 | $arr_valid_filetypes= explode(',',$valid_filetypes); |
|
613 | if(!in_array($extn,$arr_valid_filetypes)) |
|
614 | { |
|
615 | $this->add_error(); |
|
616 | register_error("Valid file types are: $valid_filetypes"); |
|
617 | $ret=false; |
|
618 | } |
|
619 | return $ret; |
|
620 | } |
|
621 | ||
622 | function ValidateFileSize($field_name,$max_size) |
|
623 | { |
|
624 | $size_of_uploaded_file = $_FILES[$field_name]["size"]/1024;//size in KBs |
|
625 | if($size_of_uploaded_file > $max_size) |
|
626 | { |
|
627 | $this->add_error(); |
|
628 | register_error("The file is too big. File size should be less than $max_size KB"); |
|
629 | return false; |
|
630 | } |
|
631 | return true; |
|
632 | } |
|
633 | ||
634 | function IsFileUploaded($field_name) |
|
635 | { |
|
636 | if(empty($_FILES[$field_name]['name'])) |
|
637 | { |
|
638 | return false; |
|
639 | } |
|
640 | if(!is_uploaded_file($_FILES[$field_name]['tmp_name'])) |
|
641 | { |
|
642 | return false; |
|
643 | } |
|
644 | return true; |
|
645 | } |
|
646 | function ValidateFileUploads() |
|
647 | { |
|
648 | $ret=true; |
|
649 | foreach($this->fileupload_fields as $upld_field) |
|
650 | { |
|
651 | $field_name = $upld_field["name"]; |
|
652 | ||
653 | $valid_filetypes = $upld_field["file_types"]; |
|
654 | ||
655 | if(!$this->IsFileUploaded($field_name)) |
|
656 | { |
|
657 | continue; |
|
658 | } |
|
659 | ||
660 | if($_FILES[$field_name]["error"] != 0) |
|
661 | { |
|
662 | $this->add_error("Error in file upload; Error code:".$_FILES[$field_name]["error"]); |
|
663 | $ret=false; |
|
664 | } |
|
665 | ||
666 | if(!empty($valid_filetypes) && |
|
667 | !$this->ValidateFileType($field_name,$valid_filetypes)) |
|
668 | { |
|
669 | $ret=false; |
|
670 | } |
|
671 | ||
672 | if(!empty($upld_field["maxsize"]) && |
|
673 | $upld_field["maxsize"]>0) |
|
674 | { |
|
675 | if(!$this->ValidateFileSize($field_name,$upld_field["maxsize"])) |
|
676 | { |
|
677 | $ret=false; |
|
678 | } |
|
679 | } |
|
680 | } |
|
681 | return $ret; |
|
682 | } |
|
683 | ||
684 | function StripSlashes($str) |
|
685 | { |
|
686 | if(get_magic_quotes_gpc()) |
|
687 | { |
|
688 | $str = stripslashes($str); |
|
689 | } |
|
690 | return $str; |
|
691 | } |
|
692 | /* |
|
693 | Sanitize() function removes any potential threat from the |
|
694 | data submitted. Prevents email injections or any other hacker attempts. |
|
695 | if $remove_nl is true, newline chracters are removed from the input. |
|
696 | */ |
|
697 | function Sanitize($str,$remove_nl=true) |
|
698 | { |
|
699 | $str = $this->StripSlashes($str); |
|
700 | ||
701 | if($remove_nl) |
|
702 | { |
|
703 | $injections = array('/(\n+)/i', |
|
704 | '/(\r+)/i', |
|
705 | '/(\t+)/i', |
|
706 | '/(%0A+)/i', |
|
707 | '/(%0D+)/i', |
|
708 | '/(%08+)/i', |
|
709 | '/(%09+)/i' |
|
710 | ); |
|
711 | $str = preg_replace($injections,'',$str); |
|
712 | } |
|
713 | ||
714 | return $str; |
|
715 | } |
|
716 | ||
717 | /*Collects clean data from the $_POST array and keeps in internal variables.*/ |
|
718 | function CollectData() |
|
719 | { |
|
720 | $this->name = $this->Sanitize($_POST['name']); |
|
721 | $this->email = $this->Sanitize($_POST['email']); |
|
722 | ||
723 | /*newline is OK in the message.*/ |
|
724 | $this->message = $this->StripSlashes($_POST['message']); |
|
725 | } |
|
726 | ||
727 | function add_error($error) |
|
728 | { |
|
729 | array_push($this->errors,$error); |
|
730 | } |
|
731 | function validate_email($email) |
|
732 | { |
|
733 | return eregi("^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$", $email); |
|
734 | } |
|
735 | ||
736 | function GetKey() |
|
737 | { |
|
738 | return $this->form_random_key.$_SERVER['SERVER_NAME'].$_SERVER['REMOTE_ADDR']; |
|
739 | } |
|
740 | ||
741 | } |
|
742 | ||
743 | ?> |
@@ 30-739 (lines=710) @@ | ||
27 | It supports Captcha, HTML Emails, sending emails |
|
28 | conditionally, File atachments and more. |
|
29 | */ |
|
30 | class FGContactForm |
|
31 | { |
|
32 | var $receipients; |
|
33 | var $errors; |
|
34 | var $error_message; |
|
35 | var $name; |
|
36 | var $email; |
|
37 | var $message; |
|
38 | var $from_address; |
|
39 | var $form_random_key; |
|
40 | var $conditional_field; |
|
41 | var $arr_conditional_receipients; |
|
42 | var $fileupload_fields; |
|
43 | var $captcha_handler; |
|
44 | var $mailer; |
|
45 | ||
46 | function FGContactForm() |
|
47 | { |
|
48 | $this->receipients = array(); |
|
49 | $this->errors = array(); |
|
50 | $this->form_random_key = 'HTgsjhartag'; |
|
51 | $this->conditional_field=''; |
|
52 | $this->arr_conditional_receipients=array(); |
|
53 | $this->fileupload_fields=array(); |
|
54 | $this->mailer = new PHPMailer(); |
|
55 | $this->mailer->CharSet = 'utf-8'; |
|
56 | $this->mailer->IsSMTP(); |
|
57 | $this->mailer->Host = elgg_get_plugin_setting('phpmailer_host', 'phpmailer'); // SMTP server |
|
58 | $this->mailer->Port = elgg_get_plugin_setting('ep_phpmailer_port', 'phpmailer'); // SMTP server port |
|
59 | $this->mailer->SMTPSecure = 'tls'; |
|
60 | $this->mailer->SMTPAuth = 'true'; |
|
61 | $this->mailer->Username = elgg_get_plugin_setting('phpmailer_username', 'phpmailer'); |
|
62 | $this->mailer->Password = elgg_get_plugin_setting('phpmailer_password', 'phpmailer'); |
|
63 | } |
|
64 | ||
65 | function EnableCaptcha($captcha_handler) |
|
66 | { |
|
67 | $this->captcha_handler = $captcha_handler; |
|
68 | session_start(); |
|
69 | } |
|
70 | ||
71 | function AddRecipient($email,$name="") |
|
72 | { |
|
73 | $this->mailer->AddAddress($email,$name); |
|
74 | } |
|
75 | ||
76 | function SetFromAddress($from) |
|
77 | { |
|
78 | $this->from_address = $from; |
|
79 | } |
|
80 | function SetFormRandomKey($key) |
|
81 | { |
|
82 | $this->form_random_key = $key; |
|
83 | } |
|
84 | function GetSpamTrapInputName() |
|
85 | { |
|
86 | return 'sp'.md5('KHGdnbvsgst'.$this->GetKey()); |
|
87 | } |
|
88 | function SafeDisplay($value_name) |
|
89 | { |
|
90 | if(empty($_POST[$value_name])) |
|
91 | { |
|
92 | return''; |
|
93 | } |
|
94 | return htmlentities($_POST[$value_name]); |
|
95 | } |
|
96 | function GetFormIDInputName() |
|
97 | { |
|
98 | $rand = md5('TygshRt'.$this->GetKey()); |
|
99 | ||
100 | $rand = substr($rand,0,20); |
|
101 | return 'id'.$rand; |
|
102 | } |
|
103 | ||
104 | ||
105 | function GetFormIDInputValue() |
|
106 | { |
|
107 | return md5('jhgahTsajhg'.$this->GetKey()); |
|
108 | } |
|
109 | ||
110 | function SetConditionalField($field) |
|
111 | { |
|
112 | $this->conditional_field = $field; |
|
113 | } |
|
114 | function AddConditionalReceipent($value,$email) |
|
115 | { |
|
116 | $this->arr_conditional_receipients[$value] = $email; |
|
117 | } |
|
118 | ||
119 | function AddFileUploadField($file_field_name,$accepted_types,$max_size) |
|
120 | { |
|
121 | ||
122 | $this->fileupload_fields[] = |
|
123 | array("name"=>$file_field_name, |
|
124 | "file_types"=>$accepted_types, |
|
125 | "maxsize"=>$max_size); |
|
126 | } |
|
127 | ||
128 | function ProcessForm() |
|
129 | { |
|
130 | if(!isset($_POST['submitted'])) |
|
131 | { |
|
132 | return false; |
|
133 | } |
|
134 | if(!$this->Validate()) |
|
135 | { |
|
136 | // $this->error_message = implode('<br/><br/><br/>',$this->errors); |
|
137 | return false; |
|
138 | } |
|
139 | $this->CollectData(); |
|
140 | ||
141 | $ret = $this->SendFormSubmission(); |
|
142 | ||
143 | return $ret; |
|
144 | } |
|
145 | ||
146 | function RedirectToURL($url) |
|
147 | { |
|
148 | header("Location: $url"); |
|
149 | exit; |
|
150 | } |
|
151 | ||
152 | function GetErrorMessage() |
|
153 | { |
|
154 | return $this->error_message; |
|
155 | } |
|
156 | function GetSelfScript() |
|
157 | { |
|
158 | return htmlentities($_SERVER['PHP_SELF']); |
|
159 | } |
|
160 | ||
161 | function GetName() |
|
162 | { |
|
163 | return $this->name; |
|
164 | } |
|
165 | function GetEmail() |
|
166 | { |
|
167 | return $this->email; |
|
168 | } |
|
169 | function GetMessage() |
|
170 | { |
|
171 | return htmlentities($this->message,ENT_QUOTES,"UTF-8"); |
|
172 | } |
|
173 | ||
174 | /*-------- Private (Internal) Functions -------- */ |
|
175 | ||
176 | ||
177 | function SendFormSubmission() |
|
178 | { |
|
179 | $reason = $_POST['reason']; |
|
180 | $option = explode("$", $_POST['reason']); |
|
181 | $categoryfr = $option[0]; |
|
182 | $categoryen = $option[1]; |
|
183 | ||
184 | $depart = $_POST['depart']; |
|
185 | $reason = $_POST['reason']; |
|
186 | $option = explode("$", $_POST['reason']); |
|
187 | $french = $option[0]; |
|
188 | $english = $option[1]; |
|
189 | if(empty($_POST['subject'])) |
|
190 | { |
|
191 | $subject = $categoryen." - ".$depart. " - $this->name / ".$categoryfr." - ".$depart. " - $this->name"; |
|
192 | }else{ |
|
193 | $subject = "GCconnex - ".$depart. " - $this->name / GCconnex - ".$depart. " - $this->name"; |
|
194 | } |
|
195 | ||
196 | $this->CollectConditionalReceipients(); |
|
197 | $this->mailer->CharSet = 'utf-8'; |
|
198 | $this->mailer->Subject = $subject; |
|
199 | $this->mailer->From = elgg_get_plugin_setting('phpmailer_from_email', 'phpmailer'); |
|
200 | $this->mailer->FromName = elgg_get_plugin_setting('phpmailer_from_name', 'phpmailer'); |
|
201 | $this->mailer->AddCC($this->email); |
|
202 | $message = $this->ComposeFormtoEmail(); |
|
203 | $this->mailer->ConfirmReadingTo = $this->email; |
|
204 | $textMsg = trim(strip_tags(preg_replace('/<(head|title|style|script)[^>]*>.*?<\/\\1>/s','',$message))); |
|
205 | $this->mailer->AltBody = @html_entity_decode($textMsg,ENT_QUOTES,"UTF-8"); |
|
206 | $this->mailer->MsgHTML($message); |
|
207 | $this->AttachFiles(); |
|
208 | ||
209 | if(!$this->mailer->Send()) |
|
210 | { |
|
211 | $this->add_error("Failed sending email!"); |
|
212 | return false; |
|
213 | } |
|
214 | ||
215 | return true; |
|
216 | } |
|
217 | ||
218 | function CollectConditionalReceipients() |
|
219 | { |
|
220 | if(count($this->arr_conditional_receipients)>0 && |
|
221 | !empty($this->conditional_field) && |
|
222 | !empty($_POST[$this->conditional_field])) |
|
223 | { |
|
224 | foreach($this->arr_conditional_receipients as $condn => $rec) |
|
225 | { |
|
226 | if(strcasecmp($condn,$_POST[$this->conditional_field])==0 && |
|
227 | !empty($rec)) |
|
228 | { |
|
229 | $this->AddRecipient($rec); |
|
230 | } |
|
231 | } |
|
232 | } |
|
233 | } |
|
234 | ||
235 | /* |
|
236 | Internal variables, that you donot want to appear in the email |
|
237 | Add those variables in this array. |
|
238 | */ |
|
239 | function IsInternalVariable($varname) |
|
240 | { |
|
241 | $arr_interanl_vars = array('scaptcha', |
|
242 | 'submitted', |
|
243 | $this->GetSpamTrapInputName(), |
|
244 | $this->GetFormIDInputName() |
|
245 | ); |
|
246 | if(in_array($varname,$arr_interanl_vars)) |
|
247 | { |
|
248 | return true; |
|
249 | } |
|
250 | return false; |
|
251 | } |
|
252 | ||
253 | function FormSubmissionToMail() |
|
254 | { |
|
255 | $ret_str=''; |
|
256 | ||
257 | $name = $_POST['name']; |
|
258 | $email = $_POST['email']; |
|
259 | $reason = $_POST['reason']; |
|
260 | $option = explode("$", $_POST['reason']); |
|
261 | $french = $option[0]; |
|
262 | $english = $option[1]; |
|
263 | if(empty($_POST['subject'])) |
|
264 | { |
|
265 | $subject = "$this->name has contacted you about ". $english." / $this->name vous a envoyé un message à propos de ".$french; |
|
266 | }else{ |
|
267 | $subject = $_POST['subject']; |
|
268 | } |
|
269 | ||
270 | $message = $_POST['message']; |
|
271 | ||
272 | $name=htmlentities($name, ENT_QUOTES, "UTF-8"); |
|
273 | $email=htmlentities($email, ENT_QUOTES, "UTF-8"); |
|
274 | $reason=htmlentities($reason, ENT_QUOTES, "UTF-8"); |
|
275 | $subject=htmlentities($subject, ENT_QUOTES, "UTF-8"); |
|
276 | $message=htmlentities($message, ENT_QUOTES, "UTF-8"); |
|
277 | ||
278 | $value = htmlentities($value,ENT_QUOTES,"UTF-8"); |
|
279 | $value = nl2br($value); |
|
280 | $key = ucfirst($key); |
|
281 | $ret_str .= ' |
|
282 | ||
283 | <!-- beginning of email template --> |
|
284 | <div width="100%" bgcolor="#fcfcfc"> |
|
285 | <div> |
|
286 | <div> |
|
287 | ||
288 | <!-- email header --> |
|
289 | <div align="center" width="100%" style="background-color:#f5f5f5; padding:20px 30px 15px 30px; font-family: sans-serif; font-size: 12px; color: #46246A"> |
|
290 | Thank you for contacting the GCconnex Help desk. This is a copy of your request.<br/><br/> Merci d\'avoir communiqué avec le bureau de soutien de GCconnex. Ceci est une copie de votre requête. |
|
291 | </div> |
|
292 | ||
293 | ||
294 | <!-- GCcollab banner --> |
|
295 | <div width="100%" style="padding: 0 0 0 10px; color:#ffffff; font-family: sans-serif; font-size: 35px; line-height:38px; font-weight: bold; background-color:#047177;"> |
|
296 | <span style="padding: 0 0 0 3px; font-size: 20px; color: #ffffff; font-family: sans-serif;">GCcollab</span> |
|
297 | </div> |
|
298 | ||
299 | <!-- email divider --> |
|
300 | <div style="height:1px; background:#bdbdbd; border-bottom:1px solid #ffffff"></div> |
|
301 | ||
302 | <!-- english --> |
|
303 | ||
304 | <!-- main content of the notification (ENGLISH) --> |
|
305 | <!-- *optional* email message (DO NOT REPLY) --> |
|
306 | <div width="100%" style="padding:30px 30px 10px 30px; font-size:12px; line-height:22px; font-family:sans-serif;"> |
|
307 | ||
308 | <!-- The French Follows... --> |
|
309 | <span style="font-size:12px; font-weight: normal;"><i>(Le français suit)</i></span><br/> |
|
310 | </div> |
|
311 | ||
312 | <div width="100%" style="padding:30px 30px 30px 30px; color:#153643; font-family:sans-serif; font-size:16px; line-height:22px; "> |
|
313 | <!-- TITLE OF CONTENT --> |
|
314 | <h2 style="padding: 0px 0px 15px 0px"> |
|
315 | <strong> GCconnex Contact Us Form </strong> |
|
316 | </h2> |
|
317 | ||
318 | <!-- BODY OF CONTENT --> |
|
319 | <b>Name:</b> '.$name.'<br/> |
|
320 | <b>Email:</b> '.$email.'<br/> |
|
321 | <b>Reason:</b> '.$english.' <br/> |
|
322 | <b>Subject:</b> '.$subject.'<br/> |
|
323 | <b>Message:</b>'.$message .'<br/> |
|
324 | </div> |
|
325 | ||
326 | <div style="margin-top:15px; padding: 5px; color: #6d6d6d; border-bottom: 1px solid #ddd;"></div> |
|
327 | ||
328 | <!-- french --> |
|
329 | ||
330 | <!-- main content of the notification (FRENCH) --> |
|
331 | <!-- *optional* email message (DO NOT REPLY) --> |
|
332 | <div id="gcc_fr_suit" name="gcc_fr_suit" width="100%" style="padding:30px 30px 10px 30px; font-size:12px; line-height:22px; font-family:sans-serif;"></div> |
|
333 | ||
334 | <div width="100%" style="padding:30px 30px 30px 30px; color:#153643; font-family:sans-serif; font-size:16px; line-height:22px;"> |
|
335 | <!-- TITLE OF CONTENT --> |
|
336 | <h2 style="padding: 0px 0px 15px 0px"> |
|
337 | <strong> Formulaire contactez-nous de GCconnex</strong> |
|
338 | </h2> |
|
339 | ||
340 | <!-- BODY OF CONTENT --> |
|
341 | <b>Nom :</b> '.$name.'<br/> |
|
342 | <b>Courriel :</b> '.$email.'<br/> |
|
343 | <b>Raison :</b> '.$french.'<br/> |
|
344 | <b>Sujet :</b> '.$subject.'<br/> |
|
345 | <b>Message :</b>'.$message.'<br/> |
|
346 | </div> |
|
347 | <div style="margin-top:15px; padding: 5px; color: #6d6d6d;"></div> |
|
348 | ||
349 | <!-- email divider --> |
|
350 | <div style="height:1px; background:#bdbdbd; border-bottom:1px solid #ffffff"></div> |
|
351 | ||
352 | <!-- email footer --> |
|
353 | <div align="center" width="100%" style="background-color:#f5f5f5; padding:20px 30px 15px 30px; font-family: sans-serif; font-size: 16px; color: #46246A"> |
|
354 | Please do not reply to this message | Veuillez ne pas répondre à ce message |
|
355 | </div> |
|
356 | ||
357 | </div> |
|
358 | </div> |
|
359 | </div>'; |
|
360 | ||
361 | foreach($this->fileupload_fields as $upload_field) |
|
362 | { |
|
363 | $field_name = $upload_field["name"]; |
|
364 | if(!$this->IsFileUploaded($field_name)) |
|
365 | { |
|
366 | continue; |
|
367 | } |
|
368 | ||
369 | $filename = basename($_FILES[$field_name]['name']); |
|
370 | $ret_str .= "<div class='label'>File upload '$field_name' :</div><div class='value'>$filename </div>\n"; |
|
371 | } |
|
372 | return $ret_str; |
|
373 | } |
|
374 | ||
375 | function ExtraInfoToMail() |
|
376 | { |
|
377 | $ret_str=''; |
|
378 | ||
379 | $ip = $_SERVER['REMOTE_ADDR']; |
|
380 | $ret_str = "<div class='label'>IP address of the submitter:</div><div class='value'>$ip</div>\n"; |
|
381 | ||
382 | return $ret_str; |
|
383 | } |
|
384 | ||
385 | function GetHTMLHeaderPart() |
|
386 | { |
|
387 | $retstr = '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">'."\n". |
|
388 | '<html><head><title></title><style type="text/css"> |
|
389 | body {margin: 0; padding: 0; min-width: 100%!important;} |
|
390 | img {height: auto;} |
|
391 | .content {width: 100%; max-width: 600px;} |
|
392 | .header {padding: 40px 30px 20px 30px;} |
|
393 | .innerpadding {padding: 30px 30px 30px 30px;} |
|
394 | .borderbottom {border-bottom: 1px solid #f2eeed;} |
|
395 | .subhead {font-size: 15px; color: #ffffff; font-family: sans-serif; } |
|
396 | .h1, .h2, .bodycopy {color: #153643; font-family: sans-serif;} |
|
397 | .h1 {font-size: 33px; line-height: 38px; font-weight: bold;} |
|
398 | .h2 {padding: 0 0 15px 0; font-size: 24px; line-height: 28px; font-weight: bold;} |
|
399 | .bodycopy {font-size: 16px; line-height: 22px;} |
|
400 | .button {text-align: center; font-size: 18px; font-family: sans-serif; font-weight: bold; padding: 0 30px 0 30px;} |
|
401 | .button a {color: #ffffff; text-decoration: none;} |
|
402 | .footer {padding: 20px 30px 15px 30px;} |
|
403 | .footercopy {font-family: sans-serif; font-size: 14px; color: #ffffff;} |
|
404 | .footercopy a {color: #ffffff; text-decoration: underline;} |
|
405 | @media only screen and (max-width: 550px), screen and (max-device-width: 550px) { |
|
406 | body[yahoo] .hide {display: none!important;} |
|
407 | body[yahoo] .buttonwrapper {background-color: transparent!important;} |
|
408 | body[yahoo] .button {padding: 0px!important;} |
|
409 | body[yahoo] .button a {background-color: #e05443; padding: 15px 15px 13px!important;} |
|
410 | body[yahoo] .unsubscribe {display: block; margin-top: 20px; padding: 10px 50px; background: #2f3942; border-radius: 5px; text-decoration: none!important; font-weight: bold;} |
|
411 | } |
|
412 | /*@media only screen and (min-device-width: 601px) { |
|
413 | .content {width: 600px !important;} |
|
414 | .col425 {width: 425px!important;} |
|
415 | .col380 {width: 380px!important;} |
|
416 | }*/ |
|
417 | </style>'. |
|
418 | '<meta http-equiv=Content-Type content="text/html; charset=utf-8">'; |
|
419 | ||
420 | $retstr .= '</head><body yahoo bgcolor="#fcfcfc" style="margin: 0; padding: 0; min-width: 100%!important;">'; |
|
421 | return $retstr; |
|
422 | } |
|
423 | ||
424 | function GetHTMLFooterPart() |
|
425 | { |
|
426 | $retstr ='</body></html>'; |
|
427 | return $retstr ; |
|
428 | } |
|
429 | ||
430 | function ComposeFormtoEmail() |
|
431 | { |
|
432 | $header = $this->GetHTMLHeaderPart(); |
|
433 | $formsubmission = $this->FormSubmissionToMail(); |
|
434 | $footer = $this->GetHTMLFooterPart(); |
|
435 | $message = $header."<p>$formsubmission</p><hr/>$extra_info".$footer; |
|
436 | ||
437 | return $message; |
|
438 | } |
|
439 | ||
440 | function AttachFiles() |
|
441 | { |
|
442 | foreach($this->fileupload_fields as $upld_field) |
|
443 | { |
|
444 | $field_name = $upld_field["name"]; |
|
445 | if(!$this->IsFileUploaded($field_name)) |
|
446 | { |
|
447 | continue; |
|
448 | } |
|
449 | ||
450 | $filename =basename($_FILES[$field_name]['name']); |
|
451 | $this->mailer->AddAttachment($_FILES[$field_name]["tmp_name"],$filename); |
|
452 | } |
|
453 | } |
|
454 | ||
455 | function GetFromAddress() |
|
456 | { |
|
457 | if(!empty($this->from_address)) |
|
458 | { |
|
459 | return $this->from_address; |
|
460 | } |
|
461 | ||
462 | $host = $_SERVER['SERVER_NAME']; |
|
463 | $from ="nobody@$host"; |
|
464 | return $from; |
|
465 | } |
|
466 | ||
467 | function Validate() |
|
468 | { |
|
469 | $ret = true; |
|
470 | $numErr=0; |
|
471 | //security validations |
|
472 | if(empty($_POST[$this->GetFormIDInputName()]) || |
|
473 | $_POST[$this->GetFormIDInputName()] != $this->GetFormIDInputValue() ) |
|
474 | { |
|
475 | $numErr=$numErr+1; |
|
476 | //The proper error is not given intentionally |
|
477 | $this->add_error(); |
|
478 | register_error("Automated submission prevention: case 1 failed"); |
|
479 | $ret = false; |
|
480 | } |
|
481 | ||
482 | //This is a hidden input field. Humans won't fill this field. |
|
483 | if(!empty($_POST[$this->GetSpamTrapInputName()]) ) |
|
484 | { |
|
485 | $numErr=$numErr+1; |
|
486 | //The proper error is not given intentionally |
|
487 | $this->add_error(); |
|
488 | register_error("Automated submission prevention: case 2 failed"); |
|
489 | $ret = false; |
|
490 | } |
|
491 | ||
492 | //select validations |
|
493 | if((($_POST['reason']) =='Select...') || (($_POST['reason']) == "Choisir...")) |
|
494 | { |
|
495 | $numErr=$numErr+1; |
|
496 | $this->add_error(); |
|
497 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errreason'))); |
|
498 | $ret = false; |
|
499 | } |
|
500 | ||
501 | if ($_POST['reason'] == 'Autres$Other') |
|
502 | { |
|
503 | if (empty($_POST['subject'])) |
|
504 | { |
|
505 | $numErr=$numErr+1; |
|
506 | $this->add_error(); |
|
507 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errsubject'))); |
|
508 | $ret = false; |
|
509 | } |
|
510 | } |
|
511 | ||
512 | //name validations |
|
513 | if(empty($_POST['name'])) |
|
514 | { |
|
515 | $numErr=$numErr+1; |
|
516 | $this->add_error(); |
|
517 | //'contactform:Errname' |
|
518 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errname'))); |
|
519 | $ret = false; |
|
520 | } |
|
521 | else |
|
522 | if(strlen($_POST['name'])>75) |
|
523 | { |
|
524 | $numErr=$numErr+1; |
|
525 | $this->add_error(); |
|
526 | //'contactform:Errnamebig' |
|
527 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errnamebig'))); |
|
528 | $ret = false; |
|
529 | } |
|
530 | ||
531 | //email validations |
|
532 | if(empty($_POST['email'])) |
|
533 | { |
|
534 | $numErr=$numErr+1; |
|
535 | $this->add_error(); |
|
536 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Erremail'))); |
|
537 | $ret = false; |
|
538 | } |
|
539 | else |
|
540 | if(strlen($_POST['email'])>100) |
|
541 | { |
|
542 | $numErr=$numErr+1; |
|
543 | $this->add_error(); |
|
544 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Erremailbig'))); |
|
545 | $ret = false; |
|
546 | } |
|
547 | else |
|
548 | if(!$this->validate_email($_POST['email'])) |
|
549 | { |
|
550 | $numErr=$numErr+1; |
|
551 | $this->add_error(); |
|
552 | //'contactform:Erremailvalid' |
|
553 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Erremailvalid'))); |
|
554 | $ret = false; |
|
555 | } |
|
556 | ||
557 | //department validaions |
|
558 | if(empty($_POST['depart'])) |
|
559 | { |
|
560 | $numErr=$numErr+1; |
|
561 | $this->add_error(); |
|
562 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errdepart'))); |
|
563 | $ret = false; |
|
564 | } |
|
565 | else |
|
566 | if(strlen($_POST['depart'])>255) |
|
567 | { |
|
568 | $numErr=$numErr+1; |
|
569 | $this->add_error(); |
|
570 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errdepartbig'))); |
|
571 | $ret = false; |
|
572 | } |
|
573 | ||
574 | //message validaions |
|
575 | if(empty($_POST['message'])) |
|
576 | { |
|
577 | $numErr=$numErr+1; |
|
578 | $this->add_error(); |
|
579 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errmess'))); |
|
580 | $ret = false; |
|
581 | } |
|
582 | else |
|
583 | if(strlen($_POST['message'])>2048) |
|
584 | { |
|
585 | $numErr=$numErr+1; |
|
586 | $this->add_error(); |
|
587 | register_error(str_replace('[#]',$numErr,elgg_echo('contactform:Errmessbig'))); |
|
588 | $ret = false; |
|
589 | } |
|
590 | ||
591 | //file upload validations |
|
592 | if(!empty($this->fileupload_fields)) |
|
593 | { |
|
594 | $numErr=$numErr+1; |
|
595 | if(!$this->ValidateFileUploads($numErr)) |
|
596 | { |
|
597 | $ret = false; |
|
598 | } |
|
599 | } |
|
600 | return $ret; |
|
601 | } |
|
602 | ||
603 | function ValidateFileType($field_name,$valid_filetypes) |
|
604 | { |
|
605 | $ret=true; |
|
606 | $info = pathinfo($_FILES[$field_name]['name']); |
|
607 | $extn = $info['extension']; |
|
608 | $extn = strtolower($extn); |
|
609 | ||
610 | $arr_valid_filetypes= explode(',',$valid_filetypes); |
|
611 | if(!in_array($extn,$arr_valid_filetypes)) |
|
612 | { |
|
613 | $this->add_error(); |
|
614 | register_error("Valid file types are: $valid_filetypes"); |
|
615 | $ret=false; |
|
616 | } |
|
617 | return $ret; |
|
618 | } |
|
619 | ||
620 | function ValidateFileSize($field_name,$max_size) |
|
621 | { |
|
622 | $size_of_uploaded_file = $_FILES[$field_name]["size"]/1024;//size in KBs |
|
623 | if($size_of_uploaded_file > $max_size) |
|
624 | { |
|
625 | $this->add_error(); |
|
626 | register_error("The file is too big. File size should be less than $max_size KB"); |
|
627 | return false; |
|
628 | } |
|
629 | return true; |
|
630 | } |
|
631 | ||
632 | function IsFileUploaded($field_name) |
|
633 | { |
|
634 | if(empty($_FILES[$field_name]['name'])) |
|
635 | { |
|
636 | return false; |
|
637 | } |
|
638 | if(!is_uploaded_file($_FILES[$field_name]['tmp_name'])) |
|
639 | { |
|
640 | return false; |
|
641 | } |
|
642 | return true; |
|
643 | } |
|
644 | function ValidateFileUploads() |
|
645 | { |
|
646 | $ret=true; |
|
647 | foreach($this->fileupload_fields as $upld_field) |
|
648 | { |
|
649 | $field_name = $upld_field["name"]; |
|
650 | ||
651 | $valid_filetypes = $upld_field["file_types"]; |
|
652 | ||
653 | if(!$this->IsFileUploaded($field_name)) |
|
654 | { |
|
655 | continue; |
|
656 | } |
|
657 | ||
658 | if($_FILES[$field_name]["error"] != 0) |
|
659 | { |
|
660 | $this->add_error("Error in file upload; Error code:".$_FILES[$field_name]["error"]); |
|
661 | $ret=false; |
|
662 | } |
|
663 | ||
664 | if(!empty($valid_filetypes) && |
|
665 | !$this->ValidateFileType($field_name,$valid_filetypes)) |
|
666 | { |
|
667 | $ret=false; |
|
668 | } |
|
669 | ||
670 | if(!empty($upld_field["maxsize"]) && |
|
671 | $upld_field["maxsize"]>0) |
|
672 | { |
|
673 | if(!$this->ValidateFileSize($field_name,$upld_field["maxsize"])) |
|
674 | { |
|
675 | $ret=false; |
|
676 | } |
|
677 | } |
|
678 | } |
|
679 | return $ret; |
|
680 | } |
|
681 | ||
682 | function StripSlashes($str) |
|
683 | { |
|
684 | if(get_magic_quotes_gpc()) |
|
685 | { |
|
686 | $str = stripslashes($str); |
|
687 | } |
|
688 | return $str; |
|
689 | } |
|
690 | /* |
|
691 | Sanitize() function removes any potential threat from the |
|
692 | data submitted. Prevents email injections or any other hacker attempts. |
|
693 | if $remove_nl is true, newline chracters are removed from the input. |
|
694 | */ |
|
695 | function Sanitize($str,$remove_nl=true) |
|
696 | { |
|
697 | $str = $this->StripSlashes($str); |
|
698 | ||
699 | if($remove_nl) |
|
700 | { |
|
701 | $injections = array('/(\n+)/i', |
|
702 | '/(\r+)/i', |
|
703 | '/(\t+)/i', |
|
704 | '/(%0A+)/i', |
|
705 | '/(%0D+)/i', |
|
706 | '/(%08+)/i', |
|
707 | '/(%09+)/i' |
|
708 | ); |
|
709 | $str = preg_replace($injections,'',$str); |
|
710 | } |
|
711 | ||
712 | return $str; |
|
713 | } |
|
714 | ||
715 | /*Collects clean data from the $_POST array and keeps in internal variables.*/ |
|
716 | function CollectData() |
|
717 | { |
|
718 | $this->name = $this->Sanitize($_POST['name']); |
|
719 | $this->email = $this->Sanitize($_POST['email']); |
|
720 | ||
721 | /*newline is OK in the message.*/ |
|
722 | $this->message = $this->StripSlashes($_POST['message']); |
|
723 | } |
|
724 | ||
725 | function add_error($error) |
|
726 | { |
|
727 | array_push($this->errors,$error); |
|
728 | } |
|
729 | function validate_email($email) |
|
730 | { |
|
731 | return eregi("^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$", $email); |
|
732 | } |
|
733 | ||
734 | function GetKey() |
|
735 | { |
|
736 | return $this->form_random_key.$_SERVER['SERVER_NAME'].$_SERVER['REMOTE_ADDR']; |
|
737 | } |
|
738 | ||
739 | } |
|
740 | ||
741 | ?> |