AntiVirus - Version 1.3

Version Description

  • Xmas Edition
Download this release

Release Info

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

Version 1.3

antivirus.original.php ADDED
@@ -0,0 +1,1259 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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://wpseo.de
9
+ Plugin URI: http://wpantivirus.com
10
+ Version: 1.3
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.2
40
+ */
41
+
42
+ public static function init()
43
+ {
44
+ /* AUTOSAVE */
45
+ if ( (defined('DOING_AUTOSAVE') && DOING_AUTOSAVE) or (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) ) {
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
+ /* Actions */
77
+ add_action(
78
+ 'init',
79
+ array(
80
+ __CLASS__,
81
+ 'load_plugin_lang'
82
+ )
83
+ );
84
+ add_action(
85
+ 'admin_menu',
86
+ array(
87
+ __CLASS__,
88
+ 'add_sidebar_menu'
89
+ )
90
+ );
91
+ add_action(
92
+ 'admin_bar_menu',
93
+ array(
94
+ __CLASS__,
95
+ 'add_adminbar_menu'
96
+ ),
97
+ 91
98
+ );
99
+ add_action(
100
+ 'admin_notices',
101
+ array(
102
+ __CLASS__,
103
+ 'show_dashboard_notice'
104
+ )
105
+ );
106
+ add_action(
107
+ 'admin_print_styles',
108
+ array(
109
+ __CLASS__,
110
+ 'add_enqueue_style'
111
+ )
112
+ );
113
+
114
+ /* GUI */
115
+ if ( self::is_current_page('home') ) {
116
+ add_action(
117
+ 'admin_print_scripts',
118
+ array(
119
+ __CLASS__,
120
+ 'add_enqueue_script'
121
+ )
122
+ );
123
+
124
+ /* Plugins */
125
+ } else if ( self::is_current_page('plugins') ) {
126
+ add_action(
127
+ 'deactivate_' .self::$base,
128
+ array(
129
+ __CLASS__,
130
+ 'clear_scheduled_hook'
131
+ )
132
+ );
133
+ add_filter(
134
+ 'plugin_row_meta',
135
+ array(
136
+ __CLASS__,
137
+ 'init_row_meta'
138
+ ),
139
+ 10,
140
+ 2
141
+ );
142
+ add_filter(
143
+ 'plugin_action_links_' .self::$base,
144
+ array(
145
+ __CLASS__,
146
+ 'init_action_links'
147
+ )
148
+ );
149
+ }
150
+ }
151
+ }
152
+ }
153
+
154
+
155
+ /**
156
+ * Einbindung der Sprache
157
+ *
158
+ * @since 0.8
159
+ * @change 0.8
160
+ */
161
+
162
+ public static function load_plugin_lang()
163
+ {
164
+ load_plugin_textdomain(
165
+ 'antivirus',
166
+ false,
167
+ 'antivirus/lang'
168
+ );
169
+ }
170
+
171
+
172
+ /**
173
+ * Hinzufügen der Action-Links (Einstellungen links)
174
+ *
175
+ * @since 1.1
176
+ * @change 1.1
177
+ */
178
+
179
+ public static function init_action_links($data)
180
+ {
181
+ /* Rechte? */
182
+ if ( !current_user_can('manage_options') ) {
183
+ return $data;
184
+ }
185
+
186
+ return array_merge(
187
+ $data,
188
+ array(
189
+ sprintf(
190
+ '<a href="%s">%s</a>',
191
+ add_query_arg(
192
+ array(
193
+ 'page' => 'antivirus'
194
+ ),
195
+ admin_url('options-general.php')
196
+ ),
197
+ __('Settings')
198
+ )
199
+ )
200
+ );
201
+ }
202
+
203
+
204
+ /**
205
+ * Links in der Plugins-Verwaltung
206
+ *
207
+ * @since 0.1
208
+ * @change 1.1
209
+ *
210
+ * @param array $links Array mit Links
211
+ * @param string $file Name des Plugins
212
+ * @return array $links Array mit erweitertem Link
213
+ */
214
+
215
+ public static function init_row_meta($data, $page)
216
+ {
217
+ if ( $page == self::$base ) {
218
+ $data = array_merge(
219
+ $data,
220
+ array(
221
+ sprintf(
222
+ '<a href="https://flattr.com/thing/58179/Sicherheit-in-WordPress-Das-erste-AntiVirus-Plugin-fur-WordPress" target="_blank">%s</a>',
223
+ esc_html__('Flattr plugin', 'antivirus')
224
+ ),
225
+ sprintf(
226
+ '<a href="https://plus.google.com/110569673423509816572" target="_blank">%s</a>',
227
+ esc_html__('Follow on Google+', 'antivirus')
228
+ )
229
+ )
230
+ );
231
+ }
232
+
233
+ return $data;
234
+ }
235
+
236
+
237
+ /**
238
+ * Aktion bei Aktivierung des Plugins
239
+ *
240
+ * @since 0.1
241
+ * @change 0.8
242
+ */
243
+
244
+ public static function install()
245
+ {
246
+ /* Option anlegen */
247
+ add_option(
248
+ 'antivirus',
249
+ array(),
250
+ '',
251
+ 'no'
252
+ );
253
+
254
+ /* Cron aktivieren */
255
+ if ( self::get_option('cronjob_enable') ) {
256
+ self::init_scheduled_hook();
257
+ }
258
+ }
259
+
260
+
261
+ /**
262
+ * Uninstallation des Plugins pro MU-Blog
263
+ *
264
+ * @since 1.1
265
+ * @change 1.1
266
+ */
267
+
268
+ public static function uninstall()
269
+ {
270
+ /* Global */
271
+ global $wpdb;
272
+
273
+ /* Remove settings */
274
+ delete_option('antivirus');
275
+
276
+ /* Clean DB */
277
+ $wpdb->query("OPTIMIZE TABLE `" .$wpdb->options. "`");
278
+ }
279
+
280
+
281
+ /**
282
+ * Rückgabe eines Optionsfeldes
283
+ *
284
+ * @since 0.1
285
+ * @change 0.8
286
+ *
287
+ * @param string $field Name des Feldes
288
+ * @return mixed Wert des Feldes
289
+ */
290
+
291
+ private static function get_option($field)
292
+ {
293
+ if ( !$options = wp_cache_get('antivirus') ) {
294
+ $options = get_option('antivirus');
295
+ wp_cache_set(
296
+ 'antivirus',
297
+ $options
298
+ );
299
+ }
300
+
301
+ return @$options[$field];
302
+ }
303
+
304
+
305
+ /**
306
+ * Aktualisiert ein Optionsfeld
307
+ *
308
+ * @since 0.1
309
+ * @change 0.8
310
+ *
311
+ * @param string $field Name des Feldes
312
+ * @param mixed Wert des Feldes
313
+ */
314
+
315
+ private static function update_option($field, $value)
316
+ {
317
+ self::update_options(
318
+ array(
319
+ $field => $value
320
+ )
321
+ );
322
+ }
323
+
324
+
325
+ /**
326
+ * Aktualisiert mehrere Optionsfelder
327
+ *
328
+ * @since 0.1
329
+ * @change 0.8
330
+ *
331
+ * @param array $data Array mit Feldern
332
+ */
333
+
334
+ private static function update_options($data)
335
+ {
336
+ /* Option zuweisen */
337
+ $options = array_merge(
338
+ (array)get_option('antivirus'),
339
+ $data
340
+ );
341
+
342
+ /* DB updaten */
343
+ update_option(
344
+ 'antivirus',
345
+ $options
346
+ );
347
+
348
+ /* Cache updaten */
349
+ wp_cache_set(
350
+ 'antivirus',
351
+ $options
352
+ );
353
+ }
354
+
355
+
356
+ /**
357
+ * Initialisierung des Cronjobs
358
+ *
359
+ * @since 0.1
360
+ * @change 0.8
361
+ */
362
+
363
+ private static function init_scheduled_hook()
364
+ {
365
+ if ( !wp_next_scheduled('antivirus_daily_cronjob') ) {
366
+ wp_schedule_event(
367
+ time(),
368
+ 'daily',
369
+ 'antivirus_daily_cronjob'
370
+ );
371
+ }
372
+ }
373
+
374
+
375
+ /**
376
+ * Beendigung des Cronjobs
377
+ *
378
+ * @since 0.1
379
+ * @change 0.8
380
+ */
381
+
382
+ public static function clear_scheduled_hook()
383
+ {
384
+ if ( wp_next_scheduled('antivirus_daily_cronjob') ) {
385
+ wp_clear_scheduled_hook('antivirus_daily_cronjob');
386
+ }
387
+ }
388
+
389
+
390
+ /**
391
+ * Ausführung des Cronjobs
392
+ *
393
+ * @since 0.1
394
+ * @change 1.0
395
+ */
396
+
397
+ public static function exe_daily_cronjob()
398
+ {
399
+ /* Kein Cronjob? */
400
+ if ( !self::get_option('cronjob_enable') ) {
401
+ return;
402
+ }
403
+
404
+ /* Timestamp updaten */
405
+ self::update_option(
406
+ 'cronjob_timestamp',
407
+ time()
408
+ );
409
+
410
+ /* Files prüfen */
411
+ if ( self::check_theme_files() or self::check_permalink_structure() ) {
412
+ /* Sprache laden */
413
+ self::load_plugin_lang();
414
+
415
+ /* E-Mail-Adresse */
416
+ $email = sanitize_email(self::get_option('notify_email'));
417
+ $email = ( (!empty($email) && is_email($email)) ? $email : get_bloginfo('admin_email') );
418
+
419
+ /* Send it! */
420
+ wp_mail(
421
+ $email,
422
+ sprintf(
423
+ '[%s] %s',
424
+ get_bloginfo('name'),
425
+ esc_html__('Virus suspected', 'antivirus')
426
+ ),
427
+ sprintf(
428
+ "%s\r\n%s\r\n\r\n\r\n%s\r\n%s\r\n",
429
+ esc_html__('The daily antivirus scan of your blog suggests alarm.', 'antivirus'),
430
+ get_bloginfo('url'),
431
+ esc_html__('Notify message by AntiVirus for WordPress', 'antivirus'),
432
+ esc_html__('http://wpantivirus.com', 'antivirus')
433
+ )
434
+ );
435
+
436
+ /* Alert speichern */
437
+ self::update_option(
438
+ 'cronjob_alert',
439
+ 1
440
+ );
441
+ }
442
+ }
443
+
444
+
445
+ /**
446
+ * Initialisierung der GUI
447
+ *
448
+ * @since 0.1
449
+ * @change 1.2
450
+ */
451
+
452
+ public static function add_sidebar_menu()
453
+ {
454
+ /* Menü anlegen */
455
+ add_options_page(
456
+ 'AntiVirus',
457
+ '<span id="av_sidebar_icon"></span>AntiVirus',
458
+ 'manage_options',
459
+ 'antivirus',
460
+ array(
461
+ __CLASS__,
462
+ 'show_admin_menu'
463
+ )
464
+ );
465
+ }
466
+
467
+
468
+ /**
469
+ * Initialisierung von JavaScript
470
+ *
471
+ * @since 0.8
472
+ * @change 1.1
473
+ */
474
+
475
+ public static function add_enqueue_script()
476
+ {
477
+ /* Infos auslesen */
478
+ $data = get_plugin_data(__FILE__);
479
+
480
+ /* JS einbinden */
481
+ wp_register_script(
482
+ 'av_script',
483
+ plugins_url('js/script.js', __FILE__),
484
+ array('jquery'),
485
+ $data['Version']
486
+ );
487
+
488
+ /* Script einbinden */
489
+ wp_enqueue_script('av_script');
490
+
491
+ /* Script lokalisieren */
492
+ wp_localize_script(
493
+ 'av_script',
494
+ 'av_settings',
495
+ array(
496
+ 'nonce' => wp_create_nonce('av_ajax_nonce'),
497
+ 'ajax' => admin_url('admin-ajax.php'),
498
+ 'theme' => urlencode(self::get_theme_name()),
499
+ 'msg_1' => esc_html__('There is no virus', 'antivirus'),
500
+ 'msg_2' => esc_html__('View line', 'antivirus'),
501
+ 'msg_3' => esc_html__('Scan finished', 'antivirus')
502
+ )
503
+ );
504
+ }
505
+
506
+
507
+ /**
508
+ * Initialisierung von Stylesheets
509
+ *
510
+ * @since 0.8
511
+ * @change 1.1
512
+ */
513
+
514
+ public static function add_enqueue_style()
515
+ {
516
+ /* Infos auslesen */
517
+ $data = get_plugin_data(__FILE__);
518
+
519
+ /* CSS registrieren */
520
+ wp_register_style(
521
+ 'av_css',
522
+ plugins_url('css/style.css', __FILE__),
523
+ array(),
524
+ $data['Version']
525
+ );
526
+
527
+ /* CSS einbinden */
528
+ wp_enqueue_style('av_css');
529
+ }
530
+
531
+
532
+ /**
533
+ * Rückgabe des aktuellen Theme
534
+ *
535
+ * @since 0.1
536
+ * @change 0.8
537
+ *
538
+ * @return array $themes Array mit Theme-Eigenschaften
539
+ */
540
+
541
+ private static function get_current_theme()
542
+ {
543
+ /* Themes auslesen */
544
+ if ( $themes = get_themes() ) {
545
+ /* Aktuelles Theme */
546
+ if ($theme = get_current_theme()) {
547
+ if (array_key_exists((string)$theme, $themes)) {
548
+ return $themes[$theme];
549
+ }
550
+ }
551
+ }
552
+
553
+ return false;
554
+ }
555
+
556
+
557
+ /**
558
+ * Rückgabe von Dateien des aktuellen Theme
559
+ *
560
+ * @since 0.1
561
+ * @change 0.8
562
+ *
563
+ * @return array $files Array mit Dateien
564
+ */
565
+
566
+ private static function get_theme_files()
567
+ {
568
+ /* Theme vorhanden? */
569
+ if ( !$theme = self::get_current_theme() ) {
570
+ return false;
571
+ }
572
+
573
+ /* Keine Files? */
574
+ if ( empty($theme['Template Files']) ) {
575
+ return false;
576
+ }
577
+
578
+ /* Zurückgeben */
579
+ return array_unique(
580
+ array_map(
581
+ create_function(
582
+ '$v',
583
+ 'return str_replace(array(WP_CONTENT_DIR, "wp-content"), "", $v);'
584
+ ),
585
+ $theme['Template Files']
586
+ )
587
+ );
588
+ }
589
+
590
+
591
+ /**
592
+ * Rückgabe des Namen des aktuellen Theme
593
+ *
594
+ * @since 0.1
595
+ * @change 0.8
596
+ *
597
+ * @return string $theme Name des aktuellen Theme
598
+ */
599
+
600
+ private static function get_theme_name()
601
+ {
602
+ if ( $theme = self::get_current_theme() ) {
603
+ if (!empty($theme['Name'])) {
604
+ return $theme['Name'];
605
+ }
606
+ }
607
+
608
+ return false;
609
+ }
610
+
611
+
612
+ /**
613
+ * Rückgabe der WhiteList
614
+ *
615
+ * @since 0.1
616
+ * @change 0.8
617
+ *
618
+ * @return array return Array mit MD5-Werten
619
+ */
620
+
621
+ private static function get_white_list()
622
+ {
623
+ return explode(
624
+ ':',
625
+ self::get_option('white_list')
626
+ );
627
+ }
628
+
629
+
630
+ /**
631
+ * Ausführung von AJAX
632
+ *
633
+ * @since 0.1
634
+ * @change 0.8
635
+ */
636
+
637
+ public static function get_ajax_response()
638
+ {
639
+ /* Referer prüfen */
640
+ check_ajax_referer('av_ajax_nonce');
641
+
642
+ /* Zusätzliche Prüfung */
643
+ if ( empty($_POST['_action_request']) ) {
644
+ exit();
645
+ }
646
+
647
+ /* Init */
648
+ $values = array();
649
+ $output = '';
650
+
651
+ /* Ausgabe starten */
652
+ switch ($_POST['_action_request']) {
653
+ case 'get_theme_files':
654
+ self::update_option(
655
+ 'cronjob_alert',
656
+ 0
657
+ );
658
+
659
+ $values = self::get_theme_files();
660
+ break;
661
+
662
+ case 'check_theme_file':
663
+ if ( !empty($_POST['_theme_file']) && $lines = self::check_theme_file($_POST['_theme_file']) ) {
664
+ foreach ($lines as $num => $line) {
665
+ foreach ($line as $string) {
666
+ $values[] = $num;
667
+ $values[] = htmlentities($string, ENT_QUOTES);
668
+ $values[] = md5($num . $string);
669
+ }
670
+ }
671
+ }
672
+ break;
673
+
674
+ case 'update_white_list':
675
+ if ( !empty($_POST['_file_md5']) ) {
676
+ self::update_option(
677
+ 'white_list',
678
+ implode(
679
+ ':',
680
+ array_unique(
681
+ array_merge(
682
+ self::get_white_list(),
683
+ array($_POST['_file_md5'])
684
+ )
685
+ )
686
+ )
687
+ );
688
+
689
+ $values = array($_POST['_file_md5']);
690
+ }
691
+ break;
692
+
693
+ default:
694
+ break;
695
+ }
696
+
697
+ /* Ausgabe starten */
698
+ if ($values) {
699
+ $output = sprintf(
700
+ "['%s']",
701
+ implode("', '", $values)
702
+ );
703
+
704
+ /* Header senden */
705
+ header('Content-Type: plain/text');
706
+
707
+ /* Ausgeben */
708
+ echo sprintf(
709
+ '{data:%s, nonce:"%s"}',
710
+ $output,
711
+ $_POST['_ajax_nonce']
712
+ );
713
+ }
714
+
715
+ /* Raus! */
716
+ exit();
717
+ }
718
+
719
+
720
+ /**
721
+ * Rückgabe des Dateiinhaltes
722
+ *
723
+ * @since 0.1
724
+ * @change 0.8
725
+ *
726
+ * @return array $file Array mit Dateizeilen
727
+ */
728
+
729
+ private static function get_file_content($file)
730
+ {
731
+ return file(WP_CONTENT_DIR . $file);
732
+ }
733
+
734
+
735
+ /**
736
+ * Kürzung eines Strings
737
+ *
738
+ * @since 0.1
739
+ * @change 0.1
740
+ *
741
+ * @param string $line Eigenetliche Zeile als String
742
+ * @param string $tag Gesuchtes Tag
743
+ * @param integer $max Anzahl der Zeichen rechts und links
744
+ * @return string $output Gekürzter String
745
+ */
746
+
747
+ public static function get_dotted_line($line, $tag, $max = 100)
748
+ {
749
+ /* Keine Werte? */
750
+ if ( !$line or !$tag ) {
751
+ return false;
752
+ }
753
+
754
+ /* Differenz ermitteln */
755
+ if ( strlen($tag) > $max ) {
756
+ return $tag;
757
+ }
758
+
759
+ /* Differenz ermitteln */
760
+ $left = round(($max - strlen($tag)) / 2);
761
+
762
+ /* Wert konvertieren */
763
+ $tag = preg_quote($tag);
764
+
765
+ /* String kürzen */
766
+ $output = preg_replace(
767
+ '/(' .$tag. ')(.{' .$left. '}).{0,}$/',
768
+ '$1$2 ...',
769
+ $line
770
+ );
771
+ $output = preg_replace(
772
+ '/^.{0,}(.{' .$left. ',})(' .$tag. ')/',
773
+ '... $1$2',
774
+ $output
775
+ );
776
+
777
+ return $output;
778
+ }
779
+
780
+
781
+ /**
782
+ * Definition des Regexp
783
+ *
784
+ * @since 0.1
785
+ * @change 1.2
786
+ *
787
+ * @return string return Regulärer Ausdruck
788
+ */
789
+
790
+ private static function get_preg_match()
791
+ {
792
+ 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|iframe)\s*?\(/';
793
+ }
794
+
795
+
796
+ /**
797
+ * Prüfung einer Zeile
798
+ *
799
+ * @since 0.1
800
+ * @change 1.1
801
+ *
802
+ * @param string $line Zeile zur Prüfung
803
+ * @param integer $num Nummer zur Prüfung
804
+ * @return string $line Zeile mit Resultaten
805
+ */
806
+
807
+ private static function check_file_line($line = '', $num)
808
+ {
809
+ /* Wert trimmen */
810
+ $line = trim((string)$line);
811
+
812
+ /* Leere Werte? */
813
+ if ( !$line or !isset($num) ) {
814
+ return false;
815
+ }
816
+
817
+ /* Werte initialisieren */
818
+ $results = array();
819
+ $output = array();
820
+
821
+ /* Befehle suchen */
822
+ preg_match_all(
823
+ self::get_preg_match(),
824
+ $line,
825
+ $matches
826
+ );
827
+
828
+ /* Ergebnis speichern */
829
+ if ( $matches[1] ) {
830
+ $results = $matches[1];
831
+ }
832
+
833
+ /* Base64 suchen */
834
+ preg_match_all(
835
+ '/[\'\"\$\\ \/]*?([a-zA-Z0-9]{' .strlen(base64_encode('sergej + swetlana = love.')). ',})/',
836
+ $line,
837
+ $matches
838
+ );
839
+
840
+ /* Ergebnis speichern */
841
+ if ( $matches[1] ) {
842
+ $results = array_merge($results, $matches[1]);
843
+ }
844
+
845
+ /* Frames suchen */
846
+ preg_match_all(
847
+ '/<\s*?(frame)/',
848
+ $line,
849
+ $matches
850
+ );
851
+
852
+ /* Ergebnis speichern */
853
+ if ( $matches[1] ) {
854
+ $results = array_merge($results, $matches[1]);
855
+ }
856
+
857
+ /* Option suchen */
858
+ preg_match(
859
+ '/get_option\s*\(\s*[\'"](.*?)[\'"]\s*\)/',
860
+ $line,
861
+ $matches
862
+ );
863
+
864
+ /* Option prüfen */
865
+ if ( $matches && $matches[1] && self::check_file_line(get_option($matches[1]), $num) ) {
866
+ array_push($results, 'get_option');
867
+ }
868
+
869
+ /* Ergebnisse? */
870
+ if ( $results ) {
871
+ /* Keine Duplikate */
872
+ $results = array_unique($results);
873
+
874
+ /* White-Liste */
875
+ $md5 = self::get_white_list();
876
+
877
+ /* Resultate loopen */
878
+ foreach ($results as $tag) {
879
+ $string = str_replace(
880
+ $tag,
881
+ '@span@' .$tag. '@/span@',
882
+ self::get_dotted_line($line, $tag)
883
+ );
884
+
885
+ /* In der Whitelist? */
886
+ if (!in_array(md5($num . $string), $md5)) {
887
+ $output[] = $string;
888
+ }
889
+ }
890
+
891
+ return $output;
892
+ }
893
+
894
+ return false;
895
+ }
896
+
897
+
898
+ /**
899
+ * Prüfung der Dateien des aktuellen Theme
900
+ *
901
+ * @since 0.1
902
+ * @change 0.8
903
+ *
904
+ * @return array $results Array mit Ergebnissen
905
+ */
906
+
907
+ private static function check_theme_files()
908
+ {
909
+ /* Files vorhanden? */
910
+ if ( !$files = self::get_theme_files() ) {
911
+ return false;
912
+ }
913
+
914
+ /* Init */
915
+ $results = array();
916
+
917
+ /* Files loopen */
918
+ foreach($files as $file) {
919
+ if ($result = self::check_theme_file($file)) {
920
+ $results[$file] = $result;
921
+ }
922
+ }
923
+
924
+ /* Werte vorhanden? */
925
+ if ( !empty($results) ) {
926
+ return $results;
927
+ }
928
+
929
+ return false;
930
+ }
931
+
932
+
933
+ /**
934
+ * Prüfung einer Datei
935
+ *
936
+ * @since 0.1
937
+ * @change 0.8
938
+ *
939
+ * @param string $file Datei zur Prüfung
940
+ * @return array $results Array mit Ergebnissen
941
+ */
942
+
943
+ private static function check_theme_file($file)
944
+ {
945
+ /* Kein File? */
946
+ if ( !$file ) {
947
+ return false;
948
+ }
949
+
950
+ /* Inhalt auslesen */
951
+ if ( !$content = self::get_file_content($file) ) {
952
+ return false;
953
+ }
954
+
955
+ /* Init */
956
+ $results = array();
957
+
958
+ /* Zeilen loopen */
959
+ foreach($content as $num => $line) {
960
+ if ($result = self::check_file_line($line, $num)) {
961
+ $results[$num] = $result;
962
+ }
963
+ }
964
+
965
+ /* Werte vorhanden? */
966
+ if ( !empty($results) ) {
967
+ return $results;
968
+ }
969
+
970
+ return false;
971
+ }
972
+
973
+
974
+ /**
975
+ * Prüfung des Permalinks
976
+ *
977
+ * @since 0.1
978
+ * @change 0.8
979
+ *
980
+ * @return mixed $matches FALSE, wenn kein Fund
981
+ */
982
+
983
+ private static function check_permalink_structure()
984
+ {
985
+ if ( $structure = get_option('permalink_structure') ) {
986
+ /* Befehle suchen */
987
+ preg_match_all(
988
+ self::get_preg_match(),
989
+ $structure,
990
+ $matches
991
+ );
992
+
993
+ /* Ergebnis speichern */
994
+ if ( $matches[1] ) {
995
+ return $matches[1];
996
+ }
997
+ }
998
+
999
+ return false;
1000
+ }
1001
+
1002
+
1003
+ /**
1004
+ * Prüfung der Admin-Seite
1005
+ *
1006
+ * @since 0.1
1007
+ * @change 0.8
1008
+ *
1009
+ * @param integer $page Gesuchte Seite
1010
+ * @return boolean TRUE, wenn die aktuelle auch die gesuchte Seite ist
1011
+ */
1012
+
1013
+ private static function is_current_page($page)
1014
+ {
1015
+ switch($page) {
1016
+ case 'home':
1017
+ return ( !empty($_REQUEST['page']) && $_REQUEST['page'] == 'antivirus' );
1018
+
1019
+ case 'index':
1020
+ case 'plugins':
1021
+ return (!empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] == sprintf('%s.php', $page));
1022
+
1023
+ default:
1024
+ return false;
1025
+ }
1026
+ }
1027
+
1028
+
1029
+ /**
1030
+ * Anzeige des Dashboard-Hinweises
1031
+ *
1032
+ * @since 0.1
1033
+ * @change 1.2
1034
+ */
1035
+
1036
+ public static function show_dashboard_notice() {
1037
+ /* Kein Alert? */
1038
+ if ( !self::get_option('cronjob_alert') ) {
1039
+ return;
1040
+ }
1041
+
1042
+ /* Bereits in der Adminbar */
1043
+ if ( function_exists('is_admin_bar_showing') && is_admin_bar_showing() ) {
1044
+ return;
1045
+ }
1046
+
1047
+ /* Warnung */
1048
+ echo sprintf(
1049
+ '<div class="updated fade"><p><strong>%1$s:</strong> %2$s <a href="%3$s">%4$s &rarr;</a></p></div>',
1050
+ esc_html__('Virus suspected', 'antivirus'),
1051
+ esc_html__('The daily antivirus scan of your blog suggests alarm.', 'antivirus'),
1052
+ add_query_arg(
1053
+ array(
1054
+ 'page' => 'antivirus'
1055
+ ),
1056
+ admin_url('options-general.php')
1057
+ ),
1058
+ esc_html__('Manual scan', 'antivirus')
1059
+ );
1060
+ }
1061
+
1062
+
1063
+ /**
1064
+ * Anzeige des Menüs in der Adminbar
1065
+ *
1066
+ * @since 1.2
1067
+ * @change 1.2
1068
+ */
1069
+
1070
+ public static function add_adminbar_menu( $wp_admin_bar ) {
1071
+ /* Kein Alert? */
1072
+ if ( !self::get_option('cronjob_alert') ) {
1073
+ return;
1074
+ }
1075
+
1076
+ /* Keine Adminbar? */
1077
+ if ( !function_exists('is_admin_bar_showing') or !is_admin_bar_showing() ) {
1078
+ return;
1079
+ }
1080
+
1081
+ /* Hinzufügen */
1082
+ $wp_admin_bar->add_menu(
1083
+ array(
1084
+ 'id' => 'antivirus',
1085
+ 'title' => '<span class="ab-icon"></span><span class="ab-label">' .esc_html__('Virus suspected', 'antivirus'). '</span>',
1086
+ 'href' => add_query_arg(
1087
+ array(
1088
+ 'page' => 'antivirus'
1089
+ ),
1090
+ admin_url('options-general.php')
1091
+ )
1092
+ )
1093
+ );
1094
+ }
1095
+
1096
+
1097
+ /**
1098
+ * Anzeige der GUI
1099
+ *
1100
+ * @since 0.1
1101
+ * @change 1.2
1102
+ */
1103
+
1104
+ public static function show_admin_menu() {
1105
+ /* Updates speichern */
1106
+ if ( !empty($_POST) ) {
1107
+ /* Referer prüfen */
1108
+ check_admin_referer('antivirus');
1109
+
1110
+ /* Werte zuweisen */
1111
+ $options = array(
1112
+ 'cronjob_enable' => (int)(!empty($_POST['av_cronjob_enable'])),
1113
+ 'notify_email' => sanitize_email(@$_POST['av_notify_email'])
1114
+ );
1115
+
1116
+ /* Kein Cronjob? */
1117
+ if (empty($options['cronjob_enable'])) {
1118
+ $options['notify_email'] = '';
1119
+ }
1120
+
1121
+ /* Cron stoppen? */
1122
+ if ($options['cronjob_enable'] && !self::get_option('cronjob_enable')) {
1123
+ self::init_scheduled_hook();
1124
+ } else if (!$options['cronjob_enable'] && self::get_option('cronjob_enable')) {
1125
+ self::clear_scheduled_hook();
1126
+ }
1127
+
1128
+ /* Optionen speichern */
1129
+ self::update_options($options); ?>
1130
+
1131
+ <div id="message" class="updated fade">
1132
+ <p>
1133
+ <strong>
1134
+ <?php _e('Settings saved.') ?>
1135
+ </strong>
1136
+ </p>
1137
+ </div>
1138
+ <?php } ?>
1139
+
1140
+ <div class="wrap" id="av_main">
1141
+ <div class="icon32"></div>
1142
+
1143
+ <h2>
1144
+ AntiVirus
1145
+ </h2>
1146
+
1147
+ <form method="post" action="">
1148
+ <?php wp_nonce_field('antivirus') ?>
1149
+
1150
+ <div id="poststuff">
1151
+ <div class="postbox">
1152
+ <h3>
1153
+ <?php esc_html_e('Completed scan', 'antivirus') ?>
1154
+ </h3>
1155
+
1156
+ <div class="inside" id="av_completed">
1157
+ <div class="output">
1158
+ <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>
1159
+ </div>
1160
+
1161
+ <ul class="agenda">
1162
+ <li>
1163
+ <p></p>
1164
+ <span>
1165
+ <?php esc_html_e('All clear', 'antivirus') ?>
1166
+ </span>
1167
+ </li>
1168
+ <li class="danger">
1169
+ <p></p>
1170
+ <span>
1171
+ <?php esc_html_e('Danger', 'antivirus') ?>
1172
+ </span>
1173
+ </li>
1174
+ </ul>
1175
+ </div>
1176
+ </div>
1177
+
1178
+ <div class="postbox">
1179
+ <h3>
1180
+ <?php esc_html_e('Manual scan', 'antivirus') ?>
1181
+ </h3>
1182
+
1183
+ <div class="inside" id="av_manual">
1184
+ <p>
1185
+ <a href="#" class="button rbutton"><?php esc_html_e('Scan the theme templates now', 'antivirus') ?></a>
1186
+ <span class="alert"></span>
1187
+ </p>
1188
+ <div class="output"></div>
1189
+ </div>
1190
+ </div>
1191
+
1192
+ <div class="postbox">
1193
+ <h3>
1194
+ <?php _e('Settings') ?>
1195
+ </h3>
1196
+
1197
+ <div class="inside">
1198
+ <table class="form-table">
1199
+ <tr>
1200
+ <td>
1201
+ <label for="av_cronjob_enable">
1202
+ <input type="checkbox" name="av_cronjob_enable" id="av_cronjob_enable" value="1" <?php checked(self::get_option('cronjob_enable'), 1) ?> />
1203
+ <?php esc_html_e('Enable the daily antivirus scan', 'antivirus') ?>
1204
+ <?php if (self::get_option('cronjob_enable') && self::get_option('cronjob_timestamp')) {
1205
+ echo sprintf(
1206
+ '&nbsp;(%s @ %s)',
1207
+ esc_html__('Last check', 'antivirus'),
1208
+ date_i18n('d.m.Y H:i:s', (self::get_option('cronjob_timestamp') + get_option('gmt_offset') * 3600))
1209
+ );
1210
+ } ?>
1211
+ </label>
1212
+ <span class="shift">
1213
+ <?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" />
1214
+ </span>
1215
+ </td>
1216
+ </tr>
1217
+ </table>
1218
+
1219
+ <p>
1220
+ <input type="submit" name="av_submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
1221
+ </p>
1222
+ </div>
1223
+ </div>
1224
+ </div>
1225
+ </form>
1226
+ </div>
1227
+ <?php }
1228
+ }
1229
+
1230
+
1231
+ /* Fire */
1232
+ add_action(
1233
+ 'plugins_loaded',
1234
+ array(
1235
+ 'AntiVirus',
1236
+ 'init'
1237
+ ),
1238
+ 99
1239
+ );
1240
+
1241
+
1242
+ /* Install */
1243
+ register_activation_hook(
1244
+ __FILE__,
1245
+ array(
1246
+ 'AntiVirus',
1247
+ 'install'
1248
+ )
1249
+ );
1250
+
1251
+
1252
+ /* Uninstall */
1253
+ register_uninstall_hook(
1254
+ __FILE__,
1255
+ array(
1256
+ 'AntiVirus',
1257
+ 'uninstall'
1258
+ )
1259
+ );
antivirus.php ADDED
@@ -0,0 +1,732 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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://wpseo.de
9
+ Plugin URI: http://wpantivirus.com
10
+ Version: 1.3
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) or (defined('XMLRPC_REQUEST') && XMLRPC_REQUEST) ) {
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
+ 'init',
47
+ array(
48
+ __CLASS__,
49
+ 'load_plugin_lang'
50
+ )
51
+ );
52
+ add_action(
53
+ 'admin_menu',
54
+ array(
55
+ __CLASS__,
56
+ 'add_sidebar_menu'
57
+ )
58
+ );
59
+ add_action(
60
+ 'admin_bar_menu',
61
+ array(
62
+ __CLASS__,
63
+ 'add_adminbar_menu'
64
+ ),
65
+ 91
66
+ );
67
+ add_action(
68
+ 'admin_notices',
69
+ array(
70
+ __CLASS__,
71
+ 'show_dashboard_notice'
72
+ )
73
+ );
74
+ add_action(
75
+ 'admin_print_styles',
76
+ array(
77
+ __CLASS__,
78
+ 'add_enqueue_style'
79
+ )
80
+ );
81
+ if ( self::is_current_page('home') ) {
82
+ add_action(
83
+ 'admin_print_scripts',
84
+ array(
85
+ __CLASS__,
86
+ 'add_enqueue_script'
87
+ )
88
+ );
89
+ } else if ( self::is_current_page('plugins') ) {
90
+ add_action(
91
+ 'deactivate_' .self::$base,
92
+ array(
93
+ __CLASS__,
94
+ 'clear_scheduled_hook'
95
+ )
96
+ );
97
+ add_filter(
98
+ 'plugin_row_meta',
99
+ array(
100
+ __CLASS__,
101
+ 'init_row_meta'
102
+ ),
103
+ 10,
104
+ 2
105
+ );
106
+ add_filter(
107
+ 'plugin_action_links_' .self::$base,
108
+ array(
109
+ __CLASS__,
110
+ 'init_action_links'
111
+ )
112
+ );
113
+ }
114
+ }
115
+ }
116
+ }
117
+ public static function load_plugin_lang()
118
+ {
119
+ load_plugin_textdomain(
120
+ 'antivirus',
121
+ false,
122
+ 'antivirus/lang'
123
+ );
124
+ }
125
+ public static function init_action_links($data)
126
+ {
127
+ if ( !current_user_can('manage_options') ) {
128
+ return $data;
129
+ }
130
+ return array_merge(
131
+ $data,
132
+ array(
133
+ sprintf(
134
+ '<a href="%s">%s</a>',
135
+ add_query_arg(
136
+ array(
137
+ 'page' => 'antivirus'
138
+ ),
139
+ admin_url('options-general.php')
140
+ ),
141
+ __('Settings')
142
+ )
143
+ )
144
+ );
145
+ }
146
+ public static function init_row_meta($data, $page)
147
+ {
148
+ if ( $page == self::$base ) {
149
+ $data = array_merge(
150
+ $data,
151
+ array(
152
+ sprintf(
153
+ '<a href="https://flattr.com/thing/58179/Sicherheit-in-WordPress-Das-erste-AntiVirus-Plugin-fur-WordPress" target="_blank">%s</a>',
154
+ esc_html__('Flattr plugin', 'antivirus')
155
+ ),
156
+ sprintf(
157
+ '<a href="https://plus.google.com/110569673423509816572" target="_blank">%s</a>',
158
+ esc_html__('Follow on Google+', 'antivirus')
159
+ )
160
+ )
161
+ );
162
+ }
163
+ return $data;
164
+ }
165
+ public static function install()
166
+ {
167
+ add_option(
168
+ 'antivirus',
169
+ array(),
170
+ '',
171
+ 'no'
172
+ );
173
+ if ( self::get_option('cronjob_enable') ) {
174
+ self::init_scheduled_hook();
175
+ }
176
+ }
177
+ public static function uninstall()
178
+ {
179
+ global $wpdb;
180
+ delete_option('antivirus');
181
+ $wpdb->query("OPTIMIZE TABLE `" .$wpdb->options. "`");
182
+ }
183
+ private static function get_option($field)
184
+ {
185
+ if ( !$options = wp_cache_get('antivirus') ) {
186
+ $options = get_option('antivirus');
187
+ wp_cache_set(
188
+ 'antivirus',
189
+ $options
190
+ );
191
+ }
192
+ return @$options[$field];
193
+ }
194
+ private static function update_option($field, $value)
195
+ {
196
+ self::update_options(
197
+ array(
198
+ $field => $value
199
+ )
200
+ );
201
+ }
202
+ private static function update_options($data)
203
+ {
204
+ $options = array_merge(
205
+ (array)get_option('antivirus'),
206
+ $data
207
+ );
208
+ update_option(
209
+ 'antivirus',
210
+ $options
211
+ );
212
+ wp_cache_set(
213
+ 'antivirus',
214
+ $options
215
+ );
216
+ }
217
+ private static function init_scheduled_hook()
218
+ {
219
+ if ( !wp_next_scheduled('antivirus_daily_cronjob') ) {
220
+ wp_schedule_event(
221
+ time(),
222
+ 'daily',
223
+ 'antivirus_daily_cronjob'
224
+ );
225
+ }
226
+ }
227
+ public static function clear_scheduled_hook()
228
+ {
229
+ if ( wp_next_scheduled('antivirus_daily_cronjob') ) {
230
+ wp_clear_scheduled_hook('antivirus_daily_cronjob');
231
+ }
232
+ }
233
+ public static function exe_daily_cronjob()
234
+ {
235
+ if ( !self::get_option('cronjob_enable') ) {
236
+ return;
237
+ }
238
+ self::update_option(
239
+ 'cronjob_timestamp',
240
+ time()
241
+ );
242
+ if ( self::check_theme_files() or self::check_permalink_structure() ) {
243
+ self::load_plugin_lang();
244
+ $email = sanitize_email(self::get_option('notify_email'));
245
+ $email = ( (!empty($email) && is_email($email)) ? $email : get_bloginfo('admin_email') );
246
+ wp_mail(
247
+ $email,
248
+ sprintf(
249
+ '[%s] %s',
250
+ get_bloginfo('name'),
251
+ esc_html__('Virus suspected', 'antivirus')
252
+ ),
253
+ sprintf(
254
+ "%s\r\n%s\r\n\r\n\r\n%s\r\n%s\r\n",
255
+ esc_html__('The daily antivirus scan of your blog suggests alarm.', 'antivirus'),
256
+ get_bloginfo('url'),
257
+ esc_html__('Notify message by AntiVirus for WordPress', 'antivirus'),
258
+ esc_html__('http://wpantivirus.com', 'antivirus')
259
+ )
260
+ );
261
+ self::update_option(
262
+ 'cronjob_alert',
263
+ 1
264
+ );
265
+ }
266
+ }
267
+ public static function add_sidebar_menu()
268
+ {
269
+ add_options_page(
270
+ 'AntiVirus',
271
+ '<span id="av_sidebar_icon"></span>AntiVirus',
272
+ 'manage_options',
273
+ 'antivirus',
274
+ array(
275
+ __CLASS__,
276
+ 'show_admin_menu'
277
+ )
278
+ );
279
+ }
280
+ public static function add_enqueue_script()
281
+ {
282
+ $data = get_plugin_data(__FILE__);
283
+ wp_register_script(
284
+ 'av_script',
285
+ plugins_url('js/script.js', __FILE__),
286
+ array('jquery'),
287
+ $data['Version']
288
+ );
289
+ wp_enqueue_script('av_script');
290
+ wp_localize_script(
291
+ 'av_script',
292
+ 'av_settings',
293
+ array(
294
+ 'nonce' => wp_create_nonce('av_ajax_nonce'),
295
+ 'ajax'=> admin_url('admin-ajax.php'),
296
+ 'theme'=> urlencode(self::get_theme_name()),
297
+ 'msg_1'=> esc_html__('There is no virus', 'antivirus'),
298
+ 'msg_2' => esc_html__('View line', 'antivirus'),
299
+ 'msg_3' => esc_html__('Scan finished', 'antivirus')
300
+ )
301
+ );
302
+ }
303
+ public static function add_enqueue_style()
304
+ {
305
+ $data = get_plugin_data(__FILE__);
306
+ wp_register_style(
307
+ 'av_css',
308
+ plugins_url('css/style.css', __FILE__),
309
+ array(),
310
+ $data['Version']
311
+ );
312
+ wp_enqueue_style('av_css');
313
+ }
314
+ private static function get_current_theme()
315
+ {
316
+ if ( $themes = get_themes() ) {
317
+ if ($theme = get_current_theme()) {
318
+ if (array_key_exists((string)$theme, $themes)) {
319
+ return $themes[$theme];
320
+ }
321
+ }
322
+ }
323
+ return false;
324
+ }
325
+ private static function get_theme_files()
326
+ {
327
+ if ( !$theme = self::get_current_theme() ) {
328
+ return false;
329
+ }
330
+ if ( empty($theme['Template Files']) ) {
331
+ return false;
332
+ }
333
+ return array_unique(
334
+ array_map(
335
+ create_function(
336
+ '$v',
337
+ 'return str_replace(array(WP_CONTENT_DIR, "wp-content"), "", $v);'
338
+ ),
339
+ $theme['Template Files']
340
+ )
341
+ );
342
+ }
343
+ private static function get_theme_name()
344
+ {
345
+ if ( $theme = self::get_current_theme() ) {
346
+ if (!empty($theme['Name'])) {
347
+ return $theme['Name'];
348
+ }
349
+ }
350
+ return false;
351
+ }
352
+ private static function get_white_list()
353
+ {
354
+ return explode(
355
+ ':',
356
+ self::get_option('white_list')
357
+ );
358
+ }
359
+ public static function get_ajax_response()
360
+ {
361
+ check_ajax_referer('av_ajax_nonce');
362
+ if ( empty($_POST['_action_request']) ) {
363
+ exit();
364
+ }
365
+ $values = array();
366
+ $output = '';
367
+ switch ($_POST['_action_request']) {
368
+ case 'get_theme_files':
369
+ self::update_option(
370
+ 'cronjob_alert',
371
+ 0
372
+ );
373
+ $values = self::get_theme_files();
374
+ break;
375
+ case 'check_theme_file':
376
+ if ( !empty($_POST['_theme_file']) && $lines = self::check_theme_file($_POST['_theme_file']) ) {
377
+ foreach ($lines as $num => $line) {
378
+ foreach ($line as $string) {
379
+ $values[] = $num;
380
+ $values[] = htmlentities($string, ENT_QUOTES);
381
+ $values[] = md5($num . $string);
382
+ }
383
+ }
384
+ }
385
+ break;
386
+ case 'update_white_list':
387
+ if ( !empty($_POST['_file_md5']) ) {
388
+ self::update_option(
389
+ 'white_list',
390
+ implode(
391
+ ':',
392
+ array_unique(
393
+ array_merge(
394
+ self::get_white_list(),
395
+ array($_POST['_file_md5'])
396
+ )
397
+ )
398
+ )
399
+ );
400
+ $values = array($_POST['_file_md5']);
401
+ }
402
+ break;
403
+ default:
404
+ break;
405
+ }
406
+ if ($values) {
407
+ $output = sprintf(
408
+ "['%s']",
409
+ implode("', '", $values)
410
+ );
411
+ header('Content-Type: plain/text');
412
+ echo sprintf(
413
+ '{data:%s, nonce:"%s"}',
414
+ $output,
415
+ $_POST['_ajax_nonce']
416
+ );
417
+ }
418
+ exit();
419
+ }
420
+ private static function get_file_content($file)
421
+ {
422
+ return file(WP_CONTENT_DIR . $file);
423
+ }
424
+ public static function get_dotted_line($line, $tag, $max = 100)
425
+ {
426
+ if ( !$line or !$tag ) {
427
+ return false;
428
+ }
429
+ if ( strlen($tag) > $max ) {
430
+ return $tag;
431
+ }
432
+ $left = round(($max - strlen($tag)) / 2);
433
+ $tag = preg_quote($tag);
434
+ $output = preg_replace(
435
+ '/(' .$tag. ')(.{' .$left. '}).{0,}$/',
436
+ '$1$2 ...',
437
+ $line
438
+ );
439
+ $output = preg_replace(
440
+ '/^.{0,}(.{' .$left. ',})(' .$tag. ')/',
441
+ '... $1$2',
442
+ $output
443
+ );
444
+ return $output;
445
+ }
446
+ private static function get_preg_match()
447
+ {
448
+ 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|iframe)\s*?\(/';
449
+ }
450
+ private static function check_file_line($line = '', $num)
451
+ {
452
+ $line = trim((string)$line);
453
+ if ( !$line or !isset($num) ) {
454
+ return false;
455
+ }
456
+ $results = array();
457
+ $output = array();
458
+ preg_match_all(
459
+ self::get_preg_match(),
460
+ $line,
461
+ $matches
462
+ );
463
+ if ( $matches[1] ) {
464
+ $results = $matches[1];
465
+ }
466
+ preg_match_all(
467
+ '/[\'\"\$\\ \/]*?([a-zA-Z0-9]{' .strlen(base64_encode('sergej + swetlana = love.')). ',})/',
468
+ $line,
469
+ $matches
470
+ );
471
+ if ( $matches[1] ) {
472
+ $results = array_merge($results, $matches[1]);
473
+ }
474
+ preg_match_all(
475
+ '/<\s*?(frame)/',
476
+ $line,
477
+ $matches
478
+ );
479
+ if ( $matches[1] ) {
480
+ $results = array_merge($results, $matches[1]);
481
+ }
482
+ preg_match(
483
+ '/get_option\s*\(\s*[\'"](.*?)[\'"]\s*\)/',
484
+ $line,
485
+ $matches
486
+ );
487
+ if ( $matches && $matches[1] && self::check_file_line(get_option($matches[1]), $num) ) {
488
+ array_push($results, 'get_option');
489
+ }
490
+ if ( $results ) {
491
+ $results = array_unique($results);
492
+ $md5 = self::get_white_list();
493
+ foreach ($results as $tag) {
494
+ $string = str_replace(
495
+ $tag,
496
+ '@span@' .$tag. '@/span@',
497
+ self::get_dotted_line($line, $tag)
498
+ );
499
+ if (!in_array(md5($num . $string), $md5)) {
500
+ $output[] = $string;
501
+ }
502
+ }
503
+ return $output;
504
+ }
505
+ return false;
506
+ }
507
+ private static function check_theme_files()
508
+ {
509
+ if ( !$files = self::get_theme_files() ) {
510
+ return false;
511
+ }
512
+ $results = array();
513
+ foreach($files as $file) {
514
+ if ($result = self::check_theme_file($file)) {
515
+ $results[$file] = $result;
516
+ }
517
+ }
518
+ if ( !empty($results) ) {
519
+ return $results;
520
+ }
521
+ return false;
522
+ }
523
+ private static function check_theme_file($file)
524
+ {
525
+ if ( !$file ) {
526
+ return false;
527
+ }
528
+ if ( !$content = self::get_file_content($file) ) {
529
+ return false;
530
+ }
531
+ $results = array();
532
+ foreach($content as $num => $line) {
533
+ if ($result = self::check_file_line($line, $num)) {
534
+ $results[$num] = $result;
535
+ }
536
+ }
537
+ if ( !empty($results) ) {
538
+ return $results;
539
+ }
540
+ return false;
541
+ }
542
+ private static function check_permalink_structure()
543
+ {
544
+ if ( $structure = get_option('permalink_structure') ) {
545
+ preg_match_all(
546
+ self::get_preg_match(),
547
+ $structure,
548
+ $matches
549
+ );
550
+ if ( $matches[1] ) {
551
+ return $matches[1];
552
+ }
553
+ }
554
+ return false;
555
+ }
556
+ private static function is_current_page($page)
557
+ {
558
+ switch($page) {
559
+ case 'home':
560
+ return ( !empty($_REQUEST['page']) && $_REQUEST['page'] == 'antivirus' );
561
+ case 'index':
562
+ case 'plugins':
563
+ return (!empty($GLOBALS['pagenow']) && $GLOBALS['pagenow'] == sprintf('%s.php', $page));
564
+ default:
565
+ return false;
566
+ }
567
+ }
568
+ public static function show_dashboard_notice() {
569
+ if ( !self::get_option('cronjob_alert') ) {
570
+ return;
571
+ }
572
+ if ( function_exists('is_admin_bar_showing') && is_admin_bar_showing() ) {
573
+ return;
574
+ }
575
+ echo sprintf(
576
+ '<div class="updated fade"><p><strong>%1$s:</strong> %2$s <a href="%3$s">%4$s &rarr;</a></p></div>',
577
+ esc_html__('Virus suspected', 'antivirus'),
578
+ esc_html__('The daily antivirus scan of your blog suggests alarm.', 'antivirus'),
579
+ add_query_arg(
580
+ array(
581
+ 'page' => 'antivirus'
582
+ ),
583
+ admin_url('options-general.php')
584
+ ),
585
+ esc_html__('Manual scan', 'antivirus')
586
+ );
587
+ }
588
+ public static function add_adminbar_menu( $wp_admin_bar ) {
589
+ if ( !self::get_option('cronjob_alert') ) {
590
+ return;
591
+ }
592
+ if ( !function_exists('is_admin_bar_showing') or !is_admin_bar_showing() ) {
593
+ return;
594
+ }
595
+ $wp_admin_bar->add_menu(
596
+ array(
597
+ 'id'=> 'antivirus',
598
+ 'title' => '<span class="ab-icon"></span><span class="ab-label">' .esc_html__('Virus suspected', 'antivirus'). '</span>',
599
+ 'href'=> add_query_arg(
600
+ array(
601
+ 'page' => 'antivirus'
602
+ ),
603
+ admin_url('options-general.php')
604
+ )
605
+ )
606
+ );
607
+ }
608
+ public static function show_admin_menu() {
609
+ if ( !empty($_POST) ) {
610
+ check_admin_referer('antivirus');
611
+ $options = array(
612
+ 'cronjob_enable' => (int)(!empty($_POST['av_cronjob_enable'])),
613
+ 'notify_email'=> sanitize_email(@$_POST['av_notify_email'])
614
+ );
615
+ if (empty($options['cronjob_enable'])) {
616
+ $options['notify_email'] = '';
617
+ }
618
+ if ($options['cronjob_enable'] && !self::get_option('cronjob_enable')) {
619
+ self::init_scheduled_hook();
620
+ } else if (!$options['cronjob_enable'] && self::get_option('cronjob_enable')) {
621
+ self::clear_scheduled_hook();
622
+ }
623
+ self::update_options($options); ?>
624
+ <div id="message" class="updated fade">
625
+ <p>
626
+ <strong>
627
+ <?php _e('Settings saved.') ?>
628
+ </strong>
629
+ </p>
630
+ </div>
631
+ <?php } ?>
632
+ <div class="wrap" id="av_main">
633
+ <div class="icon32"></div>
634
+ <h2>
635
+ AntiVirus
636
+ </h2>
637
+ <form method="post" action="">
638
+ <?php wp_nonce_field('antivirus') ?>
639
+ <div id="poststuff">
640
+ <div class="postbox">
641
+ <h3>
642
+ <?php esc_html_e('Completed scan', 'antivirus') ?>
643
+ </h3>
644
+ <div class="inside" id="av_completed">
645
+ <div class="output">
646
+ <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>
647
+ </div>
648
+ <ul class="agenda">
649
+ <li>
650
+ <p></p>
651
+ <span>
652
+ <?php esc_html_e('All clear', 'antivirus') ?>
653
+ </span>
654
+ </li>
655
+ <li class="danger">
656
+ <p></p>
657
+ <span>
658
+ <?php esc_html_e('Danger', 'antivirus') ?>
659
+ </span>
660
+ </li>
661
+ </ul>
662
+ </div>
663
+ </div>
664
+ <div class="postbox">
665
+ <h3>
666
+ <?php esc_html_e('Manual scan', 'antivirus') ?>
667
+ </h3>
668
+ <div class="inside" id="av_manual">
669
+ <p>
670
+ <a href="#" class="button rbutton"><?php esc_html_e('Scan the theme templates now', 'antivirus') ?></a>
671
+ <span class="alert"></span>
672
+ </p>
673
+ <div class="output"></div>
674
+ </div>
675
+ </div>
676
+ <div class="postbox">
677
+ <h3>
678
+ <?php _e('Settings') ?>
679
+ </h3>
680
+ <div class="inside">
681
+ <table class="form-table">
682
+ <tr>
683
+ <td>
684
+ <label for="av_cronjob_enable">
685
+ <input type="checkbox" name="av_cronjob_enable" id="av_cronjob_enable" value="1" <?php checked(self::get_option('cronjob_enable'), 1) ?> />
686
+ <?php esc_html_e('Enable the daily antivirus scan', 'antivirus') ?>
687
+ <?php if (self::get_option('cronjob_enable') && self::get_option('cronjob_timestamp')) {
688
+ echo sprintf(
689
+ '&nbsp;(%s @ %s)',
690
+ esc_html__('Last check', 'antivirus'),
691
+ date_i18n('d.m.Y H:i:s', (self::get_option('cronjob_timestamp') + get_option('gmt_offset') * 3600))
692
+ );
693
+ } ?>
694
+ </label>
695
+ <span class="shift">
696
+ <?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" />
697
+ </span>
698
+ </td>
699
+ </tr>
700
+ </table>
701
+ <p>
702
+ <input type="submit" name="av_submit" class="button-primary" value="<?php _e('Save Changes') ?>" />
703
+ </p>
704
+ </div>
705
+ </div>
706
+ </div>
707
+ </form>
708
+ </div>
709
+ <?php }
710
+ }
711
+ add_action(
712
+ 'plugins_loaded',
713
+ array(
714
+ 'AntiVirus',
715
+ 'init'
716
+ ),
717
+ 99
718
+ );
719
+ register_activation_hook(
720
+ __FILE__,
721
+ array(
722
+ 'AntiVirus',
723
+ 'install'
724
+ )
725
+ );
726
+ register_uninstall_hook(
727
+ __FILE__,
728
+ array(
729
+ 'AntiVirus',
730
+ 'uninstall'
731
+ )
732
+ );
css/style.css ADDED
@@ -0,0 +1 @@
 
1
+ #av_sidebar_icon{width:11px;height:9px;border:0;display:inline-block;background:url(../img/icon.png) no-repeat;}#wp-admin-bar-antivirus .ab-label{color:#e66f00;margin-left:4px;}#wp-admin-bar-antivirus .ab-icon{position:relative;float:left;width:16px;height:16px;margin-top:6px;background:url(../img/icon16.png) no-repeat 0 -1px;}#av_main .icon32{background:url(../img/icon32.png) no-repeat;}#av_main .postbox h3{cursor:default;}#av_main #poststuff>.postbox:first-child{margin-top:20px;}#av_main table.form-table{clear:none;width:auto;margin:0;}#av_main table.form-table #antivirus_cronjob_enable{margin:-3px 0 0;}#av_main 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;border-radius:2px;-o-border-radius:2px;-ms-border-radius:2px;-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;-ms-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;border-radius:2px;-o-border-radius:2px;-ms-border-radius:2px;-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;-ms-border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;}#av_main .inside .output{clear:both;height:1%;padding:0 0 6px;overflow:hidden;}#av_main .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;-ms-border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px;transition:background-color 0.5s linear;-o-transition:background-color 0.5s linear;-ms-transition:background-color 0.5s linear;-moz-transition:background-color 0.5s linear;-webkit-transition:background-color 0.5s linear;}#av_main .inside .output div.done{background:green;}#av_main .inside .output div.danger{width:97%;background:red;}#av_main .inside .output div p{padding:10px;overflow:hidden;background:#f9f9f9;white-space:nowrap;border-radius:8px;-o-border-radius:8px;-ms-border-radius:8px;-moz-border-radius:8px;-webkit-border-radius:8px;}#av_main .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;-ms-border-radius:5px;-moz-border-radius:5px;-webkit-border-radius:5px;}#av_main .inside .output div p a:hover{color:#000;border:1px solid #646464;}#av_main .inside .output div p code{clear:both;float:left;color:#000;padding:2px 5px;border-radius:2px;-o-border-radius:2px;-o-border-radius:2px;-moz-border-radius:2px;-webkit-border-radius:2px;}#av_main .inside .output div p code span{padding:2px;background:yellow;}
css/style.orginal.css ADDED
@@ -0,0 +1,240 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ /* @group Sidebar */
2
+
3
+ #av_sidebar_icon {
4
+ width: 11px;
5
+ height: 9px;
6
+ border: 0;
7
+ display: inline-block;
8
+ background: url(../img/icon.png) no-repeat;
9
+ }
10
+
11
+ /* @end group */
12
+
13
+
14
+ /* @group Adminbar */
15
+
16
+ #wp-admin-bar-antivirus .ab-label {
17
+ color: #E66F00;
18
+ margin-left: 4px;
19
+ }
20
+ #wp-admin-bar-antivirus .ab-icon {
21
+ position: relative;
22
+ float: left;
23
+ width: 16px;
24
+ height: 16px;
25
+ margin-top: 6px;
26
+ background: url(../img/icon16.png) no-repeat 0 -1px;
27
+ }
28
+
29
+ /* @end group */
30
+
31
+
32
+ /* @group GUI */
33
+
34
+ #av_main .icon32 {
35
+ background: url(../img/icon32.png) no-repeat;
36
+ }
37
+ #av_main .postbox h3 {
38
+ cursor: default;
39
+ }
40
+ #av_main #poststuff > .postbox:first-child {
41
+ margin-top: 20px;
42
+ }
43
+
44
+ /* @end group */
45
+
46
+
47
+ /* @group Tabelle */
48
+
49
+ #av_main table.form-table {
50
+ clear: none;
51
+ width: auto;
52
+ margin: 0;
53
+ }
54
+ #av_main table.form-table #antivirus_cronjob_enable {
55
+ margin: -3px 0 0;
56
+ }
57
+ #av_main table.form-table span.shift {
58
+ display: block;
59
+ margin: 2px 0 0 18px;
60
+ *margin-left: 26px;
61
+ }
62
+
63
+ /* @end group */
64
+
65
+
66
+ /* @group Complete Scan */
67
+
68
+ #av_completed {
69
+ height: 1%;
70
+ overflow: hidden;
71
+ }
72
+ #av_completed .output {
73
+ float: left;
74
+ }
75
+ #av_completed .output div {
76
+ margin-top: 8px;
77
+ }
78
+ #av_completed .output div a {
79
+ margin: 0 0 -1px 5px;
80
+ padding: 1px 4px 2px;
81
+ font-size: 10px;
82
+ background: #FFF;
83
+ text-decoration: none;
84
+
85
+ border-radius: 2px;
86
+ -o-border-radius: 2px;
87
+ -ms-border-radius: 2px;
88
+ -moz-border-radius: 2px;
89
+ -webkit-border-radius: 2px;
90
+ }
91
+ #av_completed .agenda {
92
+ float: right;
93
+ border: 1px solid #DFDFDF;
94
+ margin: 4px 6px 0;
95
+ padding: 2px 5px 2px 6px;
96
+
97
+ border-radius: 5px;
98
+ -o-border-radius: 5px;
99
+ -ms-border-radius: 5px;
100
+ -moz-border-radius: 5px;
101
+ -webkit-border-radius: 5px;
102
+ }
103
+ #av_completed .agenda li {
104
+ clear: both;
105
+ height: 1%;
106
+ margin: 0 !important;
107
+ overflow: hidden;
108
+ }
109
+ #av_completed .agenda li p {
110
+ float: left;
111
+ width: 10px;
112
+ height: 10px;
113
+ margin: 3px 3px 0 0 !important;
114
+ background: green;
115
+
116
+ border-radius: 2px;
117
+ -o-border-radius: 2px;
118
+ -ms-border-radius: 2px;
119
+ -moz-border-radius: 2px;
120
+ -webkit-border-radius: 2px;
121
+ }
122
+ #av_completed .agenda li.danger p {
123
+ background: red;
124
+ }
125
+ #av_completed .agenda li span {
126
+ float: left;
127
+ font-size: 10px;
128
+ }
129
+
130
+ /* @end group */
131
+
132
+
133
+ /* @group Manual Scan */
134
+
135
+ #av_manual {
136
+ height: 1%;
137
+ overflow: hidden;
138
+ }
139
+ #av_manual a.button {
140
+ float: left;
141
+ }
142
+ #av_manual .alert {
143
+ float: left;
144
+ color: green;
145
+ margin: 1px 10px 0;
146
+ border: 1px solid green;
147
+ display: none;
148
+ padding: 2px 5px;
149
+
150
+ border-radius: 5px;
151
+ -o-border-radius: 5px;
152
+ -ms-border-radius: 5px;
153
+ -moz-border-radius: 5px;
154
+ -webkit-border-radius: 5px;
155
+ }
156
+
157
+ #av_main .inside .output {
158
+ clear: both;
159
+ height: 1%;
160
+ padding: 0 0 6px;
161
+ overflow: hidden;
162
+ }
163
+ #av_main .inside .output div {
164
+ float: left;
165
+ color: #FFF;
166
+ margin: 12px 6px 0;
167
+ padding: 8px 12px 10px;
168
+ font-size: 11px !important;
169
+ background: orange;
170
+ line-height: 1.2em;
171
+
172
+ border-radius: 8px;
173
+ -o-border-radius: 8px;
174
+ -ms-border-radius: 8px;
175
+ -moz-border-radius: 8px;
176
+ -webkit-border-radius: 8px;
177
+
178
+ transition: background-color 0.5s linear;
179
+ -o-transition: background-color 0.5s linear;
180
+ -ms-transition: background-color 0.5s linear;
181
+ -moz-transition: background-color 0.5s linear;
182
+ -webkit-transition: background-color 0.5s linear;
183
+ }
184
+ #av_main .inside .output div.done {
185
+ background: green;
186
+ }
187
+ #av_main .inside .output div.danger {
188
+ width: 97%;
189
+ background: red;
190
+ }
191
+ #av_main .inside .output div p {
192
+ padding: 10px;
193
+ overflow: hidden;
194
+ background: #F9F9F9;
195
+ white-space: nowrap;
196
+
197
+ border-radius: 8px;
198
+ -o-border-radius: 8px;
199
+ -ms-border-radius: 8px;
200
+ -moz-border-radius: 8px;
201
+ -webkit-border-radius: 8px;
202
+ }
203
+ #av_main .inside .output div p a {
204
+ float: left;
205
+ color: #646464;
206
+ margin: 0 6px 12px 0;
207
+ display: block;
208
+ border: 1px solid #bbbbbb;
209
+ padding: 2px 5px;
210
+ background: #f2f2f2;
211
+ text-decoration: none;
212
+
213
+ border-radius: 5px;
214
+ -o-border-radius: 5px;
215
+ -ms-border-radius: 5px;
216
+ -moz-border-radius: 5px;
217
+ -webkit-border-radius: 5px;
218
+ }
219
+ #av_main .inside .output div p a:hover {
220
+ color: #000;
221
+ border: 1px solid #646464;
222
+ }
223
+ #av_main .inside .output div p code {
224
+ clear: both;
225
+ float: left;
226
+ color: #000;
227
+ padding: 2px 5px;
228
+
229
+ border-radius: 2px;
230
+ -o-border-radius: 2px;
231
+ -o-border-radius: 2px;
232
+ -moz-border-radius: 2px;
233
+ -webkit-border-radius: 2px;
234
+ }
235
+ #av_main .inside .output div p code span {
236
+ padding: 2px;
237
+ background: yellow;
238
+ }
239
+
240
+ /* @end group */
img/icon.png ADDED
Binary file
img/icon16.png ADDED
Binary file
img/icon32.png ADDED
Binary file
js/script.js ADDED
@@ -0,0 +1,5 @@
 
 
 
 
 
1
+ jQuery(document).ready(function(b){function g(a){var d=parseInt(a||0);b.post(av_ajax,{action:"get_ajax_response",_ajax_nonce:av_nonce,_theme_file:av_files[d],_action_request:"check_theme_file"},function(c){var a=b("#av_template_"+d);if(c){c=eval("("+c+")");if(!c.nonce||c.nonce!=av_nonce)return;a.addClass("danger");for(var e=c.data,f=e.length,c=0;c<f;c+=3){var i=parseInt(e[c])+1,h=e[c+2],j=e[c+1].replace(/@span@/g,"<span>").replace(/@\/span@/g,"</span>"),k=a.text();a.append('<p><a href="#" id="'+h+
2
+ '">'+av_msg_1+'</a> <a href="theme-editor.php?file='+k+"&theme="+av_theme+'&dir=theme" target="_blank">'+av_msg_2+" "+i+"</a><code>"+j+"</code></p>");b("#"+h).click(function(){b.post(av_ajax,{action:"get_ajax_response",_ajax_nonce:av_nonce,_file_md5:b(this).attr("id"),_action_request:"update_white_list"},function(a){a&&(a=eval("("+a+")"),a.nonce&&a.nonce==av_nonce&&(a=b("#"+a.data[0]).parent(),1>=a.parent().children().length&&a.parent().hide("slow").remove(),a.hide("slow").remove()))});return!1})}}else a.addClass("done");
3
+ av_files_loaded++;av_files_loaded>=av_files_total?b("#av_manual .alert").text(av_msg_3).fadeIn().fadeOut().fadeIn().fadeOut().fadeIn().animate({opacity:1},500).fadeOut("slow",function(){b(this).empty()}):g(d+1)})}function f(){var a=b("#av_cronjob_enable"),d=a.parents(".form-table").find("input:text");"function"===typeof b.fn.prop?d.prop("disabled",!a.prop("checked")):d.attr("disabled",!a.attr("checked"))}av_nonce=av_settings.nonce;av_ajax=av_settings.ajax;av_theme=av_settings.theme;av_msg_1=av_settings.msg_1;
4
+ av_msg_2=av_settings.msg_2;av_msg_3=av_settings.msg_3;b("#av_manual a.button").click(function(){b.post(av_ajax,{action:"get_ajax_response",_ajax_nonce:av_nonce,_action_request:"get_theme_files"},function(a){if(a&&(a=eval("("+a+")"),a.nonce&&a.nonce==av_nonce)){var d="";av_files=a.data;av_files_total=av_files.length;av_files_loaded=0;jQuery.each(av_files,function(a,b){d+='<div id="av_template_'+a+'">'+b+"</div>"});b("#av_manual .alert").empty();b("#av_manual .output").empty().append(d);g()}});return!1});
5
+ b("#av_cronjob_enable").click(f);f()});
js/script.orginal.js ADDED
@@ -0,0 +1,192 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
+ /* Init */
46
+ var i,
47
+ lines = input.data,
48
+ len = lines.length;
49
+
50
+ /* Zeilen loopen */
51
+ for (i = 0; i < len; i = i + 3) {
52
+ var num = parseInt(lines[i]) + 1,
53
+ md5 = lines[i + 2],
54
+ line = lines[i + 1].replace(/@span@/g, '<span>').replace(/@\/span@/g, '</span>'),
55
+ 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 $$ = $('#av_cronjob_enable'),
175
+ input = $$.parents('.form-table').find('input:text');
176
+
177
+ if ( typeof $.fn.prop === 'function' ) {
178
+ input.prop('disabled', !$$.prop('checked'));
179
+ } else {
180
+ input.attr('disabled', !$$.attr('checked'));
181
+ }
182
+
183
+
184
+ }
185
+
186
+ /* Checkbox überwachen */
187
+ $('#av_cronjob_enable').click(manage_options);
188
+
189
+ /* Fire! */
190
+ manage_options();
191
+ }
192
+ );
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: Sergej Müller\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 "Virus suspected"
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 "Virus suspected"
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 "Virus suspected"
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 "Virus suspected"
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: 2011-12-05 20:42+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 "Virus suspected"
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,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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 "Virus suspected"
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
+
132
+ #~ msgid "Version"
133
+ #~ msgstr "Versão"
134
+
135
+ #~ msgid "Author"
136
+ #~ msgstr "Autor"
137
+
138
+ #~ msgid ""
139
+ #~ "Enable the daily antivirus scan and send the administrator an e-mail if "
140
+ #~ "Virus suspected"
141
+ #~ msgstr ""
142
+ #~ "Ativar o antivírus diariamente, verificar e enviar ao administrador um "
143
+ #~ "email se há suspeita de um vírus."
144
+
145
+ #~ msgid "Last"
146
+ #~ msgstr "Último"
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 "Virus suspected"
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 "Virus suspected"
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,104 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ === AntiVirus ===
2
+ Contributors: sergej.mueller
3
+ Tags: antivirus, malware, scanner
4
+ Donate link: http://flattr.com/profile/sergej.mueller
5
+ Requires at least: 2.8
6
+ Tested up to: 3.3
7
+ Stable tag: trunk
8
+
9
+
10
+
11
+ Useful plugin that will scan your theme templates for malicious injections. Automatically. Every day. For more blog security.
12
+
13
+
14
+
15
+ == Description ==
16
+
17
+ = Scan & Notify =
18
+ *AntiVirus for WordPress* is a easy and safe tool to protect your blog install against exploits, malware and spam injections. Scan your templates now!
19
+
20
+ = Features =
21
+ * Virus alert in the admin bar
22
+ * Cleaning up after plugin removal
23
+ * Translations into many languages​​
24
+ * Daily scan with email notifications
25
+ * Database tables and theme templates checks
26
+ * WordPress 3.x ready: both visually and technically
27
+ * Whitelist solution: Mark suspected cases as "no virus"
28
+ * Manual check of template files with alerts on suspected cases
29
+
30
+ = Documentation =
31
+ * [Sicherheit: AntiVirus für WordPress](http://playground.ebiene.de/antivirus-wordpress-plugin/ "AntiVirus für WordPress") (DE)
32
+
33
+ = Author =
34
+ * [Google+](https://plus.google.com/110569673423509816572 "Google+")
35
+ * [Portfolio](http://ebiene.de "Portfolio")
36
+
37
+
38
+
39
+ == Changelog ==
40
+
41
+ = 1.3 =
42
+ * Xmas Edition
43
+
44
+ = 1.2 =
45
+ * "Virus suspected" alert in the admin bar
46
+ * Fix for the manual scan link on dashboard
47
+ * More detailed checks for existing malware
48
+ * Code adjustments for WordPress 3.3
49
+
50
+ = 1.1 =
51
+ * Testing for templates with empty content
52
+ * Minimum requirement upgraded to 2.8 and PHP5
53
+ * Code improvements for more speed
54
+ * GUI changes
55
+
56
+ = 1.0 =
57
+ * More security checks (Email & Regexp)
58
+
59
+ = 0.9 =
60
+ * Changes for the current WordPress virus
61
+
62
+ = 0.8 =
63
+ * Support for WordPress 3.0
64
+ * System requirements: WordPress 2.7
65
+ * Code optimization
66
+
67
+ = 0.7 =
68
+ * Advanced templates check
69
+
70
+ = 0.6 =
71
+ * WordPress 2.9 support
72
+
73
+ = 0.5 =
74
+ * Add security scan for the current [WordPress permalink back door](http://mashable.com/2009/09/05/wordpress-attack/ "WordPress permalink back door")
75
+ * Software architecture changes
76
+
77
+ = 0.4 =
78
+ * Adds support for WordPress new changelog readme.txt standard
79
+ * Various changes for more speed, usability and security
80
+
81
+ = 0.3 =
82
+ * Add alternate e-mail address (admin e-mail address as default)
83
+ * Admin notice on dashboard where it has found the virus suspicion
84
+ * Added blog URL in e-mail
85
+ * WordPress 2.8 support
86
+ * Check for hidden iframes
87
+ * Bugfix for IE problem with box positions
88
+ * Cleanup the source code
89
+ * Language support for Persian
90
+
91
+ = 0.2 =
92
+ * Whitelist: Mark the suspicion as "No virus"
93
+ * Improving the output formatting
94
+ * Add WPlize library for option data
95
+ * Language support for Italian
96
+
97
+ = 0.1 =
98
+ * AntiVirus for WordPress goes online
99
+
100
+
101
+
102
+ == Screenshots ==
103
+
104
+ 1. WordPress AntiVirus settings
screenshot-1.png ADDED
Binary file