AntiVirus - Version 1.1

Version Description

  • Testing for templates with empty content
  • Minimum requirement upgraded to 2.8 and PHP5
  • Code improvements for more speed
  • GUI changes
Download this release

Release Info

Developer sergej.mueller
Plugin Icon 128x128 AntiVirus
Version 1.1
Comparing to
See all releases

Version 1.1

antivirus.original.php ADDED
@@ -0,0 +1,1275 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Plugin Name: AntiVirus
4
+ Text Domain: antivirus
5
+ Domain Path: /lang
6
+ Description: Security solution as a smart, effectively plugin to protect your blog against exploits and spam injections.
7
+ Author: Sergej M&uuml;ller
8
+ Author URI: http://www.wpSEO.org
9
+ Plugin URI: http://wpantivirus.com
10
+ Version: 1.1
11
+ */
12
+
13
+
14
+ /* Sicherheitsabfrage */
15
+ if ( !class_exists('WP') ) {
16
+ header('Status: 403 Forbidden');
17
+ header('HTTP/1.1 403 Forbidden');
18
+ exit();
19
+ }
20
+
21
+
22
+ /**
23
+ * AntiVirus
24
+ *
25
+ * @since 0.1
26
+ */
27
+
28
+ class AntiVirus {
29
+
30
+
31
+ /* Save me! */
32
+ private static $base;
33
+
34
+
35
+ /**
36
+ * Konstruktor der Klasse
37
+ *
38
+ * @since 0.1
39
+ * @change 1.1
40
+ */
41
+
42
+ public static function init()
43
+ {
44
+ /* AUTOSAVE */
45
+ if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
46
+ return;
47
+ }
48
+
49
+ /* Plugin-Base */
50
+ self::$base = plugin_basename(__FILE__);
51
+
52
+ /* Cronjob */
53
+ if ( defined('DOING_CRON') ) {
54
+ add_action(
55
+ 'antivirus_daily_cronjob',
56
+ array(
57
+ __CLASS__,
58
+ 'exe_daily_cronjob'
59
+ )
60
+ );
61
+
62
+ /* Admin */
63
+ } elseif ( is_admin() ) {
64
+ /* AJAX */
65
+ if (defined('DOING_AJAX')) {
66
+ add_action(
67
+ 'wp_ajax_get_ajax_response',
68
+ array(
69
+ __CLASS__,
70
+ 'get_ajax_response'
71
+ )
72
+ );
73
+
74
+ /* Backend */
75
+ } else {
76
+ /* Menü */
77
+ add_action(
78
+ 'admin_menu',
79
+ array(
80
+ __CLASS__,
81
+ 'init_admin_menu'
82
+ )
83
+ );
84
+
85
+ /* GUI */
86
+ if ( self::is_current_page('home') ) {
87
+ add_action(
88
+ 'admin_print_styles',
89
+ array(
90
+ __CLASS__,
91
+ 'add_enqueue_style'
92
+ )
93
+ );
94
+ add_action(
95
+ 'admin_print_scripts',
96
+ array(
97
+ __CLASS__,
98
+ 'add_enqueue_script'
99
+ )
100
+ );
101
+ add_action(
102
+ 'init',
103
+ array(
104
+ __CLASS__,
105
+ 'load_plugin_lang'
106
+ )
107
+ );
108
+
109
+ /* Dashboard */
110
+ } else if ( self::is_current_page('index') ) {
111
+ add_action(
112
+ 'init',
113
+ array(
114
+ __CLASS__,
115
+ 'load_plugin_lang'
116
+ )
117
+ );
118
+ add_action(
119
+ 'admin_notices',
120
+ array(
121
+ __CLASS__,
122
+ 'show_dashboard_notice'
123
+ )
124
+ );
125
+
126
+ /* Plugins */
127
+ } else if ( self::is_current_page('plugins') ) {
128
+ add_action(
129
+ 'init',
130
+ array(
131
+ __CLASS__,
132
+ 'load_plugin_lang'
133
+ )
134
+ );
135
+ add_action(
136
+ 'deactivate_' .self::$base,
137
+ array(
138
+ __CLASS__,
139
+ 'clear_scheduled_hook'
140
+ )
141
+ );
142
+ add_action(
143
+ 'admin_notices',
144
+ array(
145
+ __CLASS__,
146
+ 'show_version_notice'
147
+ )
148
+ );
149
+
150
+ add_filter(
151
+ 'plugin_row_meta',
152
+ array(
153
+ __CLASS__,
154
+ 'init_row_meta'
155
+ ),
156
+ 10,
157
+ 2
158
+ );
159
+ add_filter(
160
+ 'plugin_action_links_' .self::$base,
161
+ array(
162
+ __CLASS__,
163
+ 'init_action_links'
164
+ )
165
+ );
166
+ }
167
+ }
168
+ }
169
+ }
170
+
171
+
172
+ /**
173
+ * Einbindung der Sprache
174
+ *
175
+ * @since 0.8
176
+ * @change 0.8
177
+ */
178
+
179
+ public static function load_plugin_lang()
180
+ {
181
+ load_plugin_textdomain(
182
+ 'antivirus',
183
+ false,
184
+ 'antivirus/lang'
185
+ );
186
+ }
187
+
188
+
189
+ /**
190
+ * Hinzufügen der Action-Links (Einstellungen links)
191
+ *
192
+ * @since 1.1
193
+ * @change 1.1
194
+ */
195
+
196
+ public static function init_action_links($data)
197
+ {
198
+ /* Rechte? */
199
+ if ( !current_user_can('manage_options') ) {
200
+ return $data;
201
+ }
202
+
203
+ return array_merge(
204
+ $data,
205
+ array(
206
+ sprintf(
207
+ '<a href="%s">%s</a>',
208
+ add_query_arg(
209
+ array(
210
+ 'page' => 'antivirus'
211
+ ),
212
+ admin_url('options-general.php')
213
+ ),
214
+ __('Settings')
215
+ )
216
+ )
217
+ );
218
+ }
219
+
220
+
221
+ /**
222
+ * Links in der Plugins-Verwaltung
223
+ *
224
+ * @since 0.1
225
+ * @change 1.1
226
+ *
227
+ * @param array $links Array mit Links
228
+ * @param string $file Name des Plugins
229
+ * @return array $links Array mit erweitertem Link
230
+ */
231
+
232
+ public static function init_row_meta($data, $page)
233
+ {
234
+ if ( $page == self::$base ) {
235
+ $data = array_merge(
236
+ $data,
237
+ array(
238
+ sprintf(
239
+ '<a href="https://flattr.com/thing/58179/Sicherheit-in-WordPress-Das-erste-AntiVirus-Plugin-fur-WordPress" target="_blank">%s</a>',
240
+ esc_html__('Flattr plugin', 'antivirus')
241
+ ),
242
+ sprintf(
243
+ '<a href="https://plus.google.com/110569673423509816572" target="_blank">%s</a>',
244
+ esc_html__('Follow on Google+', 'antivirus')
245
+ )
246
+ )
247
+ );
248
+ }
249
+
250
+ return $data;
251
+ }
252
+
253
+
254
+ /**
255
+ * Aktion bei Aktivierung des Plugins
256
+ *
257
+ * @since 0.1
258
+ * @change 0.8
259
+ */
260
+
261
+ public static function install()
262
+ {
263
+ /* Option anlegen */
264
+ add_option(
265
+ 'antivirus',
266
+ array(),
267
+ '',
268
+ 'no'
269
+ );
270
+
271
+ /* Cron aktivieren */
272
+ if ( self::get_option('cronjob_enable') ) {
273
+ self::init_scheduled_hook();
274
+ }
275
+ }
276
+
277
+
278
+ /**
279
+ * Uninstallation des Plugins pro MU-Blog
280
+ *
281
+ * @since 1.1
282
+ * @change 1.1
283
+ */
284
+
285
+ public static function uninstall()
286
+ {
287
+ /* Global */
288
+ global $wpdb;
289
+
290
+ /* Remove settings */
291
+ delete_option('antivirus');
292
+
293
+ /* Clean DB */
294
+ $wpdb->query("OPTIMIZE TABLE `" .$wpdb->options. "`");
295
+ }
296
+
297
+
298
+ /**
299
+ * Rückgabe eines Optionsfeldes
300
+ *
301
+ * @since 0.1
302
+ * @change 0.8
303
+ *
304
+ * @param string $field Name des Feldes
305
+ * @return mixed Wert des Feldes
306
+ */
307
+
308
+ private static function get_option($field)
309
+ {
310
+ if ( !$options = wp_cache_get('antivirus') ) {
311
+ $options = get_option('antivirus');
312
+ wp_cache_set(
313
+ 'antivirus',
314
+ $options
315
+ );
316
+ }
317
+
318
+ return @$options[$field];
319
+ }
320
+
321
+
322
+ /**
323
+ * Aktualisiert ein Optionsfeld
324
+ *
325
+ * @since 0.1
326
+ * @change 0.8
327
+ *
328
+ * @param string $field Name des Feldes
329
+ * @param mixed Wert des Feldes
330
+ */
331
+
332
+ private static function update_option($field, $value)
333
+ {
334
+ self::update_options(
335
+ array(
336
+ $field => $value
337
+ )
338
+ );
339
+ }
340
+
341
+
342
+ /**
343
+ * Aktualisiert mehrere Optionsfelder
344
+ *
345
+ * @since 0.1
346
+ * @change 0.8
347
+ *
348
+ * @param array $data Array mit Feldern
349
+ */
350
+
351
+ private static function update_options($data)
352
+ {
353
+ /* Option zuweisen */
354
+ $options = array_merge(
355
+ (array)get_option('antivirus'),
356
+ $data
357
+ );
358
+
359
+ /* DB updaten */
360
+ update_option(
361
+ 'antivirus',
362
+ $options
363
+ );
364
+
365
+ /* Cache updaten */
366
+ wp_cache_set(
367
+ 'antivirus',
368
+ $options
369
+ );
370
+ }
371
+
372
+
373
+ /**
374
+ * Initialisierung des Cronjobs
375
+ *
376
+ * @since 0.1
377
+ * @change 0.8
378
+ */
379
+
380
+ private static function init_scheduled_hook()
381
+ {
382
+ if ( !wp_next_scheduled('antivirus_daily_cronjob') ) {
383
+ wp_schedule_event(
384
+ time(),
385
+ 'daily',
386
+ 'antivirus_daily_cronjob'
387
+ );
388
+ }
389
+ }
390
+
391
+
392
+ /**
393
+ * Beendigung des Cronjobs
394
+ *
395
+ * @since 0.1
396
+ * @change 0.8
397
+ */
398
+
399
+ public static function clear_scheduled_hook()
400
+ {
401
+ if ( wp_next_scheduled('antivirus_daily_cronjob') ) {
402
+ wp_clear_scheduled_hook('antivirus_daily_cronjob');
403
+ }
404
+ }
405
+
406
+
407
+ /**
408
+ * Ausführung des Cronjobs
409
+ *
410
+ * @since 0.1
411
+ * @change 1.0
412
+ */
413
+
414
+ public static function exe_daily_cronjob()
415
+ {
416
+ /* Kein Cronjob? */
417
+ if ( !self::get_option('cronjob_enable') ) {
418
+ return;
419
+ }
420
+
421
+ /* Timestamp updaten */
422
+ self::update_option(
423
+ 'cronjob_timestamp',
424
+ time()
425
+ );
426
+
427
+ /* Files prüfen */
428
+ if ( self::check_theme_files() or self::check_permalink_structure() ) {
429
+ /* Sprache laden */
430
+ self::load_plugin_lang();
431
+
432
+ /* E-Mail-Adresse */
433
+ $email = sanitize_email(self::get_option('notify_email'));
434
+ $email = ( (!empty($email) && is_email($email)) ? $email : get_bloginfo('admin_email') );
435
+
436
+ /* Send it! */
437
+ wp_mail(
438
+ $email,
439
+ sprintf(
440
+ '[%s] %s',
441
+ get_bloginfo('name'),
442
+ esc_html__('Suspicion on a virus', 'antivirus')
443
+ ),
444
+ sprintf(
445
+ "%s\r\n%s\r\n\r\n\r\n%s\r\n%s\r\n",
446
+ esc_html__('The daily antivirus scan of your blog suggests alarm.', 'antivirus'),
447
+ get_bloginfo('url'),
448
+ esc_html__('Notify message by AntiVirus for WordPress', 'antivirus'),
449
+ esc_html__('http://wpantivirus.com', 'antivirus')
450
+ )
451
+ );
452
+
453
+ /* Alert speichern */
454
+ self::update_option(
455
+ 'cronjob_alert',
456
+ 1
457
+ );
458
+ }
459
+ }
460
+
461
+
462
+ /**
463
+ * Initialisierung der GUI
464
+ *
465
+ * @since 0.1
466
+ * @change 0.8
467
+ */
468
+
469
+ public static function init_admin_menu()
470
+ {
471
+ /* Menü anlegen */
472
+ add_options_page(
473
+ 'AntiVirus',
474
+ '<img src="' .plugins_url('antivirus/img/icon.png'). '" id="av_icon" alt="AntiVirus Icon" />AntiVirus',
475
+ 'manage_options',
476
+ 'antivirus',
477
+ array(
478
+ __CLASS__,
479
+ 'show_admin_menu'
480
+ )
481
+ );
482
+ }
483
+
484
+
485
+ /**
486
+ * Initialisierung von JavaScript
487
+ *
488
+ * @since 0.8
489
+ * @change 1.1
490
+ */
491
+
492
+ public static function add_enqueue_script()
493
+ {
494
+ /* Infos auslesen */
495
+ $data = get_plugin_data(__FILE__);
496
+
497
+ /* JS einbinden */
498
+ wp_register_script(
499
+ 'av_script',
500
+ plugins_url('js/script.js', __FILE__),
501
+ array('jquery'),
502
+ $data['Version']
503
+ );
504
+
505
+ /* Script einbinden */
506
+ wp_enqueue_script('av_script');
507
+
508
+ /* Script lokalisieren */
509
+ wp_localize_script(
510
+ 'av_script',
511
+ 'av_settings',
512
+ array(
513
+ 'nonce' => wp_create_nonce('av_ajax_nonce'),
514
+ 'ajax' => admin_url('admin-ajax.php'),
515
+ 'theme' => urlencode(self::get_theme_name()),
516
+ 'msg_1' => esc_html__('There is no virus', 'antivirus'),
517
+ 'msg_2' => esc_html__('View line', 'antivirus'),
518
+ 'msg_3' => esc_html__('Scan finished', 'antivirus')
519
+ )
520
+ );
521
+ }
522
+
523
+
524
+ /**
525
+ * Initialisierung von Stylesheets
526
+ *
527
+ * @since 0.8
528
+ * @change 1.1
529
+ */
530
+
531
+ public static function add_enqueue_style()
532
+ {
533
+ /* Infos auslesen */
534
+ $data = get_plugin_data(__FILE__);
535
+
536
+ /* CSS registrieren */
537
+ wp_register_style(
538
+ 'av_css',
539
+ plugins_url('css/style.css', __FILE__),
540
+ array(),
541
+ $data['Version']
542
+ );
543
+
544
+ /* CSS einbinden */
545
+ wp_enqueue_style('av_css');
546
+ }
547
+
548
+
549
+ /**
550
+ * Prüfung der WordPress-Version
551
+ *
552
+ * @since 0.1
553
+ * @change 0.1
554
+ *
555
+ * @param integer $version Gesuchte WP-Version
556
+ * @return boolean TRUE, wenn mindestens gesuchte
557
+ */
558
+
559
+ private static function is_min_wp($version)
560
+ {
561
+ return version_compare(
562
+ $GLOBALS['wp_version'],
563
+ $version. 'alpha',
564
+ '>='
565
+ );
566
+ }
567
+
568
+
569
+ /**
570
+ * Rückgabe des aktuellen Theme
571
+ *
572
+ * @since 0.1
573
+ * @change 0.8
574
+ *
575
+ * @return array $themes Array mit Theme-Eigenschaften
576
+ */
577
+
578
+ private static function get_current_theme()
579
+ {
580
+ /* Themes auslesen */
581
+ if ( $themes = get_themes() ) {
582
+ /* Aktuelles Theme */
583
+ if ($theme = get_current_theme()) {
584
+ if (array_key_exists((string)$theme, $themes)) {
585
+ return $themes[$theme];
586
+ }
587
+ }
588
+ }
589
+
590
+ return false;
591
+ }
592
+
593
+
594
+ /**
595
+ * Rückgabe von Dateien des aktuellen Theme
596
+ *
597
+ * @since 0.1
598
+ * @change 0.8
599
+ *
600
+ * @return array $files Array mit Dateien
601
+ */
602
+
603
+ private static function get_theme_files()
604
+ {
605
+ /* Theme vorhanden? */
606
+ if ( !$theme = self::get_current_theme() ) {
607
+ return false;
608
+ }
609
+
610
+ /* Keine Files? */
611
+ if ( empty($theme['Template Files']) ) {
612
+ return false;
613
+ }
614
+
615
+ /* Zurückgeben */
616
+ return array_unique(
617
+ array_map(
618
+ create_function(
619
+ '$v',
620
+ 'return str_replace(array(WP_CONTENT_DIR, "wp-content"), "", $v);'
621
+ ),
622
+ $theme['Template Files']
623
+ )
624
+ );
625
+ }
626
+
627
+
628
+ /**
629
+ * Rückgabe des Namen des aktuellen Theme
630
+ *
631
+ * @since 0.1
632
+ * @change 0.8
633
+ *
634
+ * @return string $theme Name des aktuellen Theme
635
+ */
636
+
637
+ private static function get_theme_name()
638
+ {
639
+ if ( $theme = self::get_current_theme() ) {
640
+ if (!empty($theme['Name'])) {
641
+ return $theme['Name'];
642
+ }
643
+ }
644
+
645
+ return false;
646
+ }
647
+
648
+
649
+ /**
650
+ * Rückgabe der WhiteList
651
+ *
652
+ * @since 0.1
653
+ * @change 0.8
654
+ *
655
+ * @return array return Array mit MD5-Werten
656
+ */
657
+
658
+ private static function get_white_list()
659
+ {
660
+ return explode(
661
+ ':',
662
+ self::get_option('white_list')
663
+ );
664
+ }
665
+
666
+
667
+ /**
668
+ * Ausführung von AJAX
669
+ *
670
+ * @since 0.1
671
+ * @change 0.8
672
+ */
673
+
674
+ public static function get_ajax_response()
675
+ {
676
+ /* Referer prüfen */
677
+ check_ajax_referer('av_ajax_nonce');
678
+
679
+ /* Zusätzliche Prüfung */
680
+ if ( empty($_POST['_action_request']) ) {
681
+ exit();
682
+ }
683
+
684
+ /* Init */
685
+ $values = array();
686
+ $output = '';
687
+
688
+ /* Ausgabe starten */
689
+ switch ($_POST['_action_request']) {
690
+ case 'get_theme_files':
691
+ self::update_option(
692
+ 'cronjob_alert',
693
+ 0
694
+ );
695
+
696
+ $values = self::get_theme_files();
697
+ break;
698
+
699
+ case 'check_theme_file':
700
+ if ( !empty($_POST['_theme_file']) && $lines = self::check_theme_file($_POST['_theme_file']) ) {
701
+ foreach ($lines as $num => $line) {
702
+ foreach ($line as $string) {
703
+ $values[] = $num;
704
+ $values[] = htmlentities($string, ENT_QUOTES);
705
+ $values[] = md5($num . $string);
706
+ }
707
+ }
708
+ }
709
+ break;
710
+
711
+ case 'update_white_list':
712
+ if ( !empty($_POST['_file_md5']) ) {
713
+ self::update_option(
714
+ 'white_list',
715
+ implode(
716
+ ':',
717
+ array_unique(
718
+ array_merge(
719
+ self::get_white_list(),
720
+ array($_POST['_file_md5'])
721
+ )
722
+ )
723
+ )
724
+ );
725
+
726
+ $values = array($_POST['_file_md5']);
727
+ }
728
+ break;
729
+
730
+ default:
731
+ break;
732
+ }
733
+
734
+ /* Ausgabe starten */
735
+ if ($values) {
736
+ $output = sprintf(
737
+ "['%s']",
738
+ implode("', '", $values)
739
+ );
740
+
741
+ /* Header senden */
742
+ header('Content-Type: plain/text');
743
+
744
+ /* Ausgeben */
745
+ echo sprintf(
746
+ '{data:%s, nonce:"%s"}',
747
+ $output,
748
+ $_POST['_ajax_nonce']
749
+ );
750
+ }
751
+
752
+ /* Raus! */
753
+ exit();
754
+ }
755
+
756
+
757
+ /**
758
+ * Rückgabe des Dateiinhaltes
759
+ *
760
+ * @since 0.1
761
+ * @change 0.8
762
+ *
763
+ * @return array $file Array mit Dateizeilen
764
+ */
765
+
766
+ private static function get_file_content($file)
767
+ {
768
+ return file(WP_CONTENT_DIR . $file);
769
+ }
770
+
771
+
772
+ /**
773
+ * Kürzung eines Strings
774
+ *
775
+ * @since 0.1
776
+ * @change 0.1
777
+ *
778
+ * @param string $line Eigenetliche Zeile als String
779
+ * @param string $tag Gesuchtes Tag
780
+ * @param integer $max Anzahl der Zeichen rechts und links
781
+ * @return string $output Gekürzter String
782
+ */
783
+
784
+ public static function get_dotted_line($line, $tag, $max = 100)
785
+ {
786
+ /* Keine Werte? */
787
+ if ( !$line or !$tag ) {
788
+ return false;
789
+ }
790
+
791
+ /* Differenz ermitteln */
792
+ if ( strlen($tag) > $max ) {
793
+ return $tag;
794
+ }
795
+
796
+ /* Differenz ermitteln */
797
+ $left = round(($max - strlen($tag)) / 2);
798
+
799
+ /* Wert konvertieren */
800
+ $tag = preg_quote($tag);
801
+
802
+ /* String kürzen */
803
+ $output = preg_replace(
804
+ '/(' .$tag. ')(.{' .$left. '}).{0,}$/',
805
+ '$1$2 ...',
806
+ $line
807
+ );
808
+ $output = preg_replace(
809
+ '/^.{0,}(.{' .$left. ',})(' .$tag. ')/',
810
+ '... $1$2',
811
+ $output
812
+ );
813
+
814
+ return $output;
815
+ }
816
+
817
+
818
+ /**
819
+ * Definition des Regexp
820
+ *
821
+ * @since 0.1
822
+ * @change 1.0
823
+ *
824
+ * @return string return Regulärer Ausdruck
825
+ */
826
+
827
+ private static function get_preg_match()
828
+ {
829
+ return '/(assert|file_get_contents|curl_exec|popen|proc_open|unserialize|eval|base64_encode|base64_decode|create_function|exec|shell_exec|system|passthru|ob_get_contents|file|curl_init|readfile|fopen|fsockopen|pfsockopen|fclose|fread|include|include_once|require|require_once|file_put_contents)\s*?\(/';
830
+ }
831
+
832
+
833
+ /**
834
+ * Prüfung einer Zeile
835
+ *
836
+ * @since 0.1
837
+ * @change 1.1
838
+ *
839
+ * @param string $line Zeile zur Prüfung
840
+ * @param integer $num Nummer zur Prüfung
841
+ * @return string $line Zeile mit Resultaten
842
+ */
843
+
844
+ private static function check_file_line($line = '', $num)
845
+ {
846
+ /* Wert trimmen */
847
+ $line = trim((string)$line);
848
+
849
+ /* Leere Werte? */
850
+ if ( !$line or !isset($num) ) {
851
+ return false;
852
+ }
853
+
854
+ /* Werte initialisieren */
855
+ $results = array();
856
+ $output = array();
857
+
858
+ /* Befehle suchen */
859
+ preg_match_all(
860
+ self::get_preg_match(),
861
+ $line,
862
+ $matches
863
+ );
864
+
865
+ /* Ergebnis speichern */
866
+ if ( $matches[1] ) {
867
+ $results = $matches[1];
868
+ }
869
+
870
+ /* Base64 suchen */
871
+ preg_match_all(
872
+ '/[\'\"\$\\ \/]*?([a-zA-Z0-9]{' .strlen(base64_encode('sergej + swetlana = love.')). ',})/',
873
+ $line,
874
+ $matches
875
+ );
876
+
877
+ /* Ergebnis speichern */
878
+ if ( $matches[1] ) {
879
+ $results = array_merge($results, $matches[1]);
880
+ }
881
+
882
+ /* Frames suchen */
883
+ preg_match_all(
884
+ '/<\s*?(frame)/',
885
+ $line,
886
+ $matches
887
+ );
888
+
889
+ /* Ergebnis speichern */
890
+ if ( $matches[1] ) {
891
+ $results = array_merge($results, $matches[1]);
892
+ }
893
+
894
+ /* Option suchen */
895
+ preg_match(
896
+ '/get_option\s*\(\s*[\'"](.*?)[\'"]\s*\)/',
897
+ $line,
898
+ $matches
899
+ );
900
+
901
+ /* Option prüfen */
902
+ if ( $matches && $matches[1] && self::check_file_line(get_option($matches[1]), $num) ) {
903
+ array_push($results, 'get_option');
904
+ }
905
+
906
+ /* Ergebnisse? */
907
+ if ( $results ) {
908
+ /* Keine Duplikate */
909
+ $results = array_unique($results);
910
+
911
+ /* White-Liste */
912
+ $md5 = self::get_white_list();
913
+
914
+ /* Resultate loopen */
915
+ foreach ($results as $tag) {
916
+ $string = str_replace(
917
+ $tag,
918
+ '@span@' .$tag. '@/span@',
919
+ self::get_dotted_line($line, $tag)
920
+ );
921
+
922
+ /* In der Whitelist? */
923
+ if (!in_array(md5($num . $string), $md5)) {
924
+ $output[] = $string;
925
+ }
926
+ }
927
+
928
+ return $output;
929
+ }
930
+
931
+ return false;
932
+ }
933
+
934
+
935
+ /**
936
+ * Prüfung der Dateien des aktuellen Theme
937
+ *
938
+ * @since 0.1
939
+ * @change 0.8
940
+ *
941
+ * @return array $results Array mit Ergebnissen
942
+ */
943
+
944
+ private static function check_theme_files()
945
+ {
946
+ /* Files vorhanden? */
947
+ if ( !$files = self::get_theme_files() ) {
948
+ return false;
949
+ }
950
+
951
+ /* Init */
952
+ $results = array();
953
+
954
+ /* Files loopen */
955
+ foreach($files as $file) {
956
+ if ($result = self::check_theme_file($file)) {
957
+ $results[$file] = $result;
958
+ }
959
+ }
960
+
961
+ /* Werte vorhanden? */
962
+ if ( !empty($results) ) {
963
+ return $results;
964
+ }
965
+
966
+ return false;
967
+ }
968
+
969
+
970
+ /**
971
+ * Prüfung einer Datei
972
+ *
973
+ * @since 0.1
974
+ * @change 0.8
975
+ *
976
+ * @param string $file Datei zur Prüfung
977
+ * @return array $results Array mit Ergebnissen
978
+ */
979
+
980
+ private static function check_theme_file($file)
981
+ {
982
+ /* Kein File? */
983
+ if ( !$file ) {
984
+ return false;
985
+ }
986
+
987
+ /* Inhalt auslesen */
988
+ if ( !$content = self::get_file_content($file) ) {
989
+ return false;
990
+ }
991
+
992
+ /* Init */
993
+ $results = array();
994
+
995
+ /* Zeilen loopen */
996
+ foreach($content as $num => $line) {
997
+ if ($result = self::check_file_line($line, $num)) {
998
+ $results[$num] = $result;
999
+ }
1000
+ }
1001
+
1002
+ /* Werte vorhanden? */
1003
+ if ( !empty($results) ) {
1004
+ return $results;
1005
+ }
1006
+
1007
+ return false;
1008
+ }
1009
+
1010
+
1011
+ /**
1012
+ * Prüfung des Permalinks
1013
+ *
1014
+ * @since 0.1
1015
+ * @change 0.8
1016
+ *
1017
+ * @return mixed $matches FALSE, wenn kein Fund
1018
+ */
1019
+
1020
+ private static function check_permalink_structure()
1021
+ {
1022
+ if ( $structure = get_option('permalink_structure') ) {
1023
+ /* Befehle suchen */
1024
+ preg_match_all(
1025
+ self::get_preg_match(),
1026
+ $structure,
1027
+ $matches
1028
+ );
1029
+
1030
+ /* Ergebnis speichern */
1031
+ if ( $matches[1] ) {
1032
+ return $matches[1];
1033
+ }
1034
+ }
1035
+
1036
+ return false;
1037
+ }
1038
+
1039
+
1040
+ /**
1041
+ * Prüfung der Admin-Seite
1042
+ *
1043
+ * @since 0.1
1044
+ * @change 0.8
1045
+ *
1046
+ * @param integer $page Gesuchte Seite
1047
+ * @return boolean TRUE, wenn die aktuelle auch die gesuchte Seite ist
1048
+ */
1049
+
1050
+ private static function is_current_page($page)
1051
+ {
1052
+ switch($page) {
1053
+ case 'home':
1054
+ return ( !empty($_REQUEST['page']) && $_REQUEST['page'] == 'antivirus' );
1055
+
1056
+ case 'index':
1057
+ case 'plugins':
1058
+ return (!empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] == sprintf('%s.php', $page));
1059
+
1060
+ default:
1061
+ return false;
1062
+ }
1063
+ }
1064
+
1065
+
1066
+ /**
1067
+ * Anzeige des Version-Hinweises
1068
+ *
1069
+ * @since 0.1
1070
+ * @change 0.8
1071
+ */
1072
+
1073
+ public static function show_version_notice()
1074
+ {
1075
+ /* Keine Ausgabe? */
1076
+ if ( self::is_min_wp('2.8') ) {
1077
+ return;
1078
+ }
1079
+
1080
+ /* Warnung */
1081
+ echo sprintf(
1082
+ '<div class="error"><p><strong>%s</strong> %s</p></div>',
1083
+ esc_html__('AntiVirus for WordPress', 'antivirus'),
1084
+ esc_html__('requires at least WordPress 2.8', 'antivirus')
1085
+ );
1086
+ }
1087
+
1088
+
1089
+ /**
1090
+ * Anzeige des Dashboard-Hinweises
1091
+ *
1092
+ * @since 0.1
1093
+ * @change 0.8
1094
+ */
1095
+
1096
+ public static function show_dashboard_notice() {
1097
+ /* Keine Ausgabe? */
1098
+ if ( !self::get_option('cronjob_alert') ) {
1099
+ return;
1100
+ }
1101
+
1102
+ /* Warnung */
1103
+ echo sprintf(
1104
+ '<div class="updated fade"><p><strong>%s:</strong> %s <a href="options-general.php?page=%s">%s</a></p></div>',
1105
+ esc_html__('Suspicion on a virus', 'antivirus'),
1106
+ esc_html__('The daily antivirus scan of your blog suggests alarm.', 'antivirus'),
1107
+ self::$base,
1108
+ esc_html__('Manual scan', 'antivirus')
1109
+ );
1110
+ }
1111
+
1112
+
1113
+ /**
1114
+ * Anzeige der GUI
1115
+ *
1116
+ * @since 0.1
1117
+ * @change 0.8
1118
+ */
1119
+
1120
+ public static function show_admin_menu() {
1121
+ /* Updates speichern */
1122
+ if ( !empty($_POST) ) {
1123
+ /* Referer prüfen */
1124
+ check_admin_referer('antivirus');
1125
+
1126
+ /* Werte zuweisen */
1127
+ $options = array(
1128
+ 'cronjob_enable' => (int)(!empty($_POST['av_cronjob_enable'])),
1129
+ 'notify_email' => sanitize_email(@$_POST['av_notify_email'])
1130
+ );
1131
+
1132
+ /* Kein Cronjob? */
1133
+ if (empty($options['cronjob_enable'])) {
1134
+ $options['notify_email'] = '';
1135
+ }
1136
+
1137
+ /* Cron stoppen? */
1138
+ if ($options['cronjob_enable'] && !self::get_option('cronjob_enable')) {
1139
+ self::init_scheduled_hook();
1140
+ } else if (!$options['cronjob_enable'] && self::get_option('cronjob_enable')) {
1141
+ self::clear_scheduled_hook();
1142
+ }
1143
+
1144
+ /* Optionen speichern */
1145
+ self::update_options($options); ?>
1146
+
1147
+ <div id="message" class="updated fade">
1148
+ <p>
1149
+ <strong>
1150
+ <?php _e('Settings saved.') ?>
1151
+ </strong>
1152
+ </p>
1153
+ </div>
1154
+ <?php } ?>
1155
+
1156
+ <div class="wrap">
1157
+ <div class="icon32"></div>
1158
+
1159
+ <h2>
1160
+ AntiVirus
1161
+ </h2>
1162
+
1163
+ <form method="post" action="">
1164
+ <?php wp_nonce_field('antivirus') ?>
1165
+
1166
+ <div id="poststuff">
1167
+ <div class="postbox">
1168
+ <h3>
1169
+ <?php esc_html_e('Completed scan', 'antivirus') ?>
1170
+ </h3>
1171
+
1172
+ <div class="inside" id="av_completed">
1173
+ <div class="output">
1174
+ <div class="<?php echo (self::check_permalink_structure() ? 'danger' : 'done') ?>"><?php esc_html_e('Permalink back door check', 'antivirus') ?> <a href="<?php esc_html_e('http://mashable.com/2009/09/05/wordpress-attack/', 'antivirus') ?>" target="_blank">Info</a></div>
1175
+ </div>
1176
+
1177
+ <ul class="agenda">
1178
+ <li>
1179
+ <p></p>
1180
+ <span>
1181
+ <?php esc_html_e('All clear', 'antivirus') ?>
1182
+ </span>
1183
+ </li>
1184
+ <li class="danger">
1185
+ <p></p>
1186
+ <span>
1187
+ <?php esc_html_e('Danger', 'antivirus') ?>
1188
+ </span>
1189
+ </li>
1190
+ </ul>
1191
+ </div>
1192
+ </div>
1193
+
1194
+ <div class="postbox">
1195
+ <h3>
1196
+ <?php esc_html_e('Manual scan', 'antivirus') ?>
1197
+ </h3>
1198
+
1199
+ <div class="inside" id="av_manual">
1200
+ <p>
1201
+ <a href="#" class="button rbutton"><?php esc_html_e('Scan the theme templates now', 'antivirus') ?></a>
1202
+ <span class="alert"></span>
1203
+ </p>
1204
+ <div class="output"></div>
1205
+ </div>
1206
+ </div>
1207
+
1208
+ <div class="postbox">
1209
+ <h3>
1210
+ <?php _e('Settings') ?>
1211
+ </h3>
1212
+
1213
+ <div class="inside">
1214
+ <table class="form-table">
1215
+ <tr>
1216
+ <td>
1217
+ <label for="av_cronjob_enable">
1218
+ <input type="checkbox" name="av_cronjob_enable" id="av_cronjob_enable" value="1" <?php checked(self::get_option('cronjob_enable'), 1) ?> />
1219
+ <?php esc_html_e('Enable the daily antivirus scan', 'antivirus') ?>
1220
+ <?php if (self::get_option('cronjob_enable') && self::get_option('cronjob_timestamp')) {
1221
+ echo sprintf(
1222
+ '&nbsp;(%s @ %s)',
1223
+ esc_html__('Last check', 'antivirus'),
1224
+ date_i18n('d.m.Y H:i:s', (self::get_option('cronjob_timestamp') + get_option('gmt_offset') * 60))
1225
+ );
1226
+ } ?>
1227
+ </label>
1228
+ <span class="shift">
1229
+ <?php esc_html_e('Alternate email address', 'antivirus') ?>:&nbsp;<input type="text" name="av_notify_email" value="<?php esc_attr_e(self::get_option('notify_email')) ?>" class="regular-text" />
1230
+ </span>
1231
+ </td>
1232
+ </tr>
1233
+ </table>
1234
+
1235
+ <p>
1236
+ <input type="submit" name="av_submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
1237
+ </p>
1238
+ </div>
1239
+ </div>
1240
+ </div>
1241
+ </form>
1242
+ </div>
1243
+ <?php }
1244
+ }
1245
+
1246
+
1247
+ /* Fire */
1248
+ add_action(
1249
+ 'plugins_loaded',
1250
+ array(
1251
+ 'AntiVirus',
1252
+ 'init'
1253
+ ),
1254
+ 99
1255
+ );
1256
+
1257
+
1258
+ /* Install */
1259
+ register_activation_hook(
1260
+ __FILE__,
1261
+ array(
1262
+ 'AntiVirus',
1263
+ 'install'
1264
+ )
1265
+ );
1266
+
1267
+
1268
+ /* Uninstall */
1269
+ register_uninstall_hook(
1270
+ __FILE__,
1271
+ array(
1272
+ 'AntiVirus',
1273
+ 'uninstall'
1274
+ )
1275
+ );
antivirus.php ADDED
@@ -0,0 +1,737 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*
3
+ Plugin Name: AntiVirus
4
+ Text Domain: antivirus
5
+ Domain Path: /lang
6
+ Description: Security solution as a smart, effectively plugin to protect your blog against exploits and spam injections.
7
+ Author: Sergej M&uuml;ller
8
+ Author URI: http://www.wpSEO.org
9
+ Plugin URI: http://wpantivirus.com
10
+ Version: 1.1
11
+ */
12
+
13
+
14
+ if ( !class_exists('WP') ) {
15
+ header('Status: 403 Forbidden');
16
+ header('HTTP/1.1 403 Forbidden');
17
+ exit();
18
+ }
19
+ class AntiVirus {
20
+ private static $base;
21
+ public static function init()
22
+ {
23
+ if ( defined('DOING_AUTOSAVE') && DOING_AUTOSAVE ) {
24
+ return;
25
+ }
26
+ self::$base = plugin_basename(__FILE__);
27
+ if ( defined('DOING_CRON') ) {
28
+ add_action(
29
+ 'antivirus_daily_cronjob',
30
+ array(
31
+ __CLASS__,
32
+ 'exe_daily_cronjob'
33
+ )
34
+ );
35
+ } elseif ( is_admin() ) {
36
+ if (defined('DOING_AJAX')) {
37
+ add_action(
38
+ 'wp_ajax_get_ajax_response',
39
+ array(
40
+ __CLASS__,
41
+ 'get_ajax_response'
42
+ )
43
+ );
44
+ } else {
45
+ add_action(
46
+ 'admin_menu',
47
+ array(
48
+ __CLASS__,
49
+ 'init_admin_menu'
50
+ )
51
+ );
52
+ if ( self::is_current_page('home') ) {
53
+ add_action(
54
+ 'admin_print_styles',
55
+ array(
56
+ __CLASS__,
57
+ 'add_enqueue_style'
58
+ )
59
+ );
60
+ add_action(
61
+ 'admin_print_scripts',
62
+ array(
63
+ __CLASS__,
64
+ 'add_enqueue_script'
65
+ )
66
+ );
67
+ add_action(
68
+ 'init',
69
+ array(
70
+ __CLASS__,
71
+ 'load_plugin_lang'
72
+ )
73
+ );
74
+ } else if ( self::is_current_page('index') ) {
75
+ add_action(
76
+ 'init',
77
+ array(
78
+ __CLASS__,
79
+ 'load_plugin_lang'
80
+ )
81
+ );
82
+ add_action(
83
+ 'admin_notices',
84
+ array(
85
+ __CLASS__,
86
+ 'show_dashboard_notice'
87
+ )
88
+ );
89
+ } else if ( self::is_current_page('plugins') ) {
90
+ add_action(
91
+ 'init',
92
+ array(
93
+ __CLASS__,
94
+ 'load_plugin_lang'
95
+ )
96
+ );
97
+ add_action(
98
+ 'deactivate_' .self::$base,
99
+ array(
100
+ __CLASS__,
101
+ 'clear_scheduled_hook'
102
+ )
103
+ );
104
+ add_action(
105
+ 'admin_notices',
106
+ array(
107
+ __CLASS__,
108
+ 'show_version_notice'
109
+ )
110
+ );
111
+ add_filter(
112
+ 'plugin_row_meta',
113
+ array(
114
+ __CLASS__,
115
+ 'init_row_meta'
116
+ ),
117
+ 10,
118
+ 2
119
+ );
120
+ add_filter(
121
+ 'plugin_action_links_' .self::$base,
122
+ array(
123
+ __CLASS__,
124
+ 'init_action_links'
125
+ )
126
+ );
127
+ }
128
+ }
129
+ }
130
+ }
131
+ public static function load_plugin_lang()
132
+ {
133
+ load_plugin_textdomain(
134
+ 'antivirus',
135
+ false,
136
+ 'antivirus/lang'
137
+ );
138
+ }
139
+ public static function init_action_links($data)
140
+ {
141
+ if ( !current_user_can('manage_options') ) {
142
+ return $data;
143
+ }
144
+ return array_merge(
145
+ $data,
146
+ array(
147
+ sprintf(
148
+ '<a href="%s">%s</a>',
149
+ add_query_arg(
150
+ array(
151
+ 'page' => 'antivirus'
152
+ ),
153
+ admin_url('options-general.php')
154
+ ),
155
+ __('Settings')
156
+ )
157
+ )
158
+ );
159
+ }
160
+ public static function init_row_meta($data, $page)
161
+ {
162
+ if ( $page == self::$base ) {
163
+ $data = array_merge(
164
+ $data,
165
+ array(
166
+ sprintf(
167
+ '<a href="https://flattr.com/thing/58179/Sicherheit-in-WordPress-Das-erste-AntiVirus-Plugin-fur-WordPress" target="_blank">%s</a>',
168
+ esc_html__('Flattr plugin', 'antivirus')
169
+ ),
170
+ sprintf(
171
+ '<a href="https://plus.google.com/110569673423509816572" target="_blank">%s</a>',
172
+ esc_html__('Follow on Google+', 'antivirus')
173
+ )
174
+ )
175
+ );
176
+ }
177
+ return $data;
178
+ }
179
+ public static function install()
180
+ {
181
+ add_option(
182
+ 'antivirus',
183
+ array(),
184
+ '',
185
+ 'no'
186
+ );
187
+ if ( self::get_option('cronjob_enable') ) {
188
+ self::init_scheduled_hook();
189
+ }
190
+ }
191
+ public static function uninstall()
192
+ {
193
+ global $wpdb;
194
+ delete_option('antivirus');
195
+ $wpdb->query("OPTIMIZE TABLE `" .$wpdb->options. "`");
196
+ }
197
+ private static function get_option($field)
198
+ {
199
+ if ( !$options = wp_cache_get('antivirus') ) {
200
+ $options = get_option('antivirus');
201
+ wp_cache_set(
202
+ 'antivirus',
203
+ $options
204
+ );
205
+ }
206
+ return @$options[$field];
207
+ }
208
+ private static function update_option($field, $value)
209
+ {
210
+ self::update_options(
211
+ array(
212
+ $field => $value
213
+ )
214
+ );
215
+ }
216
+ private static function update_options($data)
217
+ {
218
+ $options = array_merge(
219
+ (array)get_option('antivirus'),
220
+ $data
221
+ );
222
+ update_option(
223
+ 'antivirus',
224
+ $options
225
+ );
226
+ wp_cache_set(
227
+ 'antivirus',
228
+ $options
229
+ );
230
+ }
231
+ private static function init_scheduled_hook()
232
+ {
233
+ if ( !wp_next_scheduled('antivirus_daily_cronjob') ) {
234
+ wp_schedule_event(
235
+ time(),
236
+ 'daily',
237
+ 'antivirus_daily_cronjob'
238
+ );
239
+ }
240
+ }
241
+ public static function clear_scheduled_hook()
242
+ {
243
+ if ( wp_next_scheduled('antivirus_daily_cronjob') ) {
244
+ wp_clear_scheduled_hook('antivirus_daily_cronjob');
245
+ }
246
+ }
247
+ public static function exe_daily_cronjob()
248
+ {
249
+ if ( !self::get_option('cronjob_enable') ) {
250
+ return;
251
+ }
252
+ self::update_option(
253
+ 'cronjob_timestamp',
254
+ time()
255
+ );
256
+ if ( self::check_theme_files() or self::check_permalink_structure() ) {
257
+ self::load_plugin_lang();
258
+ $email = sanitize_email(self::get_option('notify_email'));
259
+ $email = ( (!empty($email) && is_email($email)) ? $email : get_bloginfo('admin_email') );
260
+ wp_mail(
261
+ $email,
262
+ sprintf(
263
+ '[%s] %s',
264
+ get_bloginfo('name'),
265
+ esc_html__('Suspicion on a virus', 'antivirus')
266
+ ),
267
+ sprintf(
268
+ "%s\r\n%s\r\n\r\n\r\n%s\r\n%s\r\n",
269
+ esc_html__('The daily antivirus scan of your blog suggests alarm.', 'antivirus'),
270
+ get_bloginfo('url'),
271
+ esc_html__('Notify message by AntiVirus for WordPress', 'antivirus'),
272
+ esc_html__('http://wpantivirus.com', 'antivirus')
273
+ )
274
+ );
275
+ self::update_option(
276
+ 'cronjob_alert',
277
+ 1
278
+ );
279
+ }
280
+ }
281
+ public static function init_admin_menu()
282
+ {
283
+ add_options_page(
284
+ 'AntiVirus',
285
+ '<img src="' .plugins_url('antivirus/img/icon.png'). '" id="av_icon" alt="AntiVirus Icon" />AntiVirus',
286
+ 'manage_options',
287
+ 'antivirus',
288
+ array(
289
+ __CLASS__,
290
+ 'show_admin_menu'
291
+ )
292
+ );
293
+ }
294
+ public static function add_enqueue_script()
295
+ {
296
+ $data = get_plugin_data(__FILE__);
297
+ wp_register_script(
298
+ 'av_script',
299
+ plugins_url('js/script.js', __FILE__),
300
+ array('jquery'),
301
+ $data['Version']
302
+ );
303
+ wp_enqueue_script('av_script');
304
+ wp_localize_script(
305
+ 'av_script',
306
+ 'av_settings',
307
+ array(
308
+ 'nonce' => wp_create_nonce('av_ajax_nonce'),
309
+ 'ajax'=> admin_url('admin-ajax.php'),
310
+ 'theme'=> urlencode(self::get_theme_name()),
311
+ 'msg_1'=> esc_html__('There is no virus', 'antivirus'),
312
+ 'msg_2' => esc_html__('View line', 'antivirus'),
313
+ 'msg_3' => esc_html__('Scan finished', 'antivirus')
314
+ )
315
+ );
316
+ }
317
+ public static function add_enqueue_style()
318
+ {
319
+ $data = get_plugin_data(__FILE__);
320
+ wp_register_style(
321
+ 'av_css',
322
+ plugins_url('css/style.css', __FILE__),
323
+ array(),
324
+ $data['Version']
325
+ );
326
+ wp_enqueue_style('av_css');
327
+ }
328
+ private static function is_min_wp($version)
329
+ {
330
+ return version_compare(
331
+ $GLOBALS['wp_version'],
332
+ $version. 'alpha',
333
+ '>='
334
+ );
335
+ }
336
+ private static function get_current_theme()
337
+ {
338
+ if ( $themes = get_themes() ) {
339
+ if ($theme = get_current_theme()) {
340
+ if (array_key_exists((string)$theme, $themes)) {
341
+ return $themes[$theme];
342
+ }
343
+ }
344
+ }
345
+ return false;
346
+ }
347
+ private static function get_theme_files()
348
+ {
349
+ if ( !$theme = self::get_current_theme() ) {
350
+ return false;
351
+ }
352
+ if ( empty($theme['Template Files']) ) {
353
+ return false;
354
+ }
355
+ return array_unique(
356
+ array_map(
357
+ create_function(
358
+ '$v',
359
+ 'return str_replace(array(WP_CONTENT_DIR, "wp-content"), "", $v);'
360
+ ),
361
+ $theme['Template Files']
362
+ )
363
+ );
364
+ }
365
+ private static function get_theme_name()
366
+ {
367
+ if ( $theme = self::get_current_theme() ) {
368
+ if (!empty($theme['Name'])) {
369
+ return $theme['Name'];
370
+ }
371
+ }
372
+ return false;
373
+ }
374
+ private static function get_white_list()
375
+ {
376
+ return explode(
377
+ ':',
378
+ self::get_option('white_list')
379
+ );
380
+ }
381
+ public static function get_ajax_response()
382
+ {
383
+ check_ajax_referer('av_ajax_nonce');
384
+ if ( empty($_POST['_action_request']) ) {
385
+ exit();
386
+ }
387
+ $values = array();
388
+ $output = '';
389
+ switch ($_POST['_action_request']) {
390
+ case 'get_theme_files':
391
+ self::update_option(
392
+ 'cronjob_alert',
393
+ 0
394
+ );
395
+ $values = self::get_theme_files();
396
+ break;
397
+ case 'check_theme_file':
398
+ if ( !empty($_POST['_theme_file']) && $lines = self::check_theme_file($_POST['_theme_file']) ) {
399
+ foreach ($lines as $num => $line) {
400
+ foreach ($line as $string) {
401
+ $values[] = $num;
402
+ $values[] = htmlentities($string, ENT_QUOTES);
403
+ $values[] = md5($num . $string);
404
+ }
405
+ }
406
+ }
407
+ break;
408
+ case 'update_white_list':
409
+ if ( !empty($_POST['_file_md5']) ) {
410
+ self::update_option(
411
+ 'white_list',
412
+ implode(
413
+ ':',
414
+ array_unique(
415
+ array_merge(
416
+ self::get_white_list(),
417
+ array($_POST['_file_md5'])
418
+ )
419
+ )
420
+ )
421
+ );
422
+ $values = array($_POST['_file_md5']);
423
+ }
424
+ break;
425
+ default:
426
+ break;
427
+ }
428
+ if ($values) {
429
+ $output = sprintf(
430
+ "['%s']",
431
+ implode("', '", $values)
432
+ );
433
+ header('Content-Type: plain/text');
434
+ echo sprintf(
435
+ '{data:%s, nonce:"%s"}',
436
+ $output,
437
+ $_POST['_ajax_nonce']
438
+ );
439
+ }
440
+ exit();
441
+ }
442
+ private static function get_file_content($file)
443
+ {
444
+ return file(WP_CONTENT_DIR . $file);
445
+ }
446
+ public static function get_dotted_line($line, $tag, $max = 100)
447
+ {
448
+ if ( !$line or !$tag ) {
449
+ return false;
450
+ }
451
+ if ( strlen($tag) > $max ) {
452
+ return $tag;
453
+ }
454
+ $left = round(($max - strlen($tag)) / 2);
455
+ $tag = preg_quote($tag);
456
+ $output = preg_replace(
457
+ '/(' .$tag. ')(.{' .$left. '}).{0,}$/',
458
+ '$1$2 ...',
459
+ $line
460
+ );
461
+ $output = preg_replace(
462
+ '/^.{0,}(.{' .$left. ',})(' .$tag. ')/',
463
+ '... $1$2',
464
+ $output
465
+ );
466
+ return $output;
467
+ }
468
+ private static function get_preg_match()
469
+ {
470
+ return '/(assert|file_get_contents|curl_exec|popen|proc_open|unserialize|eval|base64_encode|base64_decode|create_function|exec|shell_exec|system|passthru|ob_get_contents|file|curl_init|readfile|fopen|fsockopen|pfsockopen|fclose|fread|include|include_once|require|require_once|file_put_contents)\s*?\(/';
471
+ }
472
+ private static function check_file_line($line = '', $num)
473
+ {
474
+ $line = trim((string)$line);
475
+ if ( !$line or !isset($num) ) {
476
+ return false;
477
+ }
478
+ $results = array();
479
+ $output = array();
480
+ preg_match_all(
481
+ self::get_preg_match(),
482
+ $line,
483
+ $matches
484
+ );
485
+ if ( $matches[1] ) {
486
+ $results = $matches[1];
487
+ }
488
+ preg_match_all(
489
+ '/[\'\"\$\\ \/]*?([a-zA-Z0-9]{' .strlen(base64_encode('sergej + swetlana = love.')). ',})/',
490
+ $line,
491
+ $matches
492
+ );
493
+ if ( $matches[1] ) {
494
+ $results = array_merge($results, $matches[1]);
495
+ }
496
+ preg_match_all(
497
+ '/<\s*?(frame)/',
498
+ $line,
499
+ $matches
500
+ );
501
+ if ( $matches[1] ) {
502
+ $results = array_merge($results, $matches[1]);
503
+ }
504
+ preg_match(
505
+ '/get_option\s*\(\s*[\'"](.*?)[\'"]\s*\)/',
506
+ $line,
507
+ $matches
508
+ );
509
+ if ( $matches && $matches[1] && self::check_file_line(get_option($matches[1]), $num) ) {
510
+ array_push($results, 'get_option');
511
+ }
512
+ if ( $results ) {
513
+ $results = array_unique($results);
514
+ $md5 = self::get_white_list();
515
+ foreach ($results as $tag) {
516
+ $string = str_replace(
517
+ $tag,
518
+ '@span@' .$tag. '@/span@',
519
+ self::get_dotted_line($line, $tag)
520
+ );
521
+ if (!in_array(md5($num . $string), $md5)) {
522
+ $output[] = $string;
523
+ }
524
+ }
525
+ return $output;
526
+ }
527
+ return false;
528
+ }
529
+ private static function check_theme_files()
530
+ {
531
+ if ( !$files = self::get_theme_files() ) {
532
+ return false;
533
+ }
534
+ $results = array();
535
+ foreach($files as $file) {
536
+ if ($result = self::check_theme_file($file)) {
537
+ $results[$file] = $result;
538
+ }
539
+ }
540
+ if ( !empty($results) ) {
541
+ return $results;
542
+ }
543
+ return false;
544
+ }
545
+ private static function check_theme_file($file)
546
+ {
547
+ if ( !$file ) {
548
+ return false;
549
+ }
550
+ if ( !$content = self::get_file_content($file) ) {
551
+ return false;
552
+ }
553
+ $results = array();
554
+ foreach($content as $num => $line) {
555
+ if ($result = self::check_file_line($line, $num)) {
556
+ $results[$num] = $result;
557
+ }
558
+ }
559
+ if ( !empty($results) ) {
560
+ return $results;
561
+ }
562
+ return false;
563
+ }
564
+ private static function check_permalink_structure()
565
+ {
566
+ if ( $structure = get_option('permalink_structure') ) {
567
+ preg_match_all(
568
+ self::get_preg_match(),
569
+ $structure,
570
+ $matches
571
+ );
572
+ if ( $matches[1] ) {
573
+ return $matches[1];
574
+ }
575
+ }
576
+ return false;
577
+ }
578
+ private static function is_current_page($page)
579
+ {
580
+ switch($page) {
581
+ case 'home':
582
+ return ( !empty($_REQUEST['page']) && $_REQUEST['page'] == 'antivirus' );
583
+ case 'index':
584
+ case 'plugins':
585
+ return (!empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] == sprintf('%s.php', $page));
586
+ default:
587
+ return false;
588
+ }
589
+ }
590
+ public static function show_version_notice()
591
+ {
592
+ if ( self::is_min_wp('2.8') ) {
593
+ return;
594
+ }
595
+ echo sprintf(
596
+ '<div class="error"><p><strong>%s</strong> %s</p></div>',
597
+ esc_html__('AntiVirus for WordPress', 'antivirus'),
598
+ esc_html__('requires at least WordPress 2.8', 'antivirus')
599
+ );
600
+ }
601
+ public static function show_dashboard_notice() {
602
+ if ( !self::get_option('cronjob_alert') ) {
603
+ return;
604
+ }
605
+ echo sprintf(
606
+ '<div class="updated fade"><p><strong>%s:</strong> %s <a href="options-general.php?page=%s">%s</a></p></div>',
607
+ esc_html__('Suspicion on a virus', 'antivirus'),
608
+ esc_html__('The daily antivirus scan of your blog suggests alarm.', 'antivirus'),
609
+ self::$base,
610
+ esc_html__('Manual scan', 'antivirus')
611
+ );
612
+ }
613
+ public static function show_admin_menu() {
614
+ if ( !empty($_POST) ) {
615
+ check_admin_referer('antivirus');
616
+ $options = array(
617
+ 'cronjob_enable' => (int)(!empty($_POST['av_cronjob_enable'])),
618
+ 'notify_email'=> sanitize_email(@$_POST['av_notify_email'])
619
+ );
620
+ if (empty($options['cronjob_enable'])) {
621
+ $options['notify_email'] = '';
622
+ }
623
+ if ($options['cronjob_enable'] && !self::get_option('cronjob_enable')) {
624
+ self::init_scheduled_hook();
625
+ } else if (!$options['cronjob_enable'] && self::get_option('cronjob_enable')) {
626
+ self::clear_scheduled_hook();
627
+ }
628
+ self::update_options($options); ?>
629
+ <div id="message" class="updated fade">
630
+ <p>
631
+ <strong>
632
+ <?php _e('Settings saved.') ?>
633
+ </strong>
634
+ </p>
635
+ </div>
636
+ <?php } ?>
637
+ <div class="wrap">
638
+ <div class="icon32"></div>
639
+ <h2>
640
+ AntiVirus
641
+ </h2>
642
+ <form method="post" action="">
643
+ <?php wp_nonce_field('antivirus') ?>
644
+ <div id="poststuff">
645
+ <div class="postbox">
646
+ <h3>
647
+ <?php esc_html_e('Completed scan', 'antivirus') ?>
648
+ </h3>
649
+ <div class="inside" id="av_completed">
650
+ <div class="output">
651
+ <div class="<?php echo (self::check_permalink_structure() ? 'danger' : 'done') ?>"><?php esc_html_e('Permalink back door check', 'antivirus') ?> <a href="<?php esc_html_e('http://mashable.com/2009/09/05/wordpress-attack/', 'antivirus') ?>" target="_blank">Info</a></div>
652
+ </div>
653
+ <ul class="agenda">
654
+ <li>
655
+ <p></p>
656
+ <span>
657
+ <?php esc_html_e('All clear', 'antivirus') ?>
658
+ </span>
659
+ </li>
660
+ <li class="danger">
661
+ <p></p>
662
+ <span>
663
+ <?php esc_html_e('Danger', 'antivirus') ?>
664
+ </span>
665
+ </li>
666
+ </ul>
667
+ </div>
668
+ </div>
669
+ <div class="postbox">
670
+ <h3>
671
+ <?php esc_html_e('Manual scan', 'antivirus') ?>
672
+ </h3>
673
+ <div class="inside" id="av_manual">
674
+ <p>
675
+ <a href="#" class="button rbutton"><?php esc_html_e('Scan the theme templates now', 'antivirus') ?></a>
676
+ <span class="alert"></span>
677
+ </p>
678
+ <div class="output"></div>
679
+ </div>
680
+ </div>
681
+ <div class="postbox">
682
+ <h3>
683
+ <?php _e('Settings') ?>
684
+ </h3>
685
+ <div class="inside">
686
+ <table class="form-table">
687
+ <tr>
688
+ <td>
689
+ <label for="av_cronjob_enable">
690
+ <input type="checkbox" name="av_cronjob_enable" id="av_cronjob_enable" value="1" <?php checked(self::get_option('cronjob_enable'), 1) ?> />
691
+ <?php esc_html_e('Enable the daily antivirus scan', 'antivirus') ?>
692
+ <?php if (self::get_option('cronjob_enable') && self::get_option('cronjob_timestamp')) {
693
+ echo sprintf(
694
+ '&nbsp;(%s @ %s)',
695
+ esc_html__('Last check', 'antivirus'),
696
+ date_i18n('d.m.Y H:i:s', (self::get_option('cronjob_timestamp') + get_option('gmt_offset') * 60))
697
+ );
698
+ } ?>
699
+ </label>
700
+ <span class="shift">
701
+ <?php esc_html_e('Alternate email address', 'antivirus') ?>:&nbsp;<input type="text" name="av_notify_email" value="<?php esc_attr_e(self::get_option('notify_email')) ?>" class="regular-text" />
702
+ </span>
703
+ </td>
704
+ </tr>
705
+ </table>
706
+ <p>
707
+ <input type="submit" name="av_submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
708
+ </p>
709
+ </div>
710
+ </div>
711
+ </div>
712
+ </form>
713
+ </div>
714
+ <?php }
715
+ }
716
+ add_action(
717
+ 'plugins_loaded',
718
+ array(
719
+ 'AntiVirus',
720
+ 'init'
721
+ ),
722
+ 99
723
+ );
724
+ register_activation_hook(
725
+ __FILE__,
726
+ array(
727
+ 'AntiVirus',
728
+ 'install'
729
+ )
730
+ );
731
+ register_uninstall_hook(
732
+ __FILE__,
733
+ array(
734
+ 'AntiVirus',
735
+ 'uninstall'
736
+ )
737
+ );
css/style.css ADDED
@@ -0,0 +1 @@
 
1
+ div.icon32{background:url(../img/icon32.png) no-repeat;}div.postbox h3{cursor:default;}img#ab_icon{width:11px;height:9px;border:0;}#poststuff>.postbox:first-child{margin-top:20px;}table.form-table{clear:none;width:auto;margin:0;}table.form-table #antivirus_cronjob_enable{margin:-3px 0 0;}table.form-table span.shift{display:block;margin:2px 0 0 18px;*margin-left:26px;}#av_completed{height:1%;overflow:hidden;}#av_completed .output{float:left;}#av_completed .output div{margin-top:8px;}#av_completed .output div a{margin:0 0 -1px 5px;padding:1px 4px 2px;font-size:10px;background:#FFF;text-decoration:none;-moz-border-radius:2px;-webkit-border-radius:2px;}#av_completed .agenda{float:right;border:1px solid #dfdfdf;margin:4px 6px 0;padding:2px 5px 2px 6px;border-radius:5px;-o-border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;}#av_completed .agenda li{clear:both;height:1%;margin:0 !important;overflow:hidden;}#av_completed .agenda li p{float:left;width:10px;height:10px;margin:3px 3px 0 0 !important;background:green;-moz-border-radius:2px;-webkit-border-radius:2px;}#av_completed .agenda li.danger p{background:red;}#av_completed .agenda li span{float:left;font-size:10px;}#av_manual{height:1%;overflow:hidden;}#av_manual a.button{float:left;}#av_manual .alert{float:left;color:green;margin:1px 10px 0;border:1px solid green;display:none;padding:2px 5px;border-radius:5px;-o-border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;}.inside .output{clear:both;height:1%;padding:0 0 6px;overflow:hidden;}.inside .output div{float:left;color:#FFF;margin:12px 6px 0;padding:8px 12px 10px;font-size:11px !important;background:orange;line-height:1.2em;border-radius:8px;-o-border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px;}.inside .output div.done{background:green;}.inside .output div.danger{width:97%;background:red;}.inside .output div p{padding:10px;overflow:hidden;background:#f9f9f9;white-space:nowrap;border-radius:8px;-o-border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px;}.inside .output div p a{float:left;color:#646464;margin:0 6px 12px 0;display:block;border:1px solid #bbb;padding:2px 5px;background:#f2f2f2;text-decoration:none;border-radius:5px;-o-border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;}.inside .output div p a:hover{color:#000;border:1px solid #646464;}.inside .output div p code{clear:both;float:left;color:#000;padding:2px 5px;border-radius:2px;-o-border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;}.inside .output div p code span{padding:2px;background:yellow;}
css/style.orginal.css ADDED
@@ -0,0 +1,188 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* @group GUI */
2
+
3
+ div.icon32 {
4
+ background: url(../img/icon32.png) no-repeat;
5
+ }
6
+ div.postbox h3 {
7
+ cursor: default;
8
+ }
9
+ img#ab_icon {
10
+ width: 11px;
11
+ height: 9px;
12
+ border: 0;
13
+ }
14
+ #poststuff > .postbox:first-child {
15
+ margin-top: 20px;
16
+ }
17
+
18
+ /* @end group */
19
+
20
+
21
+ /* @group Tabelle */
22
+
23
+ table.form-table {
24
+ clear: none;
25
+ width: auto;
26
+ margin: 0;
27
+ }
28
+ table.form-table #antivirus_cronjob_enable {
29
+ margin: -3px 0 0;
30
+ }
31
+ table.form-table span.shift {
32
+ display: block;
33
+ margin: 2px 0 0 18px;
34
+ *margin-left: 26px;
35
+ }
36
+
37
+ /* @end group */
38
+
39
+
40
+ /* @group Complete Scan */
41
+
42
+ #av_completed {
43
+ height: 1%;
44
+ overflow: hidden;
45
+ }
46
+ #av_completed .output {
47
+ float: left;
48
+ }
49
+ #av_completed .output div {
50
+ margin-top: 8px;
51
+ }
52
+ #av_completed .output div a {
53
+ margin: 0 0 -1px 5px;
54
+ padding: 1px 4px 2px;
55
+ font-size: 10px;
56
+ background: #FFF;
57
+ text-decoration: none;
58
+ -moz-border-radius: 2px;
59
+ -webkit-border-radius: 2px;
60
+ }
61
+ #av_completed .agenda {
62
+ float: right;
63
+ border: 1px solid #DFDFDF;
64
+ margin: 4px 6px 0;
65
+ padding: 2px 5px 2px 6px;
66
+ border-radius: 5px;
67
+ -o-border-radius: 5px;
68
+ -moz-border-radius: 5px;
69
+ -webkit-border-radius: 5px;
70
+ }
71
+ #av_completed .agenda li {
72
+ clear: both;
73
+ height: 1%;
74
+ margin: 0 !important;
75
+ overflow: hidden;
76
+ }
77
+ #av_completed .agenda li p {
78
+ float: left;
79
+ width: 10px;
80
+ height: 10px;
81
+ margin: 3px 3px 0 0 !important;
82
+ background: green;
83
+ -moz-border-radius: 2px;
84
+ -webkit-border-radius: 2px;
85
+ }
86
+ #av_completed .agenda li.danger p {
87
+ background: red;
88
+ }
89
+ #av_completed .agenda li span {
90
+ float: left;
91
+ font-size: 10px;
92
+ }
93
+
94
+ /* @end group */
95
+
96
+
97
+ /* @group Manual Scan */
98
+
99
+ #av_manual {
100
+ height: 1%;
101
+ overflow: hidden;
102
+ }
103
+ #av_manual a.button {
104
+ float: left;
105
+ }
106
+ #av_manual .alert {
107
+ float: left;
108
+ color: green;
109
+ margin: 1px 10px 0;
110
+ border: 1px solid green;
111
+ display: none;
112
+ padding: 2px 5px;
113
+ border-radius: 5px;
114
+ -o-border-radius: 5px;
115
+ -moz-border-radius: 5px;
116
+ -webkit-border-radius: 5px;
117
+ }
118
+
119
+ .inside .output {
120
+ clear: both;
121
+ height: 1%;
122
+ padding: 0 0 6px;
123
+ overflow: hidden;
124
+ }
125
+ .inside .output div {
126
+ float: left;
127
+ color: #FFF;
128
+ margin: 12px 6px 0;
129
+ padding: 8px 12px 10px;
130
+ font-size: 11px !important;
131
+ background: orange;
132
+ line-height: 1.2em;
133
+ border-radius: 8px;
134
+ -o-border-radius: 8px;
135
+ -moz-border-radius: 8px;
136
+ -webkit-border-radius: 8px;
137
+ }
138
+ .inside .output div.done {
139
+ background: green;
140
+ }
141
+ .inside .output div.danger {
142
+ width: 97%;
143
+ background: red;
144
+ }
145
+ .inside .output div p {
146
+ padding: 10px;
147
+ overflow: hidden;
148
+ background: #F9F9F9;
149
+ white-space: nowrap;
150
+ border-radius: 8px;
151
+ -o-border-radius: 8px;
152
+ -moz-border-radius: 8px;
153
+ -webkit-border-radius: 8px;
154
+ }
155
+ .inside .output div p a {
156
+ float: left;
157
+ color: #646464;
158
+ margin: 0 6px 12px 0;
159
+ display: block;
160
+ border: 1px solid #bbbbbb;
161
+ padding: 2px 5px;
162
+ background: #f2f2f2;
163
+ text-decoration: none;
164
+ border-radius: 5px;
165
+ -o-border-radius: 5px;
166
+ -moz-border-radius: 5px;
167
+ -webkit-border-radius: 5px;
168
+ }
169
+ .inside .output div p a:hover {
170
+ color: #000;
171
+ border: 1px solid #646464;
172
+ }
173
+ .inside .output div p code {
174
+ clear: both;
175
+ float: left;
176
+ color: #000;
177
+ padding: 2px 5px;
178
+ border-radius: 2px;
179
+ -o-border-radius: 2px;
180
+ -moz-border-radius: 2px;
181
+ -webkit-border-radius: 2px;
182
+ }
183
+ .inside .output div p code span {
184
+ padding: 2px;
185
+ background: yellow;
186
+ }
187
+
188
+ /* @end group */
img/icon.png ADDED
Binary file
img/icon32.png ADDED
Binary file
js/script.js ADDED
@@ -0,0 +1 @@
 
1
+ jQuery(document).ready(function($){av_nonce=av_settings.nonce;av_ajax=av_settings.ajax;av_theme=av_settings.theme;av_msg_1=av_settings.msg_1;av_msg_2=av_settings.msg_2;av_msg_3=av_settings.msg_3;function check_theme_file(current){var id=parseInt(current||0);var file=av_files[id];$.post(av_ajax,{'action':'get_ajax_response','_ajax_nonce':av_nonce,'_theme_file':file,'_action_request':'check_theme_file'},function(input){var item=$('#av_template_'+id);if(input){input=eval('('+input+')');if(!input.nonce||input.nonce !=av_nonce){return;}item.addClass('danger');var i=0;var lines=input.data;var len=lines.length;for(i;i<len;i=i+3){var num=parseInt(lines[i])+1;var line=lines[i+1].replace(/@span@/g,'<span>').replace(/@\/span@/g,'</span>');var md5=lines[i+2];var file=item.text();item.append('<p><a href="#" id="'+md5+'">'+av_msg_1+'</a><a href="theme-editor.php?file='+file+'&theme='+av_theme+'&dir=theme" target="_blank">'+av_msg_2+' '+num+'</a><code>'+line+'</code></p>');$('#'+md5).click(function(){$.post(av_ajax,{'action':'get_ajax_response','_ajax_nonce':av_nonce,'_file_md5':$(this).attr('id'),'_action_request':'update_white_list'},function(input){if(!input){return;}input=eval('('+input+')');if(!input.nonce||input.nonce !=av_nonce){return;}var parent=$('#'+input.data[0]).parent();if(parent.parent().children().length<=1){parent.parent().hide('slow').remove();}parent.hide('slow').remove();});return false;});}}else{item.addClass('done');}av_files_loaded++;if(av_files_loaded>=av_files_total){$('#av_manual .alert').text(av_msg_3).fadeIn().fadeOut().fadeIn().fadeOut().fadeIn().animate({opacity:1.0},500).fadeOut('slow',function(){$(this).empty();});}else{check_theme_file(id+1);}});}$('#av_manual a.button').click(function(){$.post(av_ajax,{action:'get_ajax_response',_ajax_nonce:av_nonce,_action_request:'get_theme_files'},function(input){if(!input){return;}input=eval('('+input+')');if(!input.nonce||input.nonce !=av_nonce){return;}var output='';av_files=input.data;av_files_total=av_files.length;av_files_loaded=0;jQuery.each(av_files,function(i,val){output+='<div id="av_template_'+i+'">'+val+'</div>';});$('#av_manual .alert').empty();$('#av_manual .output').empty().append(output);check_theme_file();});return false;});function manage_options(){var id='av_cronjob_enable';$('#'+id).parents('.form-table').find('input[id!="'+id+'"]').attr('disabled',!$('#'+id).attr('checked'));}$('#av_cronjob_enable').click(manage_options);manage_options();});
js/script.orginal.js ADDED
@@ -0,0 +1,184 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ jQuery(document).ready(
2
+ function($) {
3
+ /* Init */
4
+ av_nonce = av_settings.nonce;
5
+ av_ajax = av_settings.ajax;
6
+ av_theme = av_settings.theme;
7
+ av_msg_1 = av_settings.msg_1;
8
+ av_msg_2 = av_settings.msg_2;
9
+ av_msg_3 = av_settings.msg_3;
10
+
11
+ /* Einzelne Datei prüfen */
12
+ function check_theme_file(current) {
13
+ /* ID umwandeln */
14
+ var id = parseInt(current || 0);
15
+
16
+ /* File ermitteln */
17
+ var file = av_files[id];
18
+
19
+ /* Request starten */
20
+ $.post(
21
+ av_ajax,
22
+ {
23
+ 'action': 'get_ajax_response',
24
+ '_ajax_nonce': av_nonce,
25
+ '_theme_file': file,
26
+ '_action_request': 'check_theme_file'
27
+ },
28
+ function(input) {
29
+ /* Wert initialisieren */
30
+ var item = $('#av_template_' + id);
31
+
32
+ /* Daten vorhanden? */
33
+ if (input) {
34
+ /* Input konvertieren */
35
+ input = eval('(' + input + ')');
36
+
37
+ /* Sicherheitscheck */
38
+ if (!input.nonce || input.nonce != av_nonce) {
39
+ return;
40
+ }
41
+
42
+ /* Farblich anpassen */
43
+ item.addClass('danger');
44
+
45
+ /* Werte initialisieren */
46
+ var i = 0;
47
+ var lines = input.data;
48
+ var len = lines.length;
49
+
50
+ /* Zeilen loopen */
51
+ for (i; i < len; i = i + 3) {
52
+ var num = parseInt(lines[i]) + 1;
53
+ var line = lines[i + 1].replace(/@span@/g, '<span>').replace(/@\/span@/g, '</span>');
54
+ var md5 = lines[i + 2];
55
+ var file = item.text();
56
+
57
+ item.append('<p><a href="#" id="' + md5 + '">' + av_msg_1 + '</a> <a href="theme-editor.php?file=' + file + '&theme=' + av_theme + '&dir=theme" target="_blank">' + av_msg_2 + ' ' + num + '</a><code>' + line + '</code></p>');
58
+
59
+ $('#' + md5).click(
60
+ function() {
61
+ $.post(
62
+ av_ajax,
63
+ {
64
+ 'action': 'get_ajax_response',
65
+ '_ajax_nonce': av_nonce,
66
+ '_file_md5': $(this).attr('id'),
67
+ '_action_request': 'update_white_list'
68
+ },
69
+ function(input) {
70
+ /* Keine Daten? */
71
+ if (!input) {
72
+ return;
73
+ }
74
+
75
+ /* Input konvertieren */
76
+ input = eval('(' + input + ')');
77
+
78
+ /* Sicherheitscheck */
79
+ if (!input.nonce || input.nonce != av_nonce) {
80
+ return;
81
+ }
82
+
83
+ var parent = $('#' + input.data[0]).parent();
84
+
85
+ if (parent.parent().children().length <= 1) {
86
+ parent.parent().hide('slow').remove();
87
+ }
88
+ parent.hide('slow').remove();
89
+ }
90
+ );
91
+
92
+ return false;
93
+ }
94
+ );
95
+ }
96
+ } else {
97
+ item.addClass('done');
98
+ }
99
+
100
+ /* Counter erhöhen */
101
+ av_files_loaded ++;
102
+
103
+ /* Hinweis ausgeben */
104
+ if (av_files_loaded >= av_files_total) {
105
+ $('#av_manual .alert').text(av_msg_3).fadeIn().fadeOut().fadeIn().fadeOut().fadeIn().animate({opacity: 1.0}, 500).fadeOut(
106
+ 'slow',
107
+ function() {
108
+ $(this).empty();
109
+ }
110
+ );
111
+ } else {
112
+ check_theme_file(id + 1);
113
+ }
114
+ }
115
+ );
116
+ }
117
+
118
+ /* Tempates Check */
119
+ $('#av_manual a.button').click(
120
+ function() {
121
+ /* Request */
122
+ $.post(
123
+ av_ajax,
124
+ {
125
+ action: 'get_ajax_response',
126
+ _ajax_nonce: av_nonce,
127
+ _action_request: 'get_theme_files'
128
+ },
129
+ function(input) {
130
+ /* Keine Daten? */
131
+ if (!input) {
132
+ return;
133
+ }
134
+
135
+ /* Input konvertieren */
136
+ input = eval('(' + input + ')');
137
+
138
+ /* Sicherheitscheck */
139
+ if (!input.nonce || input.nonce != av_nonce) {
140
+ return;
141
+ }
142
+
143
+ /* Wert initialisieren */
144
+ var output = '';
145
+
146
+ /* Globale Werte */
147
+ av_files = input.data;
148
+ av_files_total = av_files.length;
149
+ av_files_loaded = 0;
150
+
151
+ /* Files visualisieren */
152
+ jQuery.each(
153
+ av_files,
154
+ function(i, val) {
155
+ output += '<div id="av_template_' + i + '">' + val + '</div>';
156
+ }
157
+ );
158
+
159
+ /* Werte zuweisen */
160
+ $('#av_manual .alert').empty();
161
+ $('#av_manual .output').empty().append(output);
162
+
163
+ /* Files loopen */
164
+ check_theme_file();
165
+ }
166
+ );
167
+
168
+ return false;
169
+ }
170
+ );
171
+
172
+ /* Checkboxen markieren */
173
+ function manage_options() {
174
+ var id = 'av_cronjob_enable';
175
+ $('#' + id).parents('.form-table').find('input[id!="' + id + '"]').attr('disabled', !$('#' + id).attr('checked'));
176
+ }
177
+
178
+ /* Checkbox überwachen */
179
+ $('#av_cronjob_enable').click(manage_options);
180
+
181
+ /* Fire! */
182
+ manage_options();
183
+ }
184
+ );
lang/antivirus-ca.mo ADDED
Binary file
lang/antivirus-ca.po ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: AntiVirus\n"
4
+ "POT-Creation-Date: \n"
5
+ "PO-Revision-Date: \n"
6
+ "Last-Translator: Robert Buj Gelonch <robert.buj@gmail.com>\n"
7
+ "Language-Team: Robert Buj Gelonch\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=utf-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "X-Poedit-Language: Catalan\n"
12
+ "X-Poedit-Country: SPAIN\n"
13
+ "X-Poedit-SourceCharset: utf-8\n"
14
+ "X-Poedit-KeywordsList: __;_e\n"
15
+ "X-Poedit-Basepath: .\n"
16
+ "X-Poedit-SearchPath-0: .\n"
17
+
18
+ msgid "Suspicion on a virus"
19
+ msgstr "Sospita d'un virus"
20
+
21
+ msgid "The daily antivirus scan of your blog suggests alarm."
22
+ msgstr "L'escaneig diari de virus del vostre blog suggereix alarmes."
23
+
24
+ msgid "AntiVirus for WordPress"
25
+ msgstr "AntiVirus per a WordPress"
26
+
27
+ msgid "requires at least WordPress 2.5"
28
+ msgstr "necessita com a mínim WordPress 2.5"
29
+
30
+ msgid "Last"
31
+ msgstr "Últim"
32
+
33
+ msgid "View line"
34
+ msgstr "Visualitzar la línia"
35
+
36
+ msgid "There is no virus"
37
+ msgstr "No hi han virus"
38
+
39
+ msgid "Scan finished"
40
+ msgstr "Escaneig finalitzat"
41
+
42
+ msgid "Enable the daily antivirus scan and send the administrator an e-mail if suspicion on a virus"
43
+ msgstr "Habilitar l'escaneig diari de virus i enviar un correu electrònic a l'administrador si es sospita d'un virus"
44
+
45
+ msgid "Alternate e-mail address"
46
+ msgstr "Adreça de correu electrònica alternativa"
47
+
48
+ msgid "Manual scan"
49
+ msgstr "Escaneig manual"
50
+
51
+ msgid "Scan the templates now"
52
+ msgstr "Escanejar ara les plantilles"
53
+
54
+ msgid "About"
55
+ msgstr "Quant a"
56
+
lang/antivirus-de_DE.mo ADDED
Binary file
lang/antivirus-de_DE.po ADDED
@@ -0,0 +1,83 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: AntiVirus\n"
4
+ "POT-Creation-Date: \n"
5
+ "PO-Revision-Date: \n"
6
+ "Last-Translator: Sergej Müller\n"
7
+ "Language-Team: Sergej Müller\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=utf-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "X-Poedit-Language: German\n"
12
+ "X-Poedit-Country: GERMANY\n"
13
+ "X-Poedit-SourceCharset: utf-8\n"
14
+ "X-Poedit-KeywordsList: __;_e\n"
15
+ "X-Poedit-Basepath: .\n"
16
+ "X-Poedit-SearchPath-0: .\n"
17
+
18
+ msgid "Suspicion on a virus"
19
+ msgstr "Virusverdacht"
20
+
21
+ msgid "AntiVirus for WordPress"
22
+ msgstr "AntiVirus für WordPress"
23
+
24
+ msgid "requires at least WordPress 2.8"
25
+ msgstr "benötigt WordPress 2.8"
26
+
27
+ msgid "Last check"
28
+ msgstr "Zuletzt"
29
+
30
+ msgid "View line"
31
+ msgstr "Zeige Zeile"
32
+
33
+ msgid "There is no virus"
34
+ msgstr "Ist kein Virus"
35
+
36
+ msgid "Scan finished"
37
+ msgstr "Prüfung abgeschlossen"
38
+
39
+ msgid "Enable the daily antivirus scan"
40
+ msgstr "Tägliche AntiVirus-Prüfung durchführen"
41
+
42
+ msgid "Alternate email address"
43
+ msgstr "Alternative E-Mail-Adresse"
44
+
45
+ msgid "Completed scan"
46
+ msgstr "Durchgeführte Prüfung"
47
+
48
+ msgid "Permalink back door check"
49
+ msgstr "Check auf das Sicherheitsrisiko im Permalink"
50
+
51
+ msgid "http://mashable.com/2009/09/05/wordpress-attack/"
52
+ msgstr "http://blog.wordpress-deutschland.org/2009/09/05/aeltere-wordpress-versionen-ziel-von-angriffen.html"
53
+
54
+ msgid "Manual scan"
55
+ msgstr "Manuelle Prüfung"
56
+
57
+ msgid "Scan the theme templates now"
58
+ msgstr "Theme-Templates jetzt prüfen"
59
+
60
+ msgid "The daily antivirus scan of your blog suggests alarm."
61
+ msgstr "Die tägliche AntiVirus-Prüfung des Blogs schlägt Alarm."
62
+
63
+ msgid "All clear"
64
+ msgstr "Verdachtlos"
65
+
66
+ msgid "Danger"
67
+ msgstr "Gefahr"
68
+
69
+ msgid "Flattr plugin"
70
+ msgstr "Plugin flattern"
71
+
72
+ msgid "Follow on Google+"
73
+ msgstr "Auf Google+ folgen"
74
+
75
+ msgid "Security solution as a smart, effectively plugin to protect your blog against exploits and spam injections."
76
+ msgstr "Kostenfreie Sicherheitslösung als Plugin zur Früherkennung und Warnung vor bösartigen Injektionen in Theme-Templates."
77
+
78
+ msgid "Notify message by AntiVirus for WordPress"
79
+ msgstr "Benachrichtigung von AntiVirus für WordPress"
80
+
81
+ msgid "http://wpantivirus.com"
82
+ msgstr "http://wpantivirus.de"
83
+
lang/antivirus-fa_IR.mo ADDED
Binary file
lang/antivirus-fa_IR.po ADDED
@@ -0,0 +1,90 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: AntiVirus\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2009-12-02 00:46+0330\n"
6
+ "PO-Revision-Date: \n"
7
+ "Last-Translator: Sergej Müller\n"
8
+ "Language-Team: Persian wordpress <mostafa.s1990@gmail.com>\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Poedit-Language: Persian\n"
13
+ "X-Poedit-Country: IRAN, ISLAMIC REPUBLIC OF\n"
14
+ "X-Poedit-SourceCharset: utf-8\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-Basepath: .\n"
17
+ "X-Poedit-SearchPath-0: .\n"
18
+
19
+ msgid "Settings"
20
+ msgstr "تنظیمات"
21
+
22
+ msgid "Suspicion on a virus"
23
+ msgstr "مظنون به یک ویروس"
24
+
25
+ msgid "The daily antivirus scan of your blog suggests alarm."
26
+ msgstr "روزانه آنتی ویروس بررسی میکند در وبلاگ شما و اشاره میکند اخطار"
27
+
28
+ msgid "AntiVirus for WordPress"
29
+ msgstr "آنتی ویروس برای وردپرس"
30
+
31
+ msgid "requires at least WordPress 2.6"
32
+ msgstr "به نسخه 2.6 وردپرس نياز دارد"
33
+
34
+ msgid "Manual scan"
35
+ msgstr "بررسی دستی"
36
+
37
+ msgid "Plugin"
38
+ msgstr "افزونه"
39
+
40
+ msgid "Version"
41
+ msgstr "نسخه"
42
+
43
+ msgid "Author"
44
+ msgstr "نویسنده"
45
+
46
+ msgid "There is no virus"
47
+ msgstr "بدون ویروس یافت شد"
48
+
49
+ msgid "View line"
50
+ msgstr "مشاهده خط"
51
+
52
+ msgid "Scan finished"
53
+ msgstr "پایان بررسی"
54
+
55
+ msgid "Settings saved."
56
+ msgstr "تنظیمات ذخیره شد."
57
+
58
+ msgid "All clear"
59
+ msgstr "پاك كردن همه"
60
+
61
+ msgid "Danger"
62
+ msgstr "خطر"
63
+
64
+ msgid "Enable the daily antivirus scan and send the administrator an e-mail if suspicion on a virus"
65
+ msgstr "فعال بودن آنتی ویروس, روزانه بررسی میکند و در صورت داشتن ویروس در قالب پیغامی به ایمیل شما ارسال میکند. "
66
+
67
+ msgid "Last"
68
+ msgstr "آخرین"
69
+
70
+ msgid "Alternate e-mail address"
71
+ msgstr "پست الکترونیک برای اطلاع"
72
+
73
+ msgid "Save Changes"
74
+ msgstr "ذخیره تغییرات"
75
+
76
+ msgid "Completed scan"
77
+ msgstr "اسكن كامل شد"
78
+
79
+ msgid "Permalink back door check"
80
+ msgstr "چك كردن"
81
+
82
+ msgid "http://mashable.com/2009/09/05/wordpress-attack/"
83
+ msgstr "http://mashable.com/2009/09/05/wordpress-attack/"
84
+
85
+ msgid "Scan the theme templates now"
86
+ msgstr "بررسي در قالب"
87
+
88
+ msgid "About"
89
+ msgstr "درباره"
90
+
lang/antivirus-it_IT.mo ADDED
Binary file
lang/antivirus-it_IT.po ADDED
@@ -0,0 +1,56 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: AntiVirus\n"
4
+ "POT-Creation-Date: \n"
5
+ "PO-Revision-Date: \n"
6
+ "Last-Translator: Sergej Müller\n"
7
+ "Language-Team: Sergej Müller\n"
8
+ "MIME-Version: 1.0\n"
9
+ "Content-Type: text/plain; charset=utf-8\n"
10
+ "Content-Transfer-Encoding: 8bit\n"
11
+ "X-Poedit-Language: German\n"
12
+ "X-Poedit-Country: GERMANY\n"
13
+ "X-Poedit-SourceCharset: utf-8\n"
14
+ "X-Poedit-KeywordsList: __;_e\n"
15
+ "X-Poedit-Basepath: .\n"
16
+ "X-Poedit-SearchPath-0: .\n"
17
+
18
+ msgid "Suspicion on a virus"
19
+ msgstr "Sospetto di un virus"
20
+
21
+ msgid "The daily antivirus scan of your blog suggests alarm."
22
+ msgstr "La scansione giornaliera di antivirus del tuo blog ti avvisa ti un possibile virus"
23
+
24
+ msgid "AntiVirus for WordPress"
25
+ msgstr "AntiVirus per WordPress"
26
+
27
+ msgid "requires at least WordPress 2.5"
28
+ msgstr "requires at least WordPress 2.5"
29
+
30
+ msgid "Last"
31
+ msgstr "Ultimo"
32
+
33
+ msgid "View line"
34
+ msgstr "Vedi Linea"
35
+
36
+ msgid "There is no virus"
37
+ msgstr "Non ci sono virus"
38
+
39
+ msgid "Scan finished"
40
+ msgstr "Scansione finita"
41
+
42
+ msgid "Enable the daily antivirus scan and send the administrator an e-mail if suspicion on a virus"
43
+ msgstr "Abilita la scansione giornaliera e inviami una e-mail se ci sono sospetti di virus"
44
+
45
+ msgid "Alternate e-mail address"
46
+ msgstr "Altri E-Mail"
47
+
48
+ msgid "Manual scan"
49
+ msgstr "Scansione manuale"
50
+
51
+ msgid "Scan the templates now"
52
+ msgstr "Scansiona i template ora"
53
+
54
+ msgid "About"
55
+ msgstr "Informazioni"
56
+
lang/antivirus-lt_LT.mo ADDED
Binary file
lang/antivirus-lt_LT.po ADDED
@@ -0,0 +1,115 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: AntiVirus v0.4\n"
4
+ "Report-Msgid-Bugs-To: k.vycius@gmail.com\n"
5
+ "POT-Creation-Date: 2009-07-12\n"
6
+ "PO-Revision-Date: 2009-09-08 16:45+0100\n"
7
+ "Last-Translator: Sergej Müller\n"
8
+ "Language-Team: Karolis Vyčius <k.vycius@gmail.com>\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "Plural-Forms: nplurals=2; plural=n != 1;\n"
13
+ "X-Poedit-Language: Lithuanian\n"
14
+ "X-Poedit-Country: LITHUANIA\n"
15
+ "X-Poedit-SourceCharset: utf-8\n"
16
+ "X-Poedit-KeywordsList: __;_e;__ngettext:1,2;_n:1,2;__ngettext_noop:1,2;_n_noop:1,2;_c,_nc:4c,1,2;_x:1,2c;_nx:4c,1,2;_nx_noop:4c,1,2\n"
17
+ "X-Poedit-Basepath: ../\n"
18
+ "X-Textdomain-Support: yes\n"
19
+ "X-Poedit-SearchPath-0: .\n"
20
+
21
+ #: antivirus.php:134
22
+ #: antivirus.php:150
23
+ #: antivirus.php:722
24
+ msgid "Settings"
25
+ msgstr "Nustatymai"
26
+
27
+ #@ antivirus
28
+ #: antivirus.php:206
29
+ #: antivirus.php:466
30
+ msgid "Suspicion on a virus"
31
+ msgstr "Įtarimas dėl viruso"
32
+
33
+ #@ antivirus
34
+ #: antivirus.php:209
35
+ #: antivirus.php:467
36
+ msgid "The daily antivirus scan of your blog suggests alarm."
37
+ msgstr "Kasdieninė virusų apsauga jūsų bloge problemos"
38
+
39
+ #@ antivirus
40
+ #: antivirus.php:452
41
+ #: antivirus.php:477
42
+ msgid "AntiVirus for WordPress"
43
+ msgstr "Wordpress Antivirus"
44
+
45
+ #@ antivirus
46
+ #: antivirus.php:453
47
+ msgid "requires at least WordPress 2.6"
48
+ msgstr "reikalinga bent WordPress 2.6"
49
+
50
+ #@ antivirus
51
+ #: antivirus.php:469
52
+ #: antivirus.php:746
53
+ msgid "Manual scan"
54
+ msgstr "Rankinis skenavimas"
55
+
56
+ #: antivirus.php:476
57
+ msgid "Plugin"
58
+ msgstr "Priedas"
59
+
60
+ #: antivirus.php:478
61
+ msgid "Version"
62
+ msgstr "Versija"
63
+
64
+ #: antivirus.php:480
65
+ msgid "Author"
66
+ msgstr "Autorius"
67
+
68
+ #@ antivirus
69
+ #: antivirus.php:624
70
+ msgid "There is no virus"
71
+ msgstr "Jokių virusų nebuvo rasta!"
72
+
73
+ #@ antivirus
74
+ #: antivirus.php:624
75
+ msgid "View line"
76
+ msgstr "Žiūrėti"
77
+
78
+ #@ antivirus
79
+ #: antivirus.php:659
80
+ msgid "Scan finished"
81
+ msgstr "Skenavimas baigtas"
82
+
83
+ #: antivirus.php:705
84
+ msgid "Settings saved."
85
+ msgstr "Nustatymai išsaugoti"
86
+
87
+ #@ antivirus
88
+ #: antivirus.php:730
89
+ msgid "Enable the daily antivirus scan and send the administrator an e-mail if suspicion on a virus"
90
+ msgstr "Įjungti kasdieninį virusų skenavimą ir jeigu virusas bus rastas informuoti administratorių el-paštu apie virusus."
91
+
92
+ #@ antivirus
93
+ #: antivirus.php:731
94
+ msgid "Last"
95
+ msgstr "Paskutinis"
96
+
97
+ #@ antivirus
98
+ #: antivirus.php:734
99
+ msgid "Alternate e-mail address"
100
+ msgstr "Alternatyvus e-mail adresas"
101
+
102
+ #: antivirus.php:740
103
+ msgid "Save Changes"
104
+ msgstr "Išsaugoti pakeitimus"
105
+
106
+ #@ antivirus
107
+ #: antivirus.php:750
108
+ msgid "Scan the templates now"
109
+ msgstr "Skenuoti temą dabar"
110
+
111
+ #@ antivirus
112
+ #: antivirus.php:756
113
+ msgid "About"
114
+ msgstr "Apie"
115
+
lang/antivirus-pt_BR.mo ADDED
Binary file
lang/antivirus-pt_BR.po ADDED
@@ -0,0 +1,143 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: AntiVirus\n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2010-11-17 17:54-0300\n"
6
+ "PO-Revision-Date: \n"
7
+ "Last-Translator: Sergej Müller\n"
8
+ "Language-Team: Fernando Lopes <contato@fernandolopes.com.br>\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Poedit-Language: Portuguese\n"
13
+ "X-Poedit-Country: BRAZIL\n"
14
+ "X-Poedit-SourceCharset: utf-8\n"
15
+ "X-Poedit-KeywordsList: __;_e\n"
16
+ "X-Poedit-Basepath: .\n"
17
+ "X-Poedit-SearchPath-0: ..\n"
18
+
19
+ #: ../antivirus.php:149
20
+ #: ../antivirus.php:165
21
+ #: ../antivirus.php:681
22
+ msgid "Settings"
23
+ msgstr "Configurações"
24
+
25
+ #: ../antivirus.php:245
26
+ #: ../antivirus.php:590
27
+ msgid "Suspicion on a virus"
28
+ msgstr "Suspeita de vírus"
29
+
30
+ #: ../antivirus.php:249
31
+ #: ../antivirus.php:591
32
+ msgid "The daily antivirus scan of your blog suggests alarm."
33
+ msgstr "Alarme da verificação de AntiVírus diária do seu blog."
34
+
35
+ #: ../antivirus.php:251
36
+ msgid "Notify message by AntiVirus for WordPress"
37
+ msgstr "Notifique mensagem por AntiVirus para WordPress"
38
+
39
+ #: ../antivirus.php:252
40
+ msgid "http://wpantivirus.com"
41
+ msgstr "http://wpantivirus.com"
42
+
43
+ #: ../antivirus.php:311
44
+ msgid "There is no virus"
45
+ msgstr "Não há vírus"
46
+
47
+ #: ../antivirus.php:312
48
+ msgid "View line"
49
+ msgstr "Ver linha"
50
+
51
+ #: ../antivirus.php:313
52
+ msgid "Scan finished"
53
+ msgstr "Verificação terminada"
54
+
55
+ #: ../antivirus.php:580
56
+ #: ../antivirus.php:600
57
+ msgid "AntiVirus for WordPress"
58
+ msgstr "AntiVírus para WordPress"
59
+
60
+ #: ../antivirus.php:581
61
+ msgid "requires at least WordPress 2.7"
62
+ msgstr "requer pelo menos WordPress v2.7"
63
+
64
+ #: ../antivirus.php:593
65
+ #: ../antivirus.php:669
66
+ msgid "Manual scan"
67
+ msgstr "Verificação Manual"
68
+
69
+ #: ../antivirus.php:602
70
+ msgid "by"
71
+ msgstr "por"
72
+
73
+ #: ../antivirus.php:603
74
+ msgid "Follow on Twitter"
75
+ msgstr "Siga no Twitter"
76
+
77
+ #: ../antivirus.php:605
78
+ msgid "Learn about wpSEO"
79
+ msgstr "Saiba mais sobre wpSEO"
80
+
81
+ #: ../antivirus.php:630
82
+ msgid "Settings saved."
83
+ msgstr "Configurações salvas."
84
+
85
+ #: ../antivirus.php:645
86
+ msgid "Completed scan"
87
+ msgstr "Verificação completa"
88
+
89
+ #: ../antivirus.php:649
90
+ msgid "Permalink back door check"
91
+ msgstr "Checar Link Permanente sobre ataque pela porta dos fundos"
92
+
93
+ #: ../antivirus.php:649
94
+ msgid "http://mashable.com/2009/09/05/wordpress-attack/"
95
+ msgstr "http://mashable.com/2009/09/05/wordpress-attack/"
96
+
97
+ #: ../antivirus.php:655
98
+ msgid "All clear"
99
+ msgstr "Tudo limpo"
100
+
101
+ #: ../antivirus.php:661
102
+ msgid "Danger"
103
+ msgstr "Perigo"
104
+
105
+ #: ../antivirus.php:673
106
+ msgid "Scan the theme templates now"
107
+ msgstr "Verificar os temas agora"
108
+
109
+ #: ../antivirus.php:689
110
+ msgid "Enable the daily antivirus scan"
111
+ msgstr "Ative a verificação diária do antivírus"
112
+
113
+ #: ../antivirus.php:693
114
+ msgid "Last check"
115
+ msgstr "Última verificação"
116
+
117
+ #: ../antivirus.php:699
118
+ msgid "Alternate email address"
119
+ msgstr "Endereço de email alternativo"
120
+
121
+ #: ../antivirus.php:705
122
+ msgid "Save Changes"
123
+ msgstr "Salvar Alterações"
124
+
125
+ #: ../antivirus.php:711
126
+ msgid "About"
127
+ msgstr "Sobre"
128
+
129
+ #~ msgid "Plugin"
130
+ #~ msgstr "Plugin"
131
+ #~ msgid "Version"
132
+ #~ msgstr "Versão"
133
+ #~ msgid "Author"
134
+ #~ msgstr "Autor"
135
+ #~ msgid ""
136
+ #~ "Enable the daily antivirus scan and send the administrator an e-mail if "
137
+ #~ "suspicion on a virus"
138
+ #~ msgstr ""
139
+ #~ "Ativar o antivírus diariamente, verificar e enviar ao administrador um "
140
+ #~ "email se há suspeita de um vírus."
141
+ #~ msgid "Last"
142
+ #~ msgstr "Último"
143
+
lang/antivirus-ro_RO.mo ADDED
Binary file
lang/antivirus-ro_RO.po ADDED
@@ -0,0 +1,87 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: \n"
4
+ "Report-Msgid-Bugs-To: \n"
5
+ "POT-Creation-Date: 2010-08-16 20:18+0200\n"
6
+ "PO-Revision-Date: \n"
7
+ "Last-Translator: Sergej Müller\n"
8
+ "Language-Team: \n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Poedit-KeywordsList: __;_e\n"
13
+ "X-Poedit-Basepath: .\n"
14
+ "X-Poedit-SearchPath-0: C:\\Documents and Settings\\Administrator\\Desktop\\quotes-collection\\languages\n"
15
+
16
+ msgid "Settings"
17
+ msgstr "Setări"
18
+
19
+ msgid "Suspicion on a virus"
20
+ msgstr "Suspiciune de virus"
21
+
22
+ msgid "The daily antivirus scan of your blog suggests alarm."
23
+ msgstr "Scanarea zilnică a șablonului activ al blogului tău te alarmează."
24
+
25
+ msgid "There is no virus"
26
+ msgstr "Nu este virus"
27
+
28
+ msgid "View line"
29
+ msgstr "Afișează linia"
30
+
31
+ msgid "Scan finished"
32
+ msgstr "Scanare finalizată"
33
+
34
+ msgid "AntiVirus for WordPress"
35
+ msgstr "AntiVirus pentru WordPress"
36
+
37
+ msgid "requires at least WordPress 2.7"
38
+ msgstr "Necesită WordPress 2.7 sau mai recent"
39
+
40
+ msgid "Manual scan"
41
+ msgstr "Scanare manuală"
42
+
43
+ msgid "by"
44
+ msgstr "de"
45
+
46
+ msgid "Follow on Twitter"
47
+ msgstr "Urmărește pe Twitter"
48
+
49
+ msgid "Learn about wpSEO"
50
+ msgstr "Află despre wpSEO"
51
+
52
+ msgid "Settings saved."
53
+ msgstr "Setările au fost salvate"
54
+
55
+ msgid "Completed scan"
56
+ msgstr "Scanare completă"
57
+
58
+ msgid "Permalink back door check"
59
+ msgstr "Verificare legătură permanentă pentru back door"
60
+
61
+ msgid "http://mashable.com/2009/09/05/wordpress-attack/"
62
+ msgstr "http://mashable.com/2009/09/05/wordpress-attack/"
63
+
64
+ msgid "All clear"
65
+ msgstr "În regulă"
66
+
67
+ msgid "Danger"
68
+ msgstr "Pericol"
69
+
70
+ msgid "Scan the theme templates now"
71
+ msgstr "Scanează acum directorul șablonului activ"
72
+
73
+ msgid "Enable the daily antivirus scan"
74
+ msgstr "Activează scanarea zilnică"
75
+
76
+ msgid "Last check"
77
+ msgstr "Ultima verificare"
78
+
79
+ msgid "Alternate email address"
80
+ msgstr "Adresă email alternativă"
81
+
82
+ msgid "Save Changes"
83
+ msgstr "Salvează schimbările"
84
+
85
+ msgid "About"
86
+ msgstr "Despre"
87
+
lang/antivirus-ru_RU.mo ADDED
Binary file
lang/antivirus-ru_RU.po ADDED
@@ -0,0 +1,77 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ msgid ""
2
+ msgstr ""
3
+ "Project-Id-Version: Antivirus\n"
4
+ "Report-Msgid-Bugs-To: wp-polyglots@lists.automattic.com\n"
5
+ "POT-Creation-Date: 2009-05-27 20:55+0000\n"
6
+ "PO-Revision-Date: \n"
7
+ "Last-Translator: Sergej Müller\n"
8
+ "Language-Team: Elvis <presley_el@mail.ru>\n"
9
+ "MIME-Version: 1.0\n"
10
+ "Content-Type: text/plain; charset=UTF-8\n"
11
+ "Content-Transfer-Encoding: 8bit\n"
12
+ "X-Poedit-Language: Russian\n"
13
+ "X-Poedit-Country: RUSSIAN FEDERATION\n"
14
+
15
+ msgid "Suspicion on a virus"
16
+ msgstr "Подозрение на вирус"
17
+
18
+ msgid "AntiVirus for WordPress"
19
+ msgstr "AntiVirus для WordPress"
20
+
21
+ msgid "requires at least WordPress 2.7"
22
+ msgstr "требуется по меньшей мере WordPress 2.7"
23
+
24
+ msgid "Last check"
25
+ msgstr "Последний"
26
+
27
+ msgid "View line"
28
+ msgstr "Посмотреть строку в редакторе"
29
+
30
+ msgid "There is no virus"
31
+ msgstr "Это не вирус"
32
+
33
+ msgid "Scan finished"
34
+ msgstr "Сканирование завершено"
35
+
36
+ msgid "Enable the daily antivirus scan"
37
+ msgstr "Включить ежедневное сканирование антивирусом"
38
+
39
+ msgid "Alternate email address"
40
+ msgstr "Ввести альтернативный email"
41
+
42
+ msgid "Completed scan"
43
+ msgstr "Завершено сканирование"
44
+
45
+ msgid "Permalink back door check"
46
+ msgstr "Проверка на Permalink back door"
47
+
48
+ msgid "http://mashable.com/2009/09/05/wordpress-attack/"
49
+ msgstr "http://blog.wordpress-deutschland.org/2009/09/05/aeltere-wordpress-versionen-ziel-von-angriffen.html"
50
+
51
+ msgid "Manual scan"
52
+ msgstr "Ручное сканирование"
53
+
54
+ msgid "Scan the templates now"
55
+ msgstr "Сканировать скины на вирусы"
56
+
57
+ msgid "The daily antivirus scan of your blog suggests alarm."
58
+ msgstr "Ежедневный осмотр AntiVirus в блоге бьет тревогу."
59
+
60
+ msgid "All clear"
61
+ msgstr "Все ясно"
62
+
63
+ msgid "Danger"
64
+ msgstr "Опасность"
65
+
66
+ msgid "Learn about wpSEO"
67
+ msgstr "Узнайте больше о wpSEO"
68
+
69
+ msgid "Follow on Twitter"
70
+ msgstr "Следуйте на Twitter"
71
+
72
+ msgid "About"
73
+ msgstr "О плагине"
74
+
75
+ msgid "by"
76
+ msgstr "от"
77
+
readme.txt ADDED
@@ -0,0 +1,100 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === AntiVirus ===
2
+ Contributors: sergej.mueller
3
+ Tags: antivirus, virus, antispam, spam, scanner
4
+ Requires at least: 2.8
5
+ Tested up to: 3.3
6
+ Stable tag: trunk
7
+
8
+ AntiVirus for WordPress is a smart and effective solution to protect your blog against exploits and spam injections.
9
+
10
+
11
+ == Description ==
12
+ *AntiVirus for WordPress* is a smart and effective solution to protect your blog against exploits and spam injections. Malware protection for your blog.
13
+
14
+
15
+ = Features =
16
+ * WordPress 3.x ready: Design as well as technical
17
+ * Detect the [WordPress permalink back door](http://mashable.com/2009/09/05/wordpress-attack/ "WordPress permalink back door")
18
+ * Quick & Dirty: activate, check, done!
19
+ * Manual testing with immediate result of the infected files
20
+ * Daily automatic check with email notification
21
+ * Whitelist: Mark the suspicion as "No virus"
22
+ * Clean up after uninstall the plugin
23
+ * English, German, Italian, Persian, Russian
24
+
25
+
26
+ = Related Links =
27
+ * [Blog](http://playground.ebiene.de "Playground Blog")
28
+ * [Flattr](http://flattr.com/profile/sergej.mueller "Flattr")
29
+ * [Google+](https://plus.google.com/110569673423509816572 "Google+")
30
+ * [Portfolio](http://ebiene.de "Portfolio")
31
+ * [Plugin page](http://wpantivirus.com "WPAntiVirus.com")
32
+ * [Other plugins](http://wpcoder.de "Other plugins")
33
+ * [Documentation](http://playground.ebiene.de/1577/antivirus-wordpress-plugin/ "AntiVirus for WordPress")
34
+
35
+
36
+ == Changelog ==
37
+ = 1.1 =
38
+ * Testing for templates with empty content
39
+ * Minimum requirement upgraded to 2.8 and PHP5
40
+ * Code improvements for more speed
41
+ * GUI changes
42
+
43
+ = 1.0 =
44
+ * More security checks (Email & Regexp)
45
+
46
+ = 0.9 =
47
+ * Changes for the current WordPress virus
48
+
49
+ = 0.8 =
50
+ * Support for WordPress 3.0
51
+ * System requirements: WordPress 2.7
52
+ * Code optimization
53
+
54
+ = 0.7 =
55
+ * Advanced templates check
56
+
57
+ = 0.6 =
58
+ * WordPress 2.9 support
59
+
60
+ = 0.5 =
61
+ * Add security scan for the current [WordPress permalink back door](http://mashable.com/2009/09/05/wordpress-attack/ "WordPress permalink back door")
62
+ * Software architecture changes
63
+
64
+ = 0.4 =
65
+ * Adds support for WordPress new changelog readme.txt standard
66
+ * Various changes for more speed, usability and security
67
+
68
+ = 0.3 =
69
+ * Add alternate e-mail address (admin e-mail address as default)
70
+ * Admin notice on dashboard where it has found the virus suspicion
71
+ * Added blog URL in e-mail
72
+ * WordPress 2.8 support
73
+ * Check for hidden iframes
74
+ * Bugfix for IE problem with box positions
75
+ * Cleanup the source code
76
+ * Language support for Persian
77
+
78
+ = 0.2 =
79
+ * Whitelist: Mark the suspicion as "No virus"
80
+ * Improving the output formatting
81
+ * Add WPlize library for option data
82
+ * Language support for Italian
83
+
84
+ = 0.1 =
85
+ * AntiVirus for WordPress goes online
86
+
87
+
88
+ == Screenshots ==
89
+
90
+ 1. WordPress AntiVirus settings
91
+
92
+
93
+ == Installation ==
94
+ 1. Download *AntiVirus* plugin
95
+ 1. Unzip the archive
96
+ 1. Upload the folder *antivirus* into *../wp-content/plugins/*
97
+ 1. Go to tab *Plugins*
98
+ 1. Activate *AntiVirus*
99
+ 1. Edit settings
100
+ 1. Ready
screenshot-1.png ADDED
Binary file