'safemail', 'type' => MENU_CALLBACK, 'callback' => safemail_page, 'access' => user_access('decode email addresses')); } return $items; } /** * Implementation of hook_settings(). */ function safemail_settings() { if (!function_exists('captcha_form')) form_set_error('No captcha', t('No suitable captcha module is available.')); if (!function_exists('mcrypt_encrypt')) form_set_error('No mcrypt', t('The mcrypt library is not available.')); $group .= form_checkbox( t('Use mcrypt'), "safemail_mcrypt", 1, variable_get("safemail_mcrypt", 0), t("Use the mcrypt library if available. Otherwise safemail will use a fast trivial encoding.")); $group .= form_textfield( t('Encryption key'), "safemail_key", _safemail_key(), 64, 255, t('Key used internally to encode email addresses.')); return form_group(t("Email address protection"), $group); } /** * Implementation of hook_filter(). */ function safemail_filter($op, $delta = 0, $format = -1, $text = '') { switch ($op) { // case 'no cache': return true; case 'list': return array(0 => t('Email address protection filter')); case 'description': return t('Encodes email addresses to protect them from harvesting.'); case 'settings': return NULL; case 'prepare': return $text; case 'process': return _safemail_process($text, $format); default: return $text; } } function _safemail_key() { return variable_get('safemail_key', 'password'); } function _safemail_encode($s) { $key = _safemail_key(); if (function_exists('mcrypt_encrypt') && variable_get("safemail_mcrypt", 1)) { $r = '0/'; $e = mcrypt_encrypt(MCRYPT_CRYPT, $key, $s, MCRYPT_MODE_STREAM); } else { $r = '1/'; $e = _safemail_xor($s, $key); } for ($i = strlen($e) - 1; $i >= 0; --$i) $r .= sprintf("%02x", ord($e[$i])); return $r; } function _safemail_url($s) { return url('safemail/' . _safemail_encode($s)); } function _safemail_decode($type, $data) { $key = _safemail_key(); $s = ''; for ($i = strlen($data) - 2; $i >= 0; $i -= 2) $s .= chr(hexdec(substr($data, $i, 2))); switch ($type) { case '0': $d = mcrypt_decrypt(MCRYPT_CRYPT, $key, $s, MCRYPT_MODE_STREAM); break; default: $d = _safemail_xor($s, $key); break; } return $d; } function _safemail_xor($s, $key) { $ki = 0; $kn = strlen($key) - 1; $r = ''; $n = strlen($s); for ($i = 0; $i < $n; ++$i) { if (++$ki > $kn) $ki = 0; $v = ord($key[$ki]); $v = (($v >> 4) & 0xF) | (($v << 4) & 0xF0); $r .= chr($v ^ ord($s[$i])); } return $r; } function _safemail_process($text, $format) { if (strpos($text, '@') === FALSE) return $text; // Split at and so that we can avoid encoding addresses in link text. $t = preg_replace(":(]*)mailto:([^@]+@[-.a-z0-9]+)(.*)/i', $a[$i], $m)) { $a[$i] = preg_replace('/@[-.a-z0-9]+/i', '', $m[1] . _safemail_url($m[2]) . $m[3]); } else { while (preg_match('/(.*)\b([^\s@]+)(@[-.a-z0-9]+)(.*)$/i', $a[$i], $m)) { $a[$i] = $m[1] . '' . $m[2] . '' . $m[4]; } } } return strtr(implode('', $a), "\002\003", "\r\n"); } function safemail_page() { if (function_exists('captcha_form') && !user_access('decode email addresses without captcha')) { $ok = FALSE; if ($_POST['op'] == t('Submit')) { $edit = $_POST['edit']; if (!($ok = captcha_test($edit))) { form_set_error('safemail_captcha', t('The verification you entered is not correct.')); } } if (!$ok) { $form = captcha_form(); $form .= form_submit(t('Submit')); drupal_set_title(t('Email address protection')); print theme('page', form($form)); return; } } $addr = _safemail_decode(arg(1), arg(2)); $output .= "

Address: $addr

\n"; drupal_set_title(t('Email address')); print theme('page', $output); } ?>