ManageWP Worker - Version 3.8.8

Version Description

  • New feature: Bulk add links to blogroll
  • New feature: Manual backups to email address
  • New feature: Backup requirements check (under Manage Backups)
  • New feature: Popup menu for groups allowing to show dashboard for that group only
  • New feature: Favorite list for plugins and themes for later quick installation to multiple blogs
  • New feature: Invite friends
  • Fixed: problem with backups and write permissions when upload dir was wrongly set
  • Fixed: problem adding sites where WordPress is installed in a folder
  • Fixed: 408 error message problem when adding site
  • Fixed: site time out problems when adding site
  • Fixed: problems with some WP plugins (WP Sentinel)
  • Fixed: problems with upgrade notifications
Download this release

Release Info

Developer freediver
Plugin Icon 128x128 ManageWP Worker
Version 3.8.8
Comparing to
See all releases

Code changes from version 3.8.7 to 3.8.8

backup.class.php CHANGED
@@ -14,43 +14,33 @@ class MMB_Backup extends MMB_Core
14
  {
15
  function __construct()
16
  {
17
- $upload_dir = wp_upload_dir();
18
- $sec_string = md5('mmb-worker');
19
- $file = "/$sec_string/backups";
20
- $file_path = $upload_dir['basedir'] . $file;
21
- file_put_contents($file_path . '/index.php', '');
22
- if (!file_exists($file_path)) {
23
- if (!mkdir($file_path, 0755, true))
24
- return array(
25
- 'error' => 'Permission denied, make sure you have write permission to wp-content folder.'
26
- );
27
- }
28
  parent::__construct();
29
  }
30
 
31
  function backup($args)
32
- {
33
- $this->_escape($args);
34
-
35
  //type like manual, weekly, daily
36
  $type = $args['type'];
37
- //what like full, only db, only wp-content
38
  $what = $args['what'];
 
39
  if (trim($type) == '')
40
  $type = 'manual'; //default
41
-
42
- $upload_dir = wp_upload_dir();
43
  $sec_string = md5('mmb-worker');
44
- $file = "/$sec_string/backups";
45
- $file_path = $upload_dir['basedir'] . $file;
46
-
 
47
  if (!file_exists($file_path)) {
48
  if (!mkdir($file_path, 0755, true))
49
  return array(
50
  'error' => 'Permission denied, make sure you have write permission to wp-content folder.'
51
  );
52
  }
53
-
 
54
  if (trim($what) == 'full') {
55
  //take wp-content backup
56
  $content_backup = $this->backup_wpcontent($type);
@@ -80,7 +70,8 @@ class MMB_Backup extends MMB_Core
80
 
81
  // Get previous backup in tmp
82
  $worker_options = get_option('mmb-worker');
83
- $tmp_file = $upload_dir['basedir'] . '/' . basename($worker_options['backups'][$type]['path']);
 
84
 
85
  if (rename($worker_options['backups'][$type]['path'], $tmp_file)) {
86
  @unlink($worker_options['backups'][$type]['path']);
@@ -95,31 +86,21 @@ class MMB_Backup extends MMB_Core
95
  "",
96
  "-"
97
  ), $site_name);
98
- $backup_file = $file_path . '/' . $site_name . '_' . $type . '_' . $what . '_' . date('Y-m-d') . '.zip';
99
 
100
- if (!$this->check_zip()) {
 
 
 
101
  $archive = new PclZip($backup_file);
102
  }
103
 
104
  if (trim($what) == 'full') {
105
  $htaccess_path = ABSPATH . ".htaccess";
106
  $wp_config_path = ABSPATH . "wp-config.php";
107
- if ($this->check_zip() && ($func = $this->check_sys())) {
108
  $command = "zip $backup_file -j $content_backup[path] -j $db_backup[path] -j $htaccess_path -j $wp_config_path";
109
  ob_start();
110
- switch ($func) {
111
- case 'passthru':
112
- passthru($command, $err);
113
- break;
114
- case 'exec':
115
- exec($command);
116
- break;
117
- case 'system':
118
- system($command);
119
- break;
120
- default:
121
- break;
122
- }
123
  ob_get_clean();
124
  } else {
125
  $result = $archive->add($content_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
@@ -130,22 +111,10 @@ class MMB_Backup extends MMB_Core
130
  }
131
 
132
  } elseif (trim($what) == 'db') {
133
- if ($this->check_zip() && ($func = $this->check_sys())) {
134
  $command = "zip $backup_file -j $db_backup[path]";
135
  ob_start();
136
- switch ($func) {
137
- case 'passthru':
138
- passthru($command, $err);
139
- break;
140
- case 'exec':
141
- exec($command);
142
- break;
143
- case 'system':
144
- system($command);
145
- break;
146
- default:
147
- break;
148
- }
149
  ob_get_clean();
150
  } else {
151
  $result = $archive->add($db_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
@@ -165,7 +134,9 @@ class MMB_Backup extends MMB_Core
165
  @unlink($tmp_file);
166
  @unlink($content_backup['path']);
167
  @unlink($db_backup['path']);
168
- $backup_url = $upload_dir['baseurl'] . $file . '/' . $site_name . '_' . $type . '_' . $what . '_' . date('Y-m-d') . '.zip';
 
 
169
  $worker_options = get_option('mmb-worker');
170
  //remove old file
171
  if ($worker_options['backups'][$type]['path'] != $backup_file) {
@@ -176,43 +147,31 @@ class MMB_Backup extends MMB_Core
176
  $worker_options['backups'][$type]['url'] = $backup_url;
177
  update_option('mmb-worker', $worker_options);
178
 
 
179
  //Everything went fine, return backup url to master
180
  return $worker_options['backups'][$type]['url'];
181
  }
182
 
183
  function backup_wpcontent($type)
184
  {
185
- $upload_dir = wp_upload_dir();
186
  $sec_string = md5('mmb-worker');
187
- $file = '/' . $sec_string . '/backups/wp-content_' . date('Y-m-d') . '.zip';
188
- $file_path = $upload_dir['basedir'] . $file;
189
- if ($this->check_zip() && ($func = $this->check_sys())) {
 
190
  chdir(WP_CONTENT_DIR);
191
- $command = "zip -r $file_path 'plugins/' 'themes/' 'uploads/' -x 'uploads/" . $sec_string . "/*'";
192
  ob_start();
193
- switch ($func) {
194
- case 'passthru':
195
- passthru($command, $err);
196
- break;
197
- case 'exec':
198
- exec($command);
199
- break;
200
- case 'system':
201
- system($command);
202
- break;
203
- default:
204
- break;
205
- }
206
  ob_get_clean();
207
- if (!$err || $err == 18) {
208
- $file_url = $upload_dir['baseurl'] . $file;
209
- return array(
210
  'path' => $file_path,
211
  'url' => $file_url
212
- );
213
- }
214
- @unlink($file_path);
215
- return false;
216
 
217
  } else {
218
  require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
@@ -221,9 +180,9 @@ class MMB_Backup extends MMB_Core
221
  $result = $archive->add(WP_CONTENT_DIR . '/themes', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
222
  $result = $archive->add(WP_CONTENT_DIR . '/uploads', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
223
 
224
- $result = $archive->delete(PCLZIP_OPT_BY_NAME, 'uploads/' . $sec_string . '/');
225
  if ($result) {
226
- $file_url = $upload_dir['baseurl'] . $file;
227
  return array(
228
  'path' => $file_path,
229
  'url' => $file_url
@@ -238,7 +197,7 @@ class MMB_Backup extends MMB_Core
238
  function backup_db($type)
239
  {
240
  $mysqldump_exists = $this->check_mysqldump();
241
- if (is_array($mysqldump_exists) && $this->check_sys()) {
242
  $result = $this->backup_db_dump($type, $mysqldump_exists);
243
 
244
  } else {
@@ -251,29 +210,15 @@ class MMB_Backup extends MMB_Core
251
  function backup_db_dump($type, $paths)
252
  {
253
  global $wpdb;
254
- $upload_dir = wp_upload_dir();
255
  $sec_string = md5('mmb-worker');
256
  $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
257
 
258
- $file = $upload_dir['path'] . '/' . DB_NAME . '.sql';
259
- $file_url = $upload_dir['baseurl'] . '/' . DB_NAME . '.sql';
260
 
261
  $command = $brace . $paths['mysqldump'] . $brace . ' --host="' . DB_HOST . '" --user="' . DB_USER . '" --password="' . DB_PASSWORD . '" --add-drop-table --skip-lock-tables "' . DB_NAME . '" > ' . $brace . $file . $brace;
262
  ob_start();
263
- $func = $this->check_sys();
264
- switch ($func) {
265
- case 'passthru':
266
- passthru($command, $error);
267
- break;
268
- case 'exec':
269
- exec($command);
270
- break;
271
- case 'system':
272
- system($command);
273
- break;
274
- default:
275
- break;
276
- }
277
  ob_get_clean();
278
 
279
  if ($error) {
@@ -296,13 +241,12 @@ class MMB_Backup extends MMB_Core
296
  {
297
  global $wpdb;
298
  $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
299
- $upload_dir = wp_upload_dir();
300
  $sec_string = md5('mmb-worker');
301
- $zip_file = '/' . $sec_string . '/backups/db_' . date('Y-m-d') . '.zip';
302
- $zip_file_path = $upload_dir['basedir'] . $zip_file;
303
 
304
- $file = $upload_dir['path'] . '/' . DB_NAME . '.sql';
305
- $file_url = $upload_dir['baseurl'] . '/' . DB_NAME . '.sql';
306
 
307
  foreach ($tables as $table) {
308
  //drop exixting table
@@ -356,40 +300,27 @@ class MMB_Backup extends MMB_Core
356
  }
357
 
358
  function restore($args)
359
- {
360
- $this->_escape($args);
361
  $type = $args['type'];
362
  if (trim($type) == '') {
363
  return false;
364
  }
 
365
  // Set paths
366
- $upload_dir = wp_upload_dir();
367
  $sec_string = md5('mmb-worker');
368
- $backup_dir = "/$sec_string/backups";
369
  $file = "/$sec_string/restore";
370
- $file_path = $upload_dir['basedir'] . $file; //restore path - temporary
371
- $backup_path = $upload_dir['basedir'] . $backup_dir; //backup path
372
-
373
- // If manual backup - get backup file from master, if not - get backup file from worker
374
- if ($type != 'weekly' && $type != 'daily') {
375
- // Download backup file from master
376
- include_once(ABSPATH . 'wp-admin/includes/file.php');
377
- $tmp_file = download_url($type);
378
- $backup_file = $backup_path . "/" . basename($type);
379
- if (rename($tmp_file, $backup_file)) {
380
- @unlink($tmp_file);
381
- } else {
382
- $backup_file = $tmp_file;
383
- }
384
-
385
- } else {
386
- // Getting file from worker
387
- $backup_file = $worker_options['backups'][$type]['path'];
388
- }
389
 
 
 
 
390
 
391
- if ($backup_file) {
392
- if ($this->check_unzip() && ($func = $this->check_sys())) {
393
  if (!mkdir($file_path))
394
  return array(
395
  'error' => 'Failed to create restore folder.'
@@ -398,20 +329,7 @@ class MMB_Backup extends MMB_Core
398
  chdir($file_path);
399
  $command = "unzip -o $backup_file";
400
  ob_start();
401
-
402
- switch ($func) {
403
- case 'passthru':
404
- passthru($command, $err);
405
- break;
406
- case 'exec':
407
- exec($command);
408
- break;
409
- case 'system':
410
- system($command);
411
- break;
412
- default:
413
- break;
414
- }
415
  ob_get_clean();
416
 
417
  } else {
@@ -445,6 +363,10 @@ class MMB_Backup extends MMB_Core
445
  }
446
  }
447
 
 
 
 
 
448
  $this->delete_temp_dir($file_path);
449
  } else {
450
  return array(
@@ -461,24 +383,12 @@ class MMB_Backup extends MMB_Core
461
  $content_file = glob($file_path . "/*.zip");
462
  $wp_config_file = glob($file_path . "/wp-config.php");
463
  $htaccess_file = glob($file_path . "/.htaccess");
464
- if ($this->check_unzip() && ($func = $this->check_sys())) {
465
  chdir(WP_CONTENT_DIR);
466
  $con_file = $content_file[0];
467
  $command = "unzip -o $con_file";
468
  ob_start();
469
- switch ($func) {
470
- case 'passthru':
471
- passthru($command, $err);
472
- break;
473
- case 'exec':
474
- exec($command);
475
- break;
476
- case 'system':
477
- system($command);
478
- break;
479
- default:
480
- break;
481
- }
482
  ob_get_clean();
483
  } else {
484
  $archive = new PclZip($content_file[0]);
@@ -503,25 +413,13 @@ class MMB_Backup extends MMB_Core
503
 
504
  $mysqldump = $this->check_mysqldump();
505
 
506
- if (is_array($mysqldump) && ($func = $this->check_sys())) {
507
  $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
508
 
509
  foreach (glob($file_path . '/*.sql') as $filename) {
510
  $command = $brace . $mysqldump['mysql'] . $brace . ' --host="' . DB_HOST . '" --user="' . DB_USER . '" --password="' . DB_PASSWORD . '" ' . DB_NAME . ' < ' . $brace . $filename . $brace;
511
  ob_start();
512
- switch ($func) {
513
- case 'passthru':
514
- passthru($command, $error);
515
- break;
516
- case 'exec':
517
- exec($command);
518
- break;
519
- case 'system':
520
- system($command);
521
- break;
522
- default:
523
- break;
524
- }
525
  ob_get_clean();
526
  break;
527
  }
@@ -617,9 +515,9 @@ class MMB_Backup extends MMB_Core
617
  $paths['mysqldump'] = 'mysqldump.exe';
618
  }
619
  } else {
620
- if (function_exists('exec')) {
621
- $paths['mysql'] = @exec('which mysql');
622
- $paths['mysqldump'] = @exec('which mysqldump');
623
  } else {
624
  $paths['mysql'] = 'mysql';
625
  $paths['mysqldump'] = 'mysqldump';
@@ -636,32 +534,144 @@ class MMB_Backup extends MMB_Core
636
  return $paths;
637
  }
638
 
639
- //Check if passthru, system or exec functions exist
640
  function check_sys()
641
  {
642
- if (function_exists('passthru'))
643
- return 'passthru';
644
 
645
  if (function_exists('system'))
646
  return 'system';
647
 
648
- if (function_exists('exec'))
649
- return 'exec';
650
 
651
  return false;
652
 
653
  }
654
 
655
- function check_zip()
656
  {
657
- $zip = @exec('which zip');
658
- return $zip ? true : false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
659
  }
660
 
661
- function check_unzip()
662
  {
663
- $zip = @exec('which unzip');
664
- return $zip ? true : false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
665
  }
666
 
667
  }
14
  {
15
  function __construct()
16
  {
 
 
 
 
 
 
 
 
 
 
 
17
  parent::__construct();
18
  }
19
 
20
  function backup($args)
21
+ {
22
+ @ini_set('memory_limit', '300M');
23
+ @set_time_limit(300);
24
  //type like manual, weekly, daily
25
  $type = $args['type'];
26
+ //what like full or only db
27
  $what = $args['what'];
28
+
29
  if (trim($type) == '')
30
  $type = 'manual'; //default
 
 
31
  $sec_string = md5('mmb-worker');
32
+ $file = "/$sec_string/mwp_backups";
33
+ $file_path = WP_CONTENT_DIR . $file;
34
+ @ini_set('memory_limit', '300M');
35
+ @set_time_limit(300);
36
  if (!file_exists($file_path)) {
37
  if (!mkdir($file_path, 0755, true))
38
  return array(
39
  'error' => 'Permission denied, make sure you have write permission to wp-content folder.'
40
  );
41
  }
42
+ file_put_contents($file_path . '/index.php', ''); //safe
43
+
44
  if (trim($what) == 'full') {
45
  //take wp-content backup
46
  $content_backup = $this->backup_wpcontent($type);
70
 
71
  // Get previous backup in tmp
72
  $worker_options = get_option('mmb-worker');
73
+
74
+ $tmp_file = WP_CONTENT_DIR . '/' . basename($worker_options['backups'][$type]['path']);
75
 
76
  if (rename($worker_options['backups'][$type]['path'], $tmp_file)) {
77
  @unlink($worker_options['backups'][$type]['path']);
86
  "",
87
  "-"
88
  ), $site_name);
 
89
 
90
+ $hash = md5(time());
91
+ $backup_file = $file_path . '/' . $site_name . '_' . $type . '_' . $what . '_' . date('Y-m-d') .'_'.$hash. '.zip';
92
+
93
+ if ($this->mmb_exec('which zip') == false) {
94
  $archive = new PclZip($backup_file);
95
  }
96
 
97
  if (trim($what) == 'full') {
98
  $htaccess_path = ABSPATH . ".htaccess";
99
  $wp_config_path = ABSPATH . "wp-config.php";
100
+ if ($this->mmb_exec('which zip')) {
101
  $command = "zip $backup_file -j $content_backup[path] -j $db_backup[path] -j $htaccess_path -j $wp_config_path";
102
  ob_start();
103
+ $this->mmb_exec($command);
 
 
 
 
 
 
 
 
 
 
 
 
104
  ob_get_clean();
105
  } else {
106
  $result = $archive->add($content_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
111
  }
112
 
113
  } elseif (trim($what) == 'db') {
114
+ if ($this->mmb_exec('which zip')) {
115
  $command = "zip $backup_file -j $db_backup[path]";
116
  ob_start();
117
+ $this->mmb_exec($command);
 
 
 
 
 
 
 
 
 
 
 
 
118
  ob_get_clean();
119
  } else {
120
  $result = $archive->add($db_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
134
  @unlink($tmp_file);
135
  @unlink($content_backup['path']);
136
  @unlink($db_backup['path']);
137
+
138
+ $backup_url = WP_CONTENT_URL . $file . '/' . $site_name . '_' . $type . '_' . $what . '_' . date('Y-m-d') .'_'.$hash. '.zip';
139
+
140
  $worker_options = get_option('mmb-worker');
141
  //remove old file
142
  if ($worker_options['backups'][$type]['path'] != $backup_file) {
147
  $worker_options['backups'][$type]['url'] = $backup_url;
148
  update_option('mmb-worker', $worker_options);
149
 
150
+
151
  //Everything went fine, return backup url to master
152
  return $worker_options['backups'][$type]['url'];
153
  }
154
 
155
  function backup_wpcontent($type)
156
  {
 
157
  $sec_string = md5('mmb-worker');
158
+ $file = '/' . $sec_string . '/mwp_backups/wp-content_' . date('Y-m-d') . '.zip';
159
+ $file_path = WP_CONTENT_DIR . $file;
160
+
161
+ if ($this->mmb_exec('which zip')) {
162
  chdir(WP_CONTENT_DIR);
163
+ $command = "zip -r $file_path 'plugins/' 'themes/' 'uploads/' -x '" . $sec_string . "/*'";
164
  ob_start();
165
+ $this->mmb_exec($command);
 
 
 
 
 
 
 
 
 
 
 
 
166
  ob_get_clean();
167
+ $file_url = WP_CONTENT_URL . $file;
168
+ return array(
 
169
  'path' => $file_path,
170
  'url' => $file_url
171
+ );
172
+
173
+ //@unlink($file_path);
174
+ //return false;
175
 
176
  } else {
177
  require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
180
  $result = $archive->add(WP_CONTENT_DIR . '/themes', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
181
  $result = $archive->add(WP_CONTENT_DIR . '/uploads', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
182
 
183
+ $result = $archive->delete(PCLZIP_OPT_BY_NAME, $sec_string . '/');
184
  if ($result) {
185
+ $file_url = WP_CONTENT_URL . $file;
186
  return array(
187
  'path' => $file_path,
188
  'url' => $file_url
197
  function backup_db($type)
198
  {
199
  $mysqldump_exists = $this->check_mysqldump();
200
+ if (is_array($mysqldump_exists)) {
201
  $result = $this->backup_db_dump($type, $mysqldump_exists);
202
 
203
  } else {
210
  function backup_db_dump($type, $paths)
211
  {
212
  global $wpdb;
 
213
  $sec_string = md5('mmb-worker');
214
  $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
215
 
216
+ $file = WP_CONTENT_DIR . '/' . DB_NAME . '.sql';
217
+ $file_url = WP_CONTENT_URL . '/' . DB_NAME . '.sql';
218
 
219
  $command = $brace . $paths['mysqldump'] . $brace . ' --host="' . DB_HOST . '" --user="' . DB_USER . '" --password="' . DB_PASSWORD . '" --add-drop-table --skip-lock-tables "' . DB_NAME . '" > ' . $brace . $file . $brace;
220
  ob_start();
221
+ $this->mmb_exec($command);
 
 
 
 
 
 
 
 
 
 
 
 
 
222
  ob_get_clean();
223
 
224
  if ($error) {
241
  {
242
  global $wpdb;
243
  $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
 
244
  $sec_string = md5('mmb-worker');
245
+ $zip_file = '/' . $sec_string . '/mwp_backups/db_' . date('Y-m-d') . '.zip';
246
+ $zip_file_path = WP_CONTENT_DIR . $zip_file;
247
 
248
+ $file = WP_CONTENT_DIR . '/' . DB_NAME . '.sql';
249
+ $file_url = WP_CONTENT_URL . '/' . DB_NAME . '.sql';
250
 
251
  foreach ($tables as $table) {
252
  //drop exixting table
300
  }
301
 
302
  function restore($args)
303
+ {
304
+
305
  $type = $args['type'];
306
  if (trim($type) == '') {
307
  return false;
308
  }
309
+
310
  // Set paths
 
311
  $sec_string = md5('mmb-worker');
 
312
  $file = "/$sec_string/restore";
313
+ $file_path = WP_CONTENT_DIR . $file; //restore path - temporary
314
+ $backup_path = WP_CONTENT_DIR;
315
+ @ini_set('memory_limit', '300M');
316
+ @set_time_limit(300);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
317
 
318
+ // Getting file from worker
319
+ $worker_options = get_option('mmb-worker');
320
+ $backup_file = $worker_options['backups'][$type]['path'];
321
 
322
+ if ($backup_file && file_exists($backup_file)) {
323
+ if ($this->mmb_exec('which unzip')) {
324
  if (!mkdir($file_path))
325
  return array(
326
  'error' => 'Failed to create restore folder.'
329
  chdir($file_path);
330
  $command = "unzip -o $backup_file";
331
  ob_start();
332
+ $this->mmb_exec($command);
 
 
 
 
 
 
 
 
 
 
 
 
 
333
  ob_get_clean();
334
 
335
  } else {
363
  }
364
  }
365
 
366
+ if($del_backup_later)
367
+ {
368
+ @unlink($backup_file);
369
+ }
370
  $this->delete_temp_dir($file_path);
371
  } else {
372
  return array(
383
  $content_file = glob($file_path . "/*.zip");
384
  $wp_config_file = glob($file_path . "/wp-config.php");
385
  $htaccess_file = glob($file_path . "/.htaccess");
386
+ if ($this->mmb_exec('which unzip')) {
387
  chdir(WP_CONTENT_DIR);
388
  $con_file = $content_file[0];
389
  $command = "unzip -o $con_file";
390
  ob_start();
391
+ $this->mmb_exec($command);
 
 
 
 
 
 
 
 
 
 
 
 
392
  ob_get_clean();
393
  } else {
394
  $archive = new PclZip($content_file[0]);
413
 
414
  $mysqldump = $this->check_mysqldump();
415
 
416
+ if (is_array($mysqldump)) {
417
  $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
418
 
419
  foreach (glob($file_path . '/*.sql') as $filename) {
420
  $command = $brace . $mysqldump['mysql'] . $brace . ' --host="' . DB_HOST . '" --user="' . DB_USER . '" --password="' . DB_PASSWORD . '" ' . DB_NAME . ' < ' . $brace . $filename . $brace;
421
  ob_start();
422
+ $this->mmb_exec($command);
 
 
 
 
 
 
 
 
 
 
 
 
423
  ob_get_clean();
424
  break;
425
  }
515
  $paths['mysqldump'] = 'mysqldump.exe';
516
  }
517
  } else {
518
+ if ($this->check_sys()) {
519
+ $paths['mysql'] = $this->mmb_exec('which mysql');
520
+ $paths['mysqldump'] = $this->mmb_exec('which mysqldump');
521
  } else {
522
  $paths['mysql'] = 'mysql';
523
  $paths['mysqldump'] = 'mysqldump';
534
  return $paths;
535
  }
536
 
537
+ //Check if exec, system, shell_exec functions exist
538
  function check_sys()
539
  {
540
+ if (function_exists('exec'))
541
+ return 'exec';
542
 
543
  if (function_exists('system'))
544
  return 'system';
545
 
546
+ if (function_exists('shell_exec'))
547
+ return 'shell_exec';
548
 
549
  return false;
550
 
551
  }
552
 
553
+ function mmb_exec($command)
554
  {
555
+ if($command == '')
556
+ return false;
557
+
558
+ if (function_exists('exec'))
559
+ {
560
+ return @exec($command);
561
+ }
562
+ elseif (function_exists('system'))
563
+ {
564
+ return @system($command);
565
+ }
566
+ elseif (function_exists('shell_exec'))
567
+ {
568
+ return @shell_exec($command);
569
+ }
570
+ else
571
+ {
572
+ return false;
573
+ }
574
  }
575
 
576
+ function email_backup($args)
577
  {
578
+ $email = $args['email'];
579
+ $what = $args['email'];
580
+ $type = $args['type'];
581
+ $worker_options = get_option('mmb-worker');
582
+ $backup_file = $worker_options['backups'][$type]['path'];
583
+ if(file_exists($backup_file) && $email)
584
+ {
585
+ $attachments = array($backup_file);
586
+ $headers = 'From: ManageWP <wordpress@managewp.com>' . "\r\n";
587
+ $subject = "Backup - " . $type ." - " . date('Y-m-d');
588
+ ob_start();
589
+ wp_mail($email, $subject, '', $headers, $attachments);
590
+ ob_end_clean();
591
+ }
592
+
593
+ }
594
+
595
+ function check_backup_compat()
596
+ {
597
+ $reqs = array();
598
+ if ( strpos($_SERVER['DOCUMENT_ROOT'], '/') === 0 ) {
599
+ $reqs['Server OS']['status'] = 'Linux (or compatible)';
600
+ $reqs['Server OS']['pass'] = true;
601
+ } else {
602
+ $reqs['Server OS']['status'] = 'Windows';
603
+ $reqs['Server OS']['pass'] = false;
604
+ $pass = false;
605
+ }
606
+ $reqs['PHP Version']['status'] = phpversion();
607
+ if ( (float) phpversion() >= 5.1 ) {
608
+ $reqs['PHP Version']['pass'] = true;
609
+ } else {
610
+ $reqs['PHP Version']['pass'] = false;
611
+ $pass = false;
612
+ }
613
+
614
+ if(is_writable(WP_CONTENT_DIR))
615
+ {
616
+ $reqs['Backup Folder']['status'] = "writable";
617
+ $reqs['Backup Folder']['pass'] = true;
618
+ }
619
+ else
620
+ {
621
+ $reqs['Backup Folder']['status'] = "not writable";
622
+ $reqs['Backup Folder']['pass'] = true;
623
+ }
624
+
625
+ if($func = $this->check_sys())
626
+ {
627
+ $reqs['Execute Function']['status'] =$func;
628
+ $reqs['Execute Function']['pass'] = true;
629
+ }
630
+ else
631
+ {
632
+ $reqs['Execute Function']['status'] = "not found";
633
+ $reqs['Execute Function']['info'] = "(will try with PHP)";
634
+ $reqs['Execute Function']['pass'] = false;
635
+ }
636
+
637
+ if($this->mmb_exec('which zip'))
638
+ {
639
+ $reqs['Zip']['status'] = "enabled";
640
+ $reqs['Zip']['pass'] = true;
641
+ }
642
+ else
643
+ {
644
+ $reqs['Zip']['status'] = "not found";
645
+ $reqs['Zip']['info'] = "(will try with PHP pclZip class)";
646
+ $reqs['Zip']['pass'] = false;
647
+ }
648
+
649
+ if($this->mmb_exec('which unzip'))
650
+ {
651
+ $reqs['Unzip']['status'] = "enabled";
652
+ $reqs['Unzip']['pass'] = true;
653
+ }
654
+ else
655
+ {
656
+ $reqs['Unzip']['status'] = "not found";
657
+ $reqs['Unzip']['info'] = "(will try with PHP pclZip class)";
658
+ $reqs['Unzip']['pass'] = false;
659
+ }
660
+ if(is_array($this->check_mysqldump()))
661
+ {
662
+ $reqs['MySQL Dump']['status'] = "enabled";
663
+ $reqs['MySQL Dump']['pass'] = true;
664
+ }
665
+ else
666
+ {
667
+ $reqs['MySQL Dump']['status'] = "not found";
668
+ $reqs['MySQL Dump']['info'] = "(will try PHP)";
669
+ $reqs['MySQL Dump']['pass'] = false;
670
+ }
671
+
672
+
673
+
674
+ return $reqs;
675
  }
676
 
677
  }
comment.class.php CHANGED
@@ -32,7 +32,7 @@ class MMB_Comment extends MMB_Core
32
  $status_sql = 'spam';
33
  elseif ( 'trash' == $status )
34
  $status_sql = 'trash';
35
- $sql = "update ".$wpdb->prefix."comments set comment_approved = '$status_sql' where comment_id = '$comment_id'";
36
  $success = $wpdb->query($sql);
37
 
38
 
32
  $status_sql = 'spam';
33
  elseif ( 'trash' == $status )
34
  $status_sql = 'trash';
35
+ $sql = "update ".$wpdb->prefix."comments set comment_approved = '$status_sql' where comment_ID = '$comment_id'";
36
  $success = $wpdb->query($sql);
37
 
38
 
core.class.php CHANGED
@@ -220,6 +220,19 @@ class MMB_Core extends MMB_Helper
220
  return $this->backup_instance;
221
  }
222
 
 
 
 
 
 
 
 
 
 
 
 
 
 
223
  function get_installer_instance()
224
  {
225
  if (!isset($this->installer_instance)) {
@@ -294,7 +307,7 @@ class MMB_Core extends MMB_Helper
294
  include_once ABSPATH . 'wp-admin/includes/template.php';
295
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
296
 
297
- if ((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && (get_filesystem_method(array(), false) != 'direct')) {
298
  return array(
299
  'error' => 'Failed, please <a target="_blank" href="http://managewp.com/user-guide#ftp">add FTP details for automatic upgrades.</a></a>'
300
  );
@@ -354,7 +367,7 @@ class MMB_Core extends MMB_Helper
354
  }
355
 
356
  if ($_GET['auto_login']) {
357
- wp_redirect(get_bloginfo('url') . "/wp-admin/" . $where);
358
  exit();
359
  }
360
  }
220
  return $this->backup_instance;
221
  }
222
 
223
+ /**
224
+ * Gets an instance of links class
225
+ *
226
+ */
227
+ function get_link_instance()
228
+ {
229
+ if (!isset($this->link_instance)) {
230
+ $this->link_instance = new MMB_Link();
231
+ }
232
+
233
+ return $this->link_instance;
234
+ }
235
+
236
  function get_installer_instance()
237
  {
238
  if (!isset($this->installer_instance)) {
307
  include_once ABSPATH . 'wp-admin/includes/template.php';
308
  include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
309
 
310
+ if (!$this->is_server_writable()) {
311
  return array(
312
  'error' => 'Failed, please <a target="_blank" href="http://managewp.com/user-guide#ftp">add FTP details for automatic upgrades.</a></a>'
313
  );
367
  }
368
 
369
  if ($_GET['auto_login']) {
370
+ wp_redirect(get_option('siteurl') . "/wp-admin/" . $where);
371
  exit();
372
  }
373
  }
helper.class.php CHANGED
@@ -76,26 +76,37 @@ class MMB_Helper
76
  * @param string $option_name
77
  * @return mixed
78
  */
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
79
  function mmb_get_transient($option_name)
80
  {
81
  if (trim($option_name) == '') {
82
  return FALSE;
83
  }
84
 
85
- global $mmb_wp_version, $_wp_using_ext_object_cache;
86
 
87
  if (version_compare($mmb_wp_version, '2.8.0', '<')) {
88
  return get_option($option_name);
89
  } else if (version_compare($mmb_wp_version, '3.0.0', '<')) {
90
- if (get_transient($option_name))
91
- return get_transient($option_name);
92
- else
93
- return get_option('_transient_' . $option_name);
94
  } else {
95
- if (get_site_transient($option_name))
96
- return get_site_transient($option_name);
97
- else
98
- return get_option('_site_transient_' . $option_name);
99
  }
100
  }
101
 
@@ -110,15 +121,9 @@ class MMB_Helper
110
  if (version_compare($mmb_wp_version, '2.8.0', '<')) {
111
  delete_option($option_name);
112
  } else if (version_compare($mmb_wp_version, '3.0.0', '<')) {
113
- if (delete_transient($option_name))
114
- delete_transient($option_name);
115
- else
116
- delete_option('_transient_' . $option_name);
117
  } else {
118
- if (delete_site_transient($option_name))
119
- delete_site_transient($option_name);
120
- else
121
- delete_option('_site_transient_' . $option_name);
122
  }
123
  }
124
 
@@ -293,7 +298,7 @@ class MMB_Helper
293
  function mmb_get_error($error_object)
294
  {
295
  if (!is_wp_error($error_object)) {
296
- return $error_object != '' ? $error_object : ' error occured.';
297
  } else {
298
  $errors = array();
299
  foreach ($error_object->error_data as $error_key => $error_string) {
@@ -303,6 +308,29 @@ class MMB_Helper
303
  }
304
  }
305
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
306
 
307
  }
308
  ?>
76
  * @param string $option_name
77
  * @return mixed
78
  */
79
+
80
+ function mmb_set_transient($option_name = false, $data = false){
81
+
82
+ if (!$option_name || !$data) {
83
+ return false;
84
+ }
85
+ global $mmb_wp_version;
86
+
87
+ if (version_compare($mmb_wp_version, '2.8.0', '<')) {
88
+ update_option($option_name, $data);
89
+ } else if (version_compare($mmb_wp_version, '3.0.0', '<')) {
90
+ update_option('_transient_' . $option_name, $data);
91
+ } else {
92
+ update_option('_site_transient_' . $option_name, $data);
93
+ }
94
+
95
+ }
96
  function mmb_get_transient($option_name)
97
  {
98
  if (trim($option_name) == '') {
99
  return FALSE;
100
  }
101
 
102
+ global $mmb_wp_version;
103
 
104
  if (version_compare($mmb_wp_version, '2.8.0', '<')) {
105
  return get_option($option_name);
106
  } else if (version_compare($mmb_wp_version, '3.0.0', '<')) {
107
+ return get_option('_transient_' . $option_name);
 
 
 
108
  } else {
109
+ return get_option('_site_transient_' . $option_name);
 
 
 
110
  }
111
  }
112
 
121
  if (version_compare($mmb_wp_version, '2.8.0', '<')) {
122
  delete_option($option_name);
123
  } else if (version_compare($mmb_wp_version, '3.0.0', '<')) {
124
+ delete_option('_transient_' . $option_name);
 
 
 
125
  } else {
126
+ delete_option('_site_transient_' . $option_name);
 
 
 
127
  }
128
  }
129
 
298
  function mmb_get_error($error_object)
299
  {
300
  if (!is_wp_error($error_object)) {
301
+ return $error_object != '' ? $error_object : '';
302
  } else {
303
  $errors = array();
304
  foreach ($error_object->error_data as $error_key => $error_string) {
308
  }
309
  }
310
 
311
+ function is_server_writable(){
312
+ if((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && (get_filesystem_method(array(), false) != 'direct'))
313
+ return false;
314
+ else
315
+ return true;
316
+ }
317
+
318
+ function mmb_download_url($url, $file_name)
319
+ {
320
+ if (function_exists('fopen') && function_exists('ini_get') && ini_get('allow_url_fopen') == true && ($destination = @fopen($file_name, 'wb')) && ($source = @fopen($url, "r")) ) {
321
+
322
+
323
+ while ($a = @fread($source, 1024* 1024)) {
324
+ @fwrite($destination, $a);
325
+ }
326
+
327
+ fclose($source);
328
+ fclose($destination);
329
+ } else
330
+ if (!fsockopen_download($url, $file_name))
331
+ die('Error downloading file ' . $url);
332
+ return $file_name;
333
+ }
334
 
335
  }
336
  ?>
init.php CHANGED
@@ -4,7 +4,7 @@ Plugin Name: ManageWP - Worker
4
  Plugin URI: http://managewp.com/
5
  Description: Manage all your blogs from one dashboard
6
  Author: Prelovac Media
7
- Version: 3.8.7
8
  Author URI: http://www.prelovac.com
9
  */
10
 
@@ -20,7 +20,7 @@ Author URI: http://www.prelovac.com
20
  **************************************************************/
21
 
22
 
23
- define('MMB_WORKER_VERSION', '3.8.7');
24
 
25
  global $wpdb, $mmb_plugin_dir, $mmb_plugin_url;
26
 
@@ -36,6 +36,7 @@ $mmb_plugin_url = WP_PLUGIN_URL . '/' . basename(dirname(__FILE__));
36
  $mmb_actions = array(
37
  'remove_site' => 'mmb_remove_site',
38
  'get_stats' => 'mmb_stats_get',
 
39
  'backup' => 'mmb_backup_now',
40
  'restore' => 'mmb_restore_now',
41
  'optimize_tables' => 'mmb_optimize_tables',
@@ -43,9 +44,13 @@ $mmb_actions = array(
43
  'create_post' => 'mmb_post_create',
44
  'update_worker' => 'mmb_update_worker_plugin',
45
  'change_comment_status' => 'mmb_change_comment_status',
 
46
  'get_comment_stats' => 'mmb_comment_stats_get',
47
  'install_addon' => 'mmb_install_addon',
48
- 'do_upgrade' => 'mmb_do_upgrade'
 
 
 
49
  );
50
 
51
  require_once("$mmb_plugin_dir/helper.class.php");
@@ -55,9 +60,9 @@ require_once("$mmb_plugin_dir/comment.class.php");
55
  require_once("$mmb_plugin_dir/stats.class.php");
56
  require_once("$mmb_plugin_dir/backup.class.php");
57
  require_once("$mmb_plugin_dir/installer.class.php");
 
58
  require_once("$mmb_plugin_dir/api.php");
59
 
60
-
61
  require_once("$mmb_plugin_dir/plugins/search/search.php");
62
  require_once("$mmb_plugin_dir/plugins/cleanup/cleanup.php");
63
 
@@ -151,8 +156,8 @@ function mmb_add_site($params)
151
  if ($verify == 1) {
152
  $mmb_core->set_master_public_key($public_key);
153
  $mmb_core->set_worker_message_id($id);
154
-
155
- mmb_response($mmb_core->get_stats_instance()->get_initial_stats(), true);
156
  } else if ($verify == 0) {
157
  mmb_response('Invalid message signature. Please contact us if you see this message often.', false);
158
  } else {
@@ -166,7 +171,8 @@ function mmb_add_site($params)
166
  $mmb_core->set_random_signature($random_key);
167
  $mmb_core->set_worker_message_id($id);
168
  $mmb_core->set_master_public_key($public_key);
169
- mmb_response($mmb_core->get_stats_instance()->get_initial_stats(), true);
 
170
  } else
171
  mmb_response('Please deactivate & activate ManageWP Worker plugin on your site, then re-add the site to your dashboard.', false);
172
  }
@@ -206,44 +212,89 @@ function mmb_remove_site($params)
206
  function mmb_stats_get($params)
207
  {
208
  global $mmb_core;
209
- mmb_response($mmb_core->get_stats_instance()->get($params), true);
 
 
 
 
 
 
 
 
210
  }
211
 
212
  //post
213
  function mmb_post_create($params)
214
  {
215
  global $mmb_core;
216
- $return = $mmb_core->get_post_instance()->create($params);
 
217
  if (is_int($return))
218
  mmb_response($return, true);
219
  else
220
  mmb_response($return, false);
221
  }
 
 
 
 
 
 
222
 
 
223
  //comments
224
  function mmb_change_comment_status($params)
225
  {
226
 
227
  global $mmb_core;
228
- $return = $mmb_core->get_comment_instance()->change_status($params);
 
229
  //mmb_response($return, true);
230
- if ($return)
231
- mmb_response($mmb_core->get_stats_instance()->get_comments_stats($params), true);
232
- else
 
233
  mmb_response('Comment not updated', false);
234
  }
235
  function mmb_comment_stats_get($params)
236
  {
237
  global $mmb_core;
238
- mmb_response($mmb_core->get_stats_instance()->get_comments_stats($params), true);
 
239
  }
240
 
241
  //backup
242
  function mmb_backup_now($params)
243
  {
244
  global $mmb_core;
 
 
245
 
246
- $return = $mmb_core->get_backup_instance()->backup($params);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
247
 
248
  if (is_array($return) && array_key_exists('error', $return))
249
  mmb_response($return['error'], false);
@@ -255,7 +306,8 @@ function mmb_backup_now($params)
255
  function mmb_optimize_tables($params)
256
  {
257
  global $mmb_core;
258
- $return = $mmb_core->get_backup_instance()->optimize_tables();
 
259
  if ($return)
260
  mmb_response($return, true);
261
  else
@@ -265,7 +317,8 @@ function mmb_optimize_tables($params)
265
  function mmb_restore_now($params)
266
  {
267
  global $mmb_core;
268
- $return = $mmb_core->get_backup_instance()->restore($params);
 
269
  if (is_array($return) && array_key_exists('error', $return))
270
  mmb_response($return['error'], false);
271
  else
@@ -289,7 +342,8 @@ function mmb_wp_checkversion($params)
289
  function mmb_search_posts_by_term($params)
290
  {
291
  global $mmb_core;
292
- $return = $mmb_core->get_search_instance()->search_posts_by_term($params);
 
293
 
294
  if ($return) {
295
  mmb_response(serialize($return), true);
@@ -301,15 +355,46 @@ function mmb_search_posts_by_term($params)
301
  function mmb_install_addon($params)
302
  {
303
  global $mmb_core;
304
- $return = $mmb_core->get_installer_instance()->install_remote_file($params);
 
305
  mmb_response($return, true);
306
 
307
  }
308
  function mmb_do_upgrade($params)
309
  {
310
  global $mmb_core, $mmb_upgrading;
311
- $return = $mmb_core->get_installer_instance()->do_upgrade($params);
 
312
  mmb_response($return, true);
313
 
314
  }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
315
  ?>
4
  Plugin URI: http://managewp.com/
5
  Description: Manage all your blogs from one dashboard
6
  Author: Prelovac Media
7
+ Version: 3.8.8
8
  Author URI: http://www.prelovac.com
9
  */
10
 
20
  **************************************************************/
21
 
22
 
23
+ define('MMB_WORKER_VERSION', '3.8.8');
24
 
25
  global $wpdb, $mmb_plugin_dir, $mmb_plugin_url;
26
 
36
  $mmb_actions = array(
37
  'remove_site' => 'mmb_remove_site',
38
  'get_stats' => 'mmb_stats_get',
39
+ 'get_stats_notification' => 'mmb_get_stats_notification',
40
  'backup' => 'mmb_backup_now',
41
  'restore' => 'mmb_restore_now',
42
  'optimize_tables' => 'mmb_optimize_tables',
44
  'create_post' => 'mmb_post_create',
45
  'update_worker' => 'mmb_update_worker_plugin',
46
  'change_comment_status' => 'mmb_change_comment_status',
47
+ 'change_post_status' => 'mmb_change_post_status',
48
  'get_comment_stats' => 'mmb_comment_stats_get',
49
  'install_addon' => 'mmb_install_addon',
50
+ 'do_upgrade' => 'mmb_do_upgrade',
51
+ 'add_link' => 'mmb_add_link',
52
+ 'email_backup' => 'mmb_email_backup',
53
+ 'check_backup_compat' => 'mmb_check_backup_compat'
54
  );
55
 
56
  require_once("$mmb_plugin_dir/helper.class.php");
60
  require_once("$mmb_plugin_dir/stats.class.php");
61
  require_once("$mmb_plugin_dir/backup.class.php");
62
  require_once("$mmb_plugin_dir/installer.class.php");
63
+ require_once("$mmb_plugin_dir/link.class.php");
64
  require_once("$mmb_plugin_dir/api.php");
65
 
 
66
  require_once("$mmb_plugin_dir/plugins/search/search.php");
67
  require_once("$mmb_plugin_dir/plugins/cleanup/cleanup.php");
68
 
156
  if ($verify == 1) {
157
  $mmb_core->set_master_public_key($public_key);
158
  $mmb_core->set_worker_message_id($id);
159
+ $mmb_core->get_stats_instance();
160
+ mmb_response($mmb_core->stats_instance->get_initial_stats(), true);
161
  } else if ($verify == 0) {
162
  mmb_response('Invalid message signature. Please contact us if you see this message often.', false);
163
  } else {
171
  $mmb_core->set_random_signature($random_key);
172
  $mmb_core->set_worker_message_id($id);
173
  $mmb_core->set_master_public_key($public_key);
174
+ $mmb_core->get_stats_instance();
175
+ mmb_response($mmb_core->stats_instance->get_initial_stats(), true);
176
  } else
177
  mmb_response('Please deactivate & activate ManageWP Worker plugin on your site, then re-add the site to your dashboard.', false);
178
  }
212
  function mmb_stats_get($params)
213
  {
214
  global $mmb_core;
215
+ $mmb_core->get_stats_instance();
216
+ mmb_response($mmb_core->stats_instance->get($params), true);
217
+ }
218
+ function mmb_get_stats_notification($params)
219
+ {
220
+ global $mmb_core;
221
+ $mmb_core->get_stats_instance();
222
+ $stat = $mmb_core->stats_instance->get_stats_notification($params);
223
+ mmb_response($stat, true);
224
  }
225
 
226
  //post
227
  function mmb_post_create($params)
228
  {
229
  global $mmb_core;
230
+ $mmb_core->get_post_instance();
231
+ $return = $mmb_core->post_instance->create($params);
232
  if (is_int($return))
233
  mmb_response($return, true);
234
  else
235
  mmb_response($return, false);
236
  }
237
+ function mmb_change_post_status($params)
238
+ {
239
+ global $mmb_core;
240
+ $mmb_core->get_post_instance();
241
+ $return = $mmb_core->post_instance->change_status($params);
242
+ //mmb_response($return, true);
243
 
244
+ }
245
  //comments
246
  function mmb_change_comment_status($params)
247
  {
248
 
249
  global $mmb_core;
250
+ $mmb_core->get_comment_instance();
251
+ $return = $mmb_core->comment_instance->change_status($params);
252
  //mmb_response($return, true);
253
+ if ($return){
254
+ $mmb_core->get_stats_instance();
255
+ mmb_response($mmb_core->stats_instance->get_comments_stats($params), true);
256
+ }else
257
  mmb_response('Comment not updated', false);
258
  }
259
  function mmb_comment_stats_get($params)
260
  {
261
  global $mmb_core;
262
+ $mmb_core->get_stats_instance();
263
+ mmb_response($mmb_core->stats_instance->get_comments_stats($params), true);
264
  }
265
 
266
  //backup
267
  function mmb_backup_now($params)
268
  {
269
  global $mmb_core;
270
+ $mmb_core->get_backup_instance();
271
+ $return = $mmb_core->backup_instance->backup($params);
272
 
273
+ if (is_array($return) && array_key_exists('error', $return))
274
+ mmb_response($return['error'], false);
275
+ else {
276
+ mmb_response($return, true);
277
+ }
278
+ }
279
+
280
+ function mmb_email_backup($params)
281
+ {
282
+ global $mmb_core;
283
+ $mmb_core->get_backup_instance();
284
+ $return = $mmb_core->backup_instance->email_backup($params);
285
+
286
+ if (is_array($return) && array_key_exists('error', $return))
287
+ mmb_response($return['error'], false);
288
+ else {
289
+ mmb_response($return, true);
290
+ }
291
+ }
292
+
293
+ function mmb_check_backup_compat($params)
294
+ {
295
+ global $mmb_core;
296
+ $mmb_core->get_backup_instance();
297
+ $return = $mmb_core->backup_instance->check_backup_compat($params);
298
 
299
  if (is_array($return) && array_key_exists('error', $return))
300
  mmb_response($return['error'], false);
306
  function mmb_optimize_tables($params)
307
  {
308
  global $mmb_core;
309
+ $mmb_core->get_backup_instance();
310
+ $return = $mmb_core->backup_instance->optimize_tables();
311
  if ($return)
312
  mmb_response($return, true);
313
  else
317
  function mmb_restore_now($params)
318
  {
319
  global $mmb_core;
320
+ $mmb_core->get_backup_instance();
321
+ $return = $mmb_core->backup_instance->restore($params);
322
  if (is_array($return) && array_key_exists('error', $return))
323
  mmb_response($return['error'], false);
324
  else
342
  function mmb_search_posts_by_term($params)
343
  {
344
  global $mmb_core;
345
+ $mmb_core->get_search_instance();
346
+ $return = $mmb_core->search_instance->search_posts_by_term($params);
347
 
348
  if ($return) {
349
  mmb_response(serialize($return), true);
355
  function mmb_install_addon($params)
356
  {
357
  global $mmb_core;
358
+ $mmb_core->get_installer_instance();
359
+ $return = $mmb_core->installer_instance->install_remote_file($params);
360
  mmb_response($return, true);
361
 
362
  }
363
  function mmb_do_upgrade($params)
364
  {
365
  global $mmb_core, $mmb_upgrading;
366
+ $mmb_core->get_installer_instance();
367
+ $return = $mmb_core->installer_instance->do_upgrade($params);
368
  mmb_response($return, true);
369
 
370
  }
371
+
372
+ function mmb_add_link($params)
373
+ {
374
+ global $mmb_core;
375
+ $mmb_core->get_link_instance();
376
+ $return = $mmb_core->link_instance->add_link($params);
377
+ if (is_array($return) && array_key_exists('error', $return))
378
+
379
+ mmb_response($return['error'], false);
380
+ else {
381
+ mmb_response($return, true);
382
+ }
383
+
384
+ }
385
+
386
+ function mmb_iframe_plugins_fix($update_actions)
387
+ {
388
+ foreach($update_actions as $key => $action)
389
+ {
390
+ $update_actions[$key] = str_replace('target="_parent"','',$action);
391
+ }
392
+
393
+ return $update_actions;
394
+
395
+ }
396
+
397
+ add_filter('install_plugin_complete_actions','mmb_iframe_plugins_fix');
398
+
399
+
400
  ?>
installer.class.php CHANGED
@@ -21,7 +21,7 @@ class MMB_Installer extends MMB_Core
21
  include_once(ABSPATH . 'wp-admin/includes/theme.php');
22
  include_once(ABSPATH . 'wp-admin/includes/misc.php');
23
  include_once(ABSPATH . 'wp-admin/includes/template.php');
24
- include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
25
 
26
  global $wp_filesystem;
27
  if (!$wp_filesystem)
@@ -90,6 +90,7 @@ class MMB_Installer extends MMB_Core
90
  }
91
  }
92
  ob_clean();
 
93
  return $install_info;
94
  }
95
 
@@ -98,7 +99,7 @@ class MMB_Installer extends MMB_Core
98
  if($params == null || empty($params))
99
  return array('failed' => 'No upgrades passed.');
100
 
101
- if ((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && (get_filesystem_method(array(), false) != 'direct')) {
102
  return array(
103
  'error' => 'Failed, please <a target="_blank" href="http://managewp.com/user-guide#ftp">add FTP details</a></a>'
104
  );
@@ -109,10 +110,12 @@ class MMB_Installer extends MMB_Core
109
  $upgrade_plugins = isset($params['upgrade_plugins']) ? $params['upgrade_plugins'] : array();
110
  $upgrade_themes = isset($params['upgrade_themes']) ? $params['upgrade_themes'] : array();
111
 
 
112
  $upgrades = array();
113
  if(!empty($core_upgrade)){
114
  $upgrades['core'] = $this->upgrade_core($core_upgrade);
115
  }
 
116
  if(!empty($upgrade_plugins)){
117
  $plugin_files = array();
118
  foreach($upgrade_plugins as $plugin){
@@ -120,7 +123,7 @@ class MMB_Installer extends MMB_Core
120
  }
121
 
122
  $upgrades['plugins'] = $this->upgrade_plugins($plugin_files);
123
- $this->mmb_maintenance_mode(false);
124
  }
125
 
126
  if(!empty($upgrade_themes)){
@@ -133,6 +136,7 @@ class MMB_Installer extends MMB_Core
133
  $this->mmb_maintenance_mode(false);
134
  }
135
  ob_clean();
 
136
  return $upgrades;
137
  }
138
 
@@ -142,9 +146,26 @@ class MMB_Installer extends MMB_Core
142
  */
143
  function upgrade_core($current)
144
  {
145
- ob_start();
146
  global $mmb_wp_version, $wp_filesystem;
147
- $upgrader = new WP_Upgrader();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
148
 
149
  // Is an update available?
150
  if (!isset($current->response) || $current->response == 'latest')
@@ -196,7 +217,7 @@ class MMB_Installer extends MMB_Core
196
  );
197
  ob_end_flush();
198
  return array(
199
- 'upgraded' => ' Upgraded successfully.'
200
  );
201
  }
202
 
@@ -206,20 +227,24 @@ class MMB_Installer extends MMB_Core
206
  return array(
207
  'error' => 'No plugin files for upgrade.'
208
  );
209
-
210
  if (class_exists('Plugin_Upgrader') && class_exists('Bulk_Plugin_Upgrader_Skin')) {
 
 
 
211
  $upgrader = new Plugin_Upgrader(new Bulk_Plugin_Upgrader_Skin(compact('nonce', 'url')));
212
  $result = $upgrader->bulk_upgrade($plugins);
213
- ob_end_clean();
214
  if (!empty($result)) {
215
  foreach ($result as $plugin_slug => $plugin_info) {
216
- $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_slug);
217
  if (!$plugin_info || is_wp_error($plugin_info)) {
218
- $return .= '<code title="Please upgrade manually">' . $data['Name'] . '</code> was not upgraded.<br />';
219
  } else {
220
- $return .= '<code>' . $data['Name'] . '</code> successfully upgraded.<br />';
 
221
  }
222
  }
 
223
  ob_end_clean();
224
  return array(
225
  'upgraded' => $return
@@ -232,7 +257,7 @@ class MMB_Installer extends MMB_Core
232
  } else {
233
  ob_end_clean();
234
  return array(
235
- 'error' => 'WordPress update required first'
236
  );
237
  }
238
  }
@@ -242,23 +267,27 @@ class MMB_Installer extends MMB_Core
242
  return array(
243
  'error' => 'No theme files for upgrade.'
244
  );
245
-
246
  if (class_exists('Theme_Upgrader') && class_exists('Bulk_Theme_Upgrader_Skin')) {
247
- $upgrader = new Theme_Upgrader(new Bulk_Theme_Upgrader_Skin(compact('title', 'nonce', 'url', 'theme')));
248
 
 
 
 
249
  $result = $upgrader->bulk_upgrade($themes);
250
 
251
- $results = array();
252
  if (!empty($result)) {
253
- foreach ($result as $theme_tmp => $info) {
254
- if (is_wp_error($info) || !$info) {
255
- $results[$theme_tmp] = '<code title="Please upgrade manually">' . $theme_tmp . '</code> was not upgraded.<br />';
256
  } else {
257
- $results[$theme_tmp] = '<code>' . $theme_tmp . '</code> succesfully upgraded.<br />';
 
258
  }
259
  }
 
260
  return array(
261
- 'upgraded' => implode('', $results)
262
  );
263
  } else
264
  return array(
@@ -278,8 +307,12 @@ class MMB_Installer extends MMB_Core
278
  $upgradable_plugins = array();
279
  if (!empty($current->response)) {
280
  foreach ($current->response as $plugin_path => $plugin_data) {
 
 
 
281
  if (!function_exists('get_plugin_data'))
282
  include_once ABSPATH . 'wp-admin/includes/plugin.php';
 
283
  $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_path);
284
 
285
  $current->response[$plugin_path]->name = $data['Name'];
21
  include_once(ABSPATH . 'wp-admin/includes/theme.php');
22
  include_once(ABSPATH . 'wp-admin/includes/misc.php');
23
  include_once(ABSPATH . 'wp-admin/includes/template.php');
24
+ @include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
25
 
26
  global $wp_filesystem;
27
  if (!$wp_filesystem)
90
  }
91
  }
92
  ob_clean();
93
+ $this->mmb_maintenance_mode(false);
94
  return $install_info;
95
  }
96
 
99
  if($params == null || empty($params))
100
  return array('failed' => 'No upgrades passed.');
101
 
102
+ if (!$this->is_server_writable()) {
103
  return array(
104
  'error' => 'Failed, please <a target="_blank" href="http://managewp.com/user-guide#ftp">add FTP details</a></a>'
105
  );
110
  $upgrade_plugins = isset($params['upgrade_plugins']) ? $params['upgrade_plugins'] : array();
111
  $upgrade_themes = isset($params['upgrade_themes']) ? $params['upgrade_themes'] : array();
112
 
113
+
114
  $upgrades = array();
115
  if(!empty($core_upgrade)){
116
  $upgrades['core'] = $this->upgrade_core($core_upgrade);
117
  }
118
+
119
  if(!empty($upgrade_plugins)){
120
  $plugin_files = array();
121
  foreach($upgrade_plugins as $plugin){
123
  }
124
 
125
  $upgrades['plugins'] = $this->upgrade_plugins($plugin_files);
126
+
127
  }
128
 
129
  if(!empty($upgrade_themes)){
136
  $this->mmb_maintenance_mode(false);
137
  }
138
  ob_clean();
139
+ $this->mmb_maintenance_mode(false);
140
  return $upgrades;
141
  }
142
 
146
  */
147
  function upgrade_core($current)
148
  {
149
+ ob_start();
150
  global $mmb_wp_version, $wp_filesystem;
151
+
152
+ if(!class_exists('WP_Upgrader')){
153
+ include_once(ABSPATH.'wp-admin/includes/update.php');
154
+ if(function_exists('wp_update_core')){
155
+ $update = wp_update_core($current);
156
+ if(is_wp_error($update)){
157
+ return array(
158
+ 'error' => $this->mmb_get_error($update)
159
+ );
160
+ }
161
+ else
162
+ return array(
163
+ 'upgraded' => ' Upgraded successfully.'
164
+ );
165
+ }
166
+ }
167
+
168
+ $upgrader = new WP_Upgrader();
169
 
170
  // Is an update available?
171
  if (!isset($current->response) || $current->response == 'latest')
217
  );
218
  ob_end_flush();
219
  return array(
220
+ 'upgraded' => 'Upgraded successfully.'
221
  );
222
  }
223
 
227
  return array(
228
  'error' => 'No plugin files for upgrade.'
229
  );
230
+ $return = array();
231
  if (class_exists('Plugin_Upgrader') && class_exists('Bulk_Plugin_Upgrader_Skin')) {
232
+
233
+ $current_plugins = $this->mmb_get_transient('update_plugins');
234
+
235
  $upgrader = new Plugin_Upgrader(new Bulk_Plugin_Upgrader_Skin(compact('nonce', 'url')));
236
  $result = $upgrader->bulk_upgrade($plugins);
237
+
238
  if (!empty($result)) {
239
  foreach ($result as $plugin_slug => $plugin_info) {
 
240
  if (!$plugin_info || is_wp_error($plugin_info)) {
241
+ $return[$plugin_slug] = $this->mmb_get_error($plugin_info);
242
  } else {
243
+ unset($current_plugins->response[$plugin_slug]);
244
+ $return[$plugin_slug] = 1;
245
  }
246
  }
247
+ $this->mmb_set_transient('update_plugins', $current_plugins);
248
  ob_end_clean();
249
  return array(
250
  'upgraded' => $return
257
  } else {
258
  ob_end_clean();
259
  return array(
260
+ 'error' => 'WordPress update required first.'
261
  );
262
  }
263
  }
267
  return array(
268
  'error' => 'No theme files for upgrade.'
269
  );
270
+
271
  if (class_exists('Theme_Upgrader') && class_exists('Bulk_Theme_Upgrader_Skin')) {
 
272
 
273
+ $current_themes = $this->mmb_get_transient('update_themes');
274
+
275
+ $upgrader = new Theme_Upgrader(new Bulk_Theme_Upgrader_Skin(compact('title', 'nonce', 'url', 'theme')));
276
  $result = $upgrader->bulk_upgrade($themes);
277
 
278
+ $return = array();
279
  if (!empty($result)) {
280
+ foreach ($result as $theme_tmp => $theme_info) {
281
+ if (is_wp_error($theme_info) || !$theme_info) {
282
+ $return[$theme_tmp] = $this->mmb_get_error($theme_info);
283
  } else {
284
+ unset($current_themes->response[$theme_tmp]);
285
+ $return[$theme_tmp] = 1;
286
  }
287
  }
288
+ $this->mmb_set_transient('update_themes', $current_themes);
289
  return array(
290
+ 'upgraded' => $return
291
  );
292
  } else
293
  return array(
307
  $upgradable_plugins = array();
308
  if (!empty($current->response)) {
309
  foreach ($current->response as $plugin_path => $plugin_data) {
310
+ if($plugin_path == 'worker/init.php')
311
+ continue;
312
+
313
  if (!function_exists('get_plugin_data'))
314
  include_once ABSPATH . 'wp-admin/includes/plugin.php';
315
+
316
  $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_path);
317
 
318
  $current->response[$plugin_path]->name = $data['Name'];
link.class.php ADDED
@@ -0,0 +1,39 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*************************************************************
3
+ *
4
+ * link.class.php
5
+ *
6
+ * Add Links
7
+ *
8
+ *
9
+ * Copyright (c) 2011 Prelovac Media
10
+ * www.prelovac.com
11
+ **************************************************************/
12
+
13
+ class MMB_Link extends MMB_Core
14
+ {
15
+ function __construct()
16
+ {
17
+ parent::__construct();
18
+ }
19
+
20
+ function add_link($args)
21
+ {
22
+ extract($args);
23
+
24
+ $params['link_url'] = esc_html($url);
25
+ $params['link_url'] = esc_url($params['link_url']);
26
+ $params['link_name'] = esc_html($name);
27
+ $params['link_id'] = '';
28
+ $params['link_description'] = $description;
29
+
30
+ if(!function_exists(wp_insert_link))
31
+ include_once (ABSPATH . 'wp-admin/includes/bookmark.php');
32
+
33
+ $is_success = wp_insert_link($params);
34
+
35
+ return $is_success ? true : array('error' => 'Failed to add link');
36
+ }
37
+
38
+ }
39
+ ?>
plugins/cleanup/cleanup.php CHANGED
@@ -3,88 +3,84 @@
3
  *
4
  *
5
  *
6
- * ManageWP Worker Plugin addon - Cleanup
7
  *
8
  *
9
  * Copyright (c) 2011 Prelovac Media
10
  * www.prelovac.com
11
  **************************************************************/
12
 
13
- add_filter('mmb_stats_filter', mmb_get_extended_info);
14
-
15
-
16
- function mmb_get_extended_info($stats)
17
- {
18
- $stats['num_revisions'] = mmb_num_revisions();
19
- $stats['overhead'] = mmb_get_overhead();
20
- $stats['num_spam_comments'] = mmb_num_spam_comments();
21
- return $stats;
22
- }
23
-
24
- /* Revisions */
25
 
26
  mmb_add_action('cleanup_delete', 'cleanup_delete_worker');
27
-
28
- function cleanup_delete_worker($params = array())
29
- {
30
- global $mmb_core;
31
-
32
- $params_array = explode('_', $params['actions']);
33
- $return_array = array();
34
- foreach ($params_array as $param) {
35
- switch ($param) {
36
- case 'revision':
37
- if (mmb_delete_all_revisions()) {
38
- $return_array['revision'] = 'Revisions deleted.';
39
- } else {
40
- $return_array['revision'] = 'Revisions not deleted.';
41
- }
42
- break;
43
- case 'overhead':
44
- if (mmb_clear_overhead()) {
45
- $return_array['overhead'] = 'Overhead cleared.';
46
- } else {
47
- $return_array['overhead'] = 'Overhead not cleared.';
48
- }
49
- break;
50
- case 'comment':
51
- if (mmb_delete_spam_comments()) {
52
- $return_array['comment'] = 'Comments deleted';
53
- } else {
54
- $return_array['comment'] = 'Comments not deleted';
55
- }
56
- break;
57
- default:
58
- break;
59
- }
60
-
61
- }
62
-
63
- unset($params);
64
-
65
- mmb_response($return_array, true);
66
  }
67
-
68
- function mmb_num_revisions()
69
- {
70
  global $wpdb;
71
- $sql = "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'revision'";
72
  $num_revisions = $wpdb->get_var($wpdb->prepare($sql));
73
  return $num_revisions;
74
  }
75
 
76
- function mmb_select_all_revisions()
77
- {
78
  global $wpdb;
79
- $sql = "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'";
80
  $revisions = $wpdb->get_results($wpdb->prepare($sql));
81
  return $revisions;
82
  }
83
 
84
- function mmb_delete_all_revisions()
85
- {
86
  global $wpdb;
87
- $sql = "DELETE a,b,c FROM $wpdb->posts a LEFT JOIN $wpdb->term_relationships b ON (a.ID = b.object_id) LEFT JOIN $wpdb->postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'";
88
  $revisions = $wpdb->query($wpdb->prepare($sql));
89
  return $revisions;
90
  }
@@ -95,43 +91,44 @@ function mmb_delete_all_revisions()
95
 
96
  function mmb_get_overhead()
97
  {
98
- global $wpdb, $mmb_core;
99
- $tot_data = 0;
100
- $tot_idx = 0;
101
- $tot_all = 0;
102
- $query = 'SHOW TABLE STATUS FROM ' . DB_NAME;
103
- $tables = $wpdb->get_results($query, ARRAY_A);
104
- foreach ($tables as $table) {
105
- $tot_data = $table['Data_length'];
106
- $tot_idx = $table['Index_length'];
107
- $total = $tot_data + $tot_idx;
108
- $total = $total / 1024;
109
- $total = round($total, 3);
110
- $gain = $table['Data_free'];
111
- $gain = $gain / 1024;
112
- $total_gain += $gain;
113
- $gain = round($gain, 3);
114
-
115
- }
116
-
117
- return round($total_gain, 3);
 
118
  }
119
 
120
  function mmb_clear_overhead()
121
  {
122
- global $wpdb;
123
- $tables = $wpdb->get_col("SHOW TABLES");
124
- foreach ($tables as $table_name) {
125
- $table_string .= $table_name . ",";
126
- }
127
- $table_string = substr($table_string, 0, strlen($table_string) - 1); //remove last ,
128
-
129
- $table_string = rtrim($table_string);
130
-
131
- $query = "OPTIMIZE TABLE $table_string";
132
-
133
- $optimize = $wpdb->query($query);
134
- return $optimize ? true : false;
135
  }
136
 
137
 
@@ -140,25 +137,24 @@ function mmb_clear_overhead()
140
 
141
  function mmb_num_spam_comments()
142
  {
143
- global $wpdb;
144
- $sql = "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'";
145
- $num_spams = $wpdb->get_var($wpdb->prepare($sql));
146
  return $num_spams;
147
  }
148
 
149
  function mmb_delete_spam_comments()
150
  {
151
- global $wpdb;
152
- $sql = "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam'";
153
- $spams = $wpdb->query($wpdb->prepare($sql));
154
  return $sql;
155
  }
156
 
157
 
158
- function mmb_get_spam_comments()
159
- {
160
  global $wpdb;
161
- $sql = "SELECT * FROM $wpdb->comments as a LEFT JOIN $wpdb->commentmeta as b WHERE a.comment_ID = b.comment_id AND a.comment_approved = 'spam'";
162
  $spams = $wpdb->get_results($wpdb->prepare($sql));
163
  return $spams;
164
  }
3
  *
4
  *
5
  *
6
+ * ManageWP Worker Plugin
7
  *
8
  *
9
  * Copyright (c) 2011 Prelovac Media
10
  * www.prelovac.com
11
  **************************************************************/
12
 
13
+ add_filter('mmb_stats_filter', mmb_get_extended_info);
14
+
15
+
16
+ function mmb_get_extended_info($stats)
17
+ {
18
+ $stats['num_revisions'] = mmb_num_revisions();
19
+ $stats['overhead'] = mmb_get_overhead();
20
+ $stats['num_spam_comments'] = mmb_num_spam_comments();
21
+ return $stats;
22
+ }
23
+
24
+ /* Revisions */
25
 
26
  mmb_add_action('cleanup_delete', 'cleanup_delete_worker');
27
+
28
+ function cleanup_delete_worker($params = array()){
29
+ global $mmb_core;
30
+
31
+ $params_array = explode('_', $params['actions']);
32
+ $return_array = array();
33
+ foreach ($params_array as $param){
34
+ switch ($param){
35
+ case 'revision' :
36
+ if(mmb_delete_all_revisions()){
37
+ $return_array['revision'] = 'Revisions deleted.';
38
+ }else{
39
+ $return_array['revision'] = 'Revisions not deleted.';
40
+ }
41
+ break;
42
+ case 'overhead' :
43
+ if(mmb_clear_overhead()){
44
+ $return_array['overhead'] = 'Overhead cleared.';
45
+ }else{
46
+ $return_array['overhead'] = 'Overhead not cleared.';
47
+ }
48
+ break;
49
+ case 'comment' :
50
+ if(mmb_delete_spam_comments()){
51
+ $return_array['comment'] = 'Comments deleted';
52
+ }else{
53
+ $return_array['comment'] = 'Comments not deleted';
54
+ }
55
+ break;
56
+ default:
57
+ break;
58
+ }
59
+
60
+ }
61
+
62
+ unset($params);
63
+
64
+ mmb_response($return_array, true);
 
65
  }
66
+
67
+ function mmb_num_revisions() {
 
68
  global $wpdb;
69
+ $sql = "SELECT COUNT(*) FROM $wpdb->posts WHERE post_type = 'revision'";
70
  $num_revisions = $wpdb->get_var($wpdb->prepare($sql));
71
  return $num_revisions;
72
  }
73
 
74
+ function mmb_select_all_revisions() {
 
75
  global $wpdb;
76
+ $sql = "SELECT * FROM $wpdb->posts WHERE post_type = 'revision'";
77
  $revisions = $wpdb->get_results($wpdb->prepare($sql));
78
  return $revisions;
79
  }
80
 
81
+ function mmb_delete_all_revisions() {
 
82
  global $wpdb;
83
+ $sql = "DELETE a,b,c FROM $wpdb->posts a LEFT JOIN $wpdb->term_relationships b ON (a.ID = b.object_id) LEFT JOIN $wpdb->postmeta c ON (a.ID = c.post_id) WHERE a.post_type = 'revision'";
84
  $revisions = $wpdb->query($wpdb->prepare($sql));
85
  return $revisions;
86
  }
91
 
92
  function mmb_get_overhead()
93
  {
94
+ global $wpdb, $mmb_core;
95
+ $tot_data = 0;
96
+ $tot_idx = 0;
97
+ $tot_all = 0;
98
+ $query = 'SHOW TABLE STATUS FROM '. DB_NAME;
99
+ $tables = $wpdb->get_results($query,ARRAY_A);
100
+ foreach($tables as $table)
101
+ {
102
+ $tot_data = $table['Data_length'];
103
+ $tot_idx = $table['Index_length'];
104
+ $total = $tot_data + $tot_idx;
105
+ $total = $total / 1024 ;
106
+ $total = round ($total,3);
107
+ $gain= $table['Data_free'];
108
+ $gain = $gain / 1024 ;
109
+ $total_gain += $gain;
110
+ $gain = round ($gain,3);
111
+
112
+ }
113
+
114
+ return round($total_gain,3);
115
  }
116
 
117
  function mmb_clear_overhead()
118
  {
119
+ global $wpdb;
120
+ $tables = $wpdb->get_col("SHOW TABLES");
121
+ foreach ($tables as $table_name) {
122
+ $table_string .= $table_name . ",";
123
+ }
124
+ $table_string = substr($table_string,0,strlen($table_string)-1); //remove last ,
125
+
126
+ $table_string = rtrim($table_string);
127
+
128
+ $query = "OPTIMIZE TABLE $table_string";
129
+
130
+ $optimize = $wpdb->query($query);
131
+ return $optimize ? true : false;
132
  }
133
 
134
 
137
 
138
  function mmb_num_spam_comments()
139
  {
140
+ global $wpdb;
141
+ $sql = "SELECT COUNT(*) FROM $wpdb->comments WHERE comment_approved = 'spam'";
142
+ $num_spams = $wpdb->get_var($wpdb->prepare($sql));
143
  return $num_spams;
144
  }
145
 
146
  function mmb_delete_spam_comments()
147
  {
148
+ global $wpdb;
149
+ $sql = "DELETE FROM $wpdb->comments WHERE comment_approved = 'spam'";
150
+ $spams = $wpdb->query($wpdb->prepare($sql));
151
  return $sql;
152
  }
153
 
154
 
155
+ function mmb_get_spam_comments() {
 
156
  global $wpdb;
157
+ $sql = "SELECT * FROM $wpdb->comments as a LEFT JOIN $wpdb->commentmeta as b WHERE a.comment_ID = b.comment_id AND a.comment_approved = 'spam'";
158
  $spams = $wpdb->get_results($wpdb->prepare($sql));
159
  return $spams;
160
  }
plugins/search/search.php CHANGED
@@ -10,20 +10,20 @@
10
  * www.prelovac.com
11
  **************************************************************/
12
 
13
- mmb_add_action('search_posts_by_term', 'search_posts_by_term');
14
-
15
- function search_posts_by_term($params = false)
16
- {
17
- global $wpdb, $current_user;
18
-
19
-
20
- $num_posts = 10;
21
- $num_content_char = 30;
22
 
23
- $term_orig = trim($params['search_term']);
24
- $term_base = addslashes(trim($params['search_term']));
25
-
26
- $query = "SELECT *
 
 
 
 
 
 
 
 
27
  FROM $wpdb->posts
28
  WHERE $wpdb->posts.post_status = 'publish'
29
  AND ($wpdb->posts.post_title LIKE '%$term_base%'
@@ -31,54 +31,58 @@ function search_posts_by_term($params = false)
31
  ORDER BY $wpdb->posts.post_modified DESC
32
  LIMIT 0, $num_posts
33
  ";
34
-
35
- $posts_array = $wpdb->get_results($query);
36
-
37
- $ret_posts = array();
38
-
39
- foreach ($posts_array as $post) {
40
- //highlight searched term
41
-
42
- if (substr_count(strtolower($post->post_title), strtolower($term_orig))) {
43
- $str_position_start = strpos(strtolower($post->post_title), strtolower($term_orig));
44
-
45
- $post->post_title = substr($post->post_title, 0, $str_position_start) . '<b>' . substr($post->post_title, $str_position_start, strlen($term_orig)) . '</b>' . substr($post->post_title, $str_position_start + strlen($term_orig));
46
-
47
- }
48
- $post->post_content = html_entity_decode($post->post_content);
49
-
50
- $post->post_content = strip_tags($post->post_content);
51
-
52
-
53
-
54
- if (substr_count(strtolower($post->post_content), strtolower($term_orig))) {
55
- $str_position_start = strpos(strtolower($post->post_content), strtolower($term_orig));
56
-
57
- $start = $str_position_start > $num_content_char ? $str_position_start - $num_content_char : 0;
58
- $first_len = $str_position_start > $num_content_char ? $num_content_char : $str_position_start;
59
-
60
- $start_substring = $start > 0 ? '...' : '';
61
- $post->post_content = $start_substring . substr($post->post_content, $start, $first_len) . '<b>' . substr($post->post_content, $str_position_start, strlen($term_orig)) . '</b>' . substr($post->post_content, $str_position_start + strlen($term_orig), $num_content_char) . '...';
62
-
63
-
64
- } else {
65
- $post->post_content = substr($post->post_content, 0, 50) . '...';
66
- }
67
-
68
- $ret_posts[] = array(
69
- 'ID' => $post->ID,
70
- 'post_permalink' => get_permalink($post->ID),
71
- 'post_date' => $post->post_date,
72
- 'post_title' => $post->post_title,
73
- 'post_content' => $post->post_content,
74
- 'post_modified' => $post->post_modified,
75
- 'comment_count' => $post->comment_count
76
-
77
-
78
- );
 
 
 
 
 
 
 
79
  }
80
- mmb_response($ret_posts, true);
81
-
82
- }
83
 
84
  ?>
10
  * www.prelovac.com
11
  **************************************************************/
12
 
13
+ mmb_add_action('search_posts_by_term', 'search_posts_by_term');
 
 
 
 
 
 
 
 
14
 
15
+ function search_posts_by_term($params = false){
16
+
17
+ global $wpdb, $current_user;
18
+
19
+
20
+ $num_posts = 10;
21
+ $num_content_char = 30;
22
+
23
+ $term_orig = trim($params['search_term']);
24
+ $term_base= addslashes(trim($params['search_term']));
25
+
26
+ $query = "SELECT *
27
  FROM $wpdb->posts
28
  WHERE $wpdb->posts.post_status = 'publish'
29
  AND ($wpdb->posts.post_title LIKE '%$term_base%'
31
  ORDER BY $wpdb->posts.post_modified DESC
32
  LIMIT 0, $num_posts
33
  ";
34
+
35
+ $posts_array = $wpdb->get_results($query);
36
+
37
+ $ret_posts = array();
38
+
39
+ foreach($posts_array as $post){
40
+ //highlight searched term
41
+
42
+ if (substr_count(strtolower($post->post_title), strtolower($term_orig))){
43
+ $str_position_start = strpos(strtolower($post->post_title), strtolower($term_orig));
44
+
45
+ $post->post_title = substr($post->post_title, 0, $str_position_start).'<b>'.
46
+ substr($post->post_title, $str_position_start, strlen($term_orig)).'</b>'.
47
+ substr($post->post_title, $str_position_start + strlen($term_orig));
48
+
49
+ }
50
+ $post->post_content = html_entity_decode($post->post_content);
51
+
52
+ $post->post_content = strip_tags($post->post_content);
53
+
54
+
55
+
56
+ if (substr_count(strtolower($post->post_content), strtolower($term_orig))){
57
+ $str_position_start = strpos(strtolower($post->post_content), strtolower($term_orig));
58
+
59
+ $start = $str_position_start > $num_content_char ? $str_position_start - $num_content_char: 0;
60
+ $first_len = $str_position_start > $num_content_char? $num_content_char : $str_position_start;
61
+
62
+ $start_substring = $start>0 ? '...' : '';
63
+ $post->post_content = $start_substring . substr($post->post_content, $start, $first_len).'<b>'.
64
+ substr($post->post_content, $str_position_start, strlen($term_orig)).'</b>'.
65
+ substr($post->post_content, $str_position_start + strlen($term_orig), $num_content_char) . '...';
66
+
67
+
68
+ }else{
69
+ $post->post_content = substr($post->post_content,0, 50). '...';
70
+ }
71
+
72
+ $ret_posts[] = array(
73
+ 'ID' => $post->ID
74
+ ,'post_permalink' => get_permalink($post->ID)
75
+ ,'post_date' => $post->post_date
76
+ ,'post_title' => $post->post_title
77
+ ,'post_content' => $post->post_content
78
+ ,'post_modified' => $post->post_modified
79
+ ,'comment_count' => $post->comment_count
80
+
81
+
82
+ );
83
+ }
84
+ mmb_response($ret_posts, true);
85
+
86
  }
 
 
 
87
 
88
  ?>
post.class.php CHANGED
@@ -320,5 +320,21 @@ class MMB_Post extends MMB_Core
320
  return $post_id;
321
  }
322
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
323
  }
324
  ?>
320
  return $post_id;
321
  }
322
 
323
+
324
+ function change_status($args)
325
+ {
326
+
327
+ global $wpdb;
328
+ $post_id = $args['post_id'];
329
+ $status = $args['status'];
330
+ $success = false;
331
+
332
+ if(in_array($status, array('draft', 'publish', 'trash'))){
333
+ $sql = "update ".$wpdb->prefix."posts set post_status = '$status' where ID = '$post_id'";
334
+ $success = $wpdb->query($sql);
335
+ }
336
+
337
+ return $success;
338
+ }
339
  }
340
  ?>
readme.txt CHANGED
@@ -3,7 +3,7 @@ Contributors: freediver
3
  Donate link: https://www.networkforgood.org/donation/MakeDonation.aspx?ORGID2=520781390
4
  Tags: managewp, managewp worker, admin, manage blogs, multi blog manager, manage multiple blogs, remote blog management
5
  Requires at least: 3.0
6
- Tested up to: 3.1
7
  Stable tag: trunk
8
 
9
  ManageWP Worker plugin allows you to remotely manage your blogs from one dashboard.
@@ -29,6 +29,20 @@ API for developers available at [ManageWP.com/API](http://managewp.com/api "Mana
29
 
30
  == Changelog ==
31
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
32
  = 3.8.7 =
33
  * Fixed 408 error when adding sites
34
  * Added support for IDN domains
3
  Donate link: https://www.networkforgood.org/donation/MakeDonation.aspx?ORGID2=520781390
4
  Tags: managewp, managewp worker, admin, manage blogs, multi blog manager, manage multiple blogs, remote blog management
5
  Requires at least: 3.0
6
+ Tested up to: 3.1.1
7
  Stable tag: trunk
8
 
9
  ManageWP Worker plugin allows you to remotely manage your blogs from one dashboard.
29
 
30
  == Changelog ==
31
 
32
+ = 3.8.8 =
33
+ * New feature: Bulk add links to blogroll
34
+ * New feature: Manual backups to email address
35
+ * New feature: Backup requirements check (under �Manage Backups�)
36
+ * New feature: Popup menu for groups allowing to show dashboard for that group only
37
+ * New feature: Favorite list for plugins and themes for later quick installation to multiple blogs
38
+ * New feature: Invite friends
39
+ * Fixed: problem with backups and write permissions when upload dir was wrongly set
40
+ * Fixed: problem adding sites where WordPress is installed in a folder
41
+ * Fixed: 408 error message problem when adding site
42
+ * Fixed: site time out problems when adding site
43
+ * Fixed: problems with some WP plugins (WP Sentinel)
44
+ * Fixed: problems with upgrade notifications
45
+
46
  = 3.8.7 =
47
  * Fixed 408 error when adding sites
48
  * Added support for IDN domains
stats.class.php CHANGED
@@ -29,13 +29,15 @@ class MMB_Stats extends MMB_Core
29
  $stats = array();
30
 
31
  //define constants
32
- $num_pending_comments = 1000;
33
  $num_approved_comments = 3;
34
  $num_spam_comments = 0;
35
  $num_draft_comments = 0;
36
  $num_trash_comments = 0;
37
-
38
  require_once(ABSPATH . '/wp-admin/includes/update.php');
 
 
39
 
40
  $stats['worker_version'] = MMB_WORKER_VERSION;
41
  $stats['wordpress_version'] = $mmb_wp_version;
@@ -58,9 +60,9 @@ class MMB_Stats extends MMB_Core
58
  }
59
  $stats['hit_counter'] = get_option('user_hit_count');
60
 
61
-
62
- $stats['upgradable_themes'] = $this->get_installer_instance()->get_upgradable_themes();
63
- $stats['upgradable_plugins'] = $this->get_installer_instance()->get_upgradable_plugins();
64
 
65
  $pending_comments = get_comments('status=hold&number=' . $num_pending_comments);
66
  foreach ($pending_comments as &$comment) {
@@ -84,46 +86,122 @@ class MMB_Stats extends MMB_Core
84
 
85
  foreach ($all_posts as $id => $recent_post) {
86
  $recent = new stdClass();
87
- $recent->post_permalink = get_permalink($recent->ID);
88
  $recent->ID = $recent_post->ID;
89
  $recent->post_date = $recent_post->post_date;
90
  $recent->post_title = $recent_post->post_title;
91
  $recent->post_modified = $recent_post->post_modified;
92
- $recent->comment_count = $recent_post->comment_count;
93
- $recent->post_permalink = $recent_post->post_permalink;
94
-
95
-
96
  $recent_posts[] = $recent;
97
  }
98
- $stats['posts'] = $recent_posts;
99
-
100
- $drafts = get_posts('post_status=draft&numberposts=3');
101
- foreach ($drafts as $draft) {
102
- $props = get_object_vars($draft);
103
- foreach ($props as $name => $value) {
104
- if ($name != 'post_title' && $name != 'ID' && $name != 'post_modified') {
105
- unset($draft->$name);
106
- } else {
107
- $draft->post_title = get_the_title($draft->ID);
108
- $draft->post_permalink = get_permalink($draft->ID);
109
- }
110
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  }
112
- $stats['draft_count'] = count($drafts);
113
- $stats['drafts'] = $drafts;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
114
 
115
  if (!function_exists('get_filesystem_method'))
116
  include_once(ABSPATH . 'wp-admin/includes/file.php');
117
 
118
- if ((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && (get_filesystem_method(array(), false) != 'direct')) {
119
- $stats['writable'] = false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
120
  } else
121
- $stats['writable'] = true;
122
 
123
- $stats = apply_filters('mmb_stats_filter', $stats);
 
 
 
 
 
 
 
 
 
 
 
 
 
124
 
 
 
 
 
125
  return $stats;
126
  }
 
 
127
  function get_comments_stats(){
128
  $num_pending_comments = 3;
129
  $num_approved_comments = 3;
@@ -157,17 +235,14 @@ class MMB_Stats extends MMB_Core
157
  $stats['worker_version'] = MMB_WORKER_VERSION;
158
  $stats['site_title'] = get_bloginfo('name');
159
  $stats['site_tagline'] = get_bloginfo('description');
160
- $stats['site_url'] = get_bloginfo('home');
161
 
162
 
163
  if (!function_exists('get_filesystem_method'))
164
  include_once(ABSPATH . 'wp-admin/includes/file.php');
165
 
166
- if ((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && (get_filesystem_method(array(), false) != 'direct')) {
167
- $stats['writable'] = false;
168
- } else
169
- $stats['writable'] = true;
170
-
171
  return $stats;
172
  }
173
 
@@ -176,7 +251,7 @@ class MMB_Stats extends MMB_Core
176
  {
177
  if ($fix_count || (!is_admin() && !MMB_Stats::detect_bots())) {
178
  $date = date('Y-m-d');
179
- $user_hit_count = get_option('user_hit_count');
180
  if (!$user_hit_count) {
181
  $user_hit_count[$date] = 1;
182
  update_option('user_hit_count', $user_hit_count);
@@ -208,7 +283,7 @@ class MMB_Stats extends MMB_Core
208
  $user_hit_count[$date] = 0;
209
  }
210
  if (!$fix_count)
211
- $user_hit_count[$date] += 1;
212
 
213
  if (count($user_hit_count) > 14) {
214
  $shifted = @array_shift($user_hit_count);
@@ -294,4 +369,9 @@ class MMB_Stats extends MMB_Core
294
  }
295
 
296
  }
 
 
 
 
 
297
  ?>
29
  $stats = array();
30
 
31
  //define constants
32
+ $num_pending_comments = 20;
33
  $num_approved_comments = 3;
34
  $num_spam_comments = 0;
35
  $num_draft_comments = 0;
36
  $num_trash_comments = 0;
37
+
38
  require_once(ABSPATH . '/wp-admin/includes/update.php');
39
+
40
+
41
 
42
  $stats['worker_version'] = MMB_WORKER_VERSION;
43
  $stats['wordpress_version'] = $mmb_wp_version;
60
  }
61
  $stats['hit_counter'] = get_option('user_hit_count');
62
 
63
+ $this->get_installer_instance();
64
+ $stats['upgradable_themes'] = $this->installer_instance->get_upgradable_themes();
65
+ $stats['upgradable_plugins'] = $this->installer_instance->get_upgradable_plugins();
66
 
67
  $pending_comments = get_comments('status=hold&number=' . $num_pending_comments);
68
  foreach ($pending_comments as &$comment) {
86
 
87
  foreach ($all_posts as $id => $recent_post) {
88
  $recent = new stdClass();
89
+ $recent->post_permalink = get_permalink($recent_post->ID);
90
  $recent->ID = $recent_post->ID;
91
  $recent->post_date = $recent_post->post_date;
92
  $recent->post_title = $recent_post->post_title;
93
  $recent->post_modified = $recent_post->post_modified;
94
+ $recent->comment_count = $recent_post->comment_count;
 
 
 
95
  $recent_posts[] = $recent;
96
  }
97
+
98
+
99
+ $all_drafts = get_posts('post_status=draft&numberposts=3&orderby=modified&order=desc');
100
+ $stats['draft_count'] = count($all_drafts);
101
+ $recent_drafts = array();
102
+ foreach ($all_drafts as $id => $recent_draft) {
103
+ $recent = new stdClass();
104
+ $recent->post_permalink = get_permalink($recent_draft->ID);
105
+ $recent->ID = $recent_draft->ID;
106
+ $recent->post_date = $recent_draft->post_date;
107
+ $recent->post_title = $recent_draft->post_title;
108
+ $recent->post_modified = $recent_draft->post_modified;
109
+
110
+ $recent_drafts[] = $recent;
111
+ }
112
+
113
+
114
+ $all_pages_published = get_pages('post_status=publish&numberposts=3&orderby=modified&order=desc');
115
+ $stats['published_pages_count'] = count($all_pages_published);
116
+ $recent_pages_published = array();
117
+
118
+ foreach ((array)$all_pages_published as $id => $recent_page_published) {
119
+
120
+ $recent = new stdClass();
121
+ $recent->post_permalink = get_permalink($recent_page_published->ID);
122
+
123
+ $recent->ID = $recent_page_published->ID;
124
+ $recent->post_date = $recent_page_published->post_date;
125
+ $recent->post_title = $recent_page_published->post_title;
126
+ $recent->post_modified = $recent_page_published->post_modified;
127
+
128
+ $recent_posts[] = $recent;
129
  }
130
+ usort($recent_posts, 'cmp_posts_worker');
131
+ $stats['posts'] = array_slice($recent_posts, 0, 3);
132
+
133
+ $all_pages_drafts = get_pages('post_status=draft&numberposts=3&orderby=modified&order=desc');
134
+ $stats['draft_pages_count'] = count($all_pages_drafts);
135
+ $recent_pages_drafts = array();
136
+ foreach ((array)$all_pages_drafts as $id => $recent_pages_draft) {
137
+ $recent = new stdClass();
138
+ $recent->post_permalink = get_permalink($recent_pages_draft->ID);
139
+ $recent->ID = $recent_pages_draft->ID;
140
+ $recent->post_date = $recent_pages_draft->post_date;
141
+ $recent->post_title = $recent_pages_draft->post_title;
142
+ $recent->post_modified = $recent_pages_draft->post_modified;
143
+
144
+ $recent_drafts[] = $recent;
145
+ }
146
+ $stats['drafts'] = array_slice($recent_drafts, 0, 3);
147
+ usort($recent_drafts, 'cmp_posts_worker');
148
+
149
 
150
  if (!function_exists('get_filesystem_method'))
151
  include_once(ABSPATH . 'wp-admin/includes/file.php');
152
 
153
+ $stats['writable'] = $this->is_server_writable();
154
+
155
+ $stats = apply_filters('mmb_stats_filter', $stats);
156
+ return $stats;
157
+ }
158
+
159
+ function get_stats_notification($params)
160
+ {
161
+
162
+ global $mmb_wp_version, $mmb_plugin_dir;
163
+ $stats = array();
164
+
165
+ //define constants
166
+ $num_pending_comments = 1000;
167
+
168
+
169
+ require_once(ABSPATH . '/wp-admin/includes/update.php');
170
+
171
+ $stats['worker_version'] = MMB_WORKER_VERSION;
172
+ $stats['wordpress_version'] = $mmb_wp_version;
173
+
174
+ $updates = $this->mmb_get_transient('update_core');
175
+
176
+ if ($updates->updates[0]->response == 'development' || version_compare($mmb_wp_version, $updates->updates[0]->current, '<')) {
177
+ $updates->updates[0]->current_version = $mmb_wp_version;
178
+ $stats['core_updates'] = $updates->updates[0];
179
  } else
180
+ $stats['core_updates'] = false;
181
 
182
+ $mmb_user_hits = get_option('user_hit_count');
183
+ if (is_array($mmb_user_hits)) {
184
+ end($mmb_user_hits);
185
+ $last_key_date = key($mmb_user_hits);
186
+ $current_date = date('Y-m-d');
187
+ if ($last_key_date != $curent_date)
188
+ $this->set_hit_count(true);
189
+ }
190
+
191
+
192
+ $this->get_theme_instance();
193
+ $this->get_plugin_instance();
194
+ $stats['upgradable_themes'] = $this->theme_instance->get_upgradable_themes();
195
+ $stats['upgradable_plugins'] = $this->plugin_instance->get_upgradable_plugins();
196
 
197
+ $pending_comments = get_comments('status=hold&number=' . $num_pending_comments);
198
+
199
+ $stats['comments_pending'] = count($pending_comments);
200
+
201
  return $stats;
202
  }
203
+
204
+
205
  function get_comments_stats(){
206
  $num_pending_comments = 3;
207
  $num_approved_comments = 3;
235
  $stats['worker_version'] = MMB_WORKER_VERSION;
236
  $stats['site_title'] = get_bloginfo('name');
237
  $stats['site_tagline'] = get_bloginfo('description');
238
+ $stats['site_home'] = get_option('home');
239
 
240
 
241
  if (!function_exists('get_filesystem_method'))
242
  include_once(ABSPATH . 'wp-admin/includes/file.php');
243
 
244
+ $stats['writable'] = $this->is_server_writable();
245
+
 
 
 
246
  return $stats;
247
  }
248
 
251
  {
252
  if ($fix_count || (!is_admin() && !MMB_Stats::detect_bots())) {
253
  $date = date('Y-m-d');
254
+ $user_hit_count = (array) get_option('user_hit_count');
255
  if (!$user_hit_count) {
256
  $user_hit_count[$date] = 1;
257
  update_option('user_hit_count', $user_hit_count);
283
  $user_hit_count[$date] = 0;
284
  }
285
  if (!$fix_count)
286
+ $user_hit_count[$date] = ((int)$user_hit_count[$date] ) + 1;
287
 
288
  if (count($user_hit_count) > 14) {
289
  $shifted = @array_shift($user_hit_count);
369
  }
370
 
371
  }
372
+
373
+ function cmp_posts_worker($a, $b)
374
+ {
375
+ return ($a->post_modified < $b->post_modified);
376
+ }
377
  ?>
version CHANGED
@@ -1 +1 @@
1
- 3.8.7
1
+ 3.8.8