PluginProbe
CryptX / 3.1
CryptX v3.1
4.2.1 4.2.0 4.1.1 trunk 1.0 1.1 1.2 1.3 1.4 1.5 1.6 1.7 1.9 2.0 2.1 2.2 2.3 2.3.1 2.3.2 2.3.3 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 All 93 releases
← All changes | cryptx.php +618 -347 4.2.13.1 View file →
@@ -1,401 +1,672 @@
1 1 <?php
2 +/*
3 +Plugin Name: CryptX
4 +Plugin URI: http://weber-nrw.de/wordpress/cryptx/
5 +Description: No more SPAM by spiders scanning you site for email adresses. With CryptX you can hide all your email adresses, with and without a mailto-link, by converting them using javascript or UNICODE. Although you can choose to add a mailto-link to all unlinked email adresses with only one klick at the settings. That's great, isn't it?
6 +Version: 3.1
7 +Author: Ralf Weber
8 +Author URI: http://weber-nrw.de/
9 +Donate link: https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4026696
10 +*/
2 11 /**
3 - * Plugin Name: CryptX
4 - * Plugin URI: https://wordpress.org/plugins/cryptx/
5 - * Description: CryptX encrypts email addresses in your posts, pages, comments, and text widgets to protect them from spam bots while keeping them readable for your visitors.
6 - * Version: 4.2.1
7 - * Requires at least: 6.7
8 - * Tested up to: 7.1
9 - * Requires PHP: 8.1
10 - * Author: Ralf Weber
11 - * Author URI: https://weber-nrw.de/
12 - * License: GPL v2 or later
13 - * License URI: https://www.gnu.org/licenses/gpl-2.0.html
14 - * Text Domain: cryptx
15 - *
16 - * CryptX is free software: you can redistribute it and/or modify
17 - * it under the terms of the GNU General Public License as published by
18 - * the Free Software Foundation, either version 2 of the License, or
19 - * any later version.
20 - *
21 - * CryptX is distributed in the hope that it will be useful,
22 - * but WITHOUT ANY WARRANTY; without even the implied warranty of
23 - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
24 - * GNU General Public License for more details.
25 - *
26 - * You should have received a copy of the GNU General Public License
27 - * along with CryptX. If not, see https://www.gnu.org/licenses/gpl-2.0.html.
28 - *
29 - * @package CryptX
30 - * @since 1.0.0
31 - */
12 +* "CryptX" WordPress Plugin
13 +*
14 +* @author Ralf Weber <ralf@weber-nrw.de>
15 +* @license http://opensource.org/licenses/gpl-license.php GNU Public License
16 +*/
32 17
33 -// Prevent direct access
34 18 if (!defined('ABSPATH')) {
35 - exit;
36 -}
19 + return ;
20 + }
37 21
38 -// Plugin constants
39 -define('CRYPTX_VERSION', '4.2.1');
40 -define('CRYPTX_PLUGIN_FILE', __FILE__);
41 -define('CRYPTX_PLUGIN_BASENAME', plugin_basename(__FILE__));
42 -define('CRYPTX_BASENAME', plugin_basename(__FILE__)); // Add this missing constant
43 -define('CRYPTX_DIR_PATH', plugin_dir_path(__FILE__));
44 -define('CRYPTX_DIR_URL', plugin_dir_url(__FILE__));
45 -define('CRYPTX_BASEFOLDER', dirname(CRYPTX_PLUGIN_BASENAME));
22 +define( 'CRYPTX_BASENAME', plugin_basename( __FILE__ ) );
23 +define( 'CRYPTX_BASEFOLDER', plugin_basename( dirname( __FILE__ ) ) );
24 +define( 'CRYPTX_FILENAME', str_replace( CRYPTX_BASEFOLDER.'/', '', plugin_basename(__FILE__) ) );
46 25
47 -// Minimum requirements. Keep these in sync with the plugin header above and
48 -// with "Requires at least" / "Requires PHP" in readme.txt. They are defined
49 -// once and used both for the check and for the notice, so the number shown to
50 -// the user cannot drift away from the number actually enforced.
51 -define('CRYPTX_MIN_PHP', '8.1');
52 -define('CRYPTX_MIN_WP', '6.7');
26 +load_plugin_textdomain('cryptx', false, 'cryptx/languages/');
53 27
54 -/**
55 - * Shows an admin notice to whoever is in a position to act on it.
56 - *
57 - * Registered on both admin_notices and network_admin_notices. Without the
58 - * second, a network administrator working in the network backend -- the only
59 - * person who can deactivate a network-activated plugin -- never saw that the
60 - * server runs too old a PHP, or that a class file is missing. The capability
61 - * differs per screen: on a site it is activate_plugins, in the network backend
62 - * manage_network_plugins, which a mere site administrator does not hold.
63 - *
64 - * @param string $message The message, already translated and unescaped.
65 - *
66 - * @return void
67 - */
68 -function cryptx_admin_notice(string $message): void
69 -{
70 - $render = static function () use ($message): void {
71 - $capability = is_network_admin() ? 'manage_network_plugins' : 'activate_plugins';
28 +$cryptX_var = (array) get_option('cryptX');
72 29
73 - if (!current_user_can($capability)) {
74 - return;
75 - }
76 30
77 - printf('<div class="notice notice-error"><p>%s</p></div>', esc_html($message));
78 - };
31 +global $cryptX_var, $wp_version;
79 32
80 - add_action('admin_notices', $render);
81 - add_action('network_admin_notices', $render);
33 +if (@$cryptX_var['theContent']) {
34 + rw_cryptx_filter('the_content');
82 35 }
36 +if (@$cryptX_var['the_meta_key']) {
37 + rw_cryptx_filter('the_meta_key');
38 +}
39 +if (@$cryptX_var['theExcerpt']) {
40 + rw_cryptx_filter('the_excerpt');
41 +}
42 +if (@$cryptX_var['commentText']) {
43 + rw_cryptx_filter('comment_text');
44 +}
45 +if (@$cryptX_var['widgetText']) {
46 + rw_cryptx_filter('widget_text');
47 +}
83 48
84 -if (version_compare(PHP_VERSION, CRYPTX_MIN_PHP, '<')) {
85 - cryptx_admin_notice(sprintf(
86 - /* translators: %1$s: Required PHP version, %2$s: Current PHP version */
87 - __('CryptX requires PHP version %1$s or higher. You are running version %2$s. Please update PHP.', 'cryptx'),
88 - CRYPTX_MIN_PHP,
89 - PHP_VERSION
90 - ));
91 - return;
49 +if (is_admin()) {
50 + add_action('admin_menu', 'rw_cryptx_menu');
92 51 }
93 52
94 -// WordPress version check
95 -global $wp_version;
96 -if (version_compare($wp_version, CRYPTX_MIN_WP, '<')) {
97 - cryptx_admin_notice(sprintf(
98 - /* translators: %1$s: Required WordPress version, %2$s: Current WordPress version */
99 - __('CryptX requires WordPress version %1$s or higher. You are running version %2$s. Please update WordPress.', 'cryptx'),
100 - CRYPTX_MIN_WP,
101 - $GLOBALS['wp_version']
102 - ));
103 - return;
53 +add_action( 'activate_' . str_replace( DIRECTORY_SEPARATOR, '/', str_replace( realpath(ABSPATH . PLUGINDIR) . DIRECTORY_SEPARATOR, '', __FILE__ ) ), 'rw_cryptx_install' );
54 +
55 +if (@$cryptX_var['java']) {
56 + if (@$cryptX_var['load_java']) {
57 + add_action( 'wp_footer', 'rw_cryptx_header', 9 );
58 + } else {
59 + add_action( 'wp_head', 'rw_cryptx_header', 9 );
60 + }
104 61 }
105 62
106 -// Autoloader for plugin classes
107 -spl_autoload_register(function ($class) {
108 - // Check if the class belongs to our namespace
109 - if (strpos($class, 'CryptX\\') !== 0) {
110 - return;
111 - }
63 +if (@$cryptX_var[metaBox]) {
64 + add_action('admin_menu', 'rw_cryptx_meta_box');
65 + add_action('wp_insert_post', 'rw_cryptx_insert_post' );
66 + add_action('wp_update_post', 'rw_cryptx_insert_post' );
67 +}
112 68
113 - // Remove namespace prefix
114 - $class = substr($class, 7);
69 +if ( version_compare( $wp_version, '2.8', '>' ) ) {
70 + add_filter( 'plugin_row_meta', 'rw_cryptx_init_row_meta', 10, 2 ); // only 2.8 and higher
71 +} else {
72 + add_filter( 'plugin_action_links', 'rw_cryptx_init_row_meta', 10, 2 );
73 +}
115 74
116 - // Convert namespace separators to directory separators
117 - $class = str_replace('\\', DIRECTORY_SEPARATOR, $class);
75 +add_filter( 'init', 'rw_cryptx_init_tinyurl');
76 +add_action( 'parse_request', 'rw_cryptx_parse_request');
118 77
119 - // Build the full path
120 - $file = CRYPTX_DIR_PATH . 'classes' . DIRECTORY_SEPARATOR . $class . '.php';
78 +add_shortcode( 'cryptx', 'rw_cryptx_shortcode');
121 79
122 - // Include the file if it exists
123 - if (file_exists($file)) {
124 - require_once $file;
125 - }
126 -});
80 +function rw_cryptx_shortcode( $atts, $content=null) {
81 + global $cryptX_var;
127 82
128 -// The settings screen posts nothing: it talks to the REST routes in
129 -// CryptX\Admin\RestController, which carry their own capability check and are
130 -// covered by WordPress' REST nonce. The global cryptx_nonce_check() that used
131 -// to sit here guarded $_POST['cryptX_var'], a key nothing has sent since the
132 -// old settings form was removed in 4.1.0 -- a dead guard next to a live one is
133 -// a trap for whoever wires up the next form.
83 + if (@$cryptX_var[autolink]) $content = rw_cryptx_autolink($content, true);
84 + $content = rw_cryptx_encryptx($content, true);
85 + $content = rw_cryptx_linktext($content, true);
134 86
135 -// Initialize the plugin
136 -add_action('plugins_loaded', function() {
137 - // Check if all required classes can be loaded
138 - $requiredClasses = [
139 - 'CryptX\\CryptX',
140 - 'CryptX\\Config',
141 - 'CryptX\\SecureEncryption',
142 - 'CryptX\\Exposure',
143 - 'CryptX\\Block',
144 - 'CryptX\\ImageToken',
145 - 'CryptX\\Admin\\NetworkDefaults',
146 - 'CryptX\\Admin\\SettingsPage',
147 - 'CryptX\\Admin\\SettingsSchema',
148 - 'CryptX\\Admin\\RestController',
149 - 'CryptX\\Admin\\SiteHealth',
150 - ];
87 + return $content;
88 +}
151 89
152 - $missingClasses = [];
153 - foreach ($requiredClasses as $class) {
154 - if (!class_exists($class)) {
155 - $missingClasses[] = $class;
156 - }
157 - }
90 +function rw_cryptx_parse_request( $wp ) {
91 + if ( isset($_GET['cryptx']) ) {
92 + switch( $_GET['cryptx'] ) {
93 + case 'news':
94 + include( 'ajax/news.php' );
95 + break;
96 + }
97 + exit;
98 + }
99 +}
158 100
159 - if (!empty($missingClasses)) {
160 - cryptx_admin_notice(
161 - __('CryptX: Missing required classes: ', 'cryptx') . implode(', ', $missingClasses)
162 - );
163 - return;
164 - }
101 +function rw_cryptx_init_tinyurl() {
102 + global $cryptX_var;
103 + $url = $_SERVER['REQUEST_URI'];
104 + $params = explode( '/', $url );
105 + if ( count( $params ) > 1 ) {
106 + $tiny_url = $params[count( $params ) -2];
107 + if ( $tiny_url == md5( get_bloginfo('url') ) ) {
108 + $font = $cryptX_var['c2i_font'];
109 + $msg = $params[count( $params ) -1];
110 + $size = $cryptX_var['c2i_fontSize'];
111 + $pad = 1;
112 + $transparent = 1;
113 + $red = hexdec(substr($cryptX_var['c2i_fontRGB'],0,2));
114 + $grn = hexdec(substr($cryptX_var['c2i_fontRGB'],2,2));
115 + $blu = hexdec(substr($cryptX_var['c2i_fontRGB'],4,2));
116 + $bg_red = 255 - $red;
117 + $bg_grn = 255 - $grn;
118 + $bg_blu = 255 - $blu;
119 + $width = 0;
120 + $height = 0;
121 + $offset_x = 0;
122 + $offset_y = 0;
123 + $bounds = array();
124 + $image = "";
125 + $bounds = ImageTTFBBox($size, 0, $font, "W");
126 + $font_height = abs($bounds[7]-$bounds[1]);
127 + $bounds = ImageTTFBBox($size, 0, $font, $msg);
128 + $width = abs($bounds[4]-$bounds[6]);
129 + $height = abs($bounds[7]-$bounds[1]);
130 + $offset_y = $font_height+abs(($height - $font_height)/2)-1;
131 + $offset_x = 0;
132 + $image = imagecreatetruecolor($width+($pad*2),$height+($pad*2));
133 + imagesavealpha($image, true);
134 + $foreground = ImageColorAllocate($image, $red, $grn, $blu);
135 + $background = imagecolorallocatealpha($image, 0, 0, 0, 127);
136 + imagefill($image, 0, 0, $background);
137 + ImageTTFText($image, $size, 0, $offset_x+$pad, $offset_y+$pad, $foreground, $font, $msg);
138 + Header("Content-type: image/png");
139 + imagePNG($image);
140 + die;
141 + }
142 + }
143 +}
165 144
166 - // Initialize the main plugin class
167 - try {
168 - $cryptx_instance = CryptX\CryptX::get_instance();
169 - $cryptx_instance->startCryptX();
170 - cryptx_register_action_links();
145 +function rw_cryptx_init_row_meta($links, $file) {
146 + if (CRYPTX_BASENAME == $file) {
147 + return array_merge(
148 + $links,
149 + array(
150 + sprintf(
151 + '<a href="options-general.php?page=%s">%s</a>',
152 + CRYPTX_BASENAME,
153 + __('Settings')
154 + )
155 + ),
156 + array(
157 + sprintf(
158 + '<a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4026696">%s</a>',
159 + __('Donate', 'cryptx')
160 + )
161 + )
162 + );
163 + }
164 + return $links;
165 +}
171 166
172 - // Guarded here as well as inside register(), and deliberately not
173 - // listed in $requiredClasses above. Both of those would load the file
174 - // on every single front-end and admin request -- class_exists() runs
175 - // the autoloader, and so does a static call -- to register commands
176 - // that only exist under WP-CLI.
177 - //
178 - // class_exists() is still asked so that a package missing the file
179 - // cannot raise a fatal Error, which catch (Exception) below would not
180 - // have caught. It buys no notice: the commands are then simply absent.
181 - // That is the right silence -- nothing a visitor or an administrator
182 - // sees depends on them.
183 - if (defined('WP_CLI') && WP_CLI && class_exists('CryptX\Cli')) {
184 - CryptX\Cli::register();
185 - }
186 - } catch (Exception $e) {
187 - cryptx_admin_notice(
188 - __('CryptX initialization failed: ', 'cryptx') . $e->getMessage()
189 - );
190 - }
191 -});
167 +function rw_cryptx_filter($apply) {
168 + global $cryptX_var, $post, $shortcode_tags;
169 + if (@$cryptX_var['autolink']) {
170 + add_filter($apply, 'rw_cryptx_autolink', 5);
171 + if (!empty($shortcode_tags) || is_array($shortcode_tags)) {
172 + add_filter($apply, 'rw_cryptx_autolink', 11);
173 + }
174 + }
175 + add_filter($apply, 'rw_cryptx_encryptx', 12);
176 + add_filter($apply, 'rw_cryptx_linktext', 13);
177 +}
192 178
193 -/**
194 - * Runs a callback once for every site of the network, in batches.
195 - *
196 - * get_sites() without a limit pulls the whole network into memory, and a
197 - * network can have thousands of sites. Same construction as uninstall.php,
198 - * deliberately: the two do the same job at opposite ends of the plugin's life,
199 - * and one of them being cleverer than the other only makes both harder to
200 - * trust.
201 - *
202 - * On a single site the callback simply runs once.
203 - *
204 - * @param callable $callback Receives nothing; runs with the site switched in.
205 - *
206 - * @return void
207 - */
208 -function cryptx_for_each_site(callable $callback): void
209 -{
210 - if (!is_multisite()) {
211 - $callback();
179 +function rw_cryptx_excluded($ID) {
180 + global $cryptX_var;
181 + $return = false;
182 + $exIDs = explode(",", $cryptX_var['excludedIDs']);
183 + if(in_array($ID, $exIDs) > 0 ) $return = true;
184 + return $return;
185 +}
212 186
213 - return;
214 - }
187 +function rw_cryptx_linktext($content, $shortcode=false) {
188 + global $post;
189 + if (!rw_cryptx_excluded($post->ID) OR $shortcode!=false) {
190 + $content = preg_replace_callback("/([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,}))/i", 'rw_cryptx_do_Linktext', $content );
191 + }
192 + return $content;
193 +}
215 194
216 - $batch_size = 100;
217 - $offset = 0;
195 +function rw_cryptx_do_linktext($Match) {
196 + global $cryptX_var;
197 + switch ($cryptX_var['opt_linktext']) {
218 198
219 - do {
220 - $site_ids = get_sites([
221 - 'fields' => 'ids',
222 - 'number' => $batch_size,
223 - 'offset' => $offset,
224 - 'orderby' => 'id',
225 - 'update_site_meta_cache' => false,
226 - ]);
199 + case 1: // alternative text for mail link
200 + $linktext = $cryptX_var['alt_linktext'];
201 + break;
227 202
228 - foreach ($site_ids as $site_id) {
229 - switch_to_blog($site_id);
203 + case 2: // alternative image for mail link
204 + $linktext = "<img src=\"" . $cryptX_var['alt_linkimage'] . "\" class=\"cryptxImage\" alt=\"" . $cryptX_var['alt_linkimage_title'] . "\" title=\"" . antispambot($cryptX_var['alt_linkimage_title']) . "\" />";
205 + break;
230 206
231 - // finally, so a failing callback does not leave the blog stack
232 - // switched for whatever runs next. It does not keep the loop
233 - // going: an exception still travels upwards and the remaining
234 - // sites are skipped. Catching it here would hide a broken site
235 - // instead, and that is a trade to make deliberately, not in
236 - // passing.
237 - try {
238 - $callback();
239 - } finally {
240 - restore_current_blog();
241 - }
242 - }
207 + case 3: // uploaded image for mail link
208 + $imgurl = $cryptX_var['alt_uploadedimage'];
209 + $linktext = "<img src=\"" . $imgurl . "\" class=\"cryptxImage\" alt=\"" . $cryptX_var['http_linkimage_title'] . "\" title=\"" .antispambot( $cryptX_var['http_linkimage_title']) . "\" />";
210 + break;
243 211
244 - $offset += $batch_size;
245 - } while (count($site_ids) === $batch_size);
246 -}
212 + case 4: // text scrambled by antispambot
213 + $linktext = antispambot($Match[1]);
214 + break;
247 215
248 -/**
249 - * Removes the plugin's transients from the site that is currently switched in.
250 - *
251 - * @return void
252 - */
253 -function cryptx_delete_transients(): void
254 -{
255 - global $wpdb;
216 + case 5: // convert to image
217 + $linktext = "<img src=\"" . get_bloginfo('url') . "/" . md5( get_bloginfo('url') ) . "/" . antispambot($Match[1]) . "\" class=\"cryptxImage\" alt=\"" . antispambot($Match[1]) . "\" title=\"" . antispambot($Match[1]) . "\" />";
218 + break;
256 219
257 - // The LIKE patterns run through $wpdb->esc_like() and $wpdb->prepare().
258 - // No user input is involved here, so this is not a hole, but "_" is a
259 - // single-character wildcard in LIKE: unescaped, '_transient_cryptx_%' also
260 - // matches names like 'Xtransient1cryptxZ...' belonging to other plugins.
261 - // esc_like() turns those underscores into literal ones. The table name is
262 - // an identifier, not a value, and therefore must stay outside prepare().
263 - $transientLike = $wpdb->esc_like('_transient_cryptx_') . '%';
264 - $transientTimeoutLike = $wpdb->esc_like('_transient_timeout_cryptx_') . '%';
220 + default:
221 + $linktext = str_replace( "@", $cryptX_var['at'], $Match[1]);
222 + $linktext = str_replace( ".", $cryptX_var['dot'], $linktext);
265 223
266 - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
267 - $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", $transientLike));
268 - // phpcs:ignore WordPress.DB.DirectDatabaseQuery.DirectQuery, WordPress.DB.DirectDatabaseQuery.NoCaching
269 - $wpdb->query($wpdb->prepare("DELETE FROM {$wpdb->options} WHERE option_name LIKE %s", $transientTimeoutLike));
224 + }
225 + return $linktext;
270 226 }
271 227
272 -/**
273 - * Sets up the plugin's options for the site that is currently switched in.
274 - *
275 - * @return void
276 - */
277 -function cryptx_install_site(): void
278 -{
279 - if (!class_exists('CryptX\\CryptX')) {
280 - return;
281 - }
228 +function rw_cryptx_dirImages() {
229 + $dir = plugin_dir_path( __FILE__ ).'images';
230 + $fh = opendir($dir);
231 + $verzeichnisinhalt = array();
232 + while (true == ($file = readdir($fh)))
233 + {
234 + if ((substr(strtolower($file), -3)=="jpg") or (substr(strtolower($file), -3)=="gif"))
235 + {
236 + $verzeichnisinhalt[] = $file;
237 + }
238 + }
239 + return $verzeichnisinhalt;
240 +}
282 241
283 - CryptX\CryptX::get_instance()->installCryptX();
242 +function rw_cryptx_dirFonts() {
243 + $dir = plugin_dir_path( __FILE__ ).'fonts';
244 + $fh = opendir($dir);
245 + $verzeichnisinhalt = array();
246 + while (true == ($file = readdir($fh)))
247 + {
248 + if ((substr(strtolower($file), -3)=="ttf") or (substr(strtolower($file), -3)=="ttf"))
249 + {
250 + $verzeichnisinhalt[] = $file;
251 + }
252 + }
253 + return $verzeichnisinhalt;
284 254 }
285 255
286 -// Activation.
287 -//
288 -// $network_wide is true when someone ticks "Network Activate". WordPress then
289 -// fires this hook exactly once, not once per site -- so without the loop, every
290 -// site but the current one is left without its stored options and, more to the
291 -// point, without the one-time migration of the pre-4.0 "cryptxoff" post meta.
292 -// The plugin still works there, because the defaults fill in, but a site that
293 -// carried excluded posts from an old version would silently lose them.
294 -register_activation_hook(__FILE__, function ($network_wide = false) {
295 - if ($network_wide) {
296 - cryptx_for_each_site('cryptx_install_site');
297 - } else {
298 - cryptx_install_site();
299 - }
256 +function rw_cryptx_encryptx($content, $shortcode=false) {
257 + global $post;
258 +
259 + if (!rw_cryptx_excluded($post->ID) OR $shortcode!=false) {
260 + $content = preg_replace_callback('/<a (.*?)(href=("|\')mailto:(.*?)("|\')(.*?)|)>(.*?)<\/a>/i', 'rw_cryptx_mailtocrypt', $content );
261 + }
262 + return $content;
263 +}
300 264
301 - flush_rewrite_rules();
302 -});
265 +function rw_cryptx_mailtocrypt($Match) {
266 + global $cryptX_var;
267 + $return = $Match[0];
268 + $mailto = "mailto:" . $Match[4];
269 + if (substr($Match[4], 0, 9) =="?subject=") return $return;
270 + if (@$cryptX_var['java']) {
271 + $crypt = '';
272 + $ascii = 0;
273 + for ($i = 0; $i < strlen( $Match[4] ); $i++) {
274 + $ascii = ord ( substr ( $Match[4], $i ) );
275 + if (8364 <= $ascii) {
276 + $ascii = 128;
277 + }
278 + $crypt .= chr($ascii + 1);
279 + }
280 + $javascript="javascript:DeCryptX('" . $crypt . "')";
281 + $return = str_replace( "mailto:".$Match[4], $javascript, $return);
282 + } else {
283 + $return = str_replace( $mailto, antispambot($mailto), $return);
284 + }
285 + return $return;
286 +}
303 287
304 -// Deactivation. Same reason, other direction: the transients of every site but
305 -// the current one used to survive a network deactivation.
306 -register_deactivation_hook(__FILE__, function ($network_wide = false) {
307 - if ($network_wide) {
308 - cryptx_for_each_site('cryptx_delete_transients');
309 - } else {
310 - cryptx_delete_transients();
311 - }
312 -});
288 +function rw_cryptx_autolink($content, $shortcode=false) {
289 + global $post;
290 + if (rw_cryptx_excluded($post->ID) AND $shortcode==false) return $content;
291 + $src[]="/([\s])([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,}))/si";
292 + $src[]="/(>)([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,}))(<)/si";
293 + $src[]="/(\()([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,}))(\))/si";
294 + $src[]="/(>)([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,}))([\s])/si";
295 + $src[]="/([\s])([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,}))(<)/si";
296 + $src[]="/^([_a-zA-Z0-9-]+(\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\.[a-zA-Z0-9-]+)*(\.[a-zA-Z]{2,}))/si";
297 + $src[]="/(<a[^>]*>)<a[^>]*>/";
298 + $src[]="/(<\/A>)<\/A>/i";
299 + $tar[]="\\1<a href=\"mailto:\\2\">\\2</a>";
300 + $tar[]="\\1<a href=\"mailto:\\2\">\\2</a>\\6";
301 + $tar[]="\\1<a href=\"mailto:\\2\">\\2</a>\\6";
302 + $tar[]="\\1<a href=\"mailto:\\2\">\\2</a>\\6";
303 + $tar[]="\\1<a href=\"mailto:\\2\">\\2</a>\\6";
304 + $tar[]="<a href=\"mailto:\\0\">\\0</a>";
305 + $tar[]="\\1";
306 + $tar[]="\\1";
307 + $content = preg_replace($src,$tar,$content);
308 + return $content;
309 +}
313 310
314 -// A site created while the plugin is network-active gets the same treatment as
315 -// one that existed at activation time. Without this the new site works -- the
316 -// defaults see to that -- but nothing is ever written until someone saves, and
317 -// the behaviour differs from every other site in the network for no reason
318 -// anybody could see.
319 -add_action('wp_initialize_site', function ($site) {
320 - // The network option directly, not is_plugin_active_for_network(): that
321 - // lives in wp-admin/includes/plugin.php, which is not loaded when a site is
322 - // created over the REST API or WP-CLI -- exactly the paths that create sites
323 - // in bulk.
324 - $network_active = get_site_option('active_sitewide_plugins', []);
311 +function rw_cryptx_install() {
312 + global $cryptX_var, $wpdb;
313 + $firstImage = rw_cryptx_dirImages();
314 + $firstFont = rw_cryptx_dirFonts();
315 + $cryptX_var = (array) get_option('cryptX'); // reread Options
316 + $defaults = array(
317 + 'at' => ' [at] ',
318 + 'dot' => ' [dot] ',
319 + 'theContent' => 1,
320 + 'the_meta_key' => 1,
321 + 'theExcerpt' => 0,
322 + 'commentText' => 1,
323 + 'widgetText' => 0,
324 + 'java' => 1,
325 + 'load_java' => 0,
326 + 'opt_linktext' => 0,
327 + 'autolink' => 1,
328 + 'alt_linktext' => '',
329 + 'alt_linkimage' => '',
330 + 'http_linkimage_title' => '',
331 + 'alt_linkimage_title' => '',
332 + 'excludedIDs' => '',
333 + 'metaBox' => 1,
334 + 'alt_uploadedimage' => plugins_url('cryptx/images/').$firstImage[0],
335 + 'c2i_font' => plugin_dir_path( __FILE__ ).'fonts/'.$firstFont[0],
336 + 'c2i_fontSize' => 10,
337 + 'c2i_fontRGB' => '000000'
338 + );
339 + $cryptX_var = $cryptX_var + $defaults;
340 + if ($cryptX_var['excludedIDs'] == "") {
341 + $tmp = array();
342 + $excludes = $wpdb->get_results("SELECT post_id FROM $wpdb->postmeta WHERE meta_key = 'cryptxoff' AND meta_value = 'true'");
343 + if(count($excludes) > 0) {
344 + foreach ($excludes as $exclude) {
345 + $tmp[] = $exclude->post_id;
346 + }
347 + sort($tmp);
348 + $cryptX_var['excludedIDs'] = implode(",", $tmp);
349 + update_option( 'cryptX', $cryptX_var);
350 + $cryptX_var = (array) get_option('cryptX'); // reread Options
351 + $wpdb->query("DELETE FROM $wpdb->postmeta WHERE meta_key = 'cryptxoff'");
352 + }
353 + }
354 + if (empty($cryptX_var['c2i_font'])) {
355 + $cryptX_var['c2i_font'] = plugin_dir_path( __FILE__ ).'fonts/'.$firstFont[0];
356 + }
357 + if (empty($cryptX_var['c2i_fontSize'])) {
358 + $cryptX_var['c2i_fontSize'] = 10;
359 + }
360 + if (empty($cryptX_var['c2i_fontRGB'])) {
361 + $cryptX_var['c2i_fontRGB'] = '000000';
362 + }
363 + update_option( 'cryptX', $cryptX_var);
364 + $cryptX_var = (array) get_option('cryptX'); // reread Options
365 +}
325 366
326 - if (!isset($network_active[CRYPTX_PLUGIN_BASENAME])) {
327 - return;
328 - }
367 +function rw_cryptx_header() {
368 + $cryptX_script = "<script type=\"text/javascript\" src=\"" . site_url() . '/' . PLUGINDIR . '/' . dirname(plugin_basename (__FILE__)) . "/js/cryptx.js\"></script>\n";
369 + print($cryptX_script);
370 +}
329 371
330 - $site_id = is_object($site) ? (int) $site->blog_id : (int) $site;
372 +function rw_cryptx_meta() {
373 + global $post;
374 + ?>
375 + <input type="checkbox" name="cryptxoff" <?php if (rw_cryptx_excluded($post->ID)) { echo 'checked="checked"'; } ?>/> Disable CryptX for this post/page
376 + <?php
377 +}
331 378
332 - switch_to_blog($site_id);
333 - cryptx_install_site();
334 - restore_current_blog();
335 -}, 20);
379 +function rw_cryptx_option() {
380 + global $post;
381 + if ( current_user_can('edit_posts') ) { ?>
382 + <fieldset id="cryptxoption" class="dbx-box">
383 + <h3 class="dbx-handle">CryptX</h3>
384 + <div class="dbx-content">
385 + <input type="checkbox" name="cryptxoff" <?php if (rw_cryptx_excluded($post->ID)) { echo 'checked="checked"'; } ?>/> Disable CryptX for this post/page
386 + </div>
387 + </fieldset>
388 +<?php
389 + }
390 +}
336 391
337 -// Add plugin action links.
338 -//
339 -// Registered inside the successful-initialisation path on purpose, not at the
340 -// top level of this file. It refers to a class constant, and the plugins screen
341 -// is exactly where someone goes to switch off a plugin whose class files are
342 -// missing -- a fatal error there would take away the only lever they have.
343 -// A plugin that did not initialise has no settings page to link to anyway.
344 -function cryptx_register_action_links(): void
345 -{
346 - add_filter('plugin_action_links_' . CRYPTX_PLUGIN_BASENAME, function ($links) {
347 - $settings_link = '<a href="' .
348 - esc_url(admin_url('options-general.php?page=' . CryptX\Admin\SettingsPage::MENU_SLUG)) .
349 - '">' . esc_html__('Settings', 'cryptx') . '</a>';
350 - array_unshift($links, $settings_link);
392 +function rw_cryptx_meta_box() {
393 + if ( function_exists('add_meta_box') ) {
394 + add_meta_box('cryptx','CryptX', 'rw_cryptx_meta','post');
395 + add_meta_box('cryptx','CryptX', 'rw_cryptx_meta','page');
396 + } else {
397 + add_action('dbx_post_sidebar', 'rw_cryptx_option');
398 + add_action('dbx_page_sidebar', 'rw_cryptx_option');
399 + }
400 +}
351 401
352 - return $links;
353 - });
402 +function rw_cryptx_insert_post($pID) {
403 + global $cryptX_var, $post;
404 + $rev = wp_is_post_revision($pID);
405 + if($rev) $pID = $rev;
406 + $b = explode(",", $cryptX_var['excludedIDs']);
407 + if($b[0] == '') unset($b[0]);
408 + foreach($b as $x=>$y) {
409 + if($y == $pID) {
410 + unset($b[$x]);
411 + break;
412 + }
413 + }
414 + if (isset($_POST['cryptxoff'])) $b[] = $pID;
415 + $b = array_unique($b);
416 + sort($b);
417 + $cryptX_var['excludedIDs'] = implode(",", $b);
418 + update_option( 'cryptX', $cryptX_var);
419 + $cryptX_var = (array) get_option('cryptX'); // reread Options
354 420 }
355 421
356 -/**
357 - * Encrypts the given content using the CryptX library and wraps it with a shortcode.
358 - *
359 - * @param string $content The content to be encrypted.
360 - * @param array|null $args Optional arguments to customize the encryption process.
361 - *
362 - * @return string The encrypted content wrapped in the appropriate shortcode.
363 - */
364 -if (!function_exists('cryptx_encrypt')) {
365 - function cryptx_encrypt(string $content, ?array $args = []): string
366 - {
367 - $cryptXInstance = Cryptx\CryptX::get_instance();
368 - // $attributesString contains the escaped (esc_attr()) shortcode attributes from $args
369 - // The signature allows null, convertArrayToArgumentString() does not.
370 - $attributesString = $cryptXInstance->convertArrayToArgumentString($args ?? []);
422 +function rw_cryptx_menu() {
423 + add_options_page(
424 + 'CryptX',
425 + (version_compare($GLOBALS['wp_version'], '2.6.999', '>') ? '<img src="' .@plugins_url('cryptx/icon.png'). '" width="10" height="10" alt="CryptX Icon" />' : ''). 'CryptX',
426 + 'manage_options',
427 + __FILE__,
428 + 'rw_cryptx_submenu'
429 + );
430 +}
371 431
372 - // wp_kses_post() and not esc_html(): the caller passes content, and
373 - // content in WordPress may carry markup. esc_html() turned a "<br>" in
374 - // a theme field into a visible "&lt;br&gt;" -- reported in the support
375 - // forum, and worked around there with html_entity_decode(), which
376 - // undoes the plugin's own protection in the Unicode and entity modes.
377 - // wp_kses_post keeps what a post may contain and drops the rest.
378 - $shortcode = '[cryptx' . $attributesString . ']' . wp_kses_post($content) . '[/cryptx]';
432 +function rw_cryptx_submenu() {
433 + global $cryptX_var;
434 + if (isset($_POST) && !empty($_POST)) {
435 + if (function_exists('current_user_can') === true && (current_user_can('manage_options') === false || current_user_can('edit_plugins') === false)) {
436 + wp_die("You don't have permission to access!");
437 + }
438 + check_admin_referer('cryptX');
439 + update_option( 'cryptX', $_POST['cryptX_var']);
440 + $cryptX_var = (array) get_option('cryptX'); // reread Options
441 + ?>
442 + <div id="message" class="updated fade">
443 + <p><strong><?php _e('Settings saved.') ?></strong></p>
444 + </div>
445 + <?php } ?>
446 +
447 + <div class="wrap">
448 + <?php if (version_compare($GLOBALS['wp_version'], '2.6.999', '>')) { ?>
449 + <div class="icon32" style="background: url(<?php echo @plugins_url('cryptx/icon32.png') ?>) no-repeat"><br /></div>
450 + <?php } ?>
451 + <h2>CryptX</h2>
452 + <br class="clear" />
453 + <form method="post" action="">
454 + <?php wp_nonce_field('cryptX') ?>
455 + <div id="poststuff" class="ui-sortable">
456 + <div id="rw_cryptx_information_box" class="postbox">
457 + <h3><?php _e("Information",'cryptx'); ?></h3>
458 + <div class="inside">
459 + <table class="form-table">
460 + <tr>
461 + <td valign="top" width="1%" nowrap><b><i><u>NEWS:</u></i>&nbsp;</b></td>
462 + <td valign="top"><div id="cryptx-news-content" style="display:none;"></div></td>
463 + <td valign="top" width="50%" style="border-left: 1px solid #999;"><?php
464 + $data = get_plugin_data(__FILE__);
465 + echo sprintf(
466 + '%1$s: %2$s <br /> %3$s: %4$s <br /> %5$s: <a href="http://weber-nrw.de" target="_blank">Ralf Weber</a> | <a href="http://twitter.com/Weber_NRW" target="_blank">%6$s</a> | <a href="https://www.paypal.com/cgi-bin/webscr?cmd=_s-xclick&hosted_button_id=4026696">%7$s</a><br />',
467 + __('Plugin'),
468 + 'CryptX',
469 + __('Version'),
470 + $data['Version'],
471 + __('Author'),
472 + __('Follow on Twitter', 'cryptx'),
473 + __('Donate', 'cryptx')
474 + );
475 + ?>
476 + </td>
477 + </tr>
478 + <tr>
479 + <td colspan="3" align="center">
480 + Please support me by translating CryptX into other languages. You can download the cryptx.pot file from my <a href="http://weber-nrw.de/wordpress/cryptx/downloads/">site</a> and mail me the zipped language files. Thanks for it.
481 + </td>
482 + </tr>
483 + </table>
484 + </div>
485 + </div>
486 + <div id="rw_cryptx_presentation_box" class="postbox">
487 + <h3><?php _e("Presentation",'cryptx'); ?></h3>
488 + <div class="inside">
489 + <table class="form-table">
490 + <tr valign="top">
491 + <td><input name="cryptX_var[opt_linktext]" type="radio" id="opt_linktext" value="0" <?php echo ($cryptX_var['opt_linktext'] == 0) ? 'checked="checked"' : ''; ?> /></td>
492 + <th scope="row"><label for="cryptX_var[at]"><?php _e("Replacement for '@'",'cryptx'); ?></label></th>
493 + <td><input name="cryptX_var[at]" value="<?php echo $cryptX_var['at']; ?>" type="text" class="regular-text" /></td>
494 + </tr>
495 + <tr valign="top">
496 + <td>&nbsp;</td>
497 + <th scope="row"><label for="cryptX_var[dot]"><?php _e("Replacement for '.'",'cryptx'); ?></label></th>
498 + <td><input name="cryptX_var[dot]" value="<?php echo $cryptX_var['dot']; ?>" type="text" class="regular-text" /></td>
499 + </tr>
500 + <tr valign="top">
501 + <td scope="row"><input type="radio" name="cryptX_var[opt_linktext]" id="opt_linktext2" value="1" <?php echo ($cryptX_var['opt_linktext'] == 1) ? 'checked="checked"' : ''; ?>/></td>
502 + <th><label for="cryptX_var[alt_linktext]"><?php _e("Text for link",'cryptx'); ?></label></th>
503 + <td><input name="cryptX_var[alt_linktext]" value="<?php echo $cryptX_var['alt_linktext']; ?>" type="text" class="regular-text" /></td>
504 + </tr>
505 + <tr valign="top">
506 + <td scope="row"><input type="radio" name="cryptX_var[opt_linktext]" id="opt_linktext3" value="2" <?php echo ($cryptX_var['opt_linktext'] == 2) ? 'checked="checked"' : ''; ?>/></td>
507 + <th><label for="cryptX_var[alt_linkimage]"><?php _e("Image-URL",'cryptx'); ?></label></th>
508 + <td><input name="cryptX_var[alt_linkimage]" value="<?php echo $cryptX_var['alt_linkimage']; ?>" type="text" class="regular-text" /></td>
509 + </tr>
510 + <tr valign="top">
511 + <td scope="row">&nbsp;</td>
512 + <th><label for="cryptX_var[http_linkimage_title]"><?php _e("Title-Tag for the Image",'cryptx'); ?></label></th>
513 + <td><input name="cryptX_var[http_linkimage_title]" value="<?php echo $cryptX_var['http_linkimage_title']; ?>" type="text" class="regular-text" /></td>
514 + </tr>
515 + <tr valign="top">
516 + <td scope="row"><input type="radio" name="cryptX_var[opt_linktext]" id="opt_linktext4" value="3" <?php echo ($cryptX_var['opt_linktext'] == 3) ? 'checked="checked"' : ''; ?>/></td>
517 + <th><label for="cryptX_var[alt_uploadedimage]"><?php _e("Select image from folder",'cryptx'); ?></label></th>
518 + <td> <select name="cryptX_var[alt_uploadedimage]" onchange="cryptX_bild_wechsel(this)">
519 + <?php foreach(rw_cryptx_dirImages() as $image) {
520 + ?>
521 + <option value="<?php echo plugins_url('cryptx/images/').$image; ?>" <?php echo ($cryptX_var['alt_uploadedimage'] == plugins_url('cryptx/images/').$image) ? 'selected' : ''; ?> ><?php echo $image; ?></option>
522 + <?php } ?>
523 + </select>
524 + <br/><?php _e("the selected image: ",'cryptx'); ?><img src="<?php echo $cryptX_var['alt_uploadedimage']; ?>" id="cryptXmailTo" align="top" style="padding: 3px;"><br/>
525 + <span class="setting-description"><?php echo sprintf( __("Upload your favorite email-image to '%s'. Only .jpg and .gif Supported!",'cryptx'), plugin_dir_path( __FILE__ ).'images/' ); ?></span></td>
526 + </tr>
527 + <tr valign="top">
528 + <td>&nbsp;</td>
529 + <th><label for="cryptX_var[alt_linkimage_title]"><?php _e("Title-Tag for the Image",'cryptx'); ?></label></th>
530 + <td><input name="cryptX_var[alt_linkimage_title]" value="<?php echo $cryptX_var['alt_linkimage_title']; ?>" type="text" class="regular-text" /></td>
531 + </tr>
532 + <tr valign="top">
533 + <td scope="row"><input type="radio" name="cryptX_var[opt_linktext]" id="opt_linktext4" value="4" <?php echo ($cryptX_var['opt_linktext'] == 4) ? 'checked="checked"' : ''; ?>/></td>
534 + <th colspan="2"><?php _e("Text scrambled by AntiSpamBot (<small>Try it and look at your site and check the html source!</small>)",'cryptx'); ?></th>
535 + </tr>
536 + <tr valign="top">
537 + <td scope="row"><input type="radio" name="cryptX_var[opt_linktext]" id="opt_linktext5" value="5" <?php echo ($cryptX_var['opt_linktext'] == 5) ? 'checked="checked"' : ''; ?>/></td>
538 + <th><?php _e("Convert Email to PNG-image",'cryptx'); ?></th>
539 + <td><?php _e("Example with the saved options: ",'cryptx'); ?><img src="<?php echo get_bloginfo('url'); ?>/<?php echo md5( get_bloginfo('url') ); ?>/<?php echo antispambot("test@example.com"); ?>" align="absmiddle" alt="<?php echo antispambot("test@example.com"); ?>" title="<?php echo antispambot("test@example.com"); ?>"></td>
540 + </tr>
541 + <tr valign="top">
542 + <td>&nbsp;</td>
543 + <th><label for="cryptX_var[c2i_font]"><?php _e("Choose a Font",'cryptx'); ?></label></th>
544 + <td><select name="cryptX_var[c2i_font]">
545 + <?php foreach(rw_cryptx_dirFonts() as $font) { ?>
546 + <option value="<?php echo plugin_dir_path( __FILE__ ).'fonts/'.$font; ?>" <?php echo ($cryptX_var['c2i_font'] == plugin_dir_path( __FILE__ ).'fonts/'.$font) ? 'selected' : ''; ?> ><?php echo $font; ?></option>
547 + <?php } ?>
548 + </select><br/>
549 + <span class="setting-description"><?php echo sprintf( __("Upload your favorite font to '%s'. Only .ttf is Supported!",'cryptx'), plugin_dir_path( __FILE__ ).'fonts/' ); ?></span>
550 + </td>
551 + </tr>
552 + <tr valign="top">
553 + <td>&nbsp;</td>
554 + <th><label for="cryptX_var[c2i_fontSize]"><?php _e("Font size (pixel)",'cryptx'); ?></label></th>
555 + <td><input name="cryptX_var[c2i_fontSize]" value="<?php echo $cryptX_var['c2i_fontSize']; ?>" type="text" class="regular-text" /></td>
556 + </tr>
557 + <tr valign="top">
558 + <td>&nbsp;</td>
559 + <th><label for="cryptX_var[c2i_fontRGB]"><?php _e("Font color (RGB)",'cryptx'); ?></label></th>
560 + <td><input name="cryptX_var[c2i_fontRGB]" value="<?php echo $cryptX_var['c2i_fontRGB']; ?>" type="text" class="regular-text" /></td>
561 + </tr>
562 + </table>
563 + <p><input type="submit" name="cryptX" class="button-primary" value="<?php _e('Save Changes') ?>" /></p>
564 + </div>
565 + </div>
566 + <div id="rw_cryptx_general_box" class="postbox">
567 + <h3><?php _e("General",'cryptx'); ?></h3>
568 + <div class="inside">
569 + <table class="form-table">
570 + <tr valign="top">
571 + <th scope="row"><?php _e("Apply CryptX to...",'cryptx'); ?></th>
572 + <td><input name="cryptX_var[theContent]" type="checkbox" <?php echo (isset($cryptX_var['theContent']) == true) ? 'checked="checked"' : ''; ?> />&nbsp;&nbsp;<?php _e("Content",'cryptx'); ?> <?php _e("(<i>this can be disabled per Post by an Option</i>)",'cryptx'); ?><br/>
573 + <input name="cryptX_var[the_meta_key]" type="checkbox" <?php echo (isset($cryptX_var['the_meta_key']) == true) ? 'checked="checked"' : ''; ?> />&nbsp;&nbsp;<?php _e("Custom fields",'cryptx'); ?><br/>
574 + <input name="cryptX_var[theExcerpt]" type="checkbox" <?php echo (isset($cryptX_var['theExcerpt']) == true) ? 'checked="checked"' : ''; ?> />&nbsp;&nbsp;<?php _e("Excerpt",'cryptx'); ?><br/>
575 + <input name="cryptX_var[commentText]" type="checkbox" <?php echo (isset($cryptX_var['commentText']) == true) ? 'checked="checked"' : ''; ?> />&nbsp;&nbsp;<?php _e("Comments",'cryptx'); ?><br/>
576 + <input name="cryptX_var[widgetText]" type="checkbox" <?php echo (isset($cryptX_var['widgetText']) == true) ? 'checked="checked"' : ''; ?> />&nbsp;&nbsp;<?php _e("Widgets",'cryptx'); ?> <?php _e("(<i>works only on all widgets, not on a single widget</i>!)",'cryptx'); ?></td>
577 + </tr>
578 + <tr valign="top">
579 + <th scope="row"><?php _e("Excluded ID's...",'cryptx'); ?></th>
580 + <td><input name="cryptX_var[excludedIDs]" value="<?php echo $cryptX_var['excludedIDs']; ?>" type="text" class="regular-text" />
581 + <br/><span class="setting-description"><?php _e("Enter all Page/Post ID's to exclude from CryptX as comma seperated list.",'cryptx'); ?></span>
582 + <br/><input name="cryptX_var[metaBox]" <?php echo (isset($cryptX_var['metaBox']) == true) ? 'checked="checked"' : ''; ?> type="checkbox" />&nbsp;&nbsp;<?php _e("Enable the CryptX Widget on editing a post or page.",'cryptx'); ?></td>
583 + </tr>
584 + <tr valign="top">
585 + <th scope="row"><?php _e("Type of decryption",'cryptx'); ?></th>
586 + <td><input name="cryptX_var[java]" <?php echo (isset($cryptX_var['java']) == true) ? 'checked="checked"' : ''; ?> type="radio" value="1" />&nbsp;&nbsp;<?php _e("Use javascript to hide the Email-Link.",'cryptx'); ?><br/>
587 + <input name="cryptX_var[java]" <?php echo (isset($cryptX_var['java']) != true) ? 'checked="checked"' : ''; ?> type="radio" value="0" />&nbsp;&nbsp;<?php _e("Use Unicode to hide the Email-Link.",'cryptx'); ?></td>
588 + </tr>
589 + <tr valign="top">
590 + <th scope="row"><?php _e("Where to load the needed javascript...",'cryptx'); ?></th>
591 + <td><input name="cryptX_var[load_java]" <?php echo (isset($cryptX_var['load_java']) != true) ? 'checked="checked"' : ''; ?> type="radio" value="0" />&nbsp;&nbsp;<?php _e("Load the javascript in the <b>header</b> of the page.",'cryptx'); ?><br/>
592 + <input name="cryptX_var[load_java]" <?php echo (isset($cryptX_var['load_java']) == true) ? 'checked="checked"' : ''; ?> type="radio" value="1" />&nbsp;&nbsp;<?php _e("Load the javascript in the <b>footer</b> of the page.",'cryptx'); ?></td>
593 + </tr>
594 + <tr valign="top">
595 + <th scope="row" colspan="2"><input name="cryptX_var[autolink]" <?php echo (isset($cryptX_var['autolink']) == true) ? 'checked="checked"' : ''; ?> type="checkbox" />&nbsp;&nbsp;<?php _e("Add mailto to all unlinked email addresses",'cryptx'); ?></th>
596 + </tr>
597 + </table>
598 + <p><input type="submit" name="cryptX" class="button-primary" value="<?php _e('Save Changes') ?>" /></p>
599 + </div>
600 + </div>
601 + <div id="rw_cryptx_howto_box" class="postbox">
602 + <h3><?php _e("How to use CryptX in your Template",'cryptx'); ?></h3>
603 + <div class="inside">
604 + <table class="form-table">
605 + <tr>
606 + <td>In your Template you can use the following function to encrypt a email address:
607 + <p style="border:1px solid #000; background-color: #e9e9e9;padding: 10px;">
608 + <i>
609 + &lt;?php <br/>
610 + &nbsp;&nbsp;&nbsp;&nbsp; $mail="name@example.com"; <br/>
611 + &nbsp;&nbsp;&nbsp;&nbsp; $text="Contact"; <br/>
612 + &nbsp;&nbsp;&nbsp;&nbsp; $css ="email"; <br/>
613 + &nbsp;&nbsp;&nbsp;&nbsp; if (function_exists('cryptx')) { <br/>
614 + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cryptx($mail, $text, $css, 1); <br/>
615 + &nbsp;&nbsp;&nbsp;&nbsp; } else { <br/>
616 + &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; echo sprintf('&lt;a href="mailto:%s" class="%s"&gt;%s&lt;/a&gt;', $mail, $css, ($text != "" ? $text : $mail)); <br/>
617 + &nbsp;&nbsp;&nbsp;&nbsp; } <br/>
618 + ?&gt;
619 + </i></p>
620 + <ol><li>parameter is the email address.</li>
621 + <li>parameter is the linktext. If none given the email address is used.</li>
622 + <li>parameter is a css class added to the link.</li>
623 + <li>parameter is 1 for echo the encrypted email address or 0 to return the redult to a variable.</li></ol></td>
624 + </tr>
625 + </table>
626 + </div>
627 + </div>
628 + </form>
629 + <script type="text/javascript">
630 + function cryptX_bild_wechsel(select){
631 + document.getElementById("cryptXmailTo").src = select.options[select.options.selectedIndex].value;
632 + return true;
633 + }
634 + </script>
635 + <script type="text/javascript">
636 + jQuery.ajax({
637 + url: "<?php bloginfo('wpurl'); ?>?cryptx=news",
638 + success: function(data) {
639 + jQuery("#cryptx-news-content").html(data).fadeIn();
640 + },
641 + error: function() {
642 + jQuery("#cryptx-news-content").html('An error ocured while loading News.').fadeIn();
643 + }
644 + });
645 + </script>
646 + </div>
647 + </div>
648 +<?php
649 + }
379 650
380 - return do_shortcode($shortcode);
381 - }
651 +/**
652 +* Create Template functions...
653 +* $content = string to convert
654 +* $text = string to replace linktext
655 +* $css = assign a css class to the link
656 +* $echo = 0: keep result in a variable, 1: show result
657 +*/
658 +function cryptx( $content, $text="", $css="", $echo=1 ) {
659 + global $cryptX_var;
660 + $content = rw_cryptx_autolink( $content, true );
661 + $content = rw_cryptx_encryptx( $content, true );
662 + $content = rw_cryptx_linktext( $content, true );
663 + if("" != $text) {
664 + $content = preg_replace( "/(<a[^>]*>)(.*)(<\/a>)/i", '$1'.$text.'$3', $content );
665 + }
666 + if("" != $css) {
667 + $content = preg_replace( "/(<a[^>]*)(>)/i", '$1 class="'.$css.'"$2', $content );
668 + }
669 + if(1 == $echo) echo $content;
670 + return $content;
382 671 }
383 -
384 -/**
385 - * Encrypts the given content using the CryptX library and wraps it with a shortcode.
386 - *
387 - * @deprecated 4.0.5 Use cryptx_encrypt() instead.
388 - * @see cryptx_encrypt()
389 - */
390 -if (!function_exists('encryptx')) {
391 - function encryptx(string $content, ?array $args = []): string
392 - {
393 - _doing_it_wrong(
394 - 'encryptx',
395 - esc_html__('This function is deprecated. Use cryptx_encrypt() instead.', 'cryptx'),
396 - '4.0.5'
397 - );
398 -
399 - return cryptx_encrypt($content, $args);
400 - }
401 -}
672 +?>