ManageWP Worker - Version 3.8.0

Version Description

  • New interface
  • SSL security protocl
  • many more
Download this release

Release Info

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

Code changes from version 3.6.3 to 3.8.0

Files changed (19) hide show
  1. backup.class.php +483 -519
  2. category.class.php +0 -118
  3. clone.class.php +0 -17
  4. comment.class.php +0 -85
  5. core.class.php +303 -410
  6. ende.class.php +0 -124
  7. helper.class.php +387 -206
  8. init.php +262 -356
  9. mmb.wp.upgrader.php +0 -1489
  10. page.class.php +0 -259
  11. plugin.class.php +106 -464
  12. post.class.php +299 -605
  13. readme.txt +6 -0
  14. stats.class.php +226 -193
  15. tags.class.php +0 -162
  16. theme.class.php +99 -347
  17. user.class.php +6 -6
  18. version +1 -1
  19. wp.class.php +90 -123
backup.class.php CHANGED
@@ -1,654 +1,618 @@
1
  <?php
2
-
3
- class Mmb_Backup extends Mmb_Core {
4
-
5
- function __construct() {
 
 
 
 
 
 
 
 
 
 
 
6
  $upload_dir = wp_upload_dir();
7
- $sec_string = md5('mwp-worker');
8
- $file = "/$sec_string/backups";
9
- $file_path = $upload_dir['basedir'] . $file;
10
  file_put_contents($file_path . '/index.php', '');
11
-
12
- if(!file_exists($file_path)){
13
  mkdir($file_path, 0755, true);
14
  }
15
  parent::__construct();
16
  }
17
-
18
- function backup($args) {
19
-
20
  $this->_escape($args);
21
- $username = $args[0];
22
- $password = $args[1];
23
  //type like manual, weekly, daily
24
- $type = $args[2];
25
  //what like full, only db, only wp-content
26
- $what = $args[3];
27
- if(trim($type) == '')
28
- $type = 'manual';
29
-
30
- if (!$user = $this->login($username, $password))
31
- {
32
- return $this->error;
33
- }
34
-
35
- if(!current_user_can('administrator'))
36
- return new IXR_Error(401, 'Sorry, you are not allowed to perform backup action on this site.');
37
 
38
  $upload_dir = wp_upload_dir();
39
- $sec_string = md5('mwp-worker');
40
- $file = "/$sec_string/backups";
41
- $file_path = $upload_dir['basedir'] . $file;
42
-
43
- if(!file_exists($file_path)){
44
  mkdir($file_path, 0755, true);
45
  }
46
-
47
- if(trim($what) == 'full' || trim($what) == 'content' ){
48
- //take wp-conetnt backup
49
- $content_backup = $this->backup_wpcontent($type);
50
- if(!$content_backup){
51
- @unlink($content_backup['path']);
52
- return FALSE;
53
- }
 
 
54
  }
55
-
56
- if(trim($what) == 'full' || trim($what) == 'db' ){
57
- //take batabase backup
58
- $db_backup = $this->backup_db($type);
59
- if(!$db_backup){
60
- if(trim($what) == 'full')
61
  @unlink($content_backup['path']);
62
-
63
- @unlink($db_backup['path']);
64
- return false;
65
- }
 
 
66
  }
67
- require_once ABSPATH.'/wp-admin/includes/class-pclzip.php';
68
-
69
- // Get previous backup in tmp
70
- $worker_options = get_option('mwp-worker');
71
- $tmp_file = $upload_dir['basedir'].'/'.basename($worker_options['backups'][$type]['path']);
72
-
73
- if(rename($worker_options['backups'][$type]['path'], $tmp_file)){
74
- @unlink($worker_options['backups'][$type]['path']);
75
- }
76
 
77
- $site_name = get_bloginfo('name');
78
 
79
- $site_name = str_replace(array(" ","_"),array("",""),$site_name);
 
 
80
 
81
- $backup_file = $file_path.'/'.$site_name.'_'.$type.'_'.$what.'_'.date('Y-m-d').'.zip';
 
 
82
 
 
 
 
 
 
 
 
 
 
 
 
 
 
83
 
84
- if (!$this->check_zip())
85
- {
86
- $archive = new PclZip($backup_file);
87
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
88
  }
89
-
90
- if(trim($what) == 'full'){
91
-
92
- if ($this->check_zip())
93
- {
94
- $command = "zip $backup_file -j $content_backup[path] -j $db_backup[path]";
95
- ob_start();
96
- passthru($command,$err);
97
- ob_get_clean();
98
- }
99
- else
100
- {
101
- $result = $archive->add($content_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
102
- $result = $archive->add($db_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
103
- $err = !$result;
104
- }
105
-
106
- }elseif(trim($what) == 'db'){
107
-
108
- if ($this->check_zip())
109
- {
110
-
111
- $command = "zip $backup_file -j $db_backup[path]";
112
- ob_start();
113
- passthru($command,$err);
114
- ob_get_clean();
115
-
116
- }
117
- else
118
- {
119
-
120
- $result = $archive->add($db_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
121
- $err = !$result;
122
- }
123
-
124
-
125
- }elseif(trim($what) == 'content'){
126
- if ($this->check_zip())
127
- {
128
- $command = "zip $backup_file -j $content_backup[path]";
129
- ob_start();
130
- passthru($command,$err);
131
- ob_get_clean();
132
- }
133
- else
134
- {
135
- $result = $archive->add($content_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
136
- $err = !$result;
137
- }
138
-
139
-
140
- }
141
-
142
-
143
- if($err){
144
-
145
- if(rename($tmp_file,$worker_options['backups'][$type]['path'])){
146
- @unlink($tmp_file);
147
- }
148
- return false;
149
  }
150
-
151
- @unlink($tmp_file);
152
-
153
  @unlink($content_backup['path']);
154
  @unlink($db_backup['path']);
155
-
156
- $backup_url = $upload_dir['baseurl'].$file.'/'.$site_name.'_'.$type.'_'.$what.'_'.date('Y-m-d').'.zip';
157
- $worker_options = get_option('mwp-worker');
158
-
159
  //remove old file
160
- if($worker_options['backups'][$type]['path'] != $backup_file)
161
- @unlink($worker_options['backups'][$type]['path']);
162
-
163
 
164
  $worker_options['backups'][$type]['path'] = $backup_file;
165
- $worker_options['backups'][$type]['url'] = $backup_url;
166
- update_option('mwp-worker', $worker_options);
167
 
168
 
169
  return $worker_options['backups'][$type]['url'];
170
  }
171
-
172
- function backup_wpcontent($type) {
173
-
174
  $upload_dir = wp_upload_dir();
175
- $sec_string = md5('mwp-worker');
176
- // $file = "/$sec_string/backups";
177
- $file = '/'.$sec_string.'/backups/wp-content_'.date('Y-m-d').'.zip';
178
- $file_path = $upload_dir['basedir'] . $file;
179
- if ($this->check_zip())
180
- {
181
- chdir(WP_CONTENT_DIR);
182
- $command = "zip -r $file_path 'plugins/' 'themes/' 'uploads/' -x 'uploads/".$sec_string."/*'";
183
- ob_start();
184
- passthru($command,$err);
185
- ob_get_clean();
186
-
187
- if(!$err){
188
- $file_url = $upload_dir['baseurl'] . $file;
189
- return array('path' => $file_path, 'url' => $file_url);
190
- }
191
- @unlink($file_path);
192
- return false;
193
-
194
- }
195
- else
196
- {
197
- require_once ABSPATH.'/wp-admin/includes/class-pclzip.php';
198
- $archive = new PclZip($file_path);
199
- $result = $archive->add(WP_CONTENT_DIR . '/plugins', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
200
- $result = $archive->add(WP_CONTENT_DIR . '/themes', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
201
- $result = $archive->add(WP_CONTENT_DIR . '/uploads', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
202
- // $this->_log($archive);
203
- $result = $archive->delete(PCLZIP_OPT_BY_NAME, 'uploads/'.$sec_string.'/');
204
- if($result){
205
- $file_url = $upload_dir['baseurl'] . $file;
206
- return array('path' => $file_path, 'url' => $file_url);
207
- }
208
- @unlink($file_path);
209
- return false;
210
- }
 
211
  }
212
-
213
-
214
- function backup_db($type) {
 
215
  $mysqldump_exists = $this->check_mysqldump();
216
-
217
-
218
- if(is_array($mysqldump_exists)){
219
- // $this->_log('backup dump');
220
-
221
- $result = $this->backup_db_dump($type, $mysqldump_exists);
222
-
223
- }else{
224
 
225
- $result = $this->backup_db_php($type);
 
 
 
 
 
 
 
 
226
  }
227
  return $result;
228
  }
229
-
230
- function backup_db_dump($type, $paths) {
231
- global $wpdb;
 
232
  $upload_dir = wp_upload_dir();
233
- $sec_string = md5('mwp-worker');
234
- $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
235
-
236
- $file = $upload_dir['path'] . '/'.DB_NAME.'.sql';
237
- $file_url = $upload_dir['baseurl']. '/'.DB_NAME.'.sql';
238
 
239
- $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;
 
240
 
241
-
242
- passthru($command, $error);
243
-
244
- if(filesize($file) == 0 || !is_file($file) || $error) {
245
-
246
- @unlink($file);
247
- return false;
248
- }else{
249
-
250
- return array('path' => $file, 'url' => $file_url);
251
- }
252
- }
253
-
254
- function backup_db_php($type) {
 
 
 
 
 
 
 
 
 
255
  global $wpdb;
256
- //require_once ABSPATH.'/wp-admin/includes/class-pclzip.php';
257
- $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
258
- $upload_dir = wp_upload_dir();
259
- $sec_string = md5('mwp-worker');
260
- $zip_file = '/'.$sec_string.'/backups/db_'.date('Y-m-d').'.zip';
261
  $zip_file_path = $upload_dir['basedir'] . $zip_file;
262
 
263
- $file = $upload_dir['path'] . '/'.DB_NAME.'.sql';
264
- $file_url = $upload_dir['baseurl']. '/'.DB_NAME.'.sql';
265
 
266
- // $archive = new PclZip($zip_file_path);
267
- // $this->_log($zip_file_path);
268
- // $this->_log($tables);
269
- foreach($tables as $table){
270
- //$file = $upload_dir['path'] . '/'.$table[0].'.sql';
271
-
272
  //drop exixting table
273
- $dump_data = "DROP TABLE IF EXISTS $table[0];";
274
  //create table
275
  $create_table = $wpdb->get_row("SHOW CREATE TABLE $table[0]", ARRAY_N);
276
- $dump_data .= "\n\n".$create_table[1].";\n\n";
277
-
278
  $count = $wpdb->get_var("SELECT count(*) FROM $table[0]");
279
- if($count > 100)
280
- $count = ceil($count/100)-1;
281
  else
282
  $count = 1;
283
- for($i=0;$i<$count;$i++){
284
  $low_limit = $i * 100;
285
- $qry = "SELECT * FROM $table[0] LIMIT $low_limit, 100";
286
- $rows = $wpdb->get_results($qry, ARRAY_A);
287
- if(is_array($rows)){
288
  foreach ($rows as $row) {
289
  //insert single row
290
  $dump_data .= "INSERT INTO $table[0] VALUES(";
291
  $num_values = count($row);
292
- $j = 1;
293
  foreach ($row as $value) {
294
  $value = addslashes($value);
295
  $value = ereg_replace("\n", "\\n", $value);
296
- // $dump_data .= "'".$value . "', ";
297
-
298
- // if($num_values == $i)
299
- // $dump_data .= "'".$value . "'";
300
- // else
301
- // $dump_data .= "'".$value . "', ";
302
- $num_values == $j ? $dump_data .= "'".$value . "'" : $dump_data .= "'".$value . "', ";
303
- $j ++;
304
- unset ($value);
305
  }
306
- // $dump_data = substr($dump_data, 0, -2);
307
  $dump_data .= ");\n";
308
  }
309
  }
310
  }
311
  $dump_data .= "\n\n\n";
312
-
313
- unset ($rows);
314
- file_put_contents($file, $dump_data, FILE_APPEND);
315
- unset ($dump_data);
316
 
317
-
 
 
 
 
 
 
318
  }
319
 
 
 
 
 
320
 
321
- //return false;
322
- return array('path' => $file, 'url' => $file_url);
323
-
324
  }
325
-
326
- function restore($args) {
 
327
  $this->_escape($args);
328
- $username = $args[0];
329
- $password = $args[1];
330
- $type = $args[2];
331
-
332
- if(trim($type) == ''){
333
  return false;
334
  }
335
-
336
- if (!$user = $this->login($username, $password))
337
- {
338
- return $this->error;
339
- }
340
-
341
- if(!current_user_can('administrator'))
342
- return new IXR_Error(401, 'Sorry, you are not allowed to perform restore action on this site.');
343
-
344
- // Set paths
345
-
346
- $upload_dir = wp_upload_dir();
347
- $sec_string = md5('mwp-worker');
348
- $backup_dir = "/$sec_string/backups";
349
- $file = "/$sec_string/restore";
350
- $file_path = $upload_dir['basedir'] . $file; //restore path - temporary
351
  $backup_path = $upload_dir['basedir'] . $backup_dir; //backup path
352
-
353
 
354
  // If manual backup - get backup file from master, if not - get backup file from worker
355
-
356
- if($type != 'weekly' && $type != 'daily')
357
- {
358
- // Download backup file from master
359
- $tmp_file = download_url($type);
360
-
361
- $backup_file = $backup_path."/". basename($type);
362
-
363
-
364
- if(rename($tmp_file, $backup_file)){
365
- @unlink($tmp_file);
366
- }else{
367
- $backup_file = $tmp_file;
368
- }
369
- }
370
- else
371
- {
372
- // Getting file from worker
373
- $backup_file = $worker_options['backups'][$type]['path'];
374
- }
375
 
 
 
 
 
376
 
377
- // $backup_file = glob($file_path);
378
- // $backup_file = $backup_file[0];
379
- if($backup_file){
380
-
381
- if($this->check_unzip())
382
- {
383
- mkdir($file_path);
384
- chdir($file_path);
385
- $command = "unzip -o $backup_file";
386
- ob_start();
387
- passthru($command,$err);
388
- ob_get_clean();
389
- }
390
- else
391
- {
392
- require_once ABSPATH.'/wp-admin/includes/class-pclzip.php';
393
- $archive = new PclZip($backup_file);
394
- $extracted = $archive->extract(PCLZIP_OPT_PATH, $file_path, PCLZIP_OPT_REMOVE_ALL_PATH);
395
- $err = !$extracted;
396
- }
397
 
398
 
399
- if($err){
400
-
401
- return false;
 
402
  }
403
 
404
  list(, $name, $what) = explode('_', basename($backup_file, '.zip'));
405
-
406
- $this->_log($what);
407
 
408
-
409
- if(trim($what) == 'full' || trim($what) == 'db' ){
410
-
411
- if(!$this->restore_db($type, $file_path)){
412
- return false;
413
- }
414
  }
415
 
416
 
417
 
418
- if(trim($what) == 'full' || trim($what) == 'content' ){
419
- if(!$this->restore_wpcontent($type, $file_path)){
420
- return false;
421
- }
 
 
422
  }
423
 
424
-
425
-
426
-
427
  $this->_deleteTempDir($file_path);
428
  }
429
- //@lk : better error messages
430
- return true;
431
 
 
432
  }
433
-
434
- function restore_wpcontent($type, $file_path) {
435
- require_once ABSPATH.'/wp-admin/includes/class-pclzip.php';
436
- $content_file = glob($file_path."/wp*");
437
-
438
-
439
- // $this->_log($content_file);
440
- if($this->check_unzip())
441
- {
442
-
443
  chdir(WP_CONTENT_DIR);
444
  $con_file = $content_file[0];
445
- $command = "unzip -o $con_file";
446
  ob_start();
447
- passthru($command,$err);
448
- ob_get_clean();
449
-
450
- }
451
- else
452
- {
453
- $archive = new PclZip($content_file[0]);
454
- $restore_content = $archive->extract(PCLZIP_OPT_PATH, WP_CONTENT_DIR, PCLZIP_OPT_REPLACE_NEWER);
455
- $err = !$restore_content;
456
  }
457
- // $this->_log($archive);
458
- // $this->_log($archive->errorInfo(TRUE));
459
- if($err)
460
- return FALSE;
 
 
 
 
 
 
 
461
  else
462
- return TRUE;
463
  }
464
-
465
- function restore_db($type, $file_path) {
 
466
  global $wpdb;
467
 
468
  $mysqldump = $this->check_mysqldump();
469
 
470
- //$mysqldump = ''; //debug
471
- if(is_array($mysqldump))
472
- {
473
-
474
- $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
475
-
476
- foreach(glob($file_path.'/*.sql') as $filename){
477
-
478
- $command = $brace.$mysqldump['mysql'].$brace.' --host="'.DB_HOST.'" --user="'.DB_USER.'" --password="'.DB_PASSWORD.'" '.DB_NAME.' < '.$brace.$filename.$brace;
479
- passthru($command, $error);
480
-
481
- break;
482
- }
483
- return $error ? false : true;
484
- }
485
- else
486
- {
487
-
488
-
489
- // $this->_log($content_file);
490
-
491
- foreach(glob($file_path.'/*.sql') as $filename){
492
- // $this->_log($filename);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
493
  // Temporary variable, used to store current query
494
  $current_query = '';
495
  // Read in entire file
496
- $lines = file($filename);
497
- // $this->_log($lines);
498
  // Loop through each line
499
- foreach ($lines as $line){
500
  // Skip it if it's a comment
501
  if (substr($line, 0, 2) == '--' || $line == '')
502
  continue;
503
-
504
  // Add this line to the current query
505
  $current_query .= $line;
506
  // If it has a semicolon at the end, it's the end of the query
507
- if (substr(trim($line), -1, 1) == ';'){
508
- // Perform the query
509
- // $this->_log($current_query);
510
- $result = $wpdb->query($current_query);
511
- // $this->_log($result);
512
- if($result === false)
513
- return FALSE;
514
- // Reset temp variable to empty
515
- $current_query = '';
516
  }
517
  }
518
- }
519
- return true;
520
-
521
-
522
- }
523
-
524
-
525
-
526
  }
527
-
528
- function get_weekly_backup($args) {
 
 
529
  $this->_escape($args);
530
  $username = $args[0];
531
- $password = $args[1];
532
- $type = $args[2];
533
- if(trim($type) == ''){
534
  return false;
535
  }
536
-
537
- if (!$user = $this->login($username, $password))
538
- {
539
- return $this->error;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
540
  }
541
-
542
- if(!current_user_can('administrator'))
543
- return new IXR_Error(401, 'Sorry, you are not allowed to perform this action on the site.');
544
-
545
- $worker_options = get_option('mwp-worker');
546
- $daily_file = $worker_options['backups']['daily']['path'];
547
-
548
- $upload_dir = wp_upload_dir();
549
- $sec_string = md5('mwp-worker');
550
- $file = "/$sec_string/backups";
551
- $file_path = $upload_dir['basedir'] . $file;
552
- $backup_file = $file_path.'/weekly_'.date('Y-m-d').'.zip';
553
-
554
- if(!copy($daily_file, $backup_file)){
555
- return false;
556
  }
557
- $backup_path = $upload_dir['baseurl'].$file.'/weekly_'.date('Y-m-d').'.zip';
558
- $worker_options['backups']['weekly']['path'] = $backup_file;
559
- $worker_options['backups']['weekly']['url'] = $backup_url;
560
-
561
- return $backup_url;
562
-
563
- }
564
-
565
- function get_backup_details($args) {
566
- $this->_escape($args);
567
- $username = $args[0];
568
- $password = $args[1];
569
- $type = $args[2];
570
- if(trim($type) == ''){
571
  return false;
572
  }
573
-
574
- if (!$user = $this->login($username, $password))
575
- {
576
- return $this->error;
 
577
  }
578
-
579
- if(!current_user_can('administrator'))
580
- return new IXR_Error(401, 'Sorry, you are not allowed to perform this action on the site.');
581
-
582
- $worker_options = get_option('mwp-worker');
583
- $backup_file = $worker_options['backups'][$type]['url'];
584
-
585
- if(!$backup_file)
586
- return FALSE;
587
- else
588
- return $backup_file;
589
- }
590
-
591
- ### Function: Auto Detect MYSQL and MYSQL Dump Paths
592
- function check_mysqldump() {
593
- global $wpdb;
594
- $paths = array('mysq' => '', 'mysqldump' => '');
595
- if(substr(PHP_OS,0,3) == 'WIN') {
596
- $mysql_install = $wpdb->get_row("SHOW VARIABLES LIKE 'basedir'");
597
- if($mysql_install) {
598
- $install_path = str_replace('\\', '/', $mysql_install->Value);
599
- $paths['mysql'] = $install_path.'bin/mysql.exe';
600
- $paths['mysqldump'] = $install_path.'bin/mysqldump.exe';
601
- } else {
602
- $paths['mysql'] = 'mysql.exe';
603
- $paths['mysqldump'] = 'mysqldump.exe';
604
- }
605
- } else {
606
- if(function_exists('exec')) {
607
- $paths['mysql'] = @exec('which mysql');
608
- $paths['mysqldump'] = @exec('which mysqldump');
609
- } else {
610
- $paths['mysql'] = 'mysql';
611
- $paths['mysqldump'] = 'mysqldump';
612
- }
613
- }
614
-
615
- if(!@file_exists(stripslashes($paths['mysqldump']))) {
616
- return false;
617
- }
618
- if(!@file_exists(stripslashes($paths['mysql']))) {
619
- return false;
620
- }
621
-
622
- $stats_function_disabled = 0;
623
-
624
- if(!function_exists('passthru')) {
625
- $stats_function_disabled++;
626
- }
627
- if(!function_exists('system')) {
628
- $stats_function_disabled++;
629
- }
630
- if(!function_exists('exec')) {
631
- $stats_function_disabled++;
632
- }
633
-
634
- if($stats_function_disabled == 3){
635
- return false;
636
- }
637
-
638
- return $paths;
639
  }
640
 
641
- function check_zip()
642
- {
643
- $zip = @exec('which zip');
644
- return $zip ? true : false;
645
  }
646
 
647
- function check_unzip()
648
- {
649
- $zip = @exec('which unzip');
650
- return $zip ? true : false;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
651
  }
652
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
653
  }
654
  ?>
1
  <?php
2
+ /*************************************************************
3
+ *
4
+ * backup.class.php
5
+ *
6
+ * Manage Backups
7
+ *
8
+ *
9
+ * Copyright (c) 2011 Prelovac Media
10
+ * www.prelovac.com
11
+ **************************************************************/
12
+
13
+ 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
  mkdir($file_path, 0755, true);
24
  }
25
  parent::__construct();
26
  }
27
+
28
+ function backup($args)
29
+ {
30
  $this->_escape($args);
31
+
 
32
  //type like manual, weekly, daily
33
+ $type = $args['type'];
34
  //what like full, only db, only wp-content
35
+ $what = $args['what'];
36
+ if (trim($type) == '')
37
+ $type = 'manual'; //default
 
 
 
 
 
 
 
 
38
 
39
  $upload_dir = wp_upload_dir();
40
+ $sec_string = md5('mmb-worker');
41
+ $file = "/$sec_string/backups";
42
+ $file_path = $upload_dir['basedir'] . $file;
43
+
44
+ if (!file_exists($file_path)) {
45
  mkdir($file_path, 0755, true);
46
  }
47
+
48
+ if (trim($what) == 'full' || trim($what) == 'content') {
49
+ //take wp-conetnt backup
50
+ $content_backup = $this->backup_wpcontent($type);
51
+ if (!$content_backup) {
52
+ @unlink($content_backup['path']);
53
+ return array(
54
+ 'error' => 'Failed to backup wp-content.'
55
+ );
56
+ }
57
  }
58
+
59
+ if (trim($what) == 'full' || trim($what) == 'db') {
60
+ //take batabase backup
61
+ $db_backup = $this->backup_db($type);
62
+ if (!$db_backup) {
63
+ if (trim($what) == 'full')
64
  @unlink($content_backup['path']);
65
+
66
+ @unlink($db_backup['path']);
67
+ return array(
68
+ 'error' => 'Failed to backup database.'
69
+ );
70
+ }
71
  }
 
 
 
 
 
 
 
 
 
72
 
73
+ require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
74
 
75
+ // Get previous backup in tmp
76
+ $worker_options = get_option('mmb-worker');
77
+ $tmp_file = $upload_dir['basedir'] . '/' . basename($worker_options['backups'][$type]['path']);
78
 
79
+ if (rename($worker_options['backups'][$type]['path'], $tmp_file)) {
80
+ @unlink($worker_options['backups'][$type]['path']);
81
+ }
82
 
83
+ $site_name = $this->remove_http(get_bloginfo('url'));
84
+ $site_name = str_replace(array(
85
+ "_",
86
+ "/"
87
+ ), array(
88
+ "",
89
+ "-"
90
+ ), $site_name);
91
+ $backup_file = $file_path . '/' . $site_name . '_' . $type . '_' . $what . '_' . date('Y-m-d') . '.zip';
92
+
93
+ if (!$this->check_zip()) {
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->check_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
+ passthru($command, $err);
104
+ ob_get_clean();
105
+ } else {
106
+ $result = $archive->add($content_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
107
+ $result = $archive->add($db_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
108
+ $result = $archive->add($htaccess_path, PCLZIP_OPT_REMOVE_ALL_PATH);
109
+ $result = $archive->add($wp_config_path, PCLZIP_OPT_REMOVE_ALL_PATH);
110
+ $err = !$result;
111
+ }
112
+
113
+ } elseif (trim($what) == 'db') {
114
+ if ($this->check_zip()) {
115
+ $command = "zip $backup_file -j $db_backup[path]";
116
+ ob_start();
117
+ passthru($command, $err);
118
+ ob_get_clean();
119
+ } else {
120
+ $result = $archive->add($db_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
121
+ $err = !$result;
122
+ }
123
+ } elseif (trim($what) == 'content') {
124
+ if ($this->check_zip()) {
125
+ $command = "zip $backup_file -j $content_backup[path]";
126
+ ob_start();
127
+ passthru($command, $err);
128
+ ob_get_clean();
129
+ } else {
130
+ $result = $archive->add($content_backup['path'], PCLZIP_OPT_REMOVE_ALL_PATH);
131
+ $err = !$result;
132
+ }
133
  }
134
+
135
+ if ($err) {
136
+ if (rename($tmp_file, $worker_options['backups'][$type]['path'])) {
137
+ @unlink($tmp_file);
138
+ }
139
+ return array(
140
+ 'error' => 'Backup failed.'
141
+ );
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
142
  }
143
+
144
+ @unlink($tmp_file);
 
145
  @unlink($content_backup['path']);
146
  @unlink($db_backup['path']);
147
+ $backup_url = $upload_dir['baseurl'] . $file . '/' . $site_name . '_' . $type . '_' . $what . '_' . date('Y-m-d') . '.zip';
148
+ $worker_options = get_option('mmb-worker');
 
 
149
  //remove old file
150
+ if ($worker_options['backups'][$type]['path'] != $backup_file) {
151
+ @unlink($worker_options['backups'][$type]['path']);
152
+ }
153
 
154
  $worker_options['backups'][$type]['path'] = $backup_file;
155
+ $worker_options['backups'][$type]['url'] = $backup_url;
156
+ update_option('mmb-worker', $worker_options);
157
 
158
 
159
  return $worker_options['backups'][$type]['url'];
160
  }
161
+
162
+ function backup_wpcontent($type)
163
+ {
164
  $upload_dir = wp_upload_dir();
165
+ $sec_string = md5('mmb-worker');
166
+ $file = '/' . $sec_string . '/backups/wp-content_' . date('Y-m-d') . '.zip';
167
+ $file_path = $upload_dir['basedir'] . $file;
168
+ if ($this->check_zip()) {
169
+ chdir(WP_CONTENT_DIR);
170
+ $command = "zip -r $file_path 'plugins/' 'themes/' 'uploads/' -x 'uploads/" . $sec_string . "/*'";
171
+ ob_start();
172
+ passthru($command, $err);
173
+ ob_get_clean();
174
+ if (!$err || $err == 18) {
175
+ $file_url = $upload_dir['baseurl'] . $file;
176
+ return array(
177
+ 'path' => $file_path,
178
+ 'url' => $file_url
179
+ );
180
+ }
181
+ @unlink($file_path);
182
+ return false;
183
+
184
+ } else {
185
+ require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
186
+ $archive = new PclZip($file_path);
187
+ $result = $archive->add(WP_CONTENT_DIR . '/plugins', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
188
+ $result = $archive->add(WP_CONTENT_DIR . '/themes', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
189
+ $result = $archive->add(WP_CONTENT_DIR . '/uploads', PCLZIP_OPT_REMOVE_PATH, WP_CONTENT_DIR);
190
+ // $this->_log($archive);
191
+ $result = $archive->delete(PCLZIP_OPT_BY_NAME, 'uploads/' . $sec_string . '/');
192
+ if ($result) {
193
+ $file_url = $upload_dir['baseurl'] . $file;
194
+ return array(
195
+ 'path' => $file_path,
196
+ 'url' => $file_url
197
+ );
198
+ }
199
+ @unlink($file_path);
200
+ return false;
201
+ }
202
  }
203
+
204
+
205
+ function backup_db($type)
206
+ {
207
  $mysqldump_exists = $this->check_mysqldump();
 
 
 
 
 
 
 
 
208
 
209
+
210
+ if (is_array($mysqldump_exists)) {
211
+ // $this->_log('backup dump');
212
+
213
+ $result = $this->backup_db_dump($type, $mysqldump_exists);
214
+
215
+ } else {
216
+ $result = $this->backup_db_php($type);
217
+
218
  }
219
  return $result;
220
  }
221
+
222
+ function backup_db_dump($type, $paths)
223
+ {
224
+ global $wpdb;
225
  $upload_dir = wp_upload_dir();
226
+ $sec_string = md5('mmb-worker');
227
+ $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
 
 
 
228
 
229
+ $file = $upload_dir['path'] . '/' . DB_NAME . '.sql';
230
+ $file_url = $upload_dir['baseurl'] . '/' . DB_NAME . '.sql';
231
 
232
+ $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;
233
+
234
+
235
+ passthru($command, $error);
236
+
237
+ if ($error) {
238
+ $result = $this->backup_db_php($type);
239
+ return $result;
240
+ }
241
+
242
+ if (filesize($file) == 0 || !is_file($file) || $error) {
243
+ @unlink($file);
244
+ return false;
245
+ } else {
246
+ return array(
247
+ 'path' => $file,
248
+ 'url' => $file_url
249
+ );
250
+ }
251
+ }
252
+
253
+ function backup_db_php($type)
254
+ {
255
  global $wpdb;
256
+ $tables = $wpdb->get_results('SHOW TABLES', ARRAY_N);
257
+ $upload_dir = wp_upload_dir();
258
+ $sec_string = md5('mmb-worker');
259
+ $zip_file = '/' . $sec_string . '/backups/db_' . date('Y-m-d') . '.zip';
 
260
  $zip_file_path = $upload_dir['basedir'] . $zip_file;
261
 
262
+ $file = $upload_dir['path'] . '/' . DB_NAME . '.sql';
263
+ $file_url = $upload_dir['baseurl'] . '/' . DB_NAME . '.sql';
264
 
265
+ foreach ($tables as $table) {
 
 
 
 
 
266
  //drop exixting table
267
+ $dump_data = "DROP TABLE IF EXISTS $table[0];";
268
  //create table
269
  $create_table = $wpdb->get_row("SHOW CREATE TABLE $table[0]", ARRAY_N);
270
+ $dump_data .= "\n\n" . $create_table[1] . ";\n\n";
271
+
272
  $count = $wpdb->get_var("SELECT count(*) FROM $table[0]");
273
+ if ($count > 100)
274
+ $count = ceil($count / 100) - 1;
275
  else
276
  $count = 1;
277
+ for ($i = 0; $i < $count; $i++) {
278
  $low_limit = $i * 100;
279
+ $qry = "SELECT * FROM $table[0] LIMIT $low_limit, 100";
280
+ $rows = $wpdb->get_results($qry, ARRAY_A);
281
+ if (is_array($rows)) {
282
  foreach ($rows as $row) {
283
  //insert single row
284
  $dump_data .= "INSERT INTO $table[0] VALUES(";
285
  $num_values = count($row);
286
+ $j = 1;
287
  foreach ($row as $value) {
288
  $value = addslashes($value);
289
  $value = ereg_replace("\n", "\\n", $value);
290
+ $num_values == $j ? $dump_data .= "'" . $value . "'" : $dump_data .= "'" . $value . "', ";
291
+ $j++;
292
+ unset($value);
 
 
 
 
 
 
293
  }
 
294
  $dump_data .= ");\n";
295
  }
296
  }
297
  }
298
  $dump_data .= "\n\n\n";
 
 
 
 
299
 
300
+ unset($rows);
301
+ file_put_contents($file, $dump_data, FILE_APPEND);
302
+ unset($dump_data);
303
+ }
304
+ if (filesize($file) == 0 || !is_file($file)) {
305
+ @unlink($file);
306
+ return false;
307
  }
308
 
309
+ return array(
310
+ 'path' => $file,
311
+ 'url' => $file_url
312
+ );
313
 
 
 
 
314
  }
315
+
316
+ function restore($args)
317
+ {
318
  $this->_escape($args);
319
+ $type = $args['type'];
320
+ if (trim($type) == '') {
 
 
 
321
  return false;
322
  }
323
+ // Set paths
324
+ $upload_dir = wp_upload_dir();
325
+ $sec_string = md5('mmb-worker');
326
+ $backup_dir = "/$sec_string/backups";
327
+ $file = "/$sec_string/restore";
328
+ $file_path = $upload_dir['basedir'] . $file; //restore path - temporary
 
 
 
 
 
 
 
 
 
 
329
  $backup_path = $upload_dir['basedir'] . $backup_dir; //backup path
 
330
 
331
  // If manual backup - get backup file from master, if not - get backup file from worker
332
+ if ($type != 'weekly' && $type != 'daily') {
333
+ // Download backup file from master
334
+ $tmp_file = $this->mmb_download_url($type, $upload_dir['basedir'] . '/restore' . md5(time()) . '.tmp');
335
+ $backup_file = $backup_path . "/" . basename($type);
336
+ if (rename($tmp_file, $backup_file)) {
337
+ @unlink($tmp_file);
338
+ } else {
339
+ $backup_file = $tmp_file;
340
+ }
 
 
 
 
 
 
 
 
 
 
 
341
 
342
+ } else {
343
+ // Getting file from worker
344
+ $backup_file = $worker_options['backups'][$type]['path'];
345
+ }
346
 
347
+
348
+ if ($backup_file) {
349
+ if ($this->check_unzip()) {
350
+ mkdir($file_path);
351
+ chdir($file_path);
352
+ $command = "unzip -o $backup_file";
353
+ ob_start();
354
+ passthru($command, $err);
355
+ ob_get_clean();
356
+ } else {
357
+ require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
358
+ $archive = new PclZip($backup_file);
359
+ $extracted = $archive->extract(PCLZIP_OPT_PATH, $file_path, PCLZIP_OPT_REMOVE_ALL_PATH);
360
+ $err = !$extracted;
361
+ }
 
 
 
 
 
362
 
363
 
364
+ if ($err) {
365
+ return array(
366
+ 'error' => 'Error extracting backup file.'
367
+ );
368
  }
369
 
370
  list(, $name, $what) = explode('_', basename($backup_file, '.zip'));
 
 
371
 
372
+ if (trim($what) == 'full' || trim($what) == 'db') {
373
+ if (!$this->restore_db($type, $file_path)) {
374
+ return array(
375
+ 'error' => 'Error restoring database.'
376
+ );
377
+ }
378
  }
379
 
380
 
381
 
382
+ if (trim($what) == 'full' || trim($what) == 'content') {
383
+ if (!$this->restore_wpcontent($type, $file_path)) {
384
+ return array(
385
+ 'error' => 'Error restoring wp-content.'
386
+ );
387
+ }
388
  }
389
 
 
 
 
390
  $this->_deleteTempDir($file_path);
391
  }
 
 
392
 
393
+ return true;
394
  }
395
+
396
+ function restore_wpcontent($type, $file_path)
397
+ {
398
+ require_once ABSPATH . '/wp-admin/includes/class-pclzip.php';
399
+ $content_file = glob($file_path . "/*.zip");
400
+ $wp_config_file = glob($file_path . "/wp-config.php");
401
+ $htaccess_file = glob($file_path . "/.htaccess");
402
+ if ($this->check_unzip()) {
 
 
403
  chdir(WP_CONTENT_DIR);
404
  $con_file = $content_file[0];
405
+ $command = "unzip -o $con_file";
406
  ob_start();
407
+ passthru($command, $err);
408
+ ob_get_clean();
409
+ } else {
410
+ $archive = new PclZip($content_file[0]);
411
+ $restore_content = $archive->extract(PCLZIP_OPT_PATH, WP_CONTENT_DIR, PCLZIP_OPT_REPLACE_NEWER);
412
+ $err = !$restore_content;
 
 
 
413
  }
414
+
415
+ if (!rename($wp_config_file[0], ABSPATH . "wp-config.php"))
416
+ $err = 1;
417
+ if (!rename($htaccess_file[0], ABSPATH . ".htaccess"))
418
+ $err = 1;
419
+
420
+ @unlink($wp_config_file[0]);
421
+ @unlink($htaccess_file[0]);
422
+
423
+ if ($err)
424
+ return false;
425
  else
426
+ return true;
427
  }
428
+
429
+ function restore_db($type, $file_path)
430
+ {
431
  global $wpdb;
432
 
433
  $mysqldump = $this->check_mysqldump();
434
 
435
+ if (is_array($mysqldump)) {
436
+ $brace = (substr(PHP_OS, 0, 3) == 'WIN') ? '"' : '';
437
+
438
+ foreach (glob($file_path . '/*.sql') as $filename) {
439
+ $command = $brace . $mysqldump['mysql'] . $brace . ' --host="' . DB_HOST . '" --user="' . DB_USER . '" --password="' . DB_PASSWORD . '" ' . DB_NAME . ' < ' . $brace . $filename . $brace;
440
+ passthru($command, $error);
441
+
442
+ break;
443
+ }
444
+
445
+ if ($error) //try php
446
+ {
447
+ foreach (glob($file_path . '/*.sql') as $filename) {
448
+ $current_query = '';
449
+ // Read in entire file
450
+ $lines = file($filename);
451
+ // Loop through each line
452
+ foreach ($lines as $line) {
453
+ // Skip it if it's a comment
454
+ if (substr($line, 0, 2) == '--' || $line == '')
455
+ continue;
456
+
457
+ // Add this line to the current query
458
+ $current_query .= $line;
459
+ // If it has a semicolon at the end, it's the end of the query
460
+ if (substr(trim($line), -1, 1) == ';') {
461
+ // Perform the query
462
+ $result = $wpdb->query($current_query);
463
+ if ($result === false)
464
+ return FALSE;
465
+ // Reset temp variable to empty
466
+ $current_query = '';
467
+ }
468
+ }
469
+ }
470
+ return true;
471
+ } else {
472
+ return true;
473
+ }
474
+
475
+ } else {
476
+ foreach (glob($file_path . '/*.sql') as $filename) {
477
  // Temporary variable, used to store current query
478
  $current_query = '';
479
  // Read in entire file
480
+ $lines = file($filename);
 
481
  // Loop through each line
482
+ foreach ($lines as $line) {
483
  // Skip it if it's a comment
484
  if (substr($line, 0, 2) == '--' || $line == '')
485
  continue;
486
+
487
  // Add this line to the current query
488
  $current_query .= $line;
489
  // If it has a semicolon at the end, it's the end of the query
490
+ if (substr(trim($line), -1, 1) == ';') {
491
+ // Perform the query
492
+ $result = $wpdb->query($current_query);
493
+ if ($result === false)
494
+ return FALSE;
495
+ // Reset temp variable to empty
496
+ $current_query = '';
 
 
497
  }
498
  }
499
+ }
500
+ return true;
501
+ }
 
 
 
 
 
502
  }
503
+
504
+
505
+ function get_backup_details($args)
506
+ {
507
  $this->_escape($args);
508
  $username = $args[0];
509
+ $type = $args[2];
510
+ if (trim($type) == '') {
 
511
  return false;
512
  }
513
+
514
+ $worker_options = get_option('mmb-worker');
515
+ $backup_file = $worker_options['backups'][$type]['url'];
516
+
517
+ if (!$backup_file)
518
+ return FALSE;
519
+ else
520
+ return $backup_file;
521
+ }
522
+
523
+ ### Function: Auto Detect MYSQL and MYSQL Dump Paths
524
+ function check_mysqldump()
525
+ {
526
+ global $wpdb;
527
+ $paths = array(
528
+ 'mysq' => '',
529
+ 'mysqldump' => ''
530
+ );
531
+ if (substr(PHP_OS, 0, 3) == 'WIN') {
532
+ $mysql_install = $wpdb->get_row("SHOW VARIABLES LIKE 'basedir'");
533
+ if ($mysql_install) {
534
+ $install_path = str_replace('\\', '/', $mysql_install->Value);
535
+ $paths['mysql'] = $install_path . 'bin/mysql.exe';
536
+ $paths['mysqldump'] = $install_path . 'bin/mysqldump.exe';
537
+ } else {
538
+ $paths['mysql'] = 'mysql.exe';
539
+ $paths['mysqldump'] = 'mysqldump.exe';
540
+ }
541
+ } else {
542
+ if (function_exists('exec')) {
543
+ $paths['mysql'] = @exec('which mysql');
544
+ $paths['mysqldump'] = @exec('which mysqldump');
545
+ } else {
546
+ $paths['mysql'] = 'mysql';
547
+ $paths['mysqldump'] = 'mysqldump';
548
+ }
549
  }
550
+
551
+ if (!@file_exists(stripslashes($paths['mysqldump']))) {
552
+ return false;
 
 
 
 
 
 
 
 
 
 
 
 
553
  }
554
+ if (!@file_exists(stripslashes($paths['mysql']))) {
 
 
 
 
 
 
 
 
 
 
 
 
 
555
  return false;
556
  }
557
+
558
+ $stats_function_disabled = 0;
559
+
560
+ if (!function_exists('passthru')) {
561
+ $stats_function_disabled++;
562
  }
563
+ if (!function_exists('system')) {
564
+ $stats_function_disabled++;
565
+ }
566
+ if (!function_exists('exec')) {
567
+ $stats_function_disabled++;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
568
  }
569
 
570
+ if ($stats_function_disabled == 3) {
571
+ return false;
 
 
572
  }
573
 
574
+ return $paths;
575
+ }
576
+
577
+ function check_zip()
578
+ {
579
+ $zip = @exec('which zip');
580
+ return $zip ? true : false;
581
+ }
582
+
583
+ function check_unzip()
584
+ {
585
+ $zip = @exec('which unzip');
586
+ return $zip ? true : false;
587
+ }
588
+
589
+
590
+ function mmb_download_url($url, $file_name)
591
+ {
592
+ $destination = fopen($file_name, 'wb');
593
+ $source = @fopen($url, "r");
594
+
595
+ while ($a = fread($source, 1024)) {
596
+ $ret = fwrite($destination, $a);
597
  }
598
+
599
+ fclose($source);
600
+ fclose($destination);
601
+ return $file_name;
602
+ }
603
+
604
+ function optimize_tables()
605
+ {
606
+ global $wpdb;
607
+ $tables = $wpdb->get_col("SHOW TABLES");
608
+
609
+ foreach ($tables as $table_name) {
610
+ $table_string .= $table_name . ",";
611
+ }
612
+ $table_string = rtrim($table_string);
613
+ $optimize = $wpdb->query("OPTIMIZE TABLE $table_string");
614
+ return true;
615
+ }
616
+
617
  }
618
  ?>
category.class.php DELETED
@@ -1,118 +0,0 @@
1
- <?php
2
-
3
- class Mmb_Category extends Mmb_Core
4
- {
5
- function __construct()
6
- {
7
- parent::__construct();
8
- }
9
-
10
- /*************************************************************
11
- * FACADE functions
12
- * (functions to be called after a remote XMLRPC from Master)
13
- **************************************************************/
14
- /**
15
- * Gets a list of local (slave) category
16
- *
17
- * @param mixed $args
18
- * @return mixed
19
- */
20
- function get_list($args)
21
- {
22
- $this->_escape($args);
23
- $username = $args[0];
24
- $password = $args[1];
25
- $offset = $args[2];
26
- $per_page = $args[3];
27
-
28
- if (!$user = $this->login($username, $password))
29
- {
30
- return $this->error;
31
- }
32
-
33
- $count = count(get_categories(array('hide_empty' => FALSE)));
34
- $categories= get_categories(array(
35
- 'offset' => $offset,
36
- 'number' => $per_page,
37
- 'hide_empty' => FALSE
38
- ));
39
-
40
- $cat_dropdown = wp_dropdown_categories(array('echo' => false, 'hide_empty' => 0, 'hide_if_empty' => false, 'name' => 'category_parent', 'orderby' => 'name', 'hierarchical' => true, 'show_option_none' => __('None')));
41
-
42
- if(!current_user_can('manage_categories'))
43
- return new IXR_Error(401, 'Sorry, you cannot manage categories on the remote blog.');
44
-
45
- return array('categories' => $categories, 'count' => $count,'dropdown' => $cat_dropdown);
46
-
47
- //return get_categories(array('hide_empty' => FALSE));
48
- }
49
-
50
- /**
51
- * Updates a category locally
52
- *
53
- * @param mixed $args
54
- */
55
- function update($args)
56
- {
57
- $this->_escape($args);
58
- $username = $args[0];
59
- $password = $args[1];
60
- $id = $args[2];
61
- $name = $args[3];
62
- $slug = $args[4];
63
- $description = $args[5];
64
- $parent = $args[6];
65
-
66
- if (!$user = $this->login($username, $password))
67
- {
68
- return $this->error;
69
- }
70
-
71
- if(!current_user_can('manage_categories'))
72
- return new IXR_Error(401, 'Sorry, you cannot manage categories on the remote blog.');
73
-
74
- $is_success = wp_update_category(array(
75
- 'cat_ID' => $id,
76
- 'category_description' => $description,
77
- 'cat_name' => $name,
78
- 'category_nicename' => $slug,
79
- 'category_parent' => $parent,
80
- ));
81
-
82
- if(!$is_success)
83
- return new IXR_Error(401, 'Error Updating Category. Try Again !!!');
84
- else
85
- return TRUE;
86
- }
87
-
88
- /**
89
- * Adds a new category locally
90
- *
91
- * @param mixed $args
92
- */
93
- function add($args)
94
- {
95
- $this->_escape($args);
96
- $username = $args[0];
97
- $password = $args[1];
98
- $params = $args[2];
99
-
100
-
101
-
102
- if (!$user = $this->login($username, $password))
103
- {
104
- return $this->error;
105
- }
106
-
107
- if(!current_user_can('manage_categories'))
108
- return new IXR_Error(401, 'Sorry, you cannot manage categories on the remote blog.');
109
-
110
- // wordpress' category adding function
111
- if ($cat_id = wp_insert_category($params))
112
- {
113
- return get_category($cat_id, ARRAY_A);
114
- }
115
-
116
- return FALSE;
117
- }
118
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
clone.class.php DELETED
@@ -1,17 +0,0 @@
1
- <?php
2
-
3
- class Mmb_Clone extends Mmb_Core {
4
- public function __construct() {
5
- parent::__construct();
6
- }
7
-
8
- function manage() {
9
-
10
- }
11
-
12
- function clone_blog($param) {
13
-
14
- }
15
- }
16
-
17
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
comment.class.php DELETED
@@ -1,85 +0,0 @@
1
- <?php
2
-
3
- class Mmb_Comment extends Mmb_Core
4
- {
5
- function __construct()
6
- {
7
- parent::__construct();
8
- }
9
-
10
- function bulk_edit_comments($args) {
11
-
12
- $this->_escape($args);
13
- $username = $args[0];
14
- $password = $args[1];
15
- $comment_ids = $args[2];
16
- $status = $args[3];
17
-
18
- if ( !$user = $this->login($username, $password) )
19
- return $this->error;
20
-
21
- if ( !current_user_can( 'moderate_comments' ) )
22
- return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this blogs.' ) );
23
-
24
- $flag = false;
25
- foreach($comment_ids as $comment_id){
26
- $commentarr = array( 'comment_ID' => $comment_id,
27
- 'comment_approved' => $status
28
- );
29
- $success = wp_update_comment($commentarr);
30
- if(!$success)
31
- $flag = true;
32
- }
33
-
34
- if($flag)
35
- return 2;
36
- else
37
- return 1;
38
- }
39
-
40
- function get_comment_count($args) {
41
- $this->_escape($args);
42
- $username = $args[0];
43
- $password = $args[1];
44
-
45
- if ( !$user = $this->login($username, $password) )
46
- return $this->error;
47
-
48
- if ( !current_user_can( 'edit_posts' ) )
49
- return new IXR_Error( 403, __( 'You are not allowed access to details about comments.' ) );
50
-
51
- $count = wp_count_comments();
52
- return array(
53
- "approved" => $count->approved,
54
- "awaiting_moderation" => $count->moderated,
55
- "spam" => $count->spam,
56
- "trash" => $count->trash,
57
- // "total_comments" => $count->total_comments + $count->trash
58
- "total_comments" => $count->total_comments
59
- );
60
- }
61
-
62
- function restore_comment($args) {
63
- $this->_escape($args);
64
- $username = $args[0];
65
- $password = $args[1];
66
- $comment_id = $args[2];
67
-
68
- if ( !$user = $this->login($username, $password) )
69
- return $this->error;
70
-
71
- if ( !current_user_can( 'moderate_comments' ) )
72
- return new IXR_Error( 403, __( 'You are not allowed to moderate comments on this blogs.' ) );
73
-
74
- $status = (string) get_comment_meta($comment_id, '_wp_trash_meta_status', true);
75
- // $this->_log($status);
76
- $success = wp_untrash_comment($comment_id);
77
- // $this->_log($success);
78
-
79
- if(!$success)
80
- return false;
81
- else
82
- return $status;
83
-
84
- }
85
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
core.class.php CHANGED
@@ -1,411 +1,304 @@
1
- <?php
2
-
3
- class Mmb_Core extends Mmb_Helper
4
- {
5
- var $name;
6
- var $slug;
7
- var $settings;
8
- var $remote_client;
9
- var $comment_instance;
10
- var $plugin_instance;
11
- var $theme_instance;
12
- var $category_instance;
13
- var $wp_instance;
14
- var $page_instance;
15
- var $post_instance;
16
- var $stats_instance;
17
- var $user_instance;
18
- var $tag_instance;
19
- var $backup_instance;
20
- // var $ende_instance;
21
- // protected $secret_key;
22
-
23
- function __construct(){
24
- global $mmb_plugin_dir;
25
- // get_option();
26
- // $this->secret_key = trim(get_option('siteurl'), ' /');
27
- $this->name = 'Manage Multiple Blogs';
28
- $this->slug = 'manage-multiple-blogs';
29
- $this->settings = get_option($this->slug);
30
- // $this->ende_instance = new Mmb_EnDe($this->secret_key);
31
- if (!$this->settings)
32
- {
33
- $this->settings = array(
34
- 'blogs' => array(),
35
- 'current_blog' => array(
36
- 'type' => null,
37
- ),
38
- );
39
- }
40
-
41
- add_action('rightnow_end', array($this, 'add_right_now_info'));
42
- add_action('wp_footer', array('Mmb_Stats', 'set_hit_count'));
43
- // add_action('xmlrpc_call', array($this, 'extend_xmlrpc_methods'), 0, 1);
44
- add_filter('xmlrpc_methods', array($this, 'add_xmlrpc_methods'));
45
- register_activation_hook($mmb_plugin_dir.'/init.php', array($this, 'install'));
46
- add_action('init', array($this, 'mmb_test_fix'));
47
- }
48
-
49
- function mmb_test_fix() {
50
-
51
- }
52
-
53
- /**
54
- * Add an item into the Right Now Dashboard widget
55
- * to inform that the blog can be managed remotely
56
- *
57
- */
58
- function add_right_now_info()
59
- {
60
- echo '<div class="mmb-slave-info">
61
- <p>This site can be managed remotely.</p>
62
- </div>';
63
- }
64
-
65
- /**
66
- * Add custom XMLRPC methods to fit our needs
67
- * This function should only be called if the current blog is a Slave
68
- *
69
- * @param mixed $methods
70
- */
71
- function add_xmlrpc_methods($methods)
72
- {
73
-
74
- $methods['mmbUpgradeWorker'] = 'mmb_worker_upgrade';
75
- // stats
76
- $methods['mmbGetStats'] = 'mmb_stats_get';
77
- $methods['mmbGetServerStatus'] = 'mmb_stats_server_get';
78
- $methods['mmbGetUserHitStats'] = 'mmb_stats_hit_count_get';
79
-
80
- // plugins
81
- $methods['mmbGetPluginList'] = 'mmb_plugin_get_list';
82
- $methods['mmbActivatePlugin'] = 'mmb_plugin_activate';
83
- $methods['mmbDeactivatePlugin'] = 'mmb_plugin_deactivate';
84
- $methods['mmbUpgradePlugin'] = 'mmb_plugin_upgrade';
85
- $methods['mmbUpgradePlugins'] = 'mmb_plugin_upgrade_multiple';
86
- $methods['mmbUpgradeAllPlugins'] = 'mmb_plugin_upgrade_all';
87
- $methods['mmbDeletePlugin'] = 'mmb_plugin_delete';
88
- $methods['mmbInstallPlugin'] = 'mmb_plugin_install';
89
- $methods['mmbUploadPluginByURL'] = 'mmb_plugin_upload_by_url';
90
-
91
- //themes
92
- $methods['mmbGetThemeList'] = 'mmb_theme_get_list';
93
- $methods['mmbActivateTheme'] = 'mmb_theme_activate';
94
- $methods['mmbDeleteTheme'] = 'mmb_theme_delete';
95
- $methods['mmbInstallTheme'] = 'mmb_theme_install';
96
- $methods['mmbUpgradeTheme'] = 'mmb_theme_upgrade';
97
- $methods['mmbUpgradeThemes'] = 'mmb_themes_upgrade';
98
- $methods['mmbUploadThemeByURL'] = 'mmb_theme_upload_by_url';
99
-
100
- // wordpress update
101
- $methods['mmbWPCheckVersion'] = 'mmb_wp_checkversion';
102
- $methods['mmbWPUpgrade'] = 'mmb_wp_upgrade';
103
- $methods['mmbWPGetUpdates'] = 'mmb_wp_get_updates';
104
-
105
- // categories
106
- // native XMLRPC method to get category list is not good enough
107
- // so we make our own
108
- $methods['mmbGetCategoryList'] = 'mmb_cat_get_list';
109
- $methods['mmbUpdateCategory'] = 'mmb_cat_update';
110
- $methods['mmbAddCategory'] = 'mmb_cat_add';
111
- // (category deleting can be handled well by native XMLRPC method)
112
-
113
- //tags by ashish
114
- $methods['mmbGetTagList'] = 'mmb_tag_get_list';
115
- $methods['mmbUpdateTag'] = 'mmb_tag_update';
116
- $methods['mmbAddTag'] = 'mmb_tag_add';
117
- $methods['mmbDeleteTag'] = 'mmb_tag_delete';
118
-
119
-
120
- // pages
121
- $methods['mmbGetPageEditData'] = 'mmb_page_get_edit_data';
122
- $methods['mmbGetPageNewData'] = 'mmb_page_get_new_data';
123
- $methods['mmbUpdatePage'] = 'mmb_page_update';
124
- $methods['mmbCreatePage'] = 'mmb_page_create';
125
-
126
- // posts
127
- $methods['mmbGetPostList'] = 'mmb_post_get_list';
128
- $methods['mmbGetPostNewData'] = 'mmb_post_get_new_data';
129
- $methods['mmbGetPostEditData'] = 'mmb_post_get_edit_data';
130
- $methods['mmbUpdatePost'] = 'mmb_post_update';
131
- $methods['mmbCreatePost'] = 'mmb_post_create';
132
- $methods['mmbPublishPost'] = 'mmb_post_publish';
133
- $methods['mmbPostChecksum'] = 'mmb_post_checksum';
134
-
135
- //comments
136
- $methods['mmbRestoreComment'] = 'mmb_restore_comment';
137
- $methods['mmbGetCommentCount'] = 'mmb_get_comment_count';
138
- $methods['mmbBulkEditComment'] = 'mmb_bulk_edit_comment';
139
-
140
- //users
141
- $methods['mmbUserChangePassword'] = 'mmb_user_change_password';
142
-
143
- //Backup/Restore
144
- $methods['mmbBackupNow'] = 'mmb_backup_now';
145
- $methods['mmbRestoreNow'] = 'mmb_restore_now';
146
- $methods['mmbGetBackupUrl'] = 'mmb_get_backup_url';
147
- $methods['mmbWeeklyBackup'] = 'mmb_weekly_backup';
148
- $methods['mmbLastWorkerMessage'] = 'mmb_geet_last_worker_message';
149
- return $methods;
150
- }
151
-
152
- /**
153
- * Gets an instance of the Comment class
154
- *
155
- */
156
- function get_comment_instance()
157
- {
158
- if (!isset($this->comment_instance))
159
- {
160
- $this->comment_instance = new Mmb_Comment();
161
- }
162
-
163
- return $this->comment_instance;
164
- }
165
-
166
- /**
167
- * Gets an instance of the Plugin class
168
- *
169
- */
170
- function get_plugin_instance()
171
- {
172
- if (!isset($this->plugin_instance))
173
- {
174
- $this->plugin_instance = new Mmb_Plugin();
175
- }
176
-
177
- return $this->plugin_instance;
178
- }
179
-
180
- /**
181
- * Gets an instance of the Theme class
182
- *
183
- */
184
- function get_theme_instance()
185
- {
186
- if (!isset($this->theme_instance))
187
- {
188
- $this->theme_instance = new Mmb_Theme();
189
- }
190
-
191
- return $this->theme_instance;
192
- }
193
-
194
- /**
195
- * Gets an instance of Mmb_Page class
196
- *
197
- */
198
- function get_page_instance()
199
- {
200
- if (!isset($this->page_instance))
201
- {
202
- $this->page_instance = new Mmb_Page();
203
- }
204
-
205
- return $this->page_instance;
206
- }
207
-
208
- /**
209
- * Gets an instance of Mmb_Post class
210
- *
211
- */
212
- function get_post_instance()
213
- {
214
- if (!isset($this->post_instance))
215
- {
216
- $this->post_instance = new Mmb_Post();
217
- }
218
-
219
- return $this->post_instance;
220
- }
221
-
222
- /**
223
- * Gets an instance of Category class
224
- *
225
- */
226
- function get_category_instance()
227
- {
228
- if (!isset($this->category_instance))
229
- {
230
- $this->category_instance = new Mmb_Category();
231
- }
232
-
233
- return $this->category_instance;
234
- }
235
-
236
- /**
237
- * Gets an instance of Tag class
238
- *
239
- */
240
- function get_tag_instance()
241
- {
242
- if (!isset($this->tag_instance))
243
- {
244
- $this->tag_instance = new Mmb_Tags();
245
- }
246
-
247
- return $this->tag_instance;
248
- }
249
-
250
- /**
251
- * Gets an instance of the WP class
252
- *
253
- */
254
- function get_wp_instance()
255
- {
256
- if (!isset($this->wp_instance))
257
- {
258
- $this->wp_instance = new Mmb_WP();
259
- }
260
-
261
- return $this->wp_instance;
262
- }
263
-
264
- /**
265
- * Gets an instance of User
266
- *
267
- */
268
- function get_user_instance()
269
- {
270
- if (!isset($this->user_instance))
271
- {
272
- $this->user_instance = new Mmb_User();
273
- }
274
-
275
- return $this->user_instance;
276
- }
277
-
278
- /**
279
- * Gets an instance of stats class
280
- *
281
- */
282
- function get_stats_instance()
283
- {
284
- if (!isset($this->stats_instance))
285
- {
286
- $this->stats_instance = new Mmb_Stats();
287
- }
288
-
289
- return $this->stats_instance;
290
- }
291
-
292
- /**
293
- * Gets an instance of stats class
294
- *
295
- */
296
- function get_backup_instance()
297
- {
298
- if (!isset($this->backup_instance))
299
- {
300
- $this->backup_instance = new Mmb_Backup();
301
- }
302
-
303
- return $this->backup_instance;
304
- }
305
-
306
- function install()
307
- {
308
- //no need to check just update the table will run only when plugin installs
309
- update_option('enable_xmlrpc', 1);
310
- }
311
-
312
- /**
313
- * Saves the (modified) options into the database
314
- *
315
- */
316
- function _save_options()
317
- {
318
- if (get_option($this->slug))
319
- {
320
- update_option($this->slug, $this->settings);
321
- }
322
- else
323
- {
324
- add_option($this->slug, $this->settings);
325
- }
326
- }
327
-
328
- /**
329
- * Constructs a url (for ajax purpose)
330
- *
331
- * @param mixed $base_page
332
- */
333
- function _construct_url($params = array(), $base_page = 'index.php')
334
- {
335
- $url = "$base_page?_wpnonce=" . wp_create_nonce($this->slug);
336
- foreach ($params as $key => $value)
337
- {
338
- $url .= "&$key=$value";
339
- }
340
-
341
- return $url;
342
- }
343
-
344
- function update_this_plugin($args) {
345
- $this->_escape($args);
346
-
347
- $username = $args[0];
348
- $password = $args[1];
349
- $url = $args[2];
350
- // return array('test' => 'hello there');
351
-
352
- if (!$user = $this->login($username, $password))
353
- {
354
- return $this->error;
355
- }
356
- if (!current_user_can('administrator'))
357
- {
358
- return new IXR_Error(401, 'Sorry, Only administrators can upgrade this plugin on the remote blog.');
359
- }
360
-
361
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
362
-
363
- ob_start();
364
- @unlink(WP_PLUGIN_DIR.'/worker');
365
- $upgrader = new Plugin_Upgrader();
366
- //$deactivate = $upgrader->deactivate_plugin_before_upgrade(false, 'worker/init.php');
367
- $result = $upgrader->run(array(
368
- 'package' => $url,
369
- 'destination' => WP_PLUGIN_DIR,
370
- 'clear_destination' => true,
371
- 'clear_working' => true,
372
- 'hook_extra' => array(
373
- 'plugin' => 'worker/init.php'
374
- )));
375
- ob_end_clean();
376
- if(is_wp_error($result) || !$result){
377
- $error = is_wp_error($result) ? $result->get_error_message() : 'Check your FTP details. <a href="http://managewp.com/user-guide#ftp" title="More Info" target="_blank">More Info</a>' ;
378
- $this->_last_worker_message(array('error' => print_r($error, true)));
379
- }else {
380
- $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $upgrader->plugin_info());
381
- $this->_last_worker_message(array('success' => $upgrader->plugin_info(), 'name' => $data['Name'], 'activate' => print_r($activate, true)));
382
- }
383
-
384
- }
385
-
386
- /**
387
- * Logs a user int
388
- *
389
- * @param mixed $username
390
- * @param mixed $password
391
- * @return WP_Error|WP_User
392
- */
393
- function login($username, $password)
394
- {
395
- if (!get_option( 'enable_xmlrpc'))
396
- {
397
- update_option('enable_xmlrpc', 1);
398
- // return new IXR_Error(405, 'XML-RPC services are disabled on this blog.');
399
- }
400
-
401
- $user = wp_authenticate($username, $password);
402
-
403
- if (is_wp_error($user)) {
404
- $this->error = new IXR_Error(403, __('Bad login/pass combination.'));
405
- return false;
406
- }
407
-
408
- set_current_user( $user->ID );
409
- return $user;
410
- }
411
  }
1
+ <?php
2
+
3
+ class MMB_Core extends MMB_Helper
4
+ {
5
+ var $name;
6
+ var $slug;
7
+ var $settings;
8
+ var $remote_client;
9
+ var $comment_instance;
10
+ var $plugin_instance;
11
+ var $theme_instance;
12
+ var $wp_instance;
13
+ var $post_instance;
14
+ var $stats_instance;
15
+ var $user_instance;
16
+ var $backup_instance;
17
+
18
+
19
+ function __construct(){
20
+ global $mmb_plugin_dir;
21
+
22
+ $this->name = 'Manage Multiple Blogs';
23
+ $this->slug = 'manage-multiple-blogs';
24
+ $this->settings = get_option($this->slug);
25
+ if (!$this->settings)
26
+ {
27
+ $this->settings = array(
28
+ 'blogs' => array(),
29
+ 'current_blog' => array('type' => null)
30
+ );
31
+ }
32
+ add_action('rightnow_end', array($this, 'add_right_now_info'));
33
+ add_action('wp_footer', array('MMB_Stats', 'set_hit_count'));
34
+ register_activation_hook($mmb_plugin_dir.'/init.php', array($this, 'install'));
35
+ add_action('init', array($this, 'automatic_login'));
36
+ }
37
+
38
+
39
+ /**
40
+ * Add an item into the Right Now Dashboard widget
41
+ * to inform that the blog can be managed remotely
42
+ *
43
+ */
44
+ function add_right_now_info()
45
+ {
46
+ echo '<div class="mmb-slave-info">
47
+ <p>This site can be managed remotely.</p>
48
+ </div>';
49
+ }
50
+
51
+ /**
52
+ * Gets an instance of the Comment class
53
+ *
54
+ */
55
+ function get_comment_instance()
56
+ {
57
+ if (!isset($this->comment_instance))
58
+ {
59
+ $this->comment_instance = new MMB_Comment();
60
+ }
61
+
62
+ return $this->comment_instance;
63
+ }
64
+
65
+ /**
66
+ * Gets an instance of the Plugin class
67
+ *
68
+ */
69
+ function get_plugin_instance()
70
+ {
71
+ if (!isset($this->plugin_instance))
72
+ {
73
+ $this->plugin_instance = new MMB_Plugin();
74
+ }
75
+
76
+ return $this->plugin_instance;
77
+ }
78
+
79
+ /**
80
+ * Gets an instance of the Theme class
81
+ *
82
+ */
83
+ function get_theme_instance()
84
+ {
85
+ if (!isset($this->theme_instance))
86
+ {
87
+ $this->theme_instance = new MMB_Theme();
88
+ }
89
+
90
+ return $this->theme_instance;
91
+ }
92
+
93
+
94
+ /**
95
+ * Gets an instance of MMB_Post class
96
+ *
97
+ */
98
+ function get_post_instance()
99
+ {
100
+ if (!isset($this->post_instance))
101
+ {
102
+ $this->post_instance = new MMB_Post();
103
+ }
104
+
105
+ return $this->post_instance;
106
+ }
107
+
108
+ /**
109
+ * Gets an instance of Blogroll class
110
+ *
111
+ */
112
+ function get_blogroll_instance()
113
+ {
114
+ if (!isset($this->blogroll_instance))
115
+ {
116
+ $this->blogroll_instance = new MMB_Blogroll();
117
+ }
118
+
119
+ return $this->blogroll_instance;
120
+ }
121
+
122
+
123
+
124
+ /**
125
+ * Gets an instance of the WP class
126
+ *
127
+ */
128
+ function get_wp_instance()
129
+ {
130
+ if (!isset($this->wp_instance))
131
+ {
132
+ $this->wp_instance = new MMB_WP();
133
+ }
134
+
135
+ return $this->wp_instance;
136
+ }
137
+
138
+ /**
139
+ * Gets an instance of User
140
+ *
141
+ */
142
+ function get_user_instance()
143
+ {
144
+ if (!isset($this->user_instance))
145
+ {
146
+ $this->user_instance = new MMB_User();
147
+ }
148
+
149
+ return $this->user_instance;
150
+ }
151
+
152
+ /**
153
+ * Gets an instance of stats class
154
+ *
155
+ */
156
+ function get_stats_instance()
157
+ {
158
+ if (!isset($this->stats_instance))
159
+ {
160
+ $this->stats_instance = new MMB_Stats();
161
+ }
162
+ return $this->stats_instance;
163
+ }
164
+
165
+ /**
166
+ * Gets an instance of stats class
167
+ *
168
+ */
169
+ function get_backup_instance()
170
+ {
171
+ if (!isset($this->backup_instance))
172
+ {
173
+ $this->backup_instance = new MMB_Backup();
174
+ }
175
+
176
+ return $this->backup_instance;
177
+ }
178
+
179
+ /**
180
+ * Plugin install callback function
181
+ * Check PHP version
182
+ */
183
+ function install()
184
+ {
185
+ delete_option('_worker_nossl_key');
186
+ delete_option('_worker_public_key');
187
+ delete_option('_action_message_id');
188
+ if(PHP_VERSION < 5)
189
+ exit("<p>Plugin could not be activated. Your PHP version must be 5.0 or higher.</p>");
190
+ }
191
+
192
+ /**
193
+ * Saves the (modified) options into the database
194
+ *
195
+ */
196
+ function _save_options()
197
+ {
198
+ if (get_option($this->slug))
199
+ {
200
+ update_option($this->slug, $this->settings);
201
+ }
202
+ else
203
+ {
204
+ add_option($this->slug, $this->settings);
205
+ }
206
+ }
207
+
208
+ /**
209
+ * Deletes options for communication with master
210
+ *
211
+ */
212
+ function uninstall(){
213
+ delete_option('_worker_nossl_key');
214
+ delete_option('_worker_public_key');
215
+ delete_option('_action_message_id');
216
+ }
217
+
218
+ /**
219
+ * Constructs a url (for ajax purpose)
220
+ *
221
+ * @param mixed $base_page
222
+ */
223
+ function _construct_url($params = array(), $base_page = 'index.php')
224
+ {
225
+ $url = "$base_page?_wpnonce=" . wp_create_nonce($this->slug);
226
+ foreach ($params as $key => $value)
227
+ {
228
+ $url .= "&$key=$value";
229
+ }
230
+
231
+ return $url;
232
+ }
233
+
234
+ /**
235
+ * Worker update
236
+ *
237
+ */
238
+ function update_worker_plugin($params) {
239
+
240
+ extract($params);
241
+ if($download_url){
242
+
243
+ include_once(ABSPATH . 'wp-admin/includes/file.php');
244
+ include_once ABSPATH . 'wp-admin/includes/misc.php';
245
+ include_once ABSPATH . 'wp-admin/includes/template.php';
246
+ include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
247
+
248
+ ob_start();
249
+ @unlink(dirname(__FILE__));
250
+ $upgrader = new Plugin_Upgrader();
251
+ $result = $upgrader->run(array(
252
+ 'package' => $download_url,
253
+ 'destination' => WP_PLUGIN_DIR,
254
+ 'clear_destination' => true,
255
+ 'clear_working' => true,
256
+ 'hook_extra' => array(
257
+ 'plugin' => 'worker/init.php'
258
+ )));
259
+ ob_end_clean();
260
+ if(is_wp_error($result) || !$result){
261
+ return array('error' => 'Manage WP Worker could not been upgraded.');
262
+ }
263
+ else{
264
+ return array('success' => 'Manage WP Worker plugin successfully upgraded.');
265
+ }
266
+ }
267
+ return array('error' => 'Bad download path for worker installation file.');
268
+ }
269
+
270
+ /**
271
+ * Automatically logs in when called from Master
272
+ *
273
+ */
274
+ function automatic_login(){
275
+
276
+
277
+ $where = ($_GET['mwp_goto']);
278
+ if (!is_user_logged_in() && $_GET['auto_login']) {
279
+ $signature = base64_decode($_GET['signature']);
280
+ $message_id = trim($_GET['message_id']);
281
+ $username = $_GET['username'];
282
+
283
+ $auth = $this->_authenticate_message($where.$message_id, $signature, $message_id);
284
+ if($auth === true){
285
+ $user = get_user_by('login', $username);
286
+ $user_id = $user->ID;
287
+ wp_set_current_user($user_id, $username);
288
+ wp_set_auth_cookie( $user_id );
289
+ do_action('wp_login', $username);
290
+ }
291
+ else
292
+ {
293
+ wp_die($auth['error']);
294
+ }
295
+ }
296
+
297
+ if($_GET['auto_login']){
298
+ wp_redirect(get_bloginfo('url')."/wp-admin/".$where);
299
+ exit();
300
+ }
301
+ }
302
+
303
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
304
  }
ende.class.php DELETED
@@ -1,124 +0,0 @@
1
- <?php
2
- /*
3
- Ende - Simple text encryption and decryption
4
- by Johan De Klerk
5
- johan@wisi.co.za
6
- */
7
-
8
- class Mmb_EnDe {
9
-
10
- var $key;
11
- var $data;
12
-
13
- var $td;
14
- var $iv;
15
- var $init = false;
16
- var $mcrypt_available = true;
17
- function __construct($key='',$data='') {
18
- if ($key != '') {
19
- $this->init($key);
20
- }
21
- $this->data = $data;
22
- }
23
-
24
- function init(&$key) {
25
- $this->key = substr (md5($key), 0, 16);
26
- if(function_exists('mcrypt_module_open')){
27
- //rijndael 128 and AES are similar except for key lengths
28
- $this->td = mcrypt_module_open (MCRYPT_RIJNDAEL_128, '', MCRYPT_MODE_ECB, '');
29
- // $this->key = substr (md5($key), 0, mcrypt_enc_get_key_size ($this->td));
30
- //we will use 16 as key length to simulate AES and mysql aes_encrypt, aes_decrypt
31
- $iv_size = mcrypt_enc_get_iv_size ($this->td);
32
- $this->iv = mcrypt_create_iv ($iv_size, MCRYPT_RAND);
33
- }else{
34
- $this->mcrypt_available = false;
35
- }
36
- $this->init = true;
37
- }
38
-
39
- function setKey($key) {
40
- $this->init($key);
41
- }
42
-
43
- function setData($data) {
44
- $this->data = $data;
45
- }
46
-
47
- function & getKey() {
48
- return $this->key;
49
- }
50
-
51
- function & getData() {
52
- return $this->data;
53
- }
54
-
55
- function & encrypt($data='') {
56
- if($this->mcrypt_available)
57
- return $this->_crypt('encrypt',$data);
58
- else
59
- return $this->_mysql_crypt('encrypt', $data);
60
- }
61
-
62
- function & decrypt($data='') {
63
- if($this->mcrypt_available)
64
- return $this->_crypt('decrypt',$data);
65
- else
66
- return $this->_mysql_crypt('decrypt', $data);
67
- }
68
-
69
- function close() {
70
- mcrypt_module_close($this->td);
71
- }
72
-
73
- function & _crypt($mode,&$data) {
74
- if ($data != '') {
75
- $this->data = $data;
76
- }
77
-
78
- if ($this->init) {
79
- $ret = mcrypt_generic_init($this->td,$this->key,$this->iv);
80
- if ( ($ret >= 0) || ($ret !== false) ) {
81
- if ($mode == 'encrypt') {
82
- $this->data = mcrypt_generic($this->td, $this->data);
83
- }
84
- elseif ($mode == 'decrypt') {
85
- $this->data = mdecrypt_generic($this->td, $this->data);
86
- }
87
-
88
- mcrypt_generic_deinit($this->td);
89
-
90
- return $this->data;
91
- }
92
- else {
93
- trigger_error('Error initialising '.$mode.'ion handle',E_USER_ERROR);
94
- }
95
- }
96
- else {
97
- trigger_error('Key not set. Use setKey() method',E_USER_ERROR);
98
- }
99
- }
100
-
101
- function _mysql_crypt($mode, $data) {
102
- global $wpdb;
103
-
104
- if ($data != '') {
105
- $this->data = $data;
106
- }
107
-
108
- if($this->init){
109
- switch ($mode) {
110
- case 'encrypt':
111
- return $wpdb->get_var("SELECT AES_ENCRYPT('{$data}', '{$this->key}')");
112
- break;
113
-
114
- case 'encrypt':
115
- return $wpdb->get_var("SELECT AES_DECRYPT('{$data}', '{$this->key}')");
116
- break;
117
-
118
- default:
119
- break;
120
- }
121
- }
122
- }
123
- }
124
- ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
helper.class.php CHANGED
@@ -1,206 +1,387 @@
1
- <?php
2
-
3
- class Mmb_Helper
4
- {
5
- /**
6
- * Creates an ajax response
7
- *
8
- * @param mixed $status
9
- * @param mixed $msg
10
- */
11
- function _create_ajax_response($msg, $success = TRUE, $other_html = '')
12
- {
13
- $msg = base64_encode($msg);
14
- $success = $success ? 'true' : 'false';
15
- echo <<<EOT
16
- <script type="text/javascript">
17
- mmbAjaxSuccess = $success;
18
- mmbAjaxMessage = "$msg";
19
- </script>
20
- $other_html
21
- EOT;
22
- die();
23
- }
24
-
25
- /**
26
- * A helper function to log data
27
- *
28
- * @param mixed $mixed
29
- */
30
- function _log($mixed)
31
- {
32
- if (is_array($mixed))
33
- {
34
- $mixed = print_r($mixed, 1);
35
- }
36
- else if (is_object($mixed))
37
- {
38
- ob_start();
39
- var_dump($mixed);
40
- $mixed = ob_get_clean();
41
- }
42
-
43
- $handle = fopen(dirname(__FILE__) . '/log', 'a');
44
- fwrite($handle, $mixed . PHP_EOL);
45
- fclose($handle);
46
- }
47
-
48
- /**
49
- * Strips WP disallowed HTML and PHP tags from a string
50
- *
51
- * @param mixed $str
52
- * @return string
53
- */
54
- function _strip_tags($str)
55
- {
56
- return strip_tags($str, '<address><a><abbr><acronym><area><b><big><blockquote><br><caption><cite><class><code><col><del><dd><div><dl><dt><em><font><h1><h2><h3><h4><h5><h6><hr><i><img><ins><kbd><li><map><ol><p><pre><q><s><span><strike><strong><sub><sup><table><tbody><td><tfoot><tr><tt><ul><var>');
57
- }
58
-
59
- /**
60
- * Filters a WordPress content (being comments, pages, posts etc)
61
- *
62
- * @param mixed $str
63
- * @return string
64
- */
65
- function _filter_content($str)
66
- {
67
- return nl2br($this->_strip_tags($str));
68
- }
69
-
70
-
71
-
72
- function _escape(&$array) {
73
- global $wpdb;
74
-
75
- if(!is_array($array)) {
76
- return($wpdb->escape($array));
77
- }
78
- else {
79
- foreach ( (array) $array as $k => $v ) {
80
- if (is_array($v)) {
81
- $this->_escape($array[$k]);
82
- } else if (is_object($v)) {
83
- //skip
84
- } else {
85
- $array[$k] = $wpdb->escape($v);
86
- }
87
- }
88
- }
89
- }
90
-
91
- function _base64_encode($str)
92
- {
93
- // a plus sign can break the encoded string
94
- // if sent via URL
95
- return str_replace('+', '|', base64_encode($str));
96
- }
97
-
98
- function _base64_decode($str)
99
- {
100
- return base64_decode(str_replace('|', '+', $str));
101
- }
102
-
103
- function _print_r($arr)
104
- {
105
- if (is_string($arr)) $arr = array($arr);
106
- echo '<pre>';
107
- print_r($arr);
108
- echo '</pre>';
109
- }
110
-
111
- /**
112
- * Initializes the file system
113
- *
114
- */
115
- function _init_filesystem()
116
- {
117
- global $wp_filesystem;
118
-
119
- if (!$wp_filesystem || !is_object($wp_filesystem))
120
- {
121
- WP_Filesystem();
122
- }
123
-
124
- if (!is_object($wp_filesystem))
125
- return FALSE;
126
-
127
- return TRUE;
128
- }
129
-
130
- /**
131
- * Gets transient based on WP version
132
- *
133
- * @global string $wp_version
134
- * @param string $option_name
135
- * @return mixed
136
- */
137
- function mmb_get_transient($option_name)
138
- {
139
-
140
- if(trim($option_name) == ''){
141
- return FALSE;
142
- }
143
-
144
- global $wp_version;
145
-
146
- if (version_compare($wp_version, '2.8', '<'))
147
- return get_option($option_name);
148
-
149
- else if (version_compare($wp_version, '3.0', '<'))
150
- return get_transient($option_name);
151
-
152
- else
153
- return get_site_transient($option_name);
154
-
155
- }
156
-
157
- function mmb_null_op_buffer($buffer) {
158
- //do nothing
159
- if(!ob_get_level())
160
- ob_start(array($this, 'mmb_null_op_buffer'));
161
- return '';
162
- }
163
-
164
- function _deleteTempDir($directory) {
165
- if(substr($directory,-1) == "/") {
166
- $directory = substr($directory,0,-1);
167
- }
168
- // $this->_log($directory);
169
- if(!file_exists($directory) || !is_dir($directory)) {
170
- return false;
171
- } elseif(!is_readable($directory)) {
172
- return false;
173
- } else {
174
- $directoryHandle = opendir($directory);
175
-
176
- while ($contents = readdir($directoryHandle)) {
177
- if($contents != '.' && $contents != '..') {
178
- $path = $directory . "/" . $contents;
179
-
180
- if(is_dir($path)) {
181
- $this->_deleteTempDir($path);
182
- } else {
183
- unlink($path);
184
- }
185
- }
186
- }
187
- closedir($directoryHandle);
188
- rmdir($directory);
189
- return true;
190
- }
191
- }
192
- function _last_worker_message($message){
193
- add_option('_worker_last_massage', serialize($message)) or update_option('_worker_last_massage', serialize($message));
194
- }
195
- function _get_last_worker_message(){
196
- $message = get_option('_worker_last_massage', array());
197
- delete_option('_worker_last_massage');
198
- return (array)maybe_unserialize($message);
199
- }
200
- function _is_ftp_writable_mmb(){
201
- if(defined('FTP_PASS')){
202
- return true;
203
- }
204
- else return false;
205
- }
206
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ <?php
2
+ /*************************************************************
3
+ *
4
+ * helper.class.php
5
+ *
6
+ * Various utility functions
7
+ *
8
+ *
9
+ * Copyright (c) 2011 Prelovac Media
10
+ * www.prelovac.com
11
+ **************************************************************/
12
+
13
+ class MMB_Helper
14
+ {
15
+ /**
16
+ * A helper function to log data
17
+ *
18
+ * @param mixed $mixed
19
+ */
20
+ function _log($mixed)
21
+ {
22
+ if (is_array($mixed)) {
23
+ $mixed = print_r($mixed, 1);
24
+ } else if (is_object($mixed)) {
25
+ ob_start();
26
+ var_dump($mixed);
27
+ $mixed = ob_get_clean();
28
+ }
29
+
30
+ $handle = fopen(dirname(__FILE__) . '/log', 'a');
31
+ fwrite($handle, $mixed . PHP_EOL);
32
+ fclose($handle);
33
+ }
34
+
35
+ /**
36
+ * Strips WP disallowed HTML and PHP tags from a string
37
+ *
38
+ * @param mixed $str
39
+ * @return string
40
+ */
41
+ function _strip_tags($str)
42
+ {
43
+ return strip_tags($str, '<address><a><abbr><acronym><area><b><big><blockquote><br><caption><cite><class><code><col><del><dd><div><dl><dt><em><font><h1><h2><h3><h4><h5><h6><hr><i><img><ins><kbd><li><map><ol><p><pre><q><s><span><strike><strong><sub><sup><table><tbody><td><tfoot><tr><tt><ul><var>');
44
+ }
45
+
46
+ /**
47
+ * Filters a WordPress content (being comments, pages, posts etc)
48
+ *
49
+ * @param mixed $str
50
+ * @return string
51
+ */
52
+ function _filter_content($str)
53
+ {
54
+ return nl2br($this->_strip_tags($str));
55
+ }
56
+
57
+
58
+
59
+ function _escape(&$array)
60
+ {
61
+ global $wpdb;
62
+
63
+ if (!is_array($array)) {
64
+ return ($wpdb->escape($array));
65
+ } else {
66
+ foreach ((array) $array as $k => $v) {
67
+ if (is_array($v)) {
68
+ $this->_escape($array[$k]);
69
+ } else if (is_object($v)) {
70
+ //skip
71
+ } else {
72
+ $array[$k] = $wpdb->escape($v);
73
+ }
74
+ }
75
+ }
76
+ }
77
+
78
+ function _base64_encode($str)
79
+ {
80
+ // a plus sign can break the encoded string
81
+ // if sent via URL
82
+ return str_replace('+', '|', base64_encode($str));
83
+ }
84
+
85
+ function _base64_decode($str)
86
+ {
87
+ return base64_decode(str_replace('|', '+', $str));
88
+ }
89
+
90
+ function _print_r($arr)
91
+ {
92
+ if (is_string($arr))
93
+ $arr = array(
94
+ $arr
95
+ );
96
+ echo '<pre>';
97
+ print_r($arr);
98
+ echo '</pre>';
99
+ }
100
+
101
+ /**
102
+ * Initializes the file system
103
+ *
104
+ */
105
+ function _init_filesystem()
106
+ {
107
+ global $wp_filesystem;
108
+
109
+ if (!$wp_filesystem || !is_object($wp_filesystem)) {
110
+ WP_Filesystem();
111
+ }
112
+
113
+ if (!is_object($wp_filesystem))
114
+ return FALSE;
115
+
116
+ return TRUE;
117
+ }
118
+
119
+ /**
120
+ * Gets transient based on WP version
121
+ *
122
+ * @global string $wp_version
123
+ * @param string $option_name
124
+ * @return mixed
125
+ */
126
+ function mmb_get_transient($option_name)
127
+ {
128
+ if (trim($option_name) == '') {
129
+ return FALSE;
130
+ }
131
+
132
+ global $wp_version, $_wp_using_ext_object_cache;
133
+
134
+ if (version_compare($wp_version, '2.8.0', '<')){
135
+ return get_option($option_name);
136
+ }
137
+ else if (version_compare($wp_version, '3.0.0', '<')){
138
+ if(get_transient($option_name))
139
+ return get_transient($option_name);
140
+ else
141
+ return get_option('_transient_'.$option_name);
142
+ }
143
+ else {
144
+ if(get_site_transient($option_name))
145
+ return get_site_transient($option_name);
146
+ else
147
+ return get_option('_site_transient_'.$option_name);
148
+ }
149
+ }
150
+
151
+ function mmb_delete_transient($option_name)
152
+ {
153
+ if (trim($option_name) == '') {
154
+ return FALSE;
155
+ }
156
+
157
+ global $wp_version;
158
+
159
+ if (version_compare($wp_version, '2.8.0', '<')){
160
+ delete_option($option_name);
161
+ }
162
+ else if (version_compare($wp_version, '3.0.0', '<')){
163
+ if(delete_transient($option_name))
164
+ delete_transient($option_name);
165
+ else
166
+ delete_option('_transient_'.$option_name);
167
+ }
168
+ else {
169
+ if(delete_site_transient($option_name))
170
+ delete_site_transient($option_name);
171
+ else
172
+ delete_option('_site_transient_'.$option_name);
173
+ }
174
+ }
175
+
176
+ function mmb_null_op_buffer($buffer)
177
+ {
178
+ //do nothing
179
+ if (!ob_get_level())
180
+ ob_start(array(
181
+ $this,
182
+ 'mmb_null_op_buffer'
183
+ ));
184
+ return '';
185
+ }
186
+
187
+ function _deleteTempDir($directory)
188
+ {
189
+ if (substr($directory, -1) == "/") {
190
+ $directory = substr($directory, 0, -1);
191
+ }
192
+ // $this->_log($directory);
193
+ if (!file_exists($directory) || !is_dir($directory)) {
194
+ return false;
195
+ } elseif (!is_readable($directory)) {
196
+ return false;
197
+ } else {
198
+ $directoryHandle = opendir($directory);
199
+
200
+ while ($contents = readdir($directoryHandle)) {
201
+ if ($contents != '.' && $contents != '..') {
202
+ $path = $directory . "/" . $contents;
203
+
204
+ if (is_dir($path)) {
205
+ $this->_deleteTempDir($path);
206
+ } else {
207
+ unlink($path);
208
+ }
209
+ }
210
+ }
211
+ closedir($directoryHandle);
212
+ rmdir($directory);
213
+ return true;
214
+ }
215
+ }
216
+
217
+ function _is_ftp_writable_mmb()
218
+ {
219
+ if (defined('FTP_PASS')) {
220
+ return true;
221
+ } else
222
+ return false;
223
+ }
224
+
225
+ function _set_worker_message_id($message_id = false)
226
+ {
227
+ if ($message_id) {
228
+ add_option('_action_message_id', $message_id) or update_option('_action_message_id', $message_id);
229
+ return $message_id;
230
+ }
231
+ return false;
232
+ }
233
+
234
+ function _get_worker_message_id()
235
+ {
236
+ return (int) get_option('_action_message_id');
237
+ }
238
+
239
+ function _set_master_public_key($public_key = false)
240
+ {
241
+ if ($public_key && !get_option('_worker_public_key')) {
242
+ add_option('_worker_public_key', base64_encode($public_key));
243
+ return true;
244
+ }
245
+ return false;
246
+ }
247
+
248
+ function _get_master_public_key()
249
+ {
250
+ if (!get_option('_worker_public_key'))
251
+ return false;
252
+ return base64_decode(get_option('_worker_public_key'));
253
+ }
254
+
255
+ function _get_master_referer(){
256
+ if (!get_option('_master_referer'))
257
+ return false;
258
+ return base64_decode(get_option('_master_referer'));
259
+ }
260
+
261
+ function _get_random_signature(){
262
+ if (!get_option('_worker_nossl_key'))
263
+ return false;
264
+ return base64_decode(get_option('_worker_nossl_key'));
265
+ }
266
+
267
+ function _set_random_signature($random_key = false){
268
+
269
+ if ($random_key && !get_option('_worker_nossl_key')){
270
+ add_option('_worker_nossl_key', base64_encode($random_key));
271
+ return true;
272
+ }
273
+ return false;
274
+ }
275
+
276
+
277
+ function _authenticate_message($data = false, $signature = false, $message_id = false)
278
+ {
279
+ if (!$data && !$signature) {
280
+ return array(
281
+ 'error' => 'Authentication failed.'
282
+ );
283
+ }
284
+
285
+ $current_message = $this->_get_worker_message_id();
286
+
287
+ if ((int) $current_message > (int) $message_id)
288
+ return array(
289
+ 'error' => 'Invalid message recieved. Please try again.'
290
+ );
291
+
292
+ $pl_key = $this->_get_master_public_key();
293
+ if (!$pl_key) {
294
+ return array(
295
+ 'error' => 'Authentication failed (public key).'
296
+ );
297
+ }
298
+
299
+ if( function_exists( 'openssl_verify' ) && !$this->_get_random_signature()){
300
+ $verify = openssl_verify($data, $signature, $pl_key);
301
+ if ($verify == 1) {
302
+ $message_id = $this->_set_worker_message_id($message_id);
303
+ return true;
304
+ } else if ($verify == 0) {
305
+ return array(
306
+ 'error' => 'Invalid message signature (site is probably managed by another account?)'
307
+ );
308
+ } else {
309
+ return array(
310
+ 'error' => 'Command not successful! Please try again.'
311
+ );
312
+ }
313
+ } else if ($this->_get_random_signature()) {
314
+ if(md5($data.$this->_get_random_signature()) == $signature ){
315
+ $message_id = $this->_set_worker_message_id($message_id);
316
+ return true;
317
+ }
318
+ return array(
319
+ 'error' => 'Invalid message signature. Please try again or re-add the site to your account.'
320
+ );
321
+ }
322
+ // no rand key - deleted in get_stat maybe
323
+ else return array(
324
+ 'error' => 'Invalid message signature, try re-adding the site to your account.)'
325
+ );
326
+ }
327
+
328
+ function _check_if_user_exists($username = false)
329
+ {
330
+ if ($username) {
331
+ require_once(ABSPATH . WPINC . '/registration.php');
332
+
333
+ if (username_exists($username) == null) {
334
+ return false;
335
+ }
336
+ $user = get_userdatabylogin($username);
337
+ if ($user->wp_user_level == 10) {
338
+ define('MMB_USER_CAPABILITIES', $user->wp_user_level);
339
+ return true;
340
+ }
341
+ return false;
342
+ }
343
+ return false;
344
+ }
345
+
346
+ function refresh_updates()
347
+ {
348
+ if (rand(1, 3) == '2') {
349
+ require_once(ABSPATH . WPINC . '/update.php');
350
+ wp_update_plugins();
351
+ wp_update_themes();
352
+ wp_version_check();
353
+ }
354
+ }
355
+
356
+ function remove_http($url = '')
357
+ {
358
+ if ($url == 'http://' OR $url == 'https://') {
359
+ return $url;
360
+ }
361
+ $matches = substr($url, 0, 7);
362
+ if ($matches == 'http://') {
363
+ $url = substr($url, 7);
364
+ } else {
365
+ $matches = substr($url, 0, 8);
366
+ if ($matches == 'https://')
367
+ $url = substr($url, 8);
368
+ }
369
+ return $url;
370
+ }
371
+
372
+ function mmb_get_error($error_object){
373
+ if(!is_wp_error($error_object)){
374
+ return $error_object != '' ? $error_object : ' error occured.';
375
+ }
376
+ else {
377
+ $errors = array();
378
+ foreach($error_object->error_data as $error_key => $error_string){
379
+ $errors[] = str_replace('_', ' ', ucfirst($error_key)).' - '.$error_string;
380
+ }
381
+ return implode('<br />', $errors);
382
+ }
383
+ }
384
+
385
+
386
+ }
387
+ ?>
init.php CHANGED
@@ -1,356 +1,262 @@
1
- <?php
2
- /*
3
- 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.6.3
8
- Author URI: http://prelovac.com/
9
- */
10
-
11
- // PHP warnings can break our XML stuffs
12
-
13
- if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1')
14
- {
15
- error_reporting(E_ERROR);
16
- }
17
-
18
- define('MMB_WORKER_VERSION', '3.6.3');
19
-
20
- global $wpdb, $mmb_plugin_dir, $mmb_plugin_url;
21
-
22
- $mmb_plugin_dir = WP_PLUGIN_DIR . '/' . basename(dirname(__FILE__));
23
- $mmb_plugin_url = WP_PLUGIN_URL . '/' . basename(dirname(__FILE__));
24
- //$mmb_plugin_dir = WP_PLUGIN_DIR . '/manage-multiple-blogs-worker';
25
- //$mmb_plugin_url = WP_PLUGIN_URL . '/manage-multiple-blogs-worker';
26
-
27
- require_once(ABSPATH . 'wp-includes/class-IXR.php');
28
- require_once("$mmb_plugin_dir/helper.class.php");
29
- require_once("$mmb_plugin_dir/ende.class.php");
30
- require_once("$mmb_plugin_dir/core.class.php");
31
- require_once("$mmb_plugin_dir/comment.class.php");
32
- require_once("$mmb_plugin_dir/plugin.class.php");
33
- require_once("$mmb_plugin_dir/theme.class.php");
34
- require_once("$mmb_plugin_dir/category.class.php");
35
- require_once("$mmb_plugin_dir/wp.class.php");
36
- require_once("$mmb_plugin_dir/page.class.php");
37
- require_once("$mmb_plugin_dir/post.class.php");
38
- require_once("$mmb_plugin_dir/stats.class.php");
39
- require_once("$mmb_plugin_dir/user.class.php");
40
- require_once("$mmb_plugin_dir/tags.class.php");
41
- require_once("$mmb_plugin_dir/backup.class.php");
42
- require_once("$mmb_plugin_dir/clone.class.php");
43
- require_once("$mmb_plugin_dir/mmb.wp.upgrader.php");
44
-
45
- //class Mmb_IXR extends IXR_Server{
46
- //
47
- //}
48
-
49
- $mmb_core = new Mmb_Core();
50
- register_activation_hook(__FILE__, array($mmb_core, 'install'));
51
-
52
- function mmb_worker_upgrade($args) {
53
- global $mmb_core;
54
- return $mmb_core->update_this_plugin($args);
55
- }
56
-
57
- function mmb_stats_get($args)
58
- {
59
- global $mmb_core;
60
- return $mmb_core->get_stats_instance()->get($args);
61
- }
62
-
63
- function mmb_stats_server_get($args) {
64
- global $mmb_core;
65
- return $mmb_core->get_stats_instance()->get_server_stats($args);
66
- }
67
-
68
- function mmb_stats_hit_count_get($args) {
69
- global $mmb_core;
70
- return $mmb_core->get_stats_instance()->get_hit_count($args);
71
- }
72
-
73
- function mmb_plugin_get_list($args)
74
- {
75
- global $mmb_core;
76
- return $mmb_core->get_plugin_instance()->get_list($args);
77
- }
78
-
79
- function mmb_plugin_activate($args)
80
- {
81
- global $mmb_core;
82
- return $mmb_core->get_plugin_instance()->activate($args);
83
- }
84
-
85
- function mmb_plugin_deactivate($args)
86
- {
87
- global $mmb_core;
88
- return $mmb_core->get_plugin_instance()->deactivate($args);
89
- }
90
-
91
- function mmb_plugin_upgrade($args)
92
- {
93
- global $mmb_core;
94
- return $mmb_core->get_plugin_instance()->upgrade($args);
95
- }
96
-
97
- function mmb_plugin_upgrade_multiple($args)
98
- {
99
- global $mmb_core;
100
- return $mmb_core->get_plugin_instance()->upgrade_multiple($args);
101
- }
102
-
103
- function mmb_plugin_upgrade_all($args)
104
- {
105
- global $mmb_core;
106
- return $mmb_core->get_plugin_instance()->upgrade_all($args);
107
- }
108
-
109
- function mmb_plugin_delete($args)
110
- {
111
- global $mmb_core;
112
- return $mmb_core->get_plugin_instance()->delete($args);
113
- }
114
-
115
- function mmb_plugin_install($args)
116
- {
117
- global $mmb_core;
118
- return $mmb_core->get_plugin_instance()->install($args);
119
- }
120
-
121
- function mmb_plugin_upload_by_url($args)
122
- {
123
- global $mmb_core;
124
- return $mmb_core->get_plugin_instance()->upload_by_url($args);
125
- }
126
-
127
-
128
-
129
- function mmb_theme_get_list($args)
130
- {
131
- global $mmb_core;
132
- return $mmb_core->get_theme_instance()->get_list($args);
133
- }
134
-
135
- function mmb_theme_activate($args)
136
- {
137
- global $mmb_core;
138
- return $mmb_core->get_theme_instance()->activate($args);
139
- }
140
-
141
- function mmb_theme_delete($args)
142
- {
143
- global $mmb_core;
144
- return $mmb_core->get_theme_instance()->delete($args);
145
- }
146
-
147
- function mmb_theme_install($args)
148
- {
149
- global $mmb_core;
150
- return $mmb_core->get_theme_instance()->install($args);
151
- }
152
-
153
- function mmb_theme_upgrade($args)
154
- {
155
- global $mmb_core;
156
- return $mmb_core->get_theme_instance()->upgrade($args);
157
- }
158
-
159
- function mmb_themes_upgrade($args)
160
- {
161
- global $mmb_core;
162
- return $mmb_core->get_theme_instance()->upgrade_all($args);
163
- }
164
-
165
- function mmb_theme_upload_by_url($args)
166
- {
167
- global $mmb_core;
168
- return $mmb_core->get_theme_instance()->upload_theme_by_url($args);
169
- }
170
-
171
-
172
-
173
-
174
- function mmb_wp_checkversion($args)
175
- {
176
- global $mmb_core;
177
- return $mmb_core->get_wp_instance()->check_version($args);
178
- }
179
-
180
- function mmb_wp_upgrade($args)
181
- {
182
- global $mmb_core;
183
- return $mmb_core->get_wp_instance()->upgrade($args);
184
- }
185
-
186
- function mmb_wp_get_updates($args)
187
- {
188
- global $mmb_core;
189
- return $mmb_core->get_wp_instance()->get_updates($args);
190
- }
191
-
192
-
193
-
194
-
195
-
196
-
197
- function mmb_cat_get_list($args)
198
- {
199
- global $mmb_core;
200
- return $mmb_core->get_category_instance()->get_list($args);
201
- }
202
-
203
- function mmb_cat_update($args)
204
- {
205
- global $mmb_core;
206
- return $mmb_core->get_category_instance()->update($args);
207
- }
208
-
209
- function mmb_cat_add($args)
210
- {
211
- global $mmb_core;
212
- return $mmb_core->get_category_instance()->add($args);
213
- }
214
-
215
-
216
- //Tag start
217
-
218
-
219
- function mmb_tag_get_list($args)
220
- {
221
- global $mmb_core;
222
- return $mmb_core->get_tag_instance()->get_list($args);
223
- }
224
-
225
- function mmb_tag_update($args)
226
- {
227
- global $mmb_core;
228
- return $mmb_core->get_tag_instance()->update($args);
229
- }
230
-
231
- function mmb_tag_add($args)
232
- {
233
- global $mmb_core;
234
- return $mmb_core->get_tag_instance()->add($args);
235
- }
236
-
237
- function mmb_tag_delete($args)
238
- {
239
- global $mmb_core;
240
- return $mmb_core->get_tag_instance()->delete($args);
241
- }
242
- ////End of tag
243
-
244
- function mmb_page_get_edit_data($args)
245
- {
246
- global $mmb_core;
247
- return $mmb_core->get_page_instance()->get_edit_data($args);
248
- }
249
-
250
- function mmb_page_get_new_data($args)
251
- {
252
- global $mmb_core;
253
- return $mmb_core->get_page_instance()->get_new_data($args);
254
- }
255
-
256
- function mmb_page_update($args)
257
- {
258
- global $mmb_core;
259
- return $mmb_core->get_page_instance()->update($args);
260
- }
261
-
262
- function mmb_page_create($args)
263
- {
264
- global $mmb_core;
265
- return $mmb_core->get_page_instance()->create($args);
266
- }
267
-
268
- function mmb_post_get_list($args)
269
- {
270
- global $mmb_core;
271
- return $mmb_core->get_post_instance()->get_list($args);
272
- }
273
-
274
- function mmb_post_get_edit_data($args)
275
- {
276
- global $mmb_core;
277
- return $mmb_core->get_post_instance()->get_edit_data($args);
278
- }
279
-
280
- function mmb_post_update($args)
281
- {
282
- global $mmb_core;
283
- return $mmb_core->get_post_instance()->update($args);
284
- }
285
-
286
- function mmb_post_get_new_data($args)
287
- {
288
- global $mmb_core;
289
- return $mmb_core->get_post_instance()->get_new_data($args);
290
- }
291
-
292
- function mmb_post_create($args)
293
- {
294
- global $mmb_core;
295
- return $mmb_core->get_post_instance()->create($args);
296
- }
297
-
298
- function mmb_post_publish($args)
299
- {
300
- global $mmb_core;
301
- return $mmb_core->get_post_instance()->publish($args);
302
- }
303
-
304
- function mmb_post_checksum($args)
305
- {
306
- global $mmb_core;
307
- return $mmb_core->get_post_instance()->checksum($args);
308
- }
309
-
310
- function mmb_user_change_password($args)
311
- {
312
- global $mmb_core;
313
- return $mmb_core->get_user_instance()->change_password($args);
314
- }
315
-
316
-
317
- function mmb_bulk_edit_comment($args) {
318
- global $mmb_core;
319
- return $mmb_core->get_comment_instance()->bulk_edit_comments($args);
320
- }
321
-
322
- function mmb_get_comment_count($args) {
323
- global $mmb_core;
324
- return $mmb_core->get_comment_instance()->get_comment_count($args);
325
- }
326
-
327
- function mmb_restore_comment($args) {
328
- global $mmb_core;
329
- return $mmb_core->get_comment_instance()->restore_comment($args);
330
- }
331
-
332
- function mmb_backup_now($args) {
333
- global $mmb_core;
334
- return $mmb_core->get_backup_instance()->backup($args);
335
- }
336
-
337
- function mmb_restore_now($args) {
338
- global $mmb_core;
339
- return $mmb_core->get_backup_instance()->restore($args);
340
- }
341
-
342
- function mmb_get_backup_url($args) {
343
- global $mmb_core;
344
- return $mmb_core->get_backup_instance()->get_backup_details($args);
345
- }
346
-
347
- function mmb_weekly_backup($args) {
348
- global $mmb_core;
349
- return $mmb_core->get_backup_instance()->get_weekly_backup($args);
350
- }
351
-
352
- function mmb_geet_last_worker_message($args) {
353
- global $mmb_core;
354
- return $mmb_core->_get_last_worker_message();
355
- }
356
- ?>
1
+ <?php
2
+ /*
3
+ 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.0
8
+ Author URI: http://www.prelovac.com
9
+ */
10
+
11
+ // PHP warnings can break our XML stuffs
12
+ if ($_SERVER['REMOTE_ADDR'] != '127.0.0.1') {
13
+ error_reporting(E_ERROR);
14
+ }
15
+
16
+ define('MMB_WORKER_VERSION', '3.8.0');
17
+
18
+ global $wpdb, $mmb_plugin_dir, $mmb_plugin_url;
19
+
20
+ $mmb_plugin_dir = WP_PLUGIN_DIR . '/' . basename(dirname(__FILE__));
21
+ $mmb_plugin_url = WP_PLUGIN_URL . '/' . basename(dirname(__FILE__));
22
+
23
+ require_once(ABSPATH . 'wp-includes/class-IXR.php');
24
+ require_once("$mmb_plugin_dir/helper.class.php");
25
+ require_once("$mmb_plugin_dir/core.class.php");
26
+ require_once("$mmb_plugin_dir/plugin.class.php");
27
+ require_once("$mmb_plugin_dir/theme.class.php");
28
+ require_once("$mmb_plugin_dir/wp.class.php");
29
+ require_once("$mmb_plugin_dir/post.class.php");
30
+ require_once("$mmb_plugin_dir/stats.class.php");
31
+ require_once("$mmb_plugin_dir/user.class.php");
32
+ require_once("$mmb_plugin_dir/backup.class.php");
33
+
34
+ $mmb_core = new MMB_Core();
35
+ add_action('init', '_mmb_parse_request');
36
+
37
+ if (function_exists('register_activation_hook'))
38
+ register_activation_hook(__FILE__, array($mmb_core, 'install'));
39
+
40
+ if (function_exists('register_deactivation_hook'))
41
+ register_deactivation_hook(__FILE__, array($mmb_core, 'uninstall'));
42
+
43
+ function _mmb_parse_request()
44
+ {
45
+ if (!isset($HTTP_RAW_POST_DATA)) {
46
+ $HTTP_RAW_POST_DATA = file_get_contents('php://input');
47
+ }
48
+ ob_start();
49
+
50
+ global $mmb_core;
51
+ $data = base64_decode($HTTP_RAW_POST_DATA);
52
+ $num = extract(unserialize($data));
53
+
54
+ if ($action) {
55
+ if (!$mmb_core->_check_if_user_exists($params['username']))
56
+ mmb_response('Username <b>'.$params['username'].'</b> does not have administrator capabilities. Enter the correct username in the site options.', false);
57
+
58
+ if ($action == 'add_site') {
59
+ mmb_add_site($params);
60
+ mmb_response('You should never see this.', false);
61
+ }
62
+
63
+ $auth = $mmb_core->_authenticate_message($action . $id, $signature, $id);
64
+ if ($auth === true) {
65
+ $mmb_actions = array(
66
+ 'remove_site' => 'mmb_remove_site',
67
+ 'get_stats' => 'mmb_stats_get',
68
+ 'backup' => 'mmb_backup_now',
69
+ 'restore' => 'mmb_restore_now',
70
+ 'optimize_tables' => 'mmb_optimize_tables',
71
+ 'check_wp_version' => 'mmb_wp_checkversion',
72
+ 'create_post' => 'mmb_post_create',
73
+ 'upgrade_plugins' => 'mmb_upgrade_plugins',
74
+ 'wp_upgrade' => 'mmb_upgrade_wp',
75
+ 'upgrade_themes' => 'mmb_themes_upgrade',
76
+ 'upload_plugin_by_url' => 'mmb_plugin_upload_by_url',
77
+ 'upload_theme_by_url' => 'mmb_theme_upload_by_url',
78
+ 'update_worker' => 'mmb_update_worker_plugin'
79
+ );
80
+ if (array_key_exists($action, $mmb_actions) && function_exists($mmb_actions[$action]))
81
+ call_user_func($mmb_actions[$action], $params);
82
+ else
83
+ mmb_response('Action "' . $action . '" does not exist.', false);
84
+ } else if(array_key_exists('openssl_activated', $auth)){
85
+ mmb_response($auth, true);
86
+ } else {
87
+ mmb_response($auth['error'], false);
88
+ }
89
+ }
90
+
91
+
92
+ ob_end_clean();
93
+ }
94
+
95
+ /* Main response function */
96
+
97
+ function mmb_response($response = false, $success = true)
98
+ {
99
+ $return = array();
100
+
101
+ if (empty($response))
102
+ $return['error'] = 'Empty response';
103
+ else if ($success)
104
+ $return['success'] = $response;
105
+ else
106
+ $return['error'] = $response;
107
+
108
+ header('Content-Type: text/plain');
109
+ exit(PHP_EOL.base64_encode(serialize($return)));
110
+ }
111
+
112
+ function mmb_add_site($params)
113
+ {
114
+ global $mmb_core;
115
+
116
+ $num = extract($params);
117
+
118
+ if ($num) {
119
+ if ( !get_option('_action_message_id') && !get_option('_worker_public_key')) {
120
+ $public_key = base64_decode($public_key) ;
121
+
122
+ if ( function_exists('openssl_verify') ) {
123
+ $verify = openssl_verify($action . $id, base64_decode($signature), $public_key);
124
+ if ($verify == 1) {
125
+ $mmb_core->_set_master_public_key($public_key);
126
+ $mmb_core->_set_worker_message_id($id);
127
+
128
+ mmb_response($mmb_core->get_stats_instance()->get_initial_stats(), true);
129
+ } else if ($verify == 0) {
130
+ mmb_response('Invalid message signature (site is probably managed by another account?)', false);
131
+ } else {
132
+ mmb_response('Command not successful. Please try again.', false);
133
+ }
134
+ } else{
135
+ if ( !get_option('_worker_nossl_key')) {
136
+ $random_key = md5(base64_encode($public_key) . rand(0, getrandmax()));
137
+
138
+ $mmb_core->_set_random_signature($random_key);
139
+ $mmb_core->_set_worker_message_id($id);
140
+ $mmb_core->_set_master_public_key($public_key);
141
+
142
+ mmb_response($mmb_core->get_stats_instance()->get_initial_stats(), true);
143
+ }
144
+ else mmb_response('Site seems to be already managed by another ManageWP account. Either remove the site from that account, or deactivate & activate the ManageWP Worker plugin to reset.', false);
145
+ }
146
+ } else {
147
+ mmb_response('Site seems to be already managed by another ManageWP account. Either remove the site from that account, or deactivate & activate the ManageWP Worker plugin to reset.', false);
148
+ }
149
+ } else {
150
+ mmb_response('Invalid parameters received. Please try again.', false);
151
+ }
152
+ }
153
+
154
+ function mmb_remove_site()
155
+ {
156
+ global $mmb_core;
157
+ $mmb_core->uninstall();
158
+ mmb_response('ManageWP Worker data successfully removed.', true);
159
+ }
160
+
161
+
162
+ function mmb_stats_get($params)
163
+ {
164
+ global $mmb_core;
165
+ mmb_response($mmb_core->get_stats_instance()->get($params), true);
166
+ }
167
+
168
+
169
+ //Plugins
170
+
171
+ function mmb_upgrade_plugins($params)
172
+ {
173
+ global $mmb_core;
174
+ mmb_response($mmb_core->get_plugin_instance()->upgrade_all($params), true);
175
+ }
176
+
177
+ function mmb_plugin_upload_by_url($params)
178
+ {
179
+ global $mmb_core;
180
+ $return = $mmb_core->get_plugin_instance()->upload_by_url($params);
181
+
182
+
183
+ mmb_response($return['message'],$return['bool'] );
184
+
185
+ }
186
+
187
+ //Themes
188
+ function mmb_theme_upload_by_url($params)
189
+ {
190
+ global $mmb_core;
191
+ $return = $mmb_core->get_theme_instance()->upload_theme_by_url($params);
192
+ mmb_response($return['message'],$return['bool'] );
193
+ }
194
+
195
+ function mmb_themes_upgrade($params)
196
+ {
197
+ global $mmb_core;
198
+ mmb_response($mmb_core->get_theme_instance()->upgrade_all($params), true);
199
+ }
200
+
201
+
202
+ //wp
203
+
204
+ function mmb_upgrade_wp($params)
205
+ {
206
+ global $mmb_core;
207
+ mmb_response($mmb_core->get_wp_instance()->upgrade());
208
+ }
209
+
210
+ //post
211
+ function mmb_post_create($params)
212
+ {
213
+ global $mmb_core;
214
+ $return = $mmb_core->get_post_instance()->create($params);
215
+ if (is_int($return))
216
+ mmb_response($return, true);
217
+ else
218
+ mmb_response($return, false);
219
+ }
220
+
221
+ //backup
222
+ function mmb_backup_now($params)
223
+ {
224
+ global $mmb_core;
225
+ $return = $mmb_core->get_backup_instance()->backup($params);
226
+
227
+ if (is_array($return) && array_key_exists('error', $return))
228
+ mmb_response($return['error'], false);
229
+ else {
230
+ $mmb_core->_log($return);
231
+ mmb_response($return, true);
232
+ }
233
+
234
+ }
235
+
236
+ function mmb_optimize_tables($params)
237
+ {
238
+ global $mmb_core;
239
+ $return = $mmb_core->get_backup_instance()->optimize_tables();
240
+ if ($return)
241
+ mmb_response($return, true);
242
+ else
243
+ mmb_response(false, false);
244
+ }
245
+
246
+ function mmb_restore_now($params)
247
+ {
248
+ global $mmb_core;
249
+ $return = $mmb_core->get_backup_instance()->restore($params);
250
+ if (is_array($return) && array_key_exists('error', $return))
251
+ mmb_response($return['error'], false);
252
+ else
253
+ mmb_response($return, true);
254
+
255
+ }
256
+
257
+ function mmb_update_worker_plugin($params)
258
+ {
259
+ global $mmb_core;
260
+ mmb_response($mmb_core->update_worker_plugin($params), true);
261
+ }
262
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
mmb.wp.upgrader.php DELETED
@@ -1,1489 +0,0 @@
1
- <?php
2
- /**
3
- * A File upgrader class for WordPress.
4
- *
5
- * This set of classes are designed to be used to upgrade/install a local set of files on the filesystem via the Filesystem Abstraction classes.
6
- *
7
- * @link http://trac.wordpress.org/ticket/7875 consolidate plugin/theme/core upgrade/install functions
8
- *
9
- * @package WordPress
10
- * @subpackage Upgrader
11
- * @since 2.8.0
12
- */
13
-
14
- /**
15
- * WordPress Upgrader class for Upgrading/Installing a local set of files via the Filesystem Abstraction classes from a Zip file.
16
- *
17
- * @TODO More Detailed docs, for methods as well.
18
- *
19
- * @package WordPress
20
- * @subpackage Upgrader
21
- * @since 2.8.0
22
- */
23
- class Mmb_upgrader {
24
- var $strings = array();
25
- var $skin = null;
26
- var $result = array();
27
-
28
- function Mmb_upgrader($skin = null) {
29
- return $this->__construct($skin);
30
- }
31
- function __construct($skin = null) {
32
- if ( null == $skin )
33
- $this->skin = new Mmb_upgrader_Skin();
34
- else
35
- $this->skin = $skin;
36
- }
37
-
38
- function init() {
39
- $this->skin->set_upgrader($this);
40
- $this->generic_strings();
41
- }
42
-
43
- function generic_strings() {
44
- $this->strings['bad_request'] = __('Invalid Data provided.');
45
- $this->strings['fs_unavailable'] = __('Could not access filesystem.');
46
- $this->strings['fs_error'] = __('Filesystem error.');
47
- $this->strings['fs_no_root_dir'] = __('Unable to locate WordPress Root directory.');
48
- $this->strings['fs_no_content_dir'] = __('Unable to locate WordPress Content directory (wp-content).');
49
- $this->strings['fs_no_plugins_dir'] = __('Unable to locate WordPress Plugin directory.');
50
- $this->strings['fs_no_themes_dir'] = __('Unable to locate WordPress Theme directory.');
51
- /* translators: %s: directory name */
52
- $this->strings['fs_no_folder'] = __('Unable to locate needed folder (%s).');
53
-
54
- $this->strings['download_failed'] = __('Download failed.');
55
- $this->strings['installing_package'] = __('Installing the latest version&#8230;');
56
- $this->strings['folder_exists'] = __('Destination folder already exists.');
57
- $this->strings['mkdir_failed'] = __('Could not create directory.');
58
- $this->strings['bad_package'] = __('Incompatible Archive.');
59
-
60
- $this->strings['maintenance_start'] = __('Enabling Maintenance mode&#8230;');
61
- $this->strings['maintenance_end'] = __('Disabling Maintenance mode&#8230;');
62
- }
63
-
64
- function fs_connect( $directories = array() ) {
65
- global $wp_filesystem;
66
-
67
- if ( false === ($credentials = $this->skin->request_filesystem_credentials()) )
68
- return false;
69
-
70
- if ( ! WP_Filesystem($credentials) ) {
71
- $error = true;
72
- if ( is_object($wp_filesystem) && $wp_filesystem->errors->get_error_code() )
73
- $error = $wp_filesystem->errors;
74
- $this->skin->request_filesystem_credentials($error); //Failed to connect, Error and request again
75
- return false;
76
- }
77
-
78
- if ( ! is_object($wp_filesystem) )
79
- return new WP_Error('fs_unavailable', $this->strings['fs_unavailable'] );
80
-
81
- if ( is_wp_error($wp_filesystem->errors) && $wp_filesystem->errors->get_error_code() )
82
- return new WP_Error('fs_error', $this->strings['fs_error'], $wp_filesystem->errors);
83
-
84
- foreach ( (array)$directories as $dir ) {
85
- switch ( $dir ) {
86
- case ABSPATH:
87
- if ( ! $wp_filesystem->abspath() )
88
- return new WP_Error('fs_no_root_dir', $this->strings['fs_no_root_dir']);
89
- break;
90
- case WP_CONTENT_DIR:
91
- if ( ! $wp_filesystem->wp_content_dir() )
92
- return new WP_Error('fs_no_content_dir', $this->strings['fs_no_content_dir']);
93
- break;
94
- case WP_PLUGIN_DIR:
95
- if ( ! $wp_filesystem->wp_plugins_dir() )
96
- return new WP_Error('fs_no_plugins_dir', $this->strings['fs_no_plugins_dir']);
97
- break;
98
- case WP_CONTENT_DIR . '/themes':
99
- if ( ! $wp_filesystem->find_folder(WP_CONTENT_DIR . '/themes') )
100
- return new WP_Error('fs_no_themes_dir', $this->strings['fs_no_themes_dir']);
101
- break;
102
- default:
103
- if ( ! $wp_filesystem->find_folder($dir) )
104
- return new WP_Error('fs_no_folder', sprintf($this->strings['fs_no_folder'], $dir));
105
- break;
106
- }
107
- }
108
- return true;
109
- } //end fs_connect();
110
-
111
- function download_package($package) {
112
-
113
- if ( ! preg_match('!^(http|https|ftp)://!i', $package) && file_exists($package) ) //Local file or remote?
114
- return $package; //must be a local file..
115
-
116
- if ( empty($package) )
117
- return new WP_Error('no_package', $this->strings['no_package']);
118
-
119
- // $this->skin->feedback('downloading_package', $package);
120
-
121
- $download_file = download_url($package);
122
-
123
- if ( is_wp_error($download_file) )
124
- return new WP_Error('download_failed', $this->strings['download_failed'], $download_file->get_error_message());
125
-
126
- return $download_file;
127
- }
128
-
129
- function unpack_package($package, $delete_package = true) {
130
- global $wp_filesystem;
131
-
132
- // $this->skin->feedback('unpack_package');
133
-
134
- $upgrade_folder = $wp_filesystem->wp_content_dir() . 'upgrade/';
135
-
136
- //Clean up contents of upgrade directory beforehand.
137
- $upgrade_files = $wp_filesystem->dirlist($upgrade_folder);
138
- if ( !empty($upgrade_files) ) {
139
- foreach ( $upgrade_files as $file )
140
- $wp_filesystem->delete($upgrade_folder . $file['name'], true);
141
- }
142
-
143
- //We need a working directory
144
- $working_dir = $upgrade_folder . basename($package, '.zip');
145
-
146
- // Clean up working directory
147
- if ( $wp_filesystem->is_dir($working_dir) )
148
- $wp_filesystem->delete($working_dir, true);
149
-
150
- // Unzip package to working directory
151
- $result = unzip_file($package, $working_dir); //TODO optimizations, Copy when Move/Rename would suffice?
152
-
153
- // Once extracted, delete the package if required.
154
- if ( $delete_package )
155
- unlink($package);
156
-
157
- if ( is_wp_error($result) ) {
158
- $wp_filesystem->delete($working_dir, true);
159
- return $result;
160
- }
161
-
162
- return $working_dir;
163
- }
164
-
165
- function install_package($args = array()) {
166
- global $wp_filesystem;
167
- $defaults = array( 'source' => '', 'destination' => '', //Please always pass these
168
- 'clear_destination' => false, 'clear_working' => false,
169
- 'hook_extra' => array());
170
-
171
- $args = wp_parse_args($args, $defaults);
172
- extract($args);
173
-
174
- @set_time_limit( 300 );
175
-
176
- if ( empty($source) || empty($destination) )
177
- return new WP_Error('bad_request', $this->strings['bad_request']);
178
-
179
- // $this->skin->feedback('installing_package');
180
-
181
- $res = apply_filters('upgrader_pre_install', true, $hook_extra);
182
- if ( is_wp_error($res) )
183
- return $res;
184
-
185
- //Retain the Original source and destinations
186
- $remote_source = $source;
187
- $local_destination = $destination;
188
-
189
- $source_files = array_keys( $wp_filesystem->dirlist($remote_source) );
190
- $remote_destination = $wp_filesystem->find_folder($local_destination);
191
-
192
- //Locate which directory to copy to the new folder, This is based on the actual folder holding the files.
193
- if ( 1 == count($source_files) && $wp_filesystem->is_dir( trailingslashit($source) . $source_files[0] . '/') ) //Only one folder? Then we want its contents.
194
- $source = trailingslashit($source) . trailingslashit($source_files[0]);
195
- elseif ( count($source_files) == 0 )
196
- return new WP_Error('bad_package', $this->strings['bad_package']); //There are no files?
197
- //else //Its only a single file, The upgrader will use the foldername of this file as the destination folder. foldername is based on zip filename.
198
-
199
- //Hook ability to change the source file location..
200
- $source = apply_filters('upgrader_source_selection', $source, $remote_source, $this);
201
- if ( is_wp_error($source) )
202
- return $source;
203
-
204
- //Has the source location changed? If so, we need a new source_files list.
205
- if ( $source !== $remote_source )
206
- $source_files = array_keys( $wp_filesystem->dirlist($source) );
207
-
208
- //Protection against deleting files in any important base directories.
209
- if ( in_array( $destination, array(ABSPATH, WP_CONTENT_DIR, WP_PLUGIN_DIR, WP_CONTENT_DIR . '/themes') ) ) {
210
- $remote_destination = trailingslashit($remote_destination) . trailingslashit(basename($source));
211
- $destination = trailingslashit($destination) . trailingslashit(basename($source));
212
- }
213
-
214
- if ( $wp_filesystem->exists($remote_destination) ) {
215
- if ( $clear_destination ) {
216
- //We're going to clear the destination if theres something there
217
- // $this->skin->feedback('remove_old');
218
- $removed = $wp_filesystem->delete($remote_destination, true);
219
- $removed = apply_filters('upgrader_clear_destination', $removed, $local_destination, $remote_destination, $hook_extra);
220
-
221
- if ( is_wp_error($removed) )
222
- return $removed;
223
- else if ( ! $removed )
224
- return new WP_Error('remove_old_failed', $this->strings['remove_old_failed']);
225
- } else {
226
- //If we're not clearing the destination folder and something exists there allready, Bail.
227
- //But first check to see if there are actually any files in the folder.
228
- $_files = $wp_filesystem->dirlist($remote_destination);
229
- if ( ! empty($_files) ) {
230
- $wp_filesystem->delete($remote_source, true); //Clear out the source files.
231
- return new WP_Error('folder_exists', $this->strings['folder_exists'], $remote_destination );
232
- }
233
- }
234
- }
235
-
236
- //Create destination if needed
237
- if ( !$wp_filesystem->exists($remote_destination) )
238
- if ( !$wp_filesystem->mkdir($remote_destination, FS_CHMOD_DIR) )
239
- return new WP_Error('mkdir_failed', $this->strings['mkdir_failed'], $remote_destination);
240
-
241
- // Copy new version of item into place.
242
- $result = copy_dir($source, $remote_destination);
243
- if ( is_wp_error($result) ) {
244
- if ( $clear_working )
245
- $wp_filesystem->delete($remote_source, true);
246
- return $result;
247
- }
248
-
249
- //Clear the Working folder?
250
- if ( $clear_working )
251
- $wp_filesystem->delete($remote_source, true);
252
-
253
- $destination_name = basename( str_replace($local_destination, '', $destination) );
254
- if ( '.' == $destination_name )
255
- $destination_name = '';
256
-
257
- $this->result = compact('local_source', 'source', 'source_name', 'source_files', 'destination', 'destination_name', 'local_destination', 'remote_destination', 'clear_destination', 'delete_source_dir');
258
-
259
- $res = apply_filters('upgrader_post_install', true, $hook_extra, $this->result);
260
- if ( is_wp_error($res) ) {
261
- $this->result = $res;
262
- return $res;
263
- }
264
-
265
- //Bombard the calling function will all the info which we've just used.
266
- return $this->result;
267
- }
268
-
269
- function run($options) {
270
-
271
- $defaults = array( 'package' => '', //Please always pass this.
272
- 'destination' => '', //And this
273
- 'clear_destination' => false,
274
- 'clear_working' => true,
275
- 'is_multi' => false,
276
- 'hook_extra' => array() //Pass any extra $hook_extra args here, this will be passed to any hooked filters.
277
- );
278
-
279
- $options = wp_parse_args($options, $defaults);
280
- extract($options);
281
-
282
- //Connect to the Filesystem first.
283
- $res = $this->fs_connect( array(WP_CONTENT_DIR, $destination) );
284
- if ( ! $res ) //Mainly for non-connected filesystem.
285
- return false;
286
-
287
- if ( is_wp_error($res) ) {
288
- $this->skin->error($res);
289
- return $res;
290
- }
291
-
292
- if ( !$is_multi ) // call $this->header separately if running multiple times
293
- $this->skin->header();
294
-
295
- $this->skin->before();
296
-
297
- //Download the package (Note, This just returns the filename of the file if the package is a local file)
298
- $download = $this->download_package( $package );
299
- if ( is_wp_error($download) ) {
300
- $this->skin->error($download);
301
- $this->skin->after();
302
- return $download;
303
- }
304
-
305
- //Unzip's the file into a temporary directory
306
- $working_dir = $this->unpack_package( $download );
307
- if ( is_wp_error($working_dir) ) {
308
- $this->skin->error($working_dir);
309
- $this->skin->after();
310
- return $working_dir;
311
- }
312
-
313
- //With the given options, this installs it to the destination directory.
314
- $result = $this->install_package( array(
315
- 'source' => $working_dir,
316
- 'destination' => $destination,
317
- 'clear_destination' => $clear_destination,
318
- 'clear_working' => $clear_working,
319
- 'hook_extra' => $hook_extra
320
- ) );
321
- $this->skin->set_result($result);
322
- if ( is_wp_error($result) ) {
323
- $this->skin->error($result);
324
- // $this->skin->feedback('process_failed');
325
- } else {
326
- //Install Suceeded
327
- // $this->skin->feedback('process_success');
328
- }
329
- $this->skin->after();
330
-
331
- if ( !$is_multi )
332
- $this->skin->footer();
333
-
334
- return $result;
335
- }
336
-
337
- function maintenance_mode($enable = false) {
338
- global $wp_filesystem;
339
- $file = $wp_filesystem->abspath() . '.maintenance';
340
- if ( $enable ) {
341
- // $this->skin->feedback('maintenance_start');
342
- // Create maintenance file to signal that we are upgrading
343
- $maintenance_string = '<?php $upgrading = ' . time() . '; ?>';
344
- $wp_filesystem->delete($file);
345
- $wp_filesystem->put_contents($file, $maintenance_string, FS_CHMOD_FILE);
346
- } else if ( !$enable && $wp_filesystem->exists($file) ) {
347
- // $this->skin->feedback('maintenance_end');
348
- $wp_filesystem->delete($file);
349
- }
350
- }
351
-
352
- function mmb_get_transient($option_name) {
353
-
354
- if(trim($option_name) == ''){
355
- return FALSE;
356
- }
357
-
358
- global $wp_version;
359
-
360
- if (version_compare($wp_version, '2.8', '<'))
361
- return get_option($option_name);
362
-
363
- else if (version_compare($wp_version, '3.0', '<'))
364
- return get_transient($option_name);
365
-
366
- else
367
- return get_site_transient($option_name);
368
- }
369
-
370
- function mmb_delete_transient($option_name) {
371
- if(trim($option_name) == ''){
372
- return FALSE;
373
- }
374
-
375
- global $wp_version;
376
-
377
- if (version_compare($wp_version, '2.8', '<'))
378
- return delete_option($option_name);
379
-
380
- else if (version_compare($wp_version, '3.0', '<'))
381
- return get_transient ($option_name);
382
-
383
- else
384
- return delete_site_transient($option_name);
385
- }
386
-
387
- }
388
-
389
- /**
390
- * Plugin Upgrader class for WordPress Plugins, It is designed to upgrade/install plugins from a local zip, remote zip URL, or uploaded zip file.
391
- *
392
- *
393
- * @package WordPress
394
- * @subpackage Upgrader
395
- * @since 2.8.0
396
- */
397
- class Mmb_Plugin_Upgrader extends Mmb_upgrader {
398
-
399
- var $result;
400
- var $bulk = false;
401
- var $show_before = '';
402
-
403
- function upgrade_strings() {
404
- $this->strings['up_to_date'] = __('The plugin is at the latest version.');
405
- $this->strings['no_package'] = __('Upgrade package not available.');
406
- $this->strings['downloading_package'] = __('Downloading update from <span class="code">%s</span>&#8230;');
407
- $this->strings['unpack_package'] = __('Unpacking the update&#8230;');
408
- $this->strings['deactivate_plugin'] = __('Deactivating the plugin&#8230;');
409
- $this->strings['remove_old'] = __('Removing the old version of the plugin&#8230;');
410
- $this->strings['remove_old_failed'] = __('Could not remove the old plugin.');
411
- $this->strings['process_failed'] = __('Plugin upgrade failed.');
412
- $this->strings['process_success'] = __('Plugin upgraded successfully.');
413
- }
414
-
415
- function install_strings() {
416
- $this->strings['no_package'] = __('Install package not available.');
417
- $this->strings['downloading_package'] = __('Downloading install package from <span class="code">%s</span>&#8230;');
418
- $this->strings['unpack_package'] = __('Unpacking the package&#8230;');
419
- $this->strings['installing_package'] = __('Installing the plugin&#8230;');
420
- $this->strings['process_failed'] = __('Plugin install failed.');
421
- $this->strings['process_success'] = __('Plugin installed successfully.');
422
- }
423
-
424
- function install($package) {
425
-
426
- $this->init();
427
- $this->install_strings();
428
-
429
- $this->run(array(
430
- 'package' => $package,
431
- 'destination' => WP_PLUGIN_DIR,
432
- 'clear_destination' => false, //Do not overwrite files.
433
- 'clear_working' => true,
434
- 'hook_extra' => array()
435
- ));
436
-
437
- // Force refresh of plugin update information
438
- //$this->mmb_delete_transient('update_plugins');
439
-
440
- }
441
-
442
- function upgrade($plugin) {
443
-
444
- $this->init();
445
- $this->upgrade_strings();
446
-
447
- $current = $this->mmb_get_transient( 'update_plugins' );
448
- if ( !isset( $current->response[ $plugin ] ) ) {
449
- $this->skin->before();
450
- $this->skin->set_result(false);
451
- $this->skin->error('up_to_date');
452
- $this->skin->after();
453
- return false;
454
- }
455
-
456
- // Get the URL to the zip file
457
- $r = $current->response[ $plugin ];
458
-
459
- add_filter('upgrader_pre_install', array(&$this, 'deactivate_plugin_before_upgrade'), 10, 2);
460
- add_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin'), 10, 4);
461
- //'source_selection' => array(&$this, 'source_selection'), //theres a track ticket to move up the directory for zip's which are made a bit differently, useful for non-.org plugins.
462
-
463
- $this->run(array(
464
- 'package' => $r->package,
465
- 'destination' => WP_PLUGIN_DIR,
466
- 'clear_destination' => true,
467
- 'clear_working' => true,
468
- 'hook_extra' => array(
469
- 'plugin' => $plugin
470
- )
471
- ));
472
-
473
- // Cleanup our hooks, incase something else does a upgrade on this connection.
474
- remove_filter('upgrader_pre_install', array(&$this, 'deactivate_plugin_before_upgrade'));
475
- remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin'));
476
-
477
- if ( ! $this->result || is_wp_error($this->result) )
478
- return $this->result;
479
-
480
- // Force refresh of plugin update information
481
- $this->mmb_delete_transient('update_plugins');
482
- }
483
-
484
- function bulk_upgrade($plugins) {
485
-
486
- $this->init();
487
- $this->bulk = true;
488
- $this->upgrade_strings();
489
-
490
- $current = $this->mmb_get_transient( 'update_plugins' );
491
-
492
- add_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin'), 10, 4);
493
-
494
- $this->skin->header();
495
-
496
- // Connect to the Filesystem first.
497
- $res = $this->fs_connect( array(WP_CONTENT_DIR, WP_PLUGIN_DIR) );
498
- if ( ! $res ) {
499
- $this->skin->footer();
500
- return false;
501
- }
502
-
503
- $this->skin->bulk_header();
504
-
505
- $this->maintenance_mode(true);
506
-
507
- $results = array();
508
-
509
- $this->update_count = count($plugins);
510
- $this->update_current = 0;
511
- foreach ( $plugins as $plugin ) {
512
- $this->update_current++;
513
- $this->skin->plugin_info = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin, false, true);
514
-
515
- if ( !isset( $current->response[ $plugin ] ) ) {
516
- $this->skin->set_result(false);
517
- $this->skin->before();
518
- $this->skin->error('up_to_date');
519
- $this->skin->after();
520
- $results[$plugin] = false;
521
- continue;
522
- }
523
-
524
- // Get the URL to the zip file
525
- $r = $current->response[ $plugin ];
526
-
527
- $this->skin->plugin_active = is_plugin_active($plugin);
528
-
529
- $result = $this->run(array(
530
- 'package' => $r->package,
531
- 'destination' => WP_PLUGIN_DIR,
532
- 'clear_destination' => true,
533
- 'clear_working' => true,
534
- 'is_multi' => true,
535
- 'hook_extra' => array(
536
- 'plugin' => $plugin
537
- )
538
- ));
539
-
540
- $results[$plugin] = $this->result;
541
-
542
- // Prevent credentials auth screen from displaying multiple times
543
- if ( false === $result )
544
- break;
545
- } //end foreach $plugins
546
-
547
- $this->maintenance_mode(false);
548
-
549
- $this->skin->bulk_footer();
550
-
551
- $this->skin->footer();
552
-
553
- // Cleanup our hooks, incase something else does a upgrade on this connection.
554
- remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_plugin'));
555
-
556
- // Force refresh of plugin update information
557
- $this->mmb_delete_transient('update_plugins');
558
-
559
- return $results;
560
- }
561
-
562
- //return plugin info.
563
- function plugin_info() {
564
- if ( ! is_array($this->result) )
565
- return false;
566
- if ( empty($this->result['destination_name']) )
567
- return false;
568
-
569
- $plugin = get_plugins('/' . $this->result['destination_name']); //Ensure to pass with leading slash
570
- if ( empty($plugin) )
571
- return false;
572
-
573
- $pluginfiles = array_keys($plugin); //Assume the requested plugin is the first in the list
574
-
575
- return $this->result['destination_name'] . '/' . $pluginfiles[0];
576
- }
577
-
578
- //Hooked to pre_install
579
- function deactivate_plugin_before_upgrade($return, $plugin) {
580
-
581
- if ( is_wp_error($return) ) //Bypass.
582
- return $return;
583
-
584
- $plugin = isset($plugin['plugin']) ? $plugin['plugin'] : '';
585
- if ( empty($plugin) )
586
- return new WP_Error('bad_request', $this->strings['bad_request']);
587
-
588
- if ( is_plugin_active($plugin) ) {
589
- // $this->skin->feedback('deactivate_plugin');
590
- //Deactivate the plugin silently, Prevent deactivation hooks from running.
591
- deactivate_plugins($plugin, true);
592
- }
593
- }
594
-
595
- //Hooked to upgrade_clear_destination
596
- function delete_old_plugin($removed, $local_destination, $remote_destination, $plugin) {
597
- global $wp_filesystem;
598
-
599
- if ( is_wp_error($removed) )
600
- return $removed; //Pass errors through.
601
-
602
- $plugin = isset($plugin['plugin']) ? $plugin['plugin'] : '';
603
- if ( empty($plugin) )
604
- return new WP_Error('bad_request', $this->strings['bad_request']);
605
-
606
- $plugins_dir = $wp_filesystem->wp_plugins_dir();
607
- $this_plugin_dir = trailingslashit( dirname($plugins_dir . $plugin) );
608
-
609
- if ( ! $wp_filesystem->exists($this_plugin_dir) ) //If its already vanished.
610
- return $removed;
611
-
612
- // If plugin is in its own directory, recursively delete the directory.
613
- if ( strpos($plugin, '/') && $this_plugin_dir != $plugins_dir ) //base check on if plugin includes directory seperator AND that its not the root plugin folder
614
- $deleted = $wp_filesystem->delete($this_plugin_dir, true);
615
- else
616
- $deleted = $wp_filesystem->delete($plugins_dir . $plugin);
617
-
618
- if ( ! $deleted )
619
- return new WP_Error('remove_old_failed', $this->strings['remove_old_failed']);
620
-
621
- return $removed;
622
- }
623
- }
624
-
625
- /**
626
- * Theme Upgrader class for WordPress Themes, It is designed to upgrade/install themes from a local zip, remote zip URL, or uploaded zip file.
627
- *
628
- * @TODO More Detailed docs, for methods as well.
629
- *
630
- * @package WordPress
631
- * @subpackage Upgrader
632
- * @since 2.8.0
633
- */
634
- class Mmb_Theme_Upgrader extends Mmb_upgrader {
635
-
636
- var $result;
637
-
638
- function upgrade_strings() {
639
- $this->strings['up_to_date'] = __('The theme is at the latest version.');
640
- $this->strings['no_package'] = __('Upgrade package not available.');
641
- $this->strings['downloading_package'] = __('Downloading update from <span class="code">%s</span>&#8230;');
642
- $this->strings['unpack_package'] = __('Unpacking the update&#8230;');
643
- $this->strings['remove_old'] = __('Removing the old version of the theme&#8230;');
644
- $this->strings['remove_old_failed'] = __('Could not remove the old theme.');
645
- $this->strings['process_failed'] = __('Theme upgrade failed.');
646
- $this->strings['process_success'] = __('Theme upgraded successfully.');
647
- }
648
-
649
- function install_strings() {
650
- $this->strings['no_package'] = __('Install package not available.');
651
- $this->strings['downloading_package'] = __('Downloading install package from <span class="code">%s</span>&#8230;');
652
- $this->strings['unpack_package'] = __('Unpacking the package&#8230;');
653
- $this->strings['installing_package'] = __('Installing the theme&#8230;');
654
- $this->strings['process_failed'] = __('Theme install failed.');
655
- $this->strings['process_success'] = __('Theme installed successfully.');
656
- }
657
-
658
- function install($package) {
659
-
660
- $this->init();
661
- $this->install_strings();
662
-
663
- $options = array(
664
- 'package' => $package,
665
- 'destination' => WP_CONTENT_DIR . '/themes',
666
- 'clear_destination' => false, //Do not overwrite files.
667
- 'clear_working' => true
668
- );
669
-
670
- $this->run($options);
671
-
672
- if ( ! $this->result || is_wp_error($this->result) )
673
- return $this->result;
674
-
675
- // Force refresh of theme update information
676
- $this->mmb_delete_transient('update_themes');
677
-
678
- if ( empty($result['destination_name']) )
679
- return false;
680
- else
681
- return $result['destination_name'];
682
- }
683
-
684
- function upgrade($theme) {
685
-
686
- $this->init();
687
- $this->upgrade_strings();
688
-
689
- // Is an update available?
690
- $current = $this->mmb_get_transient( 'update_themes' );
691
- if ( !isset( $current->response[ $theme ] ) ) {
692
- $this->skin->before();
693
- $this->skin->set_result(false);
694
- $this->skin->error('up_to_date');
695
- $this->skin->after();
696
- return false;
697
- }
698
-
699
- $r = $current->response[ $theme ];
700
-
701
- add_filter('upgrader_pre_install', array(&$this, 'current_before'), 10, 2);
702
- add_filter('upgrader_post_install', array(&$this, 'current_after'), 10, 2);
703
- add_filter('upgrader_clear_destination', array(&$this, 'delete_old_theme'), 10, 4);
704
-
705
- $options = array(
706
- 'package' => $r['package'],
707
- 'destination' => WP_CONTENT_DIR . '/themes',
708
- 'clear_destination' => true,
709
- 'clear_working' => true,
710
- 'hook_extra' => array(
711
- 'theme' => $theme
712
- )
713
- );
714
-
715
- $this->run($options);
716
-
717
- if ( ! $this->result || is_wp_error($this->result) )
718
- return $this->result;
719
-
720
- // Force refresh of theme update information
721
- $this->mmb_delete_transient('update_themes');
722
-
723
- return true;
724
- }
725
-
726
- function bulk_upgrade($themes) {
727
-
728
- $this->init();
729
- $this->bulk = true;
730
- $this->upgrade_strings();
731
-
732
- $current = $this->mmb_get_transient( 'update_themes' );
733
-
734
- add_filter('upgrader_pre_install', array(&$this, 'current_before'), 10, 2);
735
- add_filter('upgrader_post_install', array(&$this, 'current_after'), 10, 2);
736
- add_filter('upgrader_clear_destination', array(&$this, 'delete_old_theme'), 10, 4);
737
-
738
- $this->skin->header();
739
-
740
- // Connect to the Filesystem first.
741
- $res = $this->fs_connect( array(WP_CONTENT_DIR) );
742
- if ( ! $res ) {
743
- $this->skin->footer();
744
- return false;
745
- }
746
-
747
- $this->skin->bulk_header();
748
-
749
- $this->maintenance_mode(true);
750
-
751
- $results = array();
752
-
753
- $this->update_count = count($themes);
754
- $this->update_current = 0;
755
- foreach ( $themes as $theme ) {
756
- $this->update_current++;
757
-
758
- if ( !isset( $current->response[ $theme ] ) ) {
759
- $this->skin->set_result(false);
760
- $this->skin->before();
761
- $this->skin->error('up_to_date');
762
- $this->skin->after();
763
- $results[$theme] = false;
764
- continue;
765
- }
766
-
767
- $this->skin->theme_info = $this->theme_info($theme);
768
-
769
- // Get the URL to the zip file
770
- $r = $current->response[ $theme ];
771
-
772
- $options = array(
773
- 'package' => $r['package'],
774
- 'destination' => WP_CONTENT_DIR . '/themes',
775
- 'clear_destination' => true,
776
- 'clear_working' => true,
777
- 'hook_extra' => array(
778
- 'theme' => $theme
779
- )
780
- );
781
-
782
- $result = $this->run($options);
783
-
784
- $results[$theme] = $this->result;
785
-
786
- // Prevent credentials auth screen from displaying multiple times
787
- if ( false === $result )
788
- break;
789
- } //end foreach $plugins
790
-
791
- $this->maintenance_mode(false);
792
-
793
- $this->skin->bulk_footer();
794
-
795
- $this->skin->footer();
796
-
797
- // Cleanup our hooks, incase something else does a upgrade on this connection.
798
- remove_filter('upgrader_pre_install', array(&$this, 'current_before'), 10, 2);
799
- remove_filter('upgrader_post_install', array(&$this, 'current_after'), 10, 2);
800
- remove_filter('upgrader_clear_destination', array(&$this, 'delete_old_theme'), 10, 4);
801
-
802
- // Force refresh of theme update information
803
- $this->mmb_delete_transient('update_themes');
804
-
805
- return $results;
806
- }
807
-
808
- function current_before($return, $theme) {
809
-
810
- if ( is_wp_error($return) )
811
- return $return;
812
-
813
- $theme = isset($theme['theme']) ? $theme['theme'] : '';
814
-
815
- if ( $theme != get_stylesheet() ) //If not current
816
- return $return;
817
- //Change to maintainence mode now.
818
- if ( ! $this->bulk )
819
- $this->maintenance_mode(true);
820
-
821
- return $return;
822
- }
823
- function current_after($return, $theme) {
824
- if ( is_wp_error($return) )
825
- return $return;
826
-
827
- $theme = isset($theme['theme']) ? $theme['theme'] : '';
828
-
829
- if ( $theme != get_stylesheet() ) //If not current
830
- return $return;
831
-
832
- //Ensure stylesheet name hasnt changed after the upgrade:
833
- if ( $theme == get_stylesheet() && $theme != $this->result['destination_name'] ) {
834
- $theme_info = $this->theme_info();
835
- $stylesheet = $this->result['destination_name'];
836
- $template = !empty($theme_info['Template']) ? $theme_info['Template'] : $stylesheet;
837
- switch_theme($template, $stylesheet, true);
838
- }
839
-
840
- //Time to remove maintainence mode
841
- if ( ! $this->bulk )
842
- $this->maintenance_mode(false);
843
- return $return;
844
- }
845
-
846
- function delete_old_theme($removed, $local_destination, $remote_destination, $theme) {
847
- global $wp_filesystem;
848
-
849
- $theme = isset($theme['theme']) ? $theme['theme'] : '';
850
-
851
- if ( is_wp_error($removed) || empty($theme) )
852
- return $removed; //Pass errors through.
853
-
854
- $themes_dir = $wp_filesystem->wp_themes_dir();
855
- if ( $wp_filesystem->exists( trailingslashit($themes_dir) . $theme ) )
856
- if ( ! $wp_filesystem->delete( trailingslashit($themes_dir) . $theme, true ) )
857
- return false;
858
- return true;
859
- }
860
-
861
- function theme_info($theme = null) {
862
-
863
- if ( empty($theme) ) {
864
- if ( !empty($this->result['destination_name']) )
865
- $theme = $this->result['destination_name'];
866
- else
867
- return false;
868
- }
869
- return get_theme_data(WP_CONTENT_DIR . '/themes/' . $theme . '/style.css');
870
- }
871
-
872
- }
873
-
874
- /**
875
- * Core Upgrader class for WordPress. It allows for WordPress to upgrade itself in combiantion with the wp-admin/includes/update-core.php file
876
- *
877
- * @TODO More Detailed docs, for methods as well.
878
- *
879
- * @package WordPress
880
- * @subpackage Upgrader
881
- * @since 2.8.0
882
- */
883
- class Mmb_Core_Upgrader extends Mmb_upgrader {
884
-
885
- function upgrade_strings() {
886
- $this->strings['up_to_date'] = __('WordPress is at the latest version.');
887
- $this->strings['no_package'] = __('Upgrade package not available.');
888
- $this->strings['downloading_package'] = __('Downloading update from <span class="code">%s</span>&#8230;');
889
- $this->strings['unpack_package'] = __('Unpacking the update&#8230;');
890
- $this->strings['copy_failed'] = __('Could not copy files.');
891
- }
892
-
893
- function upgrade($current) {
894
- global $wp_filesystem;
895
-
896
- $this->init();
897
- $this->upgrade_strings();
898
-
899
- if ( !empty($feedback) )
900
- add_filter('update_feedback', $feedback);
901
-
902
- // Is an update available?
903
- if ( !isset( $current->response ) || $current->response == 'latest' )
904
- return new WP_Error('up_to_date', $this->strings['up_to_date']);
905
-
906
- $res = $this->fs_connect( array(ABSPATH, WP_CONTENT_DIR) );
907
- if ( is_wp_error($res) )
908
- return $res;
909
-
910
- $wp_dir = trailingslashit($wp_filesystem->abspath());
911
-
912
- $download = $this->download_package( $current->package );
913
- if ( is_wp_error($download) )
914
- return $download;
915
-
916
- $working_dir = $this->unpack_package( $download );
917
- if ( is_wp_error($working_dir) )
918
- return $working_dir;
919
-
920
- // Copy update-core.php from the new version into place.
921
- if ( !$wp_filesystem->copy($working_dir . '/wordpress/wp-admin/includes/update-core.php', $wp_dir . 'wp-admin/includes/update-core.php', true) ) {
922
- $wp_filesystem->delete($working_dir, true);
923
- return new WP_Error('copy_failed', $this->strings['copy_failed']);
924
- }
925
- $wp_filesystem->chmod($wp_dir . 'wp-admin/includes/update-core.php', FS_CHMOD_FILE);
926
-
927
- require(ABSPATH . 'wp-admin/includes/update-core.php');
928
-
929
- return update_core($working_dir, $wp_dir);
930
- }
931
-
932
- }
933
-
934
- /**
935
- * Generic Skin for the WordPress Upgrader classes. This skin is designed to be extended for specific purposes.
936
- *
937
- * @TODO More Detailed docs, for methods as well.
938
- *
939
- * @package WordPress
940
- * @subpackage Upgrader
941
- * @since 2.8.0
942
- */
943
- class Mmb_upgrader_Skin {
944
-
945
- var $upgrader;
946
- var $done_header = false;
947
- var $result = false;
948
-
949
- function Mmb_upgrader_Skin($args = array()) {
950
- return $this->__construct($args);
951
- }
952
- function __construct($args = array()) {
953
- $defaults = array( 'url' => '', 'nonce' => '', 'title' => '', 'context' => false );
954
- $this->options = wp_parse_args($args, $defaults);
955
- }
956
-
957
- function set_upgrader(&$upgrader) {
958
- if ( is_object($upgrader) )
959
- $this->upgrader =& $upgrader;
960
- $this->add_strings();
961
- }
962
-
963
- function add_strings() {
964
- }
965
-
966
- function set_result($result) {
967
- $this->result = $result;
968
- }
969
-
970
- function request_filesystem_credentials($error = false) {
971
- $url = $this->options['url'];
972
- $context = $this->options['context'];
973
- if ( !empty($this->options['nonce']) )
974
- $url = wp_nonce_url($url, $this->options['nonce']);
975
- return request_filesystem_credentials($url, '', $error, $context); //Possible to bring inline, Leaving as is for now.
976
- }
977
-
978
- function header() {
979
- if ( $this->done_header )
980
- return;
981
- $this->done_header = true;
982
- echo '<div class="wrap">';
983
- echo screen_icon();
984
- echo '<h2>' . $this->options['title'] . '</h2>';
985
- }
986
- function footer() {
987
- echo '</div>';
988
- }
989
-
990
- function error($errors) {
991
- if ( ! $this->done_header )
992
- $this->header();
993
- if ( is_string($errors) ) {
994
- // $this->feedback($errors);
995
- } elseif ( is_wp_error($errors) && $errors->get_error_code() ) {
996
- // foreach ( $errors->get_error_messages() as $message ) {
997
- // if ( $errors->get_error_data() )
998
- // $this->feedback($message . ' ' . $errors->get_error_data() );
999
- // else
1000
- // $this->feedback($message);
1001
- // }
1002
- }
1003
- }
1004
-
1005
- function feedback($string) {
1006
- if ( isset( $this->upgrader->strings[$string] ) )
1007
- $string = $this->upgrader->strings[$string];
1008
-
1009
- if ( strpos($string, '%') !== false ) {
1010
- $args = func_get_args();
1011
- $args = array_splice($args, 1);
1012
- if ( !empty($args) )
1013
- $string = vsprintf($string, $args);
1014
- }
1015
- if ( empty($string) )
1016
- return;
1017
- show_message($string);
1018
- }
1019
- function before() {}
1020
- function after() {}
1021
-
1022
- }
1023
-
1024
- /**
1025
- * Plugin Upgrader Skin for WordPress Plugin Upgrades.
1026
- *
1027
- * @TODO More Detailed docs, for methods as well.
1028
- *
1029
- * @package WordPress
1030
- * @subpackage Upgrader
1031
- * @since 2.8.0
1032
- */
1033
- class Mmb_Plugin_Upgrader_Skin extends Mmb_upgrader_Skin {
1034
- var $plugin = '';
1035
- var $plugin_active = false;
1036
- var $plugin_network_active = false;
1037
-
1038
- function Mmb_Plugin_Upgrader_Skin($args = array()) {
1039
- return $this->__construct($args);
1040
- }
1041
-
1042
- function __construct($args = array()) {
1043
- $defaults = array( 'url' => '', 'plugin' => '', 'nonce' => '', 'title' => __('Upgrade Plugin') );
1044
- $args = wp_parse_args($args, $defaults);
1045
-
1046
- $this->plugin = $args['plugin'];
1047
-
1048
- $this->plugin_active = is_plugin_active( $this->plugin );
1049
- $this->plugin_network_active = is_plugin_active_for_network( $this->plugin );
1050
-
1051
- parent::__construct($args);
1052
- }
1053
-
1054
- function after() {
1055
- $this->plugin = $this->upgrader->plugin_info();
1056
- if ( !empty($this->plugin) && !is_wp_error($this->result) && $this->plugin_active ){
1057
- show_message(__('Reactivating the plugin&#8230;'));
1058
- echo '<iframe style="border:0;overflow:hidden" width="100%" height="170px" src="' . wp_nonce_url('update.php?action=activate-plugin&networkwide=' . $this->plugin_network_active . '&plugin=' . $this->plugin, 'activate-plugin_' . $this->plugin) .'"></iframe>';
1059
- }
1060
-
1061
- $update_actions = array(
1062
- 'activate_plugin' => '<a href="' . wp_nonce_url('plugins.php?action=activate&amp;plugin=' . $this->plugin, 'activate-plugin_' . $this->plugin) . '" title="' . esc_attr__('Activate this plugin') . '" target="_parent">' . __('Activate Plugin') . '</a>',
1063
- 'plugins_page' => '<a href="' . admin_url('plugins.php') . '" title="' . esc_attr__('Goto plugins page') . '" target="_parent">' . __('Return to Plugins page') . '</a>'
1064
- );
1065
- if ( $this->plugin_active )
1066
- unset( $update_actions['activate_plugin'] );
1067
- if ( ! $this->result || is_wp_error($this->result) )
1068
- unset( $update_actions['activate_plugin'] );
1069
-
1070
- $update_actions = apply_filters('update_plugin_complete_actions', $update_actions, $this->plugin);
1071
- // if ( ! empty($update_actions) )
1072
- // $this->feedback('<strong>' . __('Actions:') . '</strong> ' . implode(' | ', (array)$update_actions));
1073
- }
1074
-
1075
- function before() {
1076
- if ( $this->upgrader->show_before ) {
1077
- echo $this->upgrader->show_before;
1078
- $this->upgrader->show_before = '';
1079
- }
1080
- }
1081
- }
1082
-
1083
- /**
1084
- * Plugin Upgrader Skin for WordPress Plugin Upgrades.
1085
- *
1086
- * @package WordPress
1087
- * @subpackage Upgrader
1088
- * @since 3.0.0
1089
- */
1090
- class Mmb_Bulk_Upgrader_Skin extends Mmb_upgrader_Skin {
1091
- var $in_loop = false;
1092
- var $error = false;
1093
-
1094
- function Bulk_Upgrader_Skin($args = array()) {
1095
- return $this->__construct($args);
1096
- }
1097
-
1098
- function __construct($args = array()) {
1099
- $defaults = array( 'url' => '', 'nonce' => '' );
1100
- $args = wp_parse_args($args, $defaults);
1101
-
1102
- parent::__construct($args);
1103
- }
1104
-
1105
- function add_strings() {
1106
- $this->upgrader->strings['skin_upgrade_start'] = __('The update process is starting. This process may take awhile on some hosts, so please be patient.');
1107
- $this->upgrader->strings['skin_update_failed_error'] = __('An error occured while updating %1$s: <strong>%2$s</strong>.');
1108
- $this->upgrader->strings['skin_update_failed'] = __('The update of %1$s failed.');
1109
- $this->upgrader->strings['skin_update_successful'] = __('%1$s updated successfully.').' <a onclick="%2$s" href="#" class="hide-if-no-js"><span>'.__('Show Details').'</span><span class="hidden">'.__('Hide Details').'</span>.</a>';
1110
- $this->upgrader->strings['skin_upgrade_end'] = __('All updates have been completed.');
1111
- }
1112
-
1113
- function feedback($string) {
1114
- if ( isset( $this->upgrader->strings[$string] ) )
1115
- $string = $this->upgrader->strings[$string];
1116
-
1117
- if ( strpos($string, '%') !== false ) {
1118
- $args = func_get_args();
1119
- $args = array_splice($args, 1);
1120
- if ( !empty($args) )
1121
- $string = vsprintf($string, $args);
1122
- }
1123
- if ( empty($string) )
1124
- return;
1125
- if ( $this->in_loop )
1126
- echo "$string<br />\n";
1127
- else
1128
- echo "<p>$string</p>\n";
1129
- }
1130
-
1131
- function header() {
1132
- // Nothing, This will be displayed within a iframe.
1133
- }
1134
-
1135
- function footer() {
1136
- // Nothing, This will be displayed within a iframe.
1137
- }
1138
- function error($error) {
1139
- if ( is_string($error) && isset( $this->upgrader->strings[$error] ) )
1140
- $this->error = $this->upgrader->strings[$error];
1141
-
1142
- if ( is_wp_error($error) ) {
1143
- foreach ( $error->get_error_messages() as $emessage ) {
1144
- if ( $error->get_error_data() )
1145
- $messages[] = $emessage . ' ' . $error->get_error_data();
1146
- else
1147
- $messages[] = $emessage;
1148
- }
1149
- $this->error = implode(', ', $messages);
1150
- }
1151
- echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js($this->upgrader->update_current) . '\').hide();</script>';
1152
- }
1153
-
1154
- function bulk_header() {
1155
- // $this->feedback('skin_upgrade_start');
1156
- }
1157
-
1158
- function bulk_footer() {
1159
- // $this->feedback('skin_upgrade_end');
1160
- }
1161
-
1162
- function before($title = '') {
1163
- $this->in_loop = true;
1164
- printf( '<h4>' . $this->upgrader->strings['skin_before_update_header'] . ' <img alt="" src="' . admin_url( 'images/wpspin_light.gif' ) . '" class="hidden waiting-' . $this->upgrader->update_current . '" style="vertical-align:middle;"></h4>', $title, $this->upgrader->update_current, $this->upgrader->update_count);
1165
- echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js($this->upgrader->update_current) . '\').show();</script>';
1166
- echo '<div class="update-messages hide-if-js" id="progress-' . esc_attr($this->upgrader->update_current) . '"><p>';
1167
- $this->flush_output();
1168
- }
1169
-
1170
- function after($title = '') {
1171
- echo '</p></div>';
1172
- if ( $this->error || ! $this->result ) {
1173
- if ( $this->error )
1174
- echo '<div class="error"><p>' . sprintf($this->upgrader->strings['skin_update_failed_error'], $title, $this->error) . '</p></div>';
1175
- else
1176
- echo '<div class="error"><p>' . sprintf($this->upgrader->strings['skin_update_failed'], $title) . '</p></div>';
1177
-
1178
- echo '<script type="text/javascript">jQuery(\'#progress-' . esc_js($this->upgrader->update_current) . '\').show();</script>';
1179
- }
1180
- if ( !empty($this->result) && !is_wp_error($this->result) ) {
1181
- echo '<div class="updated"><p>' . sprintf($this->upgrader->strings['skin_update_successful'], $title, 'jQuery(\'#progress-' . esc_js($this->upgrader->update_current) . '\').toggle();jQuery(\'span\', this).toggle(); return false;') . '</p></div>';
1182
- echo '<script type="text/javascript">jQuery(\'.waiting-' . esc_js($this->upgrader->update_current) . '\').hide();</script>';
1183
- }
1184
-
1185
- $this->reset();
1186
- $this->flush_output();
1187
- }
1188
-
1189
- function reset() {
1190
- $this->in_loop = false;
1191
- $this->error = false;
1192
- }
1193
-
1194
- function flush_output() {
1195
- wp_ob_end_flush_all();
1196
- flush();
1197
- }
1198
- }
1199
-
1200
- class Mmb_Bulk_Plugin_Upgrader_Skin extends Mmb_Bulk_Upgrader_Skin {
1201
- var $plugin_info = array(); // Mmb_Plugin_Upgrader::bulk() will fill this in.
1202
- function Mmb_Plugin_Upgrader_Skin($args = array()) {
1203
- parent::__construct($args);
1204
- }
1205
-
1206
- function add_strings() {
1207
- parent::add_strings();
1208
- $this->upgrader->strings['skin_before_update_header'] = __('Updating Plugin %1$s (%2$d/%3$d)');
1209
- }
1210
-
1211
- function before() {
1212
- parent::before($this->plugin_info['Title']);
1213
- }
1214
-
1215
- function after() {
1216
- parent::after($this->plugin_info['Title']);
1217
- }
1218
- function bulk_footer() {
1219
- parent::bulk_footer();
1220
- $update_actions = array(
1221
- 'plugins_page' => '<a href="' . admin_url('plugins.php') . '" title="' . esc_attr__('Goto plugins page') . '" target="_parent">' . __('Return to Plugins page') . '</a>',
1222
- 'updates_page' => '<a href="' . admin_url('update-core.php') . '" title="' . esc_attr__('Goto WordPress Updates page') . '" target="_parent">' . __('Return to WordPress Updates') . '</a>'
1223
- );
1224
-
1225
- $update_actions = apply_filters('update_bulk_plugins_complete_actions', $update_actions, $this->plugin_info);
1226
- // if ( ! empty($update_actions) )
1227
- // $this->feedback('<strong>' . __('Actions:') . '</strong> ' . implode(' | ', (array)$update_actions));
1228
- }
1229
- }
1230
-
1231
- class Mmb_Bulk_Theme_Upgrader_Skin extends Mmb_Bulk_Upgrader_Skin {
1232
- var $theme_info = array(); // Mmb_Theme_Upgrader::bulk() will fill this in.
1233
- function Mmb_Theme_Upgrader_Skin($args = array()) {
1234
- parent::__construct($args);
1235
- }
1236
-
1237
- function add_strings() {
1238
- parent::add_strings();
1239
- $this->upgrader->strings['skin_before_update_header'] = __('Updating Theme %1$s (%2$d/%3$d)');
1240
- }
1241
-
1242
- function before() {
1243
- parent::before($this->theme_info['Name']);
1244
- }
1245
-
1246
- function after() {
1247
- parent::after($this->theme_info['Name']);
1248
- }
1249
- function bulk_footer() {
1250
- parent::bulk_footer();
1251
- $update_actions = array(
1252
- 'themes_page' => '<a href="' . admin_url('themes.php') . '" title="' . esc_attr__('Goto themes page') . '" target="_parent">' . __('Return to Themes page') . '</a>',
1253
- 'updates_page' => '<a href="' . admin_url('update-core.php') . '" title="' . esc_attr__('Goto WordPress Updates page') . '" target="_parent">' . __('Return to WordPress Updates') . '</a>'
1254
- );
1255
-
1256
- $update_actions = apply_filters('update_bulk_theme_complete_actions', $update_actions, $this->theme_info);
1257
- // if ( ! empty($update_actions) )
1258
- // $this->feedback('<strong>' . __('Actions:') . '</strong> ' . implode(' | ', (array)$update_actions));
1259
- }
1260
- }
1261
-
1262
- /**
1263
- * Plugin Installer Skin for WordPress Plugin Installer.
1264
- *
1265
- * @TODO More Detailed docs, for methods as well.
1266
- *
1267
- * @package WordPress
1268
- * @subpackage Upgrader
1269
- * @since 2.8.0
1270
- */
1271
- class Mmb_Plugin_Installer_Skin extends Mmb_upgrader_Skin {
1272
- var $api;
1273
- var $type;
1274
-
1275
- function Plugin_Installer_Skin($args = array()) {
1276
- return $this->__construct($args);
1277
- }
1278
-
1279
- function __construct($args = array()) {
1280
- $defaults = array( 'type' => 'web', 'url' => '', 'plugin' => '', 'nonce' => '', 'title' => '' );
1281
- $args = wp_parse_args($args, $defaults);
1282
-
1283
- $this->type = $args['type'];
1284
- $this->api = isset($args['api']) ? $args['api'] : array();
1285
-
1286
- parent::__construct($args);
1287
- }
1288
-
1289
- function before() {
1290
- if ( !empty($this->api) )
1291
- $this->upgrader->strings['process_success'] = sprintf( __('Successfully installed the plugin <strong>%s %s</strong>.'), $this->api->name, $this->api->version);
1292
- }
1293
-
1294
- function after() {
1295
-
1296
- $plugin_file = $this->upgrader->plugin_info();
1297
-
1298
- $install_actions = array();
1299
-
1300
- $from = isset($_GET['from']) ? stripslashes($_GET['from']) : 'plugins';
1301
-
1302
- if ( 'import' == $from )
1303
- $install_actions['activate_plugin'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&amp;from=import&amp;plugin=' . $plugin_file, 'activate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Activate this plugin') . '" target="_parent">' . __('Activate Plugin &amp; Run Importer') . '</a>';
1304
- else
1305
- $install_actions['activate_plugin'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&amp;plugin=' . $plugin_file, 'activate-plugin_' . $plugin_file) . '" title="' . esc_attr__('Activate this plugin') . '" target="_parent">' . __('Activate Plugin') . '</a>';
1306
-
1307
- if ( is_multisite() && current_user_can( 'manage_network_plugins' ) )
1308
- $install_actions['network_activate'] = '<a href="' . wp_nonce_url('plugins.php?action=activate&amp;networkwide=1&amp;plugin=' . $plugin_file, 'activate-plugin_' . $plugin_file) . '" title="' . __('Activate this plugin for all sites in this network') . '" target="_parent">' . __('Network Activate') . '</a>';
1309
-
1310
- if ( 'import' == $from )
1311
- $install_actions['importers_page'] = '<a href="' . admin_url('import.php') . '" title="' . esc_attr__('Return to Importers') . '" target="_parent">' . __('Return to Importers') . '</a>';
1312
- else if ( $this->type == 'web' )
1313
- $install_actions['plugins_page'] = '<a href="' . admin_url('plugin-install.php') . '" title="' . esc_attr__('Return to Plugin Installer') . '" target="_parent">' . __('Return to Plugin Installer') . '</a>';
1314
- else
1315
- $install_actions['plugins_page'] = '<a href="' . admin_url('plugins.php') . '" title="' . esc_attr__('Return to Plugins page') . '" target="_parent">' . __('Return to Plugins page') . '</a>';
1316
-
1317
-
1318
- if ( ! $this->result || is_wp_error($this->result) ) {
1319
- unset( $install_actions['activate_plugin'] );
1320
- unset( $install_actions['network_activate'] );
1321
- }
1322
- $install_actions = apply_filters('install_plugin_complete_actions', $install_actions, $this->api, $plugin_file);
1323
- // if ( ! empty($install_actions) )
1324
- // $this->feedback('<strong>' . __('Actions:') . '</strong> ' . implode(' | ', (array)$install_actions));
1325
- }
1326
- }
1327
-
1328
- /**
1329
- * Theme Installer Skin for the WordPress Theme Installer.
1330
- *
1331
- * @TODO More Detailed docs, for methods as well.
1332
- *
1333
- * @package WordPress
1334
- * @subpackage Upgrader
1335
- * @since 2.8.0
1336
- */
1337
- class Mmb_Theme_Installer_Skin extends Mmb_upgrader_Skin {
1338
- var $api;
1339
- var $type;
1340
-
1341
- function Theme_Installer_Skin($args = array()) {
1342
- return $this->__construct($args);
1343
- }
1344
-
1345
- function __construct($args = array()) {
1346
- $defaults = array( 'type' => 'web', 'url' => '', 'theme' => '', 'nonce' => '', 'title' => '' );
1347
- $args = wp_parse_args($args, $defaults);
1348
-
1349
- $this->type = $args['type'];
1350
- $this->api = isset($args['api']) ? $args['api'] : array();
1351
-
1352
- parent::__construct($args);
1353
- }
1354
-
1355
- function before() {
1356
- if ( !empty($this->api) ) {
1357
- /* translators: 1: theme name, 2: version */
1358
- $this->upgrader->strings['process_success'] = sprintf( __('Successfully installed the theme <strong>%1$s %2$s</strong>.'), $this->api->name, $this->api->version);
1359
- }
1360
- }
1361
-
1362
- function after() {
1363
- if ( empty($this->upgrader->result['destination_name']) )
1364
- return;
1365
-
1366
- $theme_info = $this->upgrader->theme_info();
1367
- if ( empty($theme_info) )
1368
- return;
1369
- $name = $theme_info['Name'];
1370
- $stylesheet = $this->upgrader->result['destination_name'];
1371
- $template = !empty($theme_info['Template']) ? $theme_info['Template'] : $stylesheet;
1372
-
1373
- $preview_link = htmlspecialchars( add_query_arg( array('preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), trailingslashit(esc_url(get_option('home'))) ) );
1374
- $activate_link = wp_nonce_url("themes.php?action=activate&amp;template=" . urlencode($template) . "&amp;stylesheet=" . urlencode($stylesheet), 'switch-theme_' . $template);
1375
-
1376
- $install_actions = array(
1377
- 'preview' => '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr(sprintf(__('Preview &#8220;%s&#8221;'), $name)) . '">' . __('Preview') . '</a>',
1378
- 'activate' => '<a href="' . $activate_link . '" class="activatelink" title="' . esc_attr( sprintf( __('Activate &#8220;%s&#8221;'), $name ) ) . '">' . __('Activate') . '</a>'
1379
- );
1380
-
1381
- if ( $this->type == 'web' )
1382
- $install_actions['themes_page'] = '<a href="' . admin_url('theme-install.php') . '" title="' . esc_attr__('Return to Theme Installer') . '" target="_parent">' . __('Return to Theme Installer') . '</a>';
1383
- else
1384
- $install_actions['themes_page'] = '<a href="' . admin_url('themes.php') . '" title="' . esc_attr__('Themes page') . '" target="_parent">' . __('Return to Themes page') . '</a>';
1385
-
1386
- if ( ! $this->result || is_wp_error($this->result) )
1387
- unset( $install_actions['activate'], $install_actions['preview'] );
1388
-
1389
- $install_actions = apply_filters('install_theme_complete_actions', $install_actions, $this->api, $stylesheet, $theme_info);
1390
- // if ( ! empty($install_actions) )
1391
- // $this->feedback('<strong>' . __('Actions:') . '</strong> ' . implode(' | ', (array)$install_actions));
1392
- }
1393
- }
1394
-
1395
- /**
1396
- * Theme Upgrader Skin for WordPress Theme Upgrades.
1397
- *
1398
- * @TODO More Detailed docs, for methods as well.
1399
- *
1400
- * @package WordPress
1401
- * @subpackage Upgrader
1402
- * @since 2.8.0
1403
- */
1404
- class Mmb_Theme_Upgrader_Skin extends Mmb_upgrader_Skin {
1405
- var $theme = '';
1406
-
1407
- function Mmb_Theme_Upgrader_Skin($args = array()) {
1408
- return $this->__construct($args);
1409
- }
1410
-
1411
- function __construct($args = array()) {
1412
- $defaults = array( 'url' => '', 'theme' => '', 'nonce' => '', 'title' => __('Upgrade Theme') );
1413
- $args = wp_parse_args($args, $defaults);
1414
-
1415
- $this->theme = $args['theme'];
1416
-
1417
- parent::__construct($args);
1418
- }
1419
-
1420
- function after() {
1421
-
1422
- $update_actions = array();
1423
- if ( !empty($this->upgrader->result['destination_name']) &&
1424
- ($theme_info = $this->upgrader->theme_info()) &&
1425
- !empty($theme_info) ) {
1426
-
1427
- $name = $theme_info['Name'];
1428
- $stylesheet = $this->upgrader->result['destination_name'];
1429
- $template = !empty($theme_info['Template']) ? $theme_info['Template'] : $stylesheet;
1430
-
1431
- $preview_link = htmlspecialchars( add_query_arg( array('preview' => 1, 'template' => $template, 'stylesheet' => $stylesheet, 'TB_iframe' => 'true' ), trailingslashit(esc_url(get_option('home'))) ) );
1432
- $activate_link = wp_nonce_url("themes.php?action=activate&amp;template=" . urlencode($template) . "&amp;stylesheet=" . urlencode($stylesheet), 'switch-theme_' . $template);
1433
-
1434
- $update_actions['preview'] = '<a href="' . $preview_link . '" class="thickbox thickbox-preview" title="' . esc_attr(sprintf(__('Preview &#8220;%s&#8221;'), $name)) . '">' . __('Preview') . '</a>';
1435
- $update_actions['activate'] = '<a href="' . $activate_link . '" class="activatelink" title="' . esc_attr( sprintf( __('Activate &#8220;%s&#8221;'), $name ) ) . '">' . __('Activate') . '</a>';
1436
-
1437
- if ( ( ! $this->result || is_wp_error($this->result) ) || $stylesheet == get_stylesheet() )
1438
- unset($update_actions['preview'], $update_actions['activate']);
1439
- }
1440
-
1441
- $update_actions['themes_page'] = '<a href="' . admin_url('themes.php') . '" title="' . esc_attr__('Return to Themes page') . '" target="_parent">' . __('Return to Themes page') . '</a>';
1442
-
1443
- $update_actions = apply_filters('update_theme_complete_actions', $update_actions, $this->theme);
1444
- // if ( ! empty($update_actions) )
1445
- // $this->feedback('<strong>' . __('Actions:') . '</strong> ' . implode(' | ', (array)$update_actions));
1446
- }
1447
- }
1448
-
1449
- /**
1450
- * Upgrade Skin helper for File uploads. This class handles the upload process and passes it as if its a local file to the Upgrade/Installer functions.
1451
- *
1452
- * @TODO More Detailed docs, for methods as well.
1453
- *
1454
- * @package WordPress
1455
- * @subpackage Upgrader
1456
- * @since 2.8.0
1457
- */
1458
- class Mmb_File_Upload_Upgrader {
1459
- var $package;
1460
- var $filename;
1461
-
1462
- function File_Upload_Upgrader($form, $urlholder) {
1463
- return $this->__construct($form, $urlholder);
1464
- }
1465
- function __construct($form, $urlholder) {
1466
- if ( ! ( ( $uploads = wp_upload_dir() ) && false === $uploads['error'] ) )
1467
- wp_die($uploads['error']);
1468
-
1469
- if ( empty($_FILES[$form]['name']) && empty($_GET[$urlholder]) )
1470
- wp_die(__('Please select a file'));
1471
-
1472
- if ( !empty($_FILES) )
1473
- $this->filename = $_FILES[$form]['name'];
1474
- else if ( isset($_GET[$urlholder]) )
1475
- $this->filename = $_GET[$urlholder];
1476
-
1477
- //Handle a newly uploaded file, Else assume its already been uploaded
1478
- if ( !empty($_FILES) ) {
1479
- $this->filename = wp_unique_filename( $uploads['basedir'], $this->filename );
1480
- $this->package = $uploads['basedir'] . '/' . $this->filename;
1481
-
1482
- // Move the file to the uploads dir
1483
- if ( false === @ move_uploaded_file( $_FILES[$form]['tmp_name'], $this->package) )
1484
- wp_die( sprintf( __('The uploaded file could not be moved to %s.' ), $uploads['path']));
1485
- } else {
1486
- $this->package = $uploads['basedir'] . '/' . $this->filename;
1487
- }
1488
- }
1489
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
page.class.php DELETED
@@ -1,259 +0,0 @@
1
- <?php
2
-
3
- class Mmb_Page extends Mmb_Core
4
- {
5
- function __construct()
6
- {
7
- parent::__construct();
8
- }
9
-
10
- /*************************************************************
11
- * FACADE functions
12
- * (functions to be called after a remote XMLRPC from Master)
13
- **************************************************************/
14
- function get_edit_data($args)
15
- {
16
- $this->_escape($args);
17
- $username = $args[0];
18
- $password = $args[1];
19
- $page_id = $args[2];
20
-
21
- if (!$user = $this->login($username, $password))
22
- {
23
- return $this->error;
24
- }
25
-
26
- if (!current_user_can('edit_page', $page_id))
27
- return new IXR_Error(401, 'You are not allowed to edit this page.');
28
-
29
- $tmp_pages = get_pages("exclude=$page_id");
30
-
31
-
32
- // trim off redundant data
33
- $parents = array();
34
- foreach ($tmp_pages as $tmp_page)
35
- {
36
- $parents[] = array(
37
- 'ID' => $tmp_page->ID,
38
- 'title' => $tmp_page->post_title,
39
- );
40
- }
41
-
42
- $page = get_page($page_id, OBJECT, 'edit');
43
- // $this->_log($page);
44
-
45
- $tmp_custom = get_post_custom($page_id);
46
- $custom = array();
47
- if(is_array($tmp_custom))
48
- foreach ($tmp_custom as $key => $value_array){
49
- if ('_wp_page_template' == $key)
50
- {
51
- // the page template! important!!!
52
- $page->template = $value_array[0];
53
- }
54
-
55
- if ('_' == $key[0]) continue;
56
- foreach ($value_array as $value)
57
- {
58
- $custom[$key][] = base64_encode($value); // keep the new lines
59
- }
60
- }
61
-
62
-
63
- // encode the page content and excerpt to keep the new lines
64
- // as they would be trimmed off during XMLRPC
65
- $page->post_content = base64_encode($page->post_content);
66
- $page->post_excerpt = base64_encode($page->post_excerpt);
67
-
68
- // visibility
69
- if ('private' == $page->post_status)
70
- {
71
- $page->post_password = '';
72
- $page->visibility = 'private';
73
- }
74
- elseif (!empty($page->post_password))
75
- {
76
- $page->visibility = 'password';
77
- }
78
- else
79
- {
80
- $page->visibility = 'public';
81
- }
82
-
83
- $templates = get_page_templates();
84
- if (empty($templates)) $templates = array();
85
-
86
- return array(
87
- 'page' => $page,
88
- 'parents' => $parents,
89
- 'custom_fields' => $custom,
90
- 'templates' => $templates,
91
- );
92
- }
93
-
94
- /**
95
- * Gets necessary local data for page creation
96
- *
97
- * @param mixed $args
98
- * @return IXR_Error
99
- */
100
- function get_new_data($args)
101
- {
102
- $this->_escape($args);
103
- $username = $args[0];
104
- $password = $args[1];
105
-
106
- if (!$user = $this->login($username, $password))
107
- {
108
- return $this->error;
109
- }
110
-
111
- if (!current_user_can('edit_pages'))
112
- return new IXR_Error(401, 'You are not allowed to create a new page.');
113
-
114
- $parents = array();
115
- foreach ((array)get_pages() as $tmp_page)
116
- {
117
- $parents[] = array(
118
- 'ID' => $tmp_page->ID,
119
- 'title' => $tmp_page->post_title,
120
- );
121
- }
122
-
123
- $templates = get_page_templates();
124
- if (empty($templates)) $templates = array();
125
-
126
- $page = get_default_page_to_edit();
127
-
128
- // some modifications to the default WordPress data
129
- $page->post_date = date('Y-m-d H:i:s');
130
- $page->post_status = 'publish';
131
-
132
- return array(
133
- 'page' => $page,
134
- 'parents' => $parents,
135
- 'custom_fields' => array(), // default is an empty array
136
- 'templates' => $templates,
137
- );
138
- }
139
-
140
- /**
141
- * Locally updates a page
142
- *
143
- * @param mixed $args
144
- */
145
- function update($args)
146
- {
147
- $this->_escape($args);
148
- $username = $args[0];
149
- $password = $args[1];
150
- $page_data = unserialize(base64_decode($args[2]));
151
-
152
- if (!$user = $this->login($username, $password))
153
- {
154
- return $this->error;
155
- }
156
-
157
- if (!current_user_can('edit_page', $page_data['post_ID']))
158
- return new IXR_Error(401, 'You are not allowed to edit this page.');
159
-
160
- // wp_update_post needs ID key
161
- $page_data['ID'] = $page_data['post_ID'];
162
-
163
- // wrap the function inside an output buffer to prevent errors from printed
164
- ob_start();
165
- $custom_fields = get_post_custom($page_data['ID']);
166
- foreach ($custom_fields as $key => $value)
167
- {
168
- delete_post_meta($page_data['ID'], $key);
169
- }
170
-
171
- $result = edit_post($page_data);
172
- foreach ($page_data['meta'] as $id => $meta)
173
- {
174
- add_post_meta($page_data['ID'], $meta['key'], $meta['value']);
175
- }
176
- ob_end_clean();
177
-
178
- if ($result)
179
- {
180
- return 'Success';
181
- }
182
-
183
- return new IXR_Error(401, 'Failed to update the page.');
184
- }
185
-
186
- /**
187
- * Locally creates a page
188
- *
189
- * @param mixed $args
190
- */
191
- function create($args)
192
- {
193
- $this->_escape($args);
194
- $username = $args[0];
195
- $password = $args[1];
196
-
197
- if (!$user = $this->login($username, $password))
198
- {
199
- return $this->error;
200
- }
201
-
202
- if (!current_user_can('edit_pages'))
203
- return new IXR_Error(401, 'You are not allowed to create a new page.');
204
-
205
- $page_struct = unserialize(base64_decode($args[2]));
206
- $page_data = $page_struct['post_data'];
207
- $page_meta = $page_struct['post_extras']['post_meta'];
208
-
209
- //create post
210
- $page_id = wp_insert_post($page_data);
211
- if($page_id){
212
- //get current custom fields
213
- $cur_custom = get_post_custom($page_id);
214
- //check which values doesnot exists in new custom fields
215
- $diff_values = array_diff_key($cur_custom, $page_meta);
216
- if(is_array($diff_values))
217
- foreach ($diff_values as $meta_key => $value) {
218
- delete_post_meta($page_id, $meta_key);
219
- }
220
-
221
- //insert new post meta
222
- foreach($page_meta as $key => $value){
223
- if(strpos($key, '_mmb') === 0 || strpos($key, '_edit') === 0)
224
- continue;
225
- update_post_meta($page_id, $key, $value[0]);
226
- }
227
- }
228
- return $page_id;
229
-
230
-
231
-
232
- // wrap the function inside an output buffer to prevent errors from printed
233
- // ob_start();
234
- // $_POST = $page_data;
235
- // $post_ID = wp_write_post(); // this function gets data from $_POST
236
- // if (is_wp_error($post_ID))
237
- // {
238
- // return new IXR_Error(401, 'Failed to create the page. ' . $result->get_error_message());
239
- // }
240
- //
241
- // if (empty($post_ID))
242
- // {
243
- // return new IXR_Error(401, 'Failed to create the page: Unknown error.');
244
- // }
245
- //
246
- // foreach ($page_data['meta'] as $id => $meta)
247
- // {
248
- // add_post_meta($post_ID, $meta['key'], $meta['value']);
249
- // }
250
- // ob_end_clean();
251
- //
252
- // if ($post_ID)
253
- // {
254
- // return 'Success';
255
- // }
256
- //
257
- // return new IXR_Error(401, 'Failed to create the page.');
258
- }
259
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
plugin.class.php CHANGED
@@ -1,489 +1,131 @@
1
  <?php
2
 
3
- class Mmb_Plugin extends Mmb_Core
4
- {
5
- var $worker_maitanance_mode = false;
6
  function __construct()
7
  {
8
  parent::__construct();
9
  }
10
 
11
- /*************************************************************
12
- * FACADE functions
13
- * (functions to be called after a remote XMLRPC from Master)
14
- **************************************************************/
15
-
16
- function get_list($args)
17
- {
18
- $this->_escape($args);
19
- $username = $args[0];
20
- $password = $args[1];
21
-
22
- if (!$user = $this->login($username, $password))
23
- {
24
- return $this->error;
25
- }
26
-
27
- if(!current_user_can('activate_plugins'))
28
- return new IXR_Error(401, 'Sorry, you cannot manage plugins on the remote blog.');
29
-
30
- $this->refresh_transient();
31
-
32
- $all_plugins = get_plugins();
33
-
34
- // we don't allow managing our own plugin this way
35
- // better force the user to directly manage it!
36
- global $mmb_plugin_dir;
37
- $worker_plug = basename($mmb_plugin_dir).'/init.php';
38
- unset($all_plugins[$worker_plug]);
39
-
40
- // $current = get_transient('update_plugins');
41
- $current = $this->mmb_get_transient('update_plugins');
42
-
43
- foreach ((array)$all_plugins as $plugin_file => $plugin_data)
44
- {
45
- //Translate, Apply Markup, Sanitize HTML
46
- $plugin_data = _get_plugin_data_markup_translate($plugin_file, $plugin_data, false, true);
47
- $all_plugins[$plugin_file] = $plugin_data;
48
-
49
- //Filter into individual sections
50
- if (is_plugin_active($plugin_file))
51
- {
52
- $all_plugins[$plugin_file]['status'] = 'active';
53
- $active_plugins[$plugin_file] = $plugin_data;
54
- }
55
- else
56
- {
57
- $all_plugins[$plugin_file]['status'] = 'inactive';
58
- $inactive_plugins[$plugin_file] = $plugin_data;
59
- }
60
-
61
- if (isset($current->response[$plugin_file]))
62
- {
63
- $all_plugins[$plugin_file]['new_version'] = $current->response[$plugin_file];
64
- }
65
- }
66
-
67
- return $all_plugins;
68
- }
69
-
70
- /**
71
- * Deactivates a plugin locally
72
- *
73
- * @param mixed $args
74
- */
75
- function deactivate($args)
76
- {
77
- $this->_escape($args);
78
- $username = $args[0];
79
- $password = $args[1];
80
- $plugin_files = $args[2];
81
-
82
- if (!$user = $this->login($username, $password))
83
- {
84
- return $this->error;
85
- }
86
-
87
- if(!current_user_can('activate_plugins'))
88
- {
89
- return new IXR_Error(401, 'Sorry, you are not allowed to deactivate plugins on the remote blog.');
90
- }
91
-
92
- $this->refresh_transient();
93
-
94
- $success = deactivate_plugins($plugin_files);
95
- if(is_wp_error($success))
96
- return false;
97
- chdir(WP_PLUGIN_DIR);
98
-
99
- if(is_array($plugin_files)) return true;
100
- // get the plugin again
101
- return $this->_get_plugin_data($plugin_files);
102
- }
103
-
104
- /**
105
- * Activates a plugin locally
106
- *
107
- * @param mixed $args
108
- */
109
- function activate($args)
110
- {
111
- $this->_escape($args);
112
- $username = $args[0];
113
- $password = $args[1];
114
- $plugin_files = $args[2];
115
- if (!$user = $this->login($username, $password))
116
- {
117
- return $this->error;
118
- }
119
-
120
- if(!current_user_can('activate_plugins'))
121
- {
122
- return new IXR_Error( 401, 'Sorry, you are not allowed to manage plugins on the remote blog.');
123
- }
124
-
125
- $this->refresh_transient();
126
- //@lk test
127
- // $this->_log($plugin_file);
128
- // ob_start();
129
- // var_dump($plugin_file);
130
- // $lk_data = ob_get_clean();
131
- // file_put_contents('testlog.txt', $lk_data);
132
- $success = activate_plugins($plugin_files, '', FALSE);
133
- if(is_wp_error($success))
134
- return false;
135
- chdir(WP_PLUGIN_DIR);
136
-
137
- if(is_array($plugin_files)) return true;
138
- // get the plugin again
139
- return $this->_get_plugin_data($plugin_files);
140
- }
141
 
142
  /**
143
- * Upgrades a plugin locally
144
- *
145
- * @param mixed $args
146
- */
147
- function upgrade($args, $login_required = TRUE, $reget_plugin_data = TRUE)
148
- {
149
- $this->_escape($args);
150
- $username = $args[0];
151
- $password = $args[1];
152
- $plugin_file = $args[2];
153
-
154
- if ($login_required && !$user = $this->login($username, $password))
155
- {
156
- return $this->error;
157
- }
158
-
159
- if(!current_user_can('activate_plugins'))
160
- {
161
- return new IXR_Error(401, 'Sorry, you are not allowed to upgrade plugins on the remote blog.');
162
- }
163
-
164
- // $current = get_transient('update_plugins');
165
- $current = $this->mmb_get_transient('update_plugins');
166
- // $this->_log($current);
167
- // keep track of plugin active status
168
- $needs_reactivaton = is_plugin_active($plugin_file);
169
-
170
- // the Plugin upgrader will echo some HTML on its own
171
- // so we wrap it into some output buffering to avoid
172
- // breaking the XML response
173
- ob_start();
174
- // include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
175
-
176
- $upgrader = new Mmb_Plugin_Upgrader();
177
- $result = $upgrader->upgrade($plugin_file);
178
- // $this->_log($result);
179
-
180
- // $this->_log($output);
181
-
182
- if (is_wp_error($result))
183
- {
184
- return new IXR_Error(401, 'Sorry, this plugin could not be upgraded. ' . $result->get_error_message());
185
- }
186
-
187
- // remember to reactivate the plugin if needed
188
- if($needs_reactivaton)
189
- {
190
- activate_plugin($plugin_file);
191
- }
192
-
193
- unset($current->response[$plugin_file]);
194
- set_transient('update_plugins', $current);
195
-
196
- $output = ob_get_clean();
197
-
198
- if ($reget_plugin_data)
199
- {
200
- chdir(WP_PLUGIN_DIR);
201
-
202
- // get the plugin again.
203
- return $this->_get_plugin_data($plugin_file);
204
- }
205
- }
206
-
207
- function upgrade_multiple($args)
208
- {
209
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
210
- $this->_escape($args);
211
- $username = $args[0];
212
- $password = $args[1];
213
- $plugin_files = $args[2];
214
-
215
- if ($this->worker_maitanance_mode){
216
- $this->_last_worker_message(array('error' => 'Blog is currently under maintenance. Please try again after few minutes.'));
217
- die();
218
- }
219
- if (!$user = $this->login($username, $password))
220
- {
221
- return $this->error;
222
- }
223
-
224
- if(!current_user_can('activate_plugins'))
225
- {
226
- return new IXR_Error(401, 'Sorry, you are not allowed to upgrade plugins on the remote blog.');
227
- }
228
- $upgrader = new Plugin_Upgrader( new Bulk_Plugin_Upgrader_Skin( compact( 'nonce', 'url' ) ) );
229
- $this->worker_maitanance_mode = true;
230
- $result = $upgrader->bulk_upgrade( $plugin_files );
231
- if(is_wp_error($upgrader->skin->result) || !$upgrader->plugin_info()){
232
- $this->worker_maitanance_mode = false;
233
- $error = is_wp_error($upgrader->skin->result) ? $upgrader->skin->result->get_error_message() : 'Check your FTP details. <a href="http://managewp.com/user-guide#ftp" title="More Info" target="_blank">More Info</a>' ;
234
- $this->_last_worker_message(array('error' => print_r($error, true)));
235
- }else {
236
- $this->worker_maitanance_mode = false;
237
- $return_pl = array();
238
- foreach($result as $plugin_file => $data){
239
- $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_file);
240
- $return_pl[] = $data['Name'];
241
  }
242
- $this->_last_worker_message(array('success' => $return_pl));
243
  }
244
- }
245
- /**
246
- * Upgrades all upgradable plugins on this blog
247
- *
248
- * @param mixed $args
249
- */
250
- function upgrade_all($args)
251
- {
252
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
253
- $this->_escape($args);
254
- $username = $args[0];
255
- $password = $args[1];
256
-
257
- if ($this->worker_maitanance_mode){
258
- $this->_last_worker_message(array('error' => 'Blog is currently under maintenance. Please try again after few minutes.'));
259
- die();
260
- }
261
- if (!$user = $this->login($username, $password))
262
- {
263
- return $this->error;
264
- }
265
-
266
- $plugin_files = array();
267
- $current = $this->mmb_get_transient('update_plugins');
268
- foreach ((array)$current->response as $file => $data){
269
- $plugin_files[] = $file;
270
- }
271
- $upgrader = new Plugin_Upgrader( new Bulk_Plugin_Upgrader_Skin( compact( 'nonce', 'url' ) ) );
272
- $this->worker_maitanance_mode = true;
273
- $result = $upgrader->bulk_upgrade( $plugin_files );
274
- if(is_wp_error($upgrader->skin->result) || !$upgrader->plugin_info()){
275
- $this->worker_maitanance_mode = false;
276
- $error = is_wp_error($upgrader->skin->result) ? $upgrader->skin->result->get_error_message() : 'Check your FTP details. <a href="http://managewp.com/user-guide#ftp" title="More Info" target="_blank">More Info</a>' ;
277
- $this->_last_worker_message(array('error' => print_r($error, true)));
278
- }else {
279
- $this->worker_maitanance_mode = false;
280
- $this->_last_worker_message(array('success' => $result));
281
- }
282
- }
283
-
284
- /**
285
- * Deletes a plugin locally
286
- *
287
- * @param mixed $args
288
- */
289
- function delete($args)
290
- {
291
- $this->_escape($args);
292
- $username = $args[0];
293
- $password = $args[1];
294
- $plugin_files = $args[2];
295
-
296
- if (!$user = $this->login($username, $password))
297
- {
298
- return $this->error;
299
- }
300
-
301
- if(!current_user_can('delete_plugins'))
302
- {
303
- return new IXR_Error(401, 'Sorry, you are not allowed to delete plugins from the remote blog.');
304
- }
305
-
306
- $this->refresh_transient();
307
-
308
- ob_start();
309
-
310
- // WP is rather stupid here
311
- // the agrument MUST be an array????
312
- if(!is_array($plugin_files))
313
- $plugin_files = array($plugin_files);
314
-
315
- $result = delete_plugins($plugin_files);
316
- ob_end_clean();
317
- if (is_wp_error($result))
318
- {
319
- return new IXR_Error(401, 'Sorry, this plugin could not be deleted. ' . $result->get_error_message());
320
- }
321
-
322
- return TRUE;
323
- }
324
-
325
- /**
326
- * Our own functions to get plugin data that fits our needs
327
- * (that is, with status and new version info)
328
- *
329
- * @param mixed $plugin_file
330
- */
331
- function _get_plugin_data($plugin_file)
332
- {
333
- $plugin = get_plugin_data($plugin_file);
334
- $plugin['status'] = is_plugin_active($plugin_file) ? 'active' : 'inactive';
335
-
336
-
337
- // check for new version
338
- // $current = get_transient('update_plugins');
339
- $current = $this->mmb_get_transient('update_plugins');
340
-
341
- if (isset($current->response[$plugin_file]))
342
- {
343
- $plugin['new_version'] = $current->response[$plugin_file];
344
- }
345
-
346
- return $plugin;
347
- }
348
-
349
- /**
350
- * Gets a list of plugins with upgrade available
351
- *
352
- */
353
- function get_upgradable_plugins()
354
- {
355
- $all_plugins = get_plugins();
356
- $upgrade_plugins = array();
357
-
358
- $this->refresh_transient();
359
-
360
- // $current = get_transient('update_plugins');
361
- $current = $this->mmb_get_transient('update_plugins');
362
- // $test = $this->mmb_get_transient('update_plugins');
363
- // $this->_log($test);
364
- foreach ((array)$all_plugins as $plugin_file => $plugin_data)
365
- {
366
- //Translate, Apply Markup, Sanitize HTML
367
- $plugin_data = _get_plugin_data_markup_translate($plugin_file, $plugin_data, false, true);
368
- if (isset($current->response[$plugin_file]))
369
- {
370
- $current->response[$plugin_file]->name = $plugin_data['Name'];
371
- $current->response[$plugin_file]->old_version = $plugin_data['Version'];
372
- $current->response[$plugin_file]->file = $plugin_file;
373
- $upgrade_plugins[] = $current->response[$plugin_file];
374
  }
 
 
 
 
375
  }
376
-
377
- return $upgrade_plugins;
378
  }
379
 
380
- /**
381
- * Installs a plugin by its slug
382
- *
383
- * @param mixed $args
384
- */
385
- function install($args)
386
  {
 
387
  $this->_escape($args);
388
- $username = $args[0];
389
- $password = $args[1];
390
- $slug = $args[2];
391
- $activate = (bool)$args[3];
392
-
393
- if (!$user = $this->login($username, $password))
394
- {
395
- return $this->error;
396
- }
397
- if (!current_user_can('install_plugins'))
398
- return new IXR_Error(401, 'You do not have sufficient permissions to install plugins for this blog.');
399
-
400
- $this->refresh_transient();
401
 
402
- ob_start();
403
- include_once ABSPATH . 'wp-admin/includes/plugin-install.php';
404
- // include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
405
-
406
- $api = plugins_api('plugin_information', array('slug' => $slug, 'fields' => array('sections' => false)));
407
-
408
- if (is_wp_error($api))
409
- return new IXR_Error(401, 'Failed to install plugin. ' . $api->get_error_message());
410
-
411
- // $upgrader = new Plugin_Upgrader();
412
- $upgrader = new Mmb_Plugin_Upgrader();
413
- $upgrader->install($api->download_link);
414
-
415
- $output = ob_get_clean();
416
-
417
- if ($activate)
418
- {
419
- $this->activate(array($username, $password, $upgrader->plugin_info()));
420
- }
 
 
 
 
 
 
 
 
 
 
 
421
 
422
- // return $this->get_list(array($username, $password));
423
- // list refresh should be requested by the client to have WP update the plugin list itself
424
- return TRUE;
425
  }
426
 
427
- function refresh_transient()
428
  {
429
- delete_transient('update_plugins');
430
- $current = $this->mmb_get_transient('update_plugins');
431
- wp_update_plugins();
 
 
 
 
 
 
 
 
 
 
 
 
 
432
 
433
- return $current;
434
  }
435
 
436
- /**
437
- * Uploads a plugin, given its package url
438
- *
439
- * @param mixed $args
440
- */
441
- function upload_by_url($args)
442
- {
443
- $this->_escape($args);
444
- $username = $args[0];
445
- $password = $args[1];
446
- $url = $args[2];
447
- $activate = $args[3];
448
-
449
- if (!$user = $this->login($username, $password))
450
- {
451
- return $this->error;
452
- }
453
- if($activate && !current_user_can('activate_plugins')){
454
- return new IXR_Error( 401, 'Sorry, you are not allowed to manage plugins on the remote blog.');
455
- }
456
- if (!current_user_can('install_plugins')){
457
- return new IXR_Error(401, 'Sorry, you are not allowed to install plugins on the remote blog.');
458
- }
459
-
460
- if (!$this->_init_filesystem())
461
- return new IXR_Error(401, 'Plugin could not be installed: Failed to initialize file system.');
462
- /*if($this->_is_ftp_writable){
463
- $this->_last_worker_message(array('error' => 'Blog needs a ftp permissions to complete task.'));
464
- die();
465
- }*/
466
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
467
- $upgrader = new Plugin_Upgrader( new Plugin_Installer_Skin( compact( 'nonce', 'url' ) ) );
468
- ob_start();
469
- $result = $upgrader->install($url);
470
- ob_end_clean();
471
-
472
- if(is_wp_error($upgrader->skin->result) || !$upgrader->plugin_info()){
473
- $error = is_wp_error($upgrader->skin->result) ? $upgrader->skin->result->get_error_message() : 'Check your FTP details. <a href="http://managewp.com/user-guide#ftp" title="More Info" target="_blank">More Info</a>' ;
474
- $this->_last_worker_message(array('error' => print_r($error, true)));
475
- }else {
476
- if($activate){
477
- $success = activate_plugin($upgrader->plugin_info(), '', FALSE);
478
- if(is_wp_error($success)){
479
- $this->_last_worker_message($success);
480
- return false;
481
- }
482
- }
483
- $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $upgrader->plugin_info());
484
- $this->_last_worker_message(array('success' => $upgrader->plugin_info(), 'name' => $data['Name'], 'activate' => print_r($activate, true)));
485
- }
486
- }
487
-
488
-
489
- }
1
  <?php
2
 
3
+ class MMB_Plugin extends MMB_Core
4
+ {
5
+ var $worker_maitanance_mode = false;
6
  function __construct()
7
  {
8
  parent::__construct();
9
  }
10
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
11
 
12
  /**
13
+ * Upgrades all upgradable plugins on this blog
14
+ *
15
+ * @param mixed $args
16
+ */
17
+ function upgrade_all($params)
18
+ {
19
+ $upgradable_plugins = $this->_get_upgradable_plugins();
20
+
21
+ $ready_for_upgrade =array();
22
+ if(!empty($upgradable_plugins)){
23
+ foreach($upgradable_plugins as $upgrade ){
24
+ $ready_for_upgrade[] = $upgrade->file;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
25
  }
 
26
  }
27
+ $return = '';
28
+ if (!empty($ready_for_upgrade)) {
29
+ ob_start();
30
+ include_once(ABSPATH . 'wp-admin/includes/file.php');
31
+ include_once(ABSPATH . 'wp-admin/includes/plugin.php');
32
+ require_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
33
+ if (class_exists('Plugin_Upgrader')) {
34
+ $upgrader = new Plugin_Upgrader(new Bulk_Plugin_Upgrader_Skin(compact('nonce', 'url')));
35
+ $result = $upgrader->bulk_upgrade($ready_for_upgrade);
36
+ ob_end_clean();
37
+ foreach ($result as $plugin_slug => $plugin_info) {
38
+ $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_slug);
39
+ if(!$plugin_info || is_wp_error($plugin_info)){
40
+ $return .= '<code title="Please upgarde manualy">' . $data['Name'] . '</code> was not upgraded.';
41
+ }else{
42
+ $return .= '<code>' . $data['Name'] . '</code> successfully upgraded.';
43
+ }
44
+ }
45
+ ob_end_clean();
46
+ return array('upgraded' => $return);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
47
  }
48
+ else {
49
+ ob_end_clean();
50
+ return array('error' => 'Could not initialize upgrader.');
51
+ }
52
  }
53
+ return array('error' => 'No plugins to upgrade at the moment');
 
54
  }
55
 
56
+ /**
57
+ * Uploads a plugin, given its package url
58
+ *
59
+ * @param mixed $args
60
+ */
61
+ function upload_by_url($args)
62
  {
63
+ //print_r($args);
64
  $this->_escape($args);
65
+ $plugin_url = $args['url'];
66
+ $activate_plugin = $args['activate'];
67
+
68
+ if ($plugin_url) {
69
+ ob_start();
70
+ include_once(ABSPATH . 'wp-admin/includes/file.php');
71
+ include_once(ABSPATH . 'wp-admin/includes/plugin.php');
72
+ include_once(ABSPATH . 'wp-admin/includes/misc.php');
73
+ include_once(ABSPATH . 'wp-admin/includes/template.php');
74
+ include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
 
 
 
75
 
76
+ $upgrader = new Plugin_Upgrader();
77
+
78
+ $result = $upgrader->run(array(
79
+ 'package' => $plugin_url,
80
+ 'destination' => WP_PLUGIN_DIR,
81
+ 'clear_destination' => false, //Do not overwrite files.
82
+ 'clear_working' => true,
83
+ 'hook_extra' => array()
84
+ ));
85
+
86
+ ob_end_clean();
87
+
88
+
89
+ if (is_wp_error($upgrader->skin->result) || !$upgrader->plugin_info()) {
90
+ return array('bool' => false, 'message' => 'Plugin was not installed.');
91
+ }
92
+
93
+ if ($activate_plugin) {
94
+ $success = activate_plugin($upgrader->plugin_info(), '', false);
95
+
96
+ if (!is_wp_error($success)) {
97
+ return array('bool' => true, 'message' => 'Plugin '.$upgrader->result[destination_name].' successfully installed and activated ');
98
+ }
99
+ return array('bool' => true, 'message' => 'Plugin '.$upgrader->result[destination_name].' successfully installed ');
100
+ } else {
101
+ return (!$result or is_wp_error($result)) ? array('bool' => false, 'message' => 'Upload failed.') : array('bool' => true, 'message' => 'Plugin '.$upgrader->result[destination_name].' successfully installed ');
102
+ }
103
+
104
+ } else
105
+ return array('bool' => false, 'message' => 'Missing plugin.');
106
 
 
 
 
107
  }
108
 
109
+ function _get_upgradable_plugins()
110
  {
111
+ $current = $this->mmb_get_transient('update_plugins');
112
+ $upgradable_plugins = array();
113
+ if(!empty($current->response)){
114
+ foreach ($current->response as $plugin_path => $plugin_data) {
115
+ if (!function_exists('get_plugin_data'))
116
+ include_once ABSPATH . 'wp-admin/includes/plugin.php';
117
+ $data = get_plugin_data(WP_PLUGIN_DIR . '/' . $plugin_path);
118
+
119
+ $current->response[$plugin_path]->name = $data['Name'];
120
+ $current->response[$plugin_path]->old_version = $data['Version'];
121
+ $current->response[$plugin_path]->file = $plugin_path;
122
+ $upgradable_plugins[] = $current->response[$plugin_path];
123
+ }
124
+ return $upgradable_plugins;
125
+ }
126
+ else return array();
127
 
 
128
  }
129
 
130
+ }
131
+ ?>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
post.class.php CHANGED
@@ -1,656 +1,350 @@
1
  <?php
 
 
 
 
 
 
 
 
 
 
2
 
3
- class Mmb_Post extends Mmb_Core
4
  {
5
  function __construct()
6
  {
7
  parent::__construct();
8
  }
9
 
10
- /*************************************************************
11
- * FACADE functions
12
- * (functions to be called after a remote XMLRPC from Master)
13
- **************************************************************/
14
-
15
- function get_list($args)
16
- {
17
- $this->_escape($args);
18
- $username = $args[0];
19
- $password = $args[1];
20
- $offset = $args[2];
21
- $number = $args[3];
22
- $status = $args[4];
23
- $category = $args[5];
24
- $tag = $args[6];
25
- $author = $args[7];
26
-
27
- if (!$user = $this->login($username, $password))
28
- {
29
- return $this->error;
30
- }
31
-
32
- if (!current_user_can('edit_posts'))
33
- return new IXR_Error(401, 'You are not allowed to manage posts.');
34
-
35
- if($category)
36
- $category_query = "&category=$category";
37
- if($tag)
38
- $tag_query = "&tag=$tag";
39
- if($author)
40
- $author_query = "&author=$author";
41
-
42
- $posts = get_posts("offset=$offset&post_status=$status&numberposts=$number".$category_query.$tag_query.$author_query);
43
-
44
-
45
- foreach ($posts as &$post)
46
- {
47
-
48
- // trim off unnecessary data to save bandwidth and speed
49
- $post->post_content = null;
50
- $post->post_excerpt = null;
51
-
52
- // get categories and tags data
53
- $cats = array();
54
- foreach (get_the_category($post->ID) as $k => $cat)
55
- {
56
- $cats[$k]['name'] = $cat->cat_name;
57
- $cats[$k]['ID'] = $cat->cat_ID;
58
- //$post->categories .= $cat->cat_name . ', ';
59
- }
60
-
61
- //$post->categories = rtrim($post->categories, ', ');
62
- $post->categories = $cats;
63
-
64
- $tags = array();
65
-
66
- foreach ( (array)get_the_tags($post->ID) as $k => $tag)
67
- {
68
- $tags[$k]['name'] = $tag->name;
69
- $tags[$k]['slug'] = $tag->slug;
70
- //$post->tags .= $tag->name . ', ';
71
- }
72
-
73
- $post->tags = $tags;
74
- //$post->tags = rtrim($post->tags, ', ');
75
-
76
- // how about author?
77
- $author = get_userdata($post->post_author);
78
- $post->author = array('author_name' => $author->nickname, 'author_id' => $author->ID);
79
- }
80
-
81
-
82
- //Get number of queried post without offset
83
- $queried_posts = get_posts("offset=-1&post_status=-1&numberposts=-1".$category_query.$tag_query.$author_query);
84
-
85
- // category
86
- $categories = get_categories(array(
87
- 'number' => 0,
88
- 'hide_empty' => 1
89
- ));
90
-
91
- $data = array(
92
- 'posts' => $posts,
93
- 'post_counts' => wp_count_posts('post', 'readable'),
94
- 'query_post_counts' => count($queried_posts),
95
- 'categories' => $categories
96
- );
97
-
98
- return $data;
99
- }
100
-
101
- /**
102
- * Gets data to edit a post
103
- *
104
- * @param mixed $args
105
- */
106
- function get_edit_data($args)
107
- {
108
- $this->_escape($args);
109
- $username = $args[0];
110
- $password = $args[1];
111
- $post_ID = $args[2];
112
-
113
- if (!$user = $this->login($username, $password))
114
- {
115
- return $this->error;
116
- }
117
-
118
- if (!current_user_can('edit_post', $post_ID))
119
- return new IXR_Error(401, 'You are not allowed to edit this post.');
120
-
121
- $post = get_post($post_ID);
122
-
123
- if (empty($post->ID))
124
- return new IXR_Error(401, 'You attempted to edit a post that doesn&#8217;t exist. Perhaps it was deleted?');
125
-
126
- if ('trash' == $post->post_status)
127
- return new IXR_Error(401, 'You can&#8217;t edit this post because it is in the Trash. Please restore it and try again.');
128
-
129
- $post = get_post_to_edit($post_ID);
130
- $post->post_content = base64_encode($post->post_content);
131
- $post->post_excerpt = base64_encode($post->post_excerpt);
132
-
133
- // wordpress don't provide information about a post's categories
134
- // do it our own
135
- foreach ((array)get_the_category($post_ID) as $cat)
136
- {
137
- // $post->categories[] = $cat->cat_ID;
138
- $post->categories[] = $cat->name;
139
- }
140
-
141
- // same goes with the tags. What was Matt doing????
142
- foreach ((array)get_the_tags($post_ID) as $tag)
143
- {
144
- $post->tags .= $tag->name . ', ';
145
- }
146
-
147
- $post->tags = rtrim($post->tags, ', ');
148
-
149
- // get the categories
150
- foreach ((array)get_categories() as $cat)
151
- {
152
- $categories[] = array(
153
- 'ID' => $cat->cat_ID,
154
- 'name' => $cat->cat_name,
155
- );
156
- }
157
-
158
- // and the custom fields (meta)
159
- // this is different from how we handle Page
160
- // (because I was stupid at the moment)
161
- $custom = array();
162
-
163
- foreach ((array)get_post_custom($post_ID) as $key => $value_array)
164
- {
165
- if ('_' == $key[0]) continue;
166
- foreach ($value_array as $value)
167
- {
168
- $post->meta[$key][] = base64_encode($value); // keep the new lines
169
- }
170
- }
171
-
172
- // visibility
173
- if ('private' == $post->post_status)
174
- {
175
- $post->post_password = '';
176
- $post->visibility = 'private';
177
- $post->sticky = FALSE;
178
- }
179
- elseif (!empty( $post->post_password))
180
- {
181
- $post->visibility = 'password';
182
- $post->sticky = FALSE;
183
- }
184
- elseif (is_sticky( $post->ID ))
185
- {
186
- $post->visibility = 'public';
187
- $post->sticky = TRUE;
188
- }
189
- else
190
- {
191
- $post->visibility = 'public';
192
- $post->sticky = FALSE;
193
- }
194
-
195
- $data = array(
196
- 'post' => $post,
197
- 'categories' => $categories,
198
- );
199
-
200
- return $data;
201
- }
202
-
203
- /**
204
- * Updates a post locally
205
- *
206
- * @param mixed $args
207
- */
208
- function update($args)
209
- {
210
- $this->_escape($args);
211
- $username = $args[0];
212
- $password = $args[1];
213
- $post_data = unserialize(base64_decode($args[2]));
214
-
215
- if (!$user = $this->login($username, $password))
216
- {
217
- return $this->error;
218
- }
219
-
220
- if (!current_user_can('edit_post', $post_data['post_ID']))
221
- return new IXR_Error(401, 'You are not allowed to edit this post.');
222
-
223
- // wp_update_post needs ID key
224
- $post_data['ID'] = $post_data['post_ID'];
225
-
226
- // wrap the function inside an output buffer to prevent errors from printed
227
- ob_start();
228
- $custom_fields = get_post_custom($post_data['ID']);
229
- foreach ((array)$custom_fields as $key => $value)
230
- {
231
- delete_post_meta($post_data['ID'], $key);
232
- }
233
-
234
- $result = edit_post($post_data);
235
- foreach ((array)$post_data['meta'] as $id => $meta)
236
- {
237
- add_post_meta($post_data['ID'], $meta['key'], $meta['value']);
238
- }
239
-
240
- ob_end_clean();
241
-
242
- if ($result)
243
- {
244
- return 'Success';
245
- }
246
-
247
- return new IXR_Error(401, 'Failed to update the post.');
248
- }
249
-
250
- /**
251
- * Gets data to create a post
252
- *
253
- * @param mixed $args
254
- */
255
- function get_new_data($args)
256
- {
257
- $this->_escape($args);
258
- $username = $args[0];
259
- $password = $args[1];
260
-
261
- if (!$user = $this->login($username, $password))
262
- {
263
- return $this->error;
264
- }
265
-
266
- $post = get_default_post_to_edit();
267
-
268
- // some default data
269
- $post->categories= array();
270
- $post->tags = '';
271
- $post->meta = array();
272
- $post->visibility = 'public';
273
- $post->sticky = FALSE;
274
- $post->post_date = date('Y-m-d H:i:s');
275
- $post->post_status = 'publish';
276
-
277
- // get the categories
278
- foreach ((array)get_categories() as $cat)
279
- {
280
- $categories[] = array(
281
- 'ID' => $cat->cat_ID,
282
- 'name' => $cat->cat_name,
283
- );
284
- }
285
-
286
- $data = array(
287
- 'post' => $post,
288
- 'categories' => $categories,
289
- );
290
-
291
- return $data;
292
- }
293
-
294
- /**
295
- * Locally creates a post
296
- *
297
- * @param mixed $args
298
- */
299
  function create($args)
300
  {
301
- $this->_escape($args);
302
- $username = $args[0];
303
- $password = $args[1];
304
- if (!$user = $this->login($username, $password))
305
- {
306
- return $this->error;
307
- }
308
  /**
309
  * algorithm
310
  * 1. create post using wp_insert_post (insert tags also here itself)
311
  * 2. use wp_create_categories() to create(not exists) and insert in the post
312
  * 3. insert meta values
313
  */
314
-
315
-
316
-
317
- $post_struct = unserialize(base64_decode($args[2]));
318
- $post_data = $post_struct['post_data'];
319
- $new_custom = $post_struct['post_extras']['post_meta'];
320
- $post_categories = explode(',', $post_struct['post_extras']['post_categories']);
321
- $post_atta_img = $post_struct['post_extras']['post_atta_images'];
322
- $post_upload_dir = $post_struct['post_extras']['post_upload_dir'];
323
- $post_checksum = $post_struct['post_extras']['post_checksum'];
324
- $post_featured_img = $post_struct['post_extras']['featured_img'];
325
-
326
- //create post
327
- //$post_id = wp_insert_post($post_data);
328
-
329
- $upload = wp_upload_dir();
330
-
331
- // create dynamic url RegExp
332
- $mwp_base_url = parse_url($post_upload_dir['url']);
333
- $mwp_regexp_url = $mwp_base_url['host'].$mwp_base_url['path'];
334
- $rep = array('/', '+', '.', ':', '?');
335
- $with = array('\/', '\+', '\.', '\:', '\?');
336
- $mwp_regexp_url = str_replace($rep, $with, $mwp_regexp_url);
337
-
338
- // rename all src ../wp-content/ with hostname/wp-content/
339
- $mwp_dot_url = '..'.$mwp_base_url['path'];
340
- $mwp_dot_url = str_replace($rep, $with, $mwp_dot_url);
341
- $dot_match_count = preg_match_all('/(<a[^>]+href=\"([^"]+)\"[^>]*>)?(<\s*img.[^\/>]*src="([^"]*'.$mwp_dot_url.'[^\s]+\.(jpg|jpeg|png|gif|bmp))"[^>]*>)/ixu', $post_data['post_content'], $dot_get_urls, PREG_SET_ORDER);
342
- if($dot_match_count > 0){
343
- foreach($dot_get_urls as $dot_url){
344
- $match_dot = '/'.str_replace($rep, $with, $dot_url[4]).'/';
345
- $replace_dot = 'http://'.$mwp_base_url['host'].substr( $dot_url[4], 2, strlen($dot_url[4]) );
346
- $post_data['post_content'] = preg_replace($match_dot, $replace_dot, $post_data['post_content']);
347
-
348
- if($dot_url[1] != ''){
349
- $match_dot_a = '/'.str_replace($rep, $with, $dot_url[2]).'/';
350
- $replace_dot_a = 'http://'.$mwp_base_url['host'].substr( $dot_url[2], 2, strlen($dot_url[2]) );
351
- $post_data['post_content'] = preg_replace($match_dot_a, $replace_dot_a, $post_data['post_content']);
352
- }
353
- }
354
- }
355
-
 
 
 
 
 
 
 
 
 
 
 
 
 
356
  //to find all the images
357
- $match_count = preg_match_all('/(<a[^>]+href=\"([^"]+)\"[^>]*>)?(<\s*img.[^\/>]*src="([^"]+'.$mwp_regexp_url.'[^\s]+\.(jpg|jpeg|png|gif|bmp))"[^>]*>)/ixu', $post_data['post_content'], $get_urls, PREG_SET_ORDER);
358
- if($match_count > 0){
359
- $attachments = array();
360
- $post_content = $post_data['post_content'];
361
-
362
- foreach($get_urls as $get_url_k => $get_url){
363
- // unset url in attachment array
364
- foreach($post_atta_img as $atta_url_k => $atta_url_v){
365
- $match_patt_url = '/'.str_replace($rep, $with, substr($atta_url_v['src'], 0, strrpos($atta_url_v['src'], '.')) ).'/';
366
- if( preg_match($match_patt_url, $get_url[4]) ){
367
- unset($post_atta_img[$atta_url_k]);
368
- }
369
- }
370
-
371
- if( isset($get_urls[$get_url_k][6])){ // url have parent, don't download this url
372
- if($get_url[1] != ''){
373
- // change src url
374
- $s_mwp_mp = '/'.str_replace($rep, $with, $get_url[4]).'/';
375
- $s_img_atta = wp_get_attachment_image_src( $get_urls[$get_url_k][6] );
376
- $s_mwp_rp = $s_img_atta[0];
377
- $post_content = preg_replace($s_mwp_mp, $s_mwp_rp, $post_content);
378
- // change attachment url
379
- if( preg_match('/attachment_id/i', $get_url[2]) ){
380
- $mwp_mp = '/'.str_replace($rep, $with, $get_url[2]).'/';
381
- $mwp_rp = get_bloginfo('wpurl').'/?attachment_id='.$get_urls[$get_url_k][6];
382
- $post_content = preg_replace($mwp_mp, $mwp_rp, $post_content);
383
- }
384
- }
385
- continue;
386
- }
387
-
388
- $no_thumb ='';
389
- if(preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $get_url[4])){
390
- $no_thumb = preg_replace('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', '.'.$get_url[5], $get_url[4]);
391
- }else{
392
- $no_thumb = $get_url[4];
393
- }
394
- $file_name = basename($no_thumb);
395
- $tmp_file = download_url($no_thumb);
396
- $attach_upload['url'] = $upload['url'].'/'.$file_name;
397
- $attach_upload['path'] = $upload['path'].'/'.$file_name;
398
- $renamed = rename($tmp_file, $attach_upload['path']);
399
- if($renamed === true){
400
- $match_pattern = '/'.str_replace($rep, $with, $get_url[4]).'/';
401
- $replace_pattern = $attach_upload['url'];
402
- $post_content = preg_replace($match_pattern, $replace_pattern, $post_content);
403
- if(preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $get_url[4])){
404
- $match_pattern = '/'.str_replace( $rep, $with, preg_replace('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', '.'.$get_url[5], $get_url[4]) ).'/';
405
- $post_content = preg_replace($match_pattern, $replace_pattern, $post_content);
406
- }
407
-
408
- $attachment = array(
409
- 'post_title' => $file_name,
410
- 'post_content' => '',
411
- 'post_type' => 'attachment',
412
- //'post_parent' => $post_id,
413
- 'post_mime_type' => 'image/'.$get_url[5],
414
- 'guid' => $attach_upload['url']
415
- );
416
-
417
- // Save the data
418
- $attach_id = wp_insert_attachment( $attachment, $attach_upload['path'] );
419
- $attachments[$attach_id] = 0;
420
-
421
- // featured image
422
- if($post_featured_img != ''){
423
- $feat_img_url = '';
424
- if( preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $post_featured_img) ){
425
- $feat_img_url = substr($post_featured_img, 0, strrpos($post_featured_img, '.') - 8);
426
- }else{
427
- $feat_img_url = substr($post_featured_img, 0, strrpos($post_featured_img, '.'));
428
- }
429
- $m_feat_url = '/'.str_replace($rep, $with, $feat_img_url ).'/';
430
- if( preg_match($m_feat_url, $get_url[4]) ){
431
- $post_featured_img = '';
432
- $attachments[$attach_id] = $attach_id;
433
- }
434
- }
435
-
436
- // set $get_urls value[6] - parent atta_id
437
- foreach($get_urls as $url_k => $url_v){
438
- if($get_url_k != $url_k){
439
- $s_get_url = '';
440
- if(preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $url_v[4])){
441
- $s_get_url = substr($url_v[4], 0, strrpos($url_v[4], '.') - 8);
442
- }else{
443
- $s_get_url = substr($url_v[4], 0, strrpos($url_v[4], '.'));
444
- }
445
- $m_patt_url = '/'.str_replace($rep, $with, $s_get_url ).'/';
446
- if( preg_match($m_patt_url, $get_url[4]) ){
447
- array_push($get_urls[$url_k], $attach_id);
448
- }
449
- }
450
- }
451
- wp_update_attachment_metadata( $attach_id, wp_generate_attachment_metadata( $attach_id, $attach_upload['path'] ) );
452
- // changing href of a tag
453
- if($get_url[1] != ''){
454
- $mwp_mp = '/'.str_replace($rep, $with, $get_url[2]).'/';
455
- if( preg_match('/attachment_id/i', $get_url[2]) ){
456
- $mwp_rp = get_bloginfo('wpurl').'/?attachment_id='.$attach_id;
457
- $post_content = preg_replace($mwp_mp, $mwp_rp, $post_content);
458
- }
459
- }
460
  }
461
- @unlink($tmp_file);
 
462
  }
463
- // $updated_post = array();
464
- // $updated_post['ID'] = $results[$i]->ID;
465
- // $updated_post['post_content'] = $post_content;
466
-
467
- $post_data['post_content'] = $post_content;
468
-
469
- }
470
- if(count($post_atta_img)){
471
- foreach($post_atta_img as $img){
472
- $file_name = basename($img['src']);
473
- $tmp_file = download_url($img['src']);
474
- $attach_upload['url'] = $upload['url'].'/'.$file_name;
475
- $attach_upload['path'] = $upload['path'].'/'.$file_name;
476
- $renamed = rename($tmp_file, $attach_upload['path']);
477
- if($renamed === true){
478
- $atta_ext = end(explode('.', $file_name));
479
-
480
- $attachment = array(
481
- 'post_title' => $file_name,
482
- 'post_content' => '',
483
- 'post_type' => 'attachment',
484
- //'post_parent' => $post_id,
485
- 'post_mime_type' => 'image/'.$atta_ext,
486
- 'guid' => $attach_upload['url']
487
- );
488
-
489
- // Save the data
490
- $attach_id = wp_insert_attachment( $attachment, $attach_upload['path'] );
491
- wp_update_attachment_metadata( $attach_id, wp_generate_attachment_metadata( $attach_id, $attach_upload['path'] ) );
492
- $attachments[$attach_id] = 0;
493
-
494
- // featured image
495
- if($post_featured_img != ''){
496
- $feat_img_url = '';
497
- if( preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $post_featured_img) ){
498
- $feat_img_url = substr($post_featured_img, 0, strrpos($post_featured_img, '.') - 8);
499
- }else{
500
- $feat_img_url = substr($post_featured_img, 0, strrpos($post_featured_img, '.'));
501
- }
502
- $m_feat_url = '/'.str_replace($rep, $with, $feat_img_url ).'/';
503
- if( preg_match($m_feat_url, $img['src']) ){
504
- $post_featured_img = '';
505
- $attachments[$attach_id] = $attach_id;
506
- }
507
- }
508
-
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
509
  }
510
- @unlink($tmp_file);
511
  }
512
- }
513
-
514
- // create post
515
- $post_id = wp_insert_post($post_data);
516
- if(count($attachments)){
517
- foreach($attachments as $atta_id => $featured_id){
518
- $result = wp_update_post(array('ID' => $atta_id, 'post_parent' => $post_id));
519
- if($featured_id > 0){
520
- $new_custom['_thumbnail_id'] = array( $featured_id );
521
- }
522
- }
523
- }
524
-
525
- // featured image
526
- if($post_featured_img != ''){
527
- $file_name = basename($post_featured_img);
528
- $tmp_file = download_url($post_featured_img);
529
- $attach_upload['url'] = $upload['url'].'/'.$file_name;
530
- $attach_upload['path'] = $upload['path'].'/'.$file_name;
531
- $renamed = rename($tmp_file, $attach_upload['path']);
532
- if($renamed === true){
533
- $atta_ext = end(explode('.', $file_name));
534
-
535
  $attachment = array(
536
  'post_title' => $file_name,
537
  'post_content' => '',
538
  'post_type' => 'attachment',
539
- 'post_parent' => $post_id,
540
- 'post_mime_type' => 'image/'.$atta_ext,
541
  'guid' => $attach_upload['url']
542
  );
543
-
544
  // Save the data
545
- $attach_id = wp_insert_attachment( $attachment, $attach_upload['path'] );
546
- wp_update_attachment_metadata( $attach_id, wp_generate_attachment_metadata( $attach_id, $attach_upload['path'] ) );
547
- $new_custom['_thumbnail_id'] = array( $attach_id );
548
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
549
  @unlink($tmp_file);
550
- }
551
-
552
- //checksum
553
- $option_post_checksum = maybe_unserialize( get_option('worker_post_checksum') );
554
- if($option_post_checksum == ''){
555
- $add_post_checksum = array($post_checksum => $post_id);
556
- add_option('worker_post_checksum', $add_post_checksum );
557
- }else{
558
- update_option('worker_post_checksum', array_merge((array)$option_post_checksum, array($post_checksum => $post_id)) );
559
- }
560
-
561
- if($post_id && is_array($post_categories)){
562
  //insert categories
 
563
  $cat_ids = wp_create_categories($post_categories, $post_id);
564
  }
 
 
565
  //get current custom fields
566
- $cur_custom = get_post_custom($post_id);
567
  //check which values doesnot exists in new custom fields
568
  $diff_values = array_diff_key($cur_custom, $new_custom);
569
-
570
- if(is_array($diff_values))
571
  foreach ($diff_values as $meta_key => $value) {
572
  delete_post_meta($post_id, $meta_key);
573
  }
574
  //insert new post meta
575
- foreach($new_custom as $meta_key => $value){
576
- if(strpos($meta_key, '_mmb') === 0 || strpos($meta_key, '_edit') === 0){
577
  continue;
578
- }else{
579
  update_post_meta($post_id, $meta_key, $value[0]);
580
  }
581
  }
582
 
 
583
  return $post_id;
584
-
585
- //TODO : handle other post attributes like sticky, private, etc
586
  }
587
 
588
  /**
589
- * Locally publishes a post
590
- *
591
- * @param mixed $args
592
- */
593
- function publish($args)
594
  {
595
- $this->_escape($args);
596
- $username = $args[0];
597
- $password = $args[1];
598
- $post_id = $args[2];
599
-
600
- if (!$user = $this->login($username, $password))
601
- {
602
- return $this->error;
603
  }
604
-
605
- if (!current_user_can('edit_post', $post_id))
606
- return new IXR_Error(401, 'You are not allowed to edit this post.');
607
-
608
- wp_publish_post($post_id);
609
-
610
- return TRUE;
611
- }
612
-
613
- function checksum($args)
614
- {
615
- $this->_escape($args);
616
- $username = $args[0];
617
- $password = $args[1];
618
- $checksum = $args[2];
619
- $post_type = $args[3];
620
-
621
- if (!$user = $this->login($username, $password))
622
- return $this->error;
623
-
624
- for($i=0;$i<=30;$i++){
625
- global $wpdb;
626
- $option = 'worker_post_checksum';
627
- $row = $wpdb->get_row( $wpdb->prepare( "SELECT option_value FROM $wpdb->options WHERE option_name = %s LIMIT 1", $option ) );
628
- wp_cache_delete('worker_post_checksum','options');
629
- $row_option = $row->option_value;
630
- $local_checksums = maybe_unserialize($row_option);
631
- if(isset($local_checksums[$checksum])){
632
- $local_post_id = $local_checksums[$checksum];
633
- unset($local_checksums[$checksum]);
634
- if(count($local_checksums)){
635
- update_option('worker_post_checksum', '');
636
- update_option('worker_post_checksum', $local_checksums);
637
- }else{
638
- delete_option('worker_post_checksum');
639
- }
640
- return $local_post_id.'#'.$post_type;
641
-
642
- }elseif($i==30){
643
- return false;
644
- }
645
- $this->my_sleep(1);
646
- }
647
-
648
- }
649
- function my_sleep($seconds)
650
- {
651
- $start = microtime(true);
652
- for ($i = 1; $i <= $seconds; $i ++) {
653
- @time_sleep_until($start + $i);
654
  }
655
- }
656
- }
1
  <?php
2
+ /*************************************************************
3
+ *
4
+ * post.class.php
5
+ *
6
+ * Create remote post
7
+ *
8
+ *
9
+ * Copyright (c) 2011 Prelovac Media
10
+ * www.prelovac.com
11
+ **************************************************************/
12
 
13
+ class MMB_Post extends MMB_Core
14
  {
15
  function __construct()
16
  {
17
  parent::__construct();
18
  }
19
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  function create($args)
21
  {
 
 
 
 
 
 
 
22
  /**
23
  * algorithm
24
  * 1. create post using wp_insert_post (insert tags also here itself)
25
  * 2. use wp_create_categories() to create(not exists) and insert in the post
26
  * 3. insert meta values
27
  */
28
+
29
+ include_once ABSPATH . 'wp-admin/includes/taxonomy.php';
30
+ include_once ABSPATH . 'wp-admin/includes/image.php';
31
+
32
+ $post_struct = $args['post_data'];
33
+
34
+ $post_data = $post_struct['post_data'];
35
+ $new_custom = $post_struct['post_extras']['post_meta'];
36
+ $post_categories = explode(',', $post_struct['post_extras']['post_categories']);
37
+ $post_atta_img = $post_struct['post_extras']['post_atta_images'];
38
+ $post_upload_dir = $post_struct['post_extras']['post_upload_dir'];
39
+ $post_checksum = $post_struct['post_extras']['post_checksum'];
40
+ $post_featured_img = $post_struct['post_extras']['featured_img'];
41
+
42
+ $upload = wp_upload_dir();
43
+
44
+ // create dynamic url RegExp
45
+ $mwp_base_url = parse_url($post_upload_dir['url']);
46
+ $mwp_regexp_url = $mwp_base_url['host'] . $mwp_base_url['path'];
47
+ $rep = array(
48
+ '/',
49
+ '+',
50
+ '.',
51
+ ':',
52
+ '?'
53
+ );
54
+ $with = array(
55
+ '\/',
56
+ '\+',
57
+ '\.',
58
+ '\:',
59
+ '\?'
60
+ );
61
+ $mwp_regexp_url = str_replace($rep, $with, $mwp_regexp_url);
62
+
63
+ // rename all src ../wp-content/ with hostname/wp-content/
64
+ $mmb_dot_url = '..' . $mmb_base_url['path'];
65
+ $mmb_dot_url = str_replace($rep, $with, $mmb_dot_url);
66
+ $dot_match_count = preg_match_all('/(<a[^>]+href=\"([^"]+)\"[^>]*>)?(<\s*img.[^\/>]*src="([^"]*' . $mmb_dot_url . '[^\s]+\.(jpg|jpeg|png|gif|bmp))"[^>]*>)/ixu', $post_data['post_content'], $dot_get_urls, PREG_SET_ORDER);
67
+ if ($dot_match_count > 0) {
68
+ foreach ($dot_get_urls as $dot_url) {
69
+ $match_dot = '/' . str_replace($rep, $with, $dot_url[4]) . '/';
70
+ $replace_dot = 'http://' . $mmb_base_url['host'] . substr($dot_url[4], 2, strlen($dot_url[4]));
71
+ $post_data['post_content'] = preg_replace($match_dot, $replace_dot, $post_data['post_content']);
72
+
73
+ if ($dot_url[1] != '') {
74
+ $match_dot_a = '/' . str_replace($rep, $with, $dot_url[2]) . '/';
75
+ $replace_dot_a = 'http://' . $mmb_base_url['host'] . substr($dot_url[2], 2, strlen($dot_url[2]));
76
+ $post_data['post_content'] = preg_replace($match_dot_a, $replace_dot_a, $post_data['post_content']);
77
+ }
78
+ }
79
+ }
80
+
81
+
82
+
83
  //to find all the images
84
+ $match_count = preg_match_all('/(<a[^>]+href=\"([^"]+)\"[^>]*>)?(<\s*img.[^\/>]*src="([^"]+' . $mmb_regexp_url . '[^\s]+\.(jpg|jpeg|png|gif|bmp))"[^>]*>)/ixu', $post_data['post_content'], $get_urls, PREG_SET_ORDER);
85
+ if ($match_count > 0) {
86
+ $attachments = array();
87
+ $post_content = $post_data['post_content'];
88
+
89
+ foreach ($get_urls as $get_url_k => $get_url) {
90
+ // unset url in attachment array
91
+ foreach ($post_atta_img as $atta_url_k => $atta_url_v) {
92
+ $match_patt_url = '/' . str_replace($rep, $with, substr($atta_url_v['src'], 0, strrpos($atta_url_v['src'], '.'))) . '/';
93
+ if (preg_match($match_patt_url, $get_url[4])) {
94
+ unset($post_atta_img[$atta_url_k]);
95
+ }
96
+ }
97
+
98
+ if (isset($get_urls[$get_url_k][6])) { // url have parent, don't download this url
99
+ if ($get_url[1] != '') {
100
+ // change src url
101
+ $s_mmb_mp = '/' . str_replace($rep, $with, $get_url[4]) . '/';
102
+
103
+ $s_img_atta = wp_get_attachment_image_src($get_urls[$get_url_k][6]);
104
+ $s_mmb_rp = $s_img_atta[0];
105
+ $post_content = preg_replace($s_mmb_mp, $s_mmb_rp, $post_content);
106
+ // change attachment url
107
+ if (preg_match('/attachment_id/i', $get_url[2])) {
108
+ $mmb_mp = '/' . str_replace($rep, $with, $get_url[2]) . '/';
109
+ $mmb_rp = get_bloginfo('wpurl') . '/?attachment_id=' . $get_urls[$get_url_k][6];
110
+ $post_content = preg_replace($mmb_mp, $mmb_rp, $post_content);
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
111
  }
112
+ }
113
+ continue;
114
  }
115
+
116
+ $no_thumb = '';
117
+ if (preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $get_url[4])) {
118
+ $no_thumb = preg_replace('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', '.' . $get_url[5], $get_url[4]);
119
+ } else {
120
+ $no_thumb = $get_url[4];
121
+ }
122
+ $file_name = basename($no_thumb);
123
+
124
+ //$tmp_file = $upload['path'].'/tempfile.tmp';
125
+ $tmp_file = $this->mmb_download_url($no_thumb, $upload['path'] . '/tempfile'.md5(time()).'.tmp');
126
+ //$tmp_file = download_url($no_thumb);
127
+
128
+ $attach_upload['url'] = $upload['url'] . '/' . $file_name;
129
+ $attach_upload['path'] = $upload['path'] . '/' . $file_name;
130
+ $renamed = @rename($tmp_file, $attach_upload['path']);
131
+ if ($renamed === true) {
132
+ $match_pattern = '/' . str_replace($rep, $with, $get_url[4]) . '/';
133
+ $replace_pattern = $attach_upload['url'];
134
+ $post_content = preg_replace($match_pattern, $replace_pattern, $post_content);
135
+ if (preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $get_url[4])) {
136
+ $match_pattern = '/' . str_replace($rep, $with, preg_replace('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', '.' . $get_url[5], $get_url[4])) . '/';
137
+ $post_content = preg_replace($match_pattern, $replace_pattern, $post_content);
138
+ }
139
+
140
+ $attachment = array(
141
+ 'post_title' => $file_name,
142
+ 'post_content' => '',
143
+ 'post_type' => 'attachment',
144
+ //'post_parent' => $post_id,
145
+ 'post_mime_type' => 'image/' . $get_url[5],
146
+ 'guid' => $attach_upload['url']
147
+ );
148
+
149
+ // Save the data
150
+
151
+ $attach_id = wp_insert_attachment($attachment, $attach_upload['path']);
152
+
153
+ $attachments[$attach_id] = 0;
154
+
155
+ // featured image
156
+ if ($post_featured_img != '') {
157
+ $feat_img_url = '';
158
+ if (preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $post_featured_img)) {
159
+ $feat_img_url = substr($post_featured_img, 0, strrpos($post_featured_img, '.') - 8);
160
+ } else {
161
+ $feat_img_url = substr($post_featured_img, 0, strrpos($post_featured_img, '.'));
162
+ }
163
+ $m_feat_url = '/' . str_replace($rep, $with, $feat_img_url) . '/';
164
+ if (preg_match($m_feat_url, $get_url[4])) {
165
+ $post_featured_img = '';
166
+ $attachments[$attach_id] = $attach_id;
167
+ }
168
+ }
169
+
170
+ // set $get_urls value[6] - parent atta_id
171
+ foreach ($get_urls as $url_k => $url_v) {
172
+ if ($get_url_k != $url_k) {
173
+ $s_get_url = '';
174
+ if (preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $url_v[4])) {
175
+ $s_get_url = substr($url_v[4], 0, strrpos($url_v[4], '.') - 8);
176
+ } else {
177
+ $s_get_url = substr($url_v[4], 0, strrpos($url_v[4], '.'));
178
+ }
179
+ $m_patt_url = '/' . str_replace($rep, $with, $s_get_url) . '/';
180
+ if (preg_match($m_patt_url, $get_url[4])) {
181
+ array_push($get_urls[$url_k], $attach_id);
182
+ }
183
+ }
184
+ }
185
+
186
+
187
+ $some_data = wp_generate_attachment_metadata($attach_id, $attach_upload['path']);
188
+ wp_update_attachment_metadata($attach_id, $some_data);
189
+
190
+
191
+ // changing href of a tag
192
+ if ($get_url[1] != '') {
193
+ $mmb_mp = '/' . str_replace($rep, $with, $get_url[2]) . '/';
194
+ if (preg_match('/attachment_id/i', $get_url[2])) {
195
+ $mmb_rp = get_bloginfo('wpurl') . '/?attachment_id=' . $attach_id;
196
+ $post_content = preg_replace($mmb_mp, $mmb_rp, $post_content);
197
  }
198
+ }
199
  }
200
+ @unlink($tmp_file);
201
+ }
202
+
203
+
204
+ $post_data['post_content'] = $post_content;
205
+
206
+ }
207
+ if (count($post_atta_img)) {
208
+ foreach ($post_atta_img as $img) {
209
+ $file_name = basename($img['src']);
210
+
211
+
212
+ $tmp_file = $this->mmb_download_url($img['src'], $upload['path'] . '/tempfile.tmp');
213
+
214
+ //$tmp_file = download_url($img['src']);
215
+
216
+ $attach_upload['url'] = $upload['url'] . '/' . $file_name;
217
+ $attach_upload['path'] = $upload['path'] . '/' . $file_name;
218
+ $renamed = @rename($tmp_file, $attach_upload['path']);
219
+ if ($renamed === true) {
220
+ $atta_ext = end(explode('.', $file_name));
221
+
 
222
  $attachment = array(
223
  'post_title' => $file_name,
224
  'post_content' => '',
225
  'post_type' => 'attachment',
226
+ //'post_parent' => $post_id,
227
+ 'post_mime_type' => 'image/' . $atta_ext,
228
  'guid' => $attach_upload['url']
229
  );
230
+
231
  // Save the data
232
+ $attach_id = wp_insert_attachment($attachment, $attach_upload['path']);
233
+ wp_update_attachment_metadata($attach_id, wp_generate_attachment_metadata($attach_id, $attach_upload['path']));
234
+ $attachments[$attach_id] = 0;
235
+
236
+ // featured image
237
+ if ($post_featured_img != '') {
238
+ $feat_img_url = '';
239
+ if (preg_match('/-\d{3}x\d{3}\.[a-zA-Z0-9]{3,4}$/', $post_featured_img)) {
240
+ $feat_img_url = substr($post_featured_img, 0, strrpos($post_featured_img, '.') - 8);
241
+ } else {
242
+ $feat_img_url = substr($post_featured_img, 0, strrpos($post_featured_img, '.'));
243
+ }
244
+ $m_feat_url = '/' . str_replace($rep, $with, $feat_img_url) . '/';
245
+ if (preg_match($m_feat_url, $img['src'])) {
246
+ $post_featured_img = '';
247
+ $attachments[$attach_id] = $attach_id;
248
+ }
249
+ }
250
+
251
+ }
252
+ @unlink($tmp_file);
253
+ }
254
+ }
255
+
256
+
257
+ // create post
258
+ $post_id = wp_insert_post($post_data);
259
+
260
+ if (count($attachments)) {
261
+ foreach ($attachments as $atta_id => $featured_id) {
262
+ $result = wp_update_post(array(
263
+ 'ID' => $atta_id,
264
+ 'post_parent' => $post_id
265
+ ));
266
+ if ($featured_id > 0) {
267
+ $new_custom['_thumbnail_id'] = array(
268
+ $featured_id
269
+ );
270
+ }
271
+ }
272
+ }
273
+
274
+ // featured image
275
+ if ($post_featured_img != '') {
276
+ $file_name = basename($post_featured_img);
277
+ //$tmp_file = download_url($post_featured_img);
278
+ $tmp_file = $this->mmb_download_url($no_thumb, $upload['path'] . '/tempfile_feat.tmp');
279
+ $attach_upload['url'] = $upload['url'] . '/' . $file_name;
280
+ $attach_upload['path'] = $upload['path'] . '/' . $file_name;
281
+ $renamed = @rename($tmp_file, $attach_upload['path']);
282
+ if ($renamed === true) {
283
+ $atta_ext = end(explode('.', $file_name));
284
+
285
+ $attachment = array(
286
+ 'post_title' => $file_name,
287
+ 'post_content' => '',
288
+ 'post_type' => 'attachment',
289
+ 'post_parent' => $post_id,
290
+ 'post_mime_type' => 'image/' . $atta_ext,
291
+ 'guid' => $attach_upload['url']
292
+ );
293
+
294
+ // Save the data
295
+ $attach_id = wp_insert_attachment($attachment, $attach_upload['path']);
296
+ wp_update_attachment_metadata($attach_id, wp_generate_attachment_metadata($attach_id, $attach_upload['path']));
297
+ $new_custom['_thumbnail_id'] = array(
298
+ $attach_id
299
+ );
300
+ }
301
  @unlink($tmp_file);
302
+ }
303
+
304
+ if ($post_id && is_array($post_categories)) {
 
 
 
 
 
 
 
 
 
305
  //insert categories
306
+
307
  $cat_ids = wp_create_categories($post_categories, $post_id);
308
  }
309
+
310
+
311
  //get current custom fields
312
+ $cur_custom = get_post_custom($post_id);
313
  //check which values doesnot exists in new custom fields
314
  $diff_values = array_diff_key($cur_custom, $new_custom);
315
+
316
+ if (is_array($diff_values))
317
  foreach ($diff_values as $meta_key => $value) {
318
  delete_post_meta($post_id, $meta_key);
319
  }
320
  //insert new post meta
321
+ foreach ($new_custom as $meta_key => $value) {
322
+ if (strpos($meta_key, '_mmb') === 0 || strpos($meta_key, '_edit') === 0) {
323
  continue;
324
+ } else {
325
  update_post_meta($post_id, $meta_key, $value[0]);
326
  }
327
  }
328
 
329
+
330
  return $post_id;
331
+
332
+
333
  }
334
 
335
  /**
336
+ * Aleternate function for WordPress download_url()
337
+ */
338
+ function mmb_download_url($url, $file_name)
 
 
339
  {
340
+ $destination = fopen($file_name, 'wb');
341
+ $source = @fopen($url, "r");
342
+ while ($a = fread($source, 1024)) {
343
+ $ret = fwrite($destination, $a);
 
 
 
 
344
  }
345
+ fclose($source);
346
+ fclose($destination);
347
+ return $file_name;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
348
  }
349
+ }
350
+ ?>
readme.txt CHANGED
@@ -25,6 +25,12 @@ Check out [ManageWP.com](http://managewp.com/ "Manage Multiple Blogs")
25
 
26
  == Changelog ==
27
 
 
 
 
 
 
 
28
  = 3.6.3 =
29
  * Initial public release
30
 
25
 
26
  == Changelog ==
27
 
28
+ = 3.8.0 =
29
+ * New interface
30
+ * SSL security protocl
31
+ * many more
32
+
33
+
34
  = 3.6.3 =
35
  * Initial public release
36
 
stats.class.php CHANGED
@@ -1,5 +1,5 @@
1
  <?php
2
- class Mmb_Stats extends Mmb_Core
3
  {
4
  function __construct()
5
  {
@@ -7,241 +7,274 @@ class Mmb_Stats extends Mmb_Core
7
  }
8
 
9
  /*************************************************************
10
- * FACADE functions
11
- * (functions to be called after a remote XMLRPC from Master)
12
- **************************************************************/
13
-
14
- function get($args)
15
  {
16
- $this->_escape($args);
 
17
 
18
- $username = $args[0];
19
- $password = $args[1];
20
- // $this->_log($username);
21
- // $this->_log($password);
 
 
22
 
23
- if (!$user = $this->login($username, $password))
24
- {
25
- return $this->error;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
26
  }
 
27
 
28
- // Things to get:
29
- // pending comments
30
- // drafts
31
- // available plugin upgrades
32
- // available wordpress upgrade
33
- // version of worker plugin
34
- // and???
35
 
36
- $stats = array();
37
-
38
- $mmb_user_hits = get_option('user_hit_count');
39
- end($mmb_user_hits);
40
- $last_key_date = key($mmb_user_hits);
41
- $current_date = date('Y-m-d');
42
- if($last_key_date != $curent_date)
43
- $this->set_hit_count(true);
 
 
 
 
 
 
 
44
 
45
- $stats['hit_counter'] = get_option('user_hit_count');
46
-
47
-
48
- if (current_user_can('moderate_comments'))
49
- {
50
- // pending comments
51
- $pending_comments = get_comments('status=hold&number=5');
52
- // trim off unnecessary data
53
- foreach ($pending_comments as &$comment)
54
- {
55
- $commented_post = get_post($comment->comment_post_ID);
56
- $comment->post_title = $commented_post->post_title;
57
- }
58
-
59
- $stats['pending_comments'] = $pending_comments;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
60
  }
 
61
 
62
- // drafts
63
- $drafts = get_posts('post_status=draft&numberposts=0');
64
- // trim off unnecessary data
65
- foreach ($drafts as $draft)
66
- {
67
- if (!current_user_can('edit_post', $draft->ID)) continue;
68
-
69
  $props = get_object_vars($draft);
70
- foreach ($props as $name => $value)
71
- {
72
- if ($name != 'post_title' && $name != 'ID' && $name != 'post_modified')
73
- {
74
  unset($draft->$name);
 
 
 
75
  }
76
  }
77
  }
 
 
78
 
79
- if (!empty($drafts))
80
- {
81
- $stats['drafts'] = $drafts;
82
- }
83
 
84
- if (current_user_can('activate_plugins'))
85
- {
86
- // available plugin upgrades
87
- $stats['upgradable_plugins'] = $this->get_plugin_instance()->get_upgradable_plugins();
88
- }
89
-
90
- if (current_user_can('update_plugins'))
91
- {
92
- // core upgrade
93
- $new_version = $this->get_wp_instance()->check_version(NULL, FALSE);
94
- if (!is_a($new_version, 'IXR_Error'))
95
- {
96
- $stats['new_version'] = $new_version;
97
- }
98
-
99
- //@lk worker version
100
- //we can either store the version string in a file or a string or both
101
- global $mmb_plugin_dir;
102
- // $worker_version = file_get_contents($mmb_plugin_dir.'/version');
103
- $stats['worker_version'] = MMB_WORKER_VERSION;
104
- }
105
- if (current_user_can('install_themes')){
106
- $stats['upgradable_themes'] = $this->get_theme_instance()->get_upgradable_themes();
107
- }
108
- $stats['server_ftp'] = 0;
109
- if((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && !is_writable(WP_CONTENT_DIR)){
110
- $stats['server_ftp'] = 1;
111
  }
112
-
 
 
 
 
 
 
 
 
113
  return $stats;
114
  }
115
-
116
- function get_server_stats($args) {
117
- $this->_escape($args);
118
-
119
- $username = $args[0];
120
- $password = $args[1];
121
- // $this->_log($username);
122
- // $this->_log($password);
123
-
124
- if (!$user = $this->login($username, $password)){
125
- return $this->error;
126
- }
127
 
128
  $stats = array();
129
-
130
- if(!current_user_can('administrator')){
131
- return array('add_error'=>'You are not an administrator on %s. Please use an account with administrator privilege.');
132
- }
133
-
134
- if (current_user_can('upload_files')){
135
- // check if wp-content is writable
136
- // $this->_log(is_writable(WP_CONTENT_DIR));
137
- // if(is_writable(WP_CONTENT_DIR) && is_writable(WP_CONTENT_DIR.'/plugins') && is_writable(WP_CONTENT_DIR.'/themes') && is_writable(WP_CONTENT_DIR.'/uploads') && is_writable(WP_CONTENT_DIR.'/upgrade')){
138
- if(is_writable(WP_CONTENT_DIR) && is_writable(WP_CONTENT_DIR.'/plugins') && is_writable(WP_CONTENT_DIR.'/themes')){
139
- $stats['writable'] = TRUE;
140
- }else{
141
- $stats['writable'] = FALSE;
142
- }
143
- global $mmb_plugin_dir;
144
- $stats['worker_path'] = $mmb_plugin_dir;
145
- $stats['content_path'] = WP_CONTENT_DIR;
146
  }
147
- return $stats;
148
 
 
149
  }
150
 
151
- function set_hit_count($fix_count = false) {
152
- // TODO : IP based checking for hit count
153
- //
154
- // In activation hook
155
- // if(!get_option('user_hit_count')){
156
- // $user_hit_count = array();
157
- // update_option('user_hit_count', $user_hit_count);
158
- // }
159
- //
160
- // Save a transient to the database
161
- // $transient = $_SERVER['REMOTE_ADDR'];
162
- // $expiration = somethig; // equal to 8 hrs
163
- //
164
- // if(!(get_transient($transient)))
165
- // set_transient($transient, $transient, $expiration);
166
- //
167
- // Fetch a saved transient
168
- // $current_user_ip = get_transient($transient);
169
- // if(!(get_transient($transient))) then increment the hit count
170
 
171
- if(is_single () || $fix_count){
172
- $date = date('Y-m-d');
 
 
 
173
  $user_hit_count = get_option('user_hit_count');
174
- if(!$user_hit_count){
175
  $user_hit_count[$date] = 1;
176
  update_option('user_hit_count', $user_hit_count);
177
- }else{
178
- $dated_keys = array_keys($user_hit_count);
179
- $last_visit_date = $dated_keys[count($dated_keys)-1];
180
-
181
- // $diff = strtotime($date) - strtotime($last_visit_date);
182
- // $sec = $diff % 60;
183
- // $diff = intval($diff / 60);
184
- // $min = $diff % 60;
185
- // $diff = intval($diff / 60);
186
- // $hours = $diff % 24;
187
- // $days = intval($diff / 24);
188
-
189
- $days = intval ( ( strtotime($date) - strtotime($last_visit_date) ) / 60 / 60 / 24 );
190
-
191
- if($days>1){
192
- // $date_elems = getdate(strtotime($last_visit_date));
193
- // $yr = $date_elems['year'];
194
- // $mn = $date_elems['mon'];
195
- // $dt = $date_elems['mday'];
196
-
197
  $date_to_add = date('Y-m-d', strtotime($last_visit_date));
198
-
199
- for($i = 1; $i<$days ; $i++){
200
- if(count($user_hit_count) > 7)
201
- {
202
- $shifted = @array_shift($user_hit_count);
203
  }
204
- //$next_day = ($dt + $i);
205
- //$next_key = $yr.'-'.$mn.'-'.$next_day;
206
  $next_key = strtotime('+1 day', strtotime($date_to_add));
207
- if($next_key == $date){
208
  break;
209
- }else{
210
- $user_hit_count[$next_key] = 0;
211
  }
212
  }
213
-
214
- // if($next_key == $date)
215
- // $user_hit_count[$next_key] = 0;
216
  }
217
-
218
- if(!isset($user_hit_count[$date])){
219
- $user_hit_count[$date] = 0;
220
  }
221
- if(!$fix_count)
222
- $user_hit_count[$date] += 1;
223
-
224
- if(count($user_hit_count) > 7)
225
- {
226
- $shifted = @array_shift($user_hit_count);
227
  }
228
-
229
- update_option('user_hit_count', $user_hit_count);
230
- // $this->_log($user_hit_count);
231
- }
232
  }
233
  }
234
 
235
- function get_hit_count() {
 
236
  // Check if there are no hits on last key date
237
  $mmb_user_hits = get_option('user_hit_count');
238
- end($mmb_user_hits);
239
- $last_key_date = key($mmb_user_hits);
240
- $current_date = date('Y-m-d');
241
- if($last_key_date != $curent_date)
242
- $this->set_hit_count(true);
 
 
243
 
244
  return get_option('user_hit_count');
245
  }
246
-
247
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
  <?php
2
+ class MMB_Stats extends MMB_Core
3
  {
4
  function __construct()
5
  {
7
  }
8
 
9
  /*************************************************************
10
+ * FACADE functions
11
+ * (functions to be called after a remote call from Master)
12
+ **************************************************************/
13
+
14
+ function get($params)
15
  {
16
+ global $wp_version, $mmb_plugin_dir;
17
+ $stats = array();
18
 
19
+ //define constants
20
+ $num_pending_comments = 3;
21
+ $num_approved_comments = 3;
22
+ $num_spam_comments = 0;
23
+ $num_draft_comments = 0;
24
+ $num_trash_comments = 0;
25
 
26
+ require_once(ABSPATH . '/wp-admin/includes/update.php');
27
+
28
+
29
+ $updates = $this->mmb_get_transient('update_core');
30
+
31
+ if($updates->updates[0]->response == 'development' || version_compare($wp_version, $updates->updates[0]->current, '<')){
32
+ $updates->updates[0]->current_version = $wp_version;
33
+ $stats['core_udates'] = $updates->updates[0];
34
+ }else
35
+ $stats['core_udates'] = false;
36
+
37
+ $mmb_user_hits = get_option('user_hit_count');
38
+ if (is_array($mmb_user_hits)) {
39
+ end($mmb_user_hits);
40
+ $last_key_date = key($mmb_user_hits);
41
+ $current_date = date('Y-m-d');
42
+ if ($last_key_date != $curent_date)
43
+ $this->set_hit_count(true);
44
  }
45
+ $stats['hit_counter'] = get_option('user_hit_count');
46
 
47
+ $stats['upgradable_themes'] = $this->get_theme_instance()->_get_upgradable_themes();
48
+ $stats['upgradable_plugins'] = $this->get_plugin_instance()->_get_upgradable_plugins();
 
 
 
 
 
49
 
50
+ $pending_comments = get_comments('status=hold&number='.$num_pending_comments);
51
+ foreach ($pending_comments as &$comment) {
52
+ $commented_post = get_post($comment->comment_post_ID);
53
+ $comment->post_title = $commented_post->post_title;
54
+ }
55
+ $approved_comments = get_comments('status=approve&number='.$num_approved_comments);
56
+ foreach ($approved_comments as &$comment) {
57
+ $commented_post = get_post($comment->comment_post_ID);
58
+ $comment->post_title = $commented_post->post_title;
59
+ }
60
+
61
+
62
+ $stats['comments']['pending'] = $pending_comments;
63
+ $stats['comments']['approved'] = $approved_comments;
64
+
65
 
66
+ $all_posts = get_posts('post_status=publish&numberposts=3&orderby=modified&order=desc');
67
+ $stats['publish_count'] = count($all_posts);
68
+ $recent_posts = array();
69
+
70
+ foreach ($all_posts as $id => $recent) {
71
+
72
+ $recent->post_permalink = get_permalink($recent->ID);
73
+ unset($recent->post_content);
74
+ unset($recent->post_author);
75
+ unset($recent->post_category);
76
+ unset($recent->post_date_gmt);
77
+ unset($recent->post_excerpt);
78
+ unset($recent->post_status);
79
+ unset($recent->comment_status);
80
+ unset($recent->ping_status);
81
+ unset($recent->post_password);
82
+ unset($recent->post_name);
83
+ unset($recent->to_ping);
84
+ unset($recent->pinged);
85
+ unset($recent->post_modified_gmt);
86
+ unset($recent->post_content_filtered);
87
+ unset($recent->post_parent);
88
+ unset($recent->guid);
89
+ unset($recent->menu_order);
90
+ unset($recent->post_type);
91
+ unset($recent->post_mime_type);
92
+ unset($recent->filter);
93
+ unset($recent->featured);
94
+ $recent_posts[] = $recent;
95
  }
96
+ $stats['posts'] = $recent_posts;
97
 
98
+ $drafts = get_posts('post_status=draft&numberposts=3');
99
+ foreach ($drafts as $draft) {
 
 
 
 
 
100
  $props = get_object_vars($draft);
101
+ foreach ($props as $name => $value) {
102
+ if ($name != 'post_title' && $name != 'ID' && $name != 'post_modified') {
 
 
103
  unset($draft->$name);
104
+ } else {
105
+ $draft->post_title = get_the_title($draft->ID);
106
+ $draft->post_permalink = get_permalink($draft->ID);
107
  }
108
  }
109
  }
110
+ $stats['draft_count'] = count($drafts);
111
+ $stats['drafts'] = $drafts;
112
 
 
 
 
 
113
 
114
+ if( function_exists( 'openssl_verify' ) ){
115
+ $stats['no_openssl'] = $this->_get_random_signature();
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
116
  }
117
+ else {
118
+ delete_option('_worker_nossl_key');
119
+ $stats['no_openssl'] = false;
120
+ }
121
+
122
+ if ((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && !is_writable(WP_CONTENT_DIR)) {
123
+ $stats['writable'] = false;
124
+ }
125
+ else $stats['writable'] = true;
126
  return $stats;
127
  }
128
+
129
+ function get_initial_stats()
130
+ {
131
+ global $mmb_plugin_dir;
 
 
 
 
 
 
 
 
132
 
133
  $stats = array();
134
+
135
+ $stats['email'] = get_option('admin_email');
136
+ $stats['no_openssl'] = $this->_get_random_signature();
137
+ $stats['content_path'] = WP_CONTENT_DIR;
138
+ $stats['worker_path'] = $mmb_plugin_dir;
139
+ $stats['worker_version'] = MMB_WORKER_VERSION;
140
+ $stats['site_title'] = get_bloginfo('name');
141
+ $stats['site_tagline'] = get_bloginfo('description');
142
+
143
+
144
+ if ((!defined('FTP_HOST') || !defined('FTP_USER') || !defined('FTP_PASS')) && !is_writable(WP_CONTENT_DIR)) {
145
+ $stats['writable'] = false;
 
 
 
 
 
146
  }
147
+ else $stats['writable'] = true;
148
 
149
+ return $stats;
150
  }
151
 
152
+
153
+
154
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
155
 
156
+ function set_hit_count($fix_count = false)
157
+ {
158
+
159
+ if ($fix_count || (!is_admin() && !MMB_Stats::detect_bots() )) {
160
+ $date = date('Y-m-d');
161
  $user_hit_count = get_option('user_hit_count');
162
+ if (!$user_hit_count) {
163
  $user_hit_count[$date] = 1;
164
  update_option('user_hit_count', $user_hit_count);
165
+ } else {
166
+ $dated_keys = array_keys($user_hit_count);
167
+ $last_visit_date = $dated_keys[count($dated_keys) - 1];
168
+
169
+ $days = intval((strtotime($date) - strtotime($last_visit_date)) / 60 / 60 / 24);
170
+
171
+ if ($days > 1) {
172
+
 
 
 
 
 
 
 
 
 
 
 
 
173
  $date_to_add = date('Y-m-d', strtotime($last_visit_date));
174
+
175
+ for ($i = 1; $i < $days; $i++) {
176
+ if (count($user_hit_count) > 14) {
177
+ $shifted = @array_shift($user_hit_count);
 
178
  }
179
+
 
180
  $next_key = strtotime('+1 day', strtotime($date_to_add));
181
+ if ($next_key == $date) {
182
  break;
183
+ } else {
184
+ $user_hit_count[$next_key] = 0;
185
  }
186
  }
187
+
 
 
188
  }
189
+
190
+ if (!isset($user_hit_count[$date])) {
191
+ $user_hit_count[$date] = 0;
192
  }
193
+ if (!$fix_count)
194
+ $user_hit_count[$date] += 1;
195
+
196
+ if (count($user_hit_count) > 7) {
197
+ $shifted = @array_shift($user_hit_count);
 
198
  }
199
+
200
+ update_option('user_hit_count', $user_hit_count);
201
+
202
+ }
203
  }
204
  }
205
 
206
+ function get_hit_count()
207
+ {
208
  // Check if there are no hits on last key date
209
  $mmb_user_hits = get_option('user_hit_count');
210
+ if (is_array($mmb_user_hits)) {
211
+ end($mmb_user_hits);
212
+ $last_key_date = key($mmb_user_hits);
213
+ $current_date = date('Y-m-d');
214
+ if ($last_key_date != $curent_date)
215
+ $this->set_hit_count(true);
216
+ }
217
 
218
  return get_option('user_hit_count');
219
  }
220
+
221
+ function detect_bots()
222
+ {
223
+ $agent = $_SERVER['HTTP_USER_AGENT'];
224
+
225
+ if ($agent == '')
226
+ return false;
227
+
228
+ $bot_list = array(
229
+ "Teoma",
230
+ "alexa",
231
+ "froogle",
232
+ "Gigabot",
233
+ "inktomi",
234
+ "looksmart",
235
+ "URL_Spider_SQL",
236
+ "Firefly",
237
+ "NationalDirectory",
238
+ "Ask Jeeves",
239
+ "TECNOSEEK",
240
+ "InfoSeek",
241
+ "WebFindBot",
242
+ "girafabot",
243
+ "crawler",
244
+ "www.galaxy.com",
245
+ "Googlebot",
246
+ "Scooter",
247
+ "Slurp",
248
+ "msnbot",
249
+ "appie",
250
+ "FAST",
251
+ "WebBug",
252
+ "Spade",
253
+ "ZyBorg",
254
+ "rabaz",
255
+ "Baiduspider",
256
+ "Feedfetcher-Google",
257
+ "TechnoratiSnoop",
258
+ "Rankivabot",
259
+ "Mediapartners-Google",
260
+ "Sogou web spider",
261
+ "WebAlta Crawler",
262
+ "aolserver"
263
+ );
264
+
265
+ $thebot = '';
266
+ foreach ($bot_list as $bot) {
267
+ if (ereg($bot, $agent)) {
268
+ $thebot = $bot;
269
+ break;
270
+ }
271
+ }
272
+
273
+ if ($thebot != '') {
274
+ return $thebot;
275
+ } else
276
+ return false;
277
+ }
278
+
279
+ }
280
+ ?>
tags.class.php DELETED
@@ -1,162 +0,0 @@
1
- <?php
2
-
3
- class Mmb_Tags extends Mmb_Core
4
- {
5
- function __construct()
6
- {
7
- parent::__construct();
8
- }
9
-
10
- /*************************************************************
11
- * FACADE functions
12
- * (functions to be called after a remote XMLRPC from Master)
13
- **************************************************************/
14
- /**
15
- * Gets a list of local (slave) category
16
- *
17
- * @param mixed $args
18
- * @return mixed
19
- */
20
- function get_list($args)
21
- {
22
- $this->_escape($args);
23
- $username = $args[0];
24
- $password = $args[1];
25
- $offset = $args[2];
26
- $per_page = $args[3];
27
-
28
- if (!$user = $this->login($username, $password))
29
- {
30
- return $this->error;
31
- }
32
-
33
- if(!current_user_can('manage_categories'))
34
- return new IXR_Error(401, 'Sorry, you cannot manage Tags on the remote blog.');
35
- global $wpdb;
36
-
37
- $count = count(get_tags(array('hide_empty' => FALSE)));
38
- $tags = get_tags(array(
39
- 'offset' => $offset,
40
- 'number' => $per_page,
41
- 'hide_empty' => FALSE
42
- ));
43
- return array('tags' => $tags, 'count' => $count);
44
- }
45
-
46
- /**
47
- * Updates a category locally
48
- *
49
- * @param mixed $args
50
- */
51
- function update($args)
52
- {
53
- $this->_escape($args);
54
- $username = $args[0];
55
- $password = $args[1];
56
- $id = $args[2];
57
- $name = $args[3];
58
- $slug = $args[4];
59
- $description = $args[5];
60
- $taxonomy = $args[6];
61
-
62
- if (!$user = $this->login($username, $password))
63
- {
64
- return $this->error;
65
- }
66
-
67
- if(!current_user_can('manage_categories'))
68
- return new IXR_Error(401, 'Sorry, you cannot manage categories on the remote blog.');
69
-
70
- if(empty($slug))
71
- return new IXR_Error(401, 'Sorry, Slug cannot be Empty.');
72
-
73
-
74
- $taxonomy = !empty($taxonomy) ? $taxonomy : 'post_tag';
75
- $tag = get_term( $id, $taxonomy );
76
- $args = array('name' => $name,'slug'=> $slug,'description' => $description);
77
- $is_success = wp_update_term($id, $taxonomy, $args);
78
-
79
-
80
-
81
-
82
- if($is_success && !is_wp_error($is_success))
83
- return TRUE;
84
- else
85
- return new IXR_Error(401, 'Error Updating Tags. Try Again !!!');
86
-
87
- }
88
-
89
- /**
90
- * Adds a new category locally
91
- *
92
- * @param mixed $args
93
- */
94
- function add($args)
95
- {
96
- $this->_escape($args);
97
- $username = $args[0];
98
- $password = $args[1];
99
- $tag_name = $args[2];
100
- $tag_slug = $args[3];
101
- $tag_desc = $args[4];
102
-
103
- if (!$user = $this->login($username, $password))
104
- {
105
- return $this->error;
106
- }
107
-
108
- if(!current_user_can('manage_categories'))
109
- return new IXR_Error(401, 'Sorry, you cannot manage categories on the remote blog.');
110
-
111
- // wordpress' category adding function
112
-
113
- $params = array('tag-name' => $tag_name,
114
- 'slug' => $tag_slug,
115
- 'description' => $tag_desc
116
- );
117
-
118
-
119
- //$result = wp_create_tag($params);
120
-
121
- $result = wp_insert_term($tag_name, 'post_tag', $params);
122
-
123
- $term = get_terms('post_tag', array('include' => $result['term_id'], 'hide_empty'=>FALSE));
124
- if($result && !is_wp_error($is_success))
125
- return $term;
126
- else
127
- return new IXR_Error(401, 'Error Creating Tags. Try Again !!!');
128
- // if ($tag_id = wp_create_term($params))
129
- // {
130
- // return get_terms();
131
- // }
132
- //
133
- // return FALSE;
134
- }
135
-
136
- function delete($args){
137
- $this->_escape($args);
138
- $username = $args[0];
139
- $password = $args[1];
140
- $term = $args[2];
141
- $taxonomy = $args[3];
142
-
143
- if (!$user = $this->login($username, $password))
144
- {
145
- return $this->error;
146
- }
147
- if(!current_user_can('manage_categories'))
148
- return new IXR_Error(401, 'Sorry, you cannot manage categories on the remote blog.');
149
-
150
- $taxonomy = !empty($taxonomy) ? $taxonomy : 'post_tag';
151
-
152
- $is_success = wp_delete_term($term, $taxonomy);
153
-
154
- if($is_success && !is_wp_error($is_success))
155
- return TRUE;
156
- else
157
- return new IXR_Error(401, 'Error Deleting Tags. Try Again !!!');
158
-
159
-
160
-
161
- }
162
- }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
theme.class.php CHANGED
@@ -1,347 +1,99 @@
1
- <?php
2
-
3
- class Mmb_Theme extends Mmb_Core
4
- {
5
- function __construct()
6
- {
7
- parent::__construct();
8
- }
9
-
10
- /*************************************************************
11
- * FACADE functions
12
- * (functions to be called after a remote XMLRPC from Master)
13
- **************************************************************/
14
-
15
- function get_list($args)
16
- {
17
- $this->_escape($args);
18
- $username = $args[0];
19
- $password = $args[1];
20
-
21
- if (!$user = $this->login($username, $password))
22
- {
23
- return $this->error;
24
- }
25
-
26
- if(!current_user_can('switch_themes'))
27
- return new IXR_Error(401, 'Sorry, you are not allowed to manage themes on the remote blog.');
28
-
29
- $all_themes = get_themes();
30
- $theme_updates = $this->mmb_get_transient('update_themes');
31
- $current_theme = current_theme_info();
32
-
33
- foreach($all_themes as $theme_name => $theme_data){
34
- if(isset($theme_updates->response[$theme_data['Template']])){
35
- $all_themes[$theme_name]['new_version'] = $theme_updates->response[$theme_data['Template']]['new_version'];
36
- $all_themes[$theme_name]['new_url'] = $theme_updates->response[$theme_data['Template']]['url'];
37
- }
38
- }
39
- $activated_theme = $all_themes[$current_theme->name];
40
- unset($all_themes[$current_theme->name]);
41
-
42
- // I don't bother paging
43
- // who would have 100's of themes anyway?
44
- return array(
45
- 'current' => $activated_theme,
46
- 'inactive' => $all_themes,
47
- );
48
- }
49
-
50
- /**
51
- * Activates a theme locally
52
- *
53
- * @param mixed $args
54
- */
55
- function activate($args)
56
- {
57
- $this->_escape($args);
58
- $username = $args[0];
59
- $password = $args[1];
60
- $template = $args[2];
61
- $stylesheet = $args[3];
62
-
63
- if (!$user = $this->login($username, $password))
64
- {
65
- return $this->error;
66
- }
67
-
68
- if(!current_user_can('switch_themes'))
69
- return new IXR_Error(401, 'Sorry, you are not allowed to activate themes on the remote blog.');
70
-
71
- switch_theme($template, $stylesheet);
72
-
73
- // get the new updated theme list
74
- return $this->get_list($args);
75
- }
76
-
77
- /**
78
- * Deletes a theme locally
79
- *
80
- * @param mixed $args
81
- */
82
- function delete($args)
83
- {
84
- $this->_escape($args);
85
- $username = $args[0];
86
- $password = $args[1];
87
- $template = $args[2];
88
-
89
- if (!$user = $this->login($username, $password))
90
- {
91
- return $this->error;
92
- }
93
-
94
- if(!current_user_can('update_themes'))
95
- {
96
- return new IXR_Error(401, 'Sorry, you are not allowed to delete themes from the remote blog.');
97
- }
98
-
99
- ob_start();
100
- $result = delete_theme($template);
101
- ob_end_clean();
102
- if (is_wp_error($result))
103
- {
104
- return new IXR_Error(401, 'Theme could not be deleted. ' . $result->get_error_message());
105
- }
106
-
107
- return TRUE;
108
- }
109
-
110
- /**
111
- * Installs a theme locally
112
- *
113
- * @param mixed $args
114
- */
115
- function install($args)
116
- {
117
- $this->_escape($args);
118
- $username = $args[0];
119
- $password = $args[1];
120
- $theme = $args[2];
121
- $activate = (bool)$args[3];
122
-
123
- if (!$user = $this->login($username, $password))
124
- {
125
- return $this->error;
126
- }
127
-
128
- if (!current_user_can('install_themes'))
129
- {
130
- return new IXR_Error(401, 'Sorry, you are not allowed to install themes on the remote blog.');
131
- }
132
-
133
- ob_start();
134
-
135
- // include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
136
- include_once(ABSPATH . 'wp-admin/includes/theme-install.php');
137
-
138
- $api = themes_api('theme_information', array('slug' => $theme, 'fields' => array('sections' => false)));
139
-
140
- if (is_wp_error($api))
141
- {
142
- return new IXR_Error(401, 'Could not install theme. ' . $api->get_error_message());
143
- }
144
-
145
- $upgrader = new Mmb_Theme_Upgrader();
146
- $result = $upgrader->install($api->download_link);
147
-
148
- if (is_wp_error($result))
149
- {
150
- return new IXR_Error(401, 'Theme could not be installed. ' . $result->get_error_message());
151
- }
152
-
153
- // activate!
154
- if ($activate && $theme_info = $upgrader->theme_info())
155
- {
156
- $stylesheet = $upgrader->result['destination_name'];
157
- $template = !empty($theme_info['Template']) ? $theme_info['Template'] : $stylesheet;
158
-
159
- $this->activate(array($username, $password, $template, $stylesheet));
160
- }
161
-
162
- ob_end_clean();
163
-
164
- // get the updated theme list
165
- return $this->get_list($args);
166
- }
167
-
168
- /**
169
- * Uploads a theme given its URL
170
- *
171
- * @param mixed $args
172
- */
173
- function upload_by_url($args)
174
- {
175
- $this->_escape($args);
176
- $username = $args[0];
177
- $password = $args[1];
178
- $url = $args[2];
179
-
180
- if (!$user = $this->login($username, $password))
181
- {
182
- return $this->error;
183
- }
184
-
185
- if (!current_user_can('install_themes'))
186
- {
187
- return new IXR_Error(401, 'Sorry, you are not allowed to install themes on the remote blog.');
188
- }
189
-
190
- if (!$this->_init_filesystem())
191
- return new IXR_Error(401, 'Theme could not be installed: Failed to initialize file system.');
192
-
193
-
194
- ob_start();
195
- $tmp_file = download_url($url);
196
-
197
- if(is_wp_error($tmp_file))
198
- return new IXR_Error(401, 'Theme could not be installed. ' . $response->get_error_message());
199
-
200
- $result = unzip_file($tmp_file, WP_CONTENT_DIR . '/themes');
201
- unlink($tmp_file);
202
-
203
- if(is_wp_error($result))
204
- {
205
- return new IXR_Error(401, 'Theme could not be extracted. ' . $result->get_error_message());
206
- }
207
-
208
- unset($args[2]);
209
-
210
- return $this->get_list($args);
211
- }
212
- function upload_theme_by_url($args){
213
-
214
- $this->_escape($args);
215
- $username = $args[0];
216
- $password = $args[1];
217
- $url = $args[2];
218
-
219
- if (!$user = $this->login($username, $password))
220
- {
221
- return $this->error;
222
- }
223
- if(!current_user_can('install_themes')){
224
- return new IXR_Error( 401, 'Sorry, you are not allowed to manage theme install on the remote blog.');
225
- }
226
- if (!$this->_init_filesystem())
227
- return new IXR_Error(401, 'Theme could not be installed: Failed to initialize file system.');
228
-
229
- ob_start();
230
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
231
- $upgrader = new Theme_Upgrader();
232
- $result = $upgrader->install($url);
233
- ob_end_clean();
234
- if(is_wp_error($upgrader->skin->result) || !$upgrader->skin->result){
235
- $error = is_wp_error($upgrader->skin->result) ? $upgrader->skin->result->get_error_message() : 'Check your FTP details. <a href="http://managewp.com/user-guide#ftp" title="More Info" target="_blank">More Info</a>' ;
236
- $this->_last_worker_message(array('error' => print_r($error,true)));
237
- }else {
238
- $theme = $upgrader->theme_info();
239
- $this->_last_worker_message(array('success' => 'true', 'name' => $theme['Name']));
240
- }
241
-
242
- }
243
- function upgrade($args){
244
- $this->_escape($args);
245
- $username = $args[0];
246
- $password = $args[1];
247
- $template = $args[2];
248
- $stylesheet = $args[3];
249
- $directory = $args[3];
250
- $chmod = false;
251
-
252
- if (!$user = $this->login($username, $password))
253
- {
254
- return $this->error;
255
- }
256
- if(!current_user_can('install_themes')){
257
- return new IXR_Error( 401, 'Sorry, you are not allowed to manage theme install on the remote blog.');
258
- }
259
- $chmod = fileperms($directory);
260
- if($chmod != 0755 ){
261
- chmod($directory, 0755);
262
- }
263
- ob_start();
264
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
265
- $upgrader = new Theme_Upgrader( new Theme_Upgrader_Skin( compact('title', 'nonce', 'url', 'theme') ) );
266
- $result = $upgrader->upgrade($stylesheet);
267
- ob_end_clean();
268
-
269
- if(is_wp_error($upgrader->skin->result) || !$upgrader->theme_info()){
270
- $error = is_wp_error($upgrader->skin->result) ? $upgrader->skin->result->get_error_message() : 'Check your FTP details. <a href="http://managewp.com/user-guide#ftp" title="More Info" target="_blank">More Info</a>' ;
271
- $this->_last_worker_message(array('error' => print_r($error)));
272
- }else {
273
- $theme = $upgrader->theme_info();
274
- $this->_last_worker_message(array('success' => 'true', 'name' => $theme['Name']));
275
- }
276
- chmod($directory, $chmod);
277
- }
278
- function upgrade_all($args){
279
- $this->_escape($args);
280
- $username = $args[0];
281
- $password = $args[1];
282
- $themes = $args[2];
283
- $chmod = false;
284
-
285
- if (!$user = $this->login($username, $password))
286
- {
287
- return $this->error;
288
- }
289
- if(!current_user_can('install_themes')){
290
- return new IXR_Error( 401, 'Sorry, you are not allowed to manage theme install on the remote blog.');
291
- }
292
-
293
- if(!empty($themes)){
294
-
295
-
296
-
297
- ob_start();
298
-
299
- include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
300
- $upgrader = new Theme_Upgrader(new Mmb_Bulk_Theme_Upgrader_Skin( compact('title', 'nonce', 'url', 'theme') ));
301
- $result = $upgrader->bulk_upgrade($themes);
302
-
303
- ob_end_clean();
304
- if(is_wp_error($result) || !$result){
305
- $error = is_wp_error($result) ? $result->get_error_message() : 'Check your FTP details. <a href="http://managewp.com/user-guide#ftp" title="More Info" target="_blank">More Info</a>' ;
306
- $this->_last_worker_message(array('error' => print_r($error, true)));
307
- }
308
- else {
309
- $message = '';
310
- foreach($result as $theme_tmp => $info){
311
- $message .= '<code>'.$theme_tmp.'</code><br />';
312
- }
313
- $this->_last_worker_message(array('success' => 'true', 'message' => $message));
314
- }
315
-
316
- }else {
317
- $this->_last_worker_message(array('error' => 'No themes to upgrade.'));
318
- }
319
- }
320
-
321
- function get_upgradable_themes(){
322
-
323
- $all_themes = get_themes();
324
- $upgrade_themes = array();
325
-
326
- //$this->refresh_transient();
327
-
328
- // $current = get_transient('update_plugins');
329
- $current = $this->mmb_get_transient('update_themes');
330
- // $test = $this->mmb_get_transient('update_plugins');
331
- // $this->_log($test);
332
- foreach ((array)$all_themes as $theme_template => $theme_data){
333
- foreach ($current->response as $current_themes => $theme){
334
- if ($theme_data['Template'] == $current_themes)
335
- {
336
- $current->response[$current_themes]['name'] = $theme_data['Name'];
337
- $current->response[$current_themes]['old_version'] = $theme_data['Version'];
338
- $current->response[$current_themes]['theme_tmp'] = $theme_data['Template'];
339
- $upgrade_themes[] = $current->response[$current_themes];
340
- continue;
341
- }
342
- }
343
- }
344
-
345
- return $upgrade_themes;
346
- }
347
- }
1
+ <?php
2
+
3
+ class MMB_Theme extends MMB_Core
4
+ {
5
+ function __construct()
6
+ {
7
+ parent::__construct();
8
+ }
9
+
10
+
11
+ function upload_theme_by_url($args){
12
+
13
+ $this->_escape($args);
14
+ $url = $args['url'];
15
+
16
+ //return (print_r($args, true));
17
+ ob_start();
18
+ include_once(ABSPATH . 'wp-admin/includes/file.php');
19
+ include_once(ABSPATH . 'wp-admin/includes/theme.php');
20
+ include_once(ABSPATH . 'wp-admin/includes/misc.php');
21
+ include_once(ABSPATH . 'wp-admin/includes/template.php');
22
+ include_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
23
+ $upgrader = new Theme_Upgrader();
24
+ $result = $upgrader->install($url);
25
+
26
+ ob_end_clean();
27
+
28
+ if(is_wp_error($upgrader->skin->result) || !$upgrader->skin->result){
29
+ $error = 'Failed to upload theme. Check your URL.' ;
30
+ return array('bool' => false, 'message' => $error) ;
31
+
32
+ }else {
33
+ $theme = $upgrader->theme_info();
34
+ return array('bool' => true, 'message' => 'Theme '.$upgrader->result[destination_name].' successfully installed ');
35
+
36
+ }
37
+
38
+ }
39
+
40
+ function upgrade_all($params){
41
+
42
+ $upgradable_themes = $this->_get_upgradable_themes();
43
+
44
+ $ready_for_upgrade = array();
45
+ if(!empty($upgradable_themes)){
46
+ foreach($upgradable_themes as $upgrade ){
47
+ $ready_for_upgrade[] = $upgrade['theme_tmp'];
48
+ }
49
+ }
50
+ if(!empty($ready_for_upgrade)){
51
+ include_once(ABSPATH . 'wp-admin/includes/file.php');
52
+ include_once ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
53
+ $upgrader = new Theme_Upgrader(new Bulk_Theme_Upgrader_Skin( compact('title', 'nonce', 'url', 'theme') ));
54
+
55
+ $result = $upgrader->bulk_upgrade($ready_for_upgrade);
56
+
57
+ $results = array();
58
+ if(!empty($result)){
59
+ foreach($result as $theme_tmp => $info){
60
+ if(is_wp_error($info) || !$info){
61
+ $results[$theme_tmp] = '<code title="Please upgarde manualy">'.$theme_tmp.'</code> was not upgraded.';
62
+ }
63
+ else {
64
+ $results[$theme_tmp] = '<code>'.$theme_tmp.'</code> succesfully upgraded.';
65
+ }
66
+ }
67
+ return array('upgraded' => implode('', $results));
68
+ }
69
+ else return array('error' => 'Could not initialize upgrader.');
70
+
71
+ }else {
72
+ return array('error' => 'No themes available for upgrade.');
73
+ }
74
+ }
75
+
76
+ function _get_upgradable_themes(){
77
+
78
+ $all_themes = get_themes();
79
+ $upgrade_themes = array();
80
+
81
+ $current = $this->mmb_get_transient('update_themes');
82
+ foreach ((array)$all_themes as $theme_template => $theme_data){
83
+ if(!empty($current->response)){
84
+ foreach ($current->response as $current_themes => $theme){
85
+ if ($theme_data['Template'] == $current_themes)
86
+ {
87
+ $current->response[$current_themes]['name'] = $theme_data['Name'];
88
+ $current->response[$current_themes]['old_version'] = $theme_data['Version'];
89
+ $current->response[$current_themes]['theme_tmp'] = $theme_data['Template'];
90
+ $upgrade_themes[] = $current->response[$current_themes];
91
+ continue;
92
+ }
93
+ }
94
+ }
95
+ }
96
+
97
+ return $upgrade_themes;
98
+ }
99
+ }
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
user.class.php CHANGED
@@ -1,6 +1,6 @@
1
  <?php
2
 
3
- class Mmb_User extends Mmb_Core
4
  {
5
  function __construct()
6
  {
@@ -11,12 +11,12 @@ class Mmb_User extends Mmb_Core
11
  * FACADE functions
12
  * (functions to be called after a remote XMLRPC from Master)
13
  **************************************************************/
14
- function change_password($args)
15
  {
16
- $this->_escape($args);
17
- $username = $args[0];
18
- $password = trim($args[1]);
19
- $new_password = trim(base64_decode($args[2]));
20
 
21
  if ((!$user = $this->login($username, $password)) || ($new_password ==''))
22
  {
1
  <?php
2
 
3
+ class MMB_User extends MMB_Core
4
  {
5
  function __construct()
6
  {
11
  * FACADE functions
12
  * (functions to be called after a remote XMLRPC from Master)
13
  **************************************************************/
14
+ function change_password($params)
15
  {
16
+ $this->_escape($params);
17
+ $username = $params[0];
18
+ $password = trim($params[1]);
19
+ $new_password = trim(base64_decode($params[2]));
20
 
21
  if ((!$user = $this->login($username, $password)) || ($new_password ==''))
22
  {
version CHANGED
@@ -1 +1 @@
1
- 3.6.3
1
+ 3.8.0
wp.class.php CHANGED
@@ -1,124 +1,91 @@
1
- <?php
2
-
3
- class Mmb_WP extends Mmb_Core
4
- {
5
- function __construct()
6
- {
7
- parent::__construct();
8
- }
9
-
10
- /*************************************************************
11
- * FACADE functions
12
- * (functions to be called after a remote XMLRPC from Master)
13
- **************************************************************/
14
- function check_version($args, $login_required = TRUE)
15
- {
16
- $this->_escape($args);
17
-
18
- $username = $args[0];
19
- if($login_required)
20
- $password = $args[1];
21
- // $password = $this->ende_instance->decrypt(base64_decode($args[1]));
22
- $get_default_data = (bool) $args[2];
23
-
24
- if ($login_required && !$user = $this->login($username, $password))
25
- {
26
- return $this->error;
27
- }
28
-
29
- if (!current_user_can('update_plugins'))
30
- {
31
- return new IXR_Error(401, 'You do not have sufficient permissions to upgrade WordPress on the remote blog.');
32
- }
33
-
34
- require_once(ABSPATH . 'wp-includes/version.php');
35
-
36
- $updates = get_core_updates();
37
- $update = $updates[0];
38
- global $wp_version;
39
- if (!isset($update->response) || 'latest' == $update->response)
40
- {
41
- if (!$get_default_data)
42
- return new IXR_Error(999, 'The remote blog has the latest version of WordPress. You do not need to upgrade.');
43
-
44
- // return default (current version) data
45
- // this is used when initial blog row
46
- return array(
47
- 'current_version' => $wp_version,
48
- 'latest_version' => FALSE,
49
- );
50
- }
51
- else
52
- {
53
- return array(
54
- 'current_version' => $wp_version,
55
- 'latest_version' => $update,
56
- );
57
- }
58
- }
59
-
60
- /**
61
- * Upgrades WordPress locally
62
- *
63
- */
64
- function upgrade($args){
65
-
66
- $username = $args[0];
67
- // $password = $this->ende_instance->decrypt(base64_decode($args[1]));
68
- $password = $args[1];
69
-
70
- if (!$user = $this->login($username, $password))
71
- {
72
- $this->_last_worker_message(array('error' => $this->error));
73
- }
74
-
75
- if(!current_user_can('administrator')){
76
- $this->_last_worker_message(array('error' => "You don't have permissions to upgrade this blog."));
77
- die();
78
- }
79
-
80
- $upgrade_info = $this->check_version($args);
81
- if(empty($upgrade_info['latest_version'])){
82
- $this->_last_worker_message(array('error' => print_r($upgrade_info, true)));
83
- die();
84
- }
85
- ob_start();
86
-
87
- include ABSPATH . 'wp-admin/includes/class-wp-upgrader.php';
88
- $upgrader = new Core_Upgrader();
89
- $result = $upgrader->upgrade($upgrade_info['latest_version']);
90
-
91
- ob_end_clean();
92
- if(!$result){
93
- $this->_last_worker_message(array('success' => 'true', 'version' => $upgrade_info['latest_version']));
94
-
95
- }else {
96
- $this->_last_worker_message(array('error' => $result));
97
- }
98
- }
99
-
100
- /**
101
- * Gets updates to core and plugins (just like Tool->Upgrade)
102
- *
103
- * @param mixed $args
104
- */
105
- function get_updates($args)
106
- {
107
- $this->_escape($args);
108
-
109
- $username = $args[0];
110
- $password = $args[1];
111
-
112
- if (!$user = $this->login($username, $password))
113
- {
114
- return $this->error;
115
- }
116
-
117
- $args[] = 1; // get default data
118
-
119
- return array(
120
- 'core' => $this->check_version($args, FALSE),
121
- 'plugins' => $this->get_plugin_instance()->get_upgradable_plugins(),
122
- );
123
- }
124
  }
1
+ <?php
2
+
3
+ class MMB_WP extends MMB_Core
4
+ {
5
+ function __construct()
6
+ {
7
+ parent::__construct();
8
+ }
9
+
10
+ /*************************************************************
11
+ * FACADE functions
12
+ * (functions to be called after a remote XMLRPC from Master)
13
+ **************************************************************/
14
+ function check_version()
15
+ {
16
+ require_once(ABSPATH . 'wp-includes/version.php');
17
+ require_once(ABSPATH . '/wp-admin/includes/update.php');
18
+
19
+ $updates = get_core_updates();
20
+ $update = $updates[0];
21
+ global $wp_version;
22
+
23
+ if (!isset($update->response) || 'latest' == $update->response) {
24
+ return array(
25
+ 'current_version' => $wp_version,
26
+ 'latest_version' => false
27
+ );
28
+ } else {
29
+ return array(
30
+ 'current_version' => $wp_version,
31
+ 'latest_version' => $update
32
+ );
33
+ }
34
+ }
35
+
36
+ /**
37
+ * Upgrades WordPress locally
38
+ *
39
+ */
40
+ function upgrade($params){
41
+
42
+ ob_start();
43
+ require_once(ABSPATH . 'wp-admin/includes/file.php');
44
+ require_once(ABSPATH . 'wp-admin/includes/misc.php');
45
+ require_once(ABSPATH . 'wp-admin/includes/class-wp-upgrader.php');
46
+
47
+ WP_Filesystem();
48
+ global $wp_version, $wp_filesystem;
49
+ $upgrader = new WP_Upgrader();
50
+ $updates = $this->mmb_get_transient('update_core');
51
+ $current = $updates->updates[0];
52
+
53
+
54
+ // Is an update available?
55
+ if ( !isset( $current->response ) || $current->response == 'latest' )
56
+ return array('upgraded' => ' has latest '.$wp_version.' WordPress version.');
57
+
58
+ $res = $upgrader->fs_connect( array(ABSPATH, WP_CONTENT_DIR) );
59
+ if ( is_wp_error($res) )
60
+ return array('error' => $this->mmb_get_error($res));
61
+
62
+ $wp_dir = trailingslashit($wp_filesystem->abspath());
63
+
64
+ $download = $upgrader->download_package( $current->package );
65
+ if ( is_wp_error($download) )
66
+ return array('error' => $this->mmb_get_error($download));
67
+
68
+ $working_dir = $upgrader->unpack_package( $download );
69
+ if ( is_wp_error($working_dir) )
70
+ return array('error' => $this->mmb_get_error($working_dir));
71
+
72
+ if ( !$wp_filesystem->copy($working_dir . '/wordpress/wp-admin/includes/update-core.php', $wp_dir . 'wp-admin/includes/update-core.php', true) ) {
73
+ $wp_filesystem->delete($working_dir, true);
74
+ return array('error' => 'Unable to move update files.');
75
+ }
76
+
77
+ $wp_filesystem->chmod($wp_dir . 'wp-admin/includes/update-core.php', FS_CHMOD_FILE);
78
+
79
+ require(ABSPATH . 'wp-admin/includes/update-core.php');
80
+ ob_end_clean();
81
+
82
+ $update_core = update_core($working_dir, $wp_dir);
83
+
84
+ if(is_wp_error($update_core))
85
+ return array('error' => $this->mmb_get_error($update_core));
86
+
87
+ $this->mmb_delete_transient('update_core');
88
+ return array('upgraded' => ' upgraded sucessfully.');
89
+ }
90
+
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
91
  }