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: 289: 290: 291: 292: 293: 294: 295: 296: 297: 298: 299: 300: 301: 302: 303: 304: 305: 306: 307: 308: 309: 310: 311: 312: 313: 314: 315: 316: 317: 318: 319: 320: 321: 322: 323: 324: 325: 326: 327: 328: 329: 330: 331: 332: 333: 334: 335: 336: 337: 338: 339: 340: 341: 342: 343: 344: 345: 346: 347: 348: 349: 350: 351: 352: 353: 354: 355: 356: 357: 358: 359: 360: 361: 362: 363: 364: 365: 366: 367: 368: 369: 370: 371: 372: 373: 374: 375: 376: 377: 378: 379: 380: 381: 382: 383: 384: 385: 386: 387: 388: 389: 390: 391: 392: 393: 394: 395: 396: 397: 398: 399: 400: 401: 402: 403: 404: 405: 406: 407: 408: 409: 410: 411: 412: 413: 414: 415: 416: 417: 418: 419: 420: 421: 422: 423: 424: 425: 426: 427: 428: 429: 430: 431: 432: 433: 434: 435: 436: 437: 438: 439: 440: 441: 442: 443: 444: 445: 446: 447: 448: 449: 450: 451: 452: 453: 454: 455: 456: 457: 458: 459: 460: 461: 462: 463: 464: 465: 466: 467: 468: 469: 470: 471: 472: 473: 474: 475: 476: 477: 478: 479: 480: 481: 482: 483: 484: 485: 486: 487: 488: 489: 490: 491: 492: 493: 494: 495: 496: 497: 498: 499: 500: 501: 502: 503: 504: 505: 506: 507: 508: 509: 510: 511: 512: 513: 514: 515: 516: 517: 518: 519: 520: 521: 522: 523: 524: 525: 526: 527: 528: 529: 530: 531: 532: 533: 534: 535: 536: 537: 538: 539: 540: 541: 542: 543: 544: 545: 546: 547: 548: 549: 550: 551: 552: 553: 554: 555: 556: 557: 558: 559: 560: 561: 562: 563: 564: 565: 566: 567: 568: 569: 570: 571: 572: 573: 574: 575: 576:
<?php
$plugin_is_filter = 5 | FEATURE_PLUGIN;
$plugin_description = gettext("Prints an e-mail contact so that visitors may e-mail the site administrator.");
$plugin_author = "Malte Müller (acrylian), Stephen Billard (sbillard)";
$plugin_category = gettext('Mail');
$option_interface = 'contactformOptions';
$_zp_conf_vars['special_pages']['contact'] = array('define' => '_CONTACT_', 'rewrite' => getOption('contactform_rewrite'), 'option' => 'contactform_rewrite', 'default' => '_PAGE_/contact');
$_zp_conf_vars['special_pages'][] = array('definition' => '%CONTACT%', 'rewrite' => '_CONTACT_');
$_zp_conf_vars['special_pages'][] = array('define' => false, 'rewrite' => '%CONTACT%', 'rule' => '^%REWRITE%/*$ index.php?p=contact [L,QSA]');
zp_register_filter('content_macro', 'getContactFormMacros');
class contactformOptions {
function __construct() {
global $_zp_authority;
if (OFFSET_PATH == 2 && !getOption('contactform_mailaddress')) {
purgeOption('contactform_mailaddress');
}
setOptionDefault('contactform_rewrite', '_PAGE_/contact');
gettext($str = '<p>Fields with <strong>*</strong> are required. HTML or any other code is not allowed.</p>');
setOptionDefault('contactform_introtext', getAllTranslations($str));
gettext($str = '<p>Please confirm that you really want to send this email. Thanks.</p>');
setOptionDefault('contactform_confirmtext', getAllTranslations($str));
gettext($str = '<p>Thanks for your message.</p>');
setOptionDefault('contactform_thankstext', getAllTranslations($str));
gettext($str = 'Send another message.');
setOptionDefault('contactform_newmessagelink', getAllTranslations($str));
setOptionDefault('contactform_title', "show");
setOptionDefault('contactform_name', "required");
setOptionDefault('contactform_company', "show");
setOptionDefault('contactform_street', "show");
setOptionDefault('contactform_city', "show");
setOptionDefault('contactform_state', "show");
setOptionDefault('contactform_postal', "show");
setOptionDefault('contactform_country', "show");
setOptionDefault('contactform_email', "required");
setOptionDefault('contactform_website', "show");
setOptionDefault('contactform_phone', "show");
setOptionDefault('contactform_captcha', 0);
setOptionDefault('contactform_confirm', 1);
setOptionDefault('contactform_sendcopy', 0);
gettext($str = '<p>A copy of your e-mail will automatically be sent to the address you provided for your own records.</p>');
setOptionDefault('contactform_sendcopy_text', getAllTranslations($str));
$mailings = $_zp_authority->getAdminEmail();
$email_list = '';
foreach ($mailings as $email) {
$email_list .= ';' . $email;
}
if ($email_list) {
setOptionDefault('contactform_mailaddress', substr($email_list, 1));
}
setOptionDefault('contactform_dataconfirmation', 0);
}
function getOptionsSupported() {
global $_zp_captcha;
$mailinglist = explode(';', getOption("contactform_mailaddress"));
array_walk($mailinglist, 'contactformOptions::trim_value');
setOption('contactform_mailaddress', implode(';', $mailinglist));
$list = array(gettext("required") => "required", gettext("show") => "show", gettext("omitted") => "omitted");
$mailfieldinstruction = gettext("Set if the <code>%s</code> field should be required, just shown or omitted");
$options = array(
gettext('Intro text') => array(
'key' => 'contactform_introtext',
'type' => OPTION_TYPE_TEXTAREA,
'order' => 13,
'desc' => gettext("The intro text for your contact form")),
gettext('Confirm text') => array(
'key' => 'contactform_confirmtext',
'type' => OPTION_TYPE_TEXTAREA,
'order' => 14,
'desc' => gettext("The text that asks the visitor to confirm that he really wants to send the message.")),
gettext('Thanks text') => array(
'key' => 'contactform_thankstext',
'type' => OPTION_TYPE_TEXTAREA,
'order' => 15,
'desc' => gettext("The text that is shown after a message has been confirmed and sent.")),
gettext('New message link text') => array(
'key' => 'contactform_newmessagelink',
'type' => OPTION_TYPE_TEXTAREA,
'order' => 16,
'desc' => gettext("The text for the link after the thanks text to return to the contact page to send another message.")),
gettext('Require confirmation') => array(
'key' => 'contactform_confirm',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 0.1,
'desc' => gettext("If checked, a confirmation form will be presented before sending the contact message.")),
gettext('Send copy') => array(
'key' => 'contactform_sendcopy',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 0.3,
'desc' => gettext("If checked, a copy of the message will be sent to the address provided. <p class='notebox'><strong>Caution: </strong> If you check this option it is strongly recommend to use Captcha and the confirmation option. Be aware that someone could misuse the e-mail address entered for spamming with this form and that in some countries’ jurisdictions(e.g. most European countries) you may be made responsible for this then!</p>")),
gettext('Send copy note text') => array(
'key' => 'contactform_sendcopy_text',
'type' => OPTION_TYPE_TEXTAREA,
'order' => 0.2,
'desc' => gettext("The text for the note about sending a copy to the address provided in case that option is set.")),
gettext('Contact recipients') => array(
'key' => 'contactform_mailaddress',
'type' => OPTION_TYPE_TEXTBOX,
'order' => 17,
'desc' => gettext("The e-mail address the messages should be sent to. Enter one or more address separated by semicolons.")),
gettext('Title') => array(
'key' => 'contactform_title',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 1,
'desc' => sprintf($mailfieldinstruction, gettext("Title"))),
gettext('Name') => array(
'key' => 'contactform_name',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 2,
'desc' => sprintf($mailfieldinstruction, gettext("Name"))),
gettext('Company') => array(
'key' => 'contactform_company',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 3,
'desc' => sprintf($mailfieldinstruction, gettext("Company"))),
gettext('Street') => array(
'key' => 'contactform_street',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 4,
'desc' => sprintf($mailfieldinstruction, gettext("Street"))),
gettext('City') => array(
'key' => 'contactform_city',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 5,
'desc' => sprintf($mailfieldinstruction, gettext("City"))),
gettext('State') => array(
'key' => 'contactform_state',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 5.1,
'desc' => sprintf($mailfieldinstruction, gettext("State"))),
gettext('Postal code') => array(
'key' => 'contactform_postal',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 5.2,
'desc' => sprintf($mailfieldinstruction, gettext("Postal code"))),
gettext('Country') => array(
'key' => 'contactform_country',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 6,
'desc' => sprintf($mailfieldinstruction, gettext("Country"))),
gettext('E-mail') => array(
'key' => 'contactform_email',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 7,
'desc' => sprintf($mailfieldinstruction, gettext("E-mail"))),
gettext('Website') => array(
'key' => 'contactform_website',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 8,
'desc' => sprintf($mailfieldinstruction, gettext("Website"))),
gettext('CAPTCHA') => array(
'key' => 'contactform_captcha',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 9,
'desc' => ($_zp_captcha->name) ? gettext('If checked, the form will include a Captcha verification.') : '<span class="notebox">' . gettext('No captcha handler is enabled.') . '</span>'),
gettext('Phone') => array(
'key' => 'contactform_phone',
'type' => OPTION_TYPE_RADIO,
'buttons' => $list,
'order' => 10,
'desc' => sprintf($mailfieldinstruction, gettext("Phone number"))),
gettext('Data usage confirmation') => array(
'key' => 'contactform_dataconfirmation',
'type' => OPTION_TYPE_CHECKBOX,
'order' => 11,
'desc' => gettext('If checked a mandatory checkbox is added for users to confirm about data storage and handling by your site. This is recommend to comply with the European GDPR.'))
);
return $options;
}
static function trim_value(&$value) {
$value = trim($value);
}
}
function getField($field, $level = 3) {
if (isset($_POST[$field])) {
return sanitize($_POST[$field], $level);
} else {
return '';
}
}
function printContactForm($subject_override = '') {
global $_zp_UTF8, $_zp_captcha, $_processing_post, $_zp_current_admin_obj;
$error = array();
$error_dataconfirmation = null;
if (isset($_POST['sendmail'])) {
$mailcontent = array();
$mailcontent['title'] = getField('title');
$mailcontent['name'] = getField('name');
$mailcontent['honeypot'] = getField('username');
$mailcontent['company'] = getField('company');
$mailcontent['street'] = getField('street');
$mailcontent['city'] = getField('city');
$mailcontent['state'] = getField('state');
$mailcontent['postal'] = getField('postal');
$mailcontent['country'] = getField('country');
$mailcontent['email'] = getField('email');
$mailcontent['website'] = getField('website');
$mailcontent['phone'] = getField('phone');
$mailcontent['subject'] = getField('subject');
$mailcontent['message'] = getField('message', 1);
$mailcontent['dataconfirmation'] = getField('dataconfirmation', 1);
if (getOption('contactform_title') == "required" && empty($mailcontent['title'])) {
$error[1] = gettext("a title");
}
if (getOption('contactform_name') == "required" && empty($mailcontent['name'])) {
$error[2] = gettext("a name");
}
if (getOption('contactform_company') == "required" && empty($mailcontent['company'])) {
$error[3] = gettext("a company");
}
if (getOption('contactform_street') == "required" && empty($mailcontent['street'])) {
$error[4] = gettext("a street");
}
if (getOption('contactform_city') == "required" && empty($mailcontent['city'])) {
$error[5] = gettext("a city");
}
if (getOption('contactform_state') == "required" && empty($mailcontent['state'])) {
$error[6] = gettext("a state");
}
if (getOption('contactform_country') == "required" && empty($mailcontent['country'])) {
$error[7] = gettext("a country");
}
if (getOption('contactform_postal') == "required" && empty($mailcontent['postal'])) {
$error[8] = gettext("a postal code");
}
if (getOption('contactform_email') == "required" && (empty($mailcontent['email']) || !isValidEmail($mailcontent['email']))) {
$error[9] = gettext("a valid email address");
}
if (getOption('contactform_website') == "required" && empty($mailcontent['website'])) {
$error[10] = gettext('a website');
} else {
if (!empty($mailcontent['website'])) {
if (substr($mailcontent['website'], 0, 7) != "http://" || substr($mailcontent['website'], 0, 8) != "https://") {
$mailcontent['website'] = "http://" . $mailcontent['website'];
}
}
}
if (getOption("contactform_phone") == "required" && empty($mailcontent['phone'])) {
$error[11] = gettext("a phone number");
}
if (empty($mailcontent['subject'])) {
$error[12] = gettext("a subject");
}
if (empty($mailcontent['message'])) {
$error[13] = gettext("a message");
}
if (getOption("contactform_captcha")) {
$code_ok = trim(sanitize(isset($_POST['code_h']) ? $_POST['code_h'] : NULL));
$code = trim(sanitize(isset($_POST['code']) ? $_POST['code'] : NULL));
if (!$_zp_captcha->checkCaptcha($code, $code_ok)) {
$error[14] = gettext("the correct CAPTCHA verification code");
}
}
if (getOption('contactform_dataconfirmation') && empty($mailcontent['dataconfirmation'])) {
$error_dataconfirmation = $error[15] = gettext('Please agree to storage and handling of your data by this website.');
}
if (count($error) != 0) {
?>
<div class="errorbox">
<?php
$err = $error;
if($error_dataconfirmation) {
echo '<p>' . $error_dataconfirmation . '</p>';
unset($err[15]);
}
switch (count($err)) {
case 1:
printf(gettext('Please enter %s. Thanks.'), array_shift($err));
break;
case 2:
printf(gettext('Please enter %1$s and %2$s. Thanks.'), array_shift($err), array_shift($err));
break;
default:
if(!empty($err)) {
$list = '<ul class="errorlist">';
foreach ($err as $item) {
$list .= '<li>' . $item . '</li>';
}
$list .= '</ul>';
printf(gettext('Please enter: %sThanks.'), $list);
}
break;
}
?>
</div>
<?php
} else {
$mailaddress = $mailcontent['email'];
$name = $mailcontent['name'];
$subject = $mailcontent['subject'] . " (" . getBareGalleryTitle() . ")";
$message = '';
if (!empty($mailcontent['title'])) {
$message .= $mailcontent['title'] . "\n";
}
if (!empty($mailcontent['name'])) {
$message .= $mailcontent['name'] . "\n";
}
if (!empty($mailcontent['email'])) {
$message .= $mailcontent['email'] . "\n";
}
if (!empty($mailcontent['company'])) {
$message .= $mailcontent['company'] . "\n";
}
if (!empty($mailcontent['street'])) {
$message .= $mailcontent['street'] . "\n";
}
if (!empty($mailcontent['city'])) {
$message .= $mailcontent['city'] . "\n";
}
if (!empty($mailcontent['state'])) {
$message .= $mailcontent['state'] . "\n";
}
if (!empty($mailcontent['postal'])) {
$message .= $mailcontent['postal'] . "\n";
}
if (!empty($mailcontent['country'])) {
$message .= $mailcontent['country'] . "\n";
}
if (!empty($mailcontent['phone'])) {
$message .= $mailcontent['phone'] . "\n";
}
if (!empty($mailcontent['website'])) {
$message .= $mailcontent['website'] . "\n";
}
$message .= "\n\n" . $mailcontent['message'];
if (!empty($mailcontent['dataconfirmation'])) {
$message .= "\n\n" . gettext('I agree to storage and handling of my data by this website.') . "\n";
}
$message .= "\n\n";
if (getOption('contactform_confirm')) {
echo get_language_string(getOption("contactform_confirmtext"));
if (getOption('contactform_sendcopy')) {
echo get_language_string(getOption("contactform_sendcopy_text"));
}
?>
<div>
<?PHP
$_processing_post = true;
include(getPlugin('contact_form/form.php', true));
$message = str_replace("\n", '<br>', $message);
?>
<form id="confirm" action="<?php echo html_encode(getRequestURI()); ?>" method="post" accept-charset="UTF-8" style="float: left">
<input type="hidden" id="confirm" name="confirm" value="confirm" />
<input type="hidden" id="name" name="name" value="<?php echo html_encode($name); ?>" />
<input type="hidden" id="subject" name="subject" value="<?php echo html_encode($subject); ?>" />
<input type="hidden" id="message" name="message" value="<?php echo html_encode($message); ?>" />
<input type="hidden" id="mailaddress" name="mailaddress" value="<?php echo html_encode($mailaddress); ?>" />
<input type="text" id="username" name="username" value="<?php echo html_encode($mailcontent['honeypot']); ?>" style="display: none" />
<input type="submit" value="<?php echo gettext("Confirm"); ?>" />
</form>
<form id="discard" action="<?php echo html_encode(getRequestURI()); ?>" method="post" accept-charset="UTF-8">
<input type="hidden" id="discard" name="discard" value="discard" />
<input type="submit" value="<?php echo gettext("Discard"); ?>" />
</form>
</div>
<?php
return;
} else {
$_POST['confirm'] = true;
$_POST['subject'] = $subject;
$_POST['message'] = $message;
$_POST['mailaddress'] = $mailaddress;
$_POST['name'] = $name;
}
}
}
if (isset($_POST['confirm'])) {
$subject = sanitize($_POST['subject']);
$message = str_replace('<br>', "\n", sanitize($_POST['message'], 1));
$mailaddress = sanitize($_POST['mailaddress']);
$honeypot = sanitize($_POST['username']);
$name = sanitize($_POST['name']);
$mailinglist = explode(';', getOption("contactform_mailaddress"));
if (getOption('contactform_sendcopy')) {
$sendcopy = array($name => $mailaddress);
} else {
$sendcopy = NULL;
}
$err_msg = false;
if (empty($honeypot)) {
$err_msg = zp_mail($subject, $message, $mailinglist, $sendcopy, NULL, array($name => $mailaddress));
}
if ($err_msg) {
$msgs = explode('. ', $err_msg);
foreach ($msgs as $key => $line) {
if (empty($line) || $line == gettext('Mail send failed') || strpos($line, 'github')) {
unset($msgs[$key]);
}
}
?>
<div class="errorbox">
<strong><?php echo ngettext('Error sending mail:', 'Errors sending mail:', count($msgs)); ?></strong>
<ul class="errorlist">
<?php
foreach ($msgs as $line) {
echo '<li>' . trim($line) . '</li>';
}
?>
</ul>
</div>
<?php
} else {
echo get_language_string(getOption("contactform_thankstext"));
}
echo '<p><a href="?again">' . get_language_string(getOption('contactform_newmessagelink')) . '</a></p>';
} else {
if (count($error) <= 0) {
if (zp_loggedin()) {
$mailcontent = array(
'title' => '',
'name' => $_zp_current_admin_obj->getName(),
'company' => '',
'street' => '',
'city' => '',
'state' => '',
'country' => '',
'postal' => '',
'email' => $_zp_current_admin_obj->getEmail(),
'website' => '', 'phone' => '',
'subject' => $subject_override,
'message' => '', 'honeypot' => '');
if (extensionEnabled('comment_form')) {
$address = getSerializedArray($_zp_current_admin_obj->getCustomData());
foreach ($address as $key => $field) {
$mailcontent[$key] = $field;
}
}
} else {
$mailcontent = array(
'title' => '',
'name' => '',
'company' => '',
'street' => '',
'city' => '',
'state' => '',
'country' => '',
'email' => '',
'postal' => '',
'website' => '',
'phone' => '',
'subject' => $subject_override,
'message' => '',
'honeypot' => '');
}
}
echo get_language_string(getOption("contactform_introtext"));
if (getOption('contactform_sendcopy'))
echo get_language_string(getOption("contactform_sendcopy_text"));
$_processing_post = false;
include(getPlugin('contact_form/form.php', true));
}
}
function showOrNotShowField($option) {
return $option == "required" || $option == "show";
}
function checkRequiredField($option) {
global $_processing_post;
if ($option == "required" && !$_processing_post) {
return "<strong>*</strong>";
} else {
return "";
}
}
function printContactFormMacro($subject_override = '') {
ob_start();
printContactForm($subject_override);
$content = ob_get_contents();
ob_end_clean();
return $content;
}
function getContactFormMacros($macros) {
$macros['CONTACTFORM'] = array(
'class' => 'function',
'params' => array('string*'),
'value' => 'printContactFormMacro',
'owner' => 'contact_form',
'desc' => gettext('Set %1 to optionally override the subject.')
);
return $macros;
}